diff --git a/.github/actions/binary-compatible-builds/action.yml b/.github/actions/binary-compatible-builds/action.yml index b5a190c4a06f..8abc72d63742 100644 --- a/.github/actions/binary-compatible-builds/action.yml +++ b/.github/actions/binary-compatible-builds/action.yml @@ -2,7 +2,7 @@ name: 'Set up a CentOS 6 container to build releases in' description: 'Set up a CentOS 6 container to build releases in' runs: - using: node16 + using: node20 main: 'main.js' inputs: name: diff --git a/.github/actions/install-cargo-vet/action.yml b/.github/actions/install-cargo-vet/action.yml index 0d481d744236..a964f79cbc3d 100644 --- a/.github/actions/install-cargo-vet/action.yml +++ b/.github/actions/install-cargo-vet/action.yml @@ -5,12 +5,12 @@ inputs: version: description: 'Version to install' required: false - default: '0.8.0' + default: '0.9.0' runs: using: composite steps: - - uses: actions/cache@v3 + - uses: actions/cache@v4 with: path: ${{ runner.tool_cache }}/cargo-vet key: cargo-vet-bin-${{ inputs.version }} diff --git a/.github/actions/install-rust/action.yml b/.github/actions/install-rust/action.yml index b15c33c0a4cd..41d5286082e4 100644 --- a/.github/actions/install-rust/action.yml +++ b/.github/actions/install-rust/action.yml @@ -81,7 +81,7 @@ runs: run: echo CARGO_REGISTRY_CACHE_KEY=$(date +%Y%m%d) >> $GITHUB_ENV - name: Cache Cargo registry index - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/.cargo/registry/index/ key: cargo-registry-${{ env.CARGO_REGISTRY_CACHE_KEY }} @@ -90,7 +90,7 @@ runs: restore-keys: cargo-registry- - name: Cache crate sources for dependencies - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: | ~/.cargo/registry/cache/ diff --git a/.github/workflows/cargo-audit.yml b/.github/workflows/cargo-audit.yml index d17cc3674230..0f4b3bcb80ac 100644 --- a/.github/workflows/cargo-audit.yml +++ b/.github/workflows/cargo-audit.yml @@ -7,7 +7,7 @@ jobs: if: github.repository == 'bytecodealliance/wasmtime' runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: submodules: true - uses: actions-rs/audit-check@v1 diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 8db3e891a91b..69045eb40f28 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -55,7 +55,7 @@ jobs: name: Rustfmt runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: submodules: true - uses: ./.github/actions/install-rust @@ -68,6 +68,22 @@ jobs: env: GH_TOKEN: ${{ github.token }} + # Check Code style quickly by running `clang-format` over all the C/C++ code + clangformat: + name: Clang format + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: true + - run: git ls-files '*.h' '*.c' '*.cpp' | xargs clang-format-15 --dry-run --Werror --verbose + + # common logic to cancel the entire run if this job fails + - run: gh run cancel ${{ github.run_id }} + if: failure() && github.event_name != 'pull_request' + env: + GH_TOKEN: ${{ github.token }} + # Lint dependency graph for security advisories, duplicate versions, and # incompatible licences cargo_deny: @@ -76,7 +92,7 @@ jobs: if: needs.determine.outputs.audit runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: submodules: true - uses: ./.github/actions/install-rust @@ -100,7 +116,7 @@ jobs: if: needs.determine.outputs.audit runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: submodules: true - uses: ./.github/actions/install-rust @@ -135,7 +151,7 @@ jobs: audit: ${{ steps.calculate.outputs.audit }} preview1-adapter: ${{ steps.calculate.outputs.preview1-adapter }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - id: calculate env: GH_TOKEN: ${{ github.token }} @@ -196,10 +212,10 @@ jobs: runs-on: ubuntu-latest env: CARGO_MDBOOK_VERSION: 0.4.21 - RUSTDOCFLAGS: -Dbroken_intra_doc_links --cfg nightlydoc + RUSTDOCFLAGS: -Dbroken_intra_doc_links --cfg docsrs OPENVINO_SKIP_LINKING: 1 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: submodules: true - uses: ./.github/actions/install-rust @@ -212,7 +228,7 @@ jobs: - run: cd crates/c-api && doxygen doxygen.conf # install mdbook, build the docs, and test the docs - - uses: actions/cache@v3 + - uses: actions/cache@v4 with: path: ${{ runner.tool_cache }}/mdbook key: cargo-mdbook-bin-${{ env.CARGO_MDBOOK_VERSION }} @@ -244,7 +260,7 @@ jobs: mv crates/c-api/html gh-pages/c-api mv target/doc gh-pages/api tar czf gh-pages.tar.gz gh-pages - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: gh-pages path: gh-pages.tar.gz @@ -266,7 +282,7 @@ jobs: env: CARGO_NDK_VERSION: 2.12.2 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: submodules: true - uses: ./.github/actions/install-rust @@ -319,9 +335,14 @@ jobs: # Check whether `wasmtime` cross-compiles to aarch64-linux-android - run: rustup target add aarch64-linux-android + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' - name: Setup Android SDK - uses: android-actions/setup-android@v2 - - uses: actions/cache@v3 + uses: android-actions/setup-android@v3 + - uses: actions/cache@v4 with: path: ${{ runner.tool_cache }}/cargo-ndk key: cargo-ndk-bin-${{ env.CARGO_NDK_VERSION }} @@ -329,6 +350,10 @@ jobs: - run: cargo install --root ${{ runner.tool_cache }}/cargo-ndk --version ${{ env.CARGO_NDK_VERSION }} cargo-ndk - run: cargo ndk -t arm64-v8a check -p wasmtime + # Run clippy configuration + - run: rustup component add clippy + - run: cargo clippy --workspace + # common logic to cancel the entire run if this job fails - run: gh run cancel ${{ github.run_id }} if: failure() && github.event_name != 'pull_request' @@ -344,7 +369,7 @@ jobs: name: Check Windows ARM64 runs-on: windows-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: submodules: true - uses: ./.github/actions/install-rust @@ -364,7 +389,7 @@ jobs: name: Fuzz Targets runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: submodules: true # Note that building with fuzzers requires nightly since it uses unstable @@ -403,7 +428,7 @@ jobs: fail-fast: ${{ github.event_name != 'pull_request' }} matrix: ${{ fromJson(needs.determine.outputs.test-matrix) }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: submodules: true - uses: ./.github/actions/install-rust @@ -421,13 +446,24 @@ jobs: - run: echo CARGO_BUILD_TARGET=${{ matrix.target }} >> $GITHUB_ENV if: matrix.target != '' + # Install OpenVINO for testing wasmtime-wasi-nn. + - uses: abrown/install-openvino-action@v8 + if: runner.arch == 'X64' + # Fix an ICE for now in gcc when compiling zstd with debuginfo (??) - run: echo CFLAGS=-g0 >> $GITHUB_ENV if: matrix.target == 'x86_64-pc-windows-gnu' + # Update binutils if MinGW due to https://github.com/rust-lang/rust/issues/112368 + - run: C:/msys64/usr/bin/pacman.exe -S --needed mingw-w64-x86_64-gcc --noconfirm + if: matrix.target == 'x86_64-pc-windows-gnu' + - shell: pwsh + run: echo "C:\msys64\mingw64\bin" >> $Env:GITHUB_PATH + if: matrix.target == 'x86_64-pc-windows-gnu' + - run: cargo fetch --locked - - uses: actions/cache@v3 + - uses: actions/cache@v4 with: path: ${{ runner.tool_cache }}/qemu key: qemu-${{ matrix.target }}-${{ env.QEMU_BUILD_VERSION }}-patchcpuinfo @@ -490,6 +526,32 @@ jobs: run: | diff -ru crates/wasi/wit crates/wasi-http/wit + # Record some CPU details; this is helpful information if tests fail due + # to CPU-specific features. + - name: CPU information + run: lscpu + if: matrix.os == 'ubuntu-latest' + - name: CPU information + run: sysctl hw + if: contains(matrix.os, 'macos') + - name: CPU information + run: wmic cpu list /format:list + shell: pwsh + if: matrix.os == 'windows-latest' + + # Since MPK (PKU) is not present on some GitHub runners, we check if it is + # available before force-enabling it. This occasional testing is better than + # none at all; ideally we would test in a system-mode QEMU VM. + - name: Force-run with MPK enabled, if available + if: ${{ contains(matrix.name, 'MPK') }} + run: | + if cargo run --example mpk-available; then + echo "::notice::This CI run will force-enable MPK; this ensures tests conditioned with the \`WASMTIME_TEST_FORCE_MPK\` environment variable will run with MPK-protected memory pool stripes." + echo WASMTIME_TEST_FORCE_MPK=1 >> $GITHUB_ENV + else + echo "::warning::This CI run will not test MPK; it has been detected as not available on this machine (\`cargo run --example mpk-available\`)." + fi + # Build and test all features - run: ./ci/run-tests.sh --locked env: @@ -508,32 +570,6 @@ jobs: # Windows fails GitHub Actions will confusingly mark the failed Windows job # as cancelled instead of failed. - # Build and test the wasi-nn module. - test_wasi_nn: - needs: determine - if: needs.determine.outputs.run-full - name: Test wasi-nn module - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - with: - submodules: true - - uses: ./.github/actions/install-rust - - run: rustup target add wasm32-wasi - - uses: abrown/install-openvino-action@v7 - with: - version: 2022.3.0 - apt: true - - run: ./ci/run-wasi-nn-example.sh - env: - RUST_BACKTRACE: 1 - - # common logic to cancel the entire run if this job fails - - run: gh run cancel ${{ github.run_id }} - if: failure() && github.event_name != 'pull_request' - env: - GH_TOKEN: ${{ github.token }} - build-preview1-component-adapter: name: Build wasi-preview1-component-adapter needs: determine @@ -543,7 +579,7 @@ jobs: deployments: write contents: write steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: submodules: true - run: rustup update stable && rustup default stable @@ -558,7 +594,7 @@ jobs: env: VERSION: ${{ github.sha }} - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: bins-wasi-preview1-component-adapter path: target/wasm32-unknown-unknown/release/wasi_snapshot_preview1.*.wasm @@ -571,13 +607,34 @@ jobs: GH_TOKEN: ${{ github.token }} + build-wasmtime-target-wasm32: + name: Build wasmtime-target-wasm32 + needs: determine + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: true + - run: rustup update stable && rustup default stable + - run: rustup target add wasm32-wasi wasm32-unknown-unknown + - run: cargo build -p wasmtime --target wasm32-wasi --no-default-features --features cranelift,all-arch + env: + VERSION: ${{ github.sha }} + + # common logic to cancel the entire run if this job fails + - run: gh run cancel ${{ github.run_id }} + if: failure() && github.event_name != 'pull_request' + env: + GH_TOKEN: ${{ github.token }} + + bench: needs: determine if: needs.determine.outputs.run-full name: Run benchmarks runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: submodules: true - uses: ./.github/actions/install-rust @@ -597,7 +654,7 @@ jobs: name: Meta deterministic check runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: submodules: true - uses: ./.github/actions/install-rust @@ -615,7 +672,7 @@ jobs: if: github.repository == 'bytecodealliance/wasmtime' && needs.determine.outputs.run-full runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: submodules: true - run: rustup update stable && rustup default stable @@ -653,14 +710,14 @@ jobs: env: CARGO_NEXTEST_VERSION: 0.9.51 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: submodules: true - uses: ./.github/actions/install-rust with: toolchain: nightly-2023-10-10 - run: rustup component add rust-src miri - - uses: actions/cache@v3 + - uses: actions/cache@v4 with: path: ${{ runner.tool_cache }}/cargo-nextest key: cargo-nextest-bin-${{ env.CARGO_NEXTEST_VERSION }} @@ -695,7 +752,7 @@ jobs: fail-fast: ${{ github.event_name != 'pull_request' }} matrix: ${{ fromJson(needs.determine.outputs.build-matrix) }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: submodules: true @@ -720,7 +777,7 @@ jobs: # unconditionally to this workflow's files so we have a copy of them. - run: ./ci/build-tarballs.sh "${{ matrix.build }}" "${{ matrix.target }}" - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 with: name: bins-${{ matrix.build }} path: dist @@ -762,7 +819,6 @@ jobs: - checks - checks_winarm64 - fuzz_targets - - test_wasi_nn - bench - meta_deterministic_check - verify-publish @@ -811,7 +867,7 @@ jobs: && startsWith(github.ref, 'refs/heads/release-') && github.repository == 'bytecodealliance/wasmtime' steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: submodules: true fetch-depth: 0 diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml index 0b39524a70f6..f3544251cbfd 100644 --- a/.github/workflows/performance.yml +++ b/.github/workflows/performance.yml @@ -74,7 +74,7 @@ jobs: cargo build --release - name: Checkout patch from bytecodealliance/wasmtime (pushed and triggering on this perf repo) - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: submodules: true path: wasmtime_commit @@ -89,7 +89,7 @@ jobs: cp target/release/libwasmtime_bench_api.so /tmp/wasmtime_commit.so - name: Checkout main from bytecodealliance/wasmtime - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: ref: 'main' repository: 'bytecodealliance/wasmtime' diff --git a/.github/workflows/publish-artifacts.yml b/.github/workflows/publish-artifacts.yml index 8c149003dc91..191d0cc4fd21 100644 --- a/.github/workflows/publish-artifacts.yml +++ b/.github/workflows/publish-artifacts.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest if: github.repository == 'bytecodealliance/wasmtime' steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - run: | sha=${{ github.sha }} run_id=$( diff --git a/.github/workflows/publish-to-cratesio.yml b/.github/workflows/publish-to-cratesio.yml index 6d05b66778a4..23af15a85785 100644 --- a/.github/workflows/publish-to-cratesio.yml +++ b/.github/workflows/publish-to-cratesio.yml @@ -14,7 +14,7 @@ jobs: if: github.repository == 'bytecodealliance/wasmtime' runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: submodules: true - run: rustup update stable && rustup default stable diff --git a/.github/workflows/release-process.yml b/.github/workflows/release-process.yml index e2003a456d92..004c00f85ce3 100644 --- a/.github/workflows/release-process.yml +++ b/.github/workflows/release-process.yml @@ -38,7 +38,7 @@ jobs: name: Run the release process runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: submodules: true - name: Setup diff --git a/ADOPTERS.md b/ADOPTERS.md index 581828946d9d..6ca573c809cb 100644 --- a/ADOPTERS.md +++ b/ADOPTERS.md @@ -14,5 +14,6 @@ Wasmtime is used in many different production use-cases. This list has grown sig | [Fermyon](https://fermyon.com) | [@tschneidereit](https://github.com/tschneidereit) | ![production](https://img.shields.io/badge/-production-blue?style=flat) | Fermyon Cloud is a cloud application platform for WebAssembly-based serverless functions and microservices. | | [InfinyOn](https://infinyon.com/) | [@sehz](https://github.com/sehz) | ![production](https://img.shields.io/badge/-production-blue?style=flat) | InfinyOn leverages the power of WebAssembly SmartModules to execute real-time data transformations. | | [Microsoft](https://microsoft.com/) | [@devigned](https://gist.github.com/devigned) | ![production](https://img.shields.io/badge/-production-blue?style=flat) | Microsoft has had Wasmtime in preview for its WebAssembly System Interface (WASI) node pools in Azure Kubernetes Service since October 2021. | +| [Redpanda](https://redpanda.com/) | [@rockwotj](https://github.com/rockwotj) | ![beta](https://img.shields.io/badge/-beta-orange?style=flat) | Redpanda Data Transforms allow developers to transform data directly in the message broker. | | [Shopify](https://www.shopify.com/) | [@saulecabrera](https://github.com/saulecabrera) | ![production](https://img.shields.io/badge/-production-blue?style=flat) | Shopify Functions allow developers to customize the backend logic of Shopify. | -| [SingleStore](https://www.singlestore.com/) | [@Kylebrown9](https://github.com/Kylebrown9) | ![production](https://img.shields.io/badge/-production-blue?style=flat) | SingleStoreDB Cloud embeds Wasmtime to bring developers' code to the data, safely and with speed and scale. | +| [SingleStore](https://www.singlestore.com/) | [@pvetere](https://github.com/pvetere) | ![production](https://img.shields.io/badge/-production-blue?style=flat) | SingleStoreDB Cloud embeds Wasmtime to bring developers' code to the data, safely and with speed and scale. | diff --git a/Cargo.lock b/Cargo.lock index fdf5a62934d3..c499efa8b460 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -19,13 +19,14 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.8.2" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf6ccdb167abbf410dcb915cabd428929d7f6a04980b54a11f26a39f1c7f7107" +checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" dependencies = [ "cfg-if", "once_cell", "version_check", + "zerocopy", ] [[package]] @@ -43,6 +44,15 @@ version = "0.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e9d4ee0d472d1cd2e28c97dfa124b3d8d992e10eb0a035f33f5d12e3a177ba3b" +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "anes" version = "0.1.6" @@ -85,7 +95,7 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" dependencies = [ - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -95,7 +105,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188" dependencies = [ "anstyle", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -121,18 +131,7 @@ checksum = "a564d521dd56509c4c47480d00b80ee55f7e385ae48db5744c67ad50c92d2ebf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", -] - -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", + "syn 2.0.32", ] [[package]] @@ -220,13 +219,13 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.12.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" [[package]] name = "byte-array-literals" -version = "16.0.0" +version = "19.0.0" [[package]] name = "byteorder" @@ -240,6 +239,12 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +[[package]] +name = "bytesize" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e368af43e418a04d52505cf3dbc23dda4e3407ae2fa99fd0e4f308ce546acc" + [[package]] name = "camino" version = "1.1.4" @@ -251,21 +256,21 @@ dependencies = [ [[package]] name = "cap-fs-ext" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b779b2d0a001c125b4584ad586268fb4b92d957bff8d26d7fe0dd78283faa814" +checksum = "769f8cd02eb04d57f14e2e371ebb533f96817f9b2525d73a5c72b61ca7973747" dependencies = [ "cap-primitives", "cap-std", "io-lifetimes", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "cap-net-ext" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ffc30dee200c20b4dcb80572226f42658e1d9c4b668656d7cc59c33d50e396e" +checksum = "59ff6d3fb274292a9af283417e383afe6ded1fe66f6472d2c781216d3d80c218" dependencies = [ "cap-primitives", "cap-std", @@ -275,9 +280,9 @@ dependencies = [ [[package]] name = "cap-primitives" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bf30c373a3bee22c292b1b6a7a26736a38376840f1af3d2d806455edf8c3899" +checksum = "90a0b44fc796b1a84535a63753d50ba3972c4db55c7255c186f79140e63d56d0" dependencies = [ "ambient-authority", "fs-set-times", @@ -286,15 +291,15 @@ dependencies = [ "ipnet", "maybe-owned", "rustix", - "windows-sys", + "windows-sys 0.52.0", "winx", ] [[package]] name = "cap-rand" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "577de6cff7c2a47d6b13efe5dd28bf116bd7f8f7db164ea95b7cc2640711f522" +checksum = "4327f08daac33a99bb03c54ae18c8f32c3ba31c728a33ddf683c6c6a5043de68" dependencies = [ "ambient-authority", "rand", @@ -302,9 +307,9 @@ dependencies = [ [[package]] name = "cap-std" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84bade423fa6403efeebeafe568fdb230e8c590a275fba2ba978dd112efcf6e9" +checksum = "266626ce180cf9709f317d0bf9754e3a5006359d87f4bf792f06c9c5f1b63c0f" dependencies = [ "cap-primitives", "io-extras", @@ -312,25 +317,15 @@ dependencies = [ "rustix", ] -[[package]] -name = "cap-tempfile" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b9e3348a3510c4619b4c7a7bcdef09a71221da18f266bda3ed6b9aea2c509e2" -dependencies = [ - "cap-std", - "rand", - "rustix", - "uuid", -] - [[package]] name = "cap-time-ext" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8f52b3c8f4abfe3252fd0a071f3004aaa3b18936ec97bdbd8763ce03aff6247" +checksum = "e1353421ba83c19da60726e35db0a89abef984b3be183ff6f58c5b8084fcd0c5" dependencies = [ + "ambient-authority", "cap-primitives", + "iana-time-zone", "once_cell", "rustix", "winx", @@ -367,9 +362,9 @@ dependencies = [ [[package]] name = "cargo_metadata" -version = "0.15.3" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08a1ec454bc3eead8719cb56e15dbbfecdbc14e4b3a3ae4936cc6e31f5fc0d07" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" dependencies = [ "camino", "cargo-platform", @@ -387,11 +382,12 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.0.73" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" dependencies = [ "jobserver", + "libc", ] [[package]] @@ -459,7 +455,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.32", ] [[package]] @@ -501,7 +497,7 @@ version = "0.0.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.32", ] [[package]] @@ -518,7 +514,7 @@ version = "0.0.0" dependencies = [ "anyhow", "arbitrary", - "env_logger 0.10.0", + "env_logger", "wasmtime", ] @@ -537,11 +533,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + [[package]] name = "cpp_demangle" -version = "0.3.5" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeaa953eaad386a53111e47172c2fedba671e5684c8dd601a5f474f4f118710f" +checksum = "7e8227005286ec39567949b33df9896bcadfa6051bccca2488129f108ca23119" dependencies = [ "cfg-if", ] @@ -557,7 +559,7 @@ dependencies = [ [[package]] name = "cranelift" -version = "0.103.0" +version = "0.106.0" dependencies = [ "cranelift-codegen", "cranelift-frontend", @@ -565,14 +567,14 @@ dependencies = [ [[package]] name = "cranelift-bforest" -version = "0.103.0" +version = "0.106.0" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.103.0" +version = "0.106.0" dependencies = [ "anyhow", "bincode", @@ -600,25 +602,25 @@ dependencies = [ [[package]] name = "cranelift-codegen-meta" -version = "0.103.0" +version = "0.106.0" dependencies = [ "cranelift-codegen-shared", ] [[package]] name = "cranelift-codegen-shared" -version = "0.103.0" +version = "0.106.0" [[package]] name = "cranelift-control" -version = "0.103.0" +version = "0.106.0" dependencies = [ "arbitrary", ] [[package]] name = "cranelift-entity" -version = "0.103.0" +version = "0.106.0" dependencies = [ "serde", "serde_derive", @@ -640,7 +642,7 @@ dependencies = [ "cranelift-native", "cranelift-reader", "cranelift-wasm", - "env_logger 0.10.0", + "env_logger", "expect-test", "file-per-thread-logger", "filecheck", @@ -665,7 +667,7 @@ dependencies = [ [[package]] name = "cranelift-frontend" -version = "0.103.0" +version = "0.106.0" dependencies = [ "cranelift-codegen", "hashbrown 0.14.0", @@ -689,7 +691,7 @@ dependencies = [ [[package]] name = "cranelift-interpreter" -version = "0.103.0" +version = "0.106.0" dependencies = [ "cranelift-codegen", "cranelift-entity", @@ -703,7 +705,7 @@ dependencies = [ [[package]] name = "cranelift-isle" -version = "0.103.0" +version = "0.106.0" dependencies = [ "codespan-reporting", "log", @@ -712,7 +714,7 @@ dependencies = [ [[package]] name = "cranelift-jit" -version = "0.103.0" +version = "0.106.0" dependencies = [ "anyhow", "cranelift", @@ -728,12 +730,12 @@ dependencies = [ "region", "target-lexicon", "wasmtime-jit-icache-coherence", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "cranelift-module" -version = "0.103.0" +version = "0.106.0" dependencies = [ "anyhow", "cranelift-codegen", @@ -745,7 +747,7 @@ dependencies = [ [[package]] name = "cranelift-native" -version = "0.103.0" +version = "0.106.0" dependencies = [ "cranelift-codegen", "libc", @@ -754,7 +756,7 @@ dependencies = [ [[package]] name = "cranelift-object" -version = "0.103.0" +version = "0.106.0" dependencies = [ "anyhow", "cranelift-codegen", @@ -769,7 +771,7 @@ dependencies = [ [[package]] name = "cranelift-reader" -version = "0.103.0" +version = "0.106.0" dependencies = [ "anyhow", "cranelift-codegen", @@ -779,7 +781,7 @@ dependencies = [ [[package]] name = "cranelift-serde" -version = "0.103.0" +version = "0.106.0" dependencies = [ "clap", "cranelift-codegen", @@ -811,7 +813,7 @@ dependencies = [ "fxhash", "indicatif", "log", - "pretty_env_logger 0.5.0", + "pretty_env_logger", "rayon", "regalloc2", "serde", @@ -826,13 +828,13 @@ dependencies = [ [[package]] name = "cranelift-wasm" -version = "0.103.0" +version = "0.106.0" dependencies = [ "cranelift-codegen", "cranelift-entity", "cranelift-frontend", "hashbrown 0.14.0", - "itertools", + "itertools 0.12.1", "log", "serde", "serde_derive", @@ -864,7 +866,7 @@ dependencies = [ "clap", "criterion-plot", "is-terminal", - "itertools", + "itertools 0.10.5", "num-traits", "once_cell", "oorandom", @@ -885,7 +887,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" dependencies = [ "cast", - "itertools", + "itertools 0.10.5", ] [[package]] @@ -955,7 +957,7 @@ checksum = "53e0efad4403bfc52dc201159c4b842a246a14b98c64b55dfd0f2d89729dfeb8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.32", ] [[package]] @@ -1046,26 +1048,13 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "env_logger" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" -dependencies = [ - "atty", - "humantime 1.3.0", - "log", - "regex", - "termcolor", -] - [[package]] name = "env_logger" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" dependencies = [ - "humantime 2.1.0", + "humantime", "is-terminal", "log", "regex", @@ -1080,12 +1069,19 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.6" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c18ee0ed65a5f1f81cac6b1d213b69c35fa47d4252ad41f1486dbd8226fe36e" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "example-component-wasm" +version = "0.0.0" +dependencies = [ + "wit-bindgen", ] [[package]] @@ -1124,13 +1120,13 @@ checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "fd-lock" -version = "4.0.0" +version = "4.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b0377f1edc77dbd1118507bc7a66e4ab64d2b90c66f90726dc801e73a8c68f9" +checksum = "7e5768da2206272c81ef0b5e951a41862938a6070da63bcea197899942d3b947" dependencies = [ "cfg-if", "rustix", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -1139,7 +1135,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a3cc21c33af89af0930c8cae4ade5e6fdc17b5d2c97b3d2e2edb67a1cf683f3" dependencies = [ - "env_logger 0.10.0", + "env_logger", "log", ] @@ -1188,13 +1184,13 @@ dependencies = [ [[package]] name = "fs-set-times" -version = "0.20.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd738b84894214045e8414eaded76359b4a5773f0a0a56b16575110739cdcf39" +checksum = "033b337d725b97690d86893f9de22b67b80dcc4e9ad815f348254c38119db8fb" dependencies = [ "io-lifetimes", "rustix", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -1330,9 +1326,9 @@ checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" [[package]] name = "h2" -version = "0.3.19" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d357c7ae988e7d2182f7d7871d0b963962420b0678b0997ce7de72001aeab782" +checksum = "31d030e59af851932b72ceebadf4a2b5986dba4c3b99dd2493f8273a0f151943" dependencies = [ "bytes", "fnv", @@ -1340,7 +1336,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 1.9.1", + "indexmap 2.0.0", "slab", "tokio", "tokio-util", @@ -1386,15 +1382,6 @@ dependencies = [ "unicode-segmentation", ] -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - [[package]] name = "hermit-abi" version = "0.3.0" @@ -1403,9 +1390,9 @@ checksum = "856b5cb0902c2b6d65d5fd97dfa30f9b70c7538e770b98eab5ed52d8db923e01" [[package]] name = "http" -version = "0.2.9" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "b32afd38673a8016f7c9ae69e5af41a58f81b1d31689040f2f1959594ce194ea" dependencies = [ "bytes", "fnv", @@ -1414,9 +1401,9 @@ dependencies = [ [[package]] name = "http-body" -version = "1.0.0-rc.2" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "951dfc2e32ac02d67c90c0d65bd27009a635dc9b381a2cc7d284ab01e3a0150d" +checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" dependencies = [ "bytes", "http", @@ -1424,9 +1411,9 @@ dependencies = [ [[package]] name = "http-body-util" -version = "0.1.0-rc.2" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92445bc9cc14bfa0a3ce56817dc3b5bcc227a168781a356b702410789cec0d10" +checksum = "41cb79eb393015dadd30fc252023adb0b2400a0caee0fa2a077e6e21a551e840" dependencies = [ "bytes", "futures-util", @@ -1447,15 +1434,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" -[[package]] -name = "humantime" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" -dependencies = [ - "quick-error 1.2.3", -] - [[package]] name = "humantime" version = "2.1.0" @@ -1464,13 +1442,12 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "1.0.0-rc.3" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b75264b2003a3913f118d35c586e535293b3e22e41f074930762929d071e092" +checksum = "403f9214f3e703236b221f1a9cd88ec8b4adfa5296de01ab96216361f4692f56" dependencies = [ "bytes", "futures-channel", - "futures-core", "futures-util", "h2", "http", @@ -1480,10 +1457,32 @@ dependencies = [ "itoa", "pin-project-lite", "tokio", - "tracing", "want", ] +[[package]] +name = "iana-time-zone" +version = "0.1.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6a67363e2aa4443928ce15e57ebae94fd8949958fd1223c4cfc0cd473ad7539" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "id-arena" version = "2.2.1" @@ -1550,19 +1549,19 @@ dependencies = [ [[package]] name = "io-extras" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d3c230ee517ee76b1cc593b52939ff68deda3fae9e41eca426c6b4993df51c4" +checksum = "c301e73fb90e8a29e600a9f402d095765f74310d582916a952f618836a1bd1ed" dependencies = [ "io-lifetimes", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "io-lifetimes" -version = "2.0.2" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bffb4def18c48926ccac55c1223e02865ce1a821751a95920448662696e7472c" +checksum = "5a611371471e98973dbcab4e0ec66c31a10bc356eeb4d54a0e05eac8158fe38c" [[package]] name = "ipnet" @@ -1572,13 +1571,13 @@ checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" [[package]] name = "is-terminal" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455" dependencies = [ - "hermit-abi 0.3.0", + "hermit-abi", "rustix", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -1586,7 +1585,7 @@ name = "isle-fuzz" version = "0.0.0" dependencies = [ "cranelift-isle", - "env_logger 0.10.0", + "env_logger", "libfuzzer-sys", "log", ] @@ -1597,14 +1596,23 @@ version = "0.0.0" dependencies = [ "clap", "cranelift-isle", - "env_logger 0.10.0", + "env_logger", ] [[package]] name = "itertools" -version = "0.10.3" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ "either", ] @@ -1667,9 +1675,9 @@ checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" [[package]] name = "libc" -version = "0.2.149" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libfuzzer-sys" @@ -1684,12 +1692,12 @@ dependencies = [ [[package]] name = "libloading" -version = "0.7.3" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd" +checksum = "c571b676ddfc9a8c12f1f3d3085a7b163966a8fd8098a90640953ce5f6170161" dependencies = [ "cfg-if", - "winapi", + "windows-sys 0.48.0", ] [[package]] @@ -1700,9 +1708,9 @@ checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" [[package]] name = "linux-raw-sys" -version = "0.4.10" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f" +checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" [[package]] name = "listenfd" @@ -1798,7 +1806,7 @@ checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" dependencies = [ "libc", "wasi", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -1826,7 +1834,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.3.0", + "hermit-abi", "libc", ] @@ -1891,9 +1899,9 @@ checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" [[package]] name = "openvino" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc731d9a7805dd533b69de3ee33062d5ea1dfa9fca1c19f8fd165b62e2cdde7" +checksum = "24bd3a7ef39968e6a4f1b1206c1c876f9bd50cf739ccbcd69f8539bbac5dcc7a" dependencies = [ "openvino-finder", "openvino-sys", @@ -1902,9 +1910,9 @@ dependencies = [ [[package]] name = "openvino-finder" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8bbd80eea06c2b9ec3dce85900ff3ae596c01105b759b38a005af69bbeb4d07" +checksum = "05d234d1394a413ea8adaf0c40806b9ad1946be6310b441f688840654a331973" dependencies = [ "cfg-if", "log", @@ -1912,14 +1920,14 @@ dependencies = [ [[package]] name = "openvino-sys" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "318ed662bdf05a3f86486408159e806d53363171621a8000b81366fab5158713" +checksum = "44c98acf37fc84ad9d7da4dc6c18f0f60ad209b43a6f555be01f9003d0a2a43d" dependencies = [ + "env_logger", "libloading", "once_cell", "openvino-finder", - "pretty_env_logger 0.4.0", ] [[package]] @@ -1952,6 +1960,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkg-config" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb" + [[package]] name = "plotters" version = "0.3.1" @@ -1986,23 +2000,13 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" -[[package]] -name = "pretty_env_logger" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "926d36b9553851b8b0005f1275891b392ee4d2d833852c417ed025477350fb9d" -dependencies = [ - "env_logger 0.7.1", - "log", -] - [[package]] name = "pretty_env_logger" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "865724d4dbe39d9f3dd3b52b88d859d66bcb2d6a0acfd5ea68a65fb66d4bdc1c" dependencies = [ - "env_logger 0.10.0", + "env_logger", "log", ] @@ -2254,9 +2258,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustix" -version = "0.38.21" +version = "0.38.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3" +checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" dependencies = [ "bitflags 2.4.1", "errno", @@ -2264,7 +2268,7 @@ dependencies = [ "libc", "linux-raw-sys", "once_cell", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -2358,7 +2362,7 @@ checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.32", ] [[package]] @@ -2372,6 +2376,15 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +dependencies = [ + "serde", +] + [[package]] name = "sha2" version = "0.10.2" @@ -2535,9 +2548,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.29" +version = "2.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" +checksum = "239814284fd6f1a4ffe4ca893952cdd93c224b6a1571c9a9eadd670295c0c9e2" dependencies = [ "proc-macro2", "quote", @@ -2546,9 +2559,9 @@ dependencies = [ [[package]] name = "system-interface" -version = "0.26.0" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27ce32341b2c0b70c144bbf35627fdc1ef18c76ced5e5e7b3ee8b5ba6b2ab6a0" +checksum = "9aef1f9d4c1dbdd1cb3a63be9efd2f04d8ddbc919d46112982c76818ffc2f1a7" dependencies = [ "bitflags 2.4.1", "cap-fs-ext", @@ -2556,15 +2569,15 @@ dependencies = [ "fd-lock", "io-lifetimes", "rustix", - "windows-sys", + "windows-sys 0.52.0", "winx", ] [[package]] name = "target-lexicon" -version = "0.12.12" +version = "0.12.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c39fd04924ca3a864207c66fc2cd7d22d7c016007f9ce846cbb9326331930a" +checksum = "69758bda2e78f098e4ccb393021a0963bb3442eac05f135c30f61b7370bbafae" [[package]] name = "tempfile" @@ -2576,7 +2589,7 @@ dependencies = [ "fastrand", "redox_syscall 0.3.5", "rustix", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -2621,6 +2634,7 @@ dependencies = [ "sha2", "url", "wasi", + "wasi-nn", "wit-bindgen", ] @@ -2630,7 +2644,7 @@ version = "0.0.0" dependencies = [ "cargo_metadata", "heck", - "wit-component 0.18.0", + "wit-component 0.21.0", ] [[package]] @@ -2650,7 +2664,7 @@ checksum = "463fe12d7993d3b327787537ce8dd4dfa058de32fc2b195ef3cde03dc4771e8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.32", ] [[package]] @@ -2703,7 +2717,7 @@ dependencies = [ "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -2714,7 +2728,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.32", ] [[package]] @@ -2743,11 +2757,36 @@ dependencies = [ [[package]] name = "toml" -version = "0.5.9" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" +checksum = "9a9aad4a3066010876e8dcf5a8a06e70a558751117a145c6ce2b82c2e2054290" dependencies = [ "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c9ffdf896f8daaabf9b66ba8e77ea1ed5ed0f72821b398aba62352e95062951" +dependencies = [ + "indexmap 2.0.0", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", ] [[package]] @@ -2771,7 +2810,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.32", ] [[package]] @@ -2891,9 +2930,6 @@ name = "uuid" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8cfcd319456c4d6ea10087ed423473267e1a071f3bc0aa89f80d60997843c6f0" -dependencies = [ - "getrandom", -] [[package]] name = "v8" @@ -2915,7 +2951,7 @@ checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] name = "verify-component-adapter" -version = "16.0.0" +version = "19.0.0" dependencies = [ "anyhow", "wasmparser", @@ -2964,11 +3000,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] -name = "wasi-cap-std-sync" -version = "16.0.0" +name = "wasi-common" +version = "19.0.0" dependencies = [ "anyhow", - "async-trait", + "bitflags 2.4.1", "cap-fs-ext", "cap-rand", "cap-std", @@ -2976,27 +3012,12 @@ dependencies = [ "fs-set-times", "io-extras", "io-lifetimes", + "libc", + "log", "once_cell", "rustix", "system-interface", "tempfile", - "tracing", - "wasi-common", - "windows-sys", -] - -[[package]] -name = "wasi-common" -version = "16.0.0" -dependencies = [ - "anyhow", - "bitflags 2.4.1", - "cap-rand", - "cap-std", - "io-extras", - "log", - "rustix", - "tempfile", "test-log", "test-programs-artifacts", "thiserror", @@ -3004,14 +3025,22 @@ dependencies = [ "tracing", "tracing-subscriber", "wasmtime", - "wasmtime-wasi", "wiggle", - "windows-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "wasi-nn" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7031683cc05a71515d9200fb159b28d717ded3c40dbb979d1602cf46f3a68f40" +dependencies = [ + "thiserror", ] [[package]] name = "wasi-preview1-component-adapter" -version = "16.0.0" +version = "19.0.0" dependencies = [ "byte-array-literals", "object", @@ -3020,23 +3049,6 @@ dependencies = [ "wit-bindgen", ] -[[package]] -name = "wasi-tokio" -version = "16.0.0" -dependencies = [ - "anyhow", - "cap-std", - "cap-tempfile", - "io-extras", - "io-lifetimes", - "rustix", - "tempfile", - "tokio", - "wasi-cap-std-sync", - "wasi-common", - "wiggle", -] - [[package]] name = "wasm-bindgen" version = "0.2.87" @@ -3058,7 +3070,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.32", "wasm-bindgen-shared", ] @@ -3080,7 +3092,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.32", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3093,18 +3105,18 @@ checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" [[package]] name = "wasm-encoder" -version = "0.36.2" +version = "0.41.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "822b645bf4f2446b949776ffca47e2af60b167209ffb70814ef8779d299cd421" +checksum = "972f97a5d8318f908dded23594188a90bcd09365986b1163e66d70170e5287ae" dependencies = [ "leb128", ] [[package]] name = "wasm-metadata" -version = "0.10.11" +version = "0.10.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2167ce53b2faa16a92c6cafd4942cff16c9a4fa0c5a5a0a41131ee4e49fc055f" +checksum = "18ebaa7bd0f9e7a5e5dd29b9a998acf21c4abed74265524dd7e85934597bfb10" dependencies = [ "anyhow", "indexmap 2.0.0", @@ -3118,9 +3130,9 @@ dependencies = [ [[package]] name = "wasm-mutate" -version = "0.2.40" +version = "0.2.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49afec9e74f8dd90367c8f9b60440e6b84bdfd46e8ca133dd6a040f296bbc328" +checksum = "66190ebefee2459923201c7683489eda894e703625b0c91324b1186b830410e0" dependencies = [ "egg", "log", @@ -3132,16 +3144,16 @@ dependencies = [ [[package]] name = "wasm-smith" -version = "0.12.23" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "426255ec37d1127b020492d957b1a48c0828e667ad2693d98af942e276cfbd86" +checksum = "9411792ad7c3f356ec2b31685d6553e4e8c20ed9efa192c24ab7f7560c290598" dependencies = [ + "anyhow", "arbitrary", "flagset", "indexmap 2.0.0", "leb128", "wasm-encoder", - "wasmparser", ] [[package]] @@ -3155,10 +3167,11 @@ dependencies = [ [[package]] name = "wasmi" -version = "0.20.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01bf50edb2ea9d922aa75a7bf3c15e26a6c9e2d18c56e862b49737a582901729" +checksum = "acfc1e384a36ca532d070a315925887247f3c7e23567e23e0ac9b1c5d6b8bf76" dependencies = [ + "smallvec", "spin 0.9.4", "wasmi_arena", "wasmi_core", @@ -3167,45 +3180,47 @@ dependencies = [ [[package]] name = "wasmi_arena" -version = "0.1.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ea379cbb0b41f3a9f0bf7b47036d036aae7f43383d8cc487d4deccf40dee0a" +checksum = "104a7f73be44570cac297b3035d76b169d6599637631cf37a1703326a0727073" [[package]] name = "wasmi_core" -version = "0.5.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5bf998ab792be85e20e771fe14182b4295571ad1d4f89d3da521c1bef5f597a" +checksum = "dcf1a7db34bff95b85c261002720c00c3a6168256dcb93041d3fa2054d19856a" dependencies = [ "downcast-rs", "libm", "num-traits", + "paste", ] [[package]] name = "wasmparser" -version = "0.116.1" +version = "0.121.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a58e28b80dd8340cb07b8242ae654756161f6fc8d0038123d679b7b99964fa50" +checksum = "9dbe55c8f9d0dbd25d9447a5a889ff90c0cc3feaa7395310d3d826b2c703eaab" dependencies = [ + "bitflags 2.4.1", "indexmap 2.0.0", "semver", ] [[package]] name = "wasmparser-nostd" -version = "0.91.0" +version = "0.100.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c37f310b5a62bfd5ae7c0f1d8e6f98af16a5d6d84ba764e9c36439ec14e318b" +checksum = "9157cab83003221bfd385833ab587a039f5d6fa7304854042ba358a3b09e0724" dependencies = [ "indexmap-nostd", ] [[package]] name = "wasmprinter" -version = "0.2.72" +version = "0.2.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aff4df0cdf1906ec040e97d78c3fc8fd26d3f8d70adaac81f07f80957b63b54" +checksum = "60e73986a6b7fdfedb7c5bf9e7eb71135486507c8fbc4c0c42cffcb6532988b7" dependencies = [ "anyhow", "wasmparser", @@ -3213,8 +3228,9 @@ dependencies = [ [[package]] name = "wasmtime" -version = "16.0.0" +version = "19.0.0" dependencies = [ + "addr2line", "anyhow", "async-trait", "bincode", @@ -3222,20 +3238,22 @@ dependencies = [ "cfg-if", "encoding_rs", "fxprof-processed-profile", + "gimli", "indexmap 2.0.0", + "ittapi", "libc", "log", "object", "once_cell", "paste", - "psm", "rayon", + "rustix", "serde", "serde_derive", "serde_json", "target-lexicon", "tempfile", - "wasi-cap-std-sync", + "wasi-common", "wasm-encoder", "wasmparser", "wasmtime-cache", @@ -3244,57 +3262,55 @@ dependencies = [ "wasmtime-cranelift", "wasmtime-environ", "wasmtime-fiber", - "wasmtime-jit", + "wasmtime-jit-debug", + "wasmtime-jit-icache-coherence", "wasmtime-runtime", - "wasmtime-wasi", "wasmtime-winch", "wat", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "wasmtime-asm-macros" -version = "16.0.0" +version = "19.0.0" dependencies = [ "cfg-if", ] [[package]] name = "wasmtime-bench-api" -version = "16.0.0" +version = "19.0.0" dependencies = [ "anyhow", "cap-std", "clap", "shuffling-allocator", "target-lexicon", - "wasi-cap-std-sync", + "wasi-common", "wasmtime", "wasmtime-cli-flags", - "wasmtime-wasi", "wasmtime-wasi-nn", "wat", ] [[package]] name = "wasmtime-c-api" -version = "16.0.0" +version = "19.0.0" dependencies = [ "wasmtime-c-api-impl", ] [[package]] name = "wasmtime-c-api-impl" -version = "16.0.0" +version = "19.0.0" dependencies = [ "anyhow", "cap-std", - "env_logger 0.10.0", + "env_logger", "futures", "log", "once_cell", "tracing", - "wasi-cap-std-sync", "wasi-common", "wasmtime", "wasmtime-c-api-macros", @@ -3304,7 +3320,7 @@ dependencies = [ [[package]] name = "wasmtime-c-api-macros" -version = "0.0.0" +version = "19.0.0" dependencies = [ "proc-macro2", "quote", @@ -3312,7 +3328,7 @@ dependencies = [ [[package]] name = "wasmtime-cache" -version = "16.0.0" +version = "19.0.0" dependencies = [ "anyhow", "base64", @@ -3321,34 +3337,37 @@ dependencies = [ "filetime", "log", "once_cell", - "pretty_env_logger 0.5.0", + "pretty_env_logger", "rustix", "serde", "serde_derive", "sha2", "tempfile", "toml", - "windows-sys", + "windows-sys 0.52.0", "zstd", ] [[package]] name = "wasmtime-cli" -version = "16.0.0" +version = "19.0.0" dependencies = [ "anyhow", "async-trait", "bstr", "bytes", + "bytesize", + "cfg-if", "clap", "component-macro-test", "component-test-util", "criterion", - "env_logger 0.10.0", + "env_logger", "expect-test", "filecheck", + "http", "http-body-util", - "humantime 2.1.0", + "humantime", "hyper", "libc", "listenfd", @@ -3367,6 +3386,7 @@ dependencies = [ "tokio", "tracing", "walkdir", + "wasi-common", "wasmparser", "wasmtime", "wasmtime-cache", @@ -3381,19 +3401,20 @@ dependencies = [ "wasmtime-wasi-nn", "wasmtime-wasi-threads", "wasmtime-wast", - "wast 67.0.1", + "wast 71.0.1", "wat", - "windows-sys", + "windows-sys 0.52.0", + "wit-component 0.21.0", ] [[package]] name = "wasmtime-cli-flags" -version = "16.0.0" +version = "19.0.0" dependencies = [ "anyhow", "clap", "file-per-thread-logger", - "humantime 2.1.0", + "humantime", "rayon", "tracing-subscriber", "wasmtime", @@ -3401,27 +3422,27 @@ dependencies = [ [[package]] name = "wasmtime-component-macro" -version = "16.0.0" +version = "19.0.0" dependencies = [ "anyhow", "component-macro-test-helpers", "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.32", "tracing", "wasmtime", "wasmtime-component-util", "wasmtime-wit-bindgen", - "wit-parser 0.13.0", + "wit-parser 0.14.0", ] [[package]] name = "wasmtime-component-util" -version = "16.0.0" +version = "19.0.0" [[package]] name = "wasmtime-cranelift" -version = "16.0.0" +version = "19.0.0" dependencies = [ "anyhow", "cfg-if", @@ -3444,7 +3465,7 @@ dependencies = [ [[package]] name = "wasmtime-cranelift-shared" -version = "16.0.0" +version = "19.0.0" dependencies = [ "anyhow", "cranelift-codegen", @@ -3458,16 +3479,19 @@ dependencies = [ [[package]] name = "wasmtime-environ" -version = "16.0.0" +version = "19.0.0" dependencies = [ "anyhow", + "bincode", "clap", + "cpp_demangle", "cranelift-entity", - "env_logger 0.10.0", + "env_logger", "gimli", "indexmap 2.0.0", "log", "object", + "rustc-demangle", "serde", "serde_derive", "target-lexicon", @@ -3486,7 +3510,7 @@ version = "0.0.0" dependencies = [ "arbitrary", "component-fuzz-util", - "env_logger 0.10.0", + "env_logger", "libfuzzer-sys", "wasmparser", "wasmprinter", @@ -3496,7 +3520,7 @@ dependencies = [ [[package]] name = "wasmtime-explorer" -version = "16.0.0" +version = "19.0.0" dependencies = [ "anyhow", "capstone", @@ -3510,7 +3534,7 @@ dependencies = [ [[package]] name = "wasmtime-fiber" -version = "16.0.0" +version = "19.0.0" dependencies = [ "anyhow", "backtrace", @@ -3519,7 +3543,7 @@ dependencies = [ "rustix", "wasmtime-asm-macros", "wasmtime-versioned-export-macros", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -3558,7 +3582,7 @@ dependencies = [ "arbitrary", "component-fuzz-util", "component-test-util", - "env_logger 0.10.0", + "env_logger", "log", "rand", "rayon", @@ -3577,34 +3601,9 @@ dependencies = [ "wat", ] -[[package]] -name = "wasmtime-jit" -version = "16.0.0" -dependencies = [ - "addr2line", - "anyhow", - "bincode", - "cfg-if", - "cpp_demangle", - "gimli", - "ittapi", - "log", - "object", - "rustc-demangle", - "rustix", - "serde", - "serde_derive", - "target-lexicon", - "wasmtime-environ", - "wasmtime-jit-debug", - "wasmtime-jit-icache-coherence", - "wasmtime-runtime", - "windows-sys", -] - [[package]] name = "wasmtime-jit-debug" -version = "16.0.0" +version = "19.0.0" dependencies = [ "object", "once_cell", @@ -3614,16 +3613,16 @@ dependencies = [ [[package]] name = "wasmtime-jit-icache-coherence" -version = "16.0.0" +version = "19.0.0" dependencies = [ "cfg-if", "libc", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "wasmtime-runtime" -version = "16.0.0" +version = "19.0.0" dependencies = [ "anyhow", "cc", @@ -3638,6 +3637,7 @@ dependencies = [ "once_cell", "paste", "proptest", + "psm", "rand", "rustix", "sptr", @@ -3648,12 +3648,12 @@ dependencies = [ "wasmtime-jit-debug", "wasmtime-versioned-export-macros", "wasmtime-wmemcheck", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "wasmtime-types" -version = "16.0.0" +version = "19.0.0" dependencies = [ "cranelift-entity", "serde", @@ -3664,16 +3664,16 @@ dependencies = [ [[package]] name = "wasmtime-versioned-export-macros" -version = "16.0.0" +version = "19.0.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.32", ] [[package]] name = "wasmtime-wasi" -version = "16.0.0" +version = "19.0.0" dependencies = [ "anyhow", "async-trait", @@ -3684,11 +3684,11 @@ dependencies = [ "cap-rand", "cap-std", "cap-time-ext", + "cfg-if", "fs-set-times", "futures", "io-extras", "io-lifetimes", - "libc", "log", "once_cell", "rustix", @@ -3701,17 +3701,15 @@ dependencies = [ "tracing", "tracing-subscriber", "url", - "wasi-cap-std-sync", "wasi-common", - "wasi-tokio", "wasmtime", "wiggle", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "wasmtime-wasi-http" -version = "16.0.0" +version = "19.0.0" dependencies = [ "anyhow", "async-trait", @@ -3737,42 +3735,44 @@ dependencies = [ [[package]] name = "wasmtime-wasi-nn" -version = "16.0.0" +version = "19.0.0" dependencies = [ "anyhow", + "cap-std", "openvino", + "test-programs-artifacts", "thiserror", "tracing", "walkdir", + "wasi-common", "wasmtime", "wiggle", ] [[package]] name = "wasmtime-wasi-threads" -version = "16.0.0" +version = "19.0.0" dependencies = [ "anyhow", "log", "rand", "wasi-common", "wasmtime", - "wasmtime-wasi", ] [[package]] name = "wasmtime-wast" -version = "16.0.0" +version = "19.0.0" dependencies = [ "anyhow", "log", "wasmtime", - "wast 67.0.1", + "wast 71.0.1", ] [[package]] name = "wasmtime-winch" -version = "16.0.0" +version = "19.0.0" dependencies = [ "anyhow", "cranelift-codegen", @@ -3787,17 +3787,17 @@ dependencies = [ [[package]] name = "wasmtime-wit-bindgen" -version = "16.0.0" +version = "19.0.0" dependencies = [ "anyhow", "heck", "indexmap 2.0.0", - "wit-parser 0.13.0", + "wit-parser 0.14.0", ] [[package]] name = "wasmtime-wmemcheck" -version = "16.0.0" +version = "19.0.0" [[package]] name = "wast" @@ -3810,10 +3810,11 @@ dependencies = [ [[package]] name = "wast" -version = "67.0.1" +version = "71.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a974d82fac092b5227c1663e16514e7a85f32014e22e6fdcb08b71aec9d3fb1e" +checksum = "647c3ac4354da32688537e8fc4d2fe6c578df51896298cb64727d98088a1fd26" dependencies = [ + "bumpalo", "leb128", "memchr", "unicode-width", @@ -3822,11 +3823,11 @@ dependencies = [ [[package]] name = "wat" -version = "1.0.79" +version = "1.0.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb220934f92f8551144c0003d1bc57a060674c99139f45ed623fbbf6d9262e7" +checksum = "b69c36f634411568a2c6d24828b674961e37ea03340fe1d605c337ed8162d901" dependencies = [ - "wast 67.0.1", + "wast 71.0.1", ] [[package]] @@ -3858,7 +3859,7 @@ dependencies = [ [[package]] name = "wiggle" -version = "16.0.0" +version = "19.0.0" dependencies = [ "anyhow", "async-trait", @@ -3875,24 +3876,24 @@ dependencies = [ [[package]] name = "wiggle-generate" -version = "16.0.0" +version = "19.0.0" dependencies = [ "anyhow", "heck", "proc-macro2", "quote", "shellexpand", - "syn 2.0.29", + "syn 2.0.32", "witx", ] [[package]] name = "wiggle-macro" -version = "16.0.0" +version = "19.0.0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.32", "wiggle", "wiggle-generate", ] @@ -3902,7 +3903,7 @@ name = "wiggle-test" version = "0.0.0" dependencies = [ "anyhow", - "env_logger 0.10.0", + "env_logger", "proptest", "thiserror", "tracing", @@ -3943,7 +3944,7 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "winch-codegen" -version = "0.14.0" +version = "0.17.0" dependencies = [ "anyhow", "cranelift-codegen", @@ -3967,6 +3968,7 @@ dependencies = [ "similar", "target-lexicon", "toml", + "wasmparser", "wasmtime-environ", "wat", "winch-codegen", @@ -3980,7 +3982,7 @@ dependencies = [ "glob", "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.32", ] [[package]] @@ -4004,13 +4006,31 @@ dependencies = [ "winch-test-macros", ] +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.0", +] + [[package]] name = "windows-sys" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.0", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", ] [[package]] @@ -4019,13 +4039,28 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", +] + +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +dependencies = [ + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", ] [[package]] @@ -4034,57 +4069,108 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" + [[package]] name = "windows_aarch64_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" + [[package]] name = "windows_i686_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +[[package]] +name = "windows_i686_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" + [[package]] name = "windows_i686_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +[[package]] +name = "windows_i686_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" + [[package]] name = "windows_x86_64_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" + [[package]] name = "windows_x86_64_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" + +[[package]] +name = "winnow" +version = "0.5.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5389a154b01683d28c77f8f68f49dea75f0a4da32557a58f68ee51ebba472d29" +dependencies = [ + "memchr", +] + [[package]] name = "winx" -version = "0.36.1" +version = "0.36.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4857cedf8371f690bb6782a3e2b065c54d1b6661be068aaf3eac8b45e813fdf8" +checksum = "f9643b83820c0cd246ecabe5fa454dd04ba4fa67996369466d0747472d337346" dependencies = [ "bitflags 2.4.1", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "wit-bindgen" -version = "0.13.1" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38726c54a5d7c03cac28a2a8de1006cfe40397ddf6def3f836189033a413bc08" +checksum = "6237168d93497b26dacdab157b08ad2787d74cdce10f89735f791b2a225eba4d" dependencies = [ "bitflags 2.4.1", "wit-bindgen-rust-macro", @@ -4092,48 +4178,48 @@ dependencies = [ [[package]] name = "wit-bindgen-core" -version = "0.13.1" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8bf1fddccaff31a1ad57432d8bfb7027a7e552969b6c68d6d8820dcf5c2371f" +checksum = "a3d22547a645a7d3e4311b977a34f12e1d47df48125dc06e11e45984c99282ed" dependencies = [ "anyhow", - "wit-component 0.17.0", - "wit-parser 0.12.2", + "wit-component 0.20.1", + "wit-parser 0.13.1", ] [[package]] name = "wit-bindgen-rust" -version = "0.13.2" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7200e565124801e01b7b5ddafc559e1da1b2e1bed5364d669cd1d96fb88722" +checksum = "c6a691b95d07cc4e7f7aa259b480f7f0208c4ded49406fd4f8bfd5a5a61c5db1" dependencies = [ "anyhow", "heck", "wasm-metadata", "wit-bindgen-core", - "wit-component 0.17.0", + "wit-component 0.20.1", ] [[package]] name = "wit-bindgen-rust-macro" -version = "0.13.1" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae33920ad8119fe72cf59eb00f127c0b256a236b9de029a1a10397b1f38bdbd" +checksum = "763cc6195d4ede622e5388051e381d397930016c8dc2f1199d3b48eb26781b6a" dependencies = [ "anyhow", "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.32", "wit-bindgen-core", "wit-bindgen-rust", - "wit-component 0.17.0", + "wit-component 0.20.1", ] [[package]] name = "wit-component" -version = "0.17.0" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "480cc1a078b305c1b8510f7c455c76cbd008ee49935f3a6c5fd5e937d8d95b1e" +checksum = "331de496d439010797c17637d8002712b9b69110f1669164c09dfa226ad277bb" dependencies = [ "anyhow", "bitflags 2.4.1", @@ -4145,14 +4231,14 @@ dependencies = [ "wasm-encoder", "wasm-metadata", "wasmparser", - "wit-parser 0.12.2", + "wit-parser 0.13.1", ] [[package]] name = "wit-component" -version = "0.18.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d0371ac5e57e42991aa53f0d79e53e53484afbf54777a5347605b0b229b9d" +checksum = "be60cd1b2ff7919305301d0c27528d4867bd793afe890ba3837743da9655d91b" dependencies = [ "anyhow", "bitflags 2.4.1", @@ -4164,14 +4250,14 @@ dependencies = [ "wasm-encoder", "wasm-metadata", "wasmparser", - "wit-parser 0.13.0", + "wit-parser 0.14.0", ] [[package]] name = "wit-parser" -version = "0.12.2" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43771ee863a16ec4ecf9da0fc65c3bbd4a1235c8e3da5f094b562894843dfa76" +checksum = "df4913a2219096373fd6512adead1fb77ecdaa59d7fc517972a7d30b12f625be" dependencies = [ "anyhow", "id-arena", @@ -4186,9 +4272,9 @@ dependencies = [ [[package]] name = "wit-parser" -version = "0.13.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15df6b7b28ce94b8be39d8df5cb21a08a4f3b9f33b631aedb4aa5776f785ead3" +checksum = "1ee4ad7310367bf272507c0c8e0c74a80b4ed586b833f7c7ca0b7588f686f11a" dependencies = [ "anyhow", "id-arena", @@ -4199,6 +4285,7 @@ dependencies = [ "serde_derive", "serde_json", "unicode-xid", + "wasmparser", ] [[package]] @@ -4207,36 +4294,54 @@ version = "0.9.1" dependencies = [ "anyhow", "log", - "rayon", "thiserror", "wast 35.0.2", ] +[[package]] +name = "zerocopy" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.32", +] + [[package]] name = "zstd" -version = "0.11.1+zstd.1.5.2" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a16b8414fde0414e90c612eba70985577451c4c504b99885ebed24762cb81a" +checksum = "bffb3309596d527cfcba7dfc6ed6052f1d39dfbd7c867aa2e865e4a449c10110" dependencies = [ "zstd-safe", ] [[package]] name = "zstd-safe" -version = "5.0.1+zstd.1.5.2" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c12659121420dd6365c5c3de4901f97145b79651fb1d25814020ed2ed0585ae" +checksum = "43747c7422e2924c11144d5229878b98180ef8b06cca4ab5af37afc8a8d8ea3e" dependencies = [ - "libc", "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.1+zstd.1.5.2" +version = "2.0.9+zstd.1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fd07cbbc53846d9145dbffdf6dd09a7a0aa52be46741825f5c97bdd4f73f12b" +checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" dependencies = [ "cc", - "libc", + "pkg-config", ] diff --git a/Cargo.toml b/Cargo.toml index d912807f3239..5249aaffcaec 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,6 +13,9 @@ edition.workspace = true default-run = "wasmtime" rust-version.workspace = true +[lints] +workspace = true + [lib] doctest = false @@ -29,6 +32,9 @@ wasmtime-cranelift = { workspace = true, optional = true } wasmtime-environ = { workspace = true } wasmtime-explorer = { workspace = true, optional = true } wasmtime-wast = { workspace = true, optional = true } +wasi-common = { workspace = true, default-features = true, features = [ + "exit", +] } wasmtime-wasi = { workspace = true, default-features = true, features = [ "exit", ] } @@ -52,16 +58,18 @@ humantime = { workspace = true } async-trait = { workspace = true } bytes = { workspace = true } +cfg-if = { workspace = true } tokio = { workspace = true, optional = true, features = [ "signal", "macros" ] } hyper = { workspace = true, optional = true } +http = { workspace = true, optional = true } http-body-util = { workspace = true, optional = true } [target.'cfg(unix)'.dependencies] -rustix = { workspace = true, features = ["mm", "param"] } +rustix = { workspace = true, features = ["mm", "param", "process"] } [dev-dependencies] # depend again on wasmtime to activate its default features for tests -wasmtime = { workspace = true, features = ['component-model', 'async', 'default', 'winch'] } +wasmtime = { workspace = true, features = ['component-model', 'async', 'default', 'winch', 'debug-builtins'] } env_logger = { workspace = true } log = { workspace = true } expect-test = { workspace = true } @@ -86,6 +94,8 @@ serde = { workspace = true } serde_json = { workspace = true } walkdir = { workspace = true } test-programs-artifacts = { workspace = true } +bytesize = "1.3.0" +wit-component = { workspace = true } [target.'cfg(windows)'.dev-dependencies] windows-sys = { workspace = true, features = ["Win32_System_Memory"] } @@ -113,78 +123,91 @@ members = [ "examples/fib-debug/wasm", "examples/wasi/wasm", "examples/tokio/wasm", + "examples/component/wasm", "fuzz", "winch", "winch/codegen", ] exclude = [ 'crates/wasi-common/WASI/tools/witx-cli', + 'crates/wasi-common/WASI/tools/witx', 'docs/rust_wasi_markdown_parser', ] [workspace.package] -version = "16.0.0" +version = "19.0.0" authors = ["The Wasmtime Project Developers"] edition = "2021" # Wasmtime's current policy is that this number can be no larger than the # current stable release of Rust minus 2. -rust-version = "1.71.0" +rust-version = "1.73.0" + +[workspace.lints.rust] +# Turn on some lints which are otherwise allow-by-default in rustc. +unused_extern_crates = 'warn' +trivial_numeric_casts = 'warn' +unstable_features = 'warn' +unused_import_braces = 'warn' + +[workspace.lints.clippy] +# The default set of lints in Clippy is viewed as "too noisy" right now so +# they're all turned off by default. Selective lints are then enabled below as +# necessary. +all = 'allow' [workspace.dependencies] arbitrary = { version = "1.3.1" } -wasmtime-wmemcheck = { path = "crates/wmemcheck", version = "=16.0.0" } -wasmtime = { path = "crates/wasmtime", version = "16.0.0", default-features = false } -wasmtime-cache = { path = "crates/cache", version = "=16.0.0" } -wasmtime-cli-flags = { path = "crates/cli-flags", version = "=16.0.0" } -wasmtime-cranelift = { path = "crates/cranelift", version = "=16.0.0" } -wasmtime-cranelift-shared = { path = "crates/cranelift-shared", version = "=16.0.0" } -wasmtime-winch = { path = "crates/winch", version = "=16.0.0" } -wasmtime-environ = { path = "crates/environ", version = "=16.0.0" } -wasmtime-explorer = { path = "crates/explorer", version = "=16.0.0" } -wasmtime-fiber = { path = "crates/fiber", version = "=16.0.0" } -wasmtime-types = { path = "crates/types", version = "16.0.0" } -wasmtime-jit = { path = "crates/jit", version = "=16.0.0" } -wasmtime-jit-debug = { path = "crates/jit-debug", version = "=16.0.0" } -wasmtime-runtime = { path = "crates/runtime", version = "=16.0.0" } -wasmtime-wast = { path = "crates/wast", version = "=16.0.0" } -wasmtime-wasi = { path = "crates/wasi", version = "16.0.0", default-features = false } -wasmtime-wasi-http = { path = "crates/wasi-http", version = "=16.0.0", default-features = false } -wasmtime-wasi-nn = { path = "crates/wasi-nn", version = "16.0.0" } -wasmtime-wasi-threads = { path = "crates/wasi-threads", version = "16.0.0" } -wasmtime-component-util = { path = "crates/component-util", version = "=16.0.0" } -wasmtime-component-macro = { path = "crates/component-macro", version = "=16.0.0" } -wasmtime-asm-macros = { path = "crates/asm-macros", version = "=16.0.0" } -wasmtime-versioned-export-macros = { path = "crates/versioned-export-macros", version = "=16.0.0" } +wasmtime-wmemcheck = { path = "crates/wmemcheck", version = "=19.0.0" } +wasmtime = { path = "crates/wasmtime", version = "19.0.0", default-features = false } +wasmtime-c-api-macros = { path = "crates/c-api-macros", version = "=19.0.0" } +wasmtime-cache = { path = "crates/cache", version = "=19.0.0" } +wasmtime-cli-flags = { path = "crates/cli-flags", version = "=19.0.0" } +wasmtime-cranelift = { path = "crates/cranelift", version = "=19.0.0" } +wasmtime-cranelift-shared = { path = "crates/cranelift-shared", version = "=19.0.0" } +wasmtime-winch = { path = "crates/winch", version = "=19.0.0" } +wasmtime-environ = { path = "crates/environ", version = "=19.0.0" } +wasmtime-explorer = { path = "crates/explorer", version = "=19.0.0" } +wasmtime-fiber = { path = "crates/fiber", version = "=19.0.0" } +wasmtime-types = { path = "crates/types", version = "19.0.0" } +wasmtime-jit-debug = { path = "crates/jit-debug", version = "=19.0.0" } +wasmtime-runtime = { path = "crates/runtime", version = "=19.0.0" } +wasmtime-wast = { path = "crates/wast", version = "=19.0.0" } +wasmtime-wasi = { path = "crates/wasi", version = "19.0.0", default-features = false } +wasmtime-wasi-http = { path = "crates/wasi-http", version = "=19.0.0", default-features = false } +wasmtime-wasi-nn = { path = "crates/wasi-nn", version = "19.0.0" } +wasmtime-wasi-threads = { path = "crates/wasi-threads", version = "19.0.0" } +wasmtime-component-util = { path = "crates/component-util", version = "=19.0.0" } +wasmtime-component-macro = { path = "crates/component-macro", version = "=19.0.0" } +wasmtime-asm-macros = { path = "crates/asm-macros", version = "=19.0.0" } +wasmtime-versioned-export-macros = { path = "crates/versioned-export-macros", version = "=19.0.0" } component-test-util = { path = "crates/misc/component-test-util" } component-fuzz-util = { path = "crates/misc/component-fuzz-util" } -wiggle = { path = "crates/wiggle", version = "=16.0.0", default-features = false } -wiggle-macro = { path = "crates/wiggle/macro", version = "=16.0.0" } -wiggle-generate = { path = "crates/wiggle/generate", version = "=16.0.0" } -wasi-common = { path = "crates/wasi-common", version = "=16.0.0" } -wasi-tokio = { path = "crates/wasi-common/tokio", version = "=16.0.0" } -wasi-cap-std-sync = { path = "crates/wasi-common/cap-std-sync", version = "=16.0.0" } +wiggle = { path = "crates/wiggle", version = "=19.0.0", default-features = false } +wiggle-macro = { path = "crates/wiggle/macro", version = "=19.0.0" } +wiggle-generate = { path = "crates/wiggle/generate", version = "=19.0.0" } +wasi-common = { path = "crates/wasi-common", version = "=19.0.0", default-features = false } wasmtime-fuzzing = { path = "crates/fuzzing" } -wasmtime-jit-icache-coherence = { path = "crates/jit-icache-coherence", version = "=16.0.0" } -wasmtime-wit-bindgen = { path = "crates/wit-bindgen", version = "=16.0.0" } +wasmtime-jit-icache-coherence = { path = "crates/jit-icache-coherence", version = "=19.0.0" } +wasmtime-wit-bindgen = { path = "crates/wit-bindgen", version = "=19.0.0" } test-programs-artifacts = { path = 'crates/test-programs/artifacts' } -cranelift-wasm = { path = "cranelift/wasm", version = "0.103.0" } -cranelift-codegen = { path = "cranelift/codegen", version = "0.103.0", default-features = false, features = ["std", "unwind"] } -cranelift-frontend = { path = "cranelift/frontend", version = "0.103.0" } -cranelift-entity = { path = "cranelift/entity", version = "0.103.0" } -cranelift-native = { path = "cranelift/native", version = "0.103.0" } -cranelift-module = { path = "cranelift/module", version = "0.103.0" } -cranelift-interpreter = { path = "cranelift/interpreter", version = "0.103.0" } -cranelift-reader = { path = "cranelift/reader", version = "0.103.0" } +cranelift-wasm = { path = "cranelift/wasm", version = "0.106.0" } +cranelift-codegen = { path = "cranelift/codegen", version = "0.106.0", default-features = false, features = ["std", "unwind"] } +cranelift-frontend = { path = "cranelift/frontend", version = "0.106.0" } +cranelift-entity = { path = "cranelift/entity", version = "0.106.0" } +cranelift-native = { path = "cranelift/native", version = "0.106.0" } +cranelift-module = { path = "cranelift/module", version = "0.106.0" } +cranelift-interpreter = { path = "cranelift/interpreter", version = "0.106.0" } +cranelift-reader = { path = "cranelift/reader", version = "0.106.0" } cranelift-filetests = { path = "cranelift/filetests" } -cranelift-object = { path = "cranelift/object", version = "0.103.0" } -cranelift-jit = { path = "cranelift/jit", version = "0.103.0" } +cranelift-object = { path = "cranelift/object", version = "0.106.0" } +cranelift-jit = { path = "cranelift/jit", version = "0.106.0" } cranelift-fuzzgen = { path = "cranelift/fuzzgen" } -cranelift-bforest = { path = "cranelift/bforest", version = "0.103.0" } -cranelift-control = { path = "cranelift/control", version = "0.103.0" } -cranelift = { path = "cranelift/umbrella", version = "0.103.0" } +cranelift-bforest = { path = "cranelift/bforest", version = "0.106.0" } +cranelift-control = { path = "cranelift/control", version = "0.106.0" } +cranelift = { path = "cranelift/umbrella", version = "0.106.0" } -winch-codegen = { path = "winch/codegen", version = "=0.14.0" } +winch-codegen = { path = "winch/codegen", version = "=0.17.0" } winch-filetests = { path = "winch/filetests" } winch-test-macros = { path = "winch/test-macros" } @@ -196,39 +219,38 @@ byte-array-literals = { path = "crates/wasi-preview1-component-adapter/byte-arra regalloc2 = "0.9.3" # cap-std family: -target-lexicon = { version = "0.12.12", default-features = false, features = ["std"] } -cap-std = "2.0.0" -cap-rand = { version = "2.0.0", features = ["small_rng"] } -cap-fs-ext = "2.0.0" -cap-net-ext = "2.0.0" -cap-time-ext = "2.0.0" -cap-tempfile = "2.0.0" -fs-set-times = "0.20.0" -system-interface = { version = "0.26.0", features = ["cap_std_impls"] } -io-lifetimes = { version = "2.0.2", default-features = false } -io-extras = "0.18.0" -rustix = "0.38.21" -is-terminal = "0.4.0" +target-lexicon = { version = "0.12.13", default-features = false, features = ["std"] } +cap-std = "3.0.0" +cap-rand = { version = "3.0.0", features = ["small_rng"] } +cap-fs-ext = "3.0.0" +cap-net-ext = "3.0.0" +cap-time-ext = "3.0.0" +cap-tempfile = "3.0.0" +fs-set-times = "0.20.1" +system-interface = { version = "0.27.1", features = ["cap_std_impls"] } +io-lifetimes = { version = "2.0.3", default-features = false } +io-extras = "0.18.1" +rustix = "0.38.31" # wit-bindgen: -wit-bindgen = { version = "0.13.1", default-features = false } +wit-bindgen = { version = "0.17.0", default-features = false } # wasm-tools family: -wasmparser = "0.116.0" -wat = "1.0.79" -wast = "67.0.1" -wasmprinter = "0.2.72" -wasm-encoder = "0.36.2" -wasm-smith = "0.12.23" -wasm-mutate = "0.2.40" -wit-parser = "0.13.0" -wit-component = "0.18.0" +wasmparser = "0.121.2" +wat = "1.0.88" +wast = "71.0.1" +wasmprinter = "0.2.80" +wasm-encoder = "0.41.2" +wasm-smith = "0.16.1" +wasm-mutate = "0.2.48" +wit-parser = "0.14.0" +wit-component = "0.21.0" # Non-Bytecode Alliance maintained dependencies: # -------------------------- object = { version = "0.32", default-features = false, features = ['read_core', 'elf', 'std'] } gimli = { version = "0.28.0", default-features = false, features = ['read', 'std'] } anyhow = "1.0.22" -windows-sys = "0.48.0" +windows-sys = "0.52.0" env_logger = "0.10" expect-test = "1.4.1" log = { version = "0.4.8", default-features = false } @@ -243,7 +265,7 @@ thiserror = "1.0.43" async-trait = "0.1.71" heck = "0.4" similar = "2.1.0" -toml = "0.5.9" +toml = "0.8.10" # serde and serde_derive must have the same version serde = "1.0.188" serde_derive = "1.0.188" @@ -258,10 +280,10 @@ libc = "0.2.60" regex = "1.9.1" file-per-thread-logger = "0.2.0" tokio = { version = "1.26.0", features = [ "rt", "time" ] } -hyper = "=1.0.0-rc.3" -http = "0.2.9" -http-body = "=1.0.0-rc.2" -http-body-util = "=0.1.0-rc.2" +hyper = "1.0.1" +http = "1.0.0" +http-body = "1.0.0" +http-body-util = "0.1.0" bytes = "1.4" futures = { version = "0.3.27", default-features = false } indexmap = "2.0.0" @@ -309,6 +331,7 @@ default = [ "coredump", "addr2line", "debug-builtins", + "component-model", # Enable some nice features of clap by default, but they come at a binary size # cost, so allow disabling this through disabling of our own `default` @@ -339,11 +362,11 @@ disable-logging = ["log/max_level_off", "tracing/max_level_off"] # the internal mapping for what they enable in Wasmtime itself. wasi-nn = ["dep:wasmtime-wasi-nn"] wasi-threads = ["dep:wasmtime-wasi-threads"] -wasi-http = ["component-model", "dep:wasmtime-wasi-http", "dep:tokio", "dep:hyper", "wasmtime-wasi-http?/sync"] +wasi-http = ["component-model", "dep:wasmtime-wasi-http", "dep:tokio", "dep:hyper"] pooling-allocator = ["wasmtime/pooling-allocator", "wasmtime-cli-flags/pooling-allocator"] component-model = [ "wasmtime/component-model", - "wasmtime-wast/component-model", + "wasmtime-wast?/component-model", "wasmtime-cli-flags/component-model" ] wat = ["dep:wat", "wasmtime/wat"] @@ -362,7 +385,7 @@ old-cli = [] # CLI subcommands for the `wasmtime` executable. See `wasmtime $cmd --help` # for more information on each subcommand. -serve = ["wasi-http", "component-model", "dep:http-body-util"] +serve = ["wasi-http", "component-model", "dep:http-body-util", "dep:http"] explore = ["dep:wasmtime-explorer"] wast = ["dep:wasmtime-wast"] config = ["cache"] diff --git a/RELEASES.md b/RELEASES.md index b5d3e86389be..3d67a7c2fb8c 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -1,6 +1,6 @@ -------------------------------------------------------------------------------- -## 16.0.0 +## 19.0.0 Unreleased. @@ -10,12 +10,189 @@ Unreleased. -------------------------------------------------------------------------------- -## 15.0.0 +## 18.0.0 Unreleased. ### Added +### Changed + +-------------------------------------------------------------------------------- + +## 17.0.0 + +Released 2024-01-25 + +The major feature of this release is that the WASI support in Wasmtime is now +considered stable and flagged at an 0.2.0 version approved by the WASI subgroup. +The release was delayed a few days to hold off until the WASI subgroup voted to +approve the CLI and HTTP worlds and they're now on-by-default! Additionally the +component model is now enabled by default in Wasmtime, for example an opt-in +flag is no longer required on the CLI. Note that embeddings still must opt-in to +using the component model by using the `wasmtime::component` module. + +### Added + +* Cranelift optimizations have been added for "3-way comparisons", or `Ord::cmp` + in Rust or `<=>` in C++. + [#7636](https://github.com/bytecodealliance/wasmtime/pull/7636) + [#7702](https://github.com/bytecodealliance/wasmtime/pull/7702) + +* Components now use Wasmtime's compilation cache used for core wasm modules by + default. + [#7649](https://github.com/bytecodealliance/wasmtime/pull/7649) + +* The `Resource` and `ResourceAny` types can now be converted between each + other. + [#7649](https://github.com/bytecodealliance/wasmtime/pull/7649) + [#7712](https://github.com/bytecodealliance/wasmtime/pull/7712) + +### Changed + +* Minor changes have been made to a number of WITs as they progressed to their + official 0.2.0 status. + [#7625](https://github.com/bytecodealliance/wasmtime/pull/7625) + [#7640](https://github.com/bytecodealliance/wasmtime/pull/7640) + [#7690](https://github.com/bytecodealliance/wasmtime/pull/7690) + [#7781](https://github.com/bytecodealliance/wasmtime/pull/7781) + [#7817](https://github.com/bytecodealliance/wasmtime/pull/7817) + +* The component model is now enabled by default. + [#7821](https://github.com/bytecodealliance/wasmtime/pull/7821) + +* The implementation of `memory.atomic.{wait,notify}` has been rewritten. + [#7629](https://github.com/bytecodealliance/wasmtime/pull/7629) + +* The `wasmtime_wasi::preview2::Table` type has been moved to + `wasmtime::component::ResourceTable`. + [#7655](https://github.com/bytecodealliance/wasmtime/pull/7655) + +* Creating a UDP stream now validates the address being sent to. + [#7648](https://github.com/bytecodealliance/wasmtime/pull/7648) + +* Defining resource types in `Linker` now takes the type to define as a + runtime parameter. + [#7680](https://github.com/bytecodealliance/wasmtime/pull/7680) + +* Socket address checks can now be performed dynamically at runtime. + [#7662](https://github.com/bytecodealliance/wasmtime/pull/7662) + +* Wasmtime and Cranelift's MSRV is now 1.73.0. + [#7739](https://github.com/bytecodealliance/wasmtime/pull/7739) + +### Fixed + +* Bindings for WIT APIs where interfaces have multiple versions are now fixed by + putting the version in the generated binding names. + [#7656](https://github.com/bytecodealliance/wasmtime/pull/7656) + +* The preview1 `fd_{read,write}` APIs are now fixed when a shared memory is + used. + [#7755](https://github.com/bytecodealliance/wasmtime/pull/7755) + +* The preview1 `fd_{read,write}` APIs no longer leak an intermediate stream + created. + [#7819](https://github.com/bytecodealliance/wasmtime/pull/7819) + +-------------------------------------------------------------------------------- + +## 16.0.0 + +Released 2023-12-20 + +### Added + +* Add yielding support in `wasmtime_store_epoch_deadline_callback` in the C API. + [#7476](https://github.com/bytecodealliance/wasmtime/pull/7476) + +* Support for the `wasi_unstable` module ("wasi preview0" canonically) has been + added to the `-Spreview2` support in the CLI. + [#7548](https://github.com/bytecodealliance/wasmtime/pull/7548) + +* The original module can now be obtained from an "instance pre" in the C API. + [#7572](https://github.com/bytecodealliance/wasmtime/pull/7572) + +* Usage of Mach ports on macOS can now be disabled in the C API. + [#7595](https://github.com/bytecodealliance/wasmtime/pull/7595) + +### Changed + +* The preview1-to-preview2 component adapters now import a smaller number of + interfaces by default. + [#7543](https://github.com/bytecodealliance/wasmtime/pull/7543) + [#7544](https://github.com/bytecodealliance/wasmtime/pull/7544) + +* Wasmtime and Cranelift now require Rust 1.72.0 to build. + [#7554](https://github.com/bytecodealliance/wasmtime/pull/7554) + +* The default `world` supported by `wasmtime serve` has been slimmed down to + exactly what `wasi:http/proxy` specifies by default. Support for other WASI + APIs can be included with the `-S common` command-line flag. + [#7597](https://github.com/bytecodealliance/wasmtime/pull/7597) + +* The `wasmtime --version` CLI output will now include date/commit information + when Wasmtime is built from a git checkout. + [#7610](https://github.com/bytecodealliance/wasmtime/pull/7610) + +* Debug intrinsic symbols required by LLDB and GDB have been moved behind a + `debug-builtins` feature of the `wasmtime` crate which is enabled by default. + [#7626](https://github.com/bytecodealliance/wasmtime/pull/7626) + +### Fixed + +* MPK support is now explicitly disabled on AMD-based CPUs since the + implementation does not currently support it. + [#7513](https://github.com/bytecodealliance/wasmtime/pull/7513) + +* Initialization of a WebAssembly data segment with a negative offset is fixed + to zero-extend the offset instead of sign-extend. + [#7559](https://github.com/bytecodealliance/wasmtime/pull/7559) + +* The reported offset of `O_APPEND` files in preview1 has been fixed. + [#7586](https://github.com/bytecodealliance/wasmtime/pull/7586) + +* MPK support does a better job of compacting memories to minimize virtual + memory used. + [#7622](https://github.com/bytecodealliance/wasmtime/pull/7622) + +### Cranelift + +* Union node bitpacking has been fixed with egraph optimizations to ensure the + minimal cost node is selected. + [#7465](https://github.com/bytecodealliance/wasmtime/pull/7465) + +* Equivalent-cost expressions now have ties broken with expression depth in + egraphs to prefer "shallow" expression trees. + [#7456](https://github.com/bytecodealliance/wasmtime/pull/7456) + +* Long-and-narrow chains of expressions are now optimized into shallow-and-wide + trees. + [#7466](https://github.com/bytecodealliance/wasmtime/pull/7466) + +-------------------------------------------------------------------------------- + +## 15.0.1 + +Released 2023-12-01. + +### Fixed + +* The `wasi:random/insecure{,_seed}` interfaces are now available through the + CLI. + [#7614](https://github.com/bytecodealliance/wasmtime/pull/7614) + +* A stray debugging `println!` was removed. + [#7618](https://github.com/bytecodealliance/wasmtime/pull/7618) + +-------------------------------------------------------------------------------- + +## 15.0.0 + +Released 2023-11-20 + +### Added + * Multiple versions of interfaces are now supported in `bindgen!`. [#7172](https://github.com/bytecodealliance/wasmtime/pull/7172) diff --git a/benches/call.rs b/benches/call.rs index 90f9beca60b2..b0baa0e93cb1 100644 --- a/benches/call.rs +++ b/benches/call.rs @@ -23,6 +23,7 @@ enum IsAsync { Yes, YesPooling, No, + NoPooling, } impl IsAsync { @@ -31,12 +32,13 @@ impl IsAsync { IsAsync::Yes => "async", IsAsync::YesPooling => "async-pool", IsAsync::No => "sync", + IsAsync::NoPooling => "sync-pool", } } fn use_async(&self) -> bool { match self { IsAsync::Yes | IsAsync::YesPooling => true, - IsAsync::No => false, + IsAsync::No | IsAsync::NoPooling => false, } } } @@ -47,14 +49,29 @@ fn engines() -> Vec<(Engine, IsAsync)> { #[cfg(feature = "component-model")] config.wasm_component_model(true); + let mut pool = PoolingAllocationConfig::default(); + if std::env::var("WASMTIME_TEST_FORCE_MPK").is_ok() { + pool.memory_protection_keys(MpkEnabled::Enable); + } + vec![ (Engine::new(&config).unwrap(), IsAsync::No), + ( + Engine::new( + config + .clone() + .allocation_strategy(InstanceAllocationStrategy::Pooling(pool.clone())), + ) + .unwrap(), + IsAsync::NoPooling, + ), ( Engine::new(config.async_support(true)).unwrap(), IsAsync::Yes, ), ( - Engine::new(config.allocation_strategy(InstanceAllocationStrategy::pooling())).unwrap(), + Engine::new(config.allocation_strategy(InstanceAllocationStrategy::Pooling(pool))) + .unwrap(), IsAsync::YesPooling, ), ] @@ -285,9 +302,9 @@ fn wasm_to_host(c: &mut Criterion) { let mut untyped = Linker::new(&engine); untyped - .func_new("", "nop", FuncType::new([], []), |_, _, _| Ok(())) + .func_new("", "nop", FuncType::new(&engine, [], []), |_, _, _| Ok(())) .unwrap(); - let ty = FuncType::new([ValType::I32, ValType::I64], [ValType::F32]); + let ty = FuncType::new(&engine, [ValType::I32, ValType::I64], [ValType::F32]); untyped .func_new( "", @@ -319,9 +336,9 @@ fn wasm_to_host(c: &mut Criterion) { unsafe { let mut unchecked = Linker::new(&engine); unchecked - .func_new_unchecked("", "nop", FuncType::new([], []), |_, _| Ok(())) + .func_new_unchecked("", "nop", FuncType::new(&engine, [], []), |_, _| Ok(())) .unwrap(); - let ty = FuncType::new([ValType::I32, ValType::I64], [ValType::F32]); + let ty = FuncType::new(&engine, [ValType::I32, ValType::I64], [ValType::F32]); unchecked .func_new_unchecked("", "nop-params-and-results", ty, |mut caller, space| { match Val::from_raw(&mut caller, space[0], ValType::I32) { diff --git a/benches/instantiation.rs b/benches/instantiation.rs index e43bd650545e..d4ced3fca053 100644 --- a/benches/instantiation.rs +++ b/benches/instantiation.rs @@ -6,8 +6,8 @@ use std::process::Command; use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering::SeqCst}; use std::sync::Arc; use std::thread; +use wasi_common::{sync::WasiCtxBuilder, WasiCtx}; use wasmtime::*; -use wasmtime_wasi::{sync::WasiCtxBuilder, WasiCtx}; fn store(engine: &Engine) -> Store { let wasi = WasiCtxBuilder::new().build(); @@ -48,7 +48,7 @@ fn bench_sequential(c: &mut Criterion, path: &Path) { // benchmark programs. linker.func_wrap("bench", "start", || {}).unwrap(); linker.func_wrap("bench", "end", || {}).unwrap(); - wasmtime_wasi::add_to_linker(&mut linker, |cx| cx).unwrap(); + wasi_common::sync::add_to_linker(&mut linker, |cx| cx).unwrap(); let pre = linker .instantiate_pre(&module) .expect("failed to pre-instantiate"); @@ -82,7 +82,7 @@ fn bench_parallel(c: &mut Criterion, path: &Path) { // benchmark programs. linker.func_wrap("bench", "start", || {}).unwrap(); linker.func_wrap("bench", "end", || {}).unwrap(); - wasmtime_wasi::add_to_linker(&mut linker, |cx| cx).unwrap(); + wasi_common::sync::add_to_linker(&mut linker, |cx| cx).unwrap(); let pre = Arc::new( linker .instantiate_pre(&module) diff --git a/benches/trap.rs b/benches/trap.rs index 979f30676445..a006c871b9bc 100644 --- a/benches/trap.rs +++ b/benches/trap.rs @@ -187,7 +187,7 @@ fn bench_host_wasm_frames_traps(c: &mut Criterion) { let mut store = Store::new(&engine, ()); let host_func = Func::new( &mut store, - FuncType::new(vec![ValType::I32], vec![]), + FuncType::new(&engine, vec![ValType::I32], vec![]), |mut caller, args, _results| { let f = caller.get_export("f").unwrap(); let f = f.into_func().unwrap(); diff --git a/benches/wasi.rs b/benches/wasi.rs index 41dc25e3bd8a..77944071ba9e 100644 --- a/benches/wasi.rs +++ b/benches/wasi.rs @@ -2,8 +2,8 @@ use criterion::{criterion_group, criterion_main, Criterion}; use std::{fs::File, path::Path, time::Instant}; +use wasi_common::{sync::WasiCtxBuilder, WasiCtx}; use wasmtime::{Engine, Linker, Module, Store, TypedFunc}; -use wasmtime_wasi::{sync::WasiCtxBuilder, WasiCtx}; criterion_group!(benches, bench_wasi); criterion_main!(benches); @@ -53,7 +53,7 @@ fn instantiate(wat: &[u8]) -> (Store, TypedFunc) { let mut store = Store::new(&engine, wasi); let module = Module::new(&engine, wat).unwrap(); let mut linker = Linker::new(&engine); - wasmtime_wasi::add_to_linker(&mut linker, |cx| cx).unwrap(); + wasi_common::sync::add_to_linker(&mut linker, |cx| cx).unwrap(); let instance = linker.instantiate(&mut store, &module).unwrap(); let run = instance.get_typed_func(&mut store, "run").unwrap(); (store, run) @@ -77,9 +77,9 @@ fn wasi_context() -> WasiCtx { ]) .unwrap() .preopened_dir( - wasmtime_wasi::Dir::open_ambient_dir( + wasi_common::sync::Dir::open_ambient_dir( "benches/wasi", - wasmtime_wasi::ambient_authority(), + wasi_common::sync::ambient_authority(), ) .unwrap(), "/", diff --git a/build.rs b/build.rs index 64584ca886c4..06ff566f5075 100644 --- a/build.rs +++ b/build.rs @@ -13,6 +13,8 @@ use std::process::Command; fn main() -> anyhow::Result<()> { println!("cargo:rerun-if-changed=build.rs"); + set_commit_info_for_rustc(); + let out_dir = PathBuf::from( env::var_os("OUT_DIR").expect("The OUT_DIR environment variable must be set"), ); @@ -201,26 +203,8 @@ fn write_testsuite_tests( fn ignore(testsuite: &str, testname: &str, strategy: &str) -> bool { assert!(strategy == "Cranelift" || strategy == "Winch"); - // Ignore everything except the winch misc test suite. - // We ignore tests that assert for traps on windows, given - // that Winch doesn't encode unwind information for Windows, yet. + // Ignore some tests for when testing Winch. if strategy == "Winch" { - let assert_trap = [ - "i32", - "i64", - "call_indirect", - "table_fill", - "table_init", - "table_copy", - "table_set", - "table_get", - ] - .contains(&testname); - - if assert_trap && env::var("CARGO_CFG_TARGET_OS").unwrap().as_str() == "windows" { - return true; - } - if testsuite == "misc_testsuite" { // The misc/call_indirect is fully supported by Winch. if testname != "call_indirect" { @@ -228,8 +212,26 @@ fn ignore(testsuite: &str, testname: &str, strategy: &str) -> bool { } } if testsuite == "spec_testsuite" { - // The official table init and table copy tests are now supported. - return !["table_init", "table_copy"].contains(&testname); + let denylist = [ + "br_table", + "global", + "table_fill", + "table_get", + "table_set", + "table_grow", + "table_size", + "elem", + "select", + "unreached_invalid", + "imports", + "linking", + ] + .contains(&testname); + + let ref_types = testname.starts_with("ref_"); + let simd = testname.starts_with("simd_"); + + return denylist || ref_types || simd; } if testsuite != "winch" { @@ -281,3 +283,30 @@ fn ignore(testsuite: &str, testname: &str, strategy: &str) -> bool { _ => false, } } + +fn set_commit_info_for_rustc() { + if !Path::new(".git").exists() { + return; + } + let output = match Command::new("git") + .arg("log") + .arg("-1") + .arg("--date=short") + .arg("--format=%H %h %cd") + .arg("--abbrev=9") + .output() + { + Ok(output) if output.status.success() => output, + _ => return, + }; + let stdout = String::from_utf8(output.stdout).unwrap(); + let mut parts = stdout.split_whitespace(); + let mut next = || parts.next().unwrap(); + println!("cargo:rustc-env=WASMTIME_GIT_HASH={}", next()); + println!( + "cargo:rustc-env=WASMTIME_VERSION_INFO={} ({} {})", + env!("CARGO_PKG_VERSION"), + next(), + next() + ); +} diff --git a/ci/build-build-matrix.js b/ci/build-build-matrix.js index 23c2b6ebb060..f0ca90ab0792 100644 --- a/ci/build-build-matrix.js +++ b/ci/build-build-matrix.js @@ -36,7 +36,7 @@ const array = [ }, { "build": "aarch64-macos", - "os": "macos-latest", + "os": "macos-14", "target": "aarch64-apple-darwin", }, { @@ -55,7 +55,7 @@ const builds = []; for (let build of array) { // Perform a "deep clone" roundtripping through JSON for a copy of the build // that's normal - build.rust = 'stable'; + build.rust = 'default'; builds.push(JSON.parse(JSON.stringify(build))); // Next generate a "min" build and add it to the builds list. Min builds diff --git a/ci/build-test-matrix.js b/ci/build-test-matrix.js index 5fee846d6787..0a2a53c9bde0 100644 --- a/ci/build-test-matrix.js +++ b/ci/build-test-matrix.js @@ -48,11 +48,23 @@ const array = [ "isa": "x64", "rust": "msrv", }, + { + "os": "ubuntu-latest", + "name": "Test Linux x86_64 with MPK", + "filter": "linux-x64", + "isa": "x64" + }, { "os": "macos-latest", "name": "Test macOS x86_64", "filter": "macos-x64" }, + { + "os": "macos-14", + "name": "Test macOS arm64", + "filter": "macos-arm64", + "target": "aarch64-apple-darwin" + }, { "os": "windows-latest", "name": "Test Windows MSVC x86_64", diff --git a/ci/build-wasi-preview1-component-adapter.sh b/ci/build-wasi-preview1-component-adapter.sh index ba1380d3bcd8..259bb697589c 100755 --- a/ci/build-wasi-preview1-component-adapter.sh +++ b/ci/build-wasi-preview1-component-adapter.sh @@ -26,3 +26,9 @@ $build_adapter --release $verify $release wasm-tools metadata add --name "wasi_preview1_component_adapter.reactor.adapter:${VERSION}" $release \ -o target/wasm32-unknown-unknown/release/wasi_snapshot_preview1.reactor.wasm + +# Release build, proxy +$build_adapter --release --no-default-features --features proxy +$verify $release +wasm-tools metadata add --name "wasi_preview1_component_adapter.proxy.adapter:${VERSION}" $release \ + -o target/wasm32-unknown-unknown/release/wasi_snapshot_preview1.proxy.wasm diff --git a/ci/merge-artifacts.sh b/ci/merge-artifacts.sh index aece95e6c4ad..036911cab523 100755 --- a/ci/merge-artifacts.sh +++ b/ci/merge-artifacts.sh @@ -9,7 +9,7 @@ set -ex -# Prepare the upload folder and move all aritfacts that aren't being merged into +# Prepare the upload folder and move all artifacts that aren't being merged into # this folder, e.g. the MSI installer and adapter wasm files. rm -rf dist mkdir dist diff --git a/ci/run-wasi-nn-example.sh b/ci/run-wasi-nn-example.sh deleted file mode 100755 index 6f433bc3eff2..000000000000 --- a/ci/run-wasi-nn-example.sh +++ /dev/null @@ -1,57 +0,0 @@ -#!/bin/bash - -# The following script demonstrates how to execute a machine learning inference -# using the wasi-nn module optionally compiled into Wasmtime. Calling it will -# download the necessary model and tensor files stored separately in $FIXTURE -# into $TMP_DIR (optionally pass a directory with existing files as the first -# argument to re-try the script). Then, it will compile and run several examples -# in the Wasmtime CLI. -set -e -WASMTIME_DIR=$(dirname "$0" | xargs dirname) -FIXTURE=https://github.com/intel/openvino-rs/raw/main/crates/openvino/tests/fixtures/mobilenet -if [ -z "${1+x}" ]; then - # If no temporary directory is specified, create one. - TMP_DIR=$(mktemp -d -t ci-XXXXXXXXXX) - REMOVE_TMP_DIR=1 -else - # If a directory was specified, use it and avoid removing it. - TMP_DIR=$(realpath $1) - REMOVE_TMP_DIR=0 -fi - -# One of the examples expects to be in a specifically-named directory. -mkdir -p $TMP_DIR/mobilenet -TMP_DIR=$TMP_DIR/mobilenet - -# Build Wasmtime with wasi-nn enabled; we attempt this first to avoid extra work -# if the build fails. -cargo build -p wasmtime-cli --features wasi-nn - -# Download all necessary test fixtures to the temporary directory. -wget --no-clobber $FIXTURE/mobilenet.bin --output-document=$TMP_DIR/model.bin -wget --no-clobber $FIXTURE/mobilenet.xml --output-document=$TMP_DIR/model.xml -wget --no-clobber $FIXTURE/tensor-1x224x224x3-f32.bgr --output-document=$TMP_DIR/tensor.bgr - -# Now build an example that uses the wasi-nn API. Run the example in Wasmtime -# (note that the example uses `fixture` as the expected location of the -# model/tensor files). -pushd $WASMTIME_DIR/crates/wasi-nn/examples/classification-example -cargo build --release --target=wasm32-wasi -cp target/wasm32-wasi/release/wasi-nn-example.wasm $TMP_DIR -popd -cargo run -- run --dir $TMP_DIR::fixture -S nn $TMP_DIR/wasi-nn-example.wasm - -# Build and run another example, this time using Wasmtime's graph flag to -# preload the model. -pushd $WASMTIME_DIR/crates/wasi-nn/examples/classification-example-named -cargo build --release --target=wasm32-wasi -cp target/wasm32-wasi/release/wasi-nn-example-named.wasm $TMP_DIR -popd -cargo run -- run --dir $TMP_DIR::fixture -S nn,nn-graph=openvino::$TMP_DIR \ - $TMP_DIR/wasi-nn-example-named.wasm - -# Clean up the temporary directory only if it was not specified (users may want -# to keep the directory around). -if [[ $REMOVE_TMP_DIR -eq 1 ]]; then - rm -rf $TMP_DIR -fi diff --git a/cranelift/Cargo.toml b/cranelift/Cargo.toml index 24577ddc1c2e..31dd54578b1b 100644 --- a/cranelift/Cargo.toml +++ b/cranelift/Cargo.toml @@ -9,6 +9,9 @@ repository = "https://github.com/bytecodealliance/wasmtime" publish = false edition.workspace = true +[lints] +workspace = true + [[bin]] name = "clif-util" path = "src/clif-util.rs" @@ -20,7 +23,7 @@ harness = false [dependencies] cfg-if = { workspace = true } -cranelift-codegen = { workspace = true, features = ["disas", "trace-log"] } +cranelift-codegen = { workspace = true, features = ["disas", "trace-log", "timing"] } cranelift-entity = { workspace = true } cranelift-interpreter = { workspace = true } cranelift-reader = { workspace = true } diff --git a/cranelift/bforest/Cargo.toml b/cranelift/bforest/Cargo.toml index 00921a551471..1fa5bcac9ff2 100644 --- a/cranelift/bforest/Cargo.toml +++ b/cranelift/bforest/Cargo.toml @@ -1,7 +1,7 @@ [package] authors = ["The Cranelift Project Developers"] name = "cranelift-bforest" -version = "0.103.0" +version = "0.106.0" description = "A forest of B+-trees" license = "Apache-2.0 WITH LLVM-exception" documentation = "https://docs.rs/cranelift-bforest" @@ -11,5 +11,8 @@ readme = "README.md" keywords = ["btree", "forest", "set", "map"] edition.workspace = true +[lints] +workspace = true + [dependencies] cranelift-entity = { workspace = true } diff --git a/cranelift/bforest/src/lib.rs b/cranelift/bforest/src/lib.rs index b0145d63d6a8..90eda03d85f6 100644 --- a/cranelift/bforest/src/lib.rs +++ b/cranelift/bforest/src/lib.rs @@ -13,8 +13,7 @@ //! - Empty trees have a very small 32-bit footprint. //! - All the trees in a forest can be cleared in constant time. -#![deny(missing_docs, trivial_numeric_casts, unused_extern_crates)] -#![warn(unused_import_braces)] +#![deny(missing_docs)] #![no_std] #[cfg(test)] diff --git a/cranelift/codegen/Cargo.toml b/cranelift/codegen/Cargo.toml index 4b1e0588b358..5315bdc52b93 100644 --- a/cranelift/codegen/Cargo.toml +++ b/cranelift/codegen/Cargo.toml @@ -1,7 +1,7 @@ [package] authors = ["The Cranelift Project Developers"] name = "cranelift-codegen" -version = "0.103.0" +version = "0.106.0" description = "Low-level code generator library" license = "Apache-2.0 WITH LLVM-exception" documentation = "https://docs.rs/cranelift-codegen" @@ -12,11 +12,14 @@ keywords = ["compile", "compiler", "jit"] build = "build.rs" edition.workspace = true +[lints] +workspace = true + [dependencies] anyhow = { workspace = true, optional = true } bumpalo = "3" capstone = { workspace = true, optional = true } -cranelift-codegen-shared = { path = "./shared", version = "0.103.0" } +cranelift-codegen-shared = { path = "./shared", version = "0.106.0" } cranelift-entity = { workspace = true } cranelift-bforest = { workspace = true } cranelift-control = { workspace = true } @@ -41,11 +44,11 @@ criterion = { version = "0.5.0", features = ["html_reports"] } similar = "2.1.0" [build-dependencies] -cranelift-codegen-meta = { path = "meta", version = "0.103.0" } -cranelift-isle = { path = "../isle/isle", version = "=0.103.0" } +cranelift-codegen-meta = { path = "meta", version = "0.106.0" } +cranelift-isle = { path = "../isle/isle", version = "=0.106.0" } [features] -default = ["std", "unwind", "host-arch"] +default = ["std", "unwind", "host-arch", "timing"] # The "std" feature enables use of libstd. The "core" feature enables use # of some minimal std-like replacement libraries. At least one of these two @@ -113,6 +116,11 @@ isle-errors = ["cranelift-isle/fancy-errors"] # inspection, rather than inside of target/. isle-in-source-tree = [] +# Enable tracking how long passes take in Cranelift. +# +# Enabled by default. +timing = [] + [[bench]] name = "x64-evex-encoding" harness = false diff --git a/cranelift/codegen/build.rs b/cranelift/codegen/build.rs index d6bf5466b765..75c77b19216a 100644 --- a/cranelift/codegen/build.rs +++ b/cranelift/codegen/build.rs @@ -28,16 +28,19 @@ fn main() { let out_dir = env::var("OUT_DIR").expect("The OUT_DIR environment variable must be set"); let target_triple = env::var("TARGET").expect("The TARGET environment variable must be set"); + let all_arch = env::var("CARGO_FEATURE_ALL_ARCH").is_ok(); + let mut isas = meta::isa::Isa::all() .iter() .cloned() .filter(|isa| { let env_key = format!("CARGO_FEATURE_{}", isa.to_string().to_uppercase()); - dbg!(env::var(dbg!(env_key)).is_ok()) + all_arch || env::var(env_key).is_ok() }) .collect::>(); - let host_isa = env::var("CARGO_FEATURE_HOST_ARCH").is_ok(); + // Don't require host isa if under 'all-arch' feature. + let host_isa = env::var("CARGO_FEATURE_HOST_ARCH").is_ok() && !all_arch; if isas.is_empty() || host_isa { // Try to match native target. @@ -230,6 +233,7 @@ fn get_isle_compilations( src_opts.join("icmp.isle"), src_opts.join("remat.isle"), src_opts.join("selects.isle"), + src_opts.join("spaceship.isle"), src_opts.join("shifts.isle"), src_opts.join("vector.isle"), ], diff --git a/cranelift/codegen/meta/Cargo.toml b/cranelift/codegen/meta/Cargo.toml index ecc3d5015ca8..d0f0ee6bb50d 100644 --- a/cranelift/codegen/meta/Cargo.toml +++ b/cranelift/codegen/meta/Cargo.toml @@ -1,15 +1,18 @@ [package] name = "cranelift-codegen-meta" authors = ["The Cranelift Project Developers"] -version = "0.103.0" +version = "0.106.0" description = "Metaprogram for cranelift-codegen code generator library" license = "Apache-2.0 WITH LLVM-exception" repository = "https://github.com/bytecodealliance/wasmtime" readme = "README.md" edition.workspace = true +[lints] +workspace = true + [package.metadata.docs.rs] rustdoc-args = [ "--document-private-items" ] [dependencies] -cranelift-codegen-shared = { path = "../shared", version = "0.103.0" } +cranelift-codegen-shared = { path = "../shared", version = "0.106.0" } diff --git a/cranelift/codegen/shared/Cargo.toml b/cranelift/codegen/shared/Cargo.toml index 9187f83829f5..59e5e22ec0d2 100644 --- a/cranelift/codegen/shared/Cargo.toml +++ b/cranelift/codegen/shared/Cargo.toml @@ -1,7 +1,7 @@ [package] authors = ["The Cranelift Project Developers"] name = "cranelift-codegen-shared" -version = "0.103.0" +version = "0.106.0" description = "For code shared between cranelift-codegen-meta and cranelift-codegen" license = "Apache-2.0 WITH LLVM-exception" repository = "https://github.com/bytecodealliance/wasmtime" diff --git a/cranelift/codegen/shared/src/lib.rs b/cranelift/codegen/shared/src/lib.rs index 76504f77f136..2a03a8323439 100644 --- a/cranelift/codegen/shared/src/lib.rs +++ b/cranelift/codegen/shared/src/lib.rs @@ -1,9 +1,7 @@ //! This library contains code that is common to both the `cranelift-codegen` and //! `cranelift-codegen-meta` libraries. -#![deny(missing_docs, trivial_numeric_casts, unused_extern_crates)] -#![warn(unused_import_braces)] -#![cfg_attr(feature = "std", deny(unstable_features))] +#![deny(missing_docs)] pub mod constant_hash; pub mod constants; diff --git a/cranelift/codegen/src/binemit/mod.rs b/cranelift/codegen/src/binemit/mod.rs index 9eed2905c4cd..14509736e8b7 100644 --- a/cranelift/codegen/src/binemit/mod.rs +++ b/cranelift/codegen/src/binemit/mod.rs @@ -81,7 +81,7 @@ pub enum Reloc { Aarch64TlsDescCall, /// AArch64 GOT Page - /// Set the immediate value of an ADRP to bits 32:12 of X; check that –232 <= X < 232 + /// Set the immediate value of an ADRP to bits 32:12 of X; check that –2^32 <= X < 2^32 /// This is equivalent to `R_AARCH64_ADR_GOT_PAGE` (311) in the [aaelf64](https://github.com/ARM-software/abi-aa/blob/2bcab1e3b22d55170c563c3c7940134089176746/aaelf64/aaelf64.rst#static-aarch64-relocations) Aarch64AdrGotPage21, diff --git a/cranelift/codegen/src/context.rs b/cranelift/codegen/src/context.rs index ca3d5fb73628..7ea5a1513782 100644 --- a/cranelift/codegen/src/context.rs +++ b/cranelift/codegen/src/context.rs @@ -367,6 +367,7 @@ impl Context { ); pass.run(); log::debug!("egraph stats: {:?}", pass.stats); + trace!("pinned_union_count: {}", pass.eclasses.pinned_union_count); trace!("After egraph optimization:\n{}", self.func.display()); self.verify_if(fisa) diff --git a/cranelift/codegen/src/egraph.rs b/cranelift/codegen/src/egraph.rs index 0f699b68d854..32f67028795c 100644 --- a/cranelift/codegen/src/egraph.rs +++ b/cranelift/codegen/src/egraph.rs @@ -51,7 +51,8 @@ pub struct EgraphPass<'a> { /// Alias analysis, used during optimization. alias_analysis: &'a mut AliasAnalysis<'a>, /// "Domtree with children": like `domtree`, but with an explicit - /// list of children, rather than just parent pointers. + /// list of children, complementing the parent pointers stored + /// in `domtree`. domtree_children: DomTreeWithChildren, /// Loop analysis results, used for built-in LICM during /// elaboration. @@ -66,7 +67,7 @@ pub struct EgraphPass<'a> { pub(crate) stats: Stats, /// Union-find that maps all members of a Union tree (eclass) back /// to the *oldest* (lowest-numbered) `Value`. - eclasses: UnionFind, + pub(crate) eclasses: UnionFind, } // The maximum number of rewrites we will take from a single call into ISLE. @@ -108,7 +109,7 @@ impl NewOrExistingInst { NewOrExistingInst::New(data, ty) => (*ty, *data), NewOrExistingInst::Existing(inst) => { let ty = dfg.ctrl_typevar(*inst); - (ty, dfg.insts[*inst].clone()) + (ty, dfg.insts[*inst]) } } } @@ -194,15 +195,17 @@ where }; let opt_value = self.optimize_pure_enode(inst); + + for &argument in self.func.dfg.inst_args(inst) { + self.eclasses.pin_index(argument); + } + let gvn_context = GVNContext { union_find: self.eclasses, value_lists: &self.func.dfg.value_lists, }; - self.gvn_map.insert( - (ty, self.func.dfg.insts[inst].clone()), - opt_value, - &gvn_context, - ); + self.gvn_map + .insert((ty, self.func.dfg.insts[inst]), opt_value, &gvn_context); self.value_to_opt_value[result] = opt_value; opt_value } @@ -433,6 +436,7 @@ impl<'a> EgraphPass<'a> { } } trace!("stats: {:#?}", self.stats); + trace!("pinned_union_count: {}", self.eclasses.pinned_union_count); self.elaborate(); } @@ -615,7 +619,6 @@ impl<'a> EgraphPass<'a> { &self.domtree_children, self.loop_analysis, &mut self.remat_values, - &mut self.eclasses, &mut self.stats, ); elaborator.elaborate(); @@ -700,4 +703,5 @@ pub(crate) struct Stats { pub(crate) elaborate_func: u64, pub(crate) elaborate_func_pre_insts: u64, pub(crate) elaborate_func_post_insts: u64, + pub(crate) elaborate_best_cost_fixpoint_iters: u64, } diff --git a/cranelift/codegen/src/egraph/cost.rs b/cranelift/codegen/src/egraph/cost.rs index 2870b61f515f..28aab40e9740 100644 --- a/cranelift/codegen/src/egraph/cost.rs +++ b/cranelift/codegen/src/egraph/cost.rs @@ -74,7 +74,7 @@ impl Cost { const DEPTH_BITS: u8 = 8; const DEPTH_MASK: u32 = (1 << Self::DEPTH_BITS) - 1; const OP_COST_MASK: u32 = !Self::DEPTH_MASK; - const MAX_OP_COST: u32 = (Self::OP_COST_MASK >> Self::DEPTH_BITS) - 1; + const MAX_OP_COST: u32 = Self::OP_COST_MASK >> Self::DEPTH_BITS; pub(crate) fn infinity() -> Cost { // 2^32 - 1 is, uh, pretty close to infinite... (we use `Cost` @@ -86,14 +86,16 @@ impl Cost { Cost(0) } - /// Construct a new finite cost from the given parts. + /// Construct a new `Cost` from the given parts. /// - /// The opcode cost is clamped to the maximum value representable. - fn new_finite(opcode_cost: u32, depth: u8) -> Cost { - let opcode_cost = std::cmp::min(opcode_cost, Self::MAX_OP_COST); - let cost = Cost((opcode_cost << Self::DEPTH_BITS) | u32::from(depth)); - debug_assert_ne!(cost, Cost::infinity()); - cost + /// If the opcode cost is greater than or equal to the maximum representable + /// opcode cost, then the resulting `Cost` saturates to infinity. + fn new(opcode_cost: u32, depth: u8) -> Cost { + if opcode_cost >= Self::MAX_OP_COST { + Self::infinity() + } else { + Cost(opcode_cost << Self::DEPTH_BITS | u32::from(depth)) + } } fn depth(&self) -> u8 { @@ -111,7 +113,7 @@ impl Cost { /// that satisfies `inst_predicates::is_pure_for_egraph()`. pub(crate) fn of_pure_op(op: Opcode, operand_costs: impl IntoIterator) -> Self { let c = pure_op_cost(op) + operand_costs.into_iter().sum(); - Cost::new_finite(c.op_cost(), c.depth().saturating_add(1)) + Cost::new(c.op_cost(), c.depth().saturating_add(1)) } } @@ -131,12 +133,9 @@ impl std::ops::Add for Cost { type Output = Cost; fn add(self, other: Cost) -> Cost { - let op_cost = std::cmp::min( - self.op_cost().saturating_add(other.op_cost()), - Self::MAX_OP_COST, - ); + let op_cost = self.op_cost().saturating_add(other.op_cost()); let depth = std::cmp::max(self.depth(), other.depth()); - Cost::new_finite(op_cost, depth) + Cost::new(op_cost, depth) } } @@ -147,11 +146,11 @@ impl std::ops::Add for Cost { fn pure_op_cost(op: Opcode) -> Cost { match op { // Constants. - Opcode::Iconst | Opcode::F32const | Opcode::F64const => Cost::new_finite(1, 0), + Opcode::Iconst | Opcode::F32const | Opcode::F64const => Cost::new(1, 0), // Extends/reduces. Opcode::Uextend | Opcode::Sextend | Opcode::Ireduce | Opcode::Iconcat | Opcode::Isplit => { - Cost::new_finite(2, 0) + Cost::new(2, 0) } // "Simple" arithmetic. @@ -163,9 +162,52 @@ fn pure_op_cost(op: Opcode) -> Cost { | Opcode::Bnot | Opcode::Ishl | Opcode::Ushr - | Opcode::Sshr => Cost::new_finite(3, 0), + | Opcode::Sshr => Cost::new(3, 0), // Everything else (pure.) - _ => Cost::new_finite(4, 0), + _ => Cost::new(4, 0), + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn add_cost() { + let a = Cost::new(5, 2); + let b = Cost::new(37, 3); + assert_eq!(a + b, Cost::new(42, 3)); + assert_eq!(b + a, Cost::new(42, 3)); + } + + #[test] + fn add_infinity() { + let a = Cost::new(5, 2); + let b = Cost::infinity(); + assert_eq!(a + b, Cost::infinity()); + assert_eq!(b + a, Cost::infinity()); + } + + #[test] + fn op_cost_saturates_to_infinity() { + let a = Cost::new(Cost::MAX_OP_COST - 10, 2); + let b = Cost::new(11, 2); + assert_eq!(a + b, Cost::infinity()); + assert_eq!(b + a, Cost::infinity()); + } + + #[test] + fn depth_saturates_to_max_depth() { + let a = Cost::new(10, u8::MAX); + let b = Cost::new(10, 1); + assert_eq!( + Cost::of_pure_op(Opcode::Iconst, [a, b]), + Cost::new(21, u8::MAX) + ); + assert_eq!( + Cost::of_pure_op(Opcode::Iconst, [b, a]), + Cost::new(21, u8::MAX) + ); } } diff --git a/cranelift/codegen/src/egraph/domtree.rs b/cranelift/codegen/src/egraph/domtree.rs index f0af89e2a244..aa76f6781c0f 100644 --- a/cranelift/codegen/src/egraph/domtree.rs +++ b/cranelift/codegen/src/egraph/domtree.rs @@ -5,6 +5,8 @@ use crate::ir::{Block, Function}; use cranelift_entity::{packed_option::PackedOption, SecondaryMap}; #[derive(Clone, Debug)] +/// Like a [`DominatorTree`], but with an explicit list of children, +/// rather than parent pointers. pub(crate) struct DomTreeWithChildren { nodes: SecondaryMap, root: Block, @@ -12,7 +14,10 @@ pub(crate) struct DomTreeWithChildren { #[derive(Clone, Copy, Debug, Default)] struct DomTreeNode { + /// Points to the first child of the node, and implicitly to an entire + /// linked list of the children. children: PackedOption, + /// Points to the next sibling, if any. next: PackedOption, } @@ -22,15 +27,15 @@ impl DomTreeWithChildren { SecondaryMap::with_capacity(func.dfg.num_blocks()); for block in func.layout.blocks() { - let idom_inst = match domtree.idom(block) { - Some(idom_inst) => idom_inst, - None => continue, + let Some(idom_inst) = domtree.idom(block) else { + continue; }; let idom = func .layout .inst_block(idom_inst) .expect("Dominating instruction should be part of a block"); + // Insert at the front of nodes[idom].children nodes[block].next = nodes[idom].children; nodes[idom].children = block.into(); } diff --git a/cranelift/codegen/src/egraph/elaborate.rs b/cranelift/codegen/src/egraph/elaborate.rs index 5637215ee66d..f2d02d0f674d 100644 --- a/cranelift/codegen/src/egraph/elaborate.rs +++ b/cranelift/codegen/src/egraph/elaborate.rs @@ -7,11 +7,11 @@ use super::Stats; use crate::dominator_tree::DominatorTree; use crate::fx::{FxHashMap, FxHashSet}; use crate::hash_map::Entry as HashEntry; +use crate::inst_predicates::is_pure_for_egraph; use crate::ir::{Block, Function, Inst, Value, ValueDef}; use crate::loop_analysis::{Loop, LoopAnalysis}; use crate::scoped_hash_map::ScopedHashMap; use crate::trace; -use crate::unionfind::UnionFind; use alloc::vec::Vec; use cranelift_entity::{packed_option::ReservedValue, SecondaryMap}; use smallvec::{smallvec, SmallVec}; @@ -21,7 +21,6 @@ pub(crate) struct Elaborator<'a> { domtree: &'a DominatorTree, domtree_children: &'a DomTreeWithChildren, loop_analysis: &'a LoopAnalysis, - eclasses: &'a mut UnionFind, /// Map from Value that is produced by a pure Inst (and was thus /// not in the side-effecting skeleton) to the value produced by /// an elaborated inst (placed in the layout) to whose results we @@ -39,6 +38,11 @@ pub(crate) struct Elaborator<'a> { /// is already placed in the Layout. If so, we duplicate, and /// insert non-identity mappings from the original inst's results /// to the cloned inst's results. + /// + /// Note that as values may refer to unions that represent a subset + /// of a larger eclass, it's not valid to walk towards the root of a + /// union tree: doing so would potentially equate values that fall + /// on different branches of the dominator tree. value_to_elaborated_value: ScopedHashMap, /// Map from Value to the best (lowest-cost) Value in its eclass /// (tree of union value-nodes). @@ -137,7 +141,6 @@ impl<'a> Elaborator<'a> { domtree_children: &'a DomTreeWithChildren, loop_analysis: &'a LoopAnalysis, remat_values: &'a FxHashSet, - eclasses: &'a mut UnionFind, stats: &'a mut Stats, ) -> Self { let num_values = func.dfg.num_values(); @@ -149,7 +152,6 @@ impl<'a> Elaborator<'a> { domtree, domtree_children, loop_analysis, - eclasses, value_to_elaborated_value: ScopedHashMap::with_capacity(num_values), value_to_best_value, loop_stack: smallvec![], @@ -216,46 +218,112 @@ impl<'a> Elaborator<'a> { fn compute_best_values(&mut self) { let best = &mut self.value_to_best_value; - for (value, def) in self.func.dfg.values_and_defs() { - trace!("computing best for value {:?} def {:?}", value, def); - match def { - ValueDef::Union(x, y) => { - // Pick the best of the two options based on - // min-cost. This works because each element of `best` - // is a `(cost, value)` tuple; `cost` comes first so - // the natural comparison works based on cost, and - // breaks ties based on value number. - trace!(" -> best of {:?} and {:?}", best[x], best[y]); - best[value] = std::cmp::min(best[x], best[y]); - trace!(" -> {:?}", best[value]); - } - ValueDef::Param(_, _) => { - best[value] = BestEntry(Cost::zero(), value); - } - // If the Inst is inserted into the layout (which is, - // at this point, only the side-effecting skeleton), - // then it must be computed and thus we give it zero - // cost. - ValueDef::Result(inst, _) => { - if let Some(_) = self.func.layout.inst_block(inst) { - best[value] = BestEntry(Cost::zero(), value); - } else { - trace!(" -> value {}: result, computing cost", value); - let inst_data = &self.func.dfg.insts[inst]; - // N.B.: at this point we know that the opcode is - // pure, so `pure_op_cost`'s precondition is - // satisfied. - let cost = Cost::of_pure_op( - inst_data.opcode(), - self.func.dfg.inst_values(inst).map(|value| best[value].0), + + // Do a fixpoint loop to compute the best value for each eclass. + // + // The maximum number of iterations is the length of the longest chain + // of `vNN -> vMM` edges in the dataflow graph where `NN < MM`, so this + // is *technically* quadratic, but `cranelift-frontend` won't construct + // any such edges. NaN canonicalization will introduce some of these + // edges, but they are chains of only two or three edges. So in + // practice, we *never* do more than a handful of iterations here unless + // (a) we parsed the CLIF from text and the text was funkily numbered, + // which we don't really care about, or (b) the CLIF producer did + // something weird, in which case it is their responsibility to stop + // doing that. + trace!("Entering fixpoint loop to compute the best values for each eclass"); + let mut keep_going = true; + while keep_going { + keep_going = false; + trace!( + "fixpoint iteration {}", + self.stats.elaborate_best_cost_fixpoint_iters + ); + self.stats.elaborate_best_cost_fixpoint_iters += 1; + + for (value, def) in self.func.dfg.values_and_defs() { + trace!("computing best for value {:?} def {:?}", value, def); + let orig_best_value = best[value]; + + match def { + ValueDef::Union(x, y) => { + // Pick the best of the two options based on + // min-cost. This works because each element of `best` + // is a `(cost, value)` tuple; `cost` comes first so + // the natural comparison works based on cost, and + // breaks ties based on value number. + best[value] = std::cmp::min(best[x], best[y]); + trace!( + " -> best of union({:?}, {:?}) = {:?}", + best[x], + best[y], + best[value] ); - best[value] = BestEntry(cost, value); } - } - }; - debug_assert_ne!(best[value].0, Cost::infinity()); - debug_assert_ne!(best[value].1, Value::reserved_value()); - trace!("best for eclass {:?}: {:?}", value, best[value]); + ValueDef::Param(_, _) => { + best[value] = BestEntry(Cost::zero(), value); + } + // If the Inst is inserted into the layout (which is, + // at this point, only the side-effecting skeleton), + // then it must be computed and thus we give it zero + // cost. + ValueDef::Result(inst, _) => { + if let Some(_) = self.func.layout.inst_block(inst) { + best[value] = BestEntry(Cost::zero(), value); + } else { + let inst_data = &self.func.dfg.insts[inst]; + // N.B.: at this point we know that the opcode is + // pure, so `pure_op_cost`'s precondition is + // satisfied. + let cost = Cost::of_pure_op( + inst_data.opcode(), + self.func.dfg.inst_values(inst).map(|value| best[value].0), + ); + best[value] = BestEntry(cost, value); + trace!(" -> cost of value {} = {:?}", value, cost); + } + } + }; + + // Keep on iterating the fixpoint loop while we are finding new + // best values. + keep_going |= orig_best_value != best[value]; + } + } + + if cfg!(any(feature = "trace-log", debug_assertions)) { + trace!("finished fixpoint loop to compute best value for each eclass"); + for value in self.func.dfg.values() { + trace!("-> best for eclass {:?}: {:?}", value, best[value]); + debug_assert_ne!(best[value].1, Value::reserved_value()); + // You might additionally be expecting an assert that the best + // cost is not infinity, however infinite cost *can* happen in + // practice. First, note that our cost function doesn't know + // about any shared structure in the dataflow graph, it only + // sums operand costs. (And trying to avoid that by deduping a + // single operation's operands is a losing game because you can + // always just add one indirection and go from `add(x, x)` to + // `add(foo(x), bar(x))` to hide the shared structure.) Given + // that blindness to sharing, we can make cost grow + // exponentially with a linear sequence of operations: + // + // v0 = iconst.i32 1 ;; cost = 1 + // v1 = iadd v0, v0 ;; cost = 3 + 1 + 1 + // v2 = iadd v1, v1 ;; cost = 3 + 5 + 5 + // v3 = iadd v2, v2 ;; cost = 3 + 13 + 13 + // v4 = iadd v3, v3 ;; cost = 3 + 29 + 29 + // v5 = iadd v4, v4 ;; cost = 3 + 61 + 61 + // v6 = iadd v5, v5 ;; cost = 3 + 125 + 125 + // ;; etc... + // + // Such a chain can cause cost to saturate to infinity. How do + // we choose which e-node is best when there are multiple that + // have saturated to infinity? It doesn't matter. As long as + // invariant (2) for optimization rules is upheld by our rule + // set (see `cranelift/codegen/src/opts/README.md`) it is safe + // to choose *any* e-node in the e-class. At worst we will + // produce suboptimal code, but never an incorrectness. + } } } @@ -325,14 +393,6 @@ impl<'a> Elaborator<'a> { let value = self.func.dfg.resolve_aliases(value); self.stats.elaborate_visit_node += 1; - let canonical_value = self.eclasses.find_and_update(value); - debug_assert_ne!(canonical_value, Value::reserved_value()); - trace!( - "elaborate: value {} canonical {} before {}", - value, - canonical_value, - before - ); // Get the best option; we use `value` (latest // value) here so we have a full view of the @@ -342,7 +402,7 @@ impl<'a> Elaborator<'a> { trace!("elaborate: value {} -> best {}", value, best_value); debug_assert_ne!(best_value, Value::reserved_value()); - if let Some(elab_val) = self.value_to_elaborated_value.get(&canonical_value) { + if let Some(elab_val) = self.value_to_elaborated_value.get(&best_value) { // Value is available; use it. trace!("elaborate: value {} -> {:?}", value, elab_val); self.stats.elaborate_memoize_hit += 1; @@ -568,16 +628,14 @@ impl<'a> Elaborator<'a> { value: new_result, in_block: insert_block, }; - let canonical_result = self.eclasses.find_and_update(result); + let best_result = self.value_to_best_value[result]; self.value_to_elaborated_value.insert_if_absent_with_depth( - canonical_result, + best_result.1, elab_value, scope_depth, ); - self.eclasses.add(new_result); - self.eclasses.union(result, new_result); - self.value_to_best_value[new_result] = self.value_to_best_value[result]; + self.value_to_best_value[new_result] = best_result; trace!( " -> cloned inst has new result {} for orig {}", @@ -596,9 +654,9 @@ impl<'a> Elaborator<'a> { value: result, in_block: insert_block, }; - let canonical_result = self.eclasses.find_and_update(result); + let best_result = self.value_to_best_value[result]; self.value_to_elaborated_value.insert_if_absent_with_depth( - canonical_result, + best_result.1, elab_value, scope_depth, ); @@ -606,7 +664,13 @@ impl<'a> Elaborator<'a> { } inst }; + // Place the inst just before `before`. + assert!( + is_pure_for_egraph(self.func, inst), + "something has gone very wrong if we are elaborating effectful \ + instructions, they should have remained in the skeleton" + ); self.func.layout.insert_inst(inst, before); // Update the inst's arguments. @@ -684,9 +748,9 @@ impl<'a> Elaborator<'a> { // map now. for &result in self.func.dfg.inst_results(inst) { trace!(" -> result {}", result); - let canonical_result = self.eclasses.find_and_update(result); + let best_result = self.value_to_best_value[result]; self.value_to_elaborated_value.insert_if_absent( - canonical_result, + best_result.1, ElaboratedValue { in_block: block, value: result, diff --git a/cranelift/codegen/src/ir/memflags.rs b/cranelift/codegen/src/ir/memflags.rs index 546e11fa3703..72d09dae394b 100644 --- a/cranelift/codegen/src/ir/memflags.rs +++ b/cranelift/codegen/src/ir/memflags.rs @@ -67,27 +67,25 @@ pub struct MemFlags { impl MemFlags { /// Create a new empty set of flags. - pub fn new() -> Self { + pub const fn new() -> Self { Self { bits: 0 } } /// Create a set of flags representing an access from a "trusted" address, meaning it's /// known to be aligned and non-trapping. - pub fn trusted() -> Self { - let mut result = Self::new(); - result.set_notrap(); - result.set_aligned(); - result + pub const fn trusted() -> Self { + Self::new().with_notrap().with_aligned() } /// Read a flag bit. - fn read(self, bit: FlagBit) -> bool { + const fn read(self, bit: FlagBit) -> bool { self.bits & (1 << bit as usize) != 0 } - /// Set a flag bit. - fn set(&mut self, bit: FlagBit) { - self.bits |= 1 << bit as usize + /// Return a new `MemFlags` with this flag bit set. + const fn with(mut self, bit: FlagBit) -> Self { + self.bits |= 1 << bit as usize; + self } /// Set a flag bit by name. @@ -116,7 +114,7 @@ impl MemFlags { /// endianness otherwise. The native endianness has to be provided by the /// caller since it is not explicitly encoded in CLIF IR -- this allows a /// front end to create IR without having to know the target endianness. - pub fn endianness(self, native_endianness: Endianness) -> Endianness { + pub const fn endianness(self, native_endianness: Endianness) -> Endianness { if self.read(FlagBit::LittleEndian) { Endianness::Little } else if self.read(FlagBit::BigEndian) { @@ -128,17 +126,17 @@ impl MemFlags { /// Set endianness of the memory access. pub fn set_endianness(&mut self, endianness: Endianness) { - match endianness { - Endianness::Little => self.set(FlagBit::LittleEndian), - Endianness::Big => self.set(FlagBit::BigEndian), - }; - assert!(!(self.read(FlagBit::LittleEndian) && self.read(FlagBit::BigEndian))); + *self = self.with_endianness(endianness); } /// Set endianness of the memory access, returning new flags. - pub fn with_endianness(mut self, endianness: Endianness) -> Self { - self.set_endianness(endianness); - self + pub const fn with_endianness(self, endianness: Endianness) -> Self { + let res = match endianness { + Endianness::Little => self.with(FlagBit::LittleEndian), + Endianness::Big => self.with(FlagBit::BigEndian), + }; + assert!(!(res.read(FlagBit::LittleEndian) && res.read(FlagBit::BigEndian))); + res } /// Test if the `notrap` flag is set. @@ -150,19 +148,18 @@ impl MemFlags { /// The `notrap` flag tells Cranelift that the memory is *accessible*, which means that /// accesses will not trap. This makes it possible to delete an unused load or a dead store /// instruction. - pub fn notrap(self) -> bool { + pub const fn notrap(self) -> bool { self.read(FlagBit::Notrap) } /// Set the `notrap` flag. pub fn set_notrap(&mut self) { - self.set(FlagBit::Notrap) + *self = self.with_notrap(); } /// Set the `notrap` flag, returning new flags. - pub fn with_notrap(mut self) -> Self { - self.set_notrap(); - self + pub const fn with_notrap(self) -> Self { + self.with(FlagBit::Notrap) } /// Test if the `aligned` flag is set. @@ -170,19 +167,18 @@ impl MemFlags { /// By default, Cranelift memory instructions work with any unaligned effective address. If the /// `aligned` flag is set, the instruction is permitted to trap or return a wrong result if the /// effective address is misaligned. - pub fn aligned(self) -> bool { + pub const fn aligned(self) -> bool { self.read(FlagBit::Aligned) } /// Set the `aligned` flag. pub fn set_aligned(&mut self) { - self.set(FlagBit::Aligned) + *self = self.with_aligned(); } /// Set the `aligned` flag, returning new flags. - pub fn with_aligned(mut self) -> Self { - self.set_aligned(); - self + pub const fn with_aligned(self) -> Self { + self.with(FlagBit::Aligned) } /// Test if the `readonly` flag is set. @@ -190,19 +186,18 @@ impl MemFlags { /// Loads with this flag have no memory dependencies. /// This results in undefined behavior if the dereferenced memory is mutated at any time /// between when the function is called and when it is exited. - pub fn readonly(self) -> bool { + pub const fn readonly(self) -> bool { self.read(FlagBit::Readonly) } /// Set the `readonly` flag. pub fn set_readonly(&mut self) { - self.set(FlagBit::Readonly) + *self = self.with_readonly(); } /// Set the `readonly` flag, returning new flags. - pub fn with_readonly(mut self) -> Self { - self.set_readonly(); - self + pub const fn with_readonly(self) -> Self { + self.with(FlagBit::Readonly) } /// Test if the `heap` bit is set. @@ -213,21 +208,20 @@ impl MemFlags { /// means that behavior is undefined if the same memory is also /// accessed by another load/store with one of the other /// alias-analysis bits (`table`, `vmctx`) set, or `heap` not set. - pub fn heap(self) -> bool { + pub const fn heap(self) -> bool { self.read(FlagBit::Heap) } /// Set the `heap` bit. See the notes about mutual exclusion with /// other bits in `heap()`. pub fn set_heap(&mut self) { - assert!(!self.table() && !self.vmctx()); - self.set(FlagBit::Heap); + *self = self.with_heap(); } /// Set the `heap` bit, returning new flags. - pub fn with_heap(mut self) -> Self { - self.set_heap(); - self + pub const fn with_heap(self) -> Self { + assert!(!self.table() && !self.vmctx()); + self.with(FlagBit::Heap) } /// Test if the `table` bit is set. @@ -238,21 +232,20 @@ impl MemFlags { /// means that behavior is undefined if the same memory is also /// accessed by another load/store with one of the other /// alias-analysis bits (`heap`, `vmctx`) set, or `table` not set. - pub fn table(self) -> bool { + pub const fn table(self) -> bool { self.read(FlagBit::Table) } /// Set the `table` bit. See the notes about mutual exclusion with /// other bits in `table()`. pub fn set_table(&mut self) { - assert!(!self.heap() && !self.vmctx()); - self.set(FlagBit::Table); + *self = self.with_table(); } /// Set the `table` bit, returning new flags. - pub fn with_table(mut self) -> Self { - self.set_table(); - self + pub const fn with_table(self) -> Self { + assert!(!self.heap() && !self.vmctx()); + self.with(FlagBit::Table) } /// Test if the `vmctx` bit is set. @@ -263,21 +256,20 @@ impl MemFlags { /// means that behavior is undefined if the same memory is also /// accessed by another load/store with one of the other /// alias-analysis bits (`heap`, `table`) set, or `vmctx` not set. - pub fn vmctx(self) -> bool { + pub const fn vmctx(self) -> bool { self.read(FlagBit::Vmctx) } /// Set the `vmctx` bit. See the notes about mutual exclusion with /// other bits in `vmctx()`. pub fn set_vmctx(&mut self) { - assert!(!self.heap() && !self.table()); - self.set(FlagBit::Vmctx); + *self = self.with_vmctx(); } /// Set the `vmctx` bit, returning new flags. - pub fn with_vmctx(mut self) -> Self { - self.set_vmctx(); - self + pub const fn with_vmctx(self) -> Self { + assert!(!self.heap() && !self.table()); + self.with(FlagBit::Vmctx) } /// Test if the `checked` bit is set. @@ -291,19 +283,18 @@ impl MemFlags { /// `checked`-marked memory accesses are guaranteed (up to the /// checker's correctness) to access valid memory. This can be /// used to ensure memory safety and sandboxing. - pub fn checked(self) -> bool { + pub const fn checked(self) -> bool { self.read(FlagBit::Checked) } /// Set the `checked` bit. pub fn set_checked(&mut self) { - self.set(FlagBit::Checked); + *self = self.with_checked(); } /// Set the `checked` bit, returning new flags. - pub fn with_checked(mut self) -> Self { - self.set_checked(); - self + pub const fn with_checked(self) -> Self { + self.with(FlagBit::Checked) } } diff --git a/cranelift/codegen/src/isa/aarch64/inst.isle b/cranelift/codegen/src/isa/aarch64/inst.isle index 2d9309dd5734..15112a585763 100644 --- a/cranelift/codegen/src/isa/aarch64/inst.isle +++ b/cranelift/codegen/src/isa/aarch64/inst.isle @@ -1709,6 +1709,9 @@ (decl pure partial imm_logic_from_u64 (Type u64) ImmLogic) (extern constructor imm_logic_from_u64 imm_logic_from_u64) +(decl pure partial imm_size_from_type (Type) u16) +(extern constructor imm_size_from_type imm_size_from_type) + (decl pure partial imm_logic_from_imm64 (Type Imm64) ImmLogic) (extern constructor imm_logic_from_imm64 imm_logic_from_imm64) @@ -2938,9 +2941,10 @@ ;; we only match when we are zero-extending the value. (rule 1 (imm (integral_ty ty) (ImmExtend.Zero) k) (if-let n (imm_logic_from_u64 ty k)) + (if-let m (imm_size_from_type ty)) (add_range_fact (orr_imm ty (zero_reg) n) - 64 k k)) + m k k)) (decl load_constant64_full (Type ImmExtend u64) Reg) (extern constructor load_constant64_full load_constant64_full) diff --git a/cranelift/codegen/src/isa/aarch64/lower/isle.rs b/cranelift/codegen/src/isa/aarch64/lower/isle.rs index a70e895fbd28..788213824f78 100644 --- a/cranelift/codegen/src/isa/aarch64/lower/isle.rs +++ b/cranelift/codegen/src/isa/aarch64/lower/isle.rs @@ -174,6 +174,14 @@ impl Context for IsleContext<'_, '_, MInst, AArch64Backend> { ImmLogic::maybe_from_u64(n, ty) } + fn imm_size_from_type(&mut self, ty: Type) -> Option { + match ty { + I32 => Some(32), + I64 => Some(64), + _ => None, + } + } + fn imm_logic_from_imm64(&mut self, ty: Type, n: Imm64) -> Option { let ty = if ty.bits() < 32 { I32 } else { ty }; self.imm_logic_from_u64(ty, n.bits() as u64) @@ -299,8 +307,8 @@ impl Context for IsleContext<'_, '_, MInst, AArch64Backend> { self.lower_ctx.add_range_fact( rd.to_reg(), 64, - u64::from(lower_halfword), - u64::from(lower_halfword), + u64::from(value), + u64::from(value), ); } } else { @@ -395,7 +403,7 @@ impl Context for IsleContext<'_, '_, MInst, AArch64Backend> { size, }); if pcc { - running_value = !(imm16 << shift); + running_value = !(u64::from(imm.bits) << shift); self.lower_ctx.add_range_fact( rd.to_reg(), 64, diff --git a/cranelift/codegen/src/isa/riscv64/inst.isle b/cranelift/codegen/src/isa/riscv64/inst.isle index 18ddcfc540d5..cbaeea578693 100644 --- a/cranelift/codegen/src/isa/riscv64/inst.isle +++ b/cranelift/codegen/src/isa/riscv64/inst.isle @@ -1934,6 +1934,12 @@ (decl imm5_from_value (Imm5) Value) (extractor (imm5_from_value n) (i64_from_iconst (imm5_from_i64 n))) +;; Like imm5_from_value, but first negates the `Value`. +(decl pure partial imm5_from_negated_value (Value) Imm5) +(rule (imm5_from_negated_value (has_type ty (iconst n))) + (if-let (imm5_from_i64 imm) (i64_neg (i64_sextend_imm64 ty n))) + imm) + ;; Constructor that matches a `Value` equivalent to a replicated Imm5 on all lanes. (decl pure partial replicated_imm5 (Value) Imm5) (rule (replicated_imm5 (splat (imm5_from_value n))) n) @@ -1945,6 +1951,19 @@ (if-let n (i8_to_imm5 (u8_as_i8 n8))) n) +;; Like replicated_imm5, but first negates the `Value`. +(decl pure partial negated_replicated_imm5 (Value) Imm5) +(rule (negated_replicated_imm5 (splat n)) + (if-let imm5 (imm5_from_negated_value n)) + imm5) +(rule (negated_replicated_imm5 (vconst (u128_from_constant n128))) + (if-let (u128_replicated_u64 n64) n128) + (if-let (u64_replicated_u32 n32) n64) + (if-let (u32_replicated_u16 n16) n32) + (if-let (u16_replicated_u8 n8) n16) + (if-let n (i8_to_imm5 (i8_neg (u8_as_i8 n8)))) + n) + ;; UImm5 Helpers ;; Constructor that matches a `Value` equivalent to a replicated UImm5 on all lanes. diff --git a/cranelift/codegen/src/isa/riscv64/lower.isle b/cranelift/codegen/src/isa/riscv64/lower.isle index 21dec2bb628d..df9ebf694898 100644 --- a/cranelift/codegen/src/isa/riscv64/lower.isle +++ b/cranelift/codegen/src/isa/riscv64/lower.isle @@ -350,6 +350,10 @@ (rv_vrsub_vx y x (unmasked) ty)) (rule 8 (lower (has_type (ty_vec_fits_in_register ty) (isub x y))) + (if-let imm5_neg (negated_replicated_imm5 y)) + (rv_vadd_vi x imm5_neg (unmasked) ty)) + +(rule 9 (lower (has_type (ty_vec_fits_in_register ty) (isub x y))) (if-let x_imm (replicated_imm5 x)) (rv_vrsub_vi y x_imm (unmasked) ty)) @@ -359,11 +363,11 @@ (rule 6 (lower (has_type (ty_vec_fits_in_register _) (isub x (swiden_low y @ (value_type in_ty))))) (rv_vwsub_wv x y (unmasked) (vstate_mf2 (ty_half_lanes in_ty)))) -(rule 9 (lower (has_type (ty_vec_fits_in_register _) (isub (swiden_low x @ (value_type in_ty)) +(rule 10 (lower (has_type (ty_vec_fits_in_register _) (isub (swiden_low x @ (value_type in_ty)) (swiden_low y)))) (rv_vwsub_vv x y (unmasked) (vstate_mf2 (ty_half_lanes in_ty)))) -(rule 9 (lower (has_type (ty_vec_fits_in_register _) (isub (swiden_low x @ (value_type in_ty)) +(rule 10 (lower (has_type (ty_vec_fits_in_register _) (isub (swiden_low x @ (value_type in_ty)) (splat (sextend y @ (value_type sext_ty)))))) (if-let $true (ty_equal (lane_type in_ty) sext_ty)) (rv_vwsub_vx x y (unmasked) (vstate_mf2 (ty_half_lanes in_ty)))) @@ -374,11 +378,11 @@ (rule 6 (lower (has_type (ty_vec_fits_in_register _) (isub x (swiden_high y @ (value_type in_ty))))) (rv_vwsub_wv x (gen_slidedown_half in_ty y) (unmasked) (vstate_mf2 (ty_half_lanes in_ty)))) -(rule 9 (lower (has_type (ty_vec_fits_in_register _) (isub (swiden_high x @ (value_type in_ty)) +(rule 10 (lower (has_type (ty_vec_fits_in_register _) (isub (swiden_high x @ (value_type in_ty)) (swiden_high y)))) (rv_vwsub_vv (gen_slidedown_half in_ty x) (gen_slidedown_half in_ty y) (unmasked) (vstate_mf2 (ty_half_lanes in_ty)))) -(rule 9 (lower (has_type (ty_vec_fits_in_register _) (isub (swiden_high x @ (value_type in_ty)) +(rule 10 (lower (has_type (ty_vec_fits_in_register _) (isub (swiden_high x @ (value_type in_ty)) (splat (sextend y @ (value_type sext_ty)))))) (if-let $true (ty_equal (lane_type in_ty) sext_ty)) (rv_vwsub_vx (gen_slidedown_half in_ty x) y (unmasked) (vstate_mf2 (ty_half_lanes in_ty)))) @@ -388,11 +392,11 @@ (rule 6 (lower (has_type (ty_vec_fits_in_register _) (isub x (uwiden_low y @ (value_type in_ty))))) (rv_vwsubu_wv x y (unmasked) (vstate_mf2 (ty_half_lanes in_ty)))) -(rule 9 (lower (has_type (ty_vec_fits_in_register _) (isub (uwiden_low x @ (value_type in_ty)) +(rule 10 (lower (has_type (ty_vec_fits_in_register _) (isub (uwiden_low x @ (value_type in_ty)) (uwiden_low y)))) (rv_vwsubu_vv x y (unmasked) (vstate_mf2 (ty_half_lanes in_ty)))) -(rule 9 (lower (has_type (ty_vec_fits_in_register _) (isub (uwiden_low x @ (value_type in_ty)) +(rule 10 (lower (has_type (ty_vec_fits_in_register _) (isub (uwiden_low x @ (value_type in_ty)) (splat (uextend y @ (value_type uext_ty)))))) (if-let $true (ty_equal (lane_type in_ty) uext_ty)) (rv_vwsubu_vx x y (unmasked) (vstate_mf2 (ty_half_lanes in_ty)))) @@ -403,32 +407,32 @@ (rule 6 (lower (has_type (ty_vec_fits_in_register _) (isub x (uwiden_high y @ (value_type in_ty))))) (rv_vwsubu_wv x (gen_slidedown_half in_ty y) (unmasked) (vstate_mf2 (ty_half_lanes in_ty)))) -(rule 9 (lower (has_type (ty_vec_fits_in_register _) (isub (uwiden_high x @ (value_type in_ty)) +(rule 10 (lower (has_type (ty_vec_fits_in_register _) (isub (uwiden_high x @ (value_type in_ty)) (uwiden_high y)))) (rv_vwsubu_vv (gen_slidedown_half in_ty x) (gen_slidedown_half in_ty y) (unmasked) (vstate_mf2 (ty_half_lanes in_ty)))) -(rule 9 (lower (has_type (ty_vec_fits_in_register _) (isub (uwiden_high x @ (value_type in_ty)) +(rule 10 (lower (has_type (ty_vec_fits_in_register _) (isub (uwiden_high x @ (value_type in_ty)) (splat (uextend y @ (value_type uext_ty)))))) (if-let $true (ty_equal (lane_type in_ty) uext_ty)) (rv_vwsubu_vx (gen_slidedown_half in_ty x) y (unmasked) (vstate_mf2 (ty_half_lanes in_ty)))) ;; Signed Widening Mixed High/Low Subtractions -(rule 9 (lower (has_type (ty_vec_fits_in_register _) (isub (swiden_low x @ (value_type in_ty)) +(rule 10 (lower (has_type (ty_vec_fits_in_register _) (isub (swiden_low x @ (value_type in_ty)) (swiden_high y)))) (rv_vwsub_vv x (gen_slidedown_half in_ty y) (unmasked) (vstate_mf2 (ty_half_lanes in_ty)))) -(rule 9 (lower (has_type (ty_vec_fits_in_register _) (isub (swiden_high x @ (value_type in_ty)) +(rule 10 (lower (has_type (ty_vec_fits_in_register _) (isub (swiden_high x @ (value_type in_ty)) (swiden_low y)))) (rv_vwsub_vv (gen_slidedown_half in_ty x) y (unmasked) (vstate_mf2 (ty_half_lanes in_ty)))) ;; Unsigned Widening Mixed High/Low Subtractions -(rule 9 (lower (has_type (ty_vec_fits_in_register _) (isub (uwiden_low x @ (value_type in_ty)) +(rule 10 (lower (has_type (ty_vec_fits_in_register _) (isub (uwiden_low x @ (value_type in_ty)) (uwiden_high y)))) (rv_vwsubu_vv x (gen_slidedown_half in_ty y) (unmasked) (vstate_mf2 (ty_half_lanes in_ty)))) -(rule 9 (lower (has_type (ty_vec_fits_in_register _) (isub (uwiden_high x @ (value_type in_ty)) +(rule 10 (lower (has_type (ty_vec_fits_in_register _) (isub (uwiden_high x @ (value_type in_ty)) (uwiden_low y)))) (rv_vwsubu_vv (gen_slidedown_half in_ty x) y (unmasked) (vstate_mf2 (ty_half_lanes in_ty)))) diff --git a/cranelift/codegen/src/isa/x64/abi.rs b/cranelift/codegen/src/isa/x64/abi.rs index 49c54d5293cd..d7df15c614d4 100644 --- a/cranelift/codegen/src/isa/x64/abi.rs +++ b/cranelift/codegen/src/isa/x64/abi.rs @@ -222,7 +222,7 @@ impl ABIMachineSpec for X64ABIMachineSpec { ArgsOrRets::Args => { get_intreg_for_arg(&call_conv, next_gpr, next_param_idx) } - ArgsOrRets::Rets => get_intreg_for_retval(&call_conv, next_gpr), + ArgsOrRets::Rets => get_intreg_for_retval(&call_conv, flags, next_gpr), } } else { match args_or_rets { @@ -1035,7 +1035,11 @@ fn get_fltreg_for_arg(call_conv: &CallConv, idx: usize, arg_idx: usize) -> Optio } } -fn get_intreg_for_retval(call_conv: &CallConv, intreg_idx: usize) -> Option { +fn get_intreg_for_retval( + call_conv: &CallConv, + flags: &settings::Flags, + intreg_idx: usize, +) -> Option { match call_conv { CallConv::Tail => match intreg_idx { 0 => Some(regs::rax()), @@ -1057,6 +1061,7 @@ fn get_intreg_for_retval(call_conv: &CallConv, intreg_idx: usize) -> Option CallConv::Fast | CallConv::Cold | CallConv::SystemV => match intreg_idx { 0 => Some(regs::rax()), 1 => Some(regs::rdx()), + 2 if flags.enable_llvm_abi_extensions() => Some(regs::rcx()), _ => None, }, CallConv::WindowsFastcall => match intreg_idx { diff --git a/cranelift/codegen/src/isa/x64/inst.isle b/cranelift/codegen/src/isa/x64/inst.isle index e55867ab45ab..3812d459ce73 100644 --- a/cranelift/codegen/src/isa/x64/inst.isle +++ b/cranelift/codegen/src/isa/x64/inst.isle @@ -90,20 +90,34 @@ (dividend Gpr) (dst WritableGpr)) - ;; The high (and low) bits of a (un)signed multiply: `RDX:RAX := RAX * - ;; rhs`. - (MulHi (size OperandSize) - (signed bool) - (src1 Gpr) - (src2 GprMem) - (dst_lo WritableGpr) - (dst_hi WritableGpr)) - - ;; x64 'mul' instruction but it only outputs the low half - (UMulLo (size OperandSize) - (src1 Gpr) - (src2 GprMem) - (dst WritableGpr)) + ;; Unsigned multiplication producing the high bits of the result in one + ;; register and the low bits in another register. + (Mul (size OperandSize) + (signed bool) + (src1 Gpr) + (src2 GprMem) + (dst_lo WritableGpr) + (dst_hi WritableGpr)) + + ;; Same as `Mul` but the 16-bit multiplication result is stored in `AX`. + (Mul8 (signed bool) + (src1 Gpr) + (src2 GprMem) + (dst WritableGpr)) + + ;; The two-operand form of `imul` which produces a truncated same-size + ;; result as the operands. + (IMul (size OperandSize) + (src1 Gpr) + (src2 GprMem) + (dst WritableGpr)) + + ;; The three-operand form of `imul` where the third operand must be + ;; a constant. + (IMulImm (size OperandSize) + (src1 GprMem) + (src2 i32) + (dst WritableGpr)) ;; A synthetic instruction sequence used as part of the lowering of the ;; `srem` instruction which returns 0 if the divisor is -1 and @@ -750,8 +764,7 @@ Sbb And Or - Xor - Mul)) + Xor)) (type AluRmROpcode (enum Andn @@ -2046,22 +2059,6 @@ (_ Unit (emit (MInst.XmmRmRVex3 op src1 src2 src3 dst)))) dst)) -;; Helper for creating `MInst.MulHi` instructions. -;; -;; Returns the (lo, hi) register halves of the multiplication. -(decl mul_hi (Type bool Gpr GprMem) ValueRegs) -(rule (mul_hi ty signed src1 src2) - (let ((dst_lo WritableGpr (temp_writable_gpr)) - (dst_hi WritableGpr (temp_writable_gpr)) - (size OperandSize (raw_operand_size_of_type ty)) - (_ Unit (emit (MInst.MulHi size - signed - src1 - src2 - dst_lo - dst_hi)))) - (value_gprs dst_lo dst_hi))) - ;; Helper for creating `MInst.UnaryRmR` instructions. (decl unary_rm_r (UnaryRmROpcode Gpr OperandSize) Gpr) (rule (unary_rm_r op src size) @@ -2559,31 +2556,55 @@ dst) dst))) -;; Helper for creating `mul` instructions. -(decl x64_mul (Type Gpr GprMemImm) Gpr) -(rule (x64_mul ty src1 src2) - (alu_rmi_r ty - (AluRmiROpcode.Mul) - src1 - src2)) +;; Helper for creating `mul` instructions or `imul` instructions (depending +;; on `signed`) +(decl x64_mul (Type bool Gpr GprMem) ValueRegs) +(rule (x64_mul ty signed src1 src2) + (let ((dst_lo WritableGpr (temp_writable_gpr)) + (dst_hi WritableGpr (temp_writable_gpr)) + (size OperandSize (raw_operand_size_of_type ty)) + (_ Unit (emit (MInst.Mul size signed src1 src2 dst_lo dst_hi)))) + (value_gprs dst_lo dst_hi))) + +;; Helper for creating `mul` instructions or `imul` instructions (depending +;; on `signed`) for 8-bit operands. +(decl x64_mul8 (bool Gpr GprMem) Gpr) +(rule (x64_mul8 signed src1 src2) + (let ((dst WritableGpr (temp_writable_gpr)) + (_ Unit (emit (MInst.Mul8 signed src1 src2 dst)))) + dst)) + +;; Helper for creating `imul` instructions. +(decl x64_imul (Type Gpr GprMem) Gpr) +(rule (x64_imul ty src1 src2) + (let ((dst WritableGpr (temp_writable_gpr)) + (size OperandSize (raw_operand_size_of_type ty)) + (_ Unit (emit (MInst.IMul size src1 src2 dst)))) + dst)) -;; Helper for creating `umullo` instructions. -(decl x64_umullo (Type Gpr GprMem) Gpr) -(rule (x64_umullo ty src1 src2) +;; Helper for creating `imul` instructions with an immediate operand. +(decl x64_imul_imm (Type GprMem i32) Gpr) +(rule (x64_imul_imm ty src1 src2) (let ((dst WritableGpr (temp_writable_gpr)) (size OperandSize (raw_operand_size_of_type ty)) - (_ Unit (emit (MInst.UMulLo size src1 src2 dst)))) + (_ Unit (emit (MInst.IMulImm size src1 src2 dst)))) dst)) -(decl x64_umullo_with_flags_paired (Type Gpr GprMem) ProducesFlags) -(rule (x64_umullo_with_flags_paired ty src1 src2) +(decl x64_mul8_with_flags_paired (bool Gpr GprMem) ProducesFlags) +(rule (x64_mul8_with_flags_paired signed src1 src2) (let ((dst WritableGpr (temp_writable_gpr))) (ProducesFlags.ProducesFlagsReturnsResultWithConsumer - (MInst.UMulLo (raw_operand_size_of_type ty) - src1 - src2 - dst) - dst))) + (MInst.Mul8 signed src1 src2 dst) + dst))) + +(decl x64_mul_lo_with_flags_paired (Type bool Gpr GprMem) ProducesFlags) +(rule (x64_mul_lo_with_flags_paired ty signed src1 src2) + (let ((dst_lo WritableGpr (temp_writable_gpr)) + (dst_hi WritableGpr (temp_writable_gpr)) + (size OperandSize (raw_operand_size_of_type ty))) + (ProducesFlags.ProducesFlagsReturnsResultWithConsumer + (MInst.Mul size signed src1 src2 dst_lo dst_hi) + dst_lo))) ;; Helper for emitting `and` instructions. (decl x64_and (Type Gpr GprMemImm) Gpr) @@ -3891,12 +3912,6 @@ dst)))) dst)) -;; Helper for creating `mul` instructions that return both the lower and -;; (unsigned) higher halves of the result. -(decl mulhi_u (Type Gpr GprMem) ValueRegs) -(rule (mulhi_u ty src1 src2) - (mul_hi ty $false src1 src2)) - ;; Helper for creating `psllw` instructions. (decl x64_psllw (Xmm XmmMemImm) Xmm) (rule 0 (x64_psllw src1 src2) @@ -4281,18 +4296,27 @@ (rule (x64_vfnmadd132 $F64X2 a b c) (xmm_rmr_vex3 (AvxOpcode.Vfnmadd132pd) a b c)) ;; Helper for creating `sqrtss` instructions. -(decl x64_sqrtss (XmmMem) Xmm) -(rule (x64_sqrtss x) (xmm_unary_rm_r_unaligned (SseOpcode.Sqrtss) x)) -(rule 1 (x64_sqrtss x) +;; +;; NB: the square-root operation technically only has one operand but this +;; instruction has two. This is to reflect how the square root operation copies +;; the upper bits of the first register and only performs the square root +;; operation on the low bits of the second register. This introduces +;; a data-dependency on the contents of the first register which is modeled +;; here. +(decl x64_sqrtss (Xmm XmmMem) Xmm) +(rule (x64_sqrtss x y) (xmm_rm_r_unaligned (SseOpcode.Sqrtss) x y)) +(rule 1 (x64_sqrtss x y) (if-let $true (use_avx)) - (xmm_unary_rm_r_vex (AvxOpcode.Vsqrtss) x)) + (xmm_rmir_vex (AvxOpcode.Vsqrtss) x y)) ;; Helper for creating `sqrtsd` instructions. -(decl x64_sqrtsd (XmmMem) Xmm) -(rule (x64_sqrtsd x) (xmm_unary_rm_r_unaligned (SseOpcode.Sqrtsd) x)) -(rule 1 (x64_sqrtsd x) +;; +;; NB: see `x64_sqrtss` for explanation of why this has two args. +(decl x64_sqrtsd (Xmm XmmMem) Xmm) +(rule (x64_sqrtsd x y) (xmm_rm_r_unaligned (SseOpcode.Sqrtsd) x y)) +(rule 1 (x64_sqrtsd x y) (if-let $true (use_avx)) - (xmm_unary_rm_r_vex (AvxOpcode.Vsqrtsd) x)) + (xmm_rmir_vex (AvxOpcode.Vsqrtsd) x y)) ;; Helper for creating `sqrtps` instructions. (decl x64_sqrtps (XmmMem) Xmm) @@ -4309,18 +4333,22 @@ (xmm_unary_rm_r_vex (AvxOpcode.Vsqrtpd) x)) ;; Helper for creating `cvtss2sd` instructions. -(decl x64_cvtss2sd (XmmMem) Xmm) -(rule (x64_cvtss2sd x) (xmm_unary_rm_r_unaligned (SseOpcode.Cvtss2sd) x)) -(rule 1 (x64_cvtss2sd x) +;; +;; NB: see `x64_sqrtss` for why this has two args (same reasoning, different op) +(decl x64_cvtss2sd (Xmm XmmMem) Xmm) +(rule (x64_cvtss2sd x y) (xmm_rm_r_unaligned (SseOpcode.Cvtss2sd) x y)) +(rule 1 (x64_cvtss2sd x y) (if-let $true (use_avx)) - (xmm_unary_rm_r_vex (AvxOpcode.Vcvtss2sd) x)) + (xmm_rmir_vex (AvxOpcode.Vcvtss2sd) x y)) ;; Helper for creating `cvtsd2ss` instructions. -(decl x64_cvtsd2ss (XmmMem) Xmm) -(rule (x64_cvtsd2ss x) (xmm_unary_rm_r_unaligned (SseOpcode.Cvtsd2ss) x)) -(rule 1 (x64_cvtsd2ss x) +;; +;; NB: see `x64_sqrtss` for why this has two args (same reasoning, different op) +(decl x64_cvtsd2ss (Xmm XmmMem) Xmm) +(rule (x64_cvtsd2ss x y) (xmm_rm_r_unaligned (SseOpcode.Cvtsd2ss) x y)) +(rule 1 (x64_cvtsd2ss x y) (if-let $true (use_avx)) - (xmm_unary_rm_r_vex (AvxOpcode.Vcvtsd2ss) x)) + (xmm_rmir_vex (AvxOpcode.Vcvtsd2ss) x y)) ;; Helper for creating `cvtdq2ps` instructions. (decl x64_cvtdq2ps (XmmMem) Xmm) diff --git a/cranelift/codegen/src/isa/x64/inst/args.rs b/cranelift/codegen/src/isa/x64/inst/args.rs index 1c6c2877def0..05bb3aaf9069 100644 --- a/cranelift/codegen/src/isa/x64/inst/args.rs +++ b/cranelift/codegen/src/isa/x64/inst/args.rs @@ -329,7 +329,8 @@ impl Amode { Self::RipRelative { target } } - pub(crate) fn with_flags(&self, flags: MemFlags) -> Self { + /// Set the specified [MemFlags] to the [Amode]. + pub fn with_flags(&self, flags: MemFlags) -> Self { match self { &Self::ImmReg { simm32, base, .. } => Self::ImmReg { simm32, @@ -817,8 +818,6 @@ pub enum AluRmiROpcode { Or, /// Bitwise exclusive OR. Xor, - /// The signless, non-extending (N x N -> N, for N in {32,64}) variant. - Mul, } impl fmt::Debug for AluRmiROpcode { @@ -831,7 +830,6 @@ impl fmt::Debug for AluRmiROpcode { AluRmiROpcode::And => "and", AluRmiROpcode::Or => "or", AluRmiROpcode::Xor => "xor", - AluRmiROpcode::Mul => "imul", }; write!(fmt, "{}", name) } diff --git a/cranelift/codegen/src/isa/x64/inst/emit.rs b/cranelift/codegen/src/isa/x64/inst/emit.rs index 6bd65154eb23..546f961da636 100644 --- a/cranelift/codegen/src/isa/x64/inst/emit.rs +++ b/cranelift/codegen/src/isa/x64/inst/emit.rs @@ -168,134 +168,73 @@ pub(crate) fn emit( }; let mut rex = RexFlags::from(*size); - if *op == AluRmiROpcode::Mul { - // We kinda freeloaded Mul into RMI_R_Op, but it doesn't fit the usual pattern, so - // we have to special-case it. - if *size == OperandSize::Size8 { - match src2 { - RegMemImm::Reg { reg: reg_e } => { - debug_assert!(reg_e.is_real()); - rex.always_emit_if_8bit_needed(reg_e); - let enc_e = int_reg_enc(reg_e); - emit_std_enc_enc(sink, LegacyPrefixes::None, 0xF6, 1, 5, enc_e, rex); - } - - RegMemImm::Mem { addr } => { - let amode = addr.finalize(state, sink); - emit_std_enc_mem( - sink, - LegacyPrefixes::None, - 0xF6, - 1, - 5, - &amode, - rex, - 0, - ); - } + let (opcode_r, opcode_m, subopcode_i) = match op { + AluRmiROpcode::Add => (0x01, 0x03, 0), + AluRmiROpcode::Adc => (0x11, 0x03, 0), + AluRmiROpcode::Sub => (0x29, 0x2B, 5), + AluRmiROpcode::Sbb => (0x19, 0x2B, 5), + AluRmiROpcode::And => (0x21, 0x23, 4), + AluRmiROpcode::Or => (0x09, 0x0B, 1), + AluRmiROpcode::Xor => (0x31, 0x33, 6), + }; - RegMemImm::Imm { .. } => { - panic!("Cannot emit 8bit imul with 8bit immediate"); - } - } - } else { - match src2 { - RegMemImm::Reg { reg: reg_e } => { - emit_std_reg_reg(sink, prefix, 0x0FAF, 2, reg_g, reg_e, rex); - } + let (opcode_r, opcode_m) = if *size == OperandSize::Size8 { + (opcode_r - 1, opcode_m - 1) + } else { + (opcode_r, opcode_m) + }; - RegMemImm::Mem { addr } => { - let amode = addr.finalize(state, sink); - emit_std_reg_mem(sink, prefix, 0x0FAF, 2, reg_g, &amode, rex, 0); - } + if *size == OperandSize::Size8 { + debug_assert!(reg_g.is_real()); + rex.always_emit_if_8bit_needed(reg_g); + } - RegMemImm::Imm { simm32 } => { - let imm_size = if low8_will_sign_extend_to_32(simm32) { - 1 - } else { - if *size == OperandSize::Size16 { - 2 - } else { - 4 - } - }; - let opcode = if imm_size == 1 { 0x6B } else { 0x69 }; - // Yes, really, reg_g twice. - emit_std_reg_reg(sink, prefix, opcode, 1, reg_g, reg_g, rex); - emit_simm(sink, imm_size, simm32); - } + match src2 { + RegMemImm::Reg { reg: reg_e } => { + if *size == OperandSize::Size8 { + debug_assert!(reg_e.is_real()); + rex.always_emit_if_8bit_needed(reg_e); } - } - } else { - let (opcode_r, opcode_m, subopcode_i) = match op { - AluRmiROpcode::Add => (0x01, 0x03, 0), - AluRmiROpcode::Adc => (0x11, 0x03, 0), - AluRmiROpcode::Sub => (0x29, 0x2B, 5), - AluRmiROpcode::Sbb => (0x19, 0x2B, 5), - AluRmiROpcode::And => (0x21, 0x23, 4), - AluRmiROpcode::Or => (0x09, 0x0B, 1), - AluRmiROpcode::Xor => (0x31, 0x33, 6), - AluRmiROpcode::Mul => panic!("unreachable"), - }; - - let (opcode_r, opcode_m) = if *size == OperandSize::Size8 { - (opcode_r - 1, opcode_m - 1) - } else { - (opcode_r, opcode_m) - }; - if *size == OperandSize::Size8 { - debug_assert!(reg_g.is_real()); - rex.always_emit_if_8bit_needed(reg_g); + // GCC/llvm use the swapped operand encoding (viz., the R/RM vs RM/R + // duality). Do this too, so as to be able to compare generated machine + // code easily. + emit_std_reg_reg(sink, prefix, opcode_r, 1, reg_e, reg_g, rex); } - match src2 { - RegMemImm::Reg { reg: reg_e } => { - if *size == OperandSize::Size8 { - debug_assert!(reg_e.is_real()); - rex.always_emit_if_8bit_needed(reg_e); - } - - // GCC/llvm use the swapped operand encoding (viz., the R/RM vs RM/R - // duality). Do this too, so as to be able to compare generated machine - // code easily. - emit_std_reg_reg(sink, prefix, opcode_r, 1, reg_e, reg_g, rex); - } - - RegMemImm::Mem { addr } => { - let amode = addr.finalize(state, sink); - // Here we revert to the "normal" G-E ordering. - emit_std_reg_mem(sink, prefix, opcode_m, 1, reg_g, &amode, rex, 0); - } + RegMemImm::Mem { addr } => { + let amode = addr.finalize(state, sink); + // Here we revert to the "normal" G-E ordering. + emit_std_reg_mem(sink, prefix, opcode_m, 1, reg_g, &amode, rex, 0); + } - RegMemImm::Imm { simm32 } => { - let imm_size = if *size == OperandSize::Size8 { + RegMemImm::Imm { simm32 } => { + let imm_size = if *size == OperandSize::Size8 { + 1 + } else { + if low8_will_sign_extend_to_32(simm32) { 1 } else { - if low8_will_sign_extend_to_32(simm32) { - 1 + if *size == OperandSize::Size16 { + 2 } else { - if *size == OperandSize::Size16 { - 2 - } else { - 4 - } + 4 } - }; + } + }; - let opcode = if *size == OperandSize::Size8 { - 0x80 - } else if low8_will_sign_extend_to_32(simm32) { - 0x83 - } else { - 0x81 - }; + let opcode = if *size == OperandSize::Size8 { + 0x80 + } else if low8_will_sign_extend_to_32(simm32) { + 0x83 + } else { + 0x81 + }; - // And also here we use the "normal" G-E ordering. - let enc_g = int_reg_enc(reg_g); - emit_std_enc_enc(sink, prefix, opcode, 1, subopcode_i, enc_g, rex); - emit_simm(sink, imm_size, simm32); - } + // And also here we use the "normal" G-E ordering. + let enc_g = int_reg_enc(reg_g); + emit_std_enc_enc(sink, prefix, opcode, 1, subopcode_i, enc_g, rex); + emit_simm(sink, imm_size, simm32); } } } @@ -611,9 +550,9 @@ pub(crate) fn emit( } } - Inst::MulHi { - size, + Inst::Mul { signed, + size, src1, src2, dst_lo, @@ -625,6 +564,7 @@ pub(crate) fn emit( debug_assert_eq!(src1, regs::rax()); debug_assert_eq!(dst_lo, regs::rax()); debug_assert_eq!(dst_hi, regs::rdx()); + let src2 = src2.clone().to_reg_mem().with_allocs(allocs); let rex_flags = RexFlags::from(*size); let prefix = match size { @@ -635,21 +575,19 @@ pub(crate) fn emit( }; let subopcode = if *signed { 5 } else { 4 }; - match src2.clone().to_reg_mem() { + match src2 { RegMem::Reg { reg } => { - let reg = allocs.next(reg); let src = int_reg_enc(reg); emit_std_enc_enc(sink, prefix, 0xF7, 1, subopcode, src, rex_flags) } RegMem::Mem { addr: src } => { - let amode = src.finalize(state, sink).with_allocs(allocs); + let amode = src.finalize(state, sink); emit_std_enc_mem(sink, prefix, 0xF7, 1, subopcode, &amode, rex_flags, 0); } } } - - Inst::UMulLo { - size, + Inst::Mul8 { + signed, src1, src2, dst, @@ -658,33 +596,98 @@ pub(crate) fn emit( let dst = allocs.next(dst.to_reg().to_reg()); debug_assert_eq!(src1, regs::rax()); debug_assert_eq!(dst, regs::rax()); + let src2 = src2.clone().to_reg_mem().with_allocs(allocs); - let mut rex = RexFlags::from(*size); + let mut rex_flags = RexFlags::from(OperandSize::Size8); + let prefix = LegacyPrefixes::None; + let subopcode = if *signed { 5 } else { 4 }; + match src2 { + RegMem::Reg { reg } => { + // The intel manual states: + // + // > r/m8 can not be encoded to access the following byte + // > registers if a REX prefix is used: AH, BH, CH, DH + // + // And apparently that also means that a REX prefix must be + // used if it's not one of those registers. + if !(reg == regs::rax() + || reg == regs::rbx() + || reg == regs::rcx() + || reg == regs::rdx()) + { + rex_flags.always_emit(); + } + let src = int_reg_enc(reg); + emit_std_enc_enc(sink, prefix, 0xF6, 1, subopcode, src, rex_flags) + } + RegMem::Mem { addr } => { + let amode = addr.finalize(state, sink); + emit_std_enc_mem(sink, prefix, 0xF6, 1, subopcode, &amode, rex_flags, 0); + } + } + } + Inst::IMul { + size, + src1, + src2, + dst, + } => { + let src1 = allocs.next(src1.to_reg()); + let dst = allocs.next(dst.to_reg().to_reg()); + debug_assert_eq!(src1, dst); + let src2 = src2.clone().to_reg_mem().with_allocs(allocs); + + let rex = RexFlags::from(*size); + let prefix = LegacyPrefixes::None; + match src2 { + RegMem::Reg { reg } => { + emit_std_reg_reg(sink, prefix, 0x0FAF, 2, dst, reg, rex); + } + + RegMem::Mem { addr } => { + let amode = addr.finalize(state, sink); + emit_std_reg_mem(sink, prefix, 0x0FAF, 2, dst, &amode, rex, 0); + } + } + } + + Inst::IMulImm { + size, + src1, + src2, + dst, + } => { + let dst = allocs.next(dst.to_reg().to_reg()); + let src1 = src1.clone().to_reg_mem().with_allocs(allocs); + + let rex = RexFlags::from(*size); let prefix = match size { + // NB: the intel manual doesn't seem to mention this prefix as + // being required OperandSize::Size16 => LegacyPrefixes::_66, _ => LegacyPrefixes::None, }; - - let opcode = if *size == OperandSize::Size8 { - 0xF6 + let imm_size = if i8::try_from(*src2).is_ok() { + 1 } else { - 0xF7 + if *size == OperandSize::Size16 { + 2 + } else { + 4 + } }; - - match src2.clone().to_reg_mem() { + let opcode = if imm_size == 1 { 0x6B } else { 0x69 }; + match src1 { RegMem::Reg { reg } => { - let reg = allocs.next(reg); - if *size == OperandSize::Size8 { - rex.always_emit_if_8bit_needed(reg); - } - let reg_e = int_reg_enc(reg); - emit_std_enc_enc(sink, prefix, opcode, 1, 4, reg_e, rex); + emit_std_reg_reg(sink, prefix, opcode, 1, dst, reg, rex); } - RegMem::Mem { addr: src } => { - let amode = src.finalize(state, sink).with_allocs(allocs); - emit_std_enc_mem(sink, prefix, opcode, 1, 4, &amode, rex, 0); + + RegMem::Mem { addr } => { + let amode = addr.finalize(state, sink); + emit_std_reg_mem(sink, prefix, opcode, 1, dst, &amode, rex, imm_size); } } + emit_simm(sink, imm_size, *src2 as u32); } Inst::SignExtendData { size, src, dst } => { @@ -1969,8 +1972,6 @@ pub(crate) fn emit( SseOpcode::Cvtpd2ps => (LegacyPrefixes::_66, 0x0F5A, 2), SseOpcode::Cvtps2pd => (LegacyPrefixes::None, 0x0F5A, 2), SseOpcode::Cvtdq2ps => (LegacyPrefixes::None, 0x0F5B, 2), - SseOpcode::Cvtss2sd => (LegacyPrefixes::_F3, 0x0F5A, 2), - SseOpcode::Cvtsd2ss => (LegacyPrefixes::_F2, 0x0F5A, 2), SseOpcode::Cvttpd2dq => (LegacyPrefixes::_66, 0x0FE6, 2), SseOpcode::Cvttps2dq => (LegacyPrefixes::_F3, 0x0F5B, 2), SseOpcode::Movaps => (LegacyPrefixes::None, 0x0F28, 2), @@ -1998,8 +1999,6 @@ pub(crate) fn emit( SseOpcode::Pmovzxdq => (LegacyPrefixes::_66, 0x0F3835, 3), SseOpcode::Sqrtps => (LegacyPrefixes::None, 0x0F51, 2), SseOpcode::Sqrtpd => (LegacyPrefixes::_66, 0x0F51, 2), - SseOpcode::Sqrtss => (LegacyPrefixes::_F3, 0x0F51, 2), - SseOpcode::Sqrtsd => (LegacyPrefixes::_F2, 0x0F51, 2), SseOpcode::Movddup => (LegacyPrefixes::_F2, 0x0F12, 2), _ => unimplemented!("Opcode {:?} not implemented", op), }; @@ -2231,6 +2230,10 @@ pub(crate) fn emit( SseOpcode::Phaddw => (LegacyPrefixes::_66, 0x0F3801, 3), SseOpcode::Phaddd => (LegacyPrefixes::_66, 0x0F3802, 3), SseOpcode::Movss => (LegacyPrefixes::_F3, 0x0F10, 2), + SseOpcode::Cvtss2sd => (LegacyPrefixes::_F3, 0x0F5A, 2), + SseOpcode::Cvtsd2ss => (LegacyPrefixes::_F2, 0x0F5A, 2), + SseOpcode::Sqrtss => (LegacyPrefixes::_F3, 0x0F51, 2), + SseOpcode::Sqrtsd => (LegacyPrefixes::_F2, 0x0F51, 2), _ => unimplemented!("Opcode {:?} not implemented", op), }; @@ -2452,6 +2455,10 @@ pub(crate) fn emit( AvxOpcode::Vpunpckhqdq => (LP::_66, OM::_0F, 0x6D), AvxOpcode::Vmovsd => (LP::_F2, OM::_0F, 0x10), AvxOpcode::Vmovss => (LP::_F3, OM::_0F, 0x10), + AvxOpcode::Vcvtss2sd => (LP::_F3, OM::_0F, 0x5A), + AvxOpcode::Vcvtsd2ss => (LP::_F2, OM::_0F, 0x5A), + AvxOpcode::Vsqrtss => (LP::_F3, OM::_0F, 0x51), + AvxOpcode::Vsqrtsd => (LP::_F2, OM::_0F, 0x51), _ => panic!("unexpected rmir vex opcode {op:?}"), }; VexInstruction::new() @@ -2681,36 +2688,17 @@ pub(crate) fn emit( AvxOpcode::Vbroadcastss => (LegacyPrefixes::_66, OpcodeMap::_0F38, 0x18), AvxOpcode::Vmovddup => (LegacyPrefixes::_F2, OpcodeMap::_0F, 0x12), - AvxOpcode::Vcvtss2sd => (LegacyPrefixes::_F3, OpcodeMap::_0F, 0x5A), - AvxOpcode::Vcvtsd2ss => (LegacyPrefixes::_F2, OpcodeMap::_0F, 0x5A), - AvxOpcode::Vsqrtss => (LegacyPrefixes::_F3, OpcodeMap::_0F, 0x51), - AvxOpcode::Vsqrtsd => (LegacyPrefixes::_F2, OpcodeMap::_0F, 0x51), - _ => panic!("unexpected rmr_imm_vex opcode {op:?}"), }; - let vex = VexInstruction::new() + VexInstruction::new() .length(VexVectorLength::V128) .prefix(prefix) .map(map) .opcode(opcode) .reg(dst.to_real_reg().unwrap().hw_enc()) - .rm(src); - - // These opcodes take a second operand through `vvvv` which copies - // the upper bits into the destination register. That's not - // reflected in the CLIF instruction, however, since the SSE version - // doesn't have this functionality. Instead just copy whatever - // happens to already be in the destination, which at least is what - // LLVM seems to do. - let vex = match op { - AvxOpcode::Vcvtss2sd - | AvxOpcode::Vcvtsd2ss - | AvxOpcode::Vsqrtss - | AvxOpcode::Vsqrtsd => vex.vvvv(dst.to_real_reg().unwrap().hw_enc()), - _ => vex, - }; - vex.encode(sink); + .rm(src) + .encode(sink); } Inst::XmmUnaryRmRImmVex { op, src, dst, imm } => { diff --git a/cranelift/codegen/src/isa/x64/inst/emit_tests.rs b/cranelift/codegen/src/isa/x64/inst/emit_tests.rs index 147f61deb832..8b2d51e9432c 100644 --- a/cranelift/codegen/src/isa/x64/inst/emit_tests.rs +++ b/cranelift/codegen/src/isa/x64/inst/emit_tests.rs @@ -61,32 +61,6 @@ impl Inst { } } - fn mul_hi(size: OperandSize, signed: bool, rhs: RegMem) -> Inst { - debug_assert!(size.is_one_of(&[ - OperandSize::Size16, - OperandSize::Size32, - OperandSize::Size64 - ])); - rhs.assert_regclass_is(RegClass::Int); - Inst::MulHi { - size, - signed, - src1: Gpr::new(regs::rax()).unwrap(), - src2: GprMem::new(rhs).unwrap(), - dst_lo: WritableGpr::from_reg(Gpr::new(regs::rax()).unwrap()), - dst_hi: WritableGpr::from_reg(Gpr::new(regs::rdx()).unwrap()), - } - } - - fn umul_lo(size: OperandSize, operand: RegMem) -> Inst { - Inst::UMulLo { - size, - src1: Gpr::new(regs::rax()).unwrap(), - src2: GprMem::new(operand).unwrap(), - dst: WritableGpr::from_reg(Gpr::new(regs::rax()).unwrap()), - } - } - fn xmm_rm_r_evex(op: Avx512Opcode, src1: Reg, src2: RegMem, dst: Writable) -> Self { src2.assert_regclass_is(RegClass::Float); debug_assert!(src1.class() == RegClass::Float); @@ -1352,157 +1326,6 @@ fn test_x64_emit() { "4C31FA", "xorq %rdx, %r15, %rdx", )); - // Test all mul cases, though - insns.push(( - Inst::alu_rmi_r( - OperandSize::Size64, - AluRmiROpcode::Mul, - RegMemImm::reg(r15), - w_rdx, - ), - "490FAFD7", - "imulq %rdx, %r15, %rdx", - )); - insns.push(( - Inst::alu_rmi_r( - OperandSize::Size32, - AluRmiROpcode::Mul, - RegMemImm::reg(rcx), - w_r8, - ), - "440FAFC1", - "imull %r8d, %ecx, %r8d", - )); - insns.push(( - Inst::alu_rmi_r( - OperandSize::Size32, - AluRmiROpcode::Mul, - RegMemImm::reg(rcx), - w_rsi, - ), - "0FAFF1", - "imull %esi, %ecx, %esi", - )); - insns.push(( - Inst::alu_rmi_r( - OperandSize::Size64, - AluRmiROpcode::Mul, - RegMemImm::mem(Amode::imm_reg(99, rdi)), - w_rdx, - ), - "480FAF5763", - "imulq %rdx, 99(%rdi), %rdx", - )); - insns.push(( - Inst::alu_rmi_r( - OperandSize::Size32, - AluRmiROpcode::Mul, - RegMemImm::mem(Amode::imm_reg(99, rdi)), - w_r8, - ), - "440FAF4763", - "imull %r8d, 99(%rdi), %r8d", - )); - insns.push(( - Inst::alu_rmi_r( - OperandSize::Size32, - AluRmiROpcode::Mul, - RegMemImm::mem(Amode::imm_reg(99, rdi)), - w_rsi, - ), - "0FAF7763", - "imull %esi, 99(%rdi), %esi", - )); - insns.push(( - Inst::alu_rmi_r( - OperandSize::Size64, - AluRmiROpcode::Mul, - RegMemImm::imm(-127i32 as u32), - w_rdx, - ), - "486BD281", - "imulq %rdx, $-127, %rdx", - )); - insns.push(( - Inst::alu_rmi_r( - OperandSize::Size64, - AluRmiROpcode::Mul, - RegMemImm::imm(-129i32 as u32), - w_rdx, - ), - "4869D27FFFFFFF", - "imulq %rdx, $-129, %rdx", - )); - insns.push(( - Inst::alu_rmi_r( - OperandSize::Size64, - AluRmiROpcode::Mul, - RegMemImm::imm(76543210), - w_rdx, - ), - "4869D2EAF48F04", - "imulq %rdx, $76543210, %rdx", - )); - insns.push(( - Inst::alu_rmi_r( - OperandSize::Size32, - AluRmiROpcode::Mul, - RegMemImm::imm(-127i32 as u32), - w_r8, - ), - "456BC081", - "imull %r8d, $-127, %r8d", - )); - insns.push(( - Inst::alu_rmi_r( - OperandSize::Size32, - AluRmiROpcode::Mul, - RegMemImm::imm(-129i32 as u32), - w_r8, - ), - "4569C07FFFFFFF", - "imull %r8d, $-129, %r8d", - )); - insns.push(( - Inst::alu_rmi_r( - OperandSize::Size32, - AluRmiROpcode::Mul, - RegMemImm::imm(-76543210i32 as u32), - w_r8, - ), - "4569C0160B70FB", - "imull %r8d, $-76543210, %r8d", - )); - insns.push(( - Inst::alu_rmi_r( - OperandSize::Size32, - AluRmiROpcode::Mul, - RegMemImm::imm(-127i32 as u32), - w_rsi, - ), - "6BF681", - "imull %esi, $-127, %esi", - )); - insns.push(( - Inst::alu_rmi_r( - OperandSize::Size32, - AluRmiROpcode::Mul, - RegMemImm::imm(-129i32 as u32), - w_rsi, - ), - "69F67FFFFFFF", - "imull %esi, $-129, %esi", - )); - insns.push(( - Inst::alu_rmi_r( - OperandSize::Size32, - AluRmiROpcode::Mul, - RegMemImm::imm(76543210), - w_rsi, - ), - "69F6EAF48F04", - "imull %esi, $76543210, %esi", - )); insns.push(( Inst::alu_rmi_r( @@ -1585,88 +1408,6 @@ fn test_x64_emit() { "andw %r14w, $-512, %r14w", )); - insns.push(( - Inst::alu_rmi_r( - OperandSize::Size16, - AluRmiROpcode::Mul, - RegMemImm::imm(10), - w_rax, - ), - "666BC00A", - "imulw %ax, $10, %ax", - )); - insns.push(( - Inst::alu_rmi_r( - OperandSize::Size16, - AluRmiROpcode::Mul, - RegMemImm::imm(-512i32 as u32), - w_rax, - ), - "6669C000FE", - "imulw %ax, $-512, %ax", - )); - insns.push(( - Inst::alu_rmi_r( - OperandSize::Size16, - AluRmiROpcode::Mul, - RegMemImm::imm(10), - w_r11, - ), - "66456BDB0A", - "imulw %r11w, $10, %r11w", - )); - insns.push(( - Inst::alu_rmi_r( - OperandSize::Size16, - AluRmiROpcode::Mul, - RegMemImm::imm(-512i32 as u32), - w_r11, - ), - "664569DB00FE", - "imulw %r11w, $-512, %r11w", - )); - - insns.push(( - Inst::alu_rmi_r( - OperandSize::Size16, - AluRmiROpcode::Mul, - RegMemImm::reg(rdx), - w_rax, - ), - "660FAFC2", - "imulw %ax, %dx, %ax", - )); - insns.push(( - Inst::alu_rmi_r( - OperandSize::Size16, - AluRmiROpcode::Mul, - RegMemImm::reg(r12), - w_rax, - ), - "66410FAFC4", - "imulw %ax, %r12w, %ax", - )); - insns.push(( - Inst::alu_rmi_r( - OperandSize::Size16, - AluRmiROpcode::Mul, - RegMemImm::reg(rdx), - w_r11, - ), - "66440FAFDA", - "imulw %r11w, %dx, %r11w", - )); - insns.push(( - Inst::alu_rmi_r( - OperandSize::Size16, - AluRmiROpcode::Mul, - RegMemImm::reg(r12), - w_r11, - ), - "66450FAFDC", - "imulw %r11w, %r12w, %r11w", - )); - insns.push(( Inst::alu_rmi_r( OperandSize::Size8, @@ -1871,48 +1612,6 @@ fn test_x64_emit() { "andb %r15b, %r15b, %r15b", )); - // the 8bit imul has rax as fixed dst - insns.push(( - Inst::alu_rmi_r( - OperandSize::Size8, - AluRmiROpcode::Mul, - RegMemImm::reg(rcx), - w_rax, - ), - "F6E9", - "imulb %al, %cl, %al", - )); - insns.push(( - Inst::alu_rmi_r( - OperandSize::Size8, - AluRmiROpcode::Mul, - RegMemImm::reg(rbp), - w_rax, - ), - "40F6ED", - "imulb %al, %bpl, %al", - )); - insns.push(( - Inst::alu_rmi_r( - OperandSize::Size8, - AluRmiROpcode::Mul, - RegMemImm::reg(r10), - w_rax, - ), - "41F6EA", - "imulb %al, %r10b, %al", - )); - insns.push(( - Inst::alu_rmi_r( - OperandSize::Size8, - AluRmiROpcode::Mul, - RegMemImm::reg(r15), - w_rax, - ), - "41F6EF", - "imulb %al, %r15b, %al", - )); - // ======================================================== // AluRM @@ -2265,98 +1964,6 @@ fn test_x64_emit() { "div %al, %sil, %al ; trap=int_divz", )); - // ======================================================== - // MulHi - insns.push(( - Inst::mul_hi( - OperandSize::Size32, - true, /*signed*/ - RegMem::reg(regs::rsi()), - ), - "F7EE", - "imul %eax, %esi, %eax, %edx", - )); - insns.push(( - Inst::mul_hi( - OperandSize::Size64, - true, /*signed*/ - RegMem::reg(regs::r15()), - ), - "49F7EF", - "imul %rax, %r15, %rax, %rdx", - )); - insns.push(( - Inst::mul_hi( - OperandSize::Size32, - false, /*signed*/ - RegMem::reg(regs::r14()), - ), - "41F7E6", - "mul %eax, %r14d, %eax, %edx", - )); - insns.push(( - Inst::mul_hi( - OperandSize::Size64, - false, /*signed*/ - RegMem::reg(regs::rdi()), - ), - "48F7E7", - "mul %rax, %rdi, %rax, %rdx", - )); - - // ======================================================== - // UMulLo - insns.push(( - Inst::umul_lo(OperandSize::Size64, RegMem::reg(regs::rdx())), - "48F7E2", - "mulq %rax, %rdx, %rax", - )); - insns.push(( - Inst::umul_lo(OperandSize::Size64, RegMem::reg(regs::r12())), - "49F7E4", - "mulq %rax, %r12, %rax", - )); - insns.push(( - Inst::umul_lo(OperandSize::Size32, RegMem::reg(regs::rdx())), - "F7E2", - "mull %eax, %edx, %eax", - )); - insns.push(( - Inst::umul_lo(OperandSize::Size32, RegMem::reg(regs::r12())), - "41F7E4", - "mull %eax, %r12d, %eax", - )); - insns.push(( - Inst::umul_lo(OperandSize::Size16, RegMem::reg(regs::rdx())), - "66F7E2", - "mulw %ax, %dx, %ax", - )); - insns.push(( - Inst::umul_lo(OperandSize::Size16, RegMem::reg(regs::r12())), - "6641F7E4", - "mulw %ax, %r12w, %ax", - )); - insns.push(( - Inst::umul_lo(OperandSize::Size8, RegMem::reg(regs::rdx())), - "F6E2", - "mulb %al, %dl, %al", - )); - insns.push(( - Inst::umul_lo(OperandSize::Size8, RegMem::reg(regs::rdi())), - "40F6E7", - "mulb %al, %dil, %al", - )); - insns.push(( - Inst::umul_lo(OperandSize::Size8, RegMem::reg(regs::r9())), - "41F6E1", - "mulb %al, %r9b, %al", - )); - insns.push(( - Inst::umul_lo(OperandSize::Size8, RegMem::reg(regs::r12())), - "41F6E4", - "mulb %al, %r12b, %al", - )); - // ======================================================== // Imm_R // @@ -4889,25 +4496,25 @@ fn test_x64_emit() { )); insns.push(( - Inst::xmm_unary_rm_r(SseOpcode::Sqrtss, RegMem::reg(xmm7), w_xmm8), + Inst::xmm_rm_r(SseOpcode::Sqrtss, RegMem::reg(xmm7), w_xmm8), "F3440F51C7", - "sqrtss %xmm7, %xmm8", + "sqrtss %xmm8, %xmm7, %xmm8", )); insns.push(( - Inst::xmm_unary_rm_r(SseOpcode::Sqrtsd, RegMem::reg(xmm1), w_xmm2), + Inst::xmm_rm_r(SseOpcode::Sqrtsd, RegMem::reg(xmm1), w_xmm2), "F20F51D1", - "sqrtsd %xmm1, %xmm2", + "sqrtsd %xmm2, %xmm1, %xmm2", )); insns.push(( - Inst::xmm_unary_rm_r(SseOpcode::Cvtss2sd, RegMem::reg(xmm0), w_xmm1), + Inst::xmm_rm_r(SseOpcode::Cvtss2sd, RegMem::reg(xmm0), w_xmm1), "F30F5AC8", - "cvtss2sd %xmm0, %xmm1", + "cvtss2sd %xmm1, %xmm0, %xmm1", )); insns.push(( - Inst::xmm_unary_rm_r(SseOpcode::Cvtsd2ss, RegMem::reg(xmm1), w_xmm0), + Inst::xmm_rm_r(SseOpcode::Cvtsd2ss, RegMem::reg(xmm1), w_xmm0), "F20F5AC1", - "cvtsd2ss %xmm1, %xmm0", + "cvtsd2ss %xmm0, %xmm1, %xmm0", )); insns.push(( diff --git a/cranelift/codegen/src/isa/x64/inst/mod.rs b/cranelift/codegen/src/isa/x64/inst/mod.rs index 19bda166c19f..ea2ff83b3c83 100644 --- a/cranelift/codegen/src/isa/x64/inst/mod.rs +++ b/cranelift/codegen/src/isa/x64/inst/mod.rs @@ -130,8 +130,10 @@ impl Inst { | Inst::MovToPReg { .. } | Inst::MovsxRmR { .. } | Inst::MovzxRmR { .. } - | Inst::MulHi { .. } - | Inst::UMulLo { .. } + | Inst::Mul { .. } + | Inst::Mul8 { .. } + | Inst::IMul { .. } + | Inst::IMulImm { .. } | Inst::Neg { .. } | Inst::Not { .. } | Inst::Nop { .. } @@ -857,7 +859,7 @@ impl PrettyPrint for Inst { format!("{op} {dividend}, {divisor}, {dst} ; trap={trap}") } - Inst::MulHi { + Inst::Mul { size, signed, src1, @@ -869,15 +871,33 @@ impl PrettyPrint for Inst { let dst_lo = pretty_print_reg(dst_lo.to_reg().to_reg(), size.to_bytes(), allocs); let dst_hi = pretty_print_reg(dst_hi.to_reg().to_reg(), size.to_bytes(), allocs); let src2 = src2.pretty_print(size.to_bytes(), allocs); + let suffix = suffix_bwlq(*size); let op = ljustify(if *signed { - "imul".to_string() + format!("imul{suffix}") } else { - "mul".to_string() + format!("mul{suffix}") }); format!("{op} {src1}, {src2}, {dst_lo}, {dst_hi}") } - Inst::UMulLo { + Inst::Mul8 { + signed, + src1, + src2, + dst, + } => { + let src1 = pretty_print_reg(src1.to_reg(), 1, allocs); + let dst = pretty_print_reg(dst.to_reg().to_reg(), 1, allocs); + let src2 = src2.pretty_print(1, allocs); + let op = ljustify(if *signed { + "imulb".to_string() + } else { + "mulb".to_string() + }); + format!("{op} {src1}, {src2}, {dst}") + } + + Inst::IMul { size, src1, src2, @@ -886,10 +906,24 @@ impl PrettyPrint for Inst { let src1 = pretty_print_reg(src1.to_reg(), size.to_bytes(), allocs); let dst = pretty_print_reg(dst.to_reg().to_reg(), size.to_bytes(), allocs); let src2 = src2.pretty_print(size.to_bytes(), allocs); - let op = ljustify2("mul".to_string(), suffix_bwlq(*size)); + let suffix = suffix_bwlq(*size); + let op = ljustify(format!("imul{suffix}")); format!("{op} {src1}, {src2}, {dst}") } + Inst::IMulImm { + size, + src1, + src2, + dst, + } => { + let dst = pretty_print_reg(dst.to_reg().to_reg(), size.to_bytes(), allocs); + let src1 = src1.pretty_print(size.to_bytes(), allocs); + let suffix = suffix_bwlq(*size); + let op = ljustify(format!("imul{suffix}")); + format!("{op} {src1}, {src2:#x}, {dst}") + } + Inst::CheckedSRemSeq { size, divisor, @@ -1902,23 +1936,11 @@ fn x64_get_operands VReg>(inst: &Inst, collector: &mut OperandCol // method above. match inst { Inst::AluRmiR { - size, - op, - src1, - src2, - dst, - .. + src1, src2, dst, .. } => { - if *size == OperandSize::Size8 && *op == AluRmiROpcode::Mul { - // 8-bit imul has RAX as a fixed input/output - collector.reg_fixed_use(src1.to_reg(), regs::rax()); - collector.reg_fixed_def(dst.to_writable_reg(), regs::rax()); - src2.get_operands(collector); - } else { - collector.reg_use(src1.to_reg()); - collector.reg_reuse_def(dst.to_writable_reg(), 0); - src2.get_operands(collector); - } + collector.reg_use(src1.to_reg()); + collector.reg_reuse_def(dst.to_writable_reg(), 0); + src2.get_operands(collector); } Inst::AluConstOp { dst, .. } => collector.reg_def(dst.to_writable_reg()), Inst::AluRM { src1_dst, src2, .. } => { @@ -1973,7 +1995,7 @@ fn x64_get_operands VReg>(inst: &Inst, collector: &mut OperandCol collector.reg_fixed_use(dividend.to_reg(), regs::rax()); collector.reg_fixed_def(dst.to_writable_reg(), regs::rax()); } - Inst::MulHi { + Inst::Mul { src1, src2, dst_lo, @@ -1985,20 +2007,24 @@ fn x64_get_operands VReg>(inst: &Inst, collector: &mut OperandCol collector.reg_fixed_def(dst_hi.to_writable_reg(), regs::rdx()); src2.get_operands(collector); } - Inst::UMulLo { - size, - src1, - src2, - dst, - .. + Inst::Mul8 { + src1, src2, dst, .. } => { collector.reg_fixed_use(src1.to_reg(), regs::rax()); collector.reg_fixed_def(dst.to_writable_reg(), regs::rax()); - if *size != OperandSize::Size8 { - collector.reg_clobbers(PRegSet::empty().with(regs::gpr_preg(regs::ENC_RDX))); - } src2.get_operands(collector); } + Inst::IMul { + src1, src2, dst, .. + } => { + collector.reg_use(src1.to_reg()); + collector.reg_reuse_def(dst.to_writable_reg(), 0); + src2.get_operands(collector); + } + Inst::IMulImm { src1, dst, .. } => { + collector.reg_def(dst.to_writable_reg()); + src1.get_operands(collector); + } Inst::SignExtendData { size, src, dst } => { match size { OperandSize::Size8 => { diff --git a/cranelift/codegen/src/isa/x64/lower.isle b/cranelift/codegen/src/isa/x64/lower.isle index e0d17fe627a4..d872b8152b91 100644 --- a/cranelift/codegen/src/isa/x64/lower.isle +++ b/cranelift/codegen/src/isa/x64/lower.isle @@ -167,17 +167,19 @@ ;;;; Rules for `umul_overflow` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(rule 2 (lower (umul_overflow x y @ (value_type (fits_in_64 ty)))) - (construct_overflow_op (CC.O) (x64_umullo_with_flags_paired ty x y))) +(rule 2 (lower (umul_overflow x y @ (value_type $I8))) + (construct_overflow_op (CC.O) (x64_mul8_with_flags_paired $false x y))) + +(rule 3 (lower (umul_overflow x y @ (value_type (ty_int_ref_16_to_64 ty)))) + (construct_overflow_op (CC.O) (x64_mul_lo_with_flags_paired ty $false x y))) ;;;; Rules for `smul_overflow` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(rule 2 (lower (smul_overflow x y @ (value_type (ty_int_ref_16_to_64 ty)))) - (construct_overflow_op_alu ty (CC.O) (AluRmiROpcode.Mul) x y)) +(rule 2 (lower (smul_overflow x y @ (value_type $I8))) + (construct_overflow_op (CC.O) (x64_mul8_with_flags_paired $true x y))) -;; there is no 8bit imul with an immediate operand so we need to put it in a register or memory -(rule 1 (lower (smul_overflow x y @ (value_type $I8))) - (construct_overflow_op (CC.O) (x64_alurmi_with_flags_paired (AluRmiROpcode.Mul) $I8 x (reg_mem_to_reg_mem_imm (put_in_reg_mem y))))) +(rule 3 (lower (smul_overflow x y @ (value_type (ty_int_ref_16_to_64 ty)))) + (construct_overflow_op (CC.O) (x64_mul_lo_with_flags_paired ty $true x y))) ;;;; Rules for `sadd_sat` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -965,19 +967,22 @@ ;; `i64` and smaller. -;; Multiply two registers. -(rule -5 (lower (has_type (fits_in_64 ty) (imul x y))) - (x64_mul ty x y)) +;; 8-bit base case, needs a special instruction encoding and additionally +;; move sinkable loads to the right. +(rule -7 (lower (has_type $I8 (imul x y))) (x64_mul8 $false x y)) +(rule -6 (lower (has_type $I8 (imul (sinkable_load x) y))) (x64_mul8 $false y x)) -;; Handle multiplication where the lhs is an immediate or sinkable load in -;; addition to the automatic rhs handling above. +;; 16-to-64-bit base cases, same as above by moving sinkable loads to the right. +(rule -5 (lower (has_type (ty_int_ref_16_to_64 ty) (imul x y))) + (x64_imul ty x y)) +(rule -4 (lower (has_type (ty_int_ref_16_to_64 ty) (imul (sinkable_load x) y))) + (x64_imul ty y x)) -(rule -4 (lower (has_type (fits_in_64 ty) - (imul (simm32_from_value x) y))) - (x64_mul ty y x)) -(rule -3 (lower (has_type (fits_in_64 ty) - (imul (sinkable_load x) y))) - (x64_mul ty y x)) +;; lift out constants to use 3-operand form +(rule -3 (lower (has_type (ty_int_ref_16_to_64 ty) (imul x (iconst (simm32 y))))) + (x64_imul_imm ty x y)) +(rule -2 (lower (has_type (ty_int_ref_16_to_64 ty) (imul (iconst (simm32 x)) y))) + (x64_imul_imm ty y x)) ;; `i128`. @@ -1004,13 +1009,13 @@ (y_lo Gpr (value_regs_get_gpr y_regs 0)) (y_hi Gpr (value_regs_get_gpr y_regs 1)) ;; lo_hi = mul x_lo, y_hi - (lo_hi Gpr (x64_mul $I64 x_lo y_hi)) + (lo_hi Gpr (x64_imul $I64 x_lo y_hi)) ;; hi_lo = mul x_hi, y_lo - (hi_lo Gpr (x64_mul $I64 x_hi y_lo)) + (hi_lo Gpr (x64_imul $I64 x_hi y_lo)) ;; hilo_hilo = add lo_hi, hi_lo (hilo_hilo Gpr (x64_add $I64 lo_hi hi_lo)) - ;; dst_lo:hi_lolo = mulhi_u x_lo, y_lo - (mul_regs ValueRegs (mulhi_u $I64 x_lo y_lo)) + ;; dst_lo:hi_lolo = x64_mul x_lo, y_lo + (mul_regs ValueRegs (x64_mul $I64 $false x_lo y_lo)) (dst_lo Gpr (value_regs_get_gpr mul_regs 0)) (hi_lolo Gpr (value_regs_get_gpr mul_regs 1)) ;; dst_hi = add hilo_hilo, hi_lolo @@ -2258,7 +2263,7 @@ ;; top byte: it is the sum of the bytes (masked4 >> 56) * ;; 0x01 + (masked4 >> 48) * 0x01 + (masked4 >> 40) * 0x01 ;; + ... + (masked4 >> 0). - (mul Gpr (x64_mul $I64 masked4 ones)) + (mul Gpr (x64_imul $I64 masked4 ones)) ;; Now take that top byte and return it as the popcount. (final Gpr (x64_shr $I64 mul (Imm8Reg.Imm8 56)))) final)) @@ -2280,7 +2285,7 @@ (x64_shr $I32 diff3 (Imm8Reg.Imm8 4)) diff3)) (masked4 Gpr (x64_and $I32 sum1 (RegMemImm.Imm 0x0f0f0f0f))) - (mul Gpr (x64_mul $I32 masked4 (RegMemImm.Imm 0x01010101))) + (mul Gpr (x64_imul_imm $I32 masked4 0x01010101)) (final Gpr (x64_shr $I32 mul (Imm8Reg.Imm8 24)))) final)) @@ -2577,9 +2582,9 @@ ;; Rules for `sqrt` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (rule (lower (has_type $F32 (sqrt x))) - (x64_sqrtss x)) + (x64_sqrtss (xmm_zero $F32X4) x)) (rule (lower (has_type $F64 (sqrt x))) - (x64_sqrtsd x)) + (x64_sqrtsd (xmm_zero $F64X2) x)) (rule (lower (has_type $F32X4 (sqrt x))) (x64_sqrtps x)) (rule (lower (has_type $F64X2 (sqrt x))) @@ -2587,7 +2592,7 @@ ;; Rules for `fpromote` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (rule (lower (has_type $F64 (fpromote x))) - (x64_cvtss2sd x)) + (x64_cvtss2sd (xmm_zero $F64X2) x)) ;; Rules for `fvpromote` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (rule (lower (has_type $F64X2 (fvpromote_low x))) @@ -2595,7 +2600,7 @@ ;; Rules for `fdemote` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (rule (lower (has_type $F32 (fdemote x))) - (x64_cvtsd2ss x)) + (x64_cvtsd2ss (xmm_zero $F32X4) x)) ;; Rules for `fvdemote` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (rule (lower (has_type $F32X4 (fvdemote x))) @@ -3412,6 +3417,45 @@ (rule (lower (has_type ty (fcvt_from_uint val @ (value_type $I64)))) (cvt_u64_to_float_seq ty val)) +;; Base case of u64x2 being converted to f64x2. No native instruction for this +;; is available so it's emulated through a series of instructions that exploit +;; the binary representation of 64-bit floats. This sequence of instructions is +;; copied from LLVM and my understanding of the general idea is to roughly: +;; +;; * For each bullet below operate in parallel on the left and right lanes. +;; * Move the low 32 bits of the input into one register and the upper +;; 32-bits into a different register, where both have all 0s for the upper +;; 32-bits. (e.g. split the 64-bit input into two locations) +;; * For the low bits, create `1.p52` via bit tricks. +;; * For the high bits, create `1.p84` via bit tricks. +;; * Create the constant `1.0p84 + 1.0p52` +;; * Add the two high halves and subtract the constant. +;; +;; Apply some math and this should produce the same result as the native +;; conversion. +;; +;; As for the bit tricks a float is represented where the low 53 bits are the +;; decimal of the float, basically: +;; +;; f = 1. ^ ( - 1023) +;; +;; where `` is the low 53 bits. By placing the 32-bit halves from +;; the original integer into the low 53 bits and setting the exponent right it +;; means that each 32-bit half can become part of a 64-bit floating point +;; number. The final step in combining via float arithmetic will chop off the +;; leading `1.` at the start of the float that we constructed, one for the low +;; half and one for the upper half. +(rule -1 (lower (has_type $F64X2 (fcvt_from_uint val @ (value_type $I64X2)))) + (let ((low32_mask XmmMem (emit_u128_le_const 0x00000000ffffffff_00000000ffffffff)) + (float_1p52 XmmMem (emit_u128_le_const 0x4330000000000000_4330000000000000)) + (float_1p84 XmmMem (emit_u128_le_const 0x4530000000000000_4530000000000000)) + (float_1p84_plus_1p52 XmmMem (emit_u128_le_const 0x4530000000100000_4530000000100000)) + (low32 Xmm (x64_pand val low32_mask)) + (low32_as_float Xmm (x64_por low32 float_1p52)) + (high32 Xmm (x64_psrlq val (xmi_imm 32))) + (high32_as_float Xmm (x64_por high32 float_1p84))) + (x64_addpd low32_as_float (x64_subpd high32_as_float float_1p84_plus_1p52)))) + ;; Algorithm uses unpcklps to help create a float that is equivalent ;; 0x1.0p52 + double(src). 0x1.0p52 is unique because at this exponent ;; every value of the mantissa represents a corresponding uint32 number. @@ -4159,37 +4203,19 @@ ;; Rules for `umulhi` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(rule (lower (umulhi a @ (value_type $I16) b)) - (let ((res ValueRegs (mul_hi $I16 $false a b)) - (hi Gpr (value_regs_get_gpr res 1))) - hi)) +(rule 0 (lower (umulhi a @ (value_type $I8) b)) + (x64_shr $I16 (x64_mul8 $false a b) (imm8_to_imm8_gpr 8))) -(rule (lower (umulhi a @ (value_type $I32) b)) - (let ((res ValueRegs (mul_hi $I32 $false a b)) - (hi Gpr (value_regs_get_gpr res 1))) - hi)) - -(rule (lower (umulhi a @ (value_type $I64) b)) - (let ((res ValueRegs (mul_hi $I64 $false a b)) - (hi Gpr (value_regs_get_gpr res 1))) - hi)) +(rule 1 (lower (umulhi a @ (value_type (ty_int_ref_16_to_64 ty)) b)) + (value_regs_get_gpr (x64_mul ty $false a b) 1)) ;; Rules for `smulhi` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(rule (lower (smulhi a @ (value_type $I16) b)) - (let ((res ValueRegs (mul_hi $I16 $true a b)) - (hi Gpr (value_regs_get_gpr res 1))) - hi)) - -(rule (lower (smulhi a @ (value_type $I32) b)) - (let ((res ValueRegs (mul_hi $I32 $true a b)) - (hi Gpr (value_regs_get_gpr res 1))) - hi)) +(rule 0 (lower (smulhi a @ (value_type $I8) b)) + (x64_sar $I16 (x64_mul8 $true a b) (imm8_to_imm8_gpr 8))) -(rule (lower (smulhi a @ (value_type $I64) b)) - (let ((res ValueRegs (mul_hi $I64 $true a b)) - (hi Gpr (value_regs_get_gpr res 1))) - hi)) +(rule 1 (lower (smulhi a @ (value_type (ty_int_ref_16_to_64 ty)) b)) + (value_regs_get_gpr (x64_mul ty $true a b) 1)) ;; Rules for `get_pinned_reg` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/cranelift/codegen/src/isa/x64/mod.rs b/cranelift/codegen/src/isa/x64/mod.rs index 38a9c668c9d3..5aaa664fc575 100644 --- a/cranelift/codegen/src/isa/x64/mod.rs +++ b/cranelift/codegen/src/isa/x64/mod.rs @@ -15,6 +15,7 @@ use crate::machinst::{ }; use crate::result::CodegenResult; use crate::settings::{self as shared_settings, Flags}; +use crate::{Final, MachBufferFinalized}; use alloc::{boxed::Box, vec::Vec}; use core::fmt; use cranelift_control::ControlPlane; @@ -27,6 +28,8 @@ mod lower; mod pcc; pub mod settings; +pub use inst::unwind::systemv::create_cie; + /// An X64 backend. pub(crate) struct X64Backend { triple: Triple, @@ -118,26 +121,7 @@ impl TargetIsa for X64Backend { result: &CompiledCode, kind: crate::isa::unwind::UnwindInfoKind, ) -> CodegenResult> { - use crate::isa::unwind::UnwindInfo; - use crate::isa::unwind::UnwindInfoKind; - Ok(match kind { - UnwindInfoKind::SystemV => { - let mapper = self::inst::unwind::systemv::RegisterMapper; - Some(UnwindInfo::SystemV( - crate::isa::unwind::systemv::create_unwind_info_from_insts( - &result.buffer.unwind_info[..], - result.buffer.data().len(), - &mapper, - )?, - )) - } - UnwindInfoKind::Windows => Some(UnwindInfo::WindowsX64( - crate::isa::unwind::winx64::create_unwind_info_from_insts::< - self::inst::unwind::winx64::RegisterMapper, - >(&result.buffer.unwind_info[..])?, - )), - _ => None, - }) + emit_unwind_info(&result.buffer, kind) } #[cfg(feature = "unwind")] @@ -193,6 +177,32 @@ impl TargetIsa for X64Backend { } } +/// Emit unwind info for an x86 target. +pub fn emit_unwind_info( + buffer: &MachBufferFinalized, + kind: crate::isa::unwind::UnwindInfoKind, +) -> CodegenResult> { + use crate::isa::unwind::{UnwindInfo, UnwindInfoKind}; + Ok(match kind { + UnwindInfoKind::SystemV => { + let mapper = self::inst::unwind::systemv::RegisterMapper; + Some(UnwindInfo::SystemV( + crate::isa::unwind::systemv::create_unwind_info_from_insts( + &buffer.unwind_info[..], + buffer.data().len(), + &mapper, + )?, + )) + } + UnwindInfoKind::Windows => Some(UnwindInfo::WindowsX64( + crate::isa::unwind::winx64::create_unwind_info_from_insts::< + self::inst::unwind::winx64::RegisterMapper, + >(&buffer.unwind_info[..])?, + )), + _ => None, + }) +} + impl fmt::Display for X64Backend { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { f.debug_struct("MachBackend") diff --git a/cranelift/codegen/src/isa/x64/pcc.rs b/cranelift/codegen/src/isa/x64/pcc.rs index 97afc57466bd..6fa8f886e3a8 100644 --- a/cranelift/codegen/src/isa/x64/pcc.rs +++ b/cranelift/codegen/src/isa/x64/pcc.rs @@ -247,7 +247,7 @@ pub(crate) fn check( undefined_result(ctx, vcode, dst, 64, 64)?; Ok(()) } - Inst::MulHi { + Inst::Mul { size, dst_lo, dst_hi, @@ -264,7 +264,17 @@ pub(crate) fn check( undefined_result(ctx, vcode, dst_hi, 64, 64)?; Ok(()) } - Inst::UMulLo { + Inst::Mul8 { dst, ref src2, .. } => { + match <&RegMem>::from(src2) { + RegMem::Mem { ref addr } => { + check_load(ctx, None, addr, vcode, I8, 64)?; + } + RegMem::Reg { .. } => {} + } + undefined_result(ctx, vcode, dst, 64, 64)?; + Ok(()) + } + Inst::IMul { size, dst, ref src2, @@ -279,7 +289,21 @@ pub(crate) fn check( undefined_result(ctx, vcode, dst, 64, 64)?; Ok(()) } - + Inst::IMulImm { + size, + dst, + ref src1, + .. + } => { + match <&RegMem>::from(src1) { + RegMem::Mem { ref addr } => { + check_load(ctx, None, addr, vcode, size.to_type(), 64)?; + } + RegMem::Reg { .. } => {} + } + undefined_result(ctx, vcode, dst, 64, 64)?; + Ok(()) + } Inst::CheckedSRemSeq { dst_quotient, dst_remainder, diff --git a/cranelift/codegen/src/isle_prelude.rs b/cranelift/codegen/src/isle_prelude.rs index 450244274e70..1527d280f9fa 100644 --- a/cranelift/codegen/src/isle_prelude.rs +++ b/cranelift/codegen/src/isle_prelude.rs @@ -53,6 +53,11 @@ macro_rules! isle_common_prelude_methods { x.wrapping_neg() } + #[inline] + fn i8_neg(&mut self, x: i8) -> i8 { + x.wrapping_neg() + } + #[inline] fn u64_add(&mut self, x: u64, y: u64) -> u64 { x.wrapping_add(y) @@ -737,18 +742,6 @@ macro_rules! isle_common_prelude_methods { Imm64::new((x & self.ty_mask(ty)) as i64) } - #[inline] - fn simm32(&mut self, x: Imm64) -> Option { - i64::from(x).try_into().ok() - } - - #[inline] - fn uimm8(&mut self, x: Imm64) -> Option { - let x64: i64 = x.into(); - let x8: u8 = x64.try_into().ok()?; - Some(x8) - } - #[inline] fn offset32(&mut self, x: Offset32) -> i32 { x.into() @@ -790,15 +783,7 @@ macro_rules! isle_common_prelude_methods { #[inline] fn ty_half_width(&mut self, ty: Type) -> Option { - let new_lane = match ty.lane_type() { - I16 => I8, - I32 => I16, - I64 => I32, - F64 => F32, - _ => return None, - }; - - new_lane.by(ty.lane_count()) + ty.half_width() } #[inline] @@ -842,7 +827,7 @@ macro_rules! isle_common_prelude_methods { } #[inline] - fn signed_cond_code(&mut self, cc: &condcodes::IntCC) -> Option { + fn signed_cond_code(&mut self, cc: &IntCC) -> Option { match cc { IntCC::Equal | IntCC::UnsignedGreaterThanOrEqual diff --git a/cranelift/codegen/src/lib.rs b/cranelift/codegen/src/lib.rs index c856e1a1b645..1908bdd3de88 100644 --- a/cranelift/codegen/src/lib.rs +++ b/cranelift/codegen/src/lib.rs @@ -1,7 +1,5 @@ //! Cranelift code generation library. -#![deny(missing_docs, trivial_numeric_casts, unused_extern_crates)] -#![warn(unused_import_braces)] -#![cfg_attr(feature = "std", deny(unstable_features))] +#![deny(missing_docs)] #![no_std] // Various bits and pieces of this crate might only be used for one platform or // another, but it's not really too useful to learn about that all the time. On @@ -61,8 +59,8 @@ pub use crate::machinst::buffer::{ }; pub use crate::machinst::{ CompiledCode, Final, MachBuffer, MachBufferFinalized, MachInst, MachInstEmit, - MachInstEmitState, MachLabel, Reg, TextSectionBuilder, VCodeConstantData, VCodeConstants, - Writable, + MachInstEmitState, MachLabel, RealReg, Reg, TextSectionBuilder, VCodeConstantData, + VCodeConstants, Writable, }; mod alias_analysis; diff --git a/cranelift/codegen/src/machinst/isle.rs b/cranelift/codegen/src/machinst/isle.rs index 7add8208eff1..c1f543b9e64b 100644 --- a/cranelift/codegen/src/machinst/isle.rs +++ b/cranelift/codegen/src/machinst/isle.rs @@ -7,8 +7,8 @@ use std::cell::Cell; pub use super::MachLabel; use super::RetPair; pub use crate::ir::{ - condcodes, condcodes::CondCode, dynamic_to_fixed, Constant, DynamicStackSlot, ExternalName, - FuncRef, GlobalValue, Immediate, SigRef, StackSlot, + condcodes::CondCode, dynamic_to_fixed, Constant, DynamicStackSlot, ExternalName, FuncRef, + GlobalValue, Immediate, SigRef, StackSlot, }; pub use crate::isa::{unwind::UnwindInst, TargetIsa}; pub use crate::machinst::{ @@ -562,6 +562,18 @@ macro_rules! isle_lower_prelude_methods { Some(value) } + #[inline] + fn simm32(&mut self, x: Imm64) -> Option { + i64::from(x).try_into().ok() + } + + #[inline] + fn uimm8(&mut self, x: Imm64) -> Option { + let x64: i64 = x.into(); + let x8: u8 = x64.try_into().ok()?; + Some(x8) + } + #[inline] fn preg_to_reg(&mut self, preg: PReg) -> Reg { preg.into() diff --git a/cranelift/codegen/src/machinst/mod.rs b/cranelift/codegen/src/machinst/mod.rs index 285a1c1474ca..c7c93b23730d 100644 --- a/cranelift/codegen/src/machinst/mod.rs +++ b/cranelift/codegen/src/machinst/mod.rs @@ -81,6 +81,7 @@ pub use buffer::*; pub mod helpers; pub use helpers::*; pub mod inst_common; +#[allow(unused_imports)] // not used in all backends right now pub use inst_common::*; pub mod valueregs; pub use reg::*; diff --git a/cranelift/codegen/src/machinst/pcc.rs b/cranelift/codegen/src/machinst/pcc.rs index db1bf3256533..d737d83dacc3 100644 --- a/cranelift/codegen/src/machinst/pcc.rs +++ b/cranelift/codegen/src/machinst/pcc.rs @@ -6,8 +6,7 @@ use crate::trace; pub(crate) fn get_fact_or_default(vcode: &VCode, reg: Reg, width: u16) -> Fact { trace!( - "get_fact_or_default: reg v{} -> {:?}", - reg.to_virtual_reg().unwrap().index(), + "get_fact_or_default: reg {reg:?} -> {:?}", vcode.vreg_fact(reg.into()) ); vcode diff --git a/cranelift/codegen/src/machinst/reg.rs b/cranelift/codegen/src/machinst/reg.rs index 8aadc11b540e..4e21377d2d1f 100644 --- a/cranelift/codegen/src/machinst/reg.rs +++ b/cranelift/codegen/src/machinst/reg.rs @@ -112,6 +112,7 @@ impl RealReg { self.0.class() } + /// The physical register number. pub fn hw_enc(self) -> u8 { PReg::from(self).hw_enc() as u8 } diff --git a/cranelift/codegen/src/opts.rs b/cranelift/codegen/src/opts.rs index 3ec3e116593c..e897b2dc4437 100644 --- a/cranelift/codegen/src/opts.rs +++ b/cranelift/codegen/src/opts.rs @@ -1,10 +1,10 @@ //! Optimization driver using ISLE rewrite rules on an egraph. use crate::egraph::{NewOrExistingInst, OptimizeCtx}; -use crate::ir::condcodes; pub use crate::ir::condcodes::{FloatCC, IntCC}; use crate::ir::dfg::ValueDef; pub use crate::ir::immediates::{Ieee32, Ieee64, Imm64, Offset32, Uimm8, V128Imm}; +use crate::ir::instructions::InstructionFormat; pub use crate::ir::types::*; pub use crate::ir::{ dynamic_to_fixed, AtomicRmwOp, BlockCall, Constant, DynamicStackSlot, FuncRef, GlobalValue, @@ -27,6 +27,8 @@ const MAX_ISLE_RETURNS: usize = 8; pub type ConstructorVec = SmallVec<[T; MAX_ISLE_RETURNS]>; +type TypeAndInstructionData = (Type, InstructionData); + impl generated_code::Length for SmallVec { #[inline] fn len(&self) -> usize { @@ -119,6 +121,65 @@ where } } +#[derive(Default)] +pub(crate) struct MaybeUnaryEtorIter<'a, 'b, 'c> { + opcode: Option, + inner: InstDataEtorIter<'a, 'b, 'c>, + fallback: Option, +} + +impl MaybeUnaryEtorIter<'_, '_, '_> { + fn new(opcode: Opcode, value: Value) -> Self { + debug_assert_eq!(opcode.format(), InstructionFormat::Unary); + Self { + opcode: Some(opcode), + inner: InstDataEtorIter::new(value), + fallback: Some(value), + } + } +} + +impl<'a, 'b, 'c> ContextIter for MaybeUnaryEtorIter<'a, 'b, 'c> +where + 'b: 'a, + 'c: 'b, +{ + type Context = IsleContext<'a, 'b, 'c>; + type Output = (Type, Value); + + fn next(&mut self, ctx: &mut IsleContext<'a, 'b, 'c>) -> Option { + debug_assert_ne!(self.opcode, None); + while let Some((ty, inst_def)) = self.inner.next(ctx) { + let InstructionData::Unary { opcode, arg } = inst_def else { + continue; + }; + if Some(opcode) == self.opcode { + self.fallback = None; + return Some((ty, arg)); + } + } + + self.fallback.take().map(|value| { + let ty = generated_code::Context::value_type(ctx, value); + (ty, value) + }) + } +} + +impl<'a, 'b, 'c> IntoContextIter for MaybeUnaryEtorIter<'a, 'b, 'c> +where + 'b: 'a, + 'c: 'b, +{ + type Context = IsleContext<'a, 'b, 'c>; + type Output = (Type, Value); + type IntoIter = Self; + + fn into_context_iter(self) -> Self { + self + } +} + impl<'a, 'b, 'c> generated_code::Context for IsleContext<'a, 'b, 'c> { isle_common_prelude_methods!(); @@ -128,6 +189,13 @@ impl<'a, 'b, 'c> generated_code::Context for IsleContext<'a, 'b, 'c> { *returns = InstDataEtorIter::new(eclass); } + type inst_data_tupled_etor_returns = InstDataEtorIter<'a, 'b, 'c>; + + fn inst_data_tupled_etor(&mut self, eclass: Value, returns: &mut InstDataEtorIter<'a, 'b, 'c>) { + // Literally identical to `inst_data_etor`, just a different nominal type in ISLE + self.inst_data_etor(eclass, returns); + } + fn make_inst_ctor(&mut self, ty: Type, op: &InstructionData) -> Value { let value = self .ctx @@ -149,6 +217,21 @@ impl<'a, 'b, 'c> generated_code::Context for IsleContext<'a, 'b, 'c> { self.ctx.func.dfg.value_type(val) } + fn iconst_sextend_etor( + &mut self, + (ty, inst_data): (Type, InstructionData), + ) -> Option<(Type, i64)> { + if let InstructionData::UnaryImm { + opcode: Opcode::Iconst, + imm, + } = inst_data + { + Some((ty, self.i64_sextend_imm64(ty, imm))) + } else { + None + } + } + fn remat(&mut self, value: Value) -> Value { trace!("remat: {}", value); self.ctx.remat_values.insert(value); @@ -169,4 +252,33 @@ impl<'a, 'b, 'c> generated_code::Context for IsleContext<'a, 'b, 'c> { let imm = V128Imm(val.to_le_bytes()); self.ctx.func.dfg.constants.insert(imm.into()) } + + type sextend_maybe_etor_returns = MaybeUnaryEtorIter<'a, 'b, 'c>; + fn sextend_maybe_etor(&mut self, value: Value, returns: &mut Self::sextend_maybe_etor_returns) { + *returns = MaybeUnaryEtorIter::new(Opcode::Sextend, value); + } + + type uextend_maybe_etor_returns = MaybeUnaryEtorIter<'a, 'b, 'c>; + fn uextend_maybe_etor(&mut self, value: Value, returns: &mut Self::uextend_maybe_etor_returns) { + *returns = MaybeUnaryEtorIter::new(Opcode::Uextend, value); + } + + // NB: Cranelift's defined semantics for `fcvt_from_{s,u}int` match Rust's + // own semantics for converting an integer to a float, so these are all + // implemented with `as` conversions in Rust. + fn f32_from_uint(&mut self, n: u64) -> Ieee32 { + Ieee32::with_float(n as f32) + } + + fn f64_from_uint(&mut self, n: u64) -> Ieee64 { + Ieee64::with_float(n as f64) + } + + fn f32_from_sint(&mut self, n: i64) -> Ieee32 { + Ieee32::with_float(n as f32) + } + + fn f64_from_sint(&mut self, n: i64) -> Ieee64 { + Ieee64::with_float(n as f64) + } } diff --git a/cranelift/codegen/src/opts/README.md b/cranelift/codegen/src/opts/README.md index b4f46420abe0..d7b09e4add71 100644 --- a/cranelift/codegen/src/opts/README.md +++ b/cranelift/codegen/src/opts/README.md @@ -1,5 +1,87 @@ -Rules here are allowed to rewrite pure expressions arbitrarily, -using the same inputs as the original, or fewer. In other words, we -cannot pull a new eclass id out of thin air and refer to it, other -than a piece of the input or a new node that we construct; but we -can freely rewrite e.g. `x+y-y` to `x`. +# Rules for Writing Optimization Rules + +For both correctness and compile speed, we must be careful with our rules. A lot +of it boils down to the fact that, unlike traditional e-graphs, our rules are +*directional*. + +1. Rules should not rewrite to worse code: the right-hand side should be at + least as good as the left-hand side or better. + + For example, the rule + + x => (add x 0) + + is disallowed, but swapping its left- and right-hand sides produces a rule + that is allowed. + + Any kind of canonicalizing rule that intends to help subsequent rules match + and unlock further optimizations (e.g. floating constants to the right side + for our constant-propagation rules to match) must produce canonicalized + output that is no worse than its noncanonical input. + + We assume this invariant as a heuristic to break ties between two + otherwise-equal-cost expressions in various places, making up for some + limitations of our explicit cost function. + +2. Any rule that removes value-uses in its right-hand side that previously + existed in its left-hand side MUST use `subsume`. + + For example, the rule + + (select 1 x y) => x + + MUST use `subsume`. + + This is required for correctness because, once a value-use is removed, some + e-nodes in the e-class are more equal than others. There might be uses of `x` + in a scope where `y` is not available, and so emitting `(select 1 x y)` in + place of `x` in such cases would introduce uses of `y` where it is not + defined. + + An exception to this rule is discarding constants, as they can be + rematerialized anywhere without introducing correctness issues. For example, + the (admittedly silly) rule `(select 1 x (iconst_u _)) => x` would be a good + candidate for not using `subsume`, as it does not discard any non-constant + values introduced in its LHS. + +3. Avoid overly general rewrites like commutativity and associativity. Instead, + prefer targeted instances of the rewrite (for example, canonicalizing adds + where one operand is a constant such that the constant is always the add's + second operand, rather than general commutativity for adds) or even writing + the "same" optimization rule multiple times. + + For example, the commutativity in the first rule in the following snippet is + bad because it will match even when the first operand is not an add: + + ;; Commute to allow `(foo (add ...) x)`, when we see it, to match. + (foo x y) => (foo y x) + + ;; Optimize. + (foo x (add ...)) => (bar x) + + Better is to commute only when we know that canonicalizing in this way will + all definitely allow the subsequent optimization rule to match: + + ;; Canonicalize all adds to `foo`'s second operand. + (foo (add ...) x) => (foo x (add ...)) + + ;; Optimize. + (foo x (add ...)) => (bar x) + + But even better in this case is to write the "same" optimization multiple + times: + + (foo (add ...) x) => (bar x) + (foo x (add ...)) => (bar x) + + The cost of rule-matching is amortized by the ISLE compiler, where as the + intermediate result of each rewrite allocates new e-nodes and requires + storage in the dataflow graph. Therefore, additional rules are cheaper than + additional e-nodes. + + Commutativity and associativity in particular can cause huge amounts of + e-graph bloat. + + One day we intend to extend ISLE with built-in support for commutativity, so + we don't need to author the redundant commutations ourselves: + https://github.com/bytecodealliance/wasmtime/issues/6128 diff --git a/cranelift/codegen/src/opts/arithmetic.isle b/cranelift/codegen/src/opts/arithmetic.isle index 6553b867468b..400da6bab18d 100644 --- a/cranelift/codegen/src/opts/arithmetic.isle +++ b/cranelift/codegen/src/opts/arithmetic.isle @@ -1,26 +1,36 @@ ;; rewrites for integer and floating-point arithmetic ;; eg: `iadd`, `isub`, `ineg`, `imul`, `fadd`, `fsub`, `fmul` -;; x+0 == 0+x == x. +;; For commutative instructions, we depend on cprop.isle pushing immediates to +;; the right, and thus only simplify patterns like `x+0`, not `0+x`. + +;; x+0 == x. (rule (simplify (iadd ty x - (iconst ty (u64_from_imm64 0)))) - (subsume x)) -(rule (simplify (iadd ty - (iconst ty (u64_from_imm64 0)) - x)) + (iconst_u ty 0))) (subsume x)) ;; x-0 == x. (rule (simplify (isub ty x - (iconst ty (u64_from_imm64 0)))) + (iconst_u ty 0))) (subsume x)) ;; 0-x == (ineg x). (rule (simplify (isub ty - (iconst ty (u64_from_imm64 0)) + (iconst_u ty 0) x)) (ineg ty x)) +;; x + -y == -y + x == -(y - x) == x - y +(rule (simplify (iadd ty x (ineg ty y))) + (isub ty x y)) +(rule (simplify (iadd ty (ineg ty y) x)) + (isub ty x y)) +(rule (simplify (ineg ty (isub ty y x))) + (isub ty x y)) +;; x - -y == x + y +(rule (simplify (isub ty x (ineg ty y))) + (iadd ty x y)) + ;; ineg(ineg(x)) == x. (rule (simplify (ineg ty (ineg ty x))) (subsume x)) @@ -37,72 +47,49 @@ (subsume inner)) ;; x-x == 0. -(rule (simplify (isub (fits_in_64 (ty_int ty)) x x)) (subsume (iconst ty (imm64 0)))) +(rule (simplify (isub (ty_int ty) x x)) (subsume (iconst_u ty 0))) -;; x*1 == 1*x == x. +;; x*1 == x. (rule (simplify (imul ty x - (iconst ty (u64_from_imm64 1)))) - (subsume x)) -(rule (simplify (imul ty - (iconst ty (u64_from_imm64 1)) - x)) + (iconst_u ty 1))) (subsume x)) -;; x*0 == 0*x == 0. +;; x*0 == 0. (rule (simplify (imul ty _ - zero @ (iconst ty (u64_from_imm64 0)))) - (subsume zero)) -(rule (simplify (imul ty - zero @ (iconst ty (u64_from_imm64 0)) - _)) + zero @ (iconst_u ty 0))) (subsume zero)) -;; x*-1 == -1*x == ineg(x). -(rule (simplify (imul ty x (iconst ty c))) - (if-let -1 (i64_sextend_imm64 ty c)) - (ineg ty x)) -(rule (simplify (imul ty (iconst ty c) x)) - (if-let -1 (i64_sextend_imm64 ty c)) +;; x*-1 == ineg(x). +(rule (simplify (imul ty x (iconst_s ty -1))) (ineg ty x)) -;; (!x) + 1 == 1 + (!x) == !(x) - (-1) == ineg(x) -(rule (simplify (iadd ty (bnot ty x) (iconst ty (u64_from_imm64 1)))) - (ineg ty x)) -(rule (simplify (iadd ty (iconst ty (u64_from_imm64 1)) (bnot ty x))) - (ineg ty x)) -(rule (simplify (isub ty (bnot ty x) (iconst ty c))) - (if-let -1 (i64_sextend_imm64 ty c)) +;; (!x) + 1 == ineg(x) +(rule (simplify (iadd ty (bnot ty x) (iconst_u ty 1))) (ineg ty x)) -;; !(x - 1) == !(x + (-1)) == !((-1) + x) == ineg(x) -(rule (simplify (bnot ty (isub ty x (iconst ty (u64_from_imm64 1))))) - (ineg ty x)) -(rule (simplify (bnot ty (iadd ty x (iconst ty c)))) - (if-let -1 (i64_sextend_imm64 ty c)) +;; !(x - 1) == !(x + (-1)) == ineg(x) +(rule (simplify (bnot ty (isub ty x (iconst_s ty 1)))) (ineg ty x)) -(rule (simplify (bnot ty (iadd ty (iconst ty c) x))) - (if-let -1 (i64_sextend_imm64 ty c)) +(rule (simplify (bnot ty (iadd ty x (iconst_s ty -1)))) (ineg ty x)) ;; x/1 == x. (rule (simplify (sdiv ty x - (iconst ty (u64_from_imm64 1)))) + (iconst_u ty 1))) (subsume x)) (rule (simplify (udiv ty x - (iconst ty (u64_from_imm64 1)))) + (iconst_u ty 1))) (subsume x)) ;; TODO: strength reduction: div to shifts ;; TODO: div/rem by constants -> magic multiplications -;; x*2 == 2*x == x+x. -(rule (simplify (imul ty x (iconst _ (simm32 2)))) - (iadd ty x x)) -(rule (simplify (imul ty (iconst _ (simm32 2)) x)) +;; x*2 == x+x. +(rule (simplify (imul ty x (iconst_u _ 2))) (iadd ty x x)) ;; x*c == x<> bits +;; LLVM doesn't have an intrinsic for it, so you'll see it in code like +;; +(rule (simplify (sshr ty (imul ty (sextend _ x@(value_type half_ty)) + (sextend _ y@(value_type half_ty))) + (iconst_u _ k))) + (if-let $true (ty_equal half_ty (ty_half_width ty))) + (if-let $true (u64_eq k (ty_bits_u64 half_ty))) + (sextend ty (smulhi half_ty x y))) +(rule (simplify (ushr ty (imul ty (uextend _ x@(value_type half_ty)) + (uextend _ y@(value_type half_ty))) + (iconst_u _ k))) + (if-let $true (ty_equal half_ty (ty_half_width ty))) + (if-let $true (u64_eq k (ty_bits_u64 half_ty))) + (uextend ty (umulhi half_ty x y))) diff --git a/cranelift/codegen/src/opts/bitops.isle b/cranelift/codegen/src/opts/bitops.isle index 6c89e0f07d81..0f44ba47d2ec 100644 --- a/cranelift/codegen/src/opts/bitops.isle +++ b/cranelift/codegen/src/opts/bitops.isle @@ -1,53 +1,39 @@ ;; Rewrites for `band`, `bnot`, `bor`, `bxor` -;; x | 0 == 0 | x == x | x == x. +;; x | 0 == x | x == x. (rule (simplify (bor ty x - (iconst ty (u64_from_imm64 0)))) - (subsume x)) -(rule (simplify (bor ty - (iconst ty (u64_from_imm64 0)) - x)) + (iconst_u ty 0))) (subsume x)) (rule (simplify (bor ty x x)) (subsume x)) -;; x ^ 0 == 0 ^ x == x. +;; x ^ 0 == x. (rule (simplify (bxor ty x - (iconst ty (u64_from_imm64 0)))) - (subsume x)) -(rule (simplify (bxor ty - (iconst ty (u64_from_imm64 0)) - x)) + (iconst_u ty 0))) (subsume x)) ;; x ^ x == 0. -(rule (simplify (bxor (fits_in_64 (ty_int ty)) x x)) - (subsume (iconst ty (imm64 0)))) +(rule (simplify (bxor (ty_int ty) x x)) + (subsume (iconst_u ty 0))) ;; x ^ not(x) == not(x) ^ x == x | not(x) == not(x) | x == -1. ;; This identity also holds for non-integer types, vectors, and wider types. -;; But `iconst` is only valid for integers up to 64 bits wide. -(rule (simplify (bxor (fits_in_64 (ty_int ty)) x (bnot ty x))) (subsume (iconst ty (imm64 (ty_mask ty))))) -(rule (simplify (bxor (fits_in_64 (ty_int ty)) (bnot ty x) x)) (subsume (iconst ty (imm64 (ty_mask ty))))) -(rule (simplify (bor (fits_in_64 (ty_int ty)) x (bnot ty x))) (subsume (iconst ty (imm64 (ty_mask ty))))) -(rule (simplify (bor (fits_in_64 (ty_int ty)) (bnot ty x) x)) (subsume (iconst ty (imm64 (ty_mask ty))))) +(rule (simplify (bxor (ty_int ty) x (bnot ty x))) (subsume (iconst_s ty -1))) +(rule (simplify (bxor (ty_int ty) (bnot ty x) x)) (subsume (iconst_s ty -1))) +(rule (simplify (bor (ty_int ty) x (bnot ty x))) (subsume (iconst_s ty -1))) +(rule (simplify (bor (ty_int ty) (bnot ty x) x)) (subsume (iconst_s ty -1))) -;; x & -1 == -1 & x == x & x == x. +;; x & x == x & -1 == x. (rule (simplify (band ty x x)) (subsume x)) -(rule (simplify (band ty x (iconst ty k))) - (if-let -1 (i64_sextend_imm64 ty k)) - (subsume x)) -(rule (simplify (band ty (iconst ty k) x)) - (if-let -1 (i64_sextend_imm64 ty k)) +(rule (simplify (band ty x (iconst_s ty -1))) (subsume x)) -;; x & 0 == 0 & x == x & not(x) == not(x) & x == 0. -(rule (simplify (band ty _ zero @ (iconst ty (u64_from_imm64 0)))) (subsume zero)) -(rule (simplify (band ty zero @ (iconst ty (u64_from_imm64 0)) _)) (subsume zero)) -(rule (simplify (band (fits_in_64 (ty_int ty)) x (bnot ty x))) (subsume (iconst ty (imm64 0)))) -(rule (simplify (band (fits_in_64 (ty_int ty)) (bnot ty x) x)) (subsume (iconst ty (imm64 0)))) +;; x & 0 == x & not(x) == not(x) & x == 0. +(rule (simplify (band ty _ zero @ (iconst_u ty 0))) (subsume zero)) +(rule (simplify (band (ty_int ty) x (bnot ty x))) (subsume (iconst_u ty 0))) +(rule (simplify (band (ty_int ty) (bnot ty x) x)) (subsume (iconst_u ty 0))) ;; not(not(x)) == x. (rule (simplify (bnot ty (bnot ty x))) (subsume x)) @@ -82,29 +68,33 @@ ;; (No need to duplicate for commutative `bor` for this constant version because ;; we move constants to the right.) (rule (simplify (bor ty - (band ty x (iconst ty (u64_from_imm64 y))) - z @ (iconst ty (u64_from_imm64 zk)))) + (band ty x (iconst_u ty y)) + z @ (iconst_u ty zk))) (if-let $true (u64_eq (u64_and (ty_mask ty) zk) (u64_and (ty_mask ty) (u64_not y)))) (bor ty x z)) ;; (x ^ -1) can be replaced with the `bnot` instruction -(rule (simplify (bxor ty x (iconst ty k))) - (if-let -1 (i64_sextend_imm64 ty k)) +(rule (simplify (bxor ty x (iconst_s ty -1))) (bnot ty x)) ;; sshr((x | -x), N) == bmask(x) where N = ty_bits(ty) - 1. ;; ;; (x | -x) sets the sign bit to 1 if x is nonzero, and 0 if x is zero. sshr propagates ;; the sign bit to the rest of the value. -(rule (simplify (sshr ty (bor ty x (ineg ty x)) (iconst ty (u64_from_imm64 shift_amt)))) +(rule (simplify (sshr ty (bor ty x (ineg ty x)) (iconst_u ty shift_amt))) (if-let $true (u64_eq shift_amt (ty_shift_mask ty))) (bmask ty x)) -(rule (simplify (sshr ty (bor ty (ineg ty x) x) (iconst ty (u64_from_imm64 shift_amt)))) +(rule (simplify (sshr ty (bor ty (ineg ty x) x) (iconst_u ty shift_amt))) (if-let $true (u64_eq shift_amt (ty_shift_mask ty))) (bmask ty x)) +;; Since icmp is always 0 or 1, bmask is just a negation. +;; TODO: Explore whether this makes sense for things needing extension too. +(rule (simplify (bmask $I8 cmp@(icmp $I8 _ _ _))) + (ineg $I8 cmp)) + ;; Matches any expressions that preserve "truthiness". ;; i.e. If the input is zero it remains zero, and if it is nonzero it can have ;; a different value as long as it is still nonzero. @@ -118,19 +108,19 @@ (rule (truthy (popcnt _ x)) x) (rule (truthy (rotl _ x _)) x) (rule (truthy (rotr _ x _)) x) -(rule (truthy (select _ x (iconst _ (u64_from_imm64 (u64_nonzero _))) (iconst _ (u64_from_imm64 0)))) x) +(rule (truthy (select _ x (iconst_u _ (u64_nonzero _)) (iconst_u _ 0))) x) ;; (ne ty (iconst 0) v) is also canonicalized into this form via another rule -(rule (truthy (ne _ x (iconst _ (u64_from_imm64 0)))) x) +(rule (truthy (ne _ x (iconst_u _ 0))) x) ;; All of these expressions don't care about their input as long as it is truthy. ;; so we can remove expressions that preserve that property from the input. (rule (simplify (bmask ty v)) (if-let x (truthy v)) (bmask ty x)) (rule (simplify (select ty v t f)) (if-let c (truthy v)) (select ty c t f)) ;; (ne ty (iconst 0) v) is also canonicalized into this form via another rule -(rule (simplify (ne cty v (iconst _ (u64_from_imm64 0)))) +(rule (simplify (ne cty v (iconst_u _ 0))) (if-let c (truthy v)) (if-let (value_type (ty_int_ref_scalar_64 ty)) c) - (ne cty c (iconst ty (imm64 0)))) + (ne cty c (iconst_u ty 0))) @@ -157,42 +147,42 @@ ;; easy way to match all of them, so only one is matched here. (rule (simplify (bor ty @ $I32 (bor ty - (ishl ty x (iconst ty (u64_from_imm64 24))) + (ishl ty x (iconst_u ty 24)) (ishl ty - (band ty x (iconst ty (u64_from_imm64 0xff00))) - (iconst ty (u64_from_imm64 8)))) + (band ty x (iconst_u ty 0xff00)) + (iconst_u ty 8))) (bor ty (band ty - (ushr ty x (iconst ty (u64_from_imm64 8))) - (iconst ty (u64_from_imm64 0xff00))) - (ushr ty x (iconst ty (u64_from_imm64 24)))))) + (ushr ty x (iconst_u ty 8)) + (iconst_u ty 0xff00)) + (ushr ty x (iconst_u ty 24))))) (bswap ty x)) (rule (simplify (bor ty @ $I64 (bor ty (bor ty - (ishl ty x (iconst ty (u64_from_imm64 56))) + (ishl ty x (iconst_u ty 56)) (ishl ty - (band ty x (iconst ty (u64_from_imm64 0xff00))) - (iconst ty (u64_from_imm64 40)))) + (band ty x (iconst_u ty 0xff00)) + (iconst_u ty 40))) (bor ty (ishl ty - (band ty x (iconst ty (u64_from_imm64 0xff_0000))) - (iconst ty (u64_from_imm64 24))) + (band ty x (iconst_u ty 0xff_0000)) + (iconst_u ty 24)) (ishl ty - (band ty x (iconst ty (u64_from_imm64 0xff00_0000))) - (iconst ty (u64_from_imm64 8))))) + (band ty x (iconst_u ty 0xff00_0000)) + (iconst_u ty 8)))) (bor ty (bor ty (band ty - (ushr ty x (iconst ty (u64_from_imm64 8))) - (iconst ty (u64_from_imm64 0xff00_0000))) + (ushr ty x (iconst_u ty 8)) + (iconst_u ty 0xff00_0000)) (band ty - (ushr ty x (iconst ty (u64_from_imm64 24))) - (iconst ty (u64_from_imm64 0xff_0000)))) + (ushr ty x (iconst_u ty 24)) + (iconst_u ty 0xff_0000))) (bor ty (band ty - (ushr ty x (iconst ty (u64_from_imm64 40))) - (iconst ty (u64_from_imm64 0xff00))) - (ushr ty x (iconst ty (u64_from_imm64 56))))))) + (ushr ty x (iconst_u ty 40)) + (iconst_u ty 0xff00)) + (ushr ty x (iconst_u ty 56)))))) (bswap ty x)) diff --git a/cranelift/codegen/src/opts/cprop.isle b/cranelift/codegen/src/opts/cprop.isle index e44404e050e2..77b76a508232 100644 --- a/cranelift/codegen/src/opts/cprop.isle +++ b/cranelift/codegen/src/opts/cprop.isle @@ -73,11 +73,12 @@ (rule (simplify (ireduce narrow (iconst (fits_in_64 _) (u64_from_imm64 imm)))) (subsume (iconst narrow (imm64_masked narrow imm)))) -(rule (simplify (uextend (fits_in_64 wide) (iconst narrow imm))) - (subsume (iconst wide (imm64 (u64_uextend_imm64 narrow imm))))) - -(rule (simplify (sextend (fits_in_64 wide) (iconst narrow imm))) - (subsume (iconst wide (imm64_masked wide (i64_as_u64 (i64_sextend_imm64 narrow imm)))))) +;; iconst_[su] support $I128, but do so by extending, so restricting to +;; 64-bit or smaller keeps it from just remaking essentially the same thing. +(rule (simplify (uextend (fits_in_64 wide) (iconst_u narrow k))) + (subsume (iconst_u wide k))) +(rule (simplify (sextend (fits_in_64 wide) (iconst_s narrow k))) + (subsume (iconst_s wide k))) (rule (simplify (icmp result_ty @@ -166,12 +167,20 @@ (bxor ty (bxor ty x k1 @ (iconst ty _)) k2 @ (iconst ty _))) (bxor ty x (bxor ty k1 k2))) -(rule (simplify - (select ty (iconst _ (u64_from_imm64 (u64_nonzero _))) x y)) - x) -(rule (simplify - (select ty (iconst _ (u64_from_imm64 0)) x y)) - y) +(rule (simplify (select ty (iconst_u _ (u64_nonzero _)) x _)) + (subsume x)) +(rule (simplify (select ty (iconst_u _ 0) _ y)) + (subsume y)) + +;; Replace subtraction by a "negative" constant with addition. +;; Notably, this gives `x - (-1) == x + 1`, so other patterns don't have to +;; match the subtract-negative-one version too. +;; TODO: it would be nice to do this for `x + (-1) == x - 1` as well, but +;; that needs work in lowering first to avoid regressing addressing modes. + +(rule (simplify (isub ty x (iconst_s ty k))) + (if-let $true (u64_lt (i64_as_u64 (i64_neg k)) (i64_as_u64 k))) + (iadd ty x (iconst ty (imm64_masked ty (i64_as_u64 (i64_neg k)))))) ;; TODO: fadd, fsub, fmul, fdiv, fneg, fabs @@ -235,3 +244,23 @@ (bxor ty a b@(iconst _ _)) (bxor ty c d@(iconst _ _)))) (bxor ty (bxor ty a c) (bxor ty b d))) + + +;; Constant fold int-to-float conversions. +(rule (simplify (fcvt_from_uint $F32 (iconst_u _ n))) + (f32const $F32 (f32_from_uint n))) +(rule (simplify (fcvt_from_uint $F64 (iconst_u _ n))) + (f64const $F64 (f64_from_uint n))) +(rule (simplify (fcvt_from_sint $F32 (iconst_s _ n))) + (f32const $F32 (f32_from_sint n))) +(rule (simplify (fcvt_from_sint $F64 (iconst_s _ n))) + (f64const $F64 (f64_from_sint n))) + +(decl f32_from_uint (u64) Ieee32) +(extern constructor f32_from_uint f32_from_uint) +(decl f64_from_uint (u64) Ieee64) +(extern constructor f64_from_uint f64_from_uint) +(decl f32_from_sint (i64) Ieee32) +(extern constructor f32_from_sint f32_from_sint) +(decl f64_from_sint (i64) Ieee64) +(extern constructor f64_from_sint f64_from_sint) diff --git a/cranelift/codegen/src/opts/extends.isle b/cranelift/codegen/src/opts/extends.isle index a1a4dfda0596..268407b0748a 100644 --- a/cranelift/codegen/src/opts/extends.isle +++ b/cranelift/codegen/src/opts/extends.isle @@ -4,15 +4,23 @@ (rule (simplify (sextend ty (sextend _intermediate_ty x))) (sextend ty x)) +;; Once something has be `uextend`ed, further `sextend`ing is the same as `uextend` +(rule (simplify (sextend ty (uextend _intermediate_ty x))) + (uextend ty x)) + +;; `icmp` is zero or one, so sign-extending is the same as zero-extending +(rule (simplify (sextend ty x@(icmp _ _ _ _))) + (uextend ty x)) + ;; Masking out any of the top bits of the result of `uextend` is a no-op. (This ;; is like a cheap version of known-bits analysis.) -(rule (simplify (band wide x @ (uextend _ (value_type narrow)) (iconst _ (u64_from_imm64 mask)))) +(rule (simplify (band wide x @ (uextend _ (value_type narrow)) (iconst_u _ mask))) ; Check that `narrow_mask` has a subset of the bits that `mask` does. (if-let $true (let ((narrow_mask u64 (ty_mask narrow))) (u64_eq narrow_mask (u64_and mask narrow_mask)))) x) ;; Masking out the sign-extended bits of an `sextend` turns it into a `uextend`. -(rule (simplify (band wide (sextend _ x @ (value_type narrow)) (iconst _ (u64_from_imm64 mask)))) +(rule (simplify (band wide (sextend _ x @ (value_type narrow)) (iconst_u _ mask))) (if-let $true (u64_eq mask (ty_mask narrow))) (uextend wide x)) @@ -20,15 +28,97 @@ (rule (simplify (slt ty (uextend $I64 x @ (value_type $I32)) - (iconst _ (u64_from_imm64 0)))) - (iconst ty (imm64 0))) + (iconst_u _ 0))) + (subsume (iconst_u ty 0))) (rule (simplify (sge ty (uextend $I64 x @ (value_type $I32)) - (iconst _ (u64_from_imm64 0)))) - (iconst ty (imm64 1))) + (iconst_u _ 0))) + (subsume (iconst_u ty 1))) + +;; Sign-extending can't change whether a number is zero nor how it signed-compares to zero +(rule (simplify (eq _ (sextend _ x@(value_type ty)) (iconst_s _ 0))) + (eq ty x (iconst_s ty 0))) +(rule (simplify (ne _ (sextend _ x@(value_type ty)) (iconst_s _ 0))) + (ne ty x (iconst_s ty 0))) +(rule (simplify (icmp _ cc (sextend _ x@(value_type ty)) (iconst_s _ 0))) + (if (signed_cond_code cc)) + (icmp ty cc x (iconst_s ty 0))) ;; A reduction-of-an-extend back to the same original type is the same as not ;; actually doing the extend in the first place. -(rule (simplify (ireduce ty (sextend _ x @ (value_type ty)))) x) -(rule (simplify (ireduce ty (uextend _ x @ (value_type ty)))) x) +(rule (simplify (ireduce ty (sextend _ x @ (value_type ty)))) (subsume x)) +(rule (simplify (ireduce ty (uextend _ x @ (value_type ty)))) (subsume x)) + +;; A reduction-of-an-extend that's not just to the original type is either: +;; a reduction of the original if the final type is smaller, or +(rule (simplify (ireduce (ty_int ty_final) (sextend _ inner@(value_type ty_initial)))) + (if-let $true (u64_lt (ty_bits_u64 ty_final) (ty_bits_u64 ty_initial))) + (ireduce ty_final inner)) +(rule (simplify (ireduce (ty_int ty_final) (uextend _ inner@(value_type ty_initial)))) + (if-let $true (u64_lt (ty_bits_u64 ty_final) (ty_bits_u64 ty_initial))) + (ireduce ty_final inner)) +;; an extension of the original if the final type is larger. +(rule (simplify (ireduce (ty_int ty_final) (sextend _ inner@(value_type ty_initial)))) + (if-let $true (u64_lt (ty_bits_u64 ty_initial) (ty_bits_u64 ty_final))) + (sextend ty_final inner)) +(rule (simplify (ireduce (ty_int ty_final) (uextend _ inner@(value_type ty_initial)))) + (if-let $true (u64_lt (ty_bits_u64 ty_initial) (ty_bits_u64 ty_final))) + (uextend ty_final inner)) + +;; `band`, `bor`, and `bxor` can't affect any bits that aren't set in the one of +;; the inputs, so they can be pushed down inside `uextend`s +(rule (simplify (band bigty (uextend _ x@(value_type smallty)) (uextend _ y@(value_type smallty)))) + (uextend bigty (band smallty x y))) +(rule (simplify (bor bigty (uextend _ x@(value_type smallty)) (uextend _ y@(value_type smallty)))) + (uextend bigty (bor smallty x y))) +(rule (simplify (bxor bigty (uextend _ x@(value_type smallty)) (uextend _ y@(value_type smallty)))) + (uextend bigty (bxor smallty x y))) + +;; Matches values where `ireducing` them will not actually introduce another +;; instruction, since other rules will collapse them with the reduction. +(decl pure multi will_simplify_with_ireduce_rec (u8 Value) Value) +(rule (will_simplify_with_ireduce_rec _ x@(uextend _ _)) x) +(rule (will_simplify_with_ireduce_rec _ x@(sextend _ _)) x) +(rule (will_simplify_with_ireduce_rec _ x@(iconst _ _)) x) +(rule (will_simplify_with_ireduce_rec depth x@(unary_op _ _ a)) + (if-let _ (u8_lt 0 depth)) + (if-let _ (reducible_modular_op x)) + (if-let _ (will_simplify_with_ireduce_rec (u8_sub depth 1) a)) + x) +(rule (will_simplify_with_ireduce_rec depth x@(binary_op _ _ a b)) + (if-let _ (u8_lt 0 depth)) + (if-let _ (reducible_modular_op x)) + (if-let _ (will_simplify_with_ireduce_rec (u8_sub depth 1) a)) + (if-let _ (will_simplify_with_ireduce_rec (u8_sub depth 1) b)) + x) + +(decl pure multi will_simplify_with_ireduce (Value) Value) +(rule (will_simplify_with_ireduce x) + (will_simplify_with_ireduce_rec 2 x)) + +;; Matches values where the high bits of the input don't affect lower bits of +;; the output, and thus the inputs can be reduced before the operation rather +;; than doing the wide operation then reducing afterwards. +(decl pure multi reducible_modular_op (Value) Value) +(rule (reducible_modular_op x@(ineg _ _)) x) +(rule (reducible_modular_op x@(bnot _ _)) x) +(rule (reducible_modular_op x@(iadd _ _ _)) x) +(rule (reducible_modular_op x@(isub _ _ _)) x) +(rule (reducible_modular_op x@(imul _ _ _)) x) +(rule (reducible_modular_op x@(bor _ _ _)) x) +(rule (reducible_modular_op x@(bxor _ _ _)) x) +(rule (reducible_modular_op x@(band _ _ _)) x) + +;; Replace `(small)(x OP y)` with `(small)x OP (small)y` in cases where that's +;; legal and it reduces the total number of instructions since the reductions +;; to the arguments simplify further. +(rule (simplify (ireduce smallty val@(unary_op _ op x))) + (if-let _ (reducible_modular_op val)) + (if-let _ (will_simplify_with_ireduce x)) + (unary_op smallty op (ireduce smallty x))) +(rule (simplify (ireduce smallty val@(binary_op _ op x y))) + (if-let _ (reducible_modular_op val)) + (if-let _ (will_simplify_with_ireduce x)) + (if-let _ (will_simplify_with_ireduce y)) + (binary_op smallty op (ireduce smallty x) (ireduce smallty y))) diff --git a/cranelift/codegen/src/opts/icmp.isle b/cranelift/codegen/src/opts/icmp.isle index b0f57fdf1566..f7d20fa3d322 100644 --- a/cranelift/codegen/src/opts/icmp.isle +++ b/cranelift/codegen/src/opts/icmp.isle @@ -2,26 +2,26 @@ ;; `x == x` is always true for integers; `x != x` is false. Strict ;; inequalities are false, and loose inequalities are true. -(rule (simplify (eq (fits_in_64 (ty_int ty)) x x)) (iconst ty (imm64 1))) -(rule (simplify (ne (fits_in_64 (ty_int ty)) x x)) (iconst ty (imm64 0))) -(rule (simplify (ugt (fits_in_64 (ty_int ty)) x x)) (iconst ty (imm64 0))) -(rule (simplify (uge (fits_in_64 (ty_int ty)) x x)) (iconst ty (imm64 1))) -(rule (simplify (sgt (fits_in_64 (ty_int ty)) x x)) (iconst ty (imm64 0))) -(rule (simplify (sge (fits_in_64 (ty_int ty)) x x)) (iconst ty (imm64 1))) -(rule (simplify (ult (fits_in_64 (ty_int ty)) x x)) (iconst ty (imm64 0))) -(rule (simplify (ule (fits_in_64 (ty_int ty)) x x)) (iconst ty (imm64 1))) -(rule (simplify (slt (fits_in_64 (ty_int ty)) x x)) (iconst ty (imm64 0))) -(rule (simplify (sle (fits_in_64 (ty_int ty)) x x)) (iconst ty (imm64 1))) +(rule (simplify (eq (ty_int ty) x x)) (subsume (iconst_u ty 1))) +(rule (simplify (ne (ty_int ty) x x)) (subsume (iconst_u ty 0))) +(rule (simplify (ugt (ty_int ty) x x)) (subsume (iconst_u ty 0))) +(rule (simplify (uge (ty_int ty) x x)) (subsume (iconst_u ty 1))) +(rule (simplify (sgt (ty_int ty) x x)) (subsume (iconst_u ty 0))) +(rule (simplify (sge (ty_int ty) x x)) (subsume (iconst_u ty 1))) +(rule (simplify (ult (ty_int ty) x x)) (subsume (iconst_u ty 0))) +(rule (simplify (ule (ty_int ty) x x)) (subsume (iconst_u ty 1))) +(rule (simplify (slt (ty_int ty) x x)) (subsume (iconst_u ty 0))) +(rule (simplify (sle (ty_int ty) x x)) (subsume (iconst_u ty 1))) ;; Optimize icmp-of-icmp. (rule (simplify (ne ty - (uextend _ inner @ (icmp ty _ _ _)) - (iconst _ (u64_from_imm64 0)))) + (uextend_maybe _ inner @ (icmp ty _ _ _)) + (iconst_u _ 0))) (subsume inner)) (rule (simplify (eq ty - (uextend _ (icmp ty cc x y)) - (iconst _ (u64_from_imm64 0)))) + (uextend_maybe _ (icmp ty cc x y)) + (iconst_u _ 0))) (subsume (icmp ty (intcc_complement cc) x y))) ;; Optimize select-of-uextend-of-icmp to select-of-icmp, because @@ -39,88 +39,88 @@ (rule (simplify (band (ty_int _) cmp @ (icmp _ _ _ _) - (iconst _ (u64_from_imm64 1)))) + (iconst_u _ 1))) cmp) (rule (simplify (band (ty_int _) extend @ (uextend _ (icmp _ _ _ _)) - (iconst _ (u64_from_imm64 1)))) + (iconst_u _ 1))) extend) ;; Comparisons against largest/smallest signed/unsigned values: ;; ult(x, 0) == false. -(rule (simplify (ult (fits_in_64 (ty_int bty)) x zero @ (iconst _ (u64_from_imm64 0)))) - (subsume (iconst bty (imm64 0)))) +(rule (simplify (ult (fits_in_64 (ty_int bty)) x zero @ (iconst_u _ 0))) + (subsume (iconst_u bty 0))) ;; ule(x, 0) == eq(x, 0) -(rule (simplify (ule (fits_in_64 (ty_int bty)) x zero @ (iconst _ (u64_from_imm64 0)))) +(rule (simplify (ule (fits_in_64 (ty_int bty)) x zero @ (iconst_u _ 0))) (eq bty x zero)) ;; ugt(x, 0) == ne(x, 0). -(rule (simplify (ugt (fits_in_64 (ty_int bty)) x zero @ (iconst _ (u64_from_imm64 0)))) +(rule (simplify (ugt (fits_in_64 (ty_int bty)) x zero @ (iconst_u _ 0))) (ne bty x zero)) ;; uge(x, 0) == true. -(rule (simplify (uge (fits_in_64 (ty_int bty)) x zero @ (iconst _ (u64_from_imm64 0)))) - (subsume (iconst bty (imm64 1)))) +(rule (simplify (uge (fits_in_64 (ty_int bty)) x zero @ (iconst_u _ 0))) + (subsume (iconst_u bty 1))) ;; ult(x, UMAX) == ne(x, UMAX). -(rule (simplify (ult (fits_in_64 (ty_int bty)) x umax @ (iconst cty (u64_from_imm64 y)))) +(rule (simplify (ult (fits_in_64 (ty_int bty)) x umax @ (iconst_u cty y))) (if-let $true (u64_eq y (ty_umax cty))) (ne bty x umax)) ;; ule(x, UMAX) == true. -(rule (simplify (ule (fits_in_64 (ty_int bty)) x umax @ (iconst cty (u64_from_imm64 y)))) +(rule (simplify (ule (fits_in_64 (ty_int bty)) x umax @ (iconst_u cty y))) (if-let $true (u64_eq y (ty_umax cty))) - (subsume (iconst bty (imm64 1)))) + (subsume (iconst_u bty 1))) ;; ugt(x, UMAX) == false. -(rule (simplify (ugt (fits_in_64 (ty_int bty)) x umax @ (iconst cty (u64_from_imm64 y)))) +(rule (simplify (ugt (fits_in_64 (ty_int bty)) x umax @ (iconst_u cty y))) (if-let $true (u64_eq y (ty_umax cty))) - (subsume (iconst bty (imm64 0)))) + (subsume (iconst_u bty 0))) ;; uge(x, UMAX) == eq(x, UMAX). -(rule (simplify (uge (fits_in_64 (ty_int bty)) x umax @ (iconst cty (u64_from_imm64 y)))) +(rule (simplify (uge (fits_in_64 (ty_int bty)) x umax @ (iconst_u cty y))) (if-let $true (u64_eq y (ty_umax cty))) (eq bty x umax)) ;; slt(x, SMIN) == false. -(rule (simplify (slt (fits_in_64 (ty_int bty)) x smin @ (iconst cty (u64_from_imm64 y)))) +(rule (simplify (slt (fits_in_64 (ty_int bty)) x smin @ (iconst_u cty y))) (if-let $true (u64_eq y (ty_smin cty))) - (subsume (iconst bty (imm64 0)))) + (subsume (iconst_u bty 0))) ;; sle(x, SMIN) == eq(x, SMIN). -(rule (simplify (sle (fits_in_64 (ty_int bty)) x smin @ (iconst cty (u64_from_imm64 y)))) +(rule (simplify (sle (fits_in_64 (ty_int bty)) x smin @ (iconst_u cty y))) (if-let $true (u64_eq y (ty_smin cty))) (eq bty x smin)) ;; sgt(x, SMIN) == ne(x, SMIN). -(rule (simplify (sgt (fits_in_64 (ty_int bty)) x smin @ (iconst cty (u64_from_imm64 y)))) +(rule (simplify (sgt (fits_in_64 (ty_int bty)) x smin @ (iconst_u cty y))) (if-let $true (u64_eq y (ty_smin cty))) (ne bty x smin)) ;; sge(x, SMIN) == true. -(rule (simplify (sge (fits_in_64 (ty_int bty)) x smin @ (iconst cty (u64_from_imm64 y)))) +(rule (simplify (sge (fits_in_64 (ty_int bty)) x smin @ (iconst_u cty y))) (if-let $true (u64_eq y (ty_smin cty))) - (subsume (iconst bty (imm64 1)))) + (subsume (iconst_u bty 1))) ;; slt(x, SMAX) == ne(x, SMAX). -(rule (simplify (slt (fits_in_64 (ty_int bty)) x smax @ (iconst cty (u64_from_imm64 y)))) +(rule (simplify (slt (fits_in_64 (ty_int bty)) x smax @ (iconst_u cty y))) (if-let $true (u64_eq y (ty_smax cty))) (ne bty x smax)) ;; sle(x, SMAX) == true. -(rule (simplify (sle (fits_in_64 (ty_int bty)) x smax @ (iconst cty (u64_from_imm64 y)))) +(rule (simplify (sle (fits_in_64 (ty_int bty)) x smax @ (iconst_u cty y))) (if-let $true (u64_eq y (ty_smax cty))) - (subsume (iconst bty (imm64 1)))) + (subsume (iconst_u bty 1))) ;; sgt(x, SMAX) == false. -(rule (simplify (sgt (fits_in_64 (ty_int bty)) x smax @ (iconst cty (u64_from_imm64 y)))) +(rule (simplify (sgt (fits_in_64 (ty_int bty)) x smax @ (iconst_u cty y))) (if-let $true (u64_eq y (ty_smax cty))) - (subsume (iconst bty (imm64 0)))) + (subsume (iconst_u bty 0))) ;; sge(x, SMAX) == eq(x, SMAX). -(rule (simplify (sge (fits_in_64 (ty_int bty)) x smax @ (iconst cty (u64_from_imm64 y)))) +(rule (simplify (sge (fits_in_64 (ty_int bty)) x smax @ (iconst_u cty y))) (if-let $true (u64_eq y (ty_smax cty))) (eq bty x smax)) @@ -133,6 +133,26 @@ (if-let signed (intcc_comparable cc1 cc2)) (compose_icmp ty (u64_or (decompose_intcc cc1) (decompose_intcc cc2)) signed x y)) +;; Prefer comparing against zero +;; uge(x, 1) == ne(x, 0) +(rule (simplify (uge ty x (iconst_u cty 1))) + (ne ty x (iconst_u cty 0))) +;; ult(x, 1) == eq(x, 0) +(rule (simplify (ult ty x (iconst_u cty 1))) + (eq ty x (iconst_u cty 0))) +;; sge(x, 1) == sgt(x, 0) +(rule (simplify (sge ty x (iconst_s cty 1))) + (sgt ty x (iconst_s cty 0))) +;; slt(x, 1) == sle(x, 0) +(rule (simplify (slt ty x (iconst_s cty 1))) + (sle ty x (iconst_s cty 0))) +;; sgt(x, -1) == sge(x, 0) +(rule (simplify (sgt ty x (iconst_s cty -1))) + (sge ty x (iconst_s cty 0))) +;; sle(x, -1) == slt(x, 0) +(rule (simplify (sle ty x (iconst_s cty -1))) + (slt ty x (iconst_s cty 0))) + (decl pure partial intcc_comparable (IntCC IntCC) bool) (rule (intcc_comparable x y) (if-let (u64_nonzero class) (u64_and (intcc_class x) (intcc_class y))) @@ -151,7 +171,7 @@ (rule (decompose_intcc (IntCC.NotEqual)) 6) (decl compose_icmp (Type u64 bool Value Value) Value) -(rule (compose_icmp ty 0 _ _ _) (subsume (iconst ty (imm64 0)))) +(rule (compose_icmp ty 0 _ _ _) (subsume (iconst_u ty 0))) (rule (compose_icmp ty 1 _ x y) (icmp ty (IntCC.Equal) x y)) (rule (compose_icmp ty 2 $false x y) (icmp ty (IntCC.UnsignedLessThan) x y)) (rule (compose_icmp ty 2 $true x y) (icmp ty (IntCC.SignedLessThan) x y)) @@ -162,7 +182,7 @@ (rule (compose_icmp ty 5 $false x y) (icmp ty (IntCC.UnsignedGreaterThanOrEqual) x y)) (rule (compose_icmp ty 5 $true x y) (icmp ty (IntCC.SignedGreaterThanOrEqual) x y)) (rule (compose_icmp ty 6 _ x y) (icmp ty (IntCC.NotEqual) x y)) -(rule (compose_icmp ty 7 _ _ _) (subsume (iconst ty (imm64 1)))) +(rule (compose_icmp ty 7 _ _ _) (subsume (iconst_u ty 1))) (decl pure intcc_class (IntCC) u64) (rule (intcc_class (IntCC.UnsignedLessThan)) 1) diff --git a/cranelift/codegen/src/opts/selects.isle b/cranelift/codegen/src/opts/selects.isle index e66250327c15..d0e06f855604 100644 --- a/cranelift/codegen/src/opts/selects.isle +++ b/cranelift/codegen/src/opts/selects.isle @@ -4,6 +4,24 @@ (rule (simplify (select ty _ x x)) x) (rule (simplify (bitselect ty _ x x)) x) +;; Push zeroes to the right -- this makes the select `truthy`, as used elsewhere +;; if icmp { 0 } else { nonzero } => if !icmp { nonzero } else { 0 } +(rule (simplify (select sty (icmp cty cc x y) + zero@(iconst_u _ 0) + nonzero@(iconst_u _ (u64_nonzero _)))) + (select sty (icmp cty (intcc_complement cc) x y) nonzero zero)) + +;; if icmp(x, y) { 1 } else { 0 } => uextend(icmp(x, y)) +(rule (simplify (select ty cmp@(icmp _ cc x y) + (iconst_u _ 1) + (iconst_u _ 0))) + (uextend_maybe ty cmp)) +;; if icmp(x, y) { -1 } else { 0 } => uextend(icmp(x, y)) +(rule (simplify (select ty cmp@(icmp _ cc x y) + (iconst_s _ -1) + (iconst_s _ 0))) + (bmask ty cmp)) + ;; Transform select-of-icmp into {u,s}{min,max} instructions where possible. (rule (simplify (select ty (sgt _ x y) x y)) (smax ty x y)) (rule (simplify (select ty (sge _ x y) x y)) (smax ty x y)) diff --git a/cranelift/codegen/src/opts/shifts.isle b/cranelift/codegen/src/opts/shifts.isle index 272c5c90bf65..290e4d148a3f 100644 --- a/cranelift/codegen/src/opts/shifts.isle +++ b/cranelift/codegen/src/opts/shifts.isle @@ -3,23 +3,23 @@ ;; x>>0 == x<<0 == x rotr 0 == x rotl 0 == x. (rule (simplify (ishl ty x - (iconst ty (u64_from_imm64 0)))) + (iconst_u ty 0))) (subsume x)) (rule (simplify (ushr ty x - (iconst ty (u64_from_imm64 0)))) + (iconst_u ty 0))) (subsume x)) (rule (simplify (sshr ty x - (iconst ty (u64_from_imm64 0)))) + (iconst_u ty 0))) (subsume x)) (rule (simplify (rotr ty x - (iconst ty (u64_from_imm64 0)))) + (iconst_u ty 0))) (subsume x)) (rule (simplify (rotl ty x - (iconst ty (u64_from_imm64 0)))) + (iconst_u ty 0))) (subsume x)) ;; `(x >> k) << k` is the same as masking off the bottom `k` bits (regardless if @@ -50,9 +50,8 @@ (rule (simplify (sshr wide (ishl wide (uextend wide x @ (value_type narrow)) - (iconst _ shift)) - (iconst _ shift))) - (if-let (u64_from_imm64 shift_u64) shift) + (iconst_u _ shift_u64)) + (iconst_u _ shift_u64))) (if-let $true (u64_eq shift_u64 (u64_sub (ty_bits_u64 wide) (ty_bits_u64 narrow)))) (sextend wide x)) @@ -62,9 +61,8 @@ (rule (simplify (sshr wide (ishl wide x @ (uextend wide (value_type narrow)) - (iconst _ shift)) - (iconst _ shift))) - (if-let (u64_from_imm64 shift_u64) shift) + (iconst_u _ shift_u64)) + (iconst_u _ shift_u64))) (if-let $true (u64_lt shift_u64 (u64_sub (ty_bits_u64 wide) (ty_bits_u64 narrow)))) x) @@ -73,9 +71,8 @@ (rule (simplify (sshr wide (ishl wide x @ (sextend wide (value_type narrow)) - (iconst _ shift)) - (iconst _ shift))) - (if-let (u64_from_imm64 shift_u64) shift) + (iconst_u _ shift_u64)) + (iconst_u _ shift_u64))) (if-let $true (u64_le shift_u64 (u64_sub (ty_bits_u64 wide) (ty_bits_u64 narrow)))) x) @@ -99,7 +96,7 @@ (rule (shift_amt_to_type 32) $I32) ;; ineg(ushr(x, k)) == sshr(x, k) when k == ty_bits - 1. -(rule (simplify (ineg ty (ushr ty x sconst @ (iconst ty (u64_from_imm64 shift_amt))))) +(rule (simplify (ineg ty (ushr ty x sconst @ (iconst_u ty shift_amt)))) (if-let $true (u64_eq shift_amt (ty_shift_mask ty))) (sshr ty x sconst)) @@ -153,31 +150,31 @@ ;; (ushr (ushr x k1) k2) == (ushr x (add k1 k2)) if shift_mask(k1) + shift_mask(k2) < ty_bits ;; (sshr (sshr x k1) k2) == (sshr x (add k1 k2)) if shift_mask(k1) + shift_mask(k2) < ty_bits (rule (simplify (ishl ty - (ishl ty x (iconst kty (u64_from_imm64 k1))) - (iconst _ (u64_from_imm64 k2)))) + (ishl ty x (iconst_u kty k1)) + (iconst_u _ k2))) (if-let shift_amt (u64_add (u64_and k1 (ty_shift_mask ty)) (u64_and k2 (ty_shift_mask ty)))) (if-let $true (u64_lt shift_amt (ty_bits_u64 (lane_type ty)))) - (ishl ty x (iconst_u64 kty shift_amt))) + (ishl ty x (iconst_u kty shift_amt))) (rule (simplify (ushr ty - (ushr ty x (iconst kty (u64_from_imm64 k1))) - (iconst _ (u64_from_imm64 k2)))) + (ushr ty x (iconst_u kty k1)) + (iconst_u _ k2))) (if-let shift_amt (u64_add (u64_and k1 (ty_shift_mask ty)) (u64_and k2 (ty_shift_mask ty)))) (if-let $true (u64_lt shift_amt (ty_bits_u64 (lane_type ty)))) - (ushr ty x (iconst_u64 kty shift_amt))) + (ushr ty x (iconst_u kty shift_amt))) (rule (simplify (sshr ty - (sshr ty x (iconst kty (u64_from_imm64 k1))) - (iconst _ (u64_from_imm64 k2)))) + (sshr ty x (iconst_u kty k1)) + (iconst_u _ k2))) (if-let shift_amt (u64_add (u64_and k1 (ty_shift_mask ty)) (u64_and k2 (ty_shift_mask ty)))) (if-let $true (u64_lt shift_amt (ty_bits_u64 (lane_type ty)))) - (sshr ty x (iconst_u64 kty shift_amt))) + (sshr ty x (iconst_u kty shift_amt))) ;; Simliarly, if the shift amount overflows the type, then we can turn ;; it into a 0 @@ -185,22 +182,22 @@ ;; (ishl (ishl x k1) k2) == 0 if shift_mask(k1) + shift_mask(k2) >= ty_bits ;; (ushr (ushr x k1) k2) == 0 if shift_mask(k1) + shift_mask(k2) >= ty_bits (rule (simplify (ishl ty - (ishl ty x (iconst _ (u64_from_imm64 k1))) - (iconst _ (u64_from_imm64 k2)))) + (ishl ty x (iconst_u _ k1)) + (iconst_u _ k2))) (if-let shift_amt (u64_add (u64_and k1 (ty_shift_mask ty)) (u64_and k2 (ty_shift_mask ty)))) (if-let $true (u64_le (ty_bits_u64 ty) shift_amt)) - (subsume (iconst_u64 ty 0))) + (subsume (iconst_u ty 0))) (rule (simplify (ushr ty - (ushr ty x (iconst _ (u64_from_imm64 k1))) - (iconst _ (u64_from_imm64 k2)))) + (ushr ty x (iconst_u _ k1)) + (iconst_u _ k2))) (if-let shift_amt (u64_add (u64_and k1 (ty_shift_mask ty)) (u64_and k2 (ty_shift_mask ty)))) (if-let $true (u64_le (ty_bits_u64 ty) shift_amt)) - (subsume (iconst_u64 ty 0))) + (subsume (iconst_u ty 0))) ;; (rotl (rotr x y) y) == x ;; (rotr (rotl x y) y) == x @@ -293,18 +290,18 @@ ;; (op x k) == (op x (and k (ty_shift_mask ty))) ;; ;; where `op` is one of ishl, ushr, sshr, rotl, rotr -(rule (simplify (ishl ty x (iconst kty (u64_from_imm64 k)))) +(rule (simplify (ishl ty x (iconst_u kty k))) (if-let $false (u64_eq k (u64_and k (ty_shift_mask ty)))) - (ishl ty x (iconst kty (imm64 (u64_and k (ty_shift_mask ty)))))) -(rule (simplify (ushr ty x (iconst kty (u64_from_imm64 k)))) + (ishl ty x (iconst_u kty (u64_and k (ty_shift_mask ty))))) +(rule (simplify (ushr ty x (iconst_u kty k))) (if-let $false (u64_eq k (u64_and k (ty_shift_mask ty)))) - (ushr ty x (iconst kty (imm64 (u64_and k (ty_shift_mask ty)))))) -(rule (simplify (sshr ty x (iconst kty (u64_from_imm64 k)))) + (ushr ty x (iconst_u kty (u64_and k (ty_shift_mask ty))))) +(rule (simplify (sshr ty x (iconst_u kty k))) (if-let $false (u64_eq k (u64_and k (ty_shift_mask ty)))) - (sshr ty x (iconst kty (imm64 (u64_and k (ty_shift_mask ty)))))) -(rule (simplify (rotr ty x (iconst kty (u64_from_imm64 k)))) + (sshr ty x (iconst_u kty (u64_and k (ty_shift_mask ty))))) +(rule (simplify (rotr ty x (iconst_u kty k))) (if-let $false (u64_eq k (u64_and k (ty_shift_mask ty)))) - (rotr ty x (iconst kty (imm64 (u64_and k (ty_shift_mask ty)))))) -(rule (simplify (rotl ty x (iconst kty (u64_from_imm64 k)))) + (rotr ty x (iconst_u kty (u64_and k (ty_shift_mask ty))))) +(rule (simplify (rotl ty x (iconst_u kty k))) (if-let $false (u64_eq k (u64_and k (ty_shift_mask ty)))) - (rotl ty x (iconst kty (imm64 (u64_and k (ty_shift_mask ty)))))) + (rotl ty x (iconst_u kty (u64_and k (ty_shift_mask ty))))) diff --git a/cranelift/codegen/src/opts/spaceship.isle b/cranelift/codegen/src/opts/spaceship.isle new file mode 100644 index 000000000000..a834aa49e4cf --- /dev/null +++ b/cranelift/codegen/src/opts/spaceship.isle @@ -0,0 +1,194 @@ +;; Simplifications for C++20's `<=>` "spaceship" operator, aka Rust's `Ord::cmp`. +;; +;; There's no cranelift instruction for this, nor usually a machine instruction. +;; Inspired by +;; we canonicalize the various implementations of `x <=> y` to `(x > y) - (x < y)`. + +;; Unfortunately, there's at least 3!×2 reasonable ways to write this as nested +;; selects, and no broad agreement which is the best -- notably Rust 1.74 and +;; Clang 17 use different sequences -- so we just match all of them. + +;; x < y ? -1 : x == y ? 0 : +1 +;; x < y ? -1 : x != y ? +1 : 0 +(rule (simplify (select ty (ult rty x y) + (iconst_s ty -1) + (uextend_maybe ty (ne rty x y)))) + (sextend_maybe ty (spaceship_u rty x y))) +;; x < y ? -1 : x <= y ? 0 : +1 +;; x < y ? -1 : x > y ? +1 : 0 +(rule (simplify (select ty (ult rty x y) + (iconst_s ty -1) + (uextend_maybe ty (ugt rty x y)))) + (sextend_maybe ty (spaceship_u rty x y))) + +;; x == y ? 0 : x < y ? -1 : +1 +(rule (simplify (select ty (eq rty x y) + (iconst_s ty 0) + (select ty (ult rty x y) + (iconst_s ty -1) + (iconst_s ty 1)))) + (sextend_maybe ty (spaceship_u rty x y))) +;; x == y ? 0 : x <= y ? -1 : +1 +(rule (simplify (select ty (eq rty x y) + (iconst_s ty 0) + (select ty (ule rty x y) + (iconst_s ty -1) + (iconst_s ty 1)))) + (sextend_maybe ty (spaceship_u rty x y))) +;; x == y ? 0 : x > y ? +1 : -1 +(rule (simplify (select ty (eq rty x y) + (iconst_s ty 0) + (select ty (ugt rty x y) + (iconst_s ty 1) + (iconst_s ty -1)))) + (sextend_maybe ty (spaceship_u rty x y))) +;; x == y ? 0 : x >= y ? +1 : -1 +(rule (simplify (select ty (eq rty x y) + (iconst_s ty 0) + (select ty (uge rty x y) + (iconst_s ty 1) + (iconst_s ty -1)))) + (sextend_maybe ty (spaceship_u rty x y))) + +;; x > y ? 1 : x < y ? -1 : 0 +;; x > y ? 1 : x >= y ? 0 : -1 +(rule (simplify (select ty (ugt rty x y) + (iconst_s ty 1) + (ineg rty (ult rty x y)))) + (sextend_maybe ty (spaceship_u rty x y))) +(rule (simplify (select ty (ugt rty x y) + (iconst_s ty 1) + (bmask ty (ult rty x y)))) + (sextend_maybe ty (spaceship_u rty x y))) +;; x > y ? 1 : x != y ? -1 : 0 +;; x > y ? 1 : x == y ? 0 : -1 +(rule (simplify (select ty (ugt rty x y) + (iconst_s ty 1) + (ineg rty (ne rty x y)))) + (sextend_maybe ty (spaceship_u rty x y))) +(rule (simplify (select ty (ugt rty x y) + (iconst_s ty 1) + (bmask ty (ne rty x y)))) + (sextend_maybe ty (spaceship_u rty x y))) + +;; Same, but for signed comparisons this time + +;; x < y ? -1 : x == y ? 0 : +1 +;; x < y ? -1 : x != y ? +1 : 0 +(rule (simplify (select ty (slt rty x y) + (iconst_s ty -1) + (uextend_maybe ty (ne rty x y)))) + (sextend_maybe ty (spaceship_s rty x y))) +;; x < y ? -1 : x <= y ? 0 : +1 +;; x < y ? -1 : x > y ? +1 : 0 +(rule (simplify (select ty (slt rty x y) + (iconst_s ty -1) + (uextend_maybe ty (sgt rty x y)))) + (sextend_maybe ty (spaceship_s rty x y))) + +;; x == y ? 0 : x < y ? -1 : +1 +(rule (simplify (select ty (eq rty x y) + (iconst_s ty 0) + (select ty (slt rty x y) + (iconst_s ty -1) + (iconst_s ty 1)))) + (sextend_maybe ty (spaceship_s rty x y))) +;; x == y ? 0 : x <= y ? -1 : +1 +(rule (simplify (select ty (eq rty x y) + (iconst_s ty 0) + (select ty (sle rty x y) + (iconst_s ty -1) + (iconst_s ty 1)))) + (sextend_maybe ty (spaceship_s rty x y))) +;; x == y ? 0 : x > y ? +1 : -1 +(rule (simplify (select ty (eq rty x y) + (iconst_s ty 0) + (select ty (sgt rty x y) + (iconst_s ty 1) + (iconst_s ty -1)))) + (sextend_maybe ty (spaceship_s rty x y))) +;; x == y ? 0 : x >= y ? +1 : -1 +(rule (simplify (select ty (eq rty x y) + (iconst_s ty 0) + (select ty (sge rty x y) + (iconst_s ty 1) + (iconst_s ty -1)))) + (sextend_maybe ty (spaceship_s rty x y))) + +;; x > y ? 1 : x < y ? -1 : 0 +;; x > y ? 1 : x >= y ? 0 : -1 +(rule (simplify (select ty (sgt rty x y) + (iconst_s ty 1) + (ineg rty (slt rty x y)))) + (sextend_maybe ty (spaceship_s rty x y))) +(rule (simplify (select ty (sgt rty x y) + (iconst_s ty 1) + (bmask ty (slt rty x y)))) + (sextend_maybe ty (spaceship_s rty x y))) +;; x > y ? 1 : x != y ? -1 : 0 +;; x > y ? 1 : x == y ? 0 : -1 +(rule (simplify (select ty (sgt rty x y) + (iconst_s ty 1) + (ineg rty (ne rty x y)))) + (sextend_maybe ty (spaceship_s rty x y))) +(rule (simplify (select ty (sgt rty x y) + (iconst_s ty 1) + (bmask ty (ne rty x y)))) + (sextend_maybe ty (spaceship_s rty x y))) + +;; Then once we have it normalized, we can apply some basic simplifications. +;; For example, a derived `PartialOrd::lt` on a newtype in Rust will essentially +;; emit `(a <=> b) < 0`, and replacing that with `a < b` can really help. +;; `icmp.isle` prefers comparing against zero so we don't need to worry about +;; also matching things like `(a <=> b) < 1` or `(a <=> b) <= -1`. + +;; (a <=> b) == 0 --> a == b +(rule (simplify (eq _ (spaceship_s ty x y) (iconst_s _ 0))) + (eq ty x y)) +(rule (simplify (eq _ (spaceship_u ty x y) (iconst_s _ 0))) + (eq ty x y)) +;; (a <=> b) != 0 --> a != b +(rule (simplify (ne _ (spaceship_s ty x y) (iconst_s _ 0))) + (ne ty x y)) +(rule (simplify (ne _ (spaceship_u ty x y) (iconst_s _ 0))) + (ne ty x y)) + +;; (a <=> b) < 0 --> a < b +(rule (simplify (slt _ (spaceship_s ty x y) (iconst_s _ 0))) + (slt ty x y)) +(rule (simplify (slt _ (spaceship_u ty x y) (iconst_s _ 0))) + (ult ty x y)) +;; (a <=> b) <= 0 --> a <= b +(rule (simplify (sle _ (spaceship_s ty x y) (iconst_s _ 0))) + (sle ty x y)) +(rule (simplify (sle _ (spaceship_u ty x y) (iconst_s _ 0))) + (ule ty x y)) +;; (a <=> b) > 0 --> a > b +(rule (simplify (sgt _ (spaceship_s ty x y) (iconst_s _ 0))) + (sgt ty x y)) +(rule (simplify (sgt _ (spaceship_u ty x y) (iconst_s _ 0))) + (ugt ty x y)) +;; (a <=> b) >= 0 --> a >= b +(rule (simplify (sge _ (spaceship_s ty x y) (iconst_s _ 0))) + (sge ty x y)) +(rule (simplify (sge _ (spaceship_u ty x y) (iconst_s _ 0))) + (uge ty x y)) + +;; Rust's `sort_by` uses `compare(a, b) == Less`, which the general icmp rules +;; can't simplify to a comparison against zero, so catch things like that too. +(rule (simplify (eq _ (spaceship_s ty x y) (iconst_s _ -1))) + (slt ty x y)) +(rule (simplify (eq _ (spaceship_u ty x y) (iconst_s _ -1))) + (ult ty x y)) +(rule (simplify (ne _ (spaceship_s ty x y) (iconst_s _ -1))) + (sge ty x y)) +(rule (simplify (ne _ (spaceship_u ty x y) (iconst_s _ -1))) + (uge ty x y)) +(rule (simplify (eq _ (spaceship_s ty x y) (iconst_s _ 1))) + (sgt ty x y)) +(rule (simplify (eq _ (spaceship_u ty x y) (iconst_s _ 1))) + (ugt ty x y)) +(rule (simplify (ne _ (spaceship_s ty x y) (iconst_s _ 1))) + (sle ty x y)) +(rule (simplify (ne _ (spaceship_u ty x y) (iconst_s _ 1))) + (ule ty x y)) diff --git a/cranelift/codegen/src/opts/vector.isle b/cranelift/codegen/src/opts/vector.isle index fd47fe69c41b..5ad57d8dc604 100644 --- a/cranelift/codegen/src/opts/vector.isle +++ b/cranelift/codegen/src/opts/vector.isle @@ -1,8 +1,9 @@ ;; For various ops lift a splat outside of the op to try to open up ;; optimization opportunities with scalars. -;; + ;; NB: for int-to-float conversion op this simplification is also -;; required for correctness at this time due to #6562 +;; required for the x64 backend because it doesn't fully implement int-to-float +;; conversions for 64x2 vectors, for more information see #6562 (rule (simplify (fcvt_from_uint float_vector_ty (splat _ x))) (splat float_vector_ty (fcvt_from_uint (lane_type float_vector_ty) x))) (rule (simplify (fcvt_from_sint float_vector_ty (splat _ x))) diff --git a/cranelift/codegen/src/prelude.isle b/cranelift/codegen/src/prelude.isle index 48c1488a9e37..95ccea9b5406 100644 --- a/cranelift/codegen/src/prelude.isle +++ b/cranelift/codegen/src/prelude.isle @@ -67,14 +67,6 @@ (decl pure partial u8_lt (u8 u8) Unit) (extern constructor u8_lt u8_lt) -;; Get a signed 32-bit immediate in an u32 from an Imm64, if possible. -(decl simm32 (i32) Imm64) -(extern extractor simm32 simm32) - -;; Get an unsigned 8-bit immediate in a u8 from an Imm64, if possible. -(decl uimm8 (u8) Imm64) -(extern extractor uimm8 uimm8) - ;;;; Primitive Type Conversions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (decl pure u8_as_i8 (u8) i8) @@ -106,6 +98,9 @@ (decl pure i64_neg (i64) i64) (extern constructor i64_neg i64_neg) +(decl pure i8_neg (i8) i8) +(extern constructor i8_neg i8_neg) + (decl u128_as_u64 (u64) u128) (extern extractor u128_as_u64 u128_as_u64) diff --git a/cranelift/codegen/src/prelude_lower.isle b/cranelift/codegen/src/prelude_lower.isle index d90286e88a6f..54851de654ad 100644 --- a/cranelift/codegen/src/prelude_lower.isle +++ b/cranelift/codegen/src/prelude_lower.isle @@ -302,6 +302,18 @@ (decl maybe_uextend (Value) Value) (extern extractor maybe_uextend maybe_uextend) +;; Get a signed 32-bit immediate in an u32 from an Imm64, if possible. +;; Note that this checks that the raw i64 value from the Imm64 fits in i32, +;; so `-1_u32` will not actually match -- it's treated as `0xFFFF_FFFF_i64`, +;; which doesn't fit in an i32 and thus doesn't match the extractor. +;; An Imm64 of `-1_i64` *will* match, however. +(decl simm32 (i32) Imm64) +(extern extractor simm32 simm32) + +;; Get an unsigned 8-bit immediate in a u8 from an Imm64, if possible. +(decl uimm8 (u8) Imm64) +(extern extractor uimm8 uimm8) + ;; Instruction creation helpers ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Emit an instruction. diff --git a/cranelift/codegen/src/prelude_opt.isle b/cranelift/codegen/src/prelude_opt.isle index 921c7c65b8ea..1f02387d21f3 100644 --- a/cranelift/codegen/src/prelude_opt.isle +++ b/cranelift/codegen/src/prelude_opt.isle @@ -1,11 +1,21 @@ ;; Prelude definitions specific to the mid-end. +;; Any `extern` definitions here are generally implemented in `src/opts.rs`. + ;;;;; eclass and enode access ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Extract any node(s) for the given eclass ID. (decl multi inst_data (Type InstructionData) Value) (extern extractor inst_data inst_data_etor) +;; Identical to `inst_data`, just with a different ISLE type. +;; This is basically a manual version of `curry`/`uncurry` in Haskell: +;; to compose extractors the outer one needs to be single-parameter, +;; so this combines the two parameters of `inst_data` into one. +(type TypeAndInstructionData (primitive TypeAndInstructionData)) +(decl multi inst_data_tupled (TypeAndInstructionData) Value) +(extern extractor inst_data_tupled inst_data_tupled_etor) + ;; Construct a pure node, returning a new (or deduplicated ;; already-existing) eclass ID. (decl make_inst (Type InstructionData) Value) @@ -28,6 +38,14 @@ (rule (sgt ty x y) (icmp ty (IntCC.SignedGreaterThan) x y)) (rule (sge ty x y) (icmp ty (IntCC.SignedGreaterThanOrEqual) x y)) +;; 3-way comparison, returning -1/0/+1 in I8 +(decl spaceship_s (Type Value Value) Value) +(rule (spaceship_s ty x y) (isub $I8 (sgt ty x y) (slt ty x y))) +(extractor (spaceship_s ty x y) (isub $I8 (sgt ty x y) (slt ty x y))) +(decl spaceship_u (Type Value Value) Value) +(rule (spaceship_u ty x y) (isub $I8 (ugt ty x y) (ult ty x y))) +(extractor (spaceship_u ty x y) (isub $I8 (ugt ty x y) (ult ty x y))) + ;;;;; optimization toplevel ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; The main matcher rule invoked by the toplevel driver. @@ -46,13 +64,71 @@ ;;;;; constructors ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(decl iconst_u64 (Type u64) Value) +(decl iconst_sextend_etor (Type i64) TypeAndInstructionData) +(extern extractor iconst_sextend_etor iconst_sextend_etor) + +;; Construct an `iconst` from an `i64` or Extract an `i64` from an `iconst` +;; by treating the constant as signed. +;; When extracting, smaller types get their value sign-extended to 64-bits, +;; so that `iconst.i8 255` will give you a `-1_i64`. +;; When constructing, the rule will fail if the value cannot be represented in +;; the target type. If it fits, it'll be masked accordingly in the constant. +(decl iconst_s (Type i64) Value) +(extractor (iconst_s ty c) (inst_data_tupled (iconst_sextend_etor ty c))) +(rule 0 (iconst_s ty c) + (if-let c_masked (u64_and (i64_as_u64 c) (ty_umax ty))) + (if-let c_reextended (i64_sextend_u64 ty c_masked)) + (if-let $true (u64_eq (i64_as_u64 c) (i64_as_u64 c_reextended))) + (iconst ty (imm64 c_masked))) +(rule 1 (iconst_s $I128 c) (sextend $I128 (iconst_s $I64 c))) + +;; Construct an `iconst` from a `u64` or Extract a `u64` from an `iconst` +;; by treating the constant as unsigned. +;; When extracting, smaller types get their value zero-extended to 64-bits, +;; so that `iconst.i8 255` will give you a `255_u64`. +;; When constructing, the rule will fail if the value cannot be represented in +;; the target type. +(decl iconst_u (Type u64) Value) +(extractor (iconst_u ty c) (iconst ty (u64_from_imm64 c))) +(rule 0 (iconst_u ty c) + (if-let $true (u64_le c (ty_umax ty))) + (iconst ty (imm64 c))) +(rule 1 (iconst_u $I128 c) (uextend $I128 (iconst_u $I64 c))) + +;; These take `Value`, rather than going through `inst_data_tupled`, because +;; most of the time they want to return the original `Value`, and it would be +;; a waste to need to re-GVN the instruction data in those cases. +(decl multi sextend_maybe_etor (Type Value) Value) +(extern extractor infallible sextend_maybe_etor sextend_maybe_etor) +(decl multi uextend_maybe_etor (Type Value) Value) +(extern extractor infallible uextend_maybe_etor uextend_maybe_etor) + +;; Match or Construct a possibly-`uextend`ed value. +;; Gives the extended-to type and inner value when matching something that was +;; extended, or the input value and its type when the value isn't an extension. +;; Useful to write a single pattern that can match things that may or may not +;; have undergone C's "usual arithmetic conversions". +;; When generating values, extending to the same type is invalid CLIF, +;; so this avoids doing that where there's no extension actually needed. +(decl uextend_maybe (Type Value) Value) +(extractor (uextend_maybe ty val) (uextend_maybe_etor ty val)) +(rule 0 (uextend_maybe ty val) (uextend ty val)) +(rule 1 (uextend_maybe ty val@(value_type ty)) val) + +;; Same as `uextend_maybe` above, just for `sextend`. +(decl sextend_maybe (Type Value) Value) +(extractor (sextend_maybe ty val) (sextend_maybe_etor ty val)) +(rule 0 (sextend_maybe ty val) (sextend ty val)) +(rule 1 (sextend_maybe ty val@(value_type ty)) val) -;; Use a single iconst for types that fit in 64 bits. -(rule 0 (iconst_u64 (ty_int_ref_scalar_64 ty) val) - (if-let $true (u64_le val (ty_umax ty))) - (iconst ty (imm64_masked ty val))) +(decl unary_op (Type Opcode Value) Value) +(extractor (unary_op ty opcode x) + (inst_data ty (InstructionData.Unary opcode x))) +(rule (unary_op ty opcode x) + (make_inst ty (InstructionData.Unary opcode x))) -;; For i128 types use a iconst, but zero extend it to i128. -(rule 1 (iconst_u64 $I128 val) - (uextend $I128 (iconst $I64 (imm64_masked $I64 val)))) +(decl binary_op (Type Opcode Value Value) Value) +(extractor (binary_op ty opcode x y) + (inst_data ty (InstructionData.Binary opcode (value_array_2 x y)))) +(rule (binary_op ty opcode x y) + (make_inst ty (InstructionData.Binary opcode (value_array_2_ctor x y)))) diff --git a/cranelift/codegen/src/timing.rs b/cranelift/codegen/src/timing.rs index 573b82c0cd96..47f0eaec1cec 100644 --- a/cranelift/codegen/src/timing.rs +++ b/cranelift/codegen/src/timing.rs @@ -5,9 +5,9 @@ use core::fmt; use std::any::Any; use std::boxed::Box; -use std::cell::{Cell, RefCell}; +use std::cell::RefCell; use std::mem; -use std::time::{Duration, Instant}; +use std::time::Duration; // Each pass that can be timed is predefined with the `define_passes!` macro. Each pass has a // snake_case name and a plain text description used when printing out the timing report. @@ -130,22 +130,6 @@ fn start_pass(pass: Pass) -> Box { PROFILER.with(|profiler| profiler.borrow().start_pass(pass)) } -/// A timing token is responsible for timing the currently running pass. Timing starts when it -/// is created and ends when it is dropped. -/// -/// Multiple passes can be active at the same time, but they must be started and stopped in a -/// LIFO fashion. -struct DefaultTimingToken { - /// Start time for this pass. - start: Instant, - - // Pass being timed by this token. - pass: Pass, - - // The previously active pass which will be restored when this token is dropped. - prev: Pass, -} - /// Accumulated timing information for a single pass. #[derive(Default, Copy, Clone)] struct PassTime { @@ -215,42 +199,12 @@ impl fmt::Display for PassTimes { // Information about passes in a single thread. thread_local! { - static CURRENT_PASS: Cell = const { Cell::new(Pass::None) }; static PASS_TIME: RefCell = RefCell::new(Default::default()); } /// The default profiler. You can get the results using [`take_current`]. pub struct DefaultProfiler; -impl Profiler for DefaultProfiler { - fn start_pass(&self, pass: Pass) -> Box { - let prev = CURRENT_PASS.with(|p| p.replace(pass)); - log::debug!("timing: Starting {}, (during {})", pass, prev); - Box::new(DefaultTimingToken { - start: Instant::now(), - pass, - prev, - }) - } -} - -/// Dropping a timing token indicated the end of the pass. -impl Drop for DefaultTimingToken { - fn drop(&mut self) { - let duration = self.start.elapsed(); - log::debug!("timing: Ending {}: {}ms", self.pass, duration.as_millis()); - let old_cur = CURRENT_PASS.with(|p| p.replace(self.prev)); - debug_assert_eq!(self.pass, old_cur, "Timing tokens dropped out of order"); - PASS_TIME.with(|rc| { - let mut table = rc.borrow_mut(); - table.pass[self.pass.idx()].total += duration; - if let Some(parent) = table.pass.get_mut(self.prev.idx()) { - parent.child += duration; - } - }) - } -} - /// Take the current accumulated pass timings and reset the timings for the current thread. /// /// Only applies when [`DefaultProfiler`] is used. @@ -258,6 +212,78 @@ pub fn take_current() -> PassTimes { PASS_TIME.with(|rc| mem::take(&mut *rc.borrow_mut())) } +#[cfg(feature = "timing")] +mod enabled { + use super::{DefaultProfiler, Pass, Profiler, PASS_TIME}; + use std::any::Any; + use std::boxed::Box; + use std::cell::Cell; + use std::time::Instant; + + // Information about passes in a single thread. + thread_local! { + static CURRENT_PASS: Cell = const { Cell::new(Pass::None) }; + } + + impl Profiler for DefaultProfiler { + fn start_pass(&self, pass: Pass) -> Box { + let prev = CURRENT_PASS.with(|p| p.replace(pass)); + log::debug!("timing: Starting {}, (during {})", pass, prev); + Box::new(DefaultTimingToken { + start: Instant::now(), + pass, + prev, + }) + } + } + + /// A timing token is responsible for timing the currently running pass. Timing starts when it + /// is created and ends when it is dropped. + /// + /// Multiple passes can be active at the same time, but they must be started and stopped in a + /// LIFO fashion. + struct DefaultTimingToken { + /// Start time for this pass. + start: Instant, + + // Pass being timed by this token. + pass: Pass, + + // The previously active pass which will be restored when this token is dropped. + prev: Pass, + } + + /// Dropping a timing token indicated the end of the pass. + impl Drop for DefaultTimingToken { + fn drop(&mut self) { + let duration = self.start.elapsed(); + log::debug!("timing: Ending {}: {}ms", self.pass, duration.as_millis()); + let old_cur = CURRENT_PASS.with(|p| p.replace(self.prev)); + debug_assert_eq!(self.pass, old_cur, "Timing tokens dropped out of order"); + PASS_TIME.with(|rc| { + let mut table = rc.borrow_mut(); + table.pass[self.pass.idx()].total += duration; + if let Some(parent) = table.pass.get_mut(self.prev.idx()) { + parent.child += duration; + } + }) + } + } +} + +#[cfg(not(feature = "timing"))] +mod disabled { + use super::{DefaultProfiler, Pass, Profiler}; + use std::any::Any; + use std::boxed::Box; + + impl Profiler for DefaultProfiler { + fn start_pass(&self, _pass: Pass) -> Box { + Box::new(()) + } + } +} + #[cfg(test)] mod tests { use super::*; diff --git a/cranelift/codegen/src/unionfind.rs b/cranelift/codegen/src/unionfind.rs index 8e2be3ba3a93..da96611ec366 100644 --- a/cranelift/codegen/src/unionfind.rs +++ b/cranelift/codegen/src/unionfind.rs @@ -3,12 +3,43 @@ use crate::trace; use cranelift_entity::{packed_option::ReservedValue, EntityRef, SecondaryMap}; use std::hash::Hash; +use std::mem::swap; /// A union-find data structure. The data structure can allocate -/// `Id`s, indicating eclasses, and can merge eclasses together. +/// `Idx`s, indicating eclasses, and can merge eclasses together. +/// +/// Running `union(a, b)` will change the canonical `Idx` of `a` or `b`. +/// Usually, this is chosen based on what will minimize path lengths, +/// but it is also possible to _pin_ an eclass, such that its canonical `Idx` +/// won't change unless it gets unioned with another pinned eclass. +/// +/// In the context of the egraph pass, merging two pinned eclasses +/// is very unlikely to happen – we do not know a single concrete test case +/// where it does. The only situation where it might happen looks as follows: +/// +/// 1. We encounter terms `A` and `B`, and the optimizer does not find any +/// reason to union them together. +/// 2. We encounter a term `C`, and we rewrite `C -> A`, and separately, `C -> B`. +/// +/// Unless `C` somehow includes some crucial hint without which it is hard to +/// notice that `A = B`, there's probably a rewrite rule that we should add. +/// +/// Worst case, if we do merge two pinned eclasses, some nodes will essentially +/// disappear from the GVN map, which only affects the quality of the generated +/// code. #[derive(Clone, Debug, PartialEq)] pub struct UnionFind { parent: SecondaryMap>, + /// The `rank` table is used to perform the union operations optimally, + /// without creating unnecessarily long paths. Pins are represented by + /// eclasses with a rank of `u8::MAX`. + /// + /// `rank[x]` is the upper bound on the height of the subtree rooted at `x`. + /// The subtree is guaranteed to have at least `2**rank[x]` elements, + /// unless `rank` has been artificially inflated by pinning. + rank: SecondaryMap, + + pub(crate) pinned_union_count: u64, } #[derive(Clone, Debug, PartialEq)] @@ -25,6 +56,8 @@ impl UnionFind< pub fn with_capacity(cap: usize) -> Self { UnionFind { parent: SecondaryMap::with_capacity(cap), + rank: SecondaryMap::with_capacity(cap), + pinned_union_count: 0, } } @@ -61,15 +94,50 @@ impl UnionFind< node } + /// Request a stable identifier for `node`. + /// + /// After an `union` operation, the canonical representative of one + /// of the eclasses being merged together necessarily changes. If a pinned + /// eclass is merged with a non-pinned eclass, it'll be the other eclass + /// whose representative will change. + /// + /// If two pinned eclasses are unioned, one of the pins gets broken, + /// which is reported in the statistics for the pass. No concrete test case + /// which triggers this is known. + pub fn pin_index(&mut self, mut node: Idx) -> Idx { + node = self.find_and_update(node); + self.rank[node] = u8::MAX; + node + } + /// Merge the equivalence classes of the two `Idx`s. pub fn union(&mut self, a: Idx, b: Idx) { - let a = self.find_and_update(a); - let b = self.find_and_update(b); - let (a, b) = (std::cmp::min(a, b), std::cmp::max(a, b)); - if a != b { - // Always canonicalize toward lower IDs. - self.parent[b] = Val(a); - trace!("union: {}, {}", a, b); + let mut a = self.find_and_update(a); + let mut b = self.find_and_update(b); + + if a == b { + return; + } + + if self.rank[a] < self.rank[b] { + swap(&mut a, &mut b); + } else if self.rank[a] == self.rank[b] { + self.rank[a] = self.rank[a].checked_add(1).unwrap_or_else( + #[cold] + || { + // Both `a` and `b` are pinned. + // + // This should only occur if we rewrite X -> Y and X -> Z, + // yet neither Y -> Z nor Z -> Y can be established without + // the "hint" provided by X. This probably means we're + // missing an optimization rule. + self.pinned_union_count += 1; + u8::MAX + }, + ); } + + self.parent[b] = Val(a); + trace!("union: {}, {}", a, b); } } diff --git a/cranelift/codegen/src/verifier/mod.rs b/cranelift/codegen/src/verifier/mod.rs index 608d0ac050ed..d80724570228 100644 --- a/cranelift/codegen/src/verifier/mod.rs +++ b/cranelift/codegen/src/verifier/mod.rs @@ -157,7 +157,7 @@ where /// Result of a step in the verification process. /// -/// Functions that return `VerifierStepResult<()>` should also take a +/// Functions that return `VerifierStepResult` should also take a /// mutable reference to `VerifierErrors` as argument in order to report /// errors. /// @@ -165,11 +165,11 @@ where /// meaning that the verification process may continue. However, other (non-fatal) /// errors might have been reported through the previously mentioned `VerifierErrors` /// argument. -pub type VerifierStepResult = Result; +pub type VerifierStepResult = Result<(), ()>; /// Result of a verification operation. /// -/// Unlike `VerifierStepResult<()>` which may be `Ok` while still having reported +/// Unlike `VerifierStepResult` which may be `Ok` while still having reported /// errors, this type always returns `Err` if an error (fatal or not) was reported. pub type VerifierResult = Result; @@ -203,7 +203,7 @@ impl VerifierErrors { /// Return a `VerifierStepResult` that is fatal if at least one error was reported, /// and non-fatal otherwise. #[inline] - pub fn as_result(&self) -> VerifierStepResult<()> { + pub fn as_result(&self) -> VerifierStepResult { if self.is_empty() { Ok(()) } else { @@ -217,13 +217,13 @@ impl VerifierErrors { } /// Report a fatal error and return `Err`. - pub fn fatal(&mut self, error: impl Into) -> VerifierStepResult<()> { + pub fn fatal(&mut self, error: impl Into) -> VerifierStepResult { self.report(error); Err(()) } /// Report a non-fatal error and return `Ok`. - pub fn nonfatal(&mut self, error: impl Into) -> VerifierStepResult<()> { + pub fn nonfatal(&mut self, error: impl Into) -> VerifierStepResult { self.report(error); Ok(()) } @@ -285,7 +285,7 @@ pub fn verify_context<'a, FOI: Into>>( domtree: &DominatorTree, fisa: FOI, errors: &mut VerifierErrors, -) -> VerifierStepResult<()> { +) -> VerifierStepResult { let _tt = timing::verifier(); let verifier = Verifier::new(func, fisa.into()); if cfg.is_valid() { @@ -325,7 +325,7 @@ impl<'a> Verifier<'a> { // Check for: // - cycles in the global value declarations. // - use of 'vmctx' when no special parameter declares it. - fn verify_global_values(&self, errors: &mut VerifierErrors) -> VerifierStepResult<()> { + fn verify_global_values(&self, errors: &mut VerifierErrors) -> VerifierStepResult { let mut cycle_seen = false; let mut seen = SparseSet::new(); @@ -410,7 +410,7 @@ impl<'a> Verifier<'a> { Ok(()) } - fn verify_memory_types(&self, errors: &mut VerifierErrors) -> VerifierStepResult<()> { + fn verify_memory_types(&self, errors: &mut VerifierErrors) -> VerifierStepResult { // Verify that all fields are statically-sized and lie within // the struct, do not overlap, and are in offset order for (mt, mt_data) in &self.func.memory_types { @@ -457,7 +457,7 @@ impl<'a> Verifier<'a> { Ok(()) } - fn verify_tables(&self, errors: &mut VerifierErrors) -> VerifierStepResult<()> { + fn verify_tables(&self, errors: &mut VerifierErrors) -> VerifierStepResult { if let Some(isa) = self.isa { for (table, table_data) in &self.func.tables { let base = table_data.base_gv; @@ -502,7 +502,7 @@ impl<'a> Verifier<'a> { /// Check that the given block can be encoded as a BB, by checking that only /// branching instructions are ending the block. - fn encodable_as_bb(&self, block: Block, errors: &mut VerifierErrors) -> VerifierStepResult<()> { + fn encodable_as_bb(&self, block: Block, errors: &mut VerifierErrors) -> VerifierStepResult { match self.func.is_block_basic(block) { Ok(()) => Ok(()), Err((inst, message)) => errors.fatal((inst, self.context(inst), message)), @@ -514,7 +514,7 @@ impl<'a> Verifier<'a> { block: Block, inst: Inst, errors: &mut VerifierErrors, - ) -> VerifierStepResult<()> { + ) -> VerifierStepResult { let is_terminator = self.func.dfg.insts[inst].opcode().is_terminator(); let is_last_inst = self.func.layout.last_inst(block) == Some(inst); @@ -560,11 +560,7 @@ impl<'a> Verifier<'a> { Ok(()) } - fn instruction_integrity( - &self, - inst: Inst, - errors: &mut VerifierErrors, - ) -> VerifierStepResult<()> { + fn instruction_integrity(&self, inst: Inst, errors: &mut VerifierErrors) -> VerifierStepResult { let inst_data = &self.func.dfg.insts[inst]; let dfg = &self.func.dfg; @@ -596,7 +592,7 @@ impl<'a> Verifier<'a> { &self, inst: Inst, errors: &mut VerifierErrors, - ) -> VerifierStepResult<()> { + ) -> VerifierStepResult { use crate::ir::instructions::InstructionData::*; for arg in self.func.dfg.inst_values(inst) { @@ -763,7 +759,7 @@ impl<'a> Verifier<'a> { loc: impl Into, e: Block, errors: &mut VerifierErrors, - ) -> VerifierStepResult<()> { + ) -> VerifierStepResult { if !self.func.dfg.block_is_valid(e) || !self.func.layout.is_block_inserted(e) { return errors.fatal((loc, format!("invalid block reference {}", e))); } @@ -780,7 +776,7 @@ impl<'a> Verifier<'a> { inst: Inst, s: SigRef, errors: &mut VerifierErrors, - ) -> VerifierStepResult<()> { + ) -> VerifierStepResult { if !self.func.dfg.signatures.is_valid(s) { errors.fatal(( inst, @@ -797,7 +793,7 @@ impl<'a> Verifier<'a> { inst: Inst, f: FuncRef, errors: &mut VerifierErrors, - ) -> VerifierStepResult<()> { + ) -> VerifierStepResult { if !self.func.dfg.ext_funcs.is_valid(f) { errors.nonfatal(( inst, @@ -814,7 +810,7 @@ impl<'a> Verifier<'a> { inst: Inst, ss: StackSlot, errors: &mut VerifierErrors, - ) -> VerifierStepResult<()> { + ) -> VerifierStepResult { if !self.func.sized_stack_slots.is_valid(ss) { errors.nonfatal(( inst, @@ -831,7 +827,7 @@ impl<'a> Verifier<'a> { inst: Inst, ss: DynamicStackSlot, errors: &mut VerifierErrors, - ) -> VerifierStepResult<()> { + ) -> VerifierStepResult { if !self.func.dynamic_stack_slots.is_valid(ss) { errors.nonfatal(( inst, @@ -848,7 +844,7 @@ impl<'a> Verifier<'a> { inst: Inst, gv: GlobalValue, errors: &mut VerifierErrors, - ) -> VerifierStepResult<()> { + ) -> VerifierStepResult { if !self.func.global_values.is_valid(gv) { errors.nonfatal(( inst, @@ -865,7 +861,7 @@ impl<'a> Verifier<'a> { inst: Inst, table: ir::Table, errors: &mut VerifierErrors, - ) -> VerifierStepResult<()> { + ) -> VerifierStepResult { if !self.func.tables.is_valid(table) { errors.nonfatal((inst, self.context(inst), format!("invalid table {}", table))) } else { @@ -878,7 +874,7 @@ impl<'a> Verifier<'a> { inst: Inst, l: &ValueList, errors: &mut VerifierErrors, - ) -> VerifierStepResult<()> { + ) -> VerifierStepResult { if !l.is_valid(&self.func.dfg.value_lists) { errors.nonfatal(( inst, @@ -895,7 +891,7 @@ impl<'a> Verifier<'a> { inst: Inst, j: JumpTable, errors: &mut VerifierErrors, - ) -> VerifierStepResult<()> { + ) -> VerifierStepResult { if !self.func.stencil.dfg.jump_tables.is_valid(j) { errors.nonfatal(( inst, @@ -916,7 +912,7 @@ impl<'a> Verifier<'a> { loc_inst: Inst, v: Value, errors: &mut VerifierErrors, - ) -> VerifierStepResult<()> { + ) -> VerifierStepResult { let dfg = &self.func.dfg; if !dfg.value_is_valid(v) { errors.nonfatal(( @@ -934,7 +930,7 @@ impl<'a> Verifier<'a> { loc_inst: Inst, v: Value, errors: &mut VerifierErrors, - ) -> VerifierStepResult<()> { + ) -> VerifierStepResult { self.verify_value(loc_inst, v, errors)?; let dfg = &self.func.dfg; @@ -1028,7 +1024,7 @@ impl<'a> Verifier<'a> { loc_inst: Inst, v: Value, errors: &mut VerifierErrors, - ) -> VerifierStepResult<()> { + ) -> VerifierStepResult { self.verify_value(loc_inst, v, errors)?; match self.func.dfg.value_def(v) { @@ -1062,7 +1058,7 @@ impl<'a> Verifier<'a> { flags: MemFlags, arg: Value, errors: &mut VerifierErrors, - ) -> VerifierStepResult<()> { + ) -> VerifierStepResult { let typ = self.func.dfg.ctrl_typevar(inst); let value_type = self.func.dfg.value_type(arg); @@ -1099,7 +1095,7 @@ impl<'a> Verifier<'a> { inst: Inst, constant: Constant, errors: &mut VerifierErrors, - ) -> VerifierStepResult<()> { + ) -> VerifierStepResult { let type_size = self.func.dfg.ctrl_typevar(inst).bytes() as usize; let constant_size = self.func.dfg.constants.get(constant).len(); if type_size != constant_size { @@ -1119,7 +1115,7 @@ impl<'a> Verifier<'a> { &self, domtree: &DominatorTree, errors: &mut VerifierErrors, - ) -> VerifierStepResult<()> { + ) -> VerifierStepResult { // We consider two `DominatorTree`s to be equal if they return the same immediate // dominator for each block. Therefore the current domtree is valid if it matches the freshly // computed one. @@ -1174,7 +1170,7 @@ impl<'a> Verifier<'a> { Ok(()) } - fn typecheck_entry_block_params(&self, errors: &mut VerifierErrors) -> VerifierStepResult<()> { + fn typecheck_entry_block_params(&self, errors: &mut VerifierErrors) -> VerifierStepResult { if let Some(block) = self.func.layout.entry_block() { let expected_types = &self.func.signature.params; let block_param_count = self.func.dfg.num_block_params(block); @@ -1207,7 +1203,7 @@ impl<'a> Verifier<'a> { errors.as_result() } - fn check_entry_not_cold(&self, errors: &mut VerifierErrors) -> VerifierStepResult<()> { + fn check_entry_not_cold(&self, errors: &mut VerifierErrors) -> VerifierStepResult { if let Some(entry_block) = self.func.layout.entry_block() { if self.func.layout.is_cold(entry_block) { return errors @@ -1217,7 +1213,7 @@ impl<'a> Verifier<'a> { errors.as_result() } - fn typecheck(&self, inst: Inst, errors: &mut VerifierErrors) -> VerifierStepResult<()> { + fn typecheck(&self, inst: Inst, errors: &mut VerifierErrors) -> VerifierStepResult { let inst_data = &self.func.dfg.insts[inst]; let constraints = inst_data.opcode().constraints(); @@ -1258,7 +1254,7 @@ impl<'a> Verifier<'a> { inst: Inst, ctrl_type: Type, errors: &mut VerifierErrors, - ) -> VerifierStepResult<()> { + ) -> VerifierStepResult { let mut i = 0; for &result in self.func.dfg.inst_results(inst) { let result_type = self.func.dfg.value_type(result); @@ -1300,7 +1296,7 @@ impl<'a> Verifier<'a> { inst: Inst, ctrl_type: Type, errors: &mut VerifierErrors, - ) -> VerifierStepResult<()> { + ) -> VerifierStepResult { let constraints = self.func.dfg.insts[inst].opcode().constraints(); for (i, &arg) in self.func.dfg.inst_fixed_args(inst).iter().enumerate() { @@ -1341,7 +1337,7 @@ impl<'a> Verifier<'a> { &self, inst: Inst, errors: &mut VerifierErrors, - ) -> VerifierStepResult<()> { + ) -> VerifierStepResult { match &self.func.dfg.insts[inst] { ir::InstructionData::Jump { destination, .. } => { self.typecheck_block_call(inst, destination, errors)?; @@ -1387,7 +1383,7 @@ impl<'a> Verifier<'a> { inst: Inst, block: &ir::BlockCall, errors: &mut VerifierErrors, - ) -> VerifierStepResult<()> { + ) -> VerifierStepResult { let pool = &self.func.dfg.value_lists; let iter = self .func @@ -1405,7 +1401,7 @@ impl<'a> Verifier<'a> { iter: I, variable_args: &[Value], errors: &mut VerifierErrors, - ) -> VerifierStepResult<()> { + ) -> VerifierStepResult { let mut i = 0; for expected_type in iter { @@ -1443,7 +1439,7 @@ impl<'a> Verifier<'a> { Ok(()) } - fn typecheck_return(&self, inst: Inst, errors: &mut VerifierErrors) -> VerifierStepResult<()> { + fn typecheck_return(&self, inst: Inst, errors: &mut VerifierErrors) -> VerifierStepResult { match self.func.dfg.insts[inst] { ir::InstructionData::MultiAry { opcode: Opcode::Return, @@ -1485,7 +1481,7 @@ impl<'a> Verifier<'a> { inst: Inst, sig_ref: SigRef, errors: &mut VerifierErrors, - ) -> VerifierStepResult<()> { + ) -> VerifierStepResult { let signature = &self.func.dfg.signatures[sig_ref]; let cc = signature.call_conv; if !cc.supports_tail_calls() { @@ -1513,7 +1509,7 @@ impl<'a> Verifier<'a> { actual_types: impl ExactSizeIterator, errors: &mut VerifierErrors, message: &str, - ) -> VerifierStepResult<()> { + ) -> VerifierStepResult { let expected_types = &self.func.signature.returns; if actual_types.len() != expected_types.len() { return errors.nonfatal((inst, self.context(inst), message)); @@ -1535,7 +1531,7 @@ impl<'a> Verifier<'a> { // Check special-purpose type constraints that can't be expressed in the normal opcode // constraints. - fn typecheck_special(&self, inst: Inst, errors: &mut VerifierErrors) -> VerifierStepResult<()> { + fn typecheck_special(&self, inst: Inst, errors: &mut VerifierErrors) -> VerifierStepResult { match self.func.dfg.insts[inst] { ir::InstructionData::TableAddr { table, arg, .. } => { let index_type = self.func.dfg.value_type(arg); @@ -1575,7 +1571,7 @@ impl<'a> Verifier<'a> { &self, cfg: &ControlFlowGraph, errors: &mut VerifierErrors, - ) -> VerifierStepResult<()> { + ) -> VerifierStepResult { let mut expected_succs = BTreeSet::::new(); let mut got_succs = BTreeSet::::new(); let mut expected_preds = BTreeSet::::new(); @@ -1643,11 +1639,7 @@ impl<'a> Verifier<'a> { errors.as_result() } - fn immediate_constraints( - &self, - inst: Inst, - errors: &mut VerifierErrors, - ) -> VerifierStepResult<()> { + fn immediate_constraints(&self, inst: Inst, errors: &mut VerifierErrors) -> VerifierStepResult { let inst_data = &self.func.dfg.insts[inst]; match *inst_data { @@ -1713,7 +1705,7 @@ impl<'a> Verifier<'a> { } } - fn iconst_bounds(&self, inst: Inst, errors: &mut VerifierErrors) -> VerifierStepResult<()> { + fn iconst_bounds(&self, inst: Inst, errors: &mut VerifierErrors) -> VerifierStepResult { use crate::ir::instructions::InstructionData::UnaryImm; let inst_data = &self.func.dfg.insts[inst]; @@ -1746,7 +1738,7 @@ impl<'a> Verifier<'a> { } } - fn typecheck_function_signature(&self, errors: &mut VerifierErrors) -> VerifierStepResult<()> { + fn typecheck_function_signature(&self, errors: &mut VerifierErrors) -> VerifierStepResult { let params = self .func .signature @@ -1806,7 +1798,7 @@ impl<'a> Verifier<'a> { } } - pub fn run(&self, errors: &mut VerifierErrors) -> VerifierStepResult<()> { + pub fn run(&self, errors: &mut VerifierErrors) -> VerifierStepResult { self.verify_global_values(errors)?; self.verify_memory_types(errors)?; self.verify_tables(errors)?; diff --git a/cranelift/control/Cargo.toml b/cranelift/control/Cargo.toml index 2d7856581321..64a6bf7dc464 100644 --- a/cranelift/control/Cargo.toml +++ b/cranelift/control/Cargo.toml @@ -1,7 +1,7 @@ [package] authors = ["The Cranelift Project Developers"] name = "cranelift-control" -version = "0.103.0" +version = "0.106.0" description = "White-box fuzz testing framework" license = "Apache-2.0 WITH LLVM-exception" repository = "https://github.com/bytecodealliance/wasmtime" diff --git a/cranelift/entity/Cargo.toml b/cranelift/entity/Cargo.toml index 463bf4ab7b07..4b16b6a0ad28 100644 --- a/cranelift/entity/Cargo.toml +++ b/cranelift/entity/Cargo.toml @@ -1,7 +1,7 @@ [package] authors = ["The Cranelift Project Developers"] name = "cranelift-entity" -version = "0.103.0" +version = "0.106.0" description = "Data structures using entity references as mapping keys" license = "Apache-2.0 WITH LLVM-exception" documentation = "https://docs.rs/cranelift-entity" @@ -11,6 +11,9 @@ readme = "README.md" keywords = ["entity", "set", "map"] edition.workspace = true +[lints] +workspace = true + [dependencies] serde = { version = "1.0.188", optional = true } serde_derive = { version = "1.0.188", optional = true } diff --git a/cranelift/entity/src/lib.rs b/cranelift/entity/src/lib.rs index cdd6b2f08964..b22eeb350f2f 100644 --- a/cranelift/entity/src/lib.rs +++ b/cranelift/entity/src/lib.rs @@ -29,8 +29,7 @@ //! references allocated from an associated memory pool. It has a much smaller footprint than //! `Vec`. -#![deny(missing_docs, trivial_numeric_casts, unused_extern_crates)] -#![warn(unused_import_braces)] +#![deny(missing_docs)] #![no_std] extern crate alloc; @@ -203,6 +202,7 @@ mod map; mod primary; mod set; mod sparse; +mod unsigned; pub use self::boxed_slice::BoxedSlice; pub use self::iter::{Iter, IterMut}; @@ -212,6 +212,7 @@ pub use self::map::SecondaryMap; pub use self::primary::PrimaryMap; pub use self::set::EntitySet; pub use self::sparse::{SparseMap, SparseMapValue, SparseSet}; +pub use self::unsigned::Unsigned; /// A collection of tests to ensure that use of the different `entity_impl!` forms will generate /// `EntityRef` implementations that behave the same way. diff --git a/cranelift/entity/src/primary.rs b/cranelift/entity/src/primary.rs index c47df1c4804d..f3315dd6f35a 100644 --- a/cranelift/entity/src/primary.rs +++ b/cranelift/entity/src/primary.rs @@ -306,6 +306,18 @@ where } } +impl From> for PrimaryMap +where + K: EntityRef, +{ + fn from(elems: Vec) -> Self { + Self { + elems, + unused: PhantomData, + } + } +} + #[cfg(test)] mod tests { use super::*; @@ -496,6 +508,19 @@ mod tests { } } + #[test] + fn from_vec() { + let mut m: PrimaryMap = PrimaryMap::new(); + m.push(12); + m.push(33); + + let n = PrimaryMap::::from(m.values().collect::>()); + assert!(m.len() == n.len()); + for (me, ne) in m.values().zip(n.values()) { + assert!(*me == **ne); + } + } + #[test] fn get_many_mut() { let mut m: PrimaryMap = PrimaryMap::new(); diff --git a/cranelift/entity/src/unsigned.rs b/cranelift/entity/src/unsigned.rs new file mode 100644 index 000000000000..2d8eb4c640ca --- /dev/null +++ b/cranelift/entity/src/unsigned.rs @@ -0,0 +1,71 @@ +/// Helper trait used to add `unsigned()` methods to primitive signed integer +/// types. +/// +/// The purpose of this trait is to signal the intent that the sign bit of a +/// signed integer is intended to be discarded and the value is instead +/// understood to be a "bag of bits" where the conversion to an unsigned number +/// is intended to be lossless. This can be used for example when converting a +/// signed integer into a larger width with zero-extension. +pub trait Unsigned { + /// The unsigned integer for this type which has the same width. + type Unsigned; + + /// View this signed integer as an unsigned integer of the same width. + /// + /// All bits are preserved. + fn unsigned(self) -> Self::Unsigned; +} + +impl Unsigned for i8 { + type Unsigned = u8; + + #[inline] + fn unsigned(self) -> u8 { + self as u8 + } +} + +impl Unsigned for i16 { + type Unsigned = u16; + + #[inline] + fn unsigned(self) -> u16 { + self as u16 + } +} + +impl Unsigned for i32 { + type Unsigned = u32; + + #[inline] + fn unsigned(self) -> u32 { + self as u32 + } +} + +impl Unsigned for i64 { + type Unsigned = u64; + + #[inline] + fn unsigned(self) -> u64 { + self as u64 + } +} + +impl Unsigned for i128 { + type Unsigned = u128; + + #[inline] + fn unsigned(self) -> u128 { + self as u128 + } +} + +impl Unsigned for isize { + type Unsigned = usize; + + #[inline] + fn unsigned(self) -> usize { + self as usize + } +} diff --git a/cranelift/filetests/Cargo.toml b/cranelift/filetests/Cargo.toml index b7f6bc8867c2..ceabf596528a 100644 --- a/cranelift/filetests/Cargo.toml +++ b/cranelift/filetests/Cargo.toml @@ -9,6 +9,9 @@ repository = "https://github.com/bytecodealliance/wasmtime" publish = false edition.workspace = true +[lints] +workspace = true + [dependencies] # TODO(nearcore/#9569): Add "zkasm" feature to top-level crate. capstone.workspace = true diff --git a/cranelift/filetests/filetests/egraph/arithmetic.clif b/cranelift/filetests/filetests/egraph/arithmetic.clif index 24d0d9c4201e..2e64d73d863d 100644 --- a/cranelift/filetests/filetests/egraph/arithmetic.clif +++ b/cranelift/filetests/filetests/egraph/arithmetic.clif @@ -20,6 +20,42 @@ block0(v0: i32): ; check: return v0 } +function %add_ineg(i32, i32) -> i32 { +block0(v0: i32, v1: i32): + v2 = ineg v1 + v3 = iadd v0, v2 + return v3 + ; check: v4 = isub v0, v1 + ; check: return v4 +} + +function %ineg_add(i32, i32) -> i32 { +block0(v0: i32, v1: i32): + v2 = ineg v0 + v3 = iadd v2, v1 + return v3 + ; check: v4 = isub v1, v0 + ; check: return v4 +} + +function %sub_ineg(i32, i32) -> i32 { +block0(v0: i32, v1: i32): + v2 = ineg v1 + v3 = isub v0, v2 + return v3 + ; check: v4 = iadd v0, v1 + ; check: return v4 +} + +function %sub_then_ineg(i32, i32) -> i32 { +block0(v0: i32, v1: i32): + v2 = isub v0, v1 + v3 = ineg v2 + return v3 + ; check: v4 = isub v1, v0 + ; check: return v4 +} + function %imul_ineg_cancel(i32, i32) -> i32 { block0(v0: i32, v1: i32): v2 = ineg v0 @@ -55,6 +91,39 @@ block0(v0: i32): ; check: return v2 } +function %zero_plus(i32) -> i32 { +block0(v0: i32): + v1 = iconst.i32 0 + v2 = iadd v1, v0 + return v2 + ; check: return v0 +} + +function %zero_times(i32) -> i32 { +block0(v0: i32): + v1 = iconst.i32 0 + v2 = imul v1, v0 + return v2 + ; check: return v1 +} + +function %one_times(i32) -> i32 { +block0(v0: i32): + v1 = iconst.i32 1 + v2 = imul v1, v0 + return v2 + ; check: return v0 +} + +function %two_times(i32) -> i32 { +block0(v0: i32): + v1 = iconst.i32 2 + v2 = imul v1, v0 + return v2 + ; check: v6 = iadd v0, v0 + ; check: return v6 +} + function %mul_minus_one(i32) -> i32 { block0(v0: i32): v1 = iconst.i32 0xffff_ffff ; -1 @@ -69,8 +138,8 @@ block0(v0: i32): v1 = iconst.i32 0xffff_ffff ; -1 v2 = imul v1, v0 return v2 - ; check: v3 = ineg v0 - ; check: return v3 + ; check: v4 = ineg v0 + ; check: return v4 } function %ineg_not_plus_one(i32) -> i32 { @@ -92,8 +161,8 @@ block0(v0: i32): return v3 } -; check: v4 = ineg v0 -; check: return v4 +; check: v5 = ineg v0 +; check: return v5 function %ineg_not_minus_neg_1(i32) -> i32 { block0(v0: i32): @@ -103,8 +172,8 @@ block0(v0: i32): return v3 } -; check: v4 = ineg v0 -; check: return v4 +; check: v6 = ineg v0 +; check: return v6 function %ineg_not_sub_one(i32) -> i32 { block0(v0: i32): @@ -139,7 +208,17 @@ block0(v0: i32): ; check: v6 = ineg v0 ; check: return v6 +function %byte_sub_smax_twice(i8) -> i8 { +block0(v0: i8): + v1 = iconst.i8 127 + v2 = isub v0, v1 + v3 = isub v2, v1 + return v3 +} +; check: v6 = iconst.i8 2 +; check: v7 = iadd v0, v6 ; v6 = 2 +; check: return v7 function %double_fneg(f32) -> f32 { block0(v1: f32): @@ -171,3 +250,108 @@ block0(v1: f32, v2: f32): ; check: v6 = fmul v1, v2 ; check: return v6 + +function %manual_smulhi_32(i32, i32) -> i32 { +block0(v0: i32, v1: i32): + v2 = sextend.i64 v0 + v3 = sextend.i64 v1 + v4 = imul v2, v3 + v5 = iconst.i32 32 + v6 = sshr v4, v5 + v7 = ireduce.i32 v6 + return v7 +} + +; check: v8 = smulhi v0, v1 +; check: return v8 + +function %manual_smulhi_64(i64, i64) -> i64 { +block0(v0: i64, v1: i64): + v2 = sextend.i128 v0 + v3 = sextend.i128 v1 + v4 = imul v2, v3 + v5 = iconst.i32 64 + v6 = sshr v4, v5 + v7 = ireduce.i64 v6 + return v7 +} + +; check: v8 = smulhi v0, v1 +; check: return v8 + +function %manual_umulhi_32(i32, i32) -> i32 { +block0(v0: i32, v1: i32): + v2 = uextend.i64 v0 + v3 = uextend.i64 v1 + v4 = imul v2, v3 + v5 = iconst.i32 32 + v6 = ushr v4, v5 + v7 = ireduce.i32 v6 + return v7 +} + +; check: v8 = umulhi v0, v1 +; check: return v8 + +function %manual_umulhi_64(i64, i64) -> i64 { +block0(v0: i64, v1: i64): + v2 = uextend.i128 v0 + v3 = uextend.i128 v1 + v4 = imul v2, v3 + v5 = iconst.i32 64 + v6 = ushr v4, v5 + v7 = ireduce.i64 v6 + return v7 +} + +; check: v8 = umulhi v0, v1 +; check: return v8 + +function %u64_widening_mul(i64, i64, i64) { +block0(v0: i64, v1: i64, v2: i64): + v3 = uextend.i128 v1 + v4 = uextend.i128 v2 + v5 = imul v3, v4 + v6 = iconst.i32 64 + v7 = ushr v5, v6 + v8 = ireduce.i64 v7 + v9 = ireduce.i64 v5 + store.i64 v9, v0 + store.i64 v8, v0+8 + return +} + +; check: v15 = imul v1, v2 +; check: store v15, v0 +; check: v10 = umulhi v1, v2 +; check: store v10, v0+8 + +function %char_plus_one(i8) -> i8 { +block0(v0: i8): + v1 = sextend.i32 v0 + v2 = iconst.i32 257 + v3 = iadd v1, v2 + v4 = ireduce.i8 v3 + return v4 +} + +; check: v7 = iconst.i8 1 +; check: v8 = iadd v0, v7 ; v7 = 1 +; check: return v8 + +;; Adding three `short`s together and storing them in a `short`, +;; which in C involves extending them to `int`s in the middle. +function %extend_iadd_iadd_reduce(i16, i16, i16) -> i16 { +block0(v0: i16, v1: i16, v2: i16): + v3 = sextend.i32 v0 + v4 = sextend.i32 v1 + v5 = sextend.i32 v2 + v6 = iadd v3, v4 + v7 = iadd v6, v5 + v8 = ireduce.i16 v7 + return v8 +} + +; check: v12 = iadd v0, v1 +; check: v15 = iadd v12, v2 +; check: return v15 diff --git a/cranelift/filetests/filetests/egraph/associative-and-commutative.clif b/cranelift/filetests/filetests/egraph/associative-and-commutative.clif index 37bfa8da5705..ab4b04914ba3 100644 --- a/cranelift/filetests/filetests/egraph/associative-and-commutative.clif +++ b/cranelift/filetests/filetests/egraph/associative-and-commutative.clif @@ -39,9 +39,9 @@ block0(v0: i32, v1: i32): v6 = iadd v4, v5 return v6 ; check: v7 = iadd v0, v1 -; nextln: iconst.i32 78 -; nextln: v16 = iadd v7, v14 ; v14 = 78 -; check: return v16 +; nextln: v9 = iconst.i32 78 +; nextln: v15 = iadd v7, v9 ; v9 = 78 +; check: return v15 } function %imul_shallow_and_wide(i32, i32, i32, i32) -> i32 { @@ -79,3 +79,41 @@ block0(v0: i32, v1: i32, v2: i32, v3: i32): ; nextln: v8 = bxor v4, v7 ; check: return v8 } + +;; We don't have any assertions about the result of optimizing this function, +;; but it's a good canary for unbounded recursion in optimization rulesets. In +;; particular, because of the shared structure in the dag, it won't be obvious +;; to rules that are pattern matching on trees that this is actually a chain, +;; and they will exhibit exponential behavior as a result. +function %iadd_big_chain(i8) -> i16 { +block0(v0: i8): + v1 = uextend.i32 v0 + v2 = iconst.i32 42 + v3 = iadd v1, v2 + v4 = iadd v3, v3 + v5 = iadd v4, v4 + v6 = iadd v5, v5 + v7 = iadd v6, v6 + v8 = iadd v7, v7 + v9 = iadd v8, v8 + v10 = iadd v9, v9 + v11 = iadd v10, v10 + v12 = iadd v11, v11 + v13 = iadd v12, v12 + v14 = iadd v13, v13 + v15 = iadd v14, v14 + v16 = iadd v15, v15 + v17 = iadd v16, v16 + v18 = iadd v17, v17 + v19 = iadd v18, v18 + v20 = iadd v19, v19 + v21 = iadd v20, v20 + v22 = iadd v21, v21 + v23 = iadd v22, v22 + v24 = iadd v23, v23 + v25 = iadd v24, v24 + v26 = iadd v25, v25 + v27 = iadd v26, v26 + v28 = ireduce.i16 v27 + return v28 +} diff --git a/cranelift/filetests/filetests/egraph/cprop.clif b/cranelift/filetests/filetests/egraph/cprop.clif index e9fef8ca8707..6c2218a4975b 100644 --- a/cranelift/filetests/filetests/egraph/cprop.clif +++ b/cranelift/filetests/filetests/egraph/cprop.clif @@ -9,8 +9,8 @@ block0: return v2 } -; check: v9 = iconst.i8 41 -; nextln: return v9 +; check: v3 = iconst.i8 41 +; nextln: return v3 function %f1() -> i16 { block0: @@ -260,3 +260,25 @@ block0: ; check: v3 = iconst.i32 0xfff6 ; nextln: return v3 + +function %sub_u8max(i8) -> i8 { +block0(v0: i8): + v1 = iconst.i8 255 + v2 = isub v0, v1 + return v2 +} + +; check: v3 = iconst.i8 1 +; nextln: v4 = iadd v0, v3 ; v3 = 1 +; nextln: return v4 + +function %sub_u32max(i32) -> i32 { +block0(v0: i32): + v1 = iconst.i32 0xFFFF_FFFF + v2 = isub v0, v1 + return v2 +} + +; check: v3 = iconst.i32 1 +; nextln: v4 = iadd v0, v3 ; v3 = 1 +; nextln: return v4 diff --git a/cranelift/filetests/filetests/egraph/extends.clif b/cranelift/filetests/filetests/egraph/extends.clif index 7ebb2642f572..4859d8d8dcf2 100644 --- a/cranelift/filetests/filetests/egraph/extends.clif +++ b/cranelift/filetests/filetests/egraph/extends.clif @@ -54,6 +54,28 @@ block0(v1: i16): ; check: v4 = sextend.i64 v1 ; check: return v4 +function %suextend_icmp(i16, i16) -> i64 { +block0(v0: i16, v1: i16): + v2 = icmp slt v0, v1 + v3 = uextend.i32 v2 + v4 = sextend.i64 v3 + return v4 +} + +; check: v5 = uextend.i64 v2 +; check: return v5 + +function %usextend_icmp(i16, i16) -> i64 { +block0(v0: i16, v1: i16): + v2 = icmp uge v0, v1 + v3 = sextend.i32 v2 + v4 = uextend.i64 v3 + return v4 +} + +; check: v7 = uextend.i64 v2 +; check: return v7 + function %sextend_then_reduce(i16) -> i16 { block0(v1: i16): v2 = sextend.i32 v1 @@ -71,3 +93,137 @@ block0(v1: i32): } ; check: return v1 + +function %sextend_then_reduce_smaller(i32) -> i16 { +block0(v1: i32): + v2 = sextend.i64 v1 + v3 = ireduce.i16 v2 + return v3 +} + +; check: v4 = ireduce.i16 v1 +; check: return v4 + +function %uextend_then_reduce_smaller(i32) -> i16 { +block0(v1: i32): + v2 = uextend.i64 v1 + v3 = ireduce.i16 v2 + return v3 +} + +; check: v4 = ireduce.i16 v1 +; check: return v4 + +function %sextend_then_reduce_partially(i16) -> i32 { +block0(v1: i16): + v2 = sextend.i64 v1 + v3 = ireduce.i32 v2 + return v3 +} + +; check: v4 = sextend.i32 v1 +; check: return v4 + +function %uextend_then_reduce_partially(i16) -> i32 { +block0(v1: i16): + v2 = uextend.i64 v1 + v3 = ireduce.i32 v2 + return v3 +} + +; check: v4 = uextend.i32 v1 +; check: return v4 + +function %sextend_then_slt_zero(i8) -> i8 { +block0(v0: i8): + v1 = sextend.i16 v0 + v2 = iconst.i16 0 + v3 = icmp slt v1, v2 + return v3 +} + +; check: v4 = iconst.i8 0 +; check: v5 = icmp slt v0, v4 +; check: return v5 + +function %sextend_then_ne_zero(i8) -> i8 { +block0(v0: i8): + v1 = sextend.i16 v0 + v2 = iconst.i16 0 + v3 = icmp ne v1, v2 + return v3 +} + +; check: v4 = iconst.i8 0 +; check: v5 = icmp ne v0, v4 +; check: return v5 + +function %extend_imul_reduce(i64, i64) -> i64 { +block0(v0: i64, v1: i64): + v2 = uextend.i128 v0 + v3 = uextend.i128 v1 + v4 = imul v2, v3 + v5 = ireduce.i64 v4 + return v5 +} + +; check: v8 = imul v0, v1 +; check: return v8 + +function %extend_iadd_reduce(i16, i16) -> i16 { +block0(v0: i16, v1: i16): + v2 = sextend.i32 v0 + v3 = sextend.i32 v1 + v4 = iadd v2, v3 + v5 = ireduce.i16 v4 + return v5 +} + +; check: v8 = iadd v0, v1 +; check: return v8 + +function %extend_bxor_reduce(i64, i64) -> i64 { +block0(v0: i64, v1: i64): + v2 = uextend.i128 v0 + v3 = uextend.i128 v1 + v4 = bxor v2, v3 + v5 = ireduce.i64 v4 + return v5 +} + +; check: v6 = bxor v0, v1 +; check: return v6 + +function %extend_band_reduce(i16, i16) -> i16 { +block0(v0: i16, v1: i16): + v2 = sextend.i32 v0 + v3 = sextend.i32 v1 + v4 = band v2, v3 + v5 = ireduce.i16 v4 + return v5 +} + +; check: v8 = band v0, v1 +; check: return v8 + +function %extend_ineg_reduce(i64) -> i64 { +block0(v0: i64): + v1 = sextend.i128 v0 + v2 = ineg v1 + v3 = ireduce.i64 v2 + return v3 +} + +; check: v5 = ineg v0 +; check: return v5 + +function %extend_bnot_reduce(i16) -> i16 { +block0(v0: i16): + v1 = uextend.i32 v0 + v2 = bnot v1 + v3 = ireduce.i16 v2 + return v3 +} + +; check: v5 = bnot v0 +; check: return v5 diff --git a/cranelift/filetests/filetests/egraph/fcvt-from-int.clif b/cranelift/filetests/filetests/egraph/fcvt-from-int.clif new file mode 100644 index 000000000000..9d98b01412b0 --- /dev/null +++ b/cranelift/filetests/filetests/egraph/fcvt-from-int.clif @@ -0,0 +1,222 @@ +test optimize +set opt_level=speed +target x86_64 +target aarch64 +target s390x +target riscv64 + +function %i32_0_to_f32() -> f32 { +block0: + v0 = iconst.i32 0 + v1 = fcvt_from_sint.f32 v0 + return v1 + ; check: v2 = f32const 0.0 + ; check: return v2 +} + +function %i32_neg1_to_f32() -> f32 { +block0: + v0 = iconst.i32 -1 + v1 = fcvt_from_sint.f32 v0 + return v1 + ; check: v2 = f32const -0x1.000000p0 + ; check: return v2 +} + +function %i32_1_to_f32() -> f32 { +block0: + v0 = iconst.i32 1 + v1 = fcvt_from_sint.f32 v0 + return v1 + ; check: v2 = f32const 0x1.000000p0 + ; check: return v2 +} + +function %u32_0_to_f32() -> f32 { +block0: + v0 = iconst.i32 0 + v1 = fcvt_from_uint.f32 v0 + return v1 + ; check: v2 = f32const 0.0 + ; check: return v2 +} + +function %u32_neg1_to_f32() -> f32 { +block0: + v0 = iconst.i32 -1 + v1 = fcvt_from_uint.f32 v0 + return v1 + ; check: v2 = f32const 0x1.000000p32 + ; check: return v2 +} + +function %u32_1_to_f32() -> f32 { +block0: + v0 = iconst.i32 1 + v1 = fcvt_from_uint.f32 v0 + return v1 + ; check: v2 = f32const 0x1.000000p0 + ; check: return v2 +} + +function %i32_0_to_f64() -> f64 { +block0: + v0 = iconst.i32 0 + v1 = fcvt_from_sint.f64 v0 + return v1 + ; check: v2 = f64const 0.0 + ; check: return v2 +} + +function %i32_neg1_to_f64() -> f64 { +block0: + v0 = iconst.i32 -1 + v1 = fcvt_from_sint.f64 v0 + return v1 + ; check: v2 = f64const -0x1.0000000000000p0 + ; check: return v2 +} + +function %i32_1_to_f64() -> f64 { +block0: + v0 = iconst.i32 1 + v1 = fcvt_from_sint.f64 v0 + return v1 + ; check: v2 = f64const 0x1.0000000000000p0 + ; check: return v2 +} + +function %u32_0_to_f64() -> f64 { +block0: + v0 = iconst.i32 0 + v1 = fcvt_from_uint.f64 v0 + return v1 + ; check: v2 = f64const 0.0 + ; check: return v2 +} + +function %u32_neg1_to_f64() -> f64 { +block0: + v0 = iconst.i32 -1 + v1 = fcvt_from_uint.f64 v0 + return v1 + ; check: v2 = f64const 0x1.fffffffe00000p31 + ; check: return v2 +} + +function %u32_1_to_f64() -> f64 { +block0: + v0 = iconst.i32 1 + v1 = fcvt_from_uint.f64 v0 + return v1 + ; check: v2 = f64const 0x1.0000000000000p0 + ; check: return v2 +} + +function %i64_0_to_f32() -> f32 { +block0: + v0 = iconst.i64 0 + v1 = fcvt_from_sint.f32 v0 + return v1 + ; check: v2 = f32const 0.0 + ; check: return v2 +} + +function %i64_neg1_to_f32() -> f32 { +block0: + v0 = iconst.i64 -1 + v1 = fcvt_from_sint.f32 v0 + return v1 + ; check: v2 = f32const -0x1.000000p0 + ; check: return v2 +} + +function %i64_1_to_f32() -> f32 { +block0: + v0 = iconst.i64 1 + v1 = fcvt_from_sint.f32 v0 + return v1 + ; check: v2 = f32const 0x1.000000p0 + ; check: return v2 +} + +function %u64_0_to_f32() -> f32 { +block0: + v0 = iconst.i64 0 + v1 = fcvt_from_uint.f32 v0 + return v1 + ; check: v2 = f32const 0.0 + ; check: return v2 +} + +function %u64_neg1_to_f32() -> f32 { +block0: + v0 = iconst.i64 -1 + v1 = fcvt_from_uint.f32 v0 + return v1 + ; check: v2 = f32const 0x1.000000p64 + ; check: return v2 +} + +function %u64_1_to_f32() -> f32 { +block0: + v0 = iconst.i64 1 + v1 = fcvt_from_uint.f32 v0 + return v1 + ; check: v2 = f32const 0x1.000000p0 + ; check: return v2 +} + +function %i64_0_to_f64() -> f64 { +block0: + v0 = iconst.i64 0 + v1 = fcvt_from_sint.f64 v0 + return v1 + ; check: v2 = f64const 0.0 + ; check: return v2 +} + +function %i64_neg1_to_f64() -> f64 { +block0: + v0 = iconst.i64 -1 + v1 = fcvt_from_sint.f64 v0 + return v1 + ; check: v2 = f64const -0x1.0000000000000p0 + ; check: return v2 +} + +function %i64_1_to_f64() -> f64 { +block0: + v0 = iconst.i64 1 + v1 = fcvt_from_sint.f64 v0 + return v1 + ; check: v2 = f64const 0x1.0000000000000p0 + ; check: return v2 +} + +function %u64_0_to_f64() -> f64 { +block0: + v0 = iconst.i64 0 + v1 = fcvt_from_uint.f64 v0 + return v1 + ; check: v2 = f64const 0.0 + ; check: return v2 +} + +function %u64_neg1_to_f64() -> f64 { +block0: + v0 = iconst.i64 -1 + v1 = fcvt_from_uint.f64 v0 + return v1 + ; check: v2 = f64const 0x1.0000000000000p64 + ; check: return v2 +} + +function %u64_1_to_f64() -> f64 { +block0: + v0 = iconst.i64 1 + v1 = fcvt_from_uint.f64 v0 + return v1 + ; check: v2 = f64const 0x1.0000000000000p0 + ; check: return v2 +} diff --git a/cranelift/filetests/filetests/egraph/i128-opts.clif b/cranelift/filetests/filetests/egraph/i128-opts.clif index 40ef77f76763..f5347fb077a3 100644 --- a/cranelift/filetests/filetests/egraph/i128-opts.clif +++ b/cranelift/filetests/filetests/egraph/i128-opts.clif @@ -2,11 +2,136 @@ test optimize set opt_level=speed target x86_64 -; This it a regression test to ensure that we don't insert a iconst.i128 when optimizing bxor. -function %bxor_i128(i128) -> i128 system_v { +;; There's no `iconst.i128`, so these tests check that the various patterns +;; that might apply to `i128` introduce extended 64-bit constants instead, +;; or they're sufficiently conditioned to not apply. + +function %bxor_self_i128(i128) -> i128 { block0(v0: i128): v1 = bxor v0, v0 return v1 - ; check: v1 = bxor v0, v0 - ; nextln: return v1 + ; check: v2 = iconst.i64 0 + ; check: v3 = uextend.i128 v2 + ; check: return v3 +} + +function %isub_self_i128(i128) -> i128 { +block0(v0: i128): + v1 = isub v0, v0 + return v1 + ; check: v2 = iconst.i64 0 + ; check: v3 = uextend.i128 v2 ; v2 = 0 + ; check: return v3 +} + +function %band_bnot_self_i128(i128) -> i128 { +block0(v0: i128): + v1 = bnot v0 + v2 = band v0, v1 + return v2 + ; check: v3 = iconst.i64 0 + ; check: v4 = uextend.i128 v3 ; v3 = 0 + ; check: return v4 +} + +function %bxor_bnot_self_i128(i128) -> i128 { +block0(v0: i128): + v1 = bnot v0 + v2 = bxor v0, v1 + return v2 + ; check: v3 = iconst.i64 -1 + ; check: v4 = sextend.i128 v3 ; v3 = -1 + ; check: return v4 +} + +function %bor_bnot_self_i128(i128) -> i128 { +block0(v0: i128): + v1 = bnot v0 + v2 = bor v0, v1 + return v2 + ; check: v3 = iconst.i64 -1 + ; check: v4 = sextend.i128 v3 ; v3 = -1 + ; check: return v4 +} + +function %eq_self_i128(i128) -> i8 { +block0(v0: i128): + v1 = icmp eq v0, v0 + return v1 + ; check: v2 = iconst.i8 1 + ; check: return v2 ; v2 = 1 +} + +function %ne_self_i128(i128) -> i8 { +block0(v0: i128): + v1 = icmp ne v0, v0 + return v1 + ; check: v2 = iconst.i8 0 + ; check: return v2 ; v2 = 0 +} + +function %eq_self_v128(i8x16) -> i8x16 { +block0(v0: i8x16): + v1 = icmp eq v0, v0 + return v1 + ; check: v1 = icmp eq v0, v0 + ; check: return v1 +} + +function %ne_self_v128(i8x16) -> i8x16 { +block0(v0: i8x16): + v1 = icmp ne v0, v0 + return v1 + ; check: v1 = icmp ne v0, v0 + ; check: return v1 +} + +function %bor_extended_constants_i128() -> i128 { +block0: + v0 = iconst.i32 9 + v1 = uextend.i128 v0 + v2 = iconst.i32 12 + v3 = uextend.i128 v2 + v4 = bor v1, v3 + return v4 + ; check: v6 = iconst.i32 13 + ; check: v12 = uextend.i128 v6 ; v6 = 13 + ; check: return v12 +} + +;; These are big enough that they overflow u64, so should not be collapsed + +function %bnot_extended_constant_i128() -> i128 { +block0: + v0 = iconst.i32 0 + v1 = uextend.i128 v0 + v2 = bnot v1 + return v2 + ; check: v0 = iconst.i32 0 + ; check: v1 = uextend.i128 v0 + ; check: return v2 +} + +function %imul_extended_constants_i128() -> i128 { +block0: + v0 = iconst.i64 5_000_000_000 + v1 = uextend.i128 v0 + v2 = iconst.i64 7_000_000_000 + v3 = uextend.i128 v2 + v4 = imul v1, v3 + return v4 + ; check: v4 = imul v1, v3 + ; check: return v4 +} + +function %iadd_extended_constants_i128() -> i128 { +block0: + v0 = iconst.i64 0x8888_8888_8888_8888 + v1 = uextend.i128 v0 + v2 = iconst.i64 0x9999_9999_9999_9999 + v3 = uextend.i128 v2 + v4 = iadd v1, v3 + return v4 + ; check: v4 = iadd v1, v3 + ; check: return v4 } diff --git a/cranelift/filetests/filetests/egraph/icmp-parameterized.clif b/cranelift/filetests/filetests/egraph/icmp-parameterized.clif index 095361408944..0ce76115c611 100644 --- a/cranelift/filetests/filetests/egraph/icmp-parameterized.clif +++ b/cranelift/filetests/filetests/egraph/icmp-parameterized.clif @@ -567,9 +567,9 @@ block0(v0: i32): ; function %icmp_sle_umax(i32) -> i8 fast { ; block0(v0: i32): -; v1 = iconst.i32 0xffff_ffff -; v2 = icmp sle v0, v1 ; v1 = 0xffff_ffff -; return v2 +; v3 = iconst.i32 0 +; v4 = icmp slt v0, v3 ; v3 = 0 +; return v4 ; } function %icmp_sle_smin(i32) -> i8 { @@ -622,9 +622,9 @@ block0(v0: i32): ; function %icmp_sgt_umax(i32) -> i8 fast { ; block0(v0: i32): -; v1 = iconst.i32 0xffff_ffff -; v2 = icmp sgt v0, v1 ; v1 = 0xffff_ffff -; return v2 +; v3 = iconst.i32 0 +; v4 = icmp sge v0, v3 ; v3 = 0 +; return v4 ; } function %icmp_sgt_smin(i32) -> i8 { diff --git a/cranelift/filetests/filetests/egraph/icmp.clif b/cranelift/filetests/filetests/egraph/icmp.clif index ef60cbf958b3..01e6db2aa24a 100644 --- a/cranelift/filetests/filetests/egraph/icmp.clif +++ b/cranelift/filetests/filetests/egraph/icmp.clif @@ -53,3 +53,75 @@ block0: ; v5 = icmp ne v2, v3 ; v3 = 0 ; return v5 ; } + +function %sge_one(i64) -> i8 { +block0(v0: i64): + v1 = iconst.i64 1 + v2 = icmp sge v0, v1 + return v2 +} + +; function %sge_one(i64) -> i8 fast { +; block0(v0: i64): +; v3 = iconst.i64 0 +; v4 = icmp sgt v0, v3 ; v3 = 0 +; return v4 +; } + +function %slt_one(i16) -> i8 { +block0(v0: i16): + v1 = iconst.i16 1 + v2 = icmp slt v0, v1 + return v2 +} + +; function %slt_one(i16) -> i8 fast { +; block0(v0: i16): +; v3 = iconst.i16 0 +; v4 = icmp sle v0, v3 ; v3 = 0 +; return v4 +; } + +function %uge_one(i32) -> i8 { +block0(v0: i32): + v1 = iconst.i32 1 + v2 = icmp uge v0, v1 + return v2 +} + +; function %uge_one(i32) -> i8 fast { +; block0(v0: i32): +; v3 = iconst.i32 0 +; v4 = icmp ne v0, v3 ; v3 = 0 +; return v4 +; } + +function %ult_one(i8) -> i8 { +block0(v0: i8): + v1 = iconst.i8 1 + v2 = icmp ult v0, v1 + return v2 +} + +; function %ult_one(i8) -> i8 fast { +; block0(v0: i8): +; v3 = iconst.i8 0 +; v4 = icmp eq v0, v3 ; v3 = 0 +; return v4 +; } + +function %byte_icmp_ucmp(i8) -> i8 { +block0(v0: i8): + v1 = iconst.i8 0 + v2 = icmp sge v0, v1 + v3 = icmp eq v2, v1 + return v3 +} + +; function %byte_icmp_ucmp(i8) -> i8 fast { +; block0(v0: i8): +; v1 = iconst.i8 0 +; v4 = icmp slt v0, v1 ; v1 = 0 +; return v4 +; } + diff --git a/cranelift/filetests/filetests/egraph/issue-7875.clif b/cranelift/filetests/filetests/egraph/issue-7875.clif new file mode 100644 index 000000000000..abdcb32288a5 --- /dev/null +++ b/cranelift/filetests/filetests/egraph/issue-7875.clif @@ -0,0 +1,37 @@ +test optimize +set enable_verifier=true +set opt_level=speed +target x86_64 + +;; This test case should optimize just fine, and should definitely not produce +;; CLIF that has verifier errors like +;; +;; error: inst10 (v12 = select.f32 v11, v4, v10 ; v11 = 1): uses value arg +;; from non-dominating block4 + +function %foo() { +block0: + v0 = iconst.i64 0 + v2 = f32const 0.0 + v9 = f32const 0.0 + v20 = fneg v2 + v18 = fcmp eq v20, v20 + v4 = select v18, v2, v20 + v8 = iconst.i32 0 + v11 = iconst.i32 1 + brif v0, block2, block3 + +block2: + brif.i32 v8, block4(v2), block4(v9) + +block4(v10: f32): + v12 = select.f32 v11, v4, v10 + v13 = bitcast.i32 v12 + store v13, v0 + trap user0 + +block3: + v15 = bitcast.i32 v4 + store v15, v0 + return +} diff --git a/cranelift/filetests/filetests/egraph/remat.clif b/cranelift/filetests/filetests/egraph/remat.clif index a1be556ce2c0..5c98a0751647 100644 --- a/cranelift/filetests/filetests/egraph/remat.clif +++ b/cranelift/filetests/filetests/egraph/remat.clif @@ -22,10 +22,9 @@ block2: ; check: v2 = iadd v0, v1 ; check: brif v2, block1, block2 ; check: block1: -; check: v11 = iconst.i32 126 -; check: v13 = iadd.i32 v0, v11 -; check: return v13 +; check: v6 = iconst.i32 126 +; check: v12 = iadd.i32 v0, v6 +; check: return v12 ; check: block2: -; check: v15 = iadd.i32 v0, v1 -; check: return v15 - +; check: v14 = iadd.i32 v0, v1 +; check: return v14 diff --git a/cranelift/filetests/filetests/egraph/select.clif b/cranelift/filetests/filetests/egraph/select.clif index 8f5339417f72..8b916e90d466 100644 --- a/cranelift/filetests/filetests/egraph/select.clif +++ b/cranelift/filetests/filetests/egraph/select.clif @@ -141,3 +141,70 @@ block0(v0: i32, v1: i32, v2: i32, v3: i32): ; check: v4 = icmp ule v0, v1 ; check: v5 = select v4, v2, v3 ; check: return v5 + +function %then_true_else_false(i32, i32) -> i8 { +block0(v0: i32, v1: i32): + v2 = icmp ule v0, v1 + v3 = iconst.i8 1 + v4 = iconst.i8 0 + v5 = select v2, v3, v4 + return v5 +} +; check: return v2 + +function %then_false_else_true(i32, i32) -> i8 { +block0(v0: i32, v1: i32): + v2 = icmp slt v0, v1 + v3 = iconst.i8 0 + v4 = iconst.i8 1 + v5 = select v2, v3, v4 + return v5 +} +; check: v6 = icmp sge v0, v1 +; check: return v6 + +function %then_one_else_zero(i32, i32) -> i64 { +block0(v0: i32, v1: i32): + v2 = icmp ule v0, v1 + v3 = iconst.i64 1 + v4 = iconst.i64 0 + v5 = select v2, v3, v4 + return v5 +} +; check: v6 = uextend.i64 v2 +; check: return v6 + +function %then_zero_else_false(i32, i32) -> i64 { +block0(v0: i32, v1: i32): + v2 = icmp slt v0, v1 + v3 = iconst.i64 0 + v4 = iconst.i64 1 + v5 = select v2, v3, v4 + return v5 +} +; check: v6 = icmp sge v0, v1 +; check: v8 = uextend.i64 v6 +; check: return v8 + +function %then_negone_else_zero(i32, i32) -> i64 { +block0(v0: i32, v1: i32): + v2 = icmp ule v0, v1 + v3 = iconst.i64 -1 + v4 = iconst.i64 0 + v5 = select v2, v3, v4 + return v5 +} +; check: v6 = bmask.i64 v2 +; check: return v6 + +function %then_zero_else_else_negone(i32, i32) -> i64 { +block0(v0: i32, v1: i32): + v2 = icmp sle v0, v1 + v3 = iconst.i64 0 + v4 = iconst.i64 -1 + v5 = select v2, v3, v4 + return v5 +} +; check: v6 = icmp sgt v0, v1 +; check: v8 = bmask.i64 v6 +; check: return v8 diff --git a/cranelift/filetests/filetests/egraph/shifts.clif b/cranelift/filetests/filetests/egraph/shifts.clif index f2b992771bde..0bac80e99bda 100644 --- a/cranelift/filetests/filetests/egraph/shifts.clif +++ b/cranelift/filetests/filetests/egraph/shifts.clif @@ -651,9 +651,9 @@ block0(v0: i8): return v4 } -; check: v11 = iconst.i8 2 -; check: v13 = rotr v0, v11 ; v11 = 2 -; check: return v13 +; check: v6 = iconst.i8 2 +; check: v12 = rotr v0, v6 ; v6 = 2 +; check: return v12 function %rotr_rotr_add(i8, i8, i8) -> i8 { block0(v0: i8, v1: i8, v2: i8): @@ -675,9 +675,9 @@ block0(v0: i8): return v4 } -; check: v11 = iconst.i8 2 -; check: v13 = rotl v0, v11 ; v11 = 2 -; check: return v13 +; check: v6 = iconst.i8 2 +; check: v12 = rotl v0, v6 ; v6 = 2 +; check: return v12 function %rotl_rotl_add(i8, i8, i8) -> i8 { block0(v0: i8, v1: i8, v2: i8): @@ -701,8 +701,8 @@ block0(v0: i8): } ; check: v2 = iconst.i8 1 -; check: v21 = rotr v0, v2 ; v2 = 1 -; check: return v21 +; check: v15 = rotr v0, v2 ; v2 = 1 +; check: return v15 function %rotl_rotr_add(i8, i8, i8) -> i8 { block0(v0: i8, v1: i8, v2: i8): @@ -725,8 +725,8 @@ block0(v0: i8): } ; check: v2 = iconst.i8 1 -; check: v21 = rotl v0, v2 ; v2 = 1 -; check: return v21 +; check: v15 = rotl v0, v2 ; v2 = 1 +; check: return v15 function %rotl_rotr_add(i8, i8, i8) -> i8 { block0(v0: i8, v1: i8, v2: i8): diff --git a/cranelift/filetests/filetests/egraph/spaceship.clif b/cranelift/filetests/filetests/egraph/spaceship.clif new file mode 100644 index 000000000000..7c1c8e2be099 --- /dev/null +++ b/cranelift/filetests/filetests/egraph/spaceship.clif @@ -0,0 +1,528 @@ +test optimize +set opt_level=speed +target x86_64 +target aarch64 +target s390x +target riscv64 + +function %cmp_s1a(i32, i32) -> i8 { +block0(v0: i32, v1: i32): + v2 = icmp slt v0, v1 + v3 = icmp eq v0, v1 + v4 = iconst.i8 -1 + v5 = iconst.i8 0 + v6 = iconst.i8 +1 + v7 = select v3, v5, v6 + v8 = select v2, v4, v7 + return v8 + ; check: v13 = icmp sgt v0, v1 + ; check: v14 = icmp slt v0, v1 + ; check: v15 = isub v13, v14 + ; check: return v15 +} + +function %cmp_s1b(i32, i32) -> i16 { +block0(v0: i32, v1: i32): + v2 = icmp slt v0, v1 + v3 = icmp sle v0, v1 + v4 = iconst.i16 -1 + v5 = iconst.i16 0 + v6 = iconst.i16 +1 + v7 = select v3, v5, v6 + v8 = select v2, v4, v7 + return v8 + ; check: v9 = icmp sgt v0, v1 + ; check: v14 = icmp slt v0, v1 + ; check: v15 = isub v9, v14 + ; check: v16 = sextend.i16 v15 + ; check: return v16 +} + +function %cmp_s2a(i32, i32) -> i8 { +block0(v0: i32, v1: i32): + v2 = icmp slt v0, v1 + v3 = icmp ne v0, v1 + v4 = iconst.i8 -1 + v5 = iconst.i8 +1 + v6 = iconst.i8 0 + v7 = select v3, v5, v6 + v8 = select v2, v4, v7 + return v8 + ; check: v10 = icmp sgt v0, v1 + ; check: v11 = icmp slt v0, v1 + ; check: v12 = isub v10, v11 + ; check: return v12 +} + +function %cmp_s2b(i32, i32) -> i16 { +block0(v0: i32, v1: i32): + v2 = icmp slt v0, v1 + v3 = icmp sgt v0, v1 + v4 = iconst.i16 -1 + v5 = iconst.i16 +1 + v6 = iconst.i16 0 + v7 = select v3, v5, v6 + v8 = select v2, v4, v7 + return v8 + ; check: v11 = icmp sgt v0, v1 + ; check: v12 = icmp slt v0, v1 + ; check: v13 = isub v11, v12 + ; check: v14 = sextend.i16 v13 + ; check: return v14 +} + +function %cmp_s3a(i32, i32) -> i8 { +block0(v0: i32, v1: i32): + v2 = icmp eq v0, v1 + v3 = icmp slt v0, v1 + v4 = iconst.i8 0 + v5 = iconst.i8 -1 + v6 = iconst.i8 +1 + v7 = select v3, v5, v6 + v8 = select v2, v4, v7 + return v8 + ; check: v9 = icmp sgt v0, v1 + ; check: v10 = icmp slt v0, v1 + ; check: v11 = isub v9, v10 + ; check: return v11 +} + +function %cmp_s3b(i32, i32) -> i16 { +block0(v0: i32, v1: i32): + v2 = icmp eq v0, v1 + v3 = icmp sle v0, v1 + v4 = iconst.i16 0 + v5 = iconst.i16 -1 + v6 = iconst.i16 +1 + v7 = select v3, v5, v6 + v8 = select v2, v4, v7 + return v8 + ; check: v9 = icmp sgt v0, v1 + ; check: v10 = icmp slt v0, v1 + ; check: v11 = isub v9, v10 + ; check: v12 = sextend.i16 v11 + ; check: return v12 +} + +function %cmp_s4a(i32, i32) -> i8 { +block0(v0: i32, v1: i32): + v2 = icmp eq v0, v1 + v3 = icmp sgt v0, v1 + v4 = iconst.i8 0 + v5 = iconst.i8 +1 + v6 = iconst.i8 -1 + v7 = select v3, v5, v6 + v8 = select v2, v4, v7 + return v8 + ; check: v9 = icmp sgt v0, v1 + ; check: v10 = icmp slt v0, v1 + ; check: v11 = isub v9, v10 + ; check: return v11 +} + +function %cmp_s4b(i32, i32) -> i16 { +block0(v0: i32, v1: i32): + v2 = icmp eq v0, v1 + v3 = icmp sge v0, v1 + v4 = iconst.i16 0 + v5 = iconst.i16 +1 + v6 = iconst.i16 -1 + v7 = select v3, v5, v6 + v8 = select v2, v4, v7 + return v8 + ; check: v9 = icmp sgt v0, v1 + ; check: v10 = icmp slt v0, v1 + ; check: v11 = isub v9, v10 + ; check: v12 = sextend.i16 v11 + ; check: return v12 +} + +function %cmp_s5a(i32, i32) -> i8 { +block0(v0: i32, v1: i32): + v2 = icmp sgt v0, v1 + v3 = icmp slt v0, v1 + v4 = iconst.i8 +1 + v5 = iconst.i8 -1 + v6 = iconst.i8 0 + v7 = select v3, v5, v6 + v8 = select v2, v4, v7 + return v8 + ; check: v13 = icmp sgt v0, v1 + ; check: v14 = icmp slt v0, v1 + ; check: v15 = isub v13, v14 + ; check: return v15 +} + +function %cmp_s5b(i32, i32) -> i16 { +block0(v0: i32, v1: i32): + v2 = icmp sgt v0, v1 + v3 = icmp ne v0, v1 + v4 = iconst.i16 +1 + v5 = iconst.i16 -1 + v6 = iconst.i16 0 + v7 = select v3, v5, v6 + v8 = select v2, v4, v7 + return v8 + ; check: v11 = icmp sgt v0, v1 + ; check: v12 = icmp slt v0, v1 + ; check: v13 = isub v11, v12 + ; check: v14 = sextend.i16 v13 + ; check: return v14 +} + +function %cmp_s6a(i32, i32) -> i8 { +block0(v0: i32, v1: i32): + v2 = icmp sgt v0, v1 + v3 = icmp sge v0, v1 + v4 = iconst.i8 +1 + v5 = iconst.i8 0 + v6 = iconst.i8 -1 + v7 = select v3, v5, v6 + v8 = select v2, v4, v7 + return v8 + ; check: v16 = icmp sgt v0, v1 + ; check: v9 = icmp slt v0, v1 + ; check: v17 = isub v16, v9 + ; check: return v17 +} + +function %cmp_s6b(i32, i32) -> i16 { +block0(v0: i32, v1: i32): + v2 = icmp sgt v0, v1 + v3 = icmp eq v0, v1 + v4 = iconst.i16 +1 + v5 = iconst.i16 0 + v6 = iconst.i16 -1 + v7 = select v3, v5, v6 + v8 = select v2, v4, v7 + return v8 + ; check: v14 = icmp sgt v0, v1 + ; check: v15 = icmp slt v0, v1 + ; check: v16 = isub v14, v15 + ; check: v17 = sextend.i16 v16 + ; check: return v17 +} + +;; And again for unsigned... + +function %cmp_u1a(i32, i32) -> i16 { +block0(v0: i32, v1: i32): + v2 = icmp ult v0, v1 + v3 = icmp eq v0, v1 + v4 = iconst.i16 -1 + v5 = iconst.i16 0 + v6 = iconst.i16 +1 + v7 = select v3, v5, v6 + v8 = select v2, v4, v7 + return v8 + ; check: v14 = icmp ugt v0, v1 + ; check: v15 = icmp ult v0, v1 + ; check: v16 = isub v14, v15 + ; check: v17 = sextend.i16 v16 + ; check: return v17 +} + +function %cmp_u1b(i32, i32) -> i8 { +block0(v0: i32, v1: i32): + v2 = icmp ult v0, v1 + v3 = icmp ule v0, v1 + v4 = iconst.i8 -1 + v5 = iconst.i8 0 + v6 = iconst.i8 +1 + v7 = select v3, v5, v6 + v8 = select v2, v4, v7 + return v8 + ; check: v9 = icmp ugt v0, v1 + ; check: v13 = icmp ult v0, v1 + ; check: v14 = isub v9, v13 + ; check: return v14 +} + +function %cmp_u2a(i32, i32) -> i16 { +block0(v0: i32, v1: i32): + v2 = icmp ult v0, v1 + v3 = icmp ne v0, v1 + v4 = iconst.i16 -1 + v5 = iconst.i16 +1 + v6 = iconst.i16 0 + v7 = select v3, v5, v6 + v8 = select v2, v4, v7 + return v8 + ; check: v11 = icmp ugt v0, v1 + ; check: v12 = icmp ult v0, v1 + ; check: v13 = isub v11, v12 + ; check: v14 = sextend.i16 v13 + ; check: return v14 +} + +function %cmp_u2b(i32, i32) -> i8 { +block0(v0: i32, v1: i32): + v2 = icmp ult v0, v1 + v3 = icmp ugt v0, v1 + v4 = iconst.i8 -1 + v5 = iconst.i8 +1 + v6 = iconst.i8 0 + v7 = select v3, v5, v6 + v8 = select v2, v4, v7 + return v8 + ; check: v10 = icmp ugt v0, v1 + ; check: v11 = icmp ult v0, v1 + ; check: v12 = isub v10, v11 + ; check: return v12 +} + +function %cmp_u3a(i32, i32) -> i16 { +block0(v0: i32, v1: i32): + v2 = icmp eq v0, v1 + v3 = icmp ult v0, v1 + v4 = iconst.i16 0 + v5 = iconst.i16 -1 + v6 = iconst.i16 +1 + v7 = select v3, v5, v6 + v8 = select v2, v4, v7 + return v8 + ; check: v9 = icmp ugt v0, v1 + ; check: v10 = icmp ult v0, v1 + ; check: v11 = isub v9, v10 + ; check: v12 = sextend.i16 v11 + ; check: return v12 +} + +function %cmp_u3b(i32, i32) -> i8 { +block0(v0: i32, v1: i32): + v2 = icmp eq v0, v1 + v3 = icmp ule v0, v1 + v4 = iconst.i8 0 + v5 = iconst.i8 -1 + v6 = iconst.i8 +1 + v7 = select v3, v5, v6 + v8 = select v2, v4, v7 + return v8 + ; check: v9 = icmp ugt v0, v1 + ; check: v10 = icmp ult v0, v1 + ; check: v11 = isub v9, v10 + ; check: return v11 +} + +function %cmp_u4a(i32, i32) -> i16 { +block0(v0: i32, v1: i32): + v2 = icmp eq v0, v1 + v3 = icmp ugt v0, v1 + v4 = iconst.i16 0 + v5 = iconst.i16 +1 + v6 = iconst.i16 -1 + v7 = select v3, v5, v6 + v8 = select v2, v4, v7 + return v8 + ; check: v9 = icmp ugt v0, v1 + ; check: v10 = icmp ult v0, v1 + ; check: v11 = isub v9, v10 + ; check: v12 = sextend.i16 v11 + ; check: return v12 +} + +function %cmp_u4b(i32, i32) -> i8 { +block0(v0: i32, v1: i32): + v2 = icmp eq v0, v1 + v3 = icmp uge v0, v1 + v4 = iconst.i8 0 + v5 = iconst.i8 +1 + v6 = iconst.i8 -1 + v7 = select v3, v5, v6 + v8 = select v2, v4, v7 + return v8 + ; check: v9 = icmp ugt v0, v1 + ; check: v10 = icmp ult v0, v1 + ; check: v11 = isub v9, v10 + ; check: return v11 +} + +function %cmp_u5a(i32, i32) -> i16 { +block0(v0: i32, v1: i32): + v2 = icmp ugt v0, v1 + v3 = icmp ult v0, v1 + v4 = iconst.i16 +1 + v5 = iconst.i16 -1 + v6 = iconst.i16 0 + v7 = select v3, v5, v6 + v8 = select v2, v4, v7 + return v8 + ; check: v11 = icmp ugt v0, v1 + ; check: v12 = icmp ult v0, v1 + ; check: v13 = isub v11, v12 + ; check: v14 = sextend.i16 v13 + ; check: return v14 +} + +function %cmp_u5b(i32, i32) -> i8 { +block0(v0: i32, v1: i32): + v2 = icmp ugt v0, v1 + v3 = icmp ne v0, v1 + v4 = iconst.i8 +1 + v5 = iconst.i8 -1 + v6 = iconst.i8 0 + v7 = select v3, v5, v6 + v8 = select v2, v4, v7 + return v8 + ; check: v13 = icmp ugt v0, v1 + ; check: v14 = icmp ult v0, v1 + ; check: v15 = isub v13, v14 + ; check: return v15 +} + +function %cmp_u6a(i32, i32) -> i16 { +block0(v0: i32, v1: i32): + v2 = icmp ugt v0, v1 + v3 = icmp uge v0, v1 + v4 = iconst.i16 +1 + v5 = iconst.i16 0 + v6 = iconst.i16 -1 + v7 = select v3, v5, v6 + v8 = select v2, v4, v7 + return v8 + ; check: v14 = icmp ugt v0, v1 + ; check: v9 = icmp ult v0, v1 + ; check: v15 = isub v14, v9 + ; check: v16 = sextend.i16 v15 + ; check: return v16 +} + +function %cmp_u6b(i32, i32) -> i8 { +block0(v0: i32, v1: i32): + v2 = icmp ugt v0, v1 + v3 = icmp eq v0, v1 + v4 = iconst.i8 +1 + v5 = iconst.i8 0 + v6 = iconst.i8 -1 + v7 = select v3, v5, v6 + v8 = select v2, v4, v7 + return v8 + ; check: v16 = icmp ugt v0, v1 + ; check: v17 = icmp ult v0, v1 + ; check: v18 = isub v16, v17 + ; check: return v18 +} + +;; Then a few of the simplifications + +function %ult_via_cmp(i8, i8) -> i8 { +block0(v0: i8, v1: i8): + v2 = icmp ugt v0, v1 + v3 = icmp ult v0, v1 + v4 = isub v2, v3 + v5 = iconst.i8 0 + v6 = icmp slt v4, v5 + return v6 + ; check: v3 = icmp ult v0, v1 + ; check: return v3 +} + +function %sle_via_cmp(i16, i16) -> i8 { +block0(v0: i16, v1: i16): + v2 = icmp sgt v0, v1 + v3 = icmp slt v0, v1 + v4 = isub v2, v3 + v5 = iconst.i8 0 + v6 = icmp sle v4, v5 + return v6 + ; check: v7 = icmp sle v0, v1 + ; check: return v7 +} + +function %sgt_via_cmp(i32, i32) -> i8 { +block0(v0: i32, v1: i32): + v2 = icmp sgt v0, v1 + v3 = icmp slt v0, v1 + v4 = isub v2, v3 + v5 = iconst.i8 0 + v6 = icmp sgt v4, v5 + return v6 + ; check: v7 = icmp sgt v0, v1 + ; check: return v7 +} + +function %uge_via_cmp(i64, i64) -> i8 { +block0(v0: i64, v1: i64): + v2 = icmp ugt v0, v1 + v3 = icmp ult v0, v1 + v4 = isub v2, v3 + v5 = iconst.i8 0 + v6 = icmp sge v4, v5 + return v6 + ; check: v7 = icmp uge v0, v1 + ; check: return v7 +} + +function %eq_via_cmp(i16, i16) -> i8 { +block0(v0: i16, v1: i16): + v2 = icmp ugt v0, v1 + v3 = icmp ult v0, v1 + v4 = isub v2, v3 + v5 = sextend.i32 v4 + v6 = iconst.i32 0 + v7 = icmp eq v5, v6 + return v7 + ; check: v10 = icmp eq v0, v1 + ; check: return v10 +} + +function %ne_via_cmp(i16, i16) -> i8 { +block0(v0: i16, v1: i16): + v2 = icmp ugt v0, v1 + v3 = icmp ult v0, v1 + v4 = isub v2, v3 + v5 = sextend.i32 v4 + v6 = iconst.i32 0 + v7 = icmp ne v5, v6 + return v7 + ; check: v10 = icmp ne v0, v1 + ; check: return v10 +} + +function %ult_via_cmp_eq_less(i8, i8) -> i8 { +block0(v0: i8, v1: i8): + v2 = icmp ugt v0, v1 + v3 = icmp ult v0, v1 + v4 = isub v2, v3 + v5 = iconst.i8 -1 + v6 = icmp eq v4, v5 + return v6 + ; check: v3 = icmp ult v0, v1 + ; check: return v3 +} + +function %uge_via_cmp_ne_less(i8, i8) -> i8 { +block0(v0: i8, v1: i8): + v2 = icmp ugt v0, v1 + v3 = icmp ult v0, v1 + v4 = isub v2, v3 + v5 = iconst.i8 -1 + v6 = icmp ne v4, v5 + return v6 + ; check: v7 = icmp uge v0, v1 + ; check: return v7 +} + +function %sgt_via_cmp_eq_greater(i8, i8) -> i8 { +block0(v0: i8, v1: i8): + v2 = icmp sgt v0, v1 + v3 = icmp slt v0, v1 + v4 = isub v2, v3 + v5 = iconst.i8 1 + v6 = icmp eq v4, v5 + return v6 + ; check: v2 = icmp sgt v0, v1 + ; check: return v2 +} + +function %sle_via_cmp_ne_less(i8, i8) -> i8 { +block0(v0: i8, v1: i8): + v2 = icmp sgt v0, v1 + v3 = icmp slt v0, v1 + v4 = isub v2, v3 + v5 = iconst.i8 1 + v6 = icmp ne v4, v5 + return v6 + ; check: v7 = icmp sle v0, v1 + ; check: return v7 +} diff --git a/cranelift/filetests/filetests/egraph/unordered.clif b/cranelift/filetests/filetests/egraph/unordered.clif new file mode 100644 index 000000000000..5afaa13ab292 --- /dev/null +++ b/cranelift/filetests/filetests/egraph/unordered.clif @@ -0,0 +1,24 @@ +test optimize precise-output +set opt_level=speed +target x86_64 + +; https://github.com/bytecodealliance/wasmtime/issues/6126 +; +; In this example, iconst defines v2, and later an identical iconst defines v1. +; In between, v2 is used in an iadd instruction that's added to the GVN map. +; Finally, v1 is used in another iadd which should unify with the first one. +function %unordered(i32) -> i32, i32 { +block0(v0: i32): + v2 = iconst.i32 42 + v3 = iadd v0, v2 + v1 = iconst.i32 42 + v4 = iadd v0, v1 + return v3, v4 +} + +; function %unordered(i32) -> i32, i32 fast { +; block0(v0: i32): +; v2 = iconst.i32 42 +; v3 = iadd v0, v2 ; v2 = 42 +; return v3, v3 +; } diff --git a/cranelift/filetests/filetests/isa/riscv64/simd-isub-splat.clif b/cranelift/filetests/filetests/isa/riscv64/simd-isub-splat.clif index 7cd34b766378..f4e9b423da87 100644 --- a/cranelift/filetests/filetests/isa/riscv64/simd-isub-splat.clif +++ b/cranelift/filetests/filetests/isa/riscv64/simd-isub-splat.clif @@ -334,9 +334,8 @@ block0(v0: i8x16): ; mv fp,sp ; block0: ; vle8.v v9,16(fp) #avl=16, #vtype=(e8, m1, ta, ma) -; li a5,5 -; vsub.vx v13,v9,a5 #avl=16, #vtype=(e8, m1, ta, ma) -; vse8.v v13,0(a0) #avl=16, #vtype=(e8, m1, ta, ma) +; vadd.vi v12,v9,-5 #avl=16, #vtype=(e8, m1, ta, ma) +; vse8.v v12,0(a0) #avl=16, #vtype=(e8, m1, ta, ma) ; ld ra,8(sp) ; ld fp,0(sp) ; addi sp,sp,16 @@ -352,9 +351,8 @@ block0(v0: i8x16): ; .byte 0x57, 0x70, 0x08, 0xcc ; addi t6, s0, 0x10 ; .byte 0x87, 0x84, 0x0f, 0x02 -; addi a5, zero, 5 -; .byte 0xd7, 0xc6, 0x97, 0x0a -; .byte 0xa7, 0x06, 0x05, 0x02 +; .byte 0x57, 0xb6, 0x9d, 0x02 +; .byte 0x27, 0x06, 0x05, 0x02 ; ld ra, 8(sp) ; ld s0, 0(sp) ; addi sp, sp, 0x10 @@ -418,9 +416,8 @@ block0(v0: i32x4): ; mv fp,sp ; block0: ; vle8.v v9,16(fp) #avl=16, #vtype=(e8, m1, ta, ma) -; li a5,15 -; vsub.vx v13,v9,a5 #avl=4, #vtype=(e32, m1, ta, ma) -; vse8.v v13,0(a0) #avl=16, #vtype=(e8, m1, ta, ma) +; vadd.vi v12,v9,-15 #avl=4, #vtype=(e32, m1, ta, ma) +; vse8.v v12,0(a0) #avl=16, #vtype=(e8, m1, ta, ma) ; ld ra,8(sp) ; ld fp,0(sp) ; addi sp,sp,16 @@ -436,11 +433,10 @@ block0(v0: i32x4): ; .byte 0x57, 0x70, 0x08, 0xcc ; addi t6, s0, 0x10 ; .byte 0x87, 0x84, 0x0f, 0x02 -; addi a5, zero, 0xf ; .byte 0x57, 0x70, 0x02, 0xcd -; .byte 0xd7, 0xc6, 0x97, 0x0a +; .byte 0x57, 0xb6, 0x98, 0x02 ; .byte 0x57, 0x70, 0x08, 0xcc -; .byte 0xa7, 0x06, 0x05, 0x02 +; .byte 0x27, 0x06, 0x05, 0x02 ; ld ra, 8(sp) ; ld s0, 0(sp) ; addi sp, sp, 0x10 @@ -461,9 +457,8 @@ block0(v0: i64x2): ; mv fp,sp ; block0: ; vle8.v v9,16(fp) #avl=16, #vtype=(e8, m1, ta, ma) -; li a5,-5 -; vsub.vx v13,v9,a5 #avl=2, #vtype=(e64, m1, ta, ma) -; vse8.v v13,0(a0) #avl=16, #vtype=(e8, m1, ta, ma) +; vadd.vi v12,v9,5 #avl=2, #vtype=(e64, m1, ta, ma) +; vse8.v v12,0(a0) #avl=16, #vtype=(e8, m1, ta, ma) ; ld ra,8(sp) ; ld fp,0(sp) ; addi sp,sp,16 @@ -479,11 +474,10 @@ block0(v0: i64x2): ; .byte 0x57, 0x70, 0x08, 0xcc ; addi t6, s0, 0x10 ; .byte 0x87, 0x84, 0x0f, 0x02 -; addi a5, zero, -5 ; .byte 0x57, 0x70, 0x81, 0xcd -; .byte 0xd7, 0xc6, 0x97, 0x0a +; .byte 0x57, 0xb6, 0x92, 0x02 ; .byte 0x57, 0x70, 0x08, 0xcc -; .byte 0xa7, 0x06, 0x05, 0x02 +; .byte 0x27, 0x06, 0x05, 0x02 ; ld ra, 8(sp) ; ld s0, 0(sp) ; addi sp, sp, 0x10 diff --git a/cranelift/filetests/filetests/isa/x64/bmask.clif b/cranelift/filetests/filetests/isa/x64/bmask.clif index 3871aaec8c59..4fc904755747 100644 --- a/cranelift/filetests/filetests/isa/x64/bmask.clif +++ b/cranelift/filetests/filetests/isa/x64/bmask.clif @@ -798,3 +798,66 @@ block0(v0: i8): ; popq %rbp ; retq +function %bmask_icmp_i32_i8(i32, i32) -> i8 { +block0(v0: i32, v1: i32): + v2 = icmp sgt v0, v1 + v3 = bmask.i8 v2 + return v3 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; cmpl %esi, %edi +; setnle %al +; movq %rax, %r8 +; negb %r8b, %r8b +; sbbl %eax, %eax, %eax +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; cmpl %esi, %edi +; setg %al +; movq %rax, %r8 +; negb %r8b +; sbbl %eax, %eax +; movq %rbp, %rsp +; popq %rbp +; retq + +function %ineg_icmp_i32_i8(i32, i32) -> i8 { +block0(v0: i32, v1: i32): + v2 = icmp sgt v0, v1 + v3 = ineg v2 + return v3 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; cmpl %esi, %edi +; setnle %al +; negb %al, %al +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; cmpl %esi, %edi +; setg %al +; negb %al +; movq %rbp, %rsp +; popq %rbp +; retq diff --git a/cranelift/filetests/filetests/isa/x64/fcvt-avx.clif b/cranelift/filetests/filetests/isa/x64/fcvt-avx.clif index d46212e18597..5d72e1090df6 100644 --- a/cranelift/filetests/filetests/isa/x64/fcvt-avx.clif +++ b/cranelift/filetests/filetests/isa/x64/fcvt-avx.clif @@ -113,3 +113,45 @@ block0(v0: i64): ; popq %rbp ; retq +function %u64x2_to_f64x2(i64x2) -> f64x2 { +block0(v0: i64x2): + v1 = fcvt_from_uint.f64x2 v0 + return v1 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; vpand %xmm0, const(0), %xmm2 +; vpor %xmm2, const(1), %xmm4 +; vpsrlq %xmm0, $32, %xmm6 +; vpor %xmm6, const(2), %xmm0 +; vsubpd %xmm0, const(3), %xmm2 +; vaddpd %xmm4, %xmm2, %xmm0 +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; vpand 0x34(%rip), %xmm0, %xmm2 +; vpor 0x3c(%rip), %xmm2, %xmm4 +; vpsrlq $0x20, %xmm0, %xmm6 +; vpor 0x3f(%rip), %xmm6, %xmm0 +; vsubpd 0x47(%rip), %xmm0, %xmm2 +; vaddpd %xmm2, %xmm4, %xmm0 +; movq %rbp, %rsp +; popq %rbp +; retq +; addb %al, (%rax) +; addb %al, (%rax) +; addb %al, (%rax) +; addb %al, (%rax) +; addb %al, (%rax) +; addb %al, (%rax) +; addb %al, (%rax) + diff --git a/cranelift/filetests/filetests/isa/x64/fcvt.clif b/cranelift/filetests/filetests/isa/x64/fcvt.clif index 2533ccb85fa8..882d253e36e4 100644 --- a/cranelift/filetests/filetests/isa/x64/fcvt.clif +++ b/cranelift/filetests/filetests/isa/x64/fcvt.clif @@ -1146,3 +1146,53 @@ block0(v0: f32x4): ; popq %rbp ; retq +function %u64x2_to_f64x2(i64x2) -> f64x2 { +block0(v0: i64x2): + v1 = fcvt_from_uint.f64x2 v0 + return v1 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; movdqa %xmm0, %xmm7 +; pand %xmm7, const(0), %xmm7 +; movdqa %xmm7, %xmm1 +; por %xmm1, const(1), %xmm1 +; movdqa %xmm1, %xmm7 +; psrlq %xmm0, $32, %xmm0 +; por %xmm0, const(2), %xmm0 +; subpd %xmm0, const(3), %xmm0 +; movdqa %xmm0, %xmm1 +; movdqa %xmm7, %xmm0 +; addpd %xmm0, %xmm1, %xmm0 +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; movdqa %xmm0, %xmm7 +; pand 0x40(%rip), %xmm7 +; movdqa %xmm7, %xmm1 +; por 0x44(%rip), %xmm1 +; movdqa %xmm1, %xmm7 +; psrlq $0x20, %xmm0 +; por 0x43(%rip), %xmm0 +; subpd 0x4b(%rip), %xmm0 +; movdqa %xmm0, %xmm1 +; movdqa %xmm7, %xmm0 +; addpd %xmm1, %xmm0 +; movq %rbp, %rsp +; popq %rbp +; retq +; addb %al, (%rax) +; addb %al, (%rax) +; addb %al, (%rax) +; addb %al, (%rax) +; addb %al, (%rax) + diff --git a/cranelift/filetests/filetests/isa/x64/fpromote-demote-avx.clif b/cranelift/filetests/filetests/isa/x64/fpromote-demote-avx.clif index 4b07ebfa4ad3..3feb3e07e2ec 100644 --- a/cranelift/filetests/filetests/isa/x64/fpromote-demote-avx.clif +++ b/cranelift/filetests/filetests/isa/x64/fpromote-demote-avx.clif @@ -11,7 +11,9 @@ block0(v0: f32): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; vcvtss2sd %xmm0, %xmm0 +; uninit %xmm2 +; vxorpd %xmm2, %xmm2, %xmm4 +; vcvtss2sd %xmm4, %xmm0, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; ret @@ -21,7 +23,8 @@ block0(v0: f32): ; pushq %rbp ; movq %rsp, %rbp ; block1: ; offset 0x4 -; vcvtss2sd %xmm0, %xmm0, %xmm0 +; vxorpd %xmm2, %xmm2, %xmm4 +; vcvtss2sd %xmm0, %xmm4, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; retq @@ -42,9 +45,11 @@ block0(v1: i64, v2: f32): ; movq %rsp, %rbp ; subq %rsp, $16, %rsp ; block0: -; lea rsp(0 + virtual offset), %rdx -; vmovss %xmm0, 0(%rdx) -; vcvtss2sd 0(%rdx), %xmm0 +; lea rsp(0 + virtual offset), %r9 +; vmovss %xmm0, 0(%r9) +; uninit %xmm5 +; vxorpd %xmm5, %xmm5, %xmm7 +; vcvtss2sd %xmm7, 0(%r9), %xmm0 ; addq %rsp, $16, %rsp ; movq %rbp, %rsp ; popq %rbp @@ -56,9 +61,10 @@ block0(v1: i64, v2: f32): ; movq %rsp, %rbp ; subq $0x10, %rsp ; block1: ; offset 0x8 -; leaq (%rsp), %rdx -; vmovss %xmm0, (%rdx) ; trap: heap_oob -; vcvtss2sd (%rdx), %xmm0, %xmm0 ; trap: heap_oob +; leaq (%rsp), %r9 +; vmovss %xmm0, (%r9) ; trap: heap_oob +; vxorpd %xmm5, %xmm5, %xmm7 +; vcvtss2sd (%r9), %xmm7, %xmm0 ; trap: heap_oob ; addq $0x10, %rsp ; movq %rbp, %rsp ; popq %rbp @@ -74,7 +80,9 @@ block0(v0: f64): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; vcvtsd2ss %xmm0, %xmm0 +; uninit %xmm2 +; vxorps %xmm2, %xmm2, %xmm4 +; vcvtsd2ss %xmm4, %xmm0, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; ret @@ -84,7 +92,8 @@ block0(v0: f64): ; pushq %rbp ; movq %rsp, %rbp ; block1: ; offset 0x4 -; vcvtsd2ss %xmm0, %xmm0, %xmm0 +; vxorps %xmm2, %xmm2, %xmm4 +; vcvtsd2ss %xmm0, %xmm4, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; retq @@ -105,9 +114,11 @@ block0(v1: i64, v2: f64): ; movq %rsp, %rbp ; subq %rsp, $16, %rsp ; block0: -; lea rsp(0 + virtual offset), %rdx -; vmovsd %xmm0, 0(%rdx) -; vcvtsd2ss 0(%rdx), %xmm0 +; lea rsp(0 + virtual offset), %r9 +; vmovsd %xmm0, 0(%r9) +; uninit %xmm5 +; vxorps %xmm5, %xmm5, %xmm7 +; vcvtsd2ss %xmm7, 0(%r9), %xmm0 ; addq %rsp, $16, %rsp ; movq %rbp, %rsp ; popq %rbp @@ -119,9 +130,10 @@ block0(v1: i64, v2: f64): ; movq %rsp, %rbp ; subq $0x10, %rsp ; block1: ; offset 0x8 -; leaq (%rsp), %rdx -; vmovsd %xmm0, (%rdx) ; trap: heap_oob -; vcvtsd2ss (%rdx), %xmm0, %xmm0 ; trap: heap_oob +; leaq (%rsp), %r9 +; vmovsd %xmm0, (%r9) ; trap: heap_oob +; vxorps %xmm5, %xmm5, %xmm7 +; vcvtsd2ss (%r9), %xmm7, %xmm0 ; trap: heap_oob ; addq $0x10, %rsp ; movq %rbp, %rsp ; popq %rbp diff --git a/cranelift/filetests/filetests/isa/x64/fpromote-demote.clif b/cranelift/filetests/filetests/isa/x64/fpromote-demote.clif index 465460962f13..c7dc0db58630 100644 --- a/cranelift/filetests/filetests/isa/x64/fpromote-demote.clif +++ b/cranelift/filetests/filetests/isa/x64/fpromote-demote.clif @@ -11,7 +11,11 @@ block0(v0: f32): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; cvtss2sd %xmm0, %xmm0 +; movdqa %xmm0, %xmm5 +; uninit %xmm0 +; xorpd %xmm0, %xmm0, %xmm0 +; movdqa %xmm5, %xmm7 +; cvtss2sd %xmm0, %xmm7, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; ret @@ -21,7 +25,10 @@ block0(v0: f32): ; pushq %rbp ; movq %rsp, %rbp ; block1: ; offset 0x4 -; cvtss2sd %xmm0, %xmm0 +; movdqa %xmm0, %xmm5 +; xorpd %xmm0, %xmm0 +; movdqa %xmm5, %xmm7 +; cvtss2sd %xmm7, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; retq @@ -42,9 +49,11 @@ block0(v1: i64, v2: f32): ; movq %rsp, %rbp ; subq %rsp, $16, %rsp ; block0: -; lea rsp(0 + virtual offset), %rdx -; movss %xmm0, 0(%rdx) -; cvtss2sd 0(%rdx), %xmm0 +; lea rsp(0 + virtual offset), %r9 +; movss %xmm0, 0(%r9) +; uninit %xmm0 +; xorpd %xmm0, %xmm0, %xmm0 +; cvtss2sd %xmm0, 0(%r9), %xmm0 ; addq %rsp, $16, %rsp ; movq %rbp, %rsp ; popq %rbp @@ -56,9 +65,10 @@ block0(v1: i64, v2: f32): ; movq %rsp, %rbp ; subq $0x10, %rsp ; block1: ; offset 0x8 -; leaq (%rsp), %rdx -; movss %xmm0, (%rdx) ; trap: heap_oob -; cvtss2sd (%rdx), %xmm0 ; trap: heap_oob +; leaq (%rsp), %r9 +; movss %xmm0, (%r9) ; trap: heap_oob +; xorpd %xmm0, %xmm0 +; cvtss2sd (%r9), %xmm0 ; trap: heap_oob ; addq $0x10, %rsp ; movq %rbp, %rsp ; popq %rbp @@ -74,7 +84,11 @@ block0(v0: f64): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; cvtsd2ss %xmm0, %xmm0 +; movdqa %xmm0, %xmm5 +; uninit %xmm0 +; xorps %xmm0, %xmm0, %xmm0 +; movdqa %xmm5, %xmm7 +; cvtsd2ss %xmm0, %xmm7, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; ret @@ -84,7 +98,10 @@ block0(v0: f64): ; pushq %rbp ; movq %rsp, %rbp ; block1: ; offset 0x4 -; cvtsd2ss %xmm0, %xmm0 +; movdqa %xmm0, %xmm5 +; xorps %xmm0, %xmm0 +; movdqa %xmm5, %xmm7 +; cvtsd2ss %xmm7, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; retq @@ -105,9 +122,11 @@ block0(v1: i64, v2: f64): ; movq %rsp, %rbp ; subq %rsp, $16, %rsp ; block0: -; lea rsp(0 + virtual offset), %rdx -; movsd %xmm0, 0(%rdx) -; cvtsd2ss 0(%rdx), %xmm0 +; lea rsp(0 + virtual offset), %r9 +; movsd %xmm0, 0(%r9) +; uninit %xmm0 +; xorps %xmm0, %xmm0, %xmm0 +; cvtsd2ss %xmm0, 0(%r9), %xmm0 ; addq %rsp, $16, %rsp ; movq %rbp, %rsp ; popq %rbp @@ -119,9 +138,10 @@ block0(v1: i64, v2: f64): ; movq %rsp, %rbp ; subq $0x10, %rsp ; block1: ; offset 0x8 -; leaq (%rsp), %rdx -; movsd %xmm0, (%rdx) ; trap: heap_oob -; cvtsd2ss (%rdx), %xmm0 ; trap: heap_oob +; leaq (%rsp), %r9 +; movsd %xmm0, (%r9) ; trap: heap_oob +; xorps %xmm0, %xmm0 +; cvtsd2ss (%r9), %xmm0 ; trap: heap_oob ; addq $0x10, %rsp ; movq %rbp, %rsp ; popq %rbp diff --git a/cranelift/filetests/filetests/isa/x64/fsqrt-avx.clif b/cranelift/filetests/filetests/isa/x64/fsqrt-avx.clif index 1e87a00a223d..7740c538cfb7 100644 --- a/cranelift/filetests/filetests/isa/x64/fsqrt-avx.clif +++ b/cranelift/filetests/filetests/isa/x64/fsqrt-avx.clif @@ -11,7 +11,9 @@ block0(v0: f32): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; vsqrtss %xmm0, %xmm0 +; uninit %xmm2 +; vxorps %xmm2, %xmm2, %xmm4 +; vsqrtss %xmm4, %xmm0, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; ret @@ -21,7 +23,8 @@ block0(v0: f32): ; pushq %rbp ; movq %rsp, %rbp ; block1: ; offset 0x4 -; vsqrtss %xmm0, %xmm0, %xmm0 +; vxorps %xmm2, %xmm2, %xmm4 +; vsqrtss %xmm0, %xmm4, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; retq @@ -36,7 +39,9 @@ block0(v0: f64): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; vsqrtsd %xmm0, %xmm0 +; uninit %xmm2 +; vxorpd %xmm2, %xmm2, %xmm4 +; vsqrtsd %xmm4, %xmm0, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; ret @@ -46,7 +51,8 @@ block0(v0: f64): ; pushq %rbp ; movq %rsp, %rbp ; block1: ; offset 0x4 -; vsqrtsd %xmm0, %xmm0, %xmm0 +; vxorpd %xmm2, %xmm2, %xmm4 +; vsqrtsd %xmm0, %xmm4, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; retq diff --git a/cranelift/filetests/filetests/isa/x64/fsqrt.clif b/cranelift/filetests/filetests/isa/x64/fsqrt.clif index ec4c3f742460..be10b19ac4e8 100644 --- a/cranelift/filetests/filetests/isa/x64/fsqrt.clif +++ b/cranelift/filetests/filetests/isa/x64/fsqrt.clif @@ -11,7 +11,11 @@ block0(v0: f32): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; sqrtss %xmm0, %xmm0 +; movdqa %xmm0, %xmm5 +; uninit %xmm0 +; xorps %xmm0, %xmm0, %xmm0 +; movdqa %xmm5, %xmm7 +; sqrtss %xmm0, %xmm7, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; ret @@ -21,7 +25,10 @@ block0(v0: f32): ; pushq %rbp ; movq %rsp, %rbp ; block1: ; offset 0x4 -; sqrtss %xmm0, %xmm0 +; movdqa %xmm0, %xmm5 +; xorps %xmm0, %xmm0 +; movdqa %xmm5, %xmm7 +; sqrtss %xmm7, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; retq @@ -36,7 +43,11 @@ block0(v0: f64): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; sqrtsd %xmm0, %xmm0 +; movdqa %xmm0, %xmm5 +; uninit %xmm0 +; xorpd %xmm0, %xmm0, %xmm0 +; movdqa %xmm5, %xmm7 +; sqrtsd %xmm0, %xmm7, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; ret @@ -46,7 +57,10 @@ block0(v0: f64): ; pushq %rbp ; movq %rsp, %rbp ; block1: ; offset 0x4 -; sqrtsd %xmm0, %xmm0 +; movdqa %xmm0, %xmm5 +; xorpd %xmm0, %xmm0 +; movdqa %xmm5, %xmm7 +; sqrtsd %xmm7, %xmm0 ; movq %rbp, %rsp ; popq %rbp ; retq diff --git a/cranelift/filetests/filetests/isa/x64/i128.clif b/cranelift/filetests/filetests/isa/x64/i128.clif index 0654089deadf..5310d3a4b607 100644 --- a/cranelift/filetests/filetests/isa/x64/i128.clif +++ b/cranelift/filetests/filetests/isa/x64/i128.clif @@ -206,7 +206,7 @@ block0(v0: i128, v1: i128): ; imulq %rsi, %rcx, %rsi ; addq %rdx, %rsi, %rdx ; movq %rdx, %r9 -; mul %rax, %rcx, %rax, %rdx +; mulq %rax, %rcx, %rax, %rdx ; movq %rdx, %rcx ; movq %r9, %rdx ; addq %rdx, %rcx, %rdx @@ -1366,17 +1366,17 @@ block0(v0: i128): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; movq %rdi, 0(%rdx) -; movq %rsi, 8(%rdx) -; movq %rdi, 16(%rdx) -; movq %rsi, 24(%rdx) +; movq %rsi, 0(%rdx) +; movq %rdi, 8(%rdx) +; movq %rsi, 16(%rdx) +; movq %rdi, 24(%rdx) ; movq %rdi, 32(%rdx) -; movq %rdi, 40(%rdx) -; movq %rsi, 48(%rdx) -; movq %rdi, 56(%rdx) -; movq %rdi, %rax -; movq %rsi, 64(%rdx) +; movq %rsi, 40(%rdx) +; movq %rdi, 48(%rdx) +; movq %rdi, %rcx +; movq %rsi, 56(%rdx) ; movq %rsi, %rdx +; movq %rcx, %rax ; movq %rbp, %rsp ; popq %rbp ; ret @@ -1386,17 +1386,17 @@ block0(v0: i128): ; pushq %rbp ; movq %rsp, %rbp ; block1: ; offset 0x4 -; movq %rdi, (%rdx) -; movq %rsi, 8(%rdx) -; movq %rdi, 0x10(%rdx) -; movq %rsi, 0x18(%rdx) +; movq %rsi, (%rdx) +; movq %rdi, 8(%rdx) +; movq %rsi, 0x10(%rdx) +; movq %rdi, 0x18(%rdx) ; movq %rdi, 0x20(%rdx) -; movq %rdi, 0x28(%rdx) -; movq %rsi, 0x30(%rdx) -; movq %rdi, 0x38(%rdx) -; movq %rdi, %rax -; movq %rsi, 0x40(%rdx) +; movq %rsi, 0x28(%rdx) +; movq %rdi, 0x30(%rdx) +; movq %rdi, %rcx +; movq %rsi, 0x38(%rdx) ; movq %rsi, %rdx +; movq %rcx, %rax ; movq %rbp, %rsp ; popq %rbp ; retq @@ -1421,12 +1421,10 @@ block0(v0: i128, v1: i128): ; load_ext_name %g+0, %r9 ; call *%r9 ; movq 0(%rsp), %r8 -; movq 8(%rsp), %r9 ; addq %rsp, $16, %rsp ; virtual_sp_offset_adjust -16 -; movq %r13, %rcx -; movq %r8, 0(%rcx) -; movq %r9, 8(%rcx) +; movq %r13, %r9 +; movq %r8, 0(%r9) ; movq 0(%rsp), %r13 ; addq %rsp, $16, %rsp ; movq %rbp, %rsp @@ -1446,11 +1444,9 @@ block0(v0: i128, v1: i128): ; movabsq $0, %r9 ; reloc_external Abs8 %g 0 ; callq *%r9 ; movq (%rsp), %r8 -; movq 8(%rsp), %r9 ; addq $0x10, %rsp -; movq %r13, %rcx -; movq %r8, (%rcx) -; movq %r9, 8(%rcx) +; movq %r13, %r9 +; movq %r8, (%r9) ; movq (%rsp), %r13 ; addq $0x10, %rsp ; movq %rbp, %rsp diff --git a/cranelift/filetests/filetests/isa/x64/llvm-abi-option-u128.clif b/cranelift/filetests/filetests/isa/x64/llvm-abi-option-u128.clif new file mode 100644 index 000000000000..c777f9848c4a --- /dev/null +++ b/cranelift/filetests/filetests/isa/x64/llvm-abi-option-u128.clif @@ -0,0 +1,36 @@ +test compile precise-output +set enable_llvm_abi_extensions=1 +target x86_64 + +function u0:0(i64) -> i64, i128 system_v { +block0(v0: i64): + v1 = iconst.i64 0x1000_0000_0000_0000 + v2 = iconst.i64 0x2000_0000_0000_0000 + v3 = iconcat v1, v2 + v6 = iconst.i64 1 + return v6, v3 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; movabsq $1152921504606846976, %rdx +; movabsq $2305843009213693952, %rcx +; movl $1, %eax +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; movabsq $0x1000000000000000, %rdx +; movabsq $0x2000000000000000, %rcx +; movl $1, %eax +; movq %rbp, %rsp +; popq %rbp +; retq + diff --git a/cranelift/filetests/filetests/isa/x64/mul.clif b/cranelift/filetests/filetests/isa/x64/mul.clif new file mode 100644 index 000000000000..f12a73f05919 --- /dev/null +++ b/cranelift/filetests/filetests/isa/x64/mul.clif @@ -0,0 +1,489 @@ +test compile precise-output +set unwind_info=false +target x86_64 + +function %imul_i8(i8, i8) -> i8{ +block0(v0: i8, v1: i8): + v2 = imul v0, v1 + return v2 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; movq %rdi, %rax +; mulb %al, %sil, %al +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; movq %rdi, %rax +; mulb %sil +; movq %rbp, %rsp +; popq %rbp +; retq + +function %imul_i16(i16, i16) -> i16{ +block0(v0: i16, v1: i16): + v2 = imul v0, v1 + return v2 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; movq %rdi, %rax +; imulw %ax, %si, %ax +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; movq %rdi, %rax +; imull %esi, %eax +; movq %rbp, %rsp +; popq %rbp +; retq + +function %imul_i32(i32, i32) -> i32{ +block0(v0: i32, v1: i32): + v2 = imul v0, v1 + return v2 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; movq %rdi, %rax +; imull %eax, %esi, %eax +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; movq %rdi, %rax +; imull %esi, %eax +; movq %rbp, %rsp +; popq %rbp +; retq + +function %imul_i64(i64, i64) -> i64{ +block0(v0: i64, v1: i64): + v2 = imul v0, v1 + return v2 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; movq %rdi, %rax +; imulq %rax, %rsi, %rax +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; movq %rdi, %rax +; imulq %rsi, %rax +; movq %rbp, %rsp +; popq %rbp +; retq + +function %imul_i8_three(i8, i8, i8) -> i8{ +block0(v0: i8, v1: i8, v2: i8): + v3 = imul v0, v1 + v4 = imul v3, v2 + return v4 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; movq %rdi, %rax +; mulb %al, %sil, %al +; mulb %al, %dl, %al +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; movq %rdi, %rax +; mulb %sil +; mulb %dl +; movq %rbp, %rsp +; popq %rbp +; retq + +function %imul_i32_three(i32, i32, i32) -> i32{ +block0(v0: i32, v1: i32, v2: i32): + v3 = imul v0, v1 + v4 = imul v3, v2 + return v4 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; imull %edi, %esi, %edi +; movq %rdi, %rax +; imull %eax, %edx, %eax +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; imull %esi, %edi +; movq %rdi, %rax +; imull %edx, %eax +; movq %rbp, %rsp +; popq %rbp +; retq + +function %imul_i32_load(i32, i64) -> i32 { +block0(v0: i32, v1: i64): + v2 = load.i32 notrap v1 + v3 = imul v0, v2 + return v3 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; movq %rdi, %rax +; imull %eax, 0(%rsi), %eax +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; movq %rdi, %rax +; imull (%rsi), %eax +; movq %rbp, %rsp +; popq %rbp +; retq + +function %imul_i64_load(i64, i64) -> i64 { +block0(v0: i64, v1: i64): + v2 = load.i64 notrap v1 + v3 = imul v0, v2 + return v3 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; movq %rdi, %rax +; imulq %rax, 0(%rsi), %rax +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; movq %rdi, %rax +; imulq (%rsi), %rax +; movq %rbp, %rsp +; popq %rbp +; retq + +function %imul_i8_const(i8) -> i8{ +block0(v0: i8): + v3 = imul_imm v0, 97 + return v3 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; movq %rdi, %rax +; mulb %al, const(0), %al +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; movq %rdi, %rax +; mulb 0xb(%rip) +; movq %rbp, %rsp +; popq %rbp +; retq +; addb %al, (%rax) +; addb %al, (%rax) +; addb %al, (%rax) + +function %imul_i16_const(i16) -> i16{ +block0(v0: i16): + v3 = imul_imm v0, 97 + return v3 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; imulw %di, 0x61, %ax +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; imulw $0x61, %di, %ax +; movq %rbp, %rsp +; popq %rbp +; retq + +function %imul_i32_const(i32) -> i32{ +block0(v0: i32): + v3 = imul_imm v0, 97 + return v3 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; imull %edi, 0x61, %eax +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; imull $0x61, %edi, %eax +; movq %rbp, %rsp +; popq %rbp +; retq + +function %imul_i64_const(i64) -> i64{ +block0(v0: i64): + v3 = imul_imm v0, 97 + return v3 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; imulq %rdi, 0x61, %rax +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; imulq $0x61, %rdi, %rax +; movq %rbp, %rsp +; popq %rbp +; retq + + +function %imul_i16_bigger_const(i16) -> i16{ +block0(v0: i16): + v3 = imul_imm v0, 1021 + return v3 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; imulw %di, 0x3fd, %ax +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; imulw $0x3fd, %di, %ax +; movq %rbp, %rsp +; popq %rbp +; retq + +function %imul_i32_bigger_const(i32) -> i32{ +block0(v0: i32): + v3 = imul_imm v0, 1021 + return v3 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; imull %edi, 0x3fd, %eax +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; imull $0x3fd, %edi, %eax +; movq %rbp, %rsp +; popq %rbp +; retq + +function %imul_i64_bigger_const(i64) -> i64{ +block0(v0: i64): + v3 = imul_imm v0, 1021 + return v3 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; imulq %rdi, 0x3fd, %rax +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; imulq $0x3fd, %rdi, %rax +; movq %rbp, %rsp +; popq %rbp +; retq + +function %imul_i16_const_and_load(i64) -> i16{ +block0(v0: i64): + v1 = load.i16 v0 + v2 = imul_imm v1, 1021 + return v2 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; movzwq 0(%rdi), %rcx +; imulw %cx, 0x3fd, %ax +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; movzwq (%rdi), %rcx ; trap: heap_oob +; imulw $0x3fd, %cx, %ax +; movq %rbp, %rsp +; popq %rbp +; retq + +function %imul_i32_const_and_load(i64) -> i32{ +block0(v0: i64): + v1 = load.i32 v0 + v2 = imul_imm v1, 1021 + return v2 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; imull 0(%rdi), 0x3fd, %eax +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; imull $0x3fd, (%rdi), %eax ; trap: heap_oob +; movq %rbp, %rsp +; popq %rbp +; retq + +function %imul_i64_const_and_load(i64) -> i64{ +block0(v0: i64): + v1 = load.i64 v0+100 + v2 = imul_imm v1, 1021 + return v2 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; imulq 100(%rdi), 0x3fd, %rax +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; imulq $0x3fd, 0x64(%rdi), %rax ; trap: heap_oob +; movq %rbp, %rsp +; popq %rbp +; retq + diff --git a/cranelift/filetests/filetests/isa/x64/popcnt.clif b/cranelift/filetests/filetests/isa/x64/popcnt.clif index 3aecd486fd12..b74ba4b41622 100644 --- a/cranelift/filetests/filetests/isa/x64/popcnt.clif +++ b/cranelift/filetests/filetests/isa/x64/popcnt.clif @@ -147,11 +147,11 @@ block0(v0: i32): ; shrl $1, %eax, %eax ; andl %eax, %edx, %eax ; subl %edi, %eax, %edi -; movq %rdi, %rax -; shrl $4, %eax, %eax -; addl %eax, %edi, %eax -; andl %eax, $252645135, %eax -; imull %eax, $16843009, %eax +; movq %rdi, %r9 +; shrl $4, %r9d, %r9d +; addl %r9d, %edi, %r9d +; andl %r9d, $252645135, %r9d +; imull %r9d, 0x1010101, %eax ; shrl $24, %eax, %eax ; movq %rbp, %rsp ; popq %rbp @@ -173,11 +173,11 @@ block0(v0: i32): ; shrl $1, %eax ; andl %edx, %eax ; subl %eax, %edi -; movq %rdi, %rax -; shrl $4, %eax -; addl %edi, %eax -; andl $0xf0f0f0f, %eax -; imull $0x1010101, %eax, %eax +; movq %rdi, %r9 +; shrl $4, %r9d +; addl %edi, %r9d +; andl $0xf0f0f0f, %r9d +; imull $0x1010101, %r9d, %eax ; shrl $0x18, %eax ; movq %rbp, %rsp ; popq %rbp @@ -194,23 +194,23 @@ block0(v0: i64): ; pushq %rbp ; movq %rsp, %rbp ; block0: -; movl 0(%rdi), %edx -; movq %rdx, %rcx +; movl 0(%rdi), %eax +; movq %rax, %rcx ; shrl $1, %ecx, %ecx ; movl $2004318071, %r8d ; andl %ecx, %r8d, %ecx -; subl %edx, %ecx, %edx +; subl %eax, %ecx, %eax ; shrl $1, %ecx, %ecx ; andl %ecx, %r8d, %ecx -; subl %edx, %ecx, %edx +; subl %eax, %ecx, %eax ; shrl $1, %ecx, %ecx ; andl %ecx, %r8d, %ecx -; subl %edx, %ecx, %edx -; movq %rdx, %rax -; shrl $4, %eax, %eax -; addl %eax, %edx, %eax -; andl %eax, $252645135, %eax -; imull %eax, $16843009, %eax +; subl %eax, %ecx, %eax +; movq %rax, %r10 +; shrl $4, %r10d, %r10d +; addl %r10d, %eax, %r10d +; andl %r10d, $252645135, %r10d +; imull %r10d, 0x1010101, %eax ; shrl $24, %eax, %eax ; movq %rbp, %rsp ; popq %rbp @@ -221,23 +221,23 @@ block0(v0: i64): ; pushq %rbp ; movq %rsp, %rbp ; block1: ; offset 0x4 -; movl (%rdi), %edx ; trap: heap_oob -; movq %rdx, %rcx +; movl (%rdi), %eax ; trap: heap_oob +; movq %rax, %rcx ; shrl $1, %ecx ; movl $0x77777777, %r8d ; andl %r8d, %ecx -; subl %ecx, %edx +; subl %ecx, %eax ; shrl $1, %ecx ; andl %r8d, %ecx -; subl %ecx, %edx +; subl %ecx, %eax ; shrl $1, %ecx ; andl %r8d, %ecx -; subl %ecx, %edx -; movq %rdx, %rax -; shrl $4, %eax -; addl %edx, %eax -; andl $0xf0f0f0f, %eax -; imull $0x1010101, %eax, %eax +; subl %ecx, %eax +; movq %rax, %r10 +; shrl $4, %r10d +; addl %eax, %r10d +; andl $0xf0f0f0f, %r10d +; imull $0x1010101, %r10d, %eax ; shrl $0x18, %eax ; movq %rbp, %rsp ; popq %rbp diff --git a/cranelift/filetests/filetests/isa/x64/smulhi.clif b/cranelift/filetests/filetests/isa/x64/smulhi.clif index 25c6db99c8a2..92589c2f0cfa 100644 --- a/cranelift/filetests/filetests/isa/x64/smulhi.clif +++ b/cranelift/filetests/filetests/isa/x64/smulhi.clif @@ -1,6 +1,35 @@ test compile precise-output target x86_64 +function %smulhi_i8(i8, i8) -> i8 { +block0(v0: i8, v1: i8): + v2 = smulhi v0, v1 + return v2 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; movq %rdi, %rax +; imulb %al, %sil, %al +; sarw $8, %ax, %ax +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; movq %rdi, %rax +; imulb %sil +; sarw $8, %ax +; movq %rbp, %rsp +; popq %rbp +; retq + function %f1(i16, i16) -> i16 { block0(v0: i16, v1: i16): v2 = smulhi v0, v1 @@ -12,7 +41,7 @@ block0(v0: i16, v1: i16): ; movq %rsp, %rbp ; block0: ; movq %rdi, %rax -; imul %ax, %si, %ax, %dx +; imulw %ax, %si, %ax, %dx ; movq %rdx, %rax ; movq %rbp, %rsp ; popq %rbp @@ -41,7 +70,7 @@ block0(v0: i32, v1: i32): ; movq %rsp, %rbp ; block0: ; movq %rdi, %rax -; imul %eax, %esi, %eax, %edx +; imull %eax, %esi, %eax, %edx ; movq %rdx, %rax ; movq %rbp, %rsp ; popq %rbp @@ -70,7 +99,7 @@ block0(v0: i64, v1: i64): ; movq %rsp, %rbp ; block0: ; movq %rdi, %rax -; imul %rax, %rsi, %rax, %rdx +; imulq %rax, %rsi, %rax, %rdx ; movq %rdx, %rax ; movq %rbp, %rsp ; popq %rbp diff --git a/cranelift/filetests/filetests/isa/x64/umulhi.clif b/cranelift/filetests/filetests/isa/x64/umulhi.clif index e910de46ee6f..e68df725c1b8 100644 --- a/cranelift/filetests/filetests/isa/x64/umulhi.clif +++ b/cranelift/filetests/filetests/isa/x64/umulhi.clif @@ -1,6 +1,35 @@ test compile precise-output target x86_64 +function %umulhi_i8(i8, i8) -> i8 { +block0(v0: i8, v1: i8): + v2 = umulhi v0, v1 + return v2 +} + +; VCode: +; pushq %rbp +; movq %rsp, %rbp +; block0: +; movq %rdi, %rax +; mulb %al, %sil, %al +; shrw $8, %ax, %ax +; movq %rbp, %rsp +; popq %rbp +; ret +; +; Disassembled: +; block0: ; offset 0x0 +; pushq %rbp +; movq %rsp, %rbp +; block1: ; offset 0x4 +; movq %rdi, %rax +; mulb %sil +; shrw $8, %ax +; movq %rbp, %rsp +; popq %rbp +; retq + function %f1(i16, i16) -> i16 { block0(v0: i16, v1: i16): v2 = umulhi v0, v1 @@ -12,7 +41,7 @@ block0(v0: i16, v1: i16): ; movq %rsp, %rbp ; block0: ; movq %rdi, %rax -; mul %ax, %si, %ax, %dx +; mulw %ax, %si, %ax, %dx ; movq %rdx, %rax ; movq %rbp, %rsp ; popq %rbp @@ -41,7 +70,7 @@ block0(v0: i32, v1: i32): ; movq %rsp, %rbp ; block0: ; movq %rdi, %rax -; mul %eax, %esi, %eax, %edx +; mull %eax, %esi, %eax, %edx ; movq %rdx, %rax ; movq %rbp, %rsp ; popq %rbp @@ -70,7 +99,7 @@ block0(v0: i64, v1: i64): ; movq %rsp, %rbp ; block0: ; movq %rdi, %rax -; mul %rax, %rsi, %rax, %rdx +; mulq %rax, %rsi, %rax, %rdx ; movq %rdx, %rax ; movq %rbp, %rsp ; popq %rbp diff --git a/cranelift/filetests/filetests/pcc/succeed/const.clif b/cranelift/filetests/filetests/pcc/succeed/const.clif index da0c8a08655c..529c43eaa395 100644 --- a/cranelift/filetests/filetests/pcc/succeed/const.clif +++ b/cranelift/filetests/filetests/pcc/succeed/const.clif @@ -16,3 +16,21 @@ block0: v8 ! range(64, 0xffff_0000_0000_ffff, 0xffff_0000_0000_ffff) = iconst.i64 0xffff_0000_0000_ffff return } + +function %f1() -> i32 { +block0: + v0 = iconst.i32 0x10_0010 + return v0 +} + +function %f2() -> i64 { +block0: + v0 = iconst.i64 0x9_ffff_ffff + return v0 +} + +function %f3() -> i64 { +block0: + v0 = iconst.i64 0xffff_fff7 + return v0 +} diff --git a/cranelift/filetests/filetests/runtests/simd-fcvt-from-uint.clif b/cranelift/filetests/filetests/runtests/simd-fcvt-from-uint.clif index fe538379762e..499cf80898c6 100644 --- a/cranelift/filetests/filetests/runtests/simd-fcvt-from-uint.clif +++ b/cranelift/filetests/filetests/runtests/simd-fcvt-from-uint.clif @@ -6,14 +6,25 @@ target x86_64 target x86_64 sse41 target x86_64 sse42 target x86_64 sse42 has_avx +target x86_64 sse42 has_avx has_avx512vl has_avx512f target riscv64 has_v target riscv64 has_v has_c has_zcb -function %fcvt_from_uint(i32x4) -> f32x4 { +function %fcvt_from_uint32(i32x4) -> f32x4 { block0(v0: i32x4): v1 = fcvt_from_uint.f32x4 v0 return v1 } -; run: %fcvt_from_uint([0 0 0 0]) == [0x0.0 0x0.0 0x0.0 0x0.0] -; run: %fcvt_from_uint([0xFFFFFFFF 0 1 123456789]) == [0x100000000.0 0.0 0x1.0 0x75bcd18.0] +; run: %fcvt_from_uint32([0 0 0 0]) == [0x0.0 0x0.0 0x0.0 0x0.0] +; run: %fcvt_from_uint32([0xFFFFFFFF 0 1 123456789]) == [0x100000000.0 0.0 0x1.0 0x75bcd18.0] ; Note that 0xFFFFFFFF is decimal 4,294,967,295 and is rounded up 1 to 4,294,967,296 in f32x4. + +function %fcvt_from_uint64(i64x2) -> f64x2 { +block0(v0: i64x2): + v1 = fcvt_from_uint.f64x2 v0 + return v1 +} +; run: %fcvt_from_uint64([0 0]) == [0x0.0 0x0.0] +; run: %fcvt_from_uint64([0xFFFFFFFF 0]) == [0xffffffff.0 0.0] +; run: %fcvt_from_uint64([1 123456789]) == [0x1.0 0x75bcd15.0] +; run: %fcvt_from_uint64([-1 0x20]) == [0x1.0p64 0x20.0] diff --git a/cranelift/filetests/filetests/runtests/smulhi.clif b/cranelift/filetests/filetests/runtests/smulhi.clif index 52a8d4d0ed98..df9f13adf377 100644 --- a/cranelift/filetests/filetests/runtests/smulhi.clif +++ b/cranelift/filetests/filetests/runtests/smulhi.clif @@ -8,6 +8,15 @@ target riscv64 target riscv64 has_c has_zcb +function %smulhi_i8(i8, i8) -> i8 { +block0(v0: i8, v1: i8): + v2 = smulhi v0, v1 + return v2 +} +; run: %smulhi_i8(-2, -4) == 0 +; run: %smulhi_i8(2, -4) == -1 +; run: %smulhi_i8(255, 255) == 0 + function %smulhi_i16(i16, i16) -> i16 { block0(v0: i16, v1: i16): v2 = smulhi v0, v1 diff --git a/cranelift/filetests/filetests/runtests/umulhi.clif b/cranelift/filetests/filetests/runtests/umulhi.clif index 464a2bc6700a..51d4eee45d92 100644 --- a/cranelift/filetests/filetests/runtests/umulhi.clif +++ b/cranelift/filetests/filetests/runtests/umulhi.clif @@ -6,6 +6,14 @@ target s390x target riscv64 target riscv64 has_c has_zcb +function %umulhi_i8(i8, i8) -> i8 { +block0(v0: i8, v1: i8): + v2 = umulhi v0, v1 + return v2 +} +; run: %umulhi_i8(2, 4) == 0 +; run: %umulhi_i8(255, 255) == 254 + function %umulhi_i16(i16, i16) -> i16 { block0(v0: i16, v1: i16): v2 = umulhi v0, v1 diff --git a/cranelift/filetests/src/lib.rs b/cranelift/filetests/src/lib.rs index 173736867647..fc9ed2bc54ab 100644 --- a/cranelift/filetests/src/lib.rs +++ b/cranelift/filetests/src/lib.rs @@ -3,13 +3,7 @@ //! This crate contains the main test driver as well as implementations of the //! available filetest commands. -#![deny( - missing_docs, - trivial_numeric_casts, - unused_extern_crates, - unstable_features -)] -#![warn(unused_import_braces)] +#![deny(missing_docs)] pub use crate::function_runner::TestFileCompiler; use crate::runner::TestRunner; diff --git a/cranelift/filetests/src/test_wasm/env.rs b/cranelift/filetests/src/test_wasm/env.rs index efd21a5b897d..fb76f3560654 100644 --- a/cranelift/filetests/src/test_wasm/env.rs +++ b/cranelift/filetests/src/test_wasm/env.rs @@ -236,7 +236,7 @@ impl<'data> ModuleEnvironment<'data> for ModuleEnv { } impl TypeConvert for ModuleEnv { - fn lookup_heap_type(&self, _index: TypeIndex) -> WasmHeapType { + fn lookup_heap_type(&self, _index: wasmparser::UnpackedIndex) -> WasmHeapType { todo!() } } @@ -271,7 +271,7 @@ impl<'a> FuncEnv<'a> { } impl TypeConvert for FuncEnv<'_> { - fn lookup_heap_type(&self, _index: TypeIndex) -> WasmHeapType { + fn lookup_heap_type(&self, _index: wasmparser::UnpackedIndex) -> WasmHeapType { todo!() } } diff --git a/cranelift/frontend/Cargo.toml b/cranelift/frontend/Cargo.toml index 01311566c658..896168e36e98 100644 --- a/cranelift/frontend/Cargo.toml +++ b/cranelift/frontend/Cargo.toml @@ -1,7 +1,7 @@ [package] authors = ["The Cranelift Project Developers"] name = "cranelift-frontend" -version = "0.103.0" +version = "0.106.0" description = "Cranelift IR builder helper" license = "Apache-2.0 WITH LLVM-exception" documentation = "https://docs.rs/cranelift-frontend" @@ -10,6 +10,9 @@ repository = "https://github.com/bytecodealliance/wasmtime" readme = "README.md" edition.workspace = true +[lints] +workspace = true + [dependencies] cranelift-codegen = { workspace = true } target-lexicon = { workspace = true } diff --git a/cranelift/frontend/src/lib.rs b/cranelift/frontend/src/lib.rs index 5eaf50e903ff..68761f755809 100644 --- a/cranelift/frontend/src/lib.rs +++ b/cranelift/frontend/src/lib.rs @@ -160,9 +160,7 @@ //! } //! ``` -#![deny(missing_docs, trivial_numeric_casts, unused_extern_crates)] -#![warn(unused_import_braces)] -#![cfg_attr(feature = "std", deny(unstable_features))] +#![deny(missing_docs)] #![no_std] #[allow(unused_imports)] // #[macro_use] is required for no_std diff --git a/cranelift/fuzzgen/Cargo.toml b/cranelift/fuzzgen/Cargo.toml index 0a19631c38b0..ac236f427492 100644 --- a/cranelift/fuzzgen/Cargo.toml +++ b/cranelift/fuzzgen/Cargo.toml @@ -9,6 +9,8 @@ readme = "README.md" edition.workspace = true publish = false +[lints] +workspace = true [dependencies] cranelift = { workspace = true } diff --git a/cranelift/fuzzgen/src/function_generator.rs b/cranelift/fuzzgen/src/function_generator.rs index 38cdc0c05dfa..6ed5d8412ea0 100644 --- a/cranelift/fuzzgen/src/function_generator.rs +++ b/cranelift/fuzzgen/src/function_generator.rs @@ -523,8 +523,6 @@ fn valid_for_target(triple: &Triple, op: Opcode, args: &[Type], rets: &[Type]) - rets, (Opcode::UmulOverflow | Opcode::SmulOverflow, &[I128, I128]), (Opcode::Imul, &[I8X16, I8X16]), - // https://github.com/bytecodealliance/wasmtime/issues/5468 - (Opcode::Smulhi | Opcode::Umulhi, &[I8, I8]), // https://github.com/bytecodealliance/wasmtime/issues/4756 (Opcode::Udiv | Opcode::Sdiv, &[I128, I128]), // https://github.com/bytecodealliance/wasmtime/issues/5474 @@ -1401,7 +1399,7 @@ where DataValue::I8(i) => builder.ins().iconst(ty, i as u8 as i64), DataValue::I16(i) => builder.ins().iconst(ty, i as u16 as i64), DataValue::I32(i) => builder.ins().iconst(ty, i as u32 as i64), - DataValue::I64(i) => builder.ins().iconst(ty, i as i64), + DataValue::I64(i) => builder.ins().iconst(ty, i), DataValue::I128(i) => { let hi = builder.ins().iconst(I64, (i >> 64) as i64); let lo = builder.ins().iconst(I64, i as i64); diff --git a/cranelift/interpreter/Cargo.toml b/cranelift/interpreter/Cargo.toml index 6c22f61a19fc..e59b31040d89 100644 --- a/cranelift/interpreter/Cargo.toml +++ b/cranelift/interpreter/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cranelift-interpreter" -version = "0.103.0" +version = "0.106.0" authors = ["The Cranelift Project Developers"] description = "Interpret Cranelift IR" repository = "https://github.com/bytecodealliance/wasmtime" @@ -10,6 +10,9 @@ license = "Apache-2.0 WITH LLVM-exception" readme = "README.md" edition.workspace = true +[lints] +workspace = true + [dependencies] cranelift-codegen = { workspace = true } cranelift-entity = { workspace = true } diff --git a/cranelift/interpreter/src/step.rs b/cranelift/interpreter/src/step.rs index 8f437587e11d..e04d1ecd5b26 100644 --- a/cranelift/interpreter/src/step.rs +++ b/cranelift/interpreter/src/step.rs @@ -1075,7 +1075,7 @@ where let overflow = if is_signed { x < (min as i128) || x > (max as i128) } else { - x < 0 || (x as u128) > (max as u128) + x < 0 || (x as u128) > max }; // bounds check if overflow { @@ -1102,7 +1102,7 @@ where x } else { let x = if x < 0 { 0 } else { x }; - let x = u128::min(x as u128, max as u128); + let x = u128::min(x as u128, max); x as i128 }; diff --git a/cranelift/interpreter/src/value.rs b/cranelift/interpreter/src/value.rs index 49a6bfe7a226..10ca7a1ebe4f 100644 --- a/cranelift/interpreter/src/value.rs +++ b/cranelift/interpreter/src/value.rs @@ -1,6 +1,8 @@ //! The [DataValueExt] trait is an extension trait for [DataValue]. It provides a lot of functions //! used by the rest of the interpreter. +#![allow(trivial_numeric_casts)] + use core::convert::TryFrom; use core::fmt::{self, Display, Formatter}; use cranelift_codegen::data_value::{DataValue, DataValueCastFailure}; diff --git a/cranelift/isle/docs/language-reference.md b/cranelift/isle/docs/language-reference.md index 8f0f346c159b..ead6908bab6b 100644 --- a/cranelift/isle/docs/language-reference.md +++ b/cranelift/isle/docs/language-reference.md @@ -27,7 +27,7 @@ instructions. For example: immediate. One could write something like the following in ISLE (simplified from -the real code [here](../codegen/src/isa/x64/lower.isle)): +the real code [here](https://github.com/bytecodealliance/wasmtime/blob/main/cranelift/codegen/src/isa/x64/lower.isle)): ```lisp ;; Add two registers. diff --git a/cranelift/isle/isle/Cargo.toml b/cranelift/isle/isle/Cargo.toml index 078787068eb1..08fa18a2b4a3 100644 --- a/cranelift/isle/isle/Cargo.toml +++ b/cranelift/isle/isle/Cargo.toml @@ -6,7 +6,10 @@ license = "Apache-2.0 WITH LLVM-exception" name = "cranelift-isle" readme = "../README.md" repository = "https://github.com/bytecodealliance/wasmtime/tree/main/cranelift/isle" -version = "0.103.0" +version = "0.106.0" + +[lints] +workspace = true [dependencies] codespan-reporting = { version = "0.11.1", optional = true } diff --git a/cranelift/isle/islec/src/main.rs b/cranelift/isle/islec/src/main.rs index f934e71ae666..74ef67857279 100644 --- a/cranelift/isle/islec/src/main.rs +++ b/cranelift/isle/islec/src/main.rs @@ -12,11 +12,11 @@ use std::{ struct Opts { /// The output file to write the generated Rust code to. `stdout` is used if /// this is not given. - #[clap(short, long)] + #[arg(short, long)] output: Option, /// The input ISLE DSL source files. - #[clap(required = true)] + #[arg(required = true)] inputs: Vec, } diff --git a/cranelift/jit/Cargo.toml b/cranelift/jit/Cargo.toml index 05f311456f17..c06898fc9457 100644 --- a/cranelift/jit/Cargo.toml +++ b/cranelift/jit/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cranelift-jit" -version = "0.103.0" +version = "0.106.0" authors = ["The Cranelift Project Developers"] description = "A JIT library backed by Cranelift" repository = "https://github.com/bytecodealliance/wasmtime" @@ -9,6 +9,9 @@ license = "Apache-2.0 WITH LLVM-exception" readme = "README.md" edition.workspace = true +[lints] +workspace = true + [dependencies] cranelift-module = { workspace = true } cranelift-native = { workspace = true } diff --git a/cranelift/jit/src/compiled_blob.rs b/cranelift/jit/src/compiled_blob.rs index f4f134023ea2..904cb79ae6a4 100644 --- a/cranelift/jit/src/compiled_blob.rs +++ b/cranelift/jit/src/compiled_blob.rs @@ -93,6 +93,35 @@ impl CompiledBlob { let imm26 = (diff as u32) << chop >> chop; unsafe { modify_inst32(iptr, |inst| inst | imm26) }; } + Reloc::Aarch64AdrGotPage21 => { + // Set the immediate value of an ADRP to bits [32:12] of X; check that –2^32 <= X < 2^32 + assert_eq!(addend, 0, "addend affects the address looked up in get_got_entry, which is currently only called with a symbol"); + let what = get_got_entry(name); + let what_page = (what as usize) & !0xfff; + let at_page = (at as usize) & !0xfff; + let pcrel = (what_page as isize).checked_sub(at_page as isize).unwrap(); + assert!( + (-1 << 32) <= pcrel && pcrel < (1 << 32), + "can't reach GOT page with ±4GB `adrp` instruction" + ); + let val = pcrel >> 12; + + let immlo = ((val as u32) & 0b11) << 29; + let immhi = (((val as u32) >> 2) & &0x7ffff) << 5; + let mask = !((0x7ffff << 5) | (0b11 << 29)); + unsafe { modify_inst32(at as *mut u32, |adrp| (adrp & mask) | immlo | immhi) }; + } + Reloc::Aarch64Ld64GotLo12Nc => { + // Set the LD/ST immediate field to bits 11:3 of X. No overflow check; check that X&7 = 0 + assert_eq!(addend, 0); + let base = get_got_entry(name); + let what = base as u32; + assert_eq!(what & 0b111, 0); + let val = what >> 3; + let imm9 = (val & 0x1ff) << 10; + let mask = !(0x1ff << 10); + unsafe { modify_inst32(at as *mut u32, |ldr| (ldr & mask) | imm9) }; + } Reloc::RiscvCallPlt => { // A R_RISCV_CALL_PLT relocation expects auipc+jalr instruction pair. // It is the equivalent of two relocations: diff --git a/cranelift/jit/src/lib.rs b/cranelift/jit/src/lib.rs index 1565bb5bcf15..a7e4190cd12f 100644 --- a/cranelift/jit/src/lib.rs +++ b/cranelift/jit/src/lib.rs @@ -3,14 +3,7 @@ //! There is an [example project](https://github.com/bytecodealliance/cranelift-jit-demo/) //! which shows how to use some of the features of `cranelift_jit`. -#![deny( - missing_docs, - trivial_numeric_casts, - unused_extern_crates, - unstable_features, - unreachable_pub -)] -#![warn(unused_import_braces)] +#![deny(missing_docs, unreachable_pub)] mod backend; mod compiled_blob; diff --git a/cranelift/module/Cargo.toml b/cranelift/module/Cargo.toml index e3598dba4987..66ec7e2fe990 100644 --- a/cranelift/module/Cargo.toml +++ b/cranelift/module/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cranelift-module" -version = "0.103.0" +version = "0.106.0" authors = ["The Cranelift Project Developers"] description = "Support for linking functions and data with Cranelift" repository = "https://github.com/bytecodealliance/wasmtime" @@ -10,6 +10,9 @@ license = "Apache-2.0 WITH LLVM-exception" readme = "README.md" edition.workspace = true +[lints] +workspace = true + [dependencies] cranelift-codegen = { workspace = true } cranelift-control = { workspace = true } diff --git a/cranelift/module/src/lib.rs b/cranelift/module/src/lib.rs index 88313c3a224b..7528ad67caad 100644 --- a/cranelift/module/src/lib.rs +++ b/cranelift/module/src/lib.rs @@ -1,8 +1,6 @@ //! Top-level lib.rs for `cranelift_module`. -#![deny(missing_docs, trivial_numeric_casts, unused_extern_crates)] -#![warn(unused_import_braces)] -#![cfg_attr(feature = "std", deny(unstable_features))] +#![deny(missing_docs)] #![no_std] #[cfg(not(feature = "std"))] diff --git a/cranelift/native/Cargo.toml b/cranelift/native/Cargo.toml index 7cb7d2f563ce..be8c2a5e5607 100644 --- a/cranelift/native/Cargo.toml +++ b/cranelift/native/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cranelift-native" -version = "0.103.0" +version = "0.106.0" authors = ["The Cranelift Project Developers"] description = "Support for targeting the host with Cranelift" documentation = "https://docs.rs/cranelift-native" diff --git a/cranelift/native/src/lib.rs b/cranelift/native/src/lib.rs index 42d20a326191..cd2973fa4a5f 100644 --- a/cranelift/native/src/lib.rs +++ b/cranelift/native/src/lib.rs @@ -1,13 +1,7 @@ //! Performs autodetection of the host for the purposes of running //! Cranelift to generate code to run on the same machine. -#![deny( - missing_docs, - trivial_numeric_casts, - unused_extern_crates, - unstable_features -)] -#![warn(unused_import_braces)] +#![deny(missing_docs)] use cranelift_codegen::isa; use cranelift_codegen::settings::Configurable; @@ -150,6 +144,10 @@ pub fn infer_native_flags(isa_builder: &mut dyn Configurable) -> Result<(), &'st // the cpuinfo interface, so we can't rely on it being present for now. let _ = riscv::cpuinfo_detect(isa_builder); } + + // On all other architectures (e.g. wasm32) we won't infer any native flags, + // but still need to use the `isa_builder` to avoid compiler warnings. + let _ = isa_builder; Ok(()) } diff --git a/cranelift/object/Cargo.toml b/cranelift/object/Cargo.toml index 08952bec347a..1086055a6ea9 100644 --- a/cranelift/object/Cargo.toml +++ b/cranelift/object/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cranelift-object" -version = "0.103.0" +version = "0.106.0" authors = ["The Cranelift Project Developers"] description = "Emit Cranelift output to native object files with `object`" repository = "https://github.com/bytecodealliance/wasmtime" @@ -9,6 +9,9 @@ license = "Apache-2.0 WITH LLVM-exception" readme = "README.md" edition.workspace = true +[lints] +workspace = true + [dependencies] cranelift-module = { workspace = true } cranelift-codegen = { workspace = true, features = ["std"] } diff --git a/cranelift/object/src/lib.rs b/cranelift/object/src/lib.rs index dd934af63765..6967f890df4f 100644 --- a/cranelift/object/src/lib.rs +++ b/cranelift/object/src/lib.rs @@ -2,13 +2,7 @@ //! //! This re-exports `object` so you don't have to explicitly keep the versions in sync. -#![deny( - missing_docs, - trivial_numeric_casts, - unused_extern_crates, - unstable_features -)] -#![warn(unused_import_braces)] +#![deny(missing_docs)] mod backend; diff --git a/cranelift/reader/Cargo.toml b/cranelift/reader/Cargo.toml index 3140fa142ded..efbd15335076 100644 --- a/cranelift/reader/Cargo.toml +++ b/cranelift/reader/Cargo.toml @@ -1,7 +1,7 @@ [package] authors = ["The Cranelift Project Developers"] name = "cranelift-reader" -version = "0.103.0" +version = "0.106.0" description = "Cranelift textual IR reader" license = "Apache-2.0 WITH LLVM-exception" documentation = "https://docs.rs/cranelift-reader" @@ -9,6 +9,9 @@ repository = "https://github.com/bytecodealliance/wasmtime" readme = "README.md" edition.workspace = true +[lints] +workspace = true + [dependencies] anyhow.workspace = true cranelift-codegen = { workspace = true } diff --git a/cranelift/reader/src/lib.rs b/cranelift/reader/src/lib.rs index c54435d80044..649be2fc71e2 100644 --- a/cranelift/reader/src/lib.rs +++ b/cranelift/reader/src/lib.rs @@ -3,13 +3,7 @@ //! The `cranelift_reader` library supports reading .clif files. This functionality is needed for //! testing Cranelift, but is not essential for a JIT compiler. -#![deny( - missing_docs, - trivial_numeric_casts, - unused_extern_crates, - unstable_features -)] -#![warn(unused_import_braces)] +#![deny(missing_docs)] pub use crate::error::{Location, ParseError, ParseResult}; pub use crate::isaspec::{parse_option, parse_options, IsaSpec, ParseOptionError}; diff --git a/cranelift/serde/Cargo.toml b/cranelift/serde/Cargo.toml index d7cc7f7c3ec6..8577674ea4a5 100644 --- a/cranelift/serde/Cargo.toml +++ b/cranelift/serde/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cranelift-serde" -version = "0.103.0" +version = "0.106.0" authors = ["The Cranelift Project Developers"] description = "Serializer/Deserializer for Cranelift IR" repository = "https://github.com/bytecodealliance/wasmtime" @@ -9,6 +9,9 @@ readme = "README.md" keywords = ["webassembly", "serde"] edition.workspace = true +[lints] +workspace = true + [[bin]] name = "clif-json" path = "src/clif-json.rs" diff --git a/cranelift/serde/src/clif-json.rs b/cranelift/serde/src/clif-json.rs index 7c3c7dcf0e55..cd1f7b5b03ff 100644 --- a/cranelift/serde/src/clif-json.rs +++ b/cranelift/serde/src/clif-json.rs @@ -1,12 +1,6 @@ //! Utility for `cranelift_serde`. -#![deny( - missing_docs, - trivial_numeric_casts, - unused_extern_crates, - unstable_features -)] -#![warn(unused_import_braces)] +#![deny(missing_docs)] use clap::Parser; use cranelift_codegen::ir::Function; @@ -43,12 +37,12 @@ fn call_de(file: &File) -> Result<(), String> { /// Cranelift JSON serializer/deserializer utility #[derive(Parser, Debug)] -#[clap(about)] +#[command(about)] enum Args { /// Serializes Cranelift IR into JSON Serialize { /// Generate pretty json - #[clap(long, short)] + #[arg(long, short)] pretty: bool, /// Input file for serialization diff --git a/cranelift/src/bugpoint.rs b/cranelift/src/bugpoint.rs index d7a52343291b..57bb5e5c86f8 100644 --- a/cranelift/src/bugpoint.rs +++ b/cranelift/src/bugpoint.rs @@ -26,14 +26,14 @@ pub struct Options { file: PathBuf, /// Configure Cranelift settings - #[clap(long = "set")] + #[arg(long = "set")] settings: Vec, /// Specify the target architecture. target: String, /// Be more verbose - #[clap(short, long)] + #[arg(short, long)] verbose: bool, } diff --git a/cranelift/src/cat.rs b/cranelift/src/cat.rs index 167d768aa5d4..2c48318fb475 100644 --- a/cranelift/src/cat.rs +++ b/cranelift/src/cat.rs @@ -13,7 +13,7 @@ use std::path::{Path, PathBuf}; #[derive(Parser)] pub struct Options { /// Specify input file(s) to be used. Use '-' for stdin. - #[clap(required = true)] + #[arg(required = true)] files: Vec, } diff --git a/cranelift/src/clif-util.rs b/cranelift/src/clif-util.rs index 98da1cfb4dc6..12b740e097d4 100644 --- a/cranelift/src/clif-util.rs +++ b/cranelift/src/clif-util.rs @@ -1,6 +1,3 @@ -#![deny(trivial_numeric_casts)] -#![warn(unused_import_braces, unstable_features, unused_extern_crates)] - use clap::Parser; use std::path::PathBuf; @@ -46,15 +43,15 @@ enum Commands { #[derive(Parser)] struct TestOptions { /// Be more verbose - #[clap(short, long)] + #[arg(short, long)] verbose: bool, /// Print pass timing report for test - #[clap(short = 'T')] + #[arg(short = 'T')] time_passes: bool, /// Specify an input file to be used. Use '-' for stdin. - #[clap(required = true)] + #[arg(required = true)] files: Vec, } @@ -62,11 +59,11 @@ struct TestOptions { #[derive(Parser)] struct PassOptions { /// Be more verbose - #[clap(short, long)] + #[arg(short, long)] verbose: bool, /// Print pass timing report for test - #[clap(short = 'T')] + #[arg(short = 'T')] time_passes: bool, /// Specify an input file to be used. Use '-' for stdin. @@ -76,7 +73,7 @@ struct PassOptions { target: String, /// Specify pass(es) to be run on the input file - #[clap(required = true)] + #[arg(required = true)] passes: Vec, } diff --git a/cranelift/src/compile.rs b/cranelift/src/compile.rs index 0df3f3fa68d4..782484abd990 100644 --- a/cranelift/src/compile.rs +++ b/cranelift/src/compile.rs @@ -17,30 +17,30 @@ use std::path::PathBuf; #[derive(Parser)] pub struct Options { /// Print the resulting Cranelift IR - #[clap(short)] + #[arg(short)] print: bool, /// Print pass timing report - #[clap(short = 'T')] + #[arg(short = 'T')] report_times: bool, /// Print machine code disassembly - #[clap(short = 'D', long)] + #[arg(short = 'D', long)] disasm: bool, /// Configure Cranelift settings - #[clap(long = "set")] + #[arg(long = "set")] settings: Vec, /// Specify the Cranelift target - #[clap(long = "target")] + #[arg(long = "target")] target: String, /// Specify an input file to be used. Use '-' for stdin. files: Vec, /// Output object file - #[clap(short = 'o', long = "output")] + #[arg(short = 'o', long = "output")] output: Option, } diff --git a/cranelift/src/interpret.rs b/cranelift/src/interpret.rs index a752d692dac9..cd4f50a62921 100644 --- a/cranelift/src/interpret.rs +++ b/cranelift/src/interpret.rs @@ -14,11 +14,11 @@ use thiserror::Error; #[derive(Parser)] pub struct Options { /// Specify an input file to be used. Use '-' for stdin. - #[clap(required = true)] + #[arg(required = true)] files: Vec, /// Be more verbose - #[clap(short, long)] + #[arg(short, long)] verbose: bool, } diff --git a/cranelift/src/print_cfg.rs b/cranelift/src/print_cfg.rs index fa7027c42bcc..cadb61c760f4 100644 --- a/cranelift/src/print_cfg.rs +++ b/cranelift/src/print_cfg.rs @@ -14,7 +14,7 @@ use std::path::{Path, PathBuf}; #[derive(Parser)] pub struct Options { /// Specify an input file to be used. Use '-' for stdin. - #[clap(required = true)] + #[arg(required = true)] files: Vec, } diff --git a/cranelift/src/run.rs b/cranelift/src/run.rs index 5564736e3b68..3912fb79358f 100644 --- a/cranelift/src/run.rs +++ b/cranelift/src/run.rs @@ -8,17 +8,17 @@ use cranelift_filetests::TestFileCompiler; use cranelift_native::builder as host_isa_builder; use cranelift_reader::{parse_run_command, parse_test, Details, IsaSpec, ParseOptions}; use std::path::{Path, PathBuf}; -use target_lexicon::Triple; +use target_lexicon::{Triple, HOST}; /// Execute clif code and verify with test expressions #[derive(Parser)] pub struct Options { /// Specify an input file to be used. Use '-' for stdin. - #[clap(required = true)] + #[arg(required = true)] files: Vec, /// Be more verbose - #[clap(short, long)] + #[arg(short, long)] verbose: bool, } @@ -106,15 +106,22 @@ fn run_file_contents(file_contents: String) -> Result<()> { /// Build an ISA based on the current machine running this code (the host) fn create_target_isa(isa_spec: &IsaSpec) -> Result { - if let IsaSpec::None(flags) = isa_spec { - // build an ISA for the current machine - let builder = host_isa_builder().map_err(|s| anyhow::anyhow!("{}", s))?; - Ok(builder.finish(flags.clone())?) - } else { - anyhow::bail!( - "A target ISA was specified in the file but should not have been--only \ - the host ISA can be used for running CLIF files" - ) + let builder = host_isa_builder().map_err(|s| anyhow::anyhow!("{}", s))?; + match *isa_spec { + IsaSpec::None(ref flags) => { + // build an ISA for the current machine + Ok(builder.finish(flags.clone())?) + } + IsaSpec::Some(ref isas) => { + for isa in isas { + if isa.triple().architecture == HOST.architecture { + return Ok(builder.finish(isa.flags().clone())?); + } + } + anyhow::bail!( + "The target ISA specified in the file is not compatible with the host ISA" + ) + } } } diff --git a/cranelift/src/souper_harvest.rs b/cranelift/src/souper_harvest.rs index a8490f842ae4..f1d1c11f37cd 100644 --- a/cranelift/src/souper_harvest.rs +++ b/cranelift/src/souper_harvest.rs @@ -22,21 +22,21 @@ pub struct Options { /// Specify the directory where harvested left-hand side files should be /// written to. - #[clap(short, long)] + #[arg(short, long)] output_dir: PathBuf, /// Configure Cranelift settings - #[clap(long = "set")] + #[arg(long = "set")] settings: Vec, /// Specify the Cranelift target - #[clap(long = "target")] + #[arg(long = "target")] target: String, /// Add a comment from which CLIF variable and function each left-hand side /// was harvested from. This prevents deduplicating harvested left-hand /// sides. - #[clap(long)] + #[arg(long)] add_harvest_source: bool, } @@ -56,7 +56,7 @@ pub fn run(options: &Options) -> Result<()> { )) }; - match std::fs::create_dir_all(&options.output_dir) { + match fs::create_dir_all(&options.output_dir) { Ok(_) => {} Err(e) if e.kind() == io::ErrorKind::AlreadyExists diff --git a/cranelift/src/wasm.rs b/cranelift/src/wasm.rs index 8a5e2102b461..d1eb99c7b010 100644 --- a/cranelift/src/wasm.rs +++ b/cranelift/src/wasm.rs @@ -59,46 +59,46 @@ macro_rules! vcprint { #[derive(Parser)] pub struct Options { /// Be more verbose - #[clap(short, long)] + #[arg(short, long)] verbose: bool, /// Print the resulting Cranelift IR - #[clap(short)] + #[arg(short)] print: bool, /// Print pass timing report - #[clap(short = 'T')] + #[arg(short = 'T')] report_times: bool, /// Print machine code disassembly - #[clap(short = 'D', long)] + #[arg(short = 'D', long)] disasm: bool, /// Configure Cranelift settings - #[clap(long = "set")] + #[arg(long = "set")] settings: Vec, /// Specify the Cranelift target - #[clap(long = "target")] + #[arg(long = "target")] target: String, /// Specify an input file to be used. Use '-' for stdin. files: Vec, /// Print bytecode size - #[clap(short = 'X')] + #[arg(short = 'X')] print_size: bool, /// Just decode Wasm into Cranelift IR, don't compile it to native code - #[clap(short = 't')] + #[arg(short = 't')] just_decode: bool, /// Just checks the correctness of Cranelift IR translated from Wasm - #[clap(short = 'c')] + #[arg(short = 'c')] check_translation: bool, /// Use colors in output? [options: auto/never/always; default: auto] - #[clap(long = "color", default_value("auto"))] + #[arg(long = "color", default_value("auto"))] color: ColorOpt, } diff --git a/cranelift/umbrella/Cargo.toml b/cranelift/umbrella/Cargo.toml index eabeafd6fca5..83b6d8536577 100644 --- a/cranelift/umbrella/Cargo.toml +++ b/cranelift/umbrella/Cargo.toml @@ -1,7 +1,7 @@ [package] authors = ["The Cranelift Project Developers"] name = "cranelift" -version = "0.103.0" +version = "0.106.0" description = "Umbrella for commonly-used cranelift crates" license = "Apache-2.0 WITH LLVM-exception" documentation = "https://docs.rs/cranelift" diff --git a/cranelift/umbrella/src/lib.rs b/cranelift/umbrella/src/lib.rs index 033b44e8ec21..9115f9495942 100644 --- a/cranelift/umbrella/src/lib.rs +++ b/cranelift/umbrella/src/lib.rs @@ -1,12 +1,6 @@ //! Cranelift umbrella crate, providing a convenient one-line dependency. -#![deny( - missing_docs, - trivial_numeric_casts, - unused_extern_crates, - unstable_features -)] -#![warn(unused_import_braces)] +#![deny(missing_docs)] #![no_std] /// Provide these crates, renamed to reduce stutter. diff --git a/cranelift/wasm/Cargo.toml b/cranelift/wasm/Cargo.toml index 35fd46c763dd..d71ef1d2f851 100644 --- a/cranelift/wasm/Cargo.toml +++ b/cranelift/wasm/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cranelift-wasm" -version = "0.103.0" +version = "0.106.0" authors = ["The Cranelift Project Developers"] description = "Translator from WebAssembly to Cranelift IR" documentation = "https://docs.rs/cranelift-wasm" @@ -11,6 +11,9 @@ readme = "README.md" keywords = ["webassembly", "wasm"] edition.workspace = true +[lints] +workspace = true + [dependencies] wasmparser = { workspace = true } cranelift-codegen = { workspace = true } @@ -18,7 +21,7 @@ cranelift-entity = { workspace = true } cranelift-frontend = { workspace = true } wasmtime-types = { workspace = true } hashbrown = { workspace = true, optional = true } -itertools = "0.10.0" +itertools = "0.12.0" log = { workspace = true } serde = { version = "1.0.188", optional = true } serde_derive = { version = "1.0.188", optional = true } diff --git a/cranelift/wasm/src/code_translator.rs b/cranelift/wasm/src/code_translator.rs index ef6946150b41..163574f53242 100644 --- a/cranelift/wasm/src/code_translator.rs +++ b/cranelift/wasm/src/code_translator.rs @@ -2503,7 +2503,42 @@ pub fn translate_operator( state.push1(r); } - Operator::RefI31 | Operator::I31GetS | Operator::I31GetU => { + Operator::TryTable { .. } | Operator::ThrowRef => { + unimplemented!("exception operators not yet implemented") + } + + Operator::RefI31 + | Operator::I31GetS + | Operator::I31GetU + | Operator::RefEq + | Operator::RefTestNonNull { .. } + | Operator::RefTestNullable { .. } + | Operator::RefCastNonNull { .. } + | Operator::RefCastNullable { .. } + | Operator::BrOnCast { .. } + | Operator::BrOnCastFail { .. } + | Operator::AnyConvertExtern + | Operator::ExternConvertAny + | Operator::ArrayNew { .. } + | Operator::ArrayNewDefault { .. } + | Operator::ArrayNewFixed { .. } + | Operator::ArrayNewData { .. } + | Operator::ArrayNewElem { .. } + | Operator::ArrayGet { .. } + | Operator::ArrayGetU { .. } + | Operator::ArrayGetS { .. } + | Operator::ArraySet { .. } + | Operator::ArrayLen { .. } + | Operator::ArrayFill { .. } + | Operator::ArrayCopy { .. } + | Operator::ArrayInitData { .. } + | Operator::ArrayInitElem { .. } + | Operator::StructNew { .. } + | Operator::StructNewDefault { .. } + | Operator::StructGetS { .. } + | Operator::StructGetU { .. } + | Operator::StructSet { .. } + | Operator::StructGet { .. } => { unimplemented!("GC operators not yet implemented") } }; @@ -2685,7 +2720,7 @@ where // `addr32 + offset` to `addr32 + offset + width` (not inclusive). In this // scenario our adjusted offset that we're checking is `memarg.offset + // access_size`. Note that we do saturating arithmetic here to avoid - // overflow. THe addition here is in the 64-bit space, which means that + // overflow. The addition here is in the 64-bit space, which means that // we'll never overflow for 32-bit wasm but for 64-bit this is an issue. If // our effective offset is u64::MAX though then it's impossible for for // that to actually be a valid offset because otherwise the wasm linear diff --git a/cranelift/wasm/src/environ/dummy.rs b/cranelift/wasm/src/environ/dummy.rs index f27ffc7025e0..41308477e8d5 100644 --- a/cranelift/wasm/src/environ/dummy.rs +++ b/cranelift/wasm/src/environ/dummy.rs @@ -8,7 +8,7 @@ use crate::environ::{FuncEnvironment, GlobalVariable, ModuleEnvironment, TargetEnvironment}; use crate::func_translator::FuncTranslator; use crate::state::FuncTranslationState; -use crate::WasmType; +use crate::WasmValType; use crate::{ DataIndex, DefinedFuncIndex, ElemIndex, FuncIndex, Global, GlobalIndex, GlobalInit, Heap, HeapData, HeapStyle, Memory, MemoryIndex, Table, TableIndex, TypeConvert, TypeIndex, @@ -248,7 +248,7 @@ impl<'dummy_environment> DummyFuncEnvironment<'dummy_environment> { } impl<'dummy_environment> TypeConvert for DummyFuncEnvironment<'dummy_environment> { - fn lookup_heap_type(&self, _index: TypeIndex) -> WasmHeapType { + fn lookup_heap_type(&self, _index: wasmparser::UnpackedIndex) -> WasmHeapType { unimplemented!() } } @@ -280,12 +280,12 @@ impl<'dummy_environment> FuncEnvironment for DummyFuncEnvironment<'dummy_environ gv: vmctx, offset, ty: match self.mod_info.globals[index].entity.wasm_ty { - WasmType::I32 => ir::types::I32, - WasmType::I64 => ir::types::I64, - WasmType::F32 => ir::types::F32, - WasmType::F64 => ir::types::F64, - WasmType::V128 => ir::types::I8X16, - WasmType::Ref(_) => ir::types::R64, + WasmValType::I32 => ir::types::I32, + WasmValType::I64 => ir::types::I64, + WasmValType::F32 => ir::types::F32, + WasmValType::F64 => ir::types::F64, + WasmValType::V128 => ir::types::I8X16, + WasmValType::Ref(_) => ir::types::R64, }, }) } @@ -704,7 +704,7 @@ impl<'dummy_environment> FuncEnvironment for DummyFuncEnvironment<'dummy_environ } impl TypeConvert for DummyEnvironment { - fn lookup_heap_type(&self, _index: TypeIndex) -> WasmHeapType { + fn lookup_heap_type(&self, _index: wasmparser::UnpackedIndex) -> WasmHeapType { unimplemented!() } } @@ -726,19 +726,19 @@ impl TargetEnvironment for DummyEnvironment { impl<'data> ModuleEnvironment<'data> for DummyEnvironment { fn declare_type_func(&mut self, wasm: WasmFuncType) -> WasmResult<()> { let mut sig = ir::Signature::new(CallConv::Fast); - let mut cvt = |ty: &WasmType| { + let mut cvt = |ty: &WasmValType| { let reference_type = match self.pointer_type() { ir::types::I32 => ir::types::R32, ir::types::I64 => ir::types::R64, _ => panic!("unsupported pointer type"), }; ir::AbiParam::new(match ty { - WasmType::I32 => ir::types::I32, - WasmType::I64 => ir::types::I64, - WasmType::F32 => ir::types::F32, - WasmType::F64 => ir::types::F64, - WasmType::V128 => ir::types::I8X16, - WasmType::Ref(_) => reference_type, + WasmValType::I32 => ir::types::I32, + WasmValType::I64 => ir::types::I64, + WasmValType::F32 => ir::types::F32, + WasmValType::F64 => ir::types::F64, + WasmValType::V128 => ir::types::I8X16, + WasmValType::Ref(_) => reference_type, }) }; sig.params.extend(wasm.params().iter().map(&mut cvt)); diff --git a/cranelift/wasm/src/environ/mod.rs b/cranelift/wasm/src/environ/mod.rs index 22d394466ef2..63c86b54cf86 100644 --- a/cranelift/wasm/src/environ/mod.rs +++ b/cranelift/wasm/src/environ/mod.rs @@ -11,4 +11,4 @@ pub use crate::environ::dummy::{ pub use crate::environ::spec::{ FuncEnvironment, GlobalVariable, ModuleEnvironment, TargetEnvironment, }; -pub use crate::environ::zkasm::{ZkasmEnvironment, ZkasmFuncEnvironment, ZkasmModuleInfo}; +pub use crate::environ::zkasm::ZkasmEnvironment; diff --git a/cranelift/wasm/src/environ/spec.rs b/cranelift/wasm/src/environ/spec.rs index 967839ce12ef..06673bbf4fae 100644 --- a/cranelift/wasm/src/environ/spec.rs +++ b/cranelift/wasm/src/environ/spec.rs @@ -9,8 +9,8 @@ use crate::state::FuncTranslationState; use crate::{ DataIndex, ElemIndex, FuncIndex, Global, GlobalIndex, GlobalInit, Heap, HeapData, Memory, - MemoryIndex, SignatureIndex, Table, TableIndex, Tag, TagIndex, TypeConvert, TypeIndex, - WasmError, WasmFuncType, WasmHeapType, WasmResult, + MemoryIndex, Table, TableIndex, Tag, TagIndex, TypeConvert, TypeIndex, WasmError, WasmFuncType, + WasmHeapType, WasmResult, }; use core::convert::From; use cranelift_codegen::cursor::FuncCursor; @@ -22,6 +22,7 @@ use cranelift_frontend::FunctionBuilder; use std::boxed::Box; use std::string::ToString; use wasmparser::{FuncValidator, FunctionBody, Operator, ValidatorResources, WasmFeatures}; +use wasmtime_types::ModuleInternedTypeIndex; /// The value of a WebAssembly global variable. #[derive(Clone, Copy)] @@ -704,7 +705,7 @@ pub trait ModuleEnvironment<'data>: TypeConvert { /// Translates a type index to its signature index, only called for type /// indices which point to functions. - fn type_to_signature(&self, index: TypeIndex) -> WasmResult { + fn type_to_signature(&self, index: TypeIndex) -> WasmResult { let _ = index; Err(WasmError::Unsupported("module linking".to_string())) } diff --git a/cranelift/wasm/src/environ/zkasm.rs b/cranelift/wasm/src/environ/zkasm.rs index ad5a8e2f5b67..1c206b02336c 100644 --- a/cranelift/wasm/src/environ/zkasm.rs +++ b/cranelift/wasm/src/environ/zkasm.rs @@ -8,7 +8,7 @@ use crate::environ::{FuncEnvironment, GlobalVariable, ModuleEnvironment, TargetEnvironment}; use crate::func_translator::FuncTranslator; use crate::state::FuncTranslationState; -use crate::WasmType; +use crate::WasmValType; use crate::{ DataIndex, DefinedFuncIndex, ElemIndex, FuncIndex, Global, GlobalIndex, GlobalInit, Heap, HeapData, HeapStyle, Memory, MemoryIndex, Table, TableIndex, TypeConvert, TypeIndex, @@ -25,7 +25,9 @@ use cranelift_frontend::FunctionBuilder; use std::boxed::Box; use std::string::String; use std::vec::Vec; -use wasmparser::{FuncValidator, FunctionBody, Operator, ValidatorResources, WasmFeatures}; +use wasmparser::{ + FuncValidator, FunctionBody, Operator, UnpackedIndex, ValidatorResources, WasmFeatures, +}; /// A collection of names under which a given entity is exported. pub struct Exportable { @@ -294,7 +296,7 @@ impl<'zkasm_environment> ZkasmFuncEnvironment<'zkasm_environment> { } impl<'zkasm_environment> TypeConvert for ZkasmFuncEnvironment<'zkasm_environment> { - fn lookup_heap_type(&self, _index: TypeIndex) -> WasmHeapType { + fn lookup_heap_type(&self, _index: UnpackedIndex) -> WasmHeapType { unimplemented!() } } @@ -324,12 +326,12 @@ impl<'zkasm_environment> FuncEnvironment for ZkasmFuncEnvironment<'zkasm_environ gv: ZkasmFuncEnvironment::globals_base(func), offset, ty: match self.mod_info.globals[index].entity.wasm_ty { - WasmType::I32 => ir::types::I32, - WasmType::I64 => ir::types::I64, - WasmType::F32 => ir::types::F32, - WasmType::F64 => ir::types::F64, - WasmType::V128 => ir::types::I8X16, - WasmType::Ref(_) => ir::types::R64, + WasmValType::I32 => ir::types::I32, + WasmValType::I64 => ir::types::I64, + WasmValType::F32 => ir::types::F32, + WasmValType::F64 => ir::types::F64, + WasmValType::V128 => ir::types::I8X16, + WasmValType::Ref(_) => ir::types::R64, }, }) } @@ -711,7 +713,7 @@ impl<'zkasm_environment> FuncEnvironment for ZkasmFuncEnvironment<'zkasm_environ } impl TypeConvert for ZkasmEnvironment { - fn lookup_heap_type(&self, _index: TypeIndex) -> WasmHeapType { + fn lookup_heap_type(&self, _index: UnpackedIndex) -> WasmHeapType { unimplemented!() } } @@ -733,19 +735,19 @@ impl TargetEnvironment for ZkasmEnvironment { impl<'data> ModuleEnvironment<'data> for ZkasmEnvironment { fn declare_type_func(&mut self, wasm: WasmFuncType) -> WasmResult<()> { let mut sig = ir::Signature::new(CallConv::Fast); - let mut cvt = |ty: &WasmType| { + let mut cvt = |ty: &WasmValType| { let reference_type = match self.pointer_type() { ir::types::I32 => ir::types::R32, ir::types::I64 => ir::types::R64, _ => panic!("unsupported pointer type"), }; ir::AbiParam::new(match ty { - WasmType::I32 => ir::types::I32, - WasmType::I64 => ir::types::I64, - WasmType::F32 => ir::types::F32, - WasmType::F64 => ir::types::F64, - WasmType::V128 => ir::types::I8X16, - WasmType::Ref(_) => reference_type, + WasmValType::I32 => ir::types::I32, + WasmValType::I64 => ir::types::I64, + WasmValType::F32 => ir::types::F32, + WasmValType::F64 => ir::types::F64, + WasmValType::V128 => ir::types::I8X16, + WasmValType::Ref(_) => reference_type, }) }; sig.params.extend(wasm.params().iter().map(&mut cvt)); diff --git a/cranelift/wasm/src/lib.rs b/cranelift/wasm/src/lib.rs index 1ed3ec1b1f9e..1c93d4dbbbb7 100644 --- a/cranelift/wasm/src/lib.rs +++ b/cranelift/wasm/src/lib.rs @@ -9,9 +9,7 @@ //! //! The main function of this module is [`translate_module`](fn.translate_module.html). -#![deny(missing_docs, trivial_numeric_casts, unused_extern_crates)] -#![warn(unused_import_braces)] -#![cfg_attr(feature = "std", deny(unstable_features))] +#![deny(missing_docs)] #![no_std] #[cfg(not(feature = "std"))] diff --git a/cranelift/wasm/src/sections_translator.rs b/cranelift/wasm/src/sections_translator.rs index e38b1327787b..876d01508af8 100644 --- a/cranelift/wasm/src/sections_translator.rs +++ b/cranelift/wasm/src/sections_translator.rs @@ -401,6 +401,7 @@ pub fn parse_name_section<'data>( | wasmparser::Name::Memory(_) | wasmparser::Name::Element(_) | wasmparser::Name::Data(_) + | wasmparser::Name::Tag(_) | wasmparser::Name::Unknown { .. } => {} } } diff --git a/cranelift/wasm/src/translation_utils.rs b/cranelift/wasm/src/translation_utils.rs index 8a6ceb2c73fa..bfdba3bc4d49 100644 --- a/cranelift/wasm/src/translation_utils.rs +++ b/cranelift/wasm/src/translation_utils.rs @@ -4,7 +4,7 @@ use crate::WasmResult; use core::u32; use cranelift_codegen::ir; use cranelift_frontend::FunctionBuilder; -use wasmparser::{FuncValidator, WasmFuncType, WasmModuleResources}; +use wasmparser::{FuncValidator, WasmModuleResources}; /// Get the parameter and result types for the given Wasm blocktype. pub fn blocktype_params_results<'a, T>( @@ -18,30 +18,24 @@ where T: WasmModuleResources, { return Ok(match ty { - wasmparser::BlockType::Empty => { - let params: &'static [wasmparser::ValType] = &[]; - let results: std::vec::Vec = vec![]; - ( - itertools::Either::Left(params.iter().copied()), - itertools::Either::Left(results.into_iter()), - ) - } - wasmparser::BlockType::Type(ty) => { - let params: &'static [wasmparser::ValType] = &[]; - let results: std::vec::Vec = vec![ty.clone()]; - ( - itertools::Either::Left(params.iter().copied()), - itertools::Either::Left(results.into_iter()), - ) - } + wasmparser::BlockType::Empty => ( + itertools::Either::Left(std::iter::empty()), + itertools::Either::Left(None.into_iter()), + ), + wasmparser::BlockType::Type(ty) => ( + itertools::Either::Left(std::iter::empty()), + itertools::Either::Left(Some(ty).into_iter()), + ), wasmparser::BlockType::FuncType(ty_index) => { let ty = validator .resources() - .func_type_at(ty_index) - .expect("should be valid"); + .sub_type_at(ty_index) + .expect("should be valid") + .unwrap_func(); + ( - itertools::Either::Right(ty.inputs()), - itertools::Either::Right(ty.outputs()), + itertools::Either::Right(ty.params().iter().copied()), + itertools::Either::Right(ty.results().iter().copied()), ) } }); diff --git a/cranelift/wasm/wasmtests/icall-simd.wat b/cranelift/wasm/wasmtests/icall-simd.wat index d656b265b96a..ea6ea9d0570f 100644 --- a/cranelift/wasm/wasmtests/icall-simd.wat +++ b/cranelift/wasm/wasmtests/icall-simd.wat @@ -3,5 +3,5 @@ (func $foo (export "foo") (param i32) (param v128) (result v128) (call_indirect (type $ft) (local.get 1) (local.get 0)) ) - (table (;0;) 23 23 anyfunc) + (table (;0;) 23 23 funcref) ) diff --git a/cranelift/wasm/wasmtests/icall.wat b/cranelift/wasm/wasmtests/icall.wat index f1dde0eafea5..d0c0fb42fcd4 100644 --- a/cranelift/wasm/wasmtests/icall.wat +++ b/cranelift/wasm/wasmtests/icall.wat @@ -3,5 +3,5 @@ (func $foo (export "foo") (param i32 f32) (result i32) (call_indirect (type $ft) (local.get 1) (local.get 0)) ) - (table (;0;) 23 23 anyfunc) + (table (;0;) 23 23 funcref) ) diff --git a/cranelift/wasm/wasmtests/unreachable_code.wat b/cranelift/wasm/wasmtests/unreachable_code.wat index 38c1a315cef9..0fdcc51b3b3b 100644 --- a/cranelift/wasm/wasmtests/unreachable_code.wat +++ b/cranelift/wasm/wasmtests/unreachable_code.wat @@ -72,6 +72,6 @@ end drop ) - (table (;0;) 16 anyfunc) + (table (;0;) 16 funcref) (elem (i32.const 0)) ) diff --git a/crates/bench-api/Cargo.toml b/crates/bench-api/Cargo.toml index ebfdeb871002..3cee803f77e5 100644 --- a/crates/bench-api/Cargo.toml +++ b/crates/bench-api/Cargo.toml @@ -9,6 +9,9 @@ readme = "README.md" edition.workspace = true publish = false +[lints] +workspace = true + [lib] name = "wasmtime_bench_api" crate-type = ["cdylib"] @@ -22,9 +25,8 @@ wasmtime = { workspace = true, default-features = true } wasmtime-cli-flags = { workspace = true, default-features = true, features = [ "cranelift", ] } -wasmtime-wasi = { workspace = true, default-features = true } +wasi-common = { workspace = true, default-features = true } wasmtime-wasi-nn = { workspace = true, optional = true } -wasi-cap-std-sync = { workspace = true } cap-std = { workspace = true } clap = { workspace = true } diff --git a/crates/bench-api/src/lib.rs b/crates/bench-api/src/lib.rs index bb4f6ed551ba..ebcef9ac6b38 100644 --- a/crates/bench-api/src/lib.rs +++ b/crates/bench-api/src/lib.rs @@ -142,9 +142,9 @@ use std::os::raw::{c_int, c_void}; use std::slice; use std::{env, path::PathBuf}; use target_lexicon::Triple; +use wasi_common::{sync::WasiCtxBuilder, I32Exit, WasiCtx}; use wasmtime::{Engine, Instance, Linker, Module, Store}; use wasmtime_cli_flags::CommonOptions; -use wasmtime_wasi::{sync::WasiCtxBuilder, I32Exit, WasiCtx}; pub type ExitCode = c_int; pub const OK: ExitCode = 0; @@ -304,20 +304,20 @@ pub extern "C" fn wasm_bench_create( let stdout = std::fs::File::create(&stdout_path) .with_context(|| format!("failed to create {}", stdout_path.display()))?; let stdout = cap_std::fs::File::from_std(stdout); - let stdout = wasi_cap_std_sync::file::File::from_cap_std(stdout); + let stdout = wasi_common::sync::file::File::from_cap_std(stdout); cx.stdout(Box::new(stdout)); let stderr = std::fs::File::create(&stderr_path) .with_context(|| format!("failed to create {}", stderr_path.display()))?; let stderr = cap_std::fs::File::from_std(stderr); - let stderr = wasi_cap_std_sync::file::File::from_cap_std(stderr); + let stderr = wasi_common::sync::file::File::from_cap_std(stderr); cx.stderr(Box::new(stderr)); if let Some(stdin_path) = &stdin_path { let stdin = std::fs::File::open(stdin_path) .with_context(|| format!("failed to open {}", stdin_path.display()))?; let stdin = cap_std::fs::File::from_std(stdin); - let stdin = wasi_cap_std_sync::file::File::from_cap_std(stdin); + let stdin = wasi_common::sync::file::File::from_cap_std(stdin); cx.stdin(Box::new(stdin)); } @@ -460,7 +460,7 @@ impl BenchState { let fuel = options.wasm.fuel; if options.wasi.common != Some(false) { - wasmtime_wasi::add_to_linker(&mut linker, |cx| &mut cx.wasi)?; + wasi_common::sync::add_to_linker(&mut linker, |cx| &mut cx.wasi)?; } #[cfg(feature = "wasi-nn")] diff --git a/crates/c-api/macros/Cargo.toml b/crates/c-api-macros/Cargo.toml similarity index 83% rename from crates/c-api/macros/Cargo.toml rename to crates/c-api-macros/Cargo.toml index 33de12aa0ad4..0f45c16f1485 100644 --- a/crates/c-api/macros/Cargo.toml +++ b/crates/c-api-macros/Cargo.toml @@ -1,10 +1,12 @@ [package] name = "wasmtime-c-api-macros" -version = "0.0.0" +version.workspace = true authors = ["The Wasmtime Project Developers"] license = "Apache-2.0 WITH LLVM-exception" edition.workspace = true -publish = false + +[lints] +workspace = true [lib] proc-macro = true diff --git a/crates/c-api/macros/src/lib.rs b/crates/c-api-macros/src/lib.rs similarity index 99% rename from crates/c-api/macros/src/lib.rs rename to crates/c-api-macros/src/lib.rs index 9eb9bea4e31d..01ecf028a9c8 100644 --- a/crates/c-api/macros/src/lib.rs +++ b/crates/c-api-macros/src/lib.rs @@ -3,8 +3,6 @@ //! These are intended to mirror the macros in the `wasm.h` header file and //! largely facilitate the `declare_ref` macro. -extern crate proc_macro; - use proc_macro2::{Ident, TokenStream, TokenTree}; use quote::quote; diff --git a/crates/c-api/CMakeLists.txt b/crates/c-api/CMakeLists.txt index b5fb5e085f08..ff92a091e237 100644 --- a/crates/c-api/CMakeLists.txt +++ b/crates/c-api/CMakeLists.txt @@ -11,23 +11,6 @@ else() set(WASMTIME_BUILD_TYPE "debug") endif() -if(BUILD_SHARED_LIBS) - # Copy shared library into build directory - if(WIN32) - set(WASMTIME_INSTALL_COMMAND ${CMAKE_COMMAND} -E copy_if_different - ${CMAKE_CURRENT_SOURCE_DIR}/../../target/${WASMTIME_BUILD_TYPE}/wasmtime.dll - ${CMAKE_BINARY_DIR}) - elseif(APPLE) - set(WASMTIME_INSTALL_COMMAND ${CMAKE_COMMAND} -E copy_if_different - ${CMAKE_CURRENT_SOURCE_DIR}/../../target/${WASMTIME_BUILD_TYPE}/libwasmtime.dylib - ${CMAKE_BINARY_DIR}) - else() - set(WASMTIME_INSTALL_COMMAND ${CMAKE_COMMAND} -E copy_if_different - ${CMAKE_CURRENT_SOURCE_DIR}/../../target/${WASMTIME_BUILD_TYPE}/libwasmtime.so - ${CMAKE_BINARY_DIR}) - endif() -endif() - if(ANDROID) # TODO wasmtime only supports arm64-v8a right now if(ANDROID_ABI STREQUAL "armeabi-v7a") diff --git a/crates/c-api/Cargo.toml b/crates/c-api/Cargo.toml index 82d46337bba9..a4b8e063931b 100644 --- a/crates/c-api/Cargo.toml +++ b/crates/c-api/Cargo.toml @@ -7,11 +7,14 @@ license = "Apache-2.0 WITH LLVM-exception" repository = "https://github.com/bytecodealliance/wasmtime" readme = "README.md" edition.workspace = true -publish = false +links = "wasmtime-c-api" +include = ["include", "src", "wasm-c-api/include", "build.rs"] + +[lints] +workspace = true [lib] -name = "wamstime_c_api" -doc = false +name = "wasmtime_c_api" test = false doctest = false @@ -19,8 +22,8 @@ doctest = false env_logger = { workspace = true, optional = true } anyhow = { workspace = true } once_cell = { workspace = true } -wasmtime = { workspace = true, features = ['cranelift'] } -wasmtime-c-api-macros = { path = "macros" } +wasmtime = { workspace = true, features = ['cranelift', 'runtime'] } +wasmtime-c-api-macros = { workspace = true } log = { workspace = true } tracing = { workspace = true } @@ -28,10 +31,9 @@ tracing = { workspace = true } wat = { workspace = true, optional = true } # Optional dependencies for the `wasi` feature -wasi-cap-std-sync = { workspace = true, optional = true } wasmtime-wasi = { workspace = true, default-features = true, optional = true } cap-std = { workspace = true, optional = true } -wasi-common = { workspace = true, optional = true } +wasi-common = { workspace = true, optional = true, features = ["sync"] } # Optional dependencies for the `async` feature futures = { workspace = true, optional = true } @@ -41,7 +43,7 @@ async = ['wasmtime/async', 'futures'] profiling = ["wasmtime/profiling"] cache = ["wasmtime/cache"] parallel-compilation = ['wasmtime/parallel-compilation'] -wasi = ['wasi-cap-std-sync', 'wasmtime-wasi', 'cap-std', 'wasi-common'] +wasi = ['wasmtime-wasi', 'cap-std', 'wasi-common'] logging = ['dep:env_logger'] disable-logging = ["log/max_level_off", "tracing/max_level_off"] coredump = ["wasmtime/coredump"] diff --git a/crates/c-api/README.md b/crates/c-api/README.md index 5d7149dd18ac..3c73616165cb 100644 --- a/crates/c-api/README.md +++ b/crates/c-api/README.md @@ -2,3 +2,43 @@ For more information you can find the documentation for this library [online](https://bytecodealliance.github.io/wasmtime/c-api/). + +## Using in a C Project + +To use Wasmtime from a C or C++ project, you can use Cargo to build the Wasmtime C bindings. From the root of the Wasmtime repository, run the following command: + +``` +cargo build --release wasmtime-c-api +``` + +This will create static and dynamic libraries called `libwasmtime` in the `target/release` directory. + +## Using in a Rust Project + +If you have a Rust crate that contains bindings to a C or C++ library that uses Wasmtime, you can link the Wasmtime C API using Cargo. + +1. Add a dependency on the `wasmtime-c-api-impl` crate to your `Cargo.toml`. Note that package name differs from the library name. + +```toml +[dependencies] +wasmtime-c-api = { version = "16.0.0", package = "wasmtime-c-api-impl" } +``` + +2. In your `build.rs` file, when compiling your C/C++ source code, add the C `wasmtime-c-api` headers to the include path: + +```rust +fn main() { + let mut cfg = cc::Build::new(); + + // Add to the include path the wasmtime headers and the standard + // Wasm C API headers. + cfg + .include(std::env::var("DEP_WASMTIME_C_API_INCLUDE").unwrap()); + .include(std::env::var("DEP_WASMTIME_C_API_WASM_INCLUDE").unwrap()); + + // Compile your C code. + cfg + .file("src/your_c_code.c") + .compile("your_library"); +} +``` diff --git a/crates/c-api/build.rs b/crates/c-api/build.rs new file mode 100644 index 000000000000..7f3f03bd93d5 --- /dev/null +++ b/crates/c-api/build.rs @@ -0,0 +1,5 @@ +fn main() { + let dir = std::env::var("CARGO_MANIFEST_DIR").unwrap(); + println!("cargo:include={dir}/include"); + println!("cargo:wasm_include={dir}/wasm-c-api/include"); +} diff --git a/crates/c-api/include/doc-wasm.h b/crates/c-api/include/doc-wasm.h index 6bad15c7445a..45afbecf919f 100644 --- a/crates/c-api/include/doc-wasm.h +++ b/crates/c-api/include/doc-wasm.h @@ -1,3 +1,5 @@ +/* clang-format off */ + /** * \file wasm.h * diff --git a/crates/c-api/include/wasi.h b/crates/c-api/include/wasi.h index e927e04a44aa..1f520cb265c9 100644 --- a/crates/c-api/include/wasi.h +++ b/crates/c-api/include/wasi.h @@ -7,8 +7,8 @@ #ifndef WASI_H #define WASI_H -#include #include "wasm.h" +#include #ifndef WASI_API_EXTERN #ifdef _WIN32 @@ -24,9 +24,9 @@ extern "C" { #define own -#define WASI_DECLARE_OWN(name) \ - typedef struct wasi_##name##_t wasi_##name##_t; \ - WASI_API_EXTERN void wasi_##name##_delete(own wasi_##name##_t*); +#define WASI_DECLARE_OWN(name) \ + typedef struct wasi_##name##_t wasi_##name##_t; \ + WASI_API_EXTERN void wasi_##name##_delete(own wasi_##name##_t *); /** * \typedef wasi_config_t @@ -45,7 +45,7 @@ WASI_DECLARE_OWN(config) * * The caller is expected to deallocate the returned configuration */ -WASI_API_EXTERN own wasi_config_t* wasi_config_new(); +WASI_API_EXTERN own wasi_config_t *wasi_config_new(); /** * \brief Sets the argv list for this configuration object. @@ -56,13 +56,14 @@ WASI_API_EXTERN own wasi_config_t* wasi_config_new(); * The arguments are copied into the `config` object as part of this function * call, so the `argv` pointer only needs to stay alive for this function call. */ -WASI_API_EXTERN void wasi_config_set_argv(wasi_config_t* config, int argc, const char* argv[]); +WASI_API_EXTERN void wasi_config_set_argv(wasi_config_t *config, int argc, + const char *argv[]); /** * \brief Indicates that the argv list should be inherited from this process's * argv list. */ -WASI_API_EXTERN void wasi_config_inherit_argv(wasi_config_t* config); +WASI_API_EXTERN void wasi_config_inherit_argv(wasi_config_t *config); /** * \brief Sets the list of environment variables available to the WASI instance. @@ -76,13 +77,15 @@ WASI_API_EXTERN void wasi_config_inherit_argv(wasi_config_t* config); * call, so the `names` and `values` pointers only need to stay alive for this * function call. */ -WASI_API_EXTERN void wasi_config_set_env(wasi_config_t* config, int envc, const char* names[], const char* values[]); +WASI_API_EXTERN void wasi_config_set_env(wasi_config_t *config, int envc, + const char *names[], + const char *values[]); /** * \brief Indicates that the entire environment of the calling process should be * inherited by this WASI configuration. */ -WASI_API_EXTERN void wasi_config_inherit_env(wasi_config_t* config); +WASI_API_EXTERN void wasi_config_inherit_env(wasi_config_t *config); /** * \brief Configures standard input to be taken from the specified file. @@ -93,23 +96,26 @@ WASI_API_EXTERN void wasi_config_inherit_env(wasi_config_t* config); * If the stdin location does not exist or it cannot be opened for reading then * `false` is returned. Otherwise `true` is returned. */ -WASI_API_EXTERN bool wasi_config_set_stdin_file(wasi_config_t* config, const char* path); +WASI_API_EXTERN bool wasi_config_set_stdin_file(wasi_config_t *config, + const char *path); /** - * \brief Configures standard input to be taken from the specified #wasm_byte_vec_t. + * \brief Configures standard input to be taken from the specified + * #wasm_byte_vec_t. * * By default WASI programs have no stdin, but this configures the specified * bytes to be used as stdin for this configuration. * * This function takes ownership of the `binary` argument. */ -WASI_API_EXTERN void wasi_config_set_stdin_bytes(wasi_config_t* config, wasm_byte_vec_t* binary); +WASI_API_EXTERN void wasi_config_set_stdin_bytes(wasi_config_t *config, + wasm_byte_vec_t *binary); /** * \brief Configures this process's own stdin stream to be used as stdin for * this WASI configuration. */ -WASI_API_EXTERN void wasi_config_inherit_stdin(wasi_config_t* config); +WASI_API_EXTERN void wasi_config_inherit_stdin(wasi_config_t *config); /** * \brief Configures standard output to be written to the specified file. @@ -120,13 +126,14 @@ WASI_API_EXTERN void wasi_config_inherit_stdin(wasi_config_t* config); * If the stdout location could not be opened for writing then `false` is * returned. Otherwise `true` is returned. */ -WASI_API_EXTERN bool wasi_config_set_stdout_file(wasi_config_t* config, const char* path); +WASI_API_EXTERN bool wasi_config_set_stdout_file(wasi_config_t *config, + const char *path); /** * \brief Configures this process's own stdout stream to be used as stdout for * this WASI configuration. */ -WASI_API_EXTERN void wasi_config_inherit_stdout(wasi_config_t* config); +WASI_API_EXTERN void wasi_config_inherit_stdout(wasi_config_t *config); /** * \brief Configures standard output to be written to the specified file. @@ -137,25 +144,29 @@ WASI_API_EXTERN void wasi_config_inherit_stdout(wasi_config_t* config); * If the stderr location could not be opened for writing then `false` is * returned. Otherwise `true` is returned. */ -WASI_API_EXTERN bool wasi_config_set_stderr_file(wasi_config_t* config, const char* path); +WASI_API_EXTERN bool wasi_config_set_stderr_file(wasi_config_t *config, + const char *path); /** * \brief Configures this process's own stderr stream to be used as stderr for * this WASI configuration. */ -WASI_API_EXTERN void wasi_config_inherit_stderr(wasi_config_t* config); +WASI_API_EXTERN void wasi_config_inherit_stderr(wasi_config_t *config); /** * \brief Configures a "preopened directory" to be available to WASI APIs. * * By default WASI programs do not have access to anything on the filesystem. * This API can be used to grant WASI programs access to a directory on the - * filesystem, but only that directory (its whole contents but nothing above it). + * filesystem, but only that directory (its whole contents but nothing above + * it). * * The `path` argument here is a path name on the host filesystem, and * `guest_path` is the name by which it will be known in wasm. */ -WASI_API_EXTERN bool wasi_config_preopen_dir(wasi_config_t* config, const char* path, const char* guest_path); +WASI_API_EXTERN bool wasi_config_preopen_dir(wasi_config_t *config, + const char *path, + const char *guest_path); /** * \brief Configures a "preopened" listen socket to be available to WASI APIs. @@ -168,12 +179,14 @@ WASI_API_EXTERN bool wasi_config_preopen_dir(wasi_config_t* config, const char* * known in WASM and the host_port is the IP address and port (e.g. * "127.0.0.1:8080") requested to listen on. */ -WASI_API_EXTERN bool wasi_config_preopen_socket(wasi_config_t* config, uint32_t fd_num, const char* host_port); +WASI_API_EXTERN bool wasi_config_preopen_socket(wasi_config_t *config, + uint32_t fd_num, + const char *host_port); #undef own #ifdef __cplusplus -} // extern "C" +} // extern "C" #endif -#endif // #ifdef WASI_H +#endif // #ifdef WASI_H diff --git a/crates/c-api/include/wasmtime.h b/crates/c-api/include/wasmtime.h index 50d5ec8d1b31..6ba3e76b8f03 100644 --- a/crates/c-api/include/wasmtime.h +++ b/crates/c-api/include/wasmtime.h @@ -57,7 +57,8 @@ * * * Linux - `-lpthread -ldl -lm` * * macOS - no extra flags needed - * * Windows - `ws2_32.lib advapi32.lib userenv.lib ntdll.lib shell32.lib ole32.lib bcrypt.lib` + * * Windows - `ws2_32.lib advapi32.lib userenv.lib ntdll.lib shell32.lib + * ole32.lib bcrypt.lib` * * ## Building from Source * @@ -181,6 +182,7 @@ #define WASMTIME_API_H #include +// clang-format off // IWYU pragma: begin_exports #include #include @@ -192,21 +194,23 @@ #include #include #include +#include #include #include #include #include #include // IWYU pragma: end_exports +// clang-format on /** * \brief Wasmtime version string. */ -#define WASMTIME_VERSION "16.0.0" +#define WASMTIME_VERSION "19.0.0" /** * \brief Wasmtime major version number. */ -#define WASMTIME_VERSION_MAJOR 16 +#define WASMTIME_VERSION_MAJOR 19 /** * \brief Wasmtime minor version number. */ @@ -223,11 +227,11 @@ extern "C" { /** * \brief Converts from the text format of WebAssembly to to the binary format. * - * \param wat this it the input pointer with the WebAssembly Text Format inside of - * it. This will be parsed and converted to the binary format. + * \param wat this it the input pointer with the WebAssembly Text Format inside + * of it. This will be parsed and converted to the binary format. * \param wat_len this it the length of `wat`, in bytes. - * \param ret if the conversion is successful, this byte vector is filled in with - * the WebAssembly binary format. + * \param ret if the conversion is successful, this byte vector is filled in + * with the WebAssembly binary format. * * \return a non-null error if parsing fails, or returns `NULL`. If parsing * fails then `ret` isn't touched. @@ -235,14 +239,11 @@ extern "C" { * This function does not take ownership of `wat`, and the caller is expected to * deallocate the returned #wasmtime_error_t and #wasm_byte_vec_t. */ -WASM_API_EXTERN wasmtime_error_t* wasmtime_wat2wasm( - const char *wat, - size_t wat_len, - wasm_byte_vec_t *ret -); +WASM_API_EXTERN wasmtime_error_t * +wasmtime_wat2wasm(const char *wat, size_t wat_len, wasm_byte_vec_t *ret); #ifdef __cplusplus -} // extern "C" +} // extern "C" #endif #endif // WASMTIME_API_H diff --git a/crates/c-api/include/wasmtime/async.h b/crates/c-api/include/wasmtime/async.h index 1ff8ccef787e..bb2e986f78a6 100644 --- a/crates/c-api/include/wasmtime/async.h +++ b/crates/c-api/include/wasmtime/async.h @@ -6,23 +6,27 @@ * Async functionality in Wasmtime is well documented here: * https://docs.wasmtime.dev/api/wasmtime/struct.Config.html#method.async_support * - * All WebAssembly executes synchronously, but an async support enables the Wasm code - * be executed on a seperate stack, so it can be paused and resumed. There are three - * mechanisms for yielding control from wasm to the caller: fuel, epochs, and async host functions. - * - * When WebAssembly is executed, a #wasmtime_call_future_t is returned. This struct represents the - * state of the execution and each call to #wasmtime_call_future_poll will execute the WebAssembly - * code on a seperate stack until the function returns or yields control back to the caller. - * - * It's expected these futures are pulled in a loop until completed, at which point the future - * should be deleted. Functions that return a #wasmtime_call_future_t are special in that all - * parameters to that function should not be modified in any way and must be kept alive until - * the future is deleted. This includes concurrent calls for a single store - another function - * on a store should not be called while there is a #wasmtime_call_future_t alive. - * - * As for asynchronous host calls - the reverse contract is upheld. Wasmtime will keep all parameters - * to the function alive and unmodified until the #wasmtime_func_async_continuation_callback_t returns - * true. + * All WebAssembly executes synchronously, but an async support enables the Wasm + * code be executed on a seperate stack, so it can be paused and resumed. There + * are three mechanisms for yielding control from wasm to the caller: fuel, + * epochs, and async host functions. + * + * When WebAssembly is executed, a #wasmtime_call_future_t is returned. This + * struct represents the state of the execution and each call to + * #wasmtime_call_future_poll will execute the WebAssembly code on a seperate + * stack until the function returns or yields control back to the caller. + * + * It's expected these futures are pulled in a loop until completed, at which + * point the future should be deleted. Functions that return a + * #wasmtime_call_future_t are special in that all parameters to that function + * should not be modified in any way and must be kept alive until the future is + * deleted. This includes concurrent calls for a single store - another function + * on a store should not be called while there is a #wasmtime_call_future_t + * alive. + * + * As for asynchronous host calls - the reverse contract is upheld. Wasmtime + * will keep all parameters to the function alive and unmodified until the + * #wasmtime_func_async_continuation_callback_t returns true. * */ @@ -30,22 +34,24 @@ #define WASMTIME_ASYNC_H #include -#include #include -#include +#include #include #include +#include #ifdef __cplusplus extern "C" { #endif /** - * \brief Whether or not to enable support for asynchronous functions in Wasmtime. + * \brief Whether or not to enable support for asynchronous functions in + * Wasmtime. * - * When enabled, the config can optionally define host functions with async. - * Instances created and functions called with this Config must be called through their asynchronous APIs, however. - * For example using wasmtime_func_call will panic when used with this config. + * When enabled, the config can optionally define host functions with async. + * Instances created and functions called with this Config must be called + * through their asynchronous APIs, however. For example using + * wasmtime_func_call will panic when used with this config. * * For more information see the Rust documentation at * https://docs.wasmtime.dev/api/wasmtime/struct.Config.html#method.async_support @@ -55,13 +61,15 @@ WASMTIME_CONFIG_PROP(void, async_support, bool) /** * \brief Configures the size of the stacks used for asynchronous execution. * - * This setting configures the size of the stacks that are allocated for asynchronous execution. + * This setting configures the size of the stacks that are allocated for + * asynchronous execution. * * The value cannot be less than max_wasm_stack. * - * The amount of stack space guaranteed for host functions is async_stack_size - max_wasm_stack, so take care - * not to set these two values close to one another; doing so may cause host functions to overflow the stack - * and abort the process. + * The amount of stack space guaranteed for host functions is async_stack_size - + * max_wasm_stack, so take care not to set these two values close to one + * another; doing so may cause host functions to overflow the stack and abort + * the process. * * By default this option is 2 MiB. * @@ -86,27 +94,28 @@ WASMTIME_CONFIG_PROP(void, async_stack_size, uint64_t) * \param interval the amount of fuel at which to yield. A value of 0 will * disable yielding. */ -WASM_API_EXTERN wasmtime_error_t* +WASM_API_EXTERN wasmtime_error_t * wasmtime_context_fuel_async_yield_interval(wasmtime_context_t *context, uint64_t interval); /** - * \brief Configures epoch-deadline expiration to yield to the async caller and the update the deadline. + * \brief Configures epoch-deadline expiration to yield to the async caller and + * the update the deadline. * - * This is only suitable with use of a store associated with an async config because - * only then are futures used and yields are possible. + * This is only suitable with use of a store associated with an async config + * because only then are futures used and yields are possible. * * See the Rust documentation for more: * https://docs.wasmtime.dev/api/wasmtime/struct.Store.html#method.epoch_deadline_async_yield_and_update */ -WASM_API_EXTERN wasmtime_error_t* wasmtime_context_epoch_deadline_async_yield_and_update( - wasmtime_context_t *context, - uint64_t delta); +WASM_API_EXTERN wasmtime_error_t * +wasmtime_context_epoch_deadline_async_yield_and_update( + wasmtime_context_t *context, uint64_t delta); /** * The callback to determine a continuation's current state. * - * Return true if the host call has completed, otherwise false will + * Return true if the host call has completed, otherwise false will * continue to yield WebAssembly execution. */ typedef bool (*wasmtime_func_async_continuation_callback_t)(void *env); @@ -126,59 +135,58 @@ typedef struct wasmtime_async_continuation_t { /** * \brief Callback signature for #wasmtime_linker_define_async_func. * - * This is a host function that returns a continuation to be called later. + * This is a host function that returns a continuation to be called later. * * All the arguments to this function will be kept alive until the continuation * returns that it has errored or has completed. * - * \param env user-provided argument passed to #wasmtime_linker_define_async_func + * \param env user-provided argument passed to + * #wasmtime_linker_define_async_func * \param caller a temporary object that can only be used during this function - * call. Used to acquire #wasmtime_context_t or caller's state + * call. Used to acquire #wasmtime_context_t or caller's state * \param args the arguments provided to this function invocation * \param nargs how many arguments are provided * \param results where to write the results of this function * \param nresults how many results must be produced - * \param trap_ret if assigned a not `NULL` value then the called function will - * trap with the returned error. Note that ownership of trap is transferred - * to wasmtime. - * \param continuation_ret the returned continuation that determines when the - * async function has completed executing. + * \param trap_ret if assigned a not `NULL` value then the called + * function will trap with the returned error. Note that ownership of + * trap is transferred to wasmtime. + * \param continuation_ret the returned continuation + * that determines when the async function has completed executing. * * Only supported for async stores. * * See #wasmtime_func_callback_t for more information. */ typedef void (*wasmtime_func_async_callback_t)( - void *env, - wasmtime_caller_t *caller, - const wasmtime_val_t *args, - size_t nargs, - wasmtime_val_t *results, - size_t nresults, - wasm_trap_t** trap_ret, - wasmtime_async_continuation_t * continuation_ret); + void *env, wasmtime_caller_t *caller, const wasmtime_val_t *args, + size_t nargs, wasmtime_val_t *results, size_t nresults, + wasm_trap_t **trap_ret, wasmtime_async_continuation_t *continuation_ret); /** * \brief The structure representing a asynchronously running function. * - * This structure is always owned by the caller and must be deleted using #wasmtime_call_future_delete. + * This structure is always owned by the caller and must be deleted using + * #wasmtime_call_future_delete. * - * Functions that return this type require that the parameters to the function are unmodified until - * this future is destroyed. + * Functions that return this type require that the parameters to the function + * are unmodified until this future is destroyed. */ typedef struct wasmtime_call_future wasmtime_call_future_t; /** * \brief Executes WebAssembly in the function. * - * Returns true if the function call has completed. After this function returns true, it should *not* be - * called again for a given future. + * Returns true if the function call has completed. After this function returns + * true, it should *not* be called again for a given future. * - * This function returns false if execution has yielded either due to being out of fuel - * (see wasmtime_context_fuel_async_yield_interval), or the epoch has been incremented enough - * (see wasmtime_context_epoch_deadline_async_yield_and_update). The function may also return false if - * asynchronous host functions have been called, which then calling this function will call the - * continuation from the async host function. + * This function returns false if execution has yielded either due to being out + * of fuel (see wasmtime_context_fuel_async_yield_interval), or the epoch has + * been incremented enough (see + * wasmtime_context_epoch_deadline_async_yield_and_update). The function may + * also return false if asynchronous host functions have been called, which then + * calling this function will call the continuation from the async host + * function. * * For more see the information at * https://docs.wasmtime.dev/api/wasmtime/struct.Config.html#asynchronous-wasm @@ -189,86 +197,83 @@ WASM_API_EXTERN bool wasmtime_call_future_poll(wasmtime_call_future_t *future); /** * /brief Frees the underlying memory for a future. * - * All wasmtime_call_future_t are owned by the caller and should be deleted using this function. + * All wasmtime_call_future_t are owned by the caller and should be deleted + * using this function. */ -WASM_API_EXTERN void wasmtime_call_future_delete(wasmtime_call_future_t *future); +WASM_API_EXTERN void +wasmtime_call_future_delete(wasmtime_call_future_t *future); /** - * \brief Invokes this function with the params given, returning the results asynchronously. + * \brief Invokes this function with the params given, returning the results + * asynchronously. * - * This function is the same as wasmtime_func_call except that it is asynchronous. - * This is only compatible with stores associated with an asynchronous config. + * This function is the same as wasmtime_func_call except that it is + * asynchronous. This is only compatible with stores associated with an + * asynchronous config. * - * The result is a future that is owned by the caller and must be deleted via #wasmtime_call_future_delete. + * The result is a future that is owned by the caller and must be deleted via + * #wasmtime_call_future_delete. * - * The `args` and `results` pointers may be `NULL` if the corresponding length is zero. - * The `trap_ret` and `error_ret` pointers may *not* be `NULL`. + * The `args` and `results` pointers may be `NULL` if the corresponding length + * is zero. The `trap_ret` and `error_ret` pointers may *not* be `NULL`. * - * Does not take ownership of #wasmtime_val_t arguments or #wasmtime_val_t results, - * and all parameters to this function must be kept alive and not modified until the - * returned #wasmtime_call_future_t is deleted. This includes the context and store - * parameters. Only a single future can be alive for a given store at a single time - * (meaning only call this function after the previous call's future was deleted). + * Does not take ownership of #wasmtime_val_t arguments or #wasmtime_val_t + * results, and all parameters to this function must be kept alive and not + * modified until the returned #wasmtime_call_future_t is deleted. This includes + * the context and store parameters. Only a single future can be alive for a + * given store at a single time (meaning only call this function after the + * previous call's future was deleted). * * See the header documentation for for more information. * * For more information see the Rust documentation at * https://docs.wasmtime.dev/api/wasmtime/struct.Func.html#method.call_async */ -WASM_API_EXTERN wasmtime_call_future_t* wasmtime_func_call_async( - wasmtime_context_t *context, - const wasmtime_func_t *func, - const wasmtime_val_t *args, - size_t nargs, - wasmtime_val_t *results, - size_t nresults, - wasm_trap_t** trap_ret, - wasmtime_error_t** error_ret); +WASM_API_EXTERN wasmtime_call_future_t *wasmtime_func_call_async( + wasmtime_context_t *context, const wasmtime_func_t *func, + const wasmtime_val_t *args, size_t nargs, wasmtime_val_t *results, + size_t nresults, wasm_trap_t **trap_ret, wasmtime_error_t **error_ret); /** * \brief Defines a new async function in this linker. * - * This function behaves similar to #wasmtime_linker_define_func, except it supports async - * callbacks. + * This function behaves similar to #wasmtime_linker_define_func, except it + * supports async callbacks. * * The callback `cb` will be invoked on another stack (fiber for Windows). */ WASM_API_EXTERN wasmtime_error_t *wasmtime_linker_define_async_func( - wasmtime_linker_t *linker, - const char *module, - size_t module_len, - const char *name, - size_t name_len, - const wasm_functype_t *ty, - wasmtime_func_async_callback_t cb, - void *data, - void (*finalizer)(void *)); + wasmtime_linker_t *linker, const char *module, size_t module_len, + const char *name, size_t name_len, const wasm_functype_t *ty, + wasmtime_func_async_callback_t cb, void *data, void (*finalizer)(void *)); /** - * \brief Instantiates a #wasm_module_t with the items defined in this linker for an async store. + * \brief Instantiates a #wasm_module_t with the items defined in this linker + * for an async store. * - * This is the same as #wasmtime_linker_instantiate but used for async stores - * (which requires functions are called asynchronously). The returning #wasmtime_call_future_t - * must be polled using #wasmtime_call_future_poll, and is owned and must be deleted using #wasmtime_call_future_delete. + * This is the same as #wasmtime_linker_instantiate but used for async stores + * (which requires functions are called asynchronously). The returning + * #wasmtime_call_future_t must be polled using #wasmtime_call_future_poll, and + * is owned and must be deleted using #wasmtime_call_future_delete. * - * The `trap_ret` and `error_ret` pointers may *not* be `NULL` and the returned memory is owned by the caller. + * The `trap_ret` and `error_ret` pointers may *not* be `NULL` and the returned + * memory is owned by the caller. * - * All arguments to this function must outlive the returned future and be unmodified until the future is deleted. + * All arguments to this function must outlive the returned future and be + * unmodified until the future is deleted. */ WASM_API_EXTERN wasmtime_call_future_t *wasmtime_linker_instantiate_async( - const wasmtime_linker_t *linker, - wasmtime_context_t *store, - const wasmtime_module_t *module, - wasmtime_instance_t *instance, - wasm_trap_t** trap_ret, - wasmtime_error_t** error_ret); + const wasmtime_linker_t *linker, wasmtime_context_t *store, + const wasmtime_module_t *module, wasmtime_instance_t *instance, + wasm_trap_t **trap_ret, wasmtime_error_t **error_ret); /** * \brief Instantiates instance within the given store. * * This will also run the function's startup function, if there is one. * - * For more information on async instantiation see #wasmtime_linker_instantiate_async. + * For more information on async instantiation see + * #wasmtime_linker_instantiate_async. * * \param instance_pre the pre-initialized instance * \param store the store in which to create the instance @@ -276,16 +281,16 @@ WASM_API_EXTERN wasmtime_call_future_t *wasmtime_linker_instantiate_async( * \param trap_ret where to store the returned trap * \param error_ret where to store the returned trap * - * The `trap_ret` and `error_ret` pointers may *not* be `NULL` and the returned memory is owned by the caller. + * The `trap_ret` and `error_ret` pointers may *not* be `NULL` and the returned + * memory is owned by the caller. * - * All arguments to this function must outlive the returned future and be unmodified until the future is deleted. + * All arguments to this function must outlive the returned future and be + * unmodified until the future is deleted. */ WASM_API_EXTERN wasmtime_call_future_t *wasmtime_instance_pre_instantiate_async( - const wasmtime_instance_pre_t* instance_pre, - wasmtime_context_t *store, - wasmtime_instance_t *instance, - wasm_trap_t** trap_ret, - wasmtime_error_t** error_ret); + const wasmtime_instance_pre_t *instance_pre, wasmtime_context_t *store, + wasmtime_instance_t *instance, wasm_trap_t **trap_ret, + wasmtime_error_t **error_ret); /** * A callback to get the top of the stack address and the length of the stack, @@ -294,9 +299,8 @@ WASM_API_EXTERN wasmtime_call_future_t *wasmtime_instance_pre_instantiate_async( * For more information about the parameters see the Rust documentation at * https://docs.wasmtime.dev/api/wasmtime/trait.StackMemory.html */ -typedef uint8_t *(*wasmtime_stack_memory_get_callback_t)( - void *env, - size_t *out_len); +typedef uint8_t *(*wasmtime_stack_memory_get_callback_t)(void *env, + size_t *out_len); /** * A Stack instance created from a #wasmtime_new_stack_memory_callback_t. @@ -310,14 +314,14 @@ typedef struct { /// Callback to get the memory and size of this LinearMemory wasmtime_stack_memory_get_callback_t get_stack_memory; /// An optional finalizer for env - void (*finalizer)(void*); + void (*finalizer)(void *); } wasmtime_stack_memory_t; /** * A callback to create a new StackMemory from the specified parameters. * - * The result should be written to `stack_ret` and wasmtime will own the values written - * into that struct. + * The result should be written to `stack_ret` and wasmtime will own the values + * written into that struct. * * This callback must be thread-safe. * @@ -325,9 +329,7 @@ typedef struct { * https://docs.wasmtime.dev/api/wasmtime/trait.StackCreator.html#tymethod.new_stack */ typedef wasmtime_error_t *(*wasmtime_new_stack_memory_callback_t)( - void *env, - size_t size, - wasmtime_stack_memory_t *stack_ret); + void *env, size_t size, wasmtime_stack_memory_t *stack_ret); /** * A representation of custom stack creator. @@ -337,33 +339,31 @@ typedef wasmtime_error_t *(*wasmtime_new_stack_memory_callback_t)( */ typedef struct { /// User provided value to be passed to new_stack - void* env; + void *env; /// The callback to create a new stack, must be thread safe wasmtime_new_stack_memory_callback_t new_stack; /// An optional finalizer for env. - void (*finalizer)(void*); + void (*finalizer)(void *); } wasmtime_stack_creator_t; /** * Sets a custom stack creator. * - * Custom memory creators are used when creating creating async instance stacks for - * the on-demand instance allocation strategy. + * Custom memory creators are used when creating creating async instance stacks + * for the on-demand instance allocation strategy. * - * The config does **not** take ownership of the #wasmtime_stack_creator_t passed in, but - * instead copies all the values in the struct. + * The config does **not** take ownership of the #wasmtime_stack_creator_t + * passed in, but instead copies all the values in the struct. * * For more information see the Rust documentation at * https://docs.wasmtime.dev/api/wasmtime/struct.Config.html#method.with_host_stack */ -WASM_API_EXTERN void wasmtime_config_host_stack_creator_set( - wasm_config_t*, - wasmtime_stack_creator_t*); - +WASM_API_EXTERN void +wasmtime_config_host_stack_creator_set(wasm_config_t *, + wasmtime_stack_creator_t *); #ifdef __cplusplus -} // extern "C" +} // extern "C" #endif #endif // WASMTIME_ASYNC_H - diff --git a/crates/c-api/include/wasmtime/config.h b/crates/c-api/include/wasmtime/config.h index b299d048ea8a..98e3cd048b60 100644 --- a/crates/c-api/include/wasmtime/config.h +++ b/crates/c-api/include/wasmtime/config.h @@ -86,8 +86,8 @@ enum wasmtime_profiling_strategy_enum { // ProfilingStrategy WASMTIME_PROFILING_STRATEGY_PERFMAP, }; -#define WASMTIME_CONFIG_PROP(ret, name, ty) \ - WASM_API_EXTERN ret wasmtime_config_##name##_set(wasm_config_t*, ty); +#define WASMTIME_CONFIG_PROP(ret, name, ty) \ + WASM_API_EXTERN ret wasmtime_config_##name##_set(wasm_config_t *, ty); /** * \brief Configures whether DWARF debug information is constructed at runtime @@ -149,6 +149,13 @@ WASMTIME_CONFIG_PROP(void, max_wasm_stack, size_t) */ WASMTIME_CONFIG_PROP(void, wasm_threads, bool) +/** + * \brief Configures whether the WebAssembly tail call proposal is enabled. + * + * This setting is `false` by default. + */ +WASMTIME_CONFIG_PROP(void, wasm_tail_call, bool) + /** * \brief Configures whether the WebAssembly reference types proposal is * enabled. @@ -221,7 +228,8 @@ WASMTIME_CONFIG_PROP(void, wasm_memory64, bool) WASMTIME_CONFIG_PROP(void, strategy, wasmtime_strategy_t) /** - * \brief Configure whether wasmtime should compile a module using multiple threads. + * \brief Configure whether wasmtime should compile a module using multiple + * threads. * * For more information see the Rust documentation at * https://docs.wasmtime.dev/api/wasmtime/struct.Config.html#method.parallel_compilation. @@ -239,13 +247,15 @@ WASMTIME_CONFIG_PROP(void, parallel_compilation, bool) WASMTIME_CONFIG_PROP(void, cranelift_debug_verifier, bool) /** - * \brief Configures whether Cranelift should perform a NaN-canonicalization pass. + * \brief Configures whether Cranelift should perform a NaN-canonicalization + * pass. * * When Cranelift is used as a code generation backend this will configure * it to replace NaNs with a single canonical value. This is useful for users * requiring entirely deterministic WebAssembly computation. * - * This is not required by the WebAssembly spec, so it is not enabled by default. + * This is not required by the WebAssembly spec, so it is not enabled by + * default. * * The default value for this is `false` */ @@ -300,7 +310,8 @@ WASMTIME_CONFIG_PROP(void, static_memory_guard_size, uint64_t) WASMTIME_CONFIG_PROP(void, dynamic_memory_guard_size, uint64_t) /** - * \brief Configures the size, in bytes, of the extra virtual memory space reserved after a “dynamic” memory for growing into. + * \brief Configures the size, in bytes, of the extra virtual memory space + * reserved after a “dynamic” memory for growing into. * * For more information see the Rust documentation at * https://docs.wasmtime.dev/api/wasmtime/struct.Config.html#method.dynamic_memory_reserved_for_growth @@ -308,7 +319,8 @@ WASMTIME_CONFIG_PROP(void, dynamic_memory_guard_size, uint64_t) WASMTIME_CONFIG_PROP(void, dynamic_memory_reserved_for_growth, uint64_t) /** - * \brief Configures whether to generate native unwind information (e.g. .eh_frame on Linux). + * \brief Configures whether to generate native unwind information (e.g. + * .eh_frame on Linux). * * This option defaults to true. * @@ -329,7 +341,8 @@ WASMTIME_CONFIG_PROP(void, native_unwind_info, bool) * An error is returned if the cache configuration could not be loaded or if the * cache could not be enabled. */ -WASM_API_EXTERN wasmtime_error_t* wasmtime_config_cache_config_load(wasm_config_t*, const char*); +WASM_API_EXTERN wasmtime_error_t * +wasmtime_config_cache_config_load(wasm_config_t *, const char *); /** * \brief Configures the target triple that this configuration will produce @@ -343,7 +356,7 @@ WASM_API_EXTERN wasmtime_error_t* wasmtime_config_cache_config_load(wasm_config_ * For more information see the Rust documentation at * https://docs.wasmtime.dev/api/wasmtime/struct.Config.html#method.config */ -WASMTIME_CONFIG_PROP(wasmtime_error_t*, target, const char*) +WASMTIME_CONFIG_PROP(wasmtime_error_t *, target, const char *) /** * \brief Enables a target-specific flag in Cranelift. @@ -354,7 +367,8 @@ WASMTIME_CONFIG_PROP(wasmtime_error_t*, target, const char*) * For more information see the Rust documentation at * https://docs.wasmtime.dev/api/wasmtime/struct.Config.html#method.cranelift_flag_enable */ -WASM_API_EXTERN void wasmtime_config_cranelift_flag_enable(wasm_config_t*, const char*); +WASM_API_EXTERN void wasmtime_config_cranelift_flag_enable(wasm_config_t *, + const char *); /** * \brief Sets a target-specific flag in Cranelift to the specified value. @@ -365,22 +379,32 @@ WASM_API_EXTERN void wasmtime_config_cranelift_flag_enable(wasm_config_t*, const * For more information see the Rust documentation at * https://docs.wasmtime.dev/api/wasmtime/struct.Config.html#method.cranelift_flag_set */ -WASM_API_EXTERN void wasmtime_config_cranelift_flag_set(wasm_config_t*, const char *key, const char *value); +WASM_API_EXTERN void wasmtime_config_cranelift_flag_set(wasm_config_t *, + const char *key, + const char *value); +/** + * \brief Configures whether, when on macOS, Mach ports are used for exception + * handling instead of traditional Unix-based signal handling. + * + * This option defaults to true, using Mach ports by default. + * + * For more information see the Rust documentation at + * https://docs.wasmtime.dev/api/wasmtime/struct.Config.html#method.macos_use_mach_ports + */ +WASMTIME_CONFIG_PROP(void, macos_use_mach_ports, bool) /** * Return the data from a LinearMemory instance. * - * The size in bytes as well as the maximum number of bytes that can be allocated should be - * returned as well. + * The size in bytes as well as the maximum number of bytes that can be + * allocated should be returned as well. * * For more information about see the Rust documentation at * https://docs.wasmtime.dev/api/wasmtime/trait.LinearMemory.html */ -typedef uint8_t *(*wasmtime_memory_get_callback_t)( - void *env, - size_t *byte_size, - size_t *maximum_byte_size); +typedef uint8_t *(*wasmtime_memory_get_callback_t)(void *env, size_t *byte_size, + size_t *maximum_byte_size); /** * Grow the memory to the `new_size` in bytes. @@ -388,9 +412,8 @@ typedef uint8_t *(*wasmtime_memory_get_callback_t)( * For more information about the parameters see the Rust documentation at * https://docs.wasmtime.dev/api/wasmtime/trait.LinearMemory.html#tymethod.grow_to */ -typedef wasmtime_error_t *(*wasmtime_memory_grow_callback_t)( - void *env, - size_t new_size); +typedef wasmtime_error_t *(*wasmtime_memory_grow_callback_t)(void *env, + size_t new_size); /** * A LinearMemory instance created from a #wasmtime_new_memory_callback_t. @@ -406,14 +429,14 @@ typedef struct wasmtime_linear_memory { /// Callback to request growing the memory wasmtime_memory_grow_callback_t grow_memory; /// An optional finalizer for env - void (*finalizer)(void*); + void (*finalizer)(void *); } wasmtime_linear_memory_t; /** * A callback to create a new LinearMemory from the specified parameters. * - * The result should be written to `memory_ret` and wasmtime will own the values written - * into that struct. + * The result should be written to `memory_ret` and wasmtime will own the values + * written into that struct. * * This callback must be thread-safe. * @@ -421,53 +444,54 @@ typedef struct wasmtime_linear_memory { * https://docs.wasmtime.dev/api/wasmtime/trait.MemoryCreator.html#tymethod.new_memory */ typedef wasmtime_error_t *(*wasmtime_new_memory_callback_t)( - void *env, - const wasm_memorytype_t *ty, - size_t minimum, - size_t maximum, - size_t reserved_size_in_bytes, - size_t guard_size_in_bytes, + void *env, const wasm_memorytype_t *ty, size_t minimum, size_t maximum, + size_t reserved_size_in_bytes, size_t guard_size_in_bytes, wasmtime_linear_memory_t *memory_ret); /** - * A representation of custom memory creator and methods for an instance of LinearMemory. + * A representation of custom memory creator and methods for an instance of + * LinearMemory. * * For more information see the Rust documentation at * https://docs.wasmtime.dev/api/wasmtime/trait.MemoryCreator.html */ typedef struct wasmtime_memory_creator { /// User provided value to be passed to new_memory - void* env; + void *env; /// The callback to create new memory, must be thread safe wasmtime_new_memory_callback_t new_memory; /// An optional finalizer for env. - void (*finalizer)(void*); + void (*finalizer)(void *); } wasmtime_memory_creator_t; /** * Sets a custom memory creator. * - * Custom memory creators are used when creating host Memory objects or when creating instance - * linear memories for the on-demand instance allocation strategy. + * Custom memory creators are used when creating host Memory objects or when + * creating instance linear memories for the on-demand instance allocation + * strategy. * - * The config does **not** take ownership of the #wasmtime_memory_creator_t passed in, but - * instead copies all the values in the struct. + * The config does **not** take ownership of the #wasmtime_memory_creator_t + * passed in, but instead copies all the values in the struct. * * For more information see the Rust documentation at * https://docs.wasmtime.dev/api/wasmtime/struct.Config.html#method.with_host_memory */ -WASM_API_EXTERN void wasmtime_config_host_memory_creator_set( - wasm_config_t*, - wasmtime_memory_creator_t*); +WASM_API_EXTERN void +wasmtime_config_host_memory_creator_set(wasm_config_t *, + wasmtime_memory_creator_t *); /** - * \brief Configures whether copy-on-write memory-mapped data is used to initialize a linear memory. + * \brief Configures whether copy-on-write memory-mapped data is used to + * initialize a linear memory. * - * Initializing linear memory via a copy-on-write mapping can drastically improve instantiation costs - * of a WebAssembly module because copying memory is deferred. Additionally if a page of memory is - * only ever read from WebAssembly and never written too then the same underlying page of data will - * be reused between all instantiations of a module meaning that if a module is instantiated many - * times this can lower the overall memory required needed to run that module. + * Initializing linear memory via a copy-on-write mapping can drastically + * improve instantiation costs of a WebAssembly module because copying memory is + * deferred. Additionally if a page of memory is only ever read from WebAssembly + * and never written too then the same underlying page of data will be reused + * between all instantiations of a module meaning that if a module is + * instantiated many times this can lower the overall memory required needed to + * run that module. * * This option defaults to true. * @@ -477,8 +501,7 @@ WASM_API_EXTERN void wasmtime_config_host_memory_creator_set( WASMTIME_CONFIG_PROP(void, memory_init_cow, bool) #ifdef __cplusplus -} // extern "C" +} // extern "C" #endif #endif // WASMTIME_CONFIG_H - diff --git a/crates/c-api/include/wasmtime/engine.h b/crates/c-api/include/wasmtime/engine.h index 1b8336f4605e..d68cf4e8fea8 100644 --- a/crates/c-api/include/wasmtime/engine.h +++ b/crates/c-api/include/wasmtime/engine.h @@ -28,9 +28,7 @@ extern "C" { WASM_API_EXTERN void wasmtime_engine_increment_epoch(wasm_engine_t *engine); #ifdef __cplusplus -} // extern "C" +} // extern "C" #endif #endif // WASMTIME_ENGINE_H - - diff --git a/crates/c-api/include/wasmtime/error.h b/crates/c-api/include/wasmtime/error.h index 517755206759..ad9172543629 100644 --- a/crates/c-api/include/wasmtime/error.h +++ b/crates/c-api/include/wasmtime/error.h @@ -33,7 +33,7 @@ typedef struct wasmtime_error wasmtime_error_t; /** * \brief Creates a new error with the provided message. */ -WASM_API_EXTERN wasmtime_error_t *wasmtime_error_new(const char*); +WASM_API_EXTERN wasmtime_error_t *wasmtime_error_new(const char *); /** * \brief Deletes an error. @@ -48,10 +48,8 @@ WASM_API_EXTERN void wasmtime_error_delete(wasmtime_error_t *error); * uninitialized before this function is called and the caller is responsible * for deallocating it with #wasm_byte_vec_delete afterwards. */ -WASM_API_EXTERN void wasmtime_error_message( - const wasmtime_error_t *error, - wasm_name_t *message -); +WASM_API_EXTERN void wasmtime_error_message(const wasmtime_error_t *error, + wasm_name_t *message); /** * \brief Attempts to extract a WASI-specific exit status from this error. @@ -60,7 +58,8 @@ WASM_API_EXTERN void wasmtime_error_message( * If `true` is returned then the exit status is returned through the `status` * pointer. If `false` is returned then this is not a wasi exit trap. */ -WASM_API_EXTERN bool wasmtime_error_exit_status(const wasmtime_error_t*, int *status); +WASM_API_EXTERN bool wasmtime_error_exit_status(const wasmtime_error_t *, + int *status); /** * \brief Attempts to extract a WebAssembly trace from this error. @@ -69,10 +68,11 @@ WASM_API_EXTERN bool wasmtime_error_exit_status(const wasmtime_error_t*, int *st * as input. The `out` argument will be filled in with the wasm trace, if * present. */ -WASM_API_EXTERN void wasmtime_error_wasm_trace(const wasmtime_error_t*, wasm_frame_vec_t *out); +WASM_API_EXTERN void wasmtime_error_wasm_trace(const wasmtime_error_t *, + wasm_frame_vec_t *out); #ifdef __cplusplus -} // extern "C" +} // extern "C" #endif #endif // WASMTIME_ERROR_H diff --git a/crates/c-api/include/wasmtime/extern.h b/crates/c-api/include/wasmtime/extern.h index 29dcb217feb6..427c5ba7f969 100644 --- a/crates/c-api/include/wasmtime/extern.h +++ b/crates/c-api/include/wasmtime/extern.h @@ -97,14 +97,14 @@ typedef uint8_t wasmtime_extern_kind_t; * various kinds of items an extern wasm item can be. */ typedef union wasmtime_extern_union { - /// Field used if #wasmtime_extern_t::kind is #WASMTIME_EXTERN_FUNC - wasmtime_func_t func; - /// Field used if #wasmtime_extern_t::kind is #WASMTIME_EXTERN_GLOBAL - wasmtime_global_t global; - /// Field used if #wasmtime_extern_t::kind is #WASMTIME_EXTERN_TABLE - wasmtime_table_t table; - /// Field used if #wasmtime_extern_t::kind is #WASMTIME_EXTERN_MEMORY - wasmtime_memory_t memory; + /// Field used if #wasmtime_extern_t::kind is #WASMTIME_EXTERN_FUNC + wasmtime_func_t func; + /// Field used if #wasmtime_extern_t::kind is #WASMTIME_EXTERN_GLOBAL + wasmtime_global_t global; + /// Field used if #wasmtime_extern_t::kind is #WASMTIME_EXTERN_TABLE + wasmtime_table_t table; + /// Field used if #wasmtime_extern_t::kind is #WASMTIME_EXTERN_MEMORY + wasmtime_memory_t memory; } wasmtime_extern_union_t; /** @@ -121,10 +121,10 @@ typedef union wasmtime_extern_union { * deallocate the value. */ typedef struct wasmtime_extern { - /// Discriminant of which field of #of is valid. - wasmtime_extern_kind_t kind; - /// Container for the extern item's value. - wasmtime_extern_union_t of; + /// Discriminant of which field of #of is valid. + wasmtime_extern_kind_t kind; + /// Container for the extern item's value. + wasmtime_extern_union_t of; } wasmtime_extern_t; /// \brief Deletes a #wasmtime_extern_t. @@ -135,11 +135,11 @@ void wasmtime_extern_delete(wasmtime_extern_t *val); /// /// Does not take ownership of `context` or `val`, but the returned /// #wasm_externtype_t is an owned value that needs to be deleted. -wasm_externtype_t *wasmtime_extern_type(wasmtime_context_t *context, wasmtime_extern_t *val); +wasm_externtype_t *wasmtime_extern_type(wasmtime_context_t *context, + wasmtime_extern_t *val); #ifdef __cplusplus -} // extern "C" +} // extern "C" #endif #endif // WASMTIME_EXTERN_H - diff --git a/crates/c-api/include/wasmtime/func.h b/crates/c-api/include/wasmtime/func.h index c5b927fd7923..41ff907c37cc 100644 --- a/crates/c-api/include/wasmtime/func.h +++ b/crates/c-api/include/wasmtime/func.h @@ -8,9 +8,9 @@ #define WASMTIME_FUNC_H #include -#include -#include #include +#include +#include #ifdef __cplusplus extern "C" { @@ -54,13 +54,9 @@ typedef struct wasmtime_caller wasmtime_caller_t; * should be raised in WebAssembly. It's expected that in this case the caller * relinquishes ownership of the trap and it is passed back to the engine. */ -typedef wasm_trap_t* (*wasmtime_func_callback_t)( - void *env, - wasmtime_caller_t* caller, - const wasmtime_val_t *args, - size_t nargs, - wasmtime_val_t *results, - size_t nresults); +typedef wasm_trap_t *(*wasmtime_func_callback_t)( + void *env, wasmtime_caller_t *caller, const wasmtime_val_t *args, + size_t nargs, wasmtime_val_t *results, size_t nresults); /** * \brief Creates a new host-defined function. @@ -78,14 +74,11 @@ typedef wasm_trap_t* (*wasmtime_func_callback_t)( * * The returned function can only be used with the specified `store`. */ -WASM_API_EXTERN void wasmtime_func_new( - wasmtime_context_t *store, - const wasm_functype_t* type, - wasmtime_func_callback_t callback, - void *env, - void (*finalizer)(void*), - wasmtime_func_t *ret -); +WASM_API_EXTERN void wasmtime_func_new(wasmtime_context_t *store, + const wasm_functype_t *type, + wasmtime_func_callback_t callback, + void *env, void (*finalizer)(void *), + wasmtime_func_t *ret); /** * \brief Callback signature for #wasmtime_func_new_unchecked. @@ -120,10 +113,8 @@ WASM_API_EXTERN void wasmtime_func_new( * array. Results are also written starting at index 0, which will overwrite * the arguments. */ -typedef wasm_trap_t* (*wasmtime_func_unchecked_callback_t)( - void *env, - wasmtime_caller_t* caller, - wasmtime_val_raw_t *args_and_results, +typedef wasm_trap_t *(*wasmtime_func_unchecked_callback_t)( + void *env, wasmtime_caller_t *caller, wasmtime_val_raw_t *args_and_results, size_t num_args_and_results); /** @@ -151,23 +142,18 @@ typedef wasm_trap_t* (*wasmtime_func_unchecked_callback_t)( * existence). */ WASM_API_EXTERN void wasmtime_func_new_unchecked( - wasmtime_context_t *store, - const wasm_functype_t* type, - wasmtime_func_unchecked_callback_t callback, - void *env, - void (*finalizer)(void*), - wasmtime_func_t *ret -); + wasmtime_context_t *store, const wasm_functype_t *type, + wasmtime_func_unchecked_callback_t callback, void *env, + void (*finalizer)(void *), wasmtime_func_t *ret); /** * \brief Returns the type of the function specified * * The returned #wasm_functype_t is owned by the caller. */ -WASM_API_EXTERN wasm_functype_t* wasmtime_func_type( - const wasmtime_context_t *store, - const wasmtime_func_t *func -); +WASM_API_EXTERN wasm_functype_t * +wasmtime_func_type(const wasmtime_context_t *store, + const wasmtime_func_t *func); /** * \brief Call a WebAssembly function. @@ -204,15 +190,11 @@ WASM_API_EXTERN wasm_functype_t* wasmtime_func_type( * Does not take ownership of #wasmtime_val_t arguments. Gives ownership of * #wasmtime_val_t results. */ -WASM_API_EXTERN wasmtime_error_t *wasmtime_func_call( - wasmtime_context_t *store, - const wasmtime_func_t *func, - const wasmtime_val_t *args, - size_t nargs, - wasmtime_val_t *results, - size_t nresults, - wasm_trap_t **trap -); +WASM_API_EXTERN wasmtime_error_t * +wasmtime_func_call(wasmtime_context_t *store, const wasmtime_func_t *func, + const wasmtime_val_t *args, size_t nargs, + wasmtime_val_t *results, size_t nresults, + wasm_trap_t **trap); /** * \brief Call a WebAssembly function in an "unchecked" fashion. @@ -243,13 +225,11 @@ WASM_API_EXTERN wasmtime_error_t *wasmtime_func_call( * faster than that function, but the tradeoff is that embeddings must uphold * more invariants rather than relying on Wasmtime to check them for you. */ -WASM_API_EXTERN wasmtime_error_t *wasmtime_func_call_unchecked( - wasmtime_context_t *store, - const wasmtime_func_t *func, - wasmtime_val_raw_t *args_and_results, - size_t args_and_results_len, - wasm_trap_t **trap -); +WASM_API_EXTERN wasmtime_error_t * +wasmtime_func_call_unchecked(wasmtime_context_t *store, + const wasmtime_func_t *func, + wasmtime_val_raw_t *args_and_results, + size_t args_and_results_len, wasm_trap_t **trap); /** * \brief Loads a #wasmtime_extern_t from the caller's context @@ -269,17 +249,16 @@ WASM_API_EXTERN wasmtime_error_t *wasmtime_func_call_unchecked( * Returns a nonzero value if the export was found, or 0 if the export wasn't * found. If the export wasn't found then `item` isn't written to. */ -WASM_API_EXTERN bool wasmtime_caller_export_get( - wasmtime_caller_t *caller, - const char *name, - size_t name_len, - wasmtime_extern_t *item -); +WASM_API_EXTERN bool wasmtime_caller_export_get(wasmtime_caller_t *caller, + const char *name, + size_t name_len, + wasmtime_extern_t *item); /** * \brief Returns the store context of the caller object. */ -WASM_API_EXTERN wasmtime_context_t* wasmtime_caller_context(wasmtime_caller_t* caller); +WASM_API_EXTERN wasmtime_context_t * +wasmtime_caller_context(wasmtime_caller_t *caller); /** * \brief Converts a `raw` nonzero `funcref` value from #wasmtime_val_raw_t @@ -294,21 +273,18 @@ WASM_API_EXTERN wasmtime_context_t* wasmtime_caller_context(wasmtime_caller_t* c * #wasmtime_context_t that they were produced from. Providing arbitrary values * to `raw` here or cross-context values with `context` is UB. */ -WASM_API_EXTERN void wasmtime_func_from_raw( - wasmtime_context_t* context, - void *raw, - wasmtime_func_t *ret); +WASM_API_EXTERN void wasmtime_func_from_raw(wasmtime_context_t *context, + void *raw, wasmtime_func_t *ret); /** * \brief Converts a `func` which belongs to `context` into a `usize` * parameter that is suitable for insertion into a #wasmtime_val_raw_t. */ -WASM_API_EXTERN void *wasmtime_func_to_raw( - wasmtime_context_t* context, - const wasmtime_func_t *func); +WASM_API_EXTERN void *wasmtime_func_to_raw(wasmtime_context_t *context, + const wasmtime_func_t *func); #ifdef __cplusplus -} // extern "C" +} // extern "C" #endif #endif // WASMTIME_FUNC_H diff --git a/crates/c-api/include/wasmtime/global.h b/crates/c-api/include/wasmtime/global.h index 4e244285a57c..5d69c19f5382 100644 --- a/crates/c-api/include/wasmtime/global.h +++ b/crates/c-api/include/wasmtime/global.h @@ -33,22 +33,18 @@ extern "C" { * This function does not take ownership of any of its arguments but error is * owned by the caller. */ -WASM_API_EXTERN wasmtime_error_t *wasmtime_global_new( - wasmtime_context_t *store, - const wasm_globaltype_t *type, - const wasmtime_val_t *val, - wasmtime_global_t *ret -); +WASM_API_EXTERN wasmtime_error_t * +wasmtime_global_new(wasmtime_context_t *store, const wasm_globaltype_t *type, + const wasmtime_val_t *val, wasmtime_global_t *ret); /** * \brief Returns the wasm type of the specified global. * * The returned #wasm_globaltype_t is owned by the caller. */ -WASM_API_EXTERN wasm_globaltype_t* wasmtime_global_type( - const wasmtime_context_t *store, - const wasmtime_global_t *global -); +WASM_API_EXTERN wasm_globaltype_t * +wasmtime_global_type(const wasmtime_context_t *store, + const wasmtime_global_t *global); /** * \brief Get the value of the specified global. @@ -60,11 +56,9 @@ WASM_API_EXTERN wasm_globaltype_t* wasmtime_global_type( * This function returns ownership of the contents of `out`, so * #wasmtime_val_delete may need to be called on the value. */ -WASM_API_EXTERN void wasmtime_global_get( - wasmtime_context_t *store, - const wasmtime_global_t *global, - wasmtime_val_t *out -); +WASM_API_EXTERN void wasmtime_global_get(wasmtime_context_t *store, + const wasmtime_global_t *global, + wasmtime_val_t *out); /** * \brief Sets a global to a new value. @@ -76,16 +70,15 @@ WASM_API_EXTERN void wasmtime_global_get( * This function may return an error if `global` is not mutable or if `val` has * the wrong type for `global`. * - * THis does not take ownership of any argument but returns ownership of the error. + * THis does not take ownership of any argument but returns ownership of the + * error. */ -WASM_API_EXTERN wasmtime_error_t *wasmtime_global_set( - wasmtime_context_t *store, - const wasmtime_global_t *global, - const wasmtime_val_t *val -); +WASM_API_EXTERN wasmtime_error_t * +wasmtime_global_set(wasmtime_context_t *store, const wasmtime_global_t *global, + const wasmtime_val_t *val); #ifdef __cplusplus -} // extern "C" +} // extern "C" #endif #endif // WASMTIME_GLOBAL_H diff --git a/crates/c-api/include/wasmtime/instance.h b/crates/c-api/include/wasmtime/instance.h index 72f398ec9cff..0d63cfb7a421 100644 --- a/crates/c-api/include/wasmtime/instance.h +++ b/crates/c-api/include/wasmtime/instance.h @@ -62,14 +62,11 @@ typedef struct wasmtime_instance { * This function does not take ownership of any of its arguments, but all return * values are owned by the caller. */ -WASM_API_EXTERN wasmtime_error_t *wasmtime_instance_new( - wasmtime_context_t *store, - const wasmtime_module_t *module, - const wasmtime_extern_t* imports, - size_t nimports, - wasmtime_instance_t *instance, - wasm_trap_t **trap -); +WASM_API_EXTERN wasmtime_error_t * +wasmtime_instance_new(wasmtime_context_t *store, + const wasmtime_module_t *module, + const wasmtime_extern_t *imports, size_t nimports, + wasmtime_instance_t *instance, wasm_trap_t **trap); /** * \brief Get an export by name from an instance. @@ -87,12 +84,8 @@ WASM_API_EXTERN wasmtime_error_t *wasmtime_instance_new( * #wasmtime_extern_t. */ WASM_API_EXTERN bool wasmtime_instance_export_get( - wasmtime_context_t *store, - const wasmtime_instance_t *instance, - const char *name, - size_t name_len, - wasmtime_extern_t *item -); + wasmtime_context_t *store, const wasmtime_instance_t *instance, + const char *name, size_t name_len, wasmtime_extern_t *item); /** * \brief Get an export by index from an instance. @@ -113,16 +106,12 @@ WASM_API_EXTERN bool wasmtime_instance_export_get( * #wasmtime_context_t. */ WASM_API_EXTERN bool wasmtime_instance_export_nth( - wasmtime_context_t *store, - const wasmtime_instance_t *instance, - size_t index, - char **name, - size_t *name_len, - wasmtime_extern_t *item -); + wasmtime_context_t *store, const wasmtime_instance_t *instance, + size_t index, char **name, size_t *name_len, wasmtime_extern_t *item); /** - * \brief A #wasmtime_instance_t, pre-instantiation, that is ready to be instantiated. + * \brief A #wasmtime_instance_t, pre-instantiation, that is ready to be + * instantiated. * * Must be deleted using #wasmtime_instance_pre_delete. * @@ -135,7 +124,7 @@ typedef struct wasmtime_instance_pre wasmtime_instance_pre_t; * \brief Delete a previously created wasmtime_instance_pre_t. */ WASM_API_EXTERN void -wasmtime_instance_pre_delete(wasmtime_instance_pre_t *instance); +wasmtime_instance_pre_delete(wasmtime_instance_pre_t *instance_pre); /** * \brief Instantiates instance within the given store. @@ -160,14 +149,21 @@ wasmtime_instance_pre_delete(wasmtime_instance_pre_t *instance); * This function does not take ownership of any of its arguments, and all return * values are owned by the caller. */ -WASM_API_EXTERN wasmtime_error_t* wasmtime_instance_pre_instantiate( - const wasmtime_instance_pre_t* instance_pre, - wasmtime_store_t *store, - wasmtime_instance_t* instance, - wasm_trap_t **trap_ptr); +WASM_API_EXTERN wasmtime_error_t *wasmtime_instance_pre_instantiate( + const wasmtime_instance_pre_t *instance_pre, wasmtime_store_t *store, + wasmtime_instance_t *instance, wasm_trap_t **trap_ptr); + +/** + * \brief Get the module (as a shallow clone) for a instance_pre. + * + * The returned module is owned by the caller and the caller **must** + * delete it via `wasmtime_module_delete`. + */ +WASM_API_EXTERN wasmtime_module_t * +wasmtime_instance_pre_module(wasmtime_instance_pre_t *instance_pre); #ifdef __cplusplus -} // extern "C" +} // extern "C" #endif #endif // WASMTIME_INSTANCE_H diff --git a/crates/c-api/include/wasmtime/linker.h b/crates/c-api/include/wasmtime/linker.h index 750c18d8558a..c70423495603 100644 --- a/crates/c-api/include/wasmtime/linker.h +++ b/crates/c-api/include/wasmtime/linker.h @@ -9,8 +9,8 @@ #include #include -#include #include +#include #ifdef __cplusplus extern "C" { @@ -40,12 +40,12 @@ typedef struct wasmtime_linker wasmtime_linker_t; * This function does not take ownership of the engine argument, and the caller * is expected to delete the returned linker. */ -WASM_API_EXTERN wasmtime_linker_t* wasmtime_linker_new(wasm_engine_t* engine); +WASM_API_EXTERN wasmtime_linker_t *wasmtime_linker_new(wasm_engine_t *engine); /** * \brief Deletes a linker */ -WASM_API_EXTERN void wasmtime_linker_delete(wasmtime_linker_t* linker); +WASM_API_EXTERN void wasmtime_linker_delete(wasmtime_linker_t *linker); /** * \brief Configures whether this linker allows later definitions to shadow @@ -53,7 +53,8 @@ WASM_API_EXTERN void wasmtime_linker_delete(wasmtime_linker_t* linker); * * By default this setting is `false`. */ -WASM_API_EXTERN void wasmtime_linker_allow_shadowing(wasmtime_linker_t* linker, bool allow_shadowing); +WASM_API_EXTERN void wasmtime_linker_allow_shadowing(wasmtime_linker_t *linker, + bool allow_shadowing); /** * \brief Defines a new item in this linker. @@ -72,15 +73,10 @@ WASM_API_EXTERN void wasmtime_linker_allow_shadowing(wasmtime_linker_t* linker, * For more information about name resolution consult the [Rust * documentation](https://bytecodealliance.github.io/wasmtime/api/wasmtime/struct.Linker.html#name-resolution). */ -WASM_API_EXTERN wasmtime_error_t* wasmtime_linker_define( - wasmtime_linker_t *linker, - wasmtime_context_t *store, - const char *module, - size_t module_len, - const char *name, - size_t name_len, - const wasmtime_extern_t *item -); +WASM_API_EXTERN wasmtime_error_t * +wasmtime_linker_define(wasmtime_linker_t *linker, wasmtime_context_t *store, + const char *module, size_t module_len, const char *name, + size_t name_len, const wasmtime_extern_t *item); /** * \brief Defines a new function in this linker. @@ -92,7 +88,8 @@ WASM_API_EXTERN wasmtime_error_t* wasmtime_linker_define( * \param name_len the byte length of `name` * \param ty the type of the function that's being defined * \param cb the host callback to invoke when the function is called - * \param data the host-provided data to provide as the first argument to the callback + * \param data the host-provided data to provide as the first argument to the + * callback * \param finalizer an optional finalizer for the `data` argument. * * \return On success `NULL` is returned, otherwise an error is returned which @@ -107,17 +104,10 @@ WASM_API_EXTERN wasmtime_error_t* wasmtime_linker_define( * * For more information about host callbacks see #wasmtime_func_new. */ -WASM_API_EXTERN wasmtime_error_t* wasmtime_linker_define_func( - wasmtime_linker_t *linker, - const char *module, - size_t module_len, - const char *name, - size_t name_len, - const wasm_functype_t *ty, - wasmtime_func_callback_t cb, - void *data, - void (*finalizer)(void*) -); +WASM_API_EXTERN wasmtime_error_t *wasmtime_linker_define_func( + wasmtime_linker_t *linker, const char *module, size_t module_len, + const char *name, size_t name_len, const wasm_functype_t *ty, + wasmtime_func_callback_t cb, void *data, void (*finalizer)(void *)); /** * \brief Defines a new function in this linker. @@ -128,17 +118,11 @@ WASM_API_EXTERN wasmtime_error_t* wasmtime_linker_define_func( * information as well as #wasmtime_func_new_unchecked for why this is an * unsafe API. */ -WASM_API_EXTERN wasmtime_error_t* wasmtime_linker_define_func_unchecked( - wasmtime_linker_t *linker, - const char *module, - size_t module_len, - const char *name, - size_t name_len, - const wasm_functype_t *ty, - wasmtime_func_unchecked_callback_t cb, - void *data, - void (*finalizer)(void*) -); +WASM_API_EXTERN wasmtime_error_t *wasmtime_linker_define_func_unchecked( + wasmtime_linker_t *linker, const char *module, size_t module_len, + const char *name, size_t name_len, const wasm_functype_t *ty, + wasmtime_func_unchecked_callback_t cb, void *data, + void (*finalizer)(void *)); /** * \brief Defines WASI functions in this linker. @@ -157,9 +141,8 @@ WASM_API_EXTERN wasmtime_error_t* wasmtime_linker_define_func_unchecked( * For more information about name resolution consult the [Rust * documentation](https://bytecodealliance.github.io/wasmtime/api/wasmtime/struct.Linker.html#name-resolution). */ -WASM_API_EXTERN wasmtime_error_t* wasmtime_linker_define_wasi( - wasmtime_linker_t *linker -); +WASM_API_EXTERN wasmtime_error_t * +wasmtime_linker_define_wasi(wasmtime_linker_t *linker); /** * \brief Defines an instance under the specified name in this linker. @@ -180,13 +163,9 @@ WASM_API_EXTERN wasmtime_error_t* wasmtime_linker_define_wasi( * For more information about name resolution consult the [Rust * documentation](https://bytecodealliance.github.io/wasmtime/api/wasmtime/struct.Linker.html#name-resolution). */ -WASM_API_EXTERN wasmtime_error_t* wasmtime_linker_define_instance( - wasmtime_linker_t *linker, - wasmtime_context_t *store, - const char *name, - size_t name_len, - const wasmtime_instance_t *instance -); +WASM_API_EXTERN wasmtime_error_t *wasmtime_linker_define_instance( + wasmtime_linker_t *linker, wasmtime_context_t *store, const char *name, + size_t name_len, const wasmtime_instance_t *instance); /** * \brief Instantiates a #wasm_module_t with the items defined in this linker. @@ -210,13 +189,11 @@ WASM_API_EXTERN wasmtime_error_t* wasmtime_linker_define_instance( * defined in the linker than an error is returned. (or if the previously * defined item is of the wrong type). */ -WASM_API_EXTERN wasmtime_error_t* wasmtime_linker_instantiate( - const wasmtime_linker_t *linker, - wasmtime_context_t *store, - const wasmtime_module_t *module, - wasmtime_instance_t *instance, - wasm_trap_t **trap -); +WASM_API_EXTERN wasmtime_error_t * +wasmtime_linker_instantiate(const wasmtime_linker_t *linker, + wasmtime_context_t *store, + const wasmtime_module_t *module, + wasmtime_instance_t *instance, wasm_trap_t **trap); /** * \brief Defines automatic instantiations of a #wasm_module_t in this linker. @@ -237,13 +214,10 @@ WASM_API_EXTERN wasmtime_error_t* wasmtime_linker_instantiate( * For more information see the [Rust * documentation](https://bytecodealliance.github.io/wasmtime/api/wasmtime/struct.Linker.html#method.module). */ -WASM_API_EXTERN wasmtime_error_t* wasmtime_linker_module( - wasmtime_linker_t *linker, - wasmtime_context_t *store, - const char *name, - size_t name_len, - const wasmtime_module_t *module -); +WASM_API_EXTERN wasmtime_error_t * +wasmtime_linker_module(wasmtime_linker_t *linker, wasmtime_context_t *store, + const char *name, size_t name_len, + const wasmtime_module_t *module); /** * \brief Acquires the "default export" of the named module in this linker. @@ -260,13 +234,10 @@ WASM_API_EXTERN wasmtime_error_t* wasmtime_linker_module( * For more information see the [Rust * documentation](https://bytecodealliance.github.io/wasmtime/api/wasmtime/struct.Linker.html#method.get_default). */ -WASM_API_EXTERN wasmtime_error_t* wasmtime_linker_get_default( - const wasmtime_linker_t *linker, - wasmtime_context_t *store, - const char *name, - size_t name_len, - wasmtime_func_t *func -); +WASM_API_EXTERN wasmtime_error_t * +wasmtime_linker_get_default(const wasmtime_linker_t *linker, + wasmtime_context_t *store, const char *name, + size_t name_len, wasmtime_func_t *func); /** * \brief Loads an item by name from this linker. @@ -282,15 +253,11 @@ WASM_API_EXTERN wasmtime_error_t* wasmtime_linker_get_default( * \return A nonzero value if the item is defined, in which case `item` is also * filled in. Otherwise zero is returned. */ -WASM_API_EXTERN bool wasmtime_linker_get( - const wasmtime_linker_t *linker, - wasmtime_context_t *store, - const char *module, - size_t module_len, - const char *name, - size_t name_len, - wasmtime_extern_t *item -); +WASM_API_EXTERN bool wasmtime_linker_get(const wasmtime_linker_t *linker, + wasmtime_context_t *store, + const char *module, size_t module_len, + const char *name, size_t name_len, + wasmtime_extern_t *item); /** * \brief Preform all the checks for instantiating `module` with the linker, @@ -305,13 +272,13 @@ WASM_API_EXTERN bool wasmtime_linker_get( * For more information see the Rust documentation at: * https://docs.wasmtime.dev/api/wasmtime/struct.Linker.html#method.instantiate_pre */ -WASM_API_EXTERN wasmtime_error_t* wasmtime_linker_instantiate_pre( - const wasmtime_linker_t *linker, - const wasmtime_module_t *module, - wasmtime_instance_pre_t **instance_pre); +WASM_API_EXTERN wasmtime_error_t * +wasmtime_linker_instantiate_pre(const wasmtime_linker_t *linker, + const wasmtime_module_t *module, + wasmtime_instance_pre_t **instance_pre); #ifdef __cplusplus -} // extern "C" +} // extern "C" #endif #endif // WASMTIME_LINKER_H diff --git a/crates/c-api/include/wasmtime/memory.h b/crates/c-api/include/wasmtime/memory.h index cda42c2b855a..a22b93c97a68 100644 --- a/crates/c-api/include/wasmtime/memory.h +++ b/crates/c-api/include/wasmtime/memory.h @@ -8,9 +8,9 @@ #define WASMTIME_MEMORY_H #include +#include #include #include -#include #ifdef __cplusplus extern "C" { @@ -22,7 +22,10 @@ extern "C" { * Note that this function is preferred over #wasm_memorytype_new for * compatibility with the memory64 proposal. */ -WASM_API_EXTERN wasm_memorytype_t *wasmtime_memorytype_new(uint64_t min, bool max_present, uint64_t max, bool is_64); +WASM_API_EXTERN wasm_memorytype_t *wasmtime_memorytype_new(uint64_t min, + bool max_present, + uint64_t max, + bool is_64); /** * \brief Returns the minimum size, in pages, of the specified memory type. @@ -30,7 +33,8 @@ WASM_API_EXTERN wasm_memorytype_t *wasmtime_memorytype_new(uint64_t min, bool ma * Note that this function is preferred over #wasm_memorytype_limits for * compatibility with the memory64 proposal. */ -WASM_API_EXTERN uint64_t wasmtime_memorytype_minimum(const wasm_memorytype_t *ty); +WASM_API_EXTERN uint64_t +wasmtime_memorytype_minimum(const wasm_memorytype_t *ty); /** * \brief Returns the maximum size, in pages, of the specified memory type. @@ -42,7 +46,8 @@ WASM_API_EXTERN uint64_t wasmtime_memorytype_minimum(const wasm_memorytype_t *ty * Note that this function is preferred over #wasm_memorytype_limits for * compatibility with the memory64 proposal. */ -WASM_API_EXTERN bool wasmtime_memorytype_maximum(const wasm_memorytype_t *ty, uint64_t *max); +WASM_API_EXTERN bool wasmtime_memorytype_maximum(const wasm_memorytype_t *ty, + uint64_t *max); /** * \brief Returns whether this type of memory represents a 64-bit memory. @@ -59,43 +64,34 @@ WASM_API_EXTERN bool wasmtime_memorytype_is64(const wasm_memorytype_t *ty); * If an error happens when creating the memory it's returned and owned by the * caller. If an error happens then `ret` is not filled in. */ -WASM_API_EXTERN wasmtime_error_t *wasmtime_memory_new( - wasmtime_context_t *store, - const wasm_memorytype_t* ty, - wasmtime_memory_t *ret -); +WASM_API_EXTERN wasmtime_error_t * +wasmtime_memory_new(wasmtime_context_t *store, const wasm_memorytype_t *ty, + wasmtime_memory_t *ret); /** * \brief Returns the type of the memory specified */ -WASM_API_EXTERN wasm_memorytype_t* wasmtime_memory_type( - const wasmtime_context_t *store, - const wasmtime_memory_t *memory -); +WASM_API_EXTERN wasm_memorytype_t * +wasmtime_memory_type(const wasmtime_context_t *store, + const wasmtime_memory_t *memory); /** * \brief Returns the base pointer in memory where the linear memory starts. */ -WASM_API_EXTERN uint8_t *wasmtime_memory_data( - const wasmtime_context_t *store, - const wasmtime_memory_t *memory -); +WASM_API_EXTERN uint8_t *wasmtime_memory_data(const wasmtime_context_t *store, + const wasmtime_memory_t *memory); /** * \brief Returns the byte length of this linear memory. */ WASM_API_EXTERN size_t wasmtime_memory_data_size( - const wasmtime_context_t *store, - const wasmtime_memory_t *memory -); + const wasmtime_context_t *store, const wasmtime_memory_t *memory); /** * \brief Returns the length, in WebAssembly pages, of this linear memory */ -WASM_API_EXTERN uint64_t wasmtime_memory_size( - const wasmtime_context_t *store, - const wasmtime_memory_t *memory -); +WASM_API_EXTERN uint64_t wasmtime_memory_size(const wasmtime_context_t *store, + const wasmtime_memory_t *memory); /** * \brief Attempts to grow the specified memory by `delta` pages. @@ -109,15 +105,12 @@ WASM_API_EXTERN uint64_t wasmtime_memory_size( * returned. Otherwise `prev_size` is set to the previous size of the memory, in * WebAssembly pages, and `NULL` is returned. */ -WASM_API_EXTERN wasmtime_error_t *wasmtime_memory_grow( - wasmtime_context_t *store, - const wasmtime_memory_t *memory, - uint64_t delta, - uint64_t *prev_size -); +WASM_API_EXTERN wasmtime_error_t * +wasmtime_memory_grow(wasmtime_context_t *store, const wasmtime_memory_t *memory, + uint64_t delta, uint64_t *prev_size); #ifdef __cplusplus -} // extern "C" +} // extern "C" #endif #endif // WASMTIME_MEMORY_H diff --git a/crates/c-api/include/wasmtime/module.h b/crates/c-api/include/wasmtime/module.h index 222239e81f66..48f437c5142a 100644 --- a/crates/c-api/include/wasmtime/module.h +++ b/crates/c-api/include/wasmtime/module.h @@ -41,12 +41,10 @@ typedef struct wasmtime_module wasmtime_module_t; * This function does not take ownership of any of its arguments, but the * returned error and module are owned by the caller. */ -WASM_API_EXTERN wasmtime_error_t *wasmtime_module_new( - wasm_engine_t *engine, - const uint8_t *wasm, - size_t wasm_len, - wasmtime_module_t **ret -); +WASM_API_EXTERN wasmtime_error_t *wasmtime_module_new(wasm_engine_t *engine, + const uint8_t *wasm, + size_t wasm_len, + wasmtime_module_t **ret); /** * \brief Deletes a module. @@ -62,18 +60,14 @@ WASM_API_EXTERN wasmtime_module_t *wasmtime_module_clone(wasmtime_module_t *m); /** * \brief Same as #wasm_module_imports, but for #wasmtime_module_t. */ -WASM_API_EXTERN void wasmtime_module_imports( - const wasmtime_module_t *module, - wasm_importtype_vec_t *out -); +WASM_API_EXTERN void wasmtime_module_imports(const wasmtime_module_t *module, + wasm_importtype_vec_t *out); /** * \brief Same as #wasm_module_exports, but for #wasmtime_module_t. */ -WASM_API_EXTERN void wasmtime_module_exports( - const wasmtime_module_t *module, - wasm_exporttype_vec_t *out -); +WASM_API_EXTERN void wasmtime_module_exports(const wasmtime_module_t *module, + wasm_exporttype_vec_t *out); /** * \brief Validate a WebAssembly binary. @@ -87,18 +81,16 @@ WASM_API_EXTERN void wasmtime_module_exports( * If the binary validates then `NULL` is returned, otherwise the error returned * describes why the binary did not validate. */ -WASM_API_EXTERN wasmtime_error_t *wasmtime_module_validate( - wasm_engine_t *engine, - const uint8_t *wasm, - size_t wasm_len -); +WASM_API_EXTERN wasmtime_error_t * +wasmtime_module_validate(wasm_engine_t *engine, const uint8_t *wasm, + size_t wasm_len); /** * \brief This function serializes compiled module artifacts as blob data. * * \param module the module - * \param ret if the conversion is successful, this byte vector is filled in with - * the serialized compiled module. + * \param ret if the conversion is successful, this byte vector is filled in + * with the serialized compiled module. * * \return a non-null error if parsing fails, or returns `NULL`. If parsing * fails then `ret` isn't touched. @@ -106,10 +98,8 @@ WASM_API_EXTERN wasmtime_error_t *wasmtime_module_validate( * This function does not take ownership of `module`, and the caller is * expected to deallocate the returned #wasmtime_error_t and #wasm_byte_vec_t. */ -WASM_API_EXTERN wasmtime_error_t* wasmtime_module_serialize( - wasmtime_module_t* module, - wasm_byte_vec_t *ret -); +WASM_API_EXTERN wasmtime_error_t * +wasmtime_module_serialize(wasmtime_module_t *module, wasm_byte_vec_t *ret); /** * \brief Build a module from serialized data. @@ -121,12 +111,9 @@ WASM_API_EXTERN wasmtime_error_t* wasmtime_module_serialize( * documentation for more information on what inputs are safe to pass in here * (e.g. only that of #wasmtime_module_serialize) */ -WASM_API_EXTERN wasmtime_error_t *wasmtime_module_deserialize( - wasm_engine_t *engine, - const uint8_t *bytes, - size_t bytes_len, - wasmtime_module_t **ret -); +WASM_API_EXTERN wasmtime_error_t * +wasmtime_module_deserialize(wasm_engine_t *engine, const uint8_t *bytes, + size_t bytes_len, wasmtime_module_t **ret); /** * \brief Deserialize a module from an on-disk file. @@ -142,29 +129,27 @@ WASM_API_EXTERN wasmtime_error_t *wasmtime_module_deserialize( * documentation for more information on what inputs are safe to pass in here * (e.g. only that of #wasmtime_module_serialize) */ -WASM_API_EXTERN wasmtime_error_t *wasmtime_module_deserialize_file( - wasm_engine_t *engine, - const char *path, - wasmtime_module_t **ret -); - +WASM_API_EXTERN wasmtime_error_t * +wasmtime_module_deserialize_file(wasm_engine_t *engine, const char *path, + wasmtime_module_t **ret); /** - * \brief Returns the range of bytes in memory where this module’s compilation image resides. + * \brief Returns the range of bytes in memory where this module’s compilation + * image resides. * - * The compilation image for a module contains executable code, data, debug information, etc. - * This is roughly the same as the wasmtime_module_serialize but not the exact same. + * The compilation image for a module contains executable code, data, debug + * information, etc. This is roughly the same as the wasmtime_module_serialize + * but not the exact same. * - * For more details see: https://docs.wasmtime.dev/api/wasmtime/struct.Module.html#method.image_range + * For more details see: + * https://docs.wasmtime.dev/api/wasmtime/struct.Module.html#method.image_range */ -WASM_API_EXTERN void wasmtime_module_image_range( - const wasmtime_module_t *module, - size_t *start, - size_t *end -); +WASM_API_EXTERN void +wasmtime_module_image_range(const wasmtime_module_t *module, size_t *start, + size_t *end); #ifdef __cplusplus -} // extern "C" +} // extern "C" #endif #endif // WASMTIME_MODULE_H diff --git a/crates/c-api/include/wasmtime/profiling.h b/crates/c-api/include/wasmtime/profiling.h new file mode 100644 index 000000000000..509f7c00cdc7 --- /dev/null +++ b/crates/c-api/include/wasmtime/profiling.h @@ -0,0 +1,118 @@ +/** + * \file wasmtime/profiling.h + * + * \brief API for Wasmtime guest profiler + */ + +#ifndef WASMTIME_PROFILING_H +#define WASMTIME_PROFILING_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * \brief Collects basic profiling data for a single WebAssembly guest. + * + * To use this, you’ll need to arrange to call #wasmtime_guestprofiler_sample at + * regular intervals while the guest is on the stack. The most straightforward + * way to do that is to call it from a callback registered with + * #wasmtime_store_epoch_deadline_callback. + * + * For more information see the Rust documentation at: + * https://docs.wasmtime.dev/api/wasmtime/struct.GuestProfiler.html + */ +typedef struct wasmtime_guestprofiler wasmtime_guestprofiler_t; + +/** + * \brief Deletes profiler without finishing it. + * + * \param guestprofiler profiler that is being deleted + */ +WASM_API_EXTERN void wasmtime_guestprofiler_delete( + /* own */ wasmtime_guestprofiler_t *guestprofiler); + +/** + * \typedef wasmtime_guestprofiler_modules_t + * \brief Alias to #wasmtime_guestprofiler_modules + * + * \struct #wasmtime_guestprofiler_modules + * \brief Tuple of name and module for passing into #wasmtime_guestprofiler_new. + */ +typedef struct wasmtime_guestprofiler_modules { + const wasm_name_t *name; //!< Name recorded in the profile. + const wasmtime_module_t + *mod; //!< Module that is being allowed to appear in captured stack trace. +} wasmtime_guestprofiler_modules_t; + +/** + * \brief Begin profiling a new guest. + * + * \param module_name name recorded in the profile + * \param interval_nanos intended sampling interval in nanoseconds recorded in + * the profile + * \param modules modules and associated names that will appear in + * captured stack traces, pointer to the first element + * \param modules_len count of elements in `modules` + * + * \return Created profiler that is owned by the caller. + * + * This function does not take ownership of the arguments. + * + * For more information see the Rust documentation at: + * https://docs.wasmtime.dev/api/wasmtime/struct.GuestProfiler.html#method.new + */ +WASM_API_EXTERN /* own */ wasmtime_guestprofiler_t *wasmtime_guestprofiler_new( + const wasm_name_t *module_name, uint64_t interval_nanos, + const wasmtime_guestprofiler_modules_t *modules, size_t modules_len); + +/** + * \brief Add a sample to the profile. + * + * \param guestprofiler the profiler the sample is being added to + * \param store store that is being used to collect the backtraces + * \param delta_nanos CPU time in nanoseconds that was used by this guest + * since the previous sample + * + * Zero can be passed as `delta_nanos` if recording CPU usage information + * is not needed. + * This function does not take ownership of the arguments. + * + * For more information see the Rust documentation at: + * https://docs.wasmtime.dev/api/wasmtime/struct.GuestProfiler.html#method.sample + */ +WASM_API_EXTERN void +wasmtime_guestprofiler_sample(wasmtime_guestprofiler_t *guestprofiler, + const wasmtime_store_t *store, + uint64_t delta_nanos); + +/** + * \brief Writes out the captured profile. + * + * \param guestprofiler the profiler which is being finished and deleted + * \param out pointer to where #wasm_byte_vec_t containing generated + * file will be written + * + * \return Returns #wasmtime_error_t owned by the caller in case of error, + * `NULL` otherwise. + * + * This function takes ownership of `guestprofiler`, even when error is + * returned. + * Only when returning without error `out` is filled with #wasm_byte_vec_t owned + * by the caller. + * + * For more information see the Rust documentation at: + * https://docs.wasmtime.dev/api/wasmtime/struct.GuestProfiler.html#method.finish + */ +WASM_API_EXTERN /* own */ wasmtime_error_t * +wasmtime_guestprofiler_finish(/* own */ wasmtime_guestprofiler_t *guestprofiler, + /* own */ wasm_byte_vec_t *out); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // WASMTIME_PROFILING_H diff --git a/crates/c-api/include/wasmtime/store.h b/crates/c-api/include/wasmtime/store.h index 79f154a39eb6..60ba3447f8ee 100644 --- a/crates/c-api/include/wasmtime/store.h +++ b/crates/c-api/include/wasmtime/store.h @@ -7,8 +7,8 @@ #ifndef WASMTIME_STORE_H #define WASMTIME_STORE_H -#include #include +#include #include #ifdef __cplusplus @@ -68,16 +68,15 @@ typedef struct wasmtime_context wasmtime_context_t; * This function creates a fresh store with the provided configuration settings. * The returned store must be deleted with #wasmtime_store_delete. */ -WASM_API_EXTERN wasmtime_store_t *wasmtime_store_new( - wasm_engine_t *engine, - void *data, - void (*finalizer)(void*) -); +WASM_API_EXTERN wasmtime_store_t *wasmtime_store_new(wasm_engine_t *engine, + void *data, + void (*finalizer)(void *)); /** * \brief Returns the interior #wasmtime_context_t pointer to this store */ -WASM_API_EXTERN wasmtime_context_t *wasmtime_store_context(wasmtime_store_t *store); +WASM_API_EXTERN wasmtime_context_t * +wasmtime_store_context(wasmtime_store_t *store); /** * \brief Provides limits for a store. Used by hosts to limit resource @@ -108,14 +107,11 @@ WASM_API_EXTERN wasmtime_context_t *wasmtime_store_context(wasmtime_store_t *sto * resources in the future, this does not retroactively attempt to apply * limits to the store. */ -WASM_API_EXTERN void wasmtime_store_limiter( - wasmtime_store_t *store, - int64_t memory_size, - int64_t table_elements, - int64_t instances, - int64_t tables, - int64_t memories -); +WASM_API_EXTERN void wasmtime_store_limiter(wasmtime_store_t *store, + int64_t memory_size, + int64_t table_elements, + int64_t instances, int64_t tables, + int64_t memories); /** * \brief Deletes a store. @@ -125,7 +121,8 @@ WASM_API_EXTERN void wasmtime_store_delete(wasmtime_store_t *store); /** * \brief Returns the user-specified data associated with the specified store */ -WASM_API_EXTERN void *wasmtime_context_get_data(const wasmtime_context_t* context); +WASM_API_EXTERN void * +wasmtime_context_get_data(const wasmtime_context_t *context); /** * \brief Overwrites the user-specified data associated with this store. @@ -134,7 +131,8 @@ WASM_API_EXTERN void *wasmtime_context_get_data(const wasmtime_context_t* contex * and the original finalizer will be executed for the provided data when the * store is deleted. */ -WASM_API_EXTERN void wasmtime_context_set_data(wasmtime_context_t* context, void *data); +WASM_API_EXTERN void wasmtime_context_set_data(wasmtime_context_t *context, + void *data); /** * \brief Perform garbage collection within the given context. @@ -145,7 +143,7 @@ WASM_API_EXTERN void wasmtime_context_set_data(wasmtime_context_t* context, void * * The `context` argument must not be NULL. */ -WASM_API_EXTERN void wasmtime_context_gc(wasmtime_context_t* context); +WASM_API_EXTERN void wasmtime_context_gc(wasmtime_context_t *context); /** * \brief Set fuel to this context's store for wasm to consume while executing. @@ -161,7 +159,8 @@ WASM_API_EXTERN void wasmtime_context_gc(wasmtime_context_t* context); * If fuel is not enabled within this store then an error is returned. If fuel * is successfully added then NULL is returned. */ -WASM_API_EXTERN wasmtime_error_t *wasmtime_context_set_fuel(wasmtime_context_t *store, uint64_t fuel); +WASM_API_EXTERN wasmtime_error_t * +wasmtime_context_set_fuel(wasmtime_context_t *store, uint64_t fuel); /** * \brief Returns the amount of fuel remaining in this context's store. @@ -173,7 +172,8 @@ WASM_API_EXTERN wasmtime_error_t *wasmtime_context_set_fuel(wasmtime_context_t * * Also note that fuel, if enabled, must be originally configured via * #wasmtime_context_set_fuel. */ -WASM_API_EXTERN wasmtime_error_t* wasmtime_context_get_fuel(const wasmtime_context_t *context, uint64_t *fuel); +WASM_API_EXTERN wasmtime_error_t * +wasmtime_context_get_fuel(const wasmtime_context_t *context, uint64_t *fuel); /** * \brief Configures WASI state within the specified store. @@ -186,7 +186,8 @@ WASM_API_EXTERN wasmtime_error_t* wasmtime_context_get_fuel(const wasmtime_conte * of `wasi`. The caller should no longer use `wasi` after calling this function * (even if an error is returned). */ -WASM_API_EXTERN wasmtime_error_t *wasmtime_context_set_wasi(wasmtime_context_t *context, wasi_config_t *wasi); +WASM_API_EXTERN wasmtime_error_t * +wasmtime_context_set_wasi(wasmtime_context_t *context, wasi_config_t *wasi); /** * \brief Configures the relative deadline at which point WebAssembly code will @@ -198,14 +199,16 @@ WASM_API_EXTERN wasmtime_error_t *wasmtime_context_set_wasi(wasmtime_context_t * * See also #wasmtime_config_epoch_interruption_set and * #wasmtime_store_epoch_deadline_callback. */ -WASM_API_EXTERN void wasmtime_context_set_epoch_deadline(wasmtime_context_t *context, uint64_t ticks_beyond_current); +WASM_API_EXTERN void +wasmtime_context_set_epoch_deadline(wasmtime_context_t *context, + uint64_t ticks_beyond_current); /// \brief An enum for the behavior before extending the epoch deadline. typedef uint8_t wasmtime_update_deadline_kind_t; /// \brief Directly continue to updating the deadline and executing WebAssembly. #define WASMTIME_UPDATE_DEADLINE_CONTINUE 0 /// \brief Yield control (via async support) then update the deadline. -#define WASMTIME_UPDATE_DEADLINE_YIELD 1 +#define WASMTIME_UPDATE_DEADLINE_YIELD 1 /** * \brief Configures epoch deadline callback to C function. @@ -216,32 +219,26 @@ typedef uint8_t wasmtime_update_deadline_kind_t; * - return a #wasmtime_error_t to terminate the function * - set the delta argument and return NULL to update the * epoch deadline delta and resume function execution. - * - set the delta argument, update the epoch deadline, + * - set the delta argument, update the epoch deadline, * set update_kind to WASMTIME_UPDATE_DEADLINE_YIELD, - * and return NULL to yield (via async support) and + * and return NULL to yield (via async support) and * resume function execution. * - * To use WASMTIME_UPDATE_DEADLINE_YIELD async support must be enabled + * To use WASMTIME_UPDATE_DEADLINE_YIELD async support must be enabled * for this store. * * See also #wasmtime_config_epoch_interruption_set and * #wasmtime_context_set_epoch_deadline. */ WASM_API_EXTERN void wasmtime_store_epoch_deadline_callback( - wasmtime_store_t *store, - wasmtime_error_t* (*func)( - wasmtime_context_t* context, - void* data, - uint64_t* epoch_deadline_delta, - wasmtime_update_deadline_kind_t* update_kind - ), - void *data, - void (*finalizer)(void*) -); + wasmtime_store_t *store, + wasmtime_error_t *(*func)(wasmtime_context_t *context, void *data, + uint64_t *epoch_deadline_delta, + wasmtime_update_deadline_kind_t *update_kind), + void *data, void (*finalizer)(void *)); #ifdef __cplusplus -} // extern "C" +} // extern "C" #endif #endif // WASMTIME_STORE_H - diff --git a/crates/c-api/include/wasmtime/table.h b/crates/c-api/include/wasmtime/table.h index 630cee9ecae6..9ec8f3796c80 100644 --- a/crates/c-api/include/wasmtime/table.h +++ b/crates/c-api/include/wasmtime/table.h @@ -8,9 +8,9 @@ #define WASMTIME_TABLE_H #include +#include #include #include -#include #include #ifdef __cplusplus @@ -29,22 +29,19 @@ extern "C" { * ownership of returned error. This function may return an error if the `init` * value does not match `ty`, for example. */ -WASM_API_EXTERN wasmtime_error_t *wasmtime_table_new( - wasmtime_context_t *store, - const wasm_tabletype_t *ty, - const wasmtime_val_t *init, - wasmtime_table_t *table -); +WASM_API_EXTERN wasmtime_error_t *wasmtime_table_new(wasmtime_context_t *store, + const wasm_tabletype_t *ty, + const wasmtime_val_t *init, + wasmtime_table_t *table); /** * \brief Returns the type of this table. * * The caller has ownership of the returned #wasm_tabletype_t */ -WASM_API_EXTERN wasm_tabletype_t* wasmtime_table_type( - const wasmtime_context_t *store, - const wasmtime_table_t *table -); +WASM_API_EXTERN wasm_tabletype_t * +wasmtime_table_type(const wasmtime_context_t *store, + const wasmtime_table_t *table); /** * \brief Gets a value in a table. @@ -58,12 +55,9 @@ WASM_API_EXTERN wasm_tabletype_t* wasmtime_table_type( * returned then `val` is filled in and is owned by the caller. Otherwise zero * is returned because the `index` is out-of-bounds. */ -WASM_API_EXTERN bool wasmtime_table_get( - wasmtime_context_t *store, - const wasmtime_table_t *table, - uint32_t index, - wasmtime_val_t *val -); +WASM_API_EXTERN bool wasmtime_table_get(wasmtime_context_t *store, + const wasmtime_table_t *table, + uint32_t index, wasmtime_val_t *val); /** * \brief Sets a value in a table. @@ -78,20 +72,15 @@ WASM_API_EXTERN bool wasmtime_table_get( * This function can fail if `value` has the wrong type for the table, or if * `index` is out of bounds. */ -WASM_API_EXTERN wasmtime_error_t *wasmtime_table_set( - wasmtime_context_t *store, - const wasmtime_table_t *table, - uint32_t index, - const wasmtime_val_t *value -); +WASM_API_EXTERN wasmtime_error_t * +wasmtime_table_set(wasmtime_context_t *store, const wasmtime_table_t *table, + uint32_t index, const wasmtime_val_t *value); /** * \brief Returns the size, in elements, of the specified table */ -WASM_API_EXTERN uint32_t wasmtime_table_size( - const wasmtime_context_t *store, - const wasmtime_table_t *table -); +WASM_API_EXTERN uint32_t wasmtime_table_size(const wasmtime_context_t *store, + const wasmtime_table_t *table); /** * \brief Grows a table. @@ -110,17 +99,13 @@ WASM_API_EXTERN uint32_t wasmtime_table_size( * * This function does not take ownership of any of its arguments. */ -WASM_API_EXTERN wasmtime_error_t *wasmtime_table_grow( - wasmtime_context_t *store, - const wasmtime_table_t *table, - uint32_t delta, - const wasmtime_val_t *init, - uint32_t *prev_size -); +WASM_API_EXTERN wasmtime_error_t * +wasmtime_table_grow(wasmtime_context_t *store, const wasmtime_table_t *table, + uint32_t delta, const wasmtime_val_t *init, + uint32_t *prev_size); #ifdef __cplusplus -} // extern "C" +} // extern "C" #endif #endif // WASMTIME_TABLE_H - diff --git a/crates/c-api/include/wasmtime/trap.h b/crates/c-api/include/wasmtime/trap.h index 2d2e20407c20..0d2385bb008b 100644 --- a/crates/c-api/include/wasmtime/trap.h +++ b/crates/c-api/include/wasmtime/trap.h @@ -28,7 +28,8 @@ enum wasmtime_trap_code_enum { WASMTIME_TRAP_CODE_STACK_OVERFLOW, /// An out-of-bounds memory access. WASMTIME_TRAP_CODE_MEMORY_OUT_OF_BOUNDS, - /// A wasm atomic operation was presented with a not-naturally-aligned linear-memory address. + /// A wasm atomic operation was presented with a not-naturally-aligned + /// linear-memory address. WASMTIME_TRAP_CODE_HEAP_MISALIGNED, /// An out-of-bounds access to a table. WASMTIME_TRAP_CODE_TABLE_OUT_OF_BOUNDS, @@ -69,7 +70,8 @@ WASM_API_EXTERN wasm_trap_t *wasmtime_trap_new(const char *msg, size_t msg_len); * an instruction trap -- traps can also be created using wasm_trap_new, * or occur with WASI modules exiting with a certain exit code. */ -WASM_API_EXTERN bool wasmtime_trap_code(const wasm_trap_t*, wasmtime_trap_code_t *code); +WASM_API_EXTERN bool wasmtime_trap_code(const wasm_trap_t *, + wasmtime_trap_code_t *code); /** * \brief Returns a human-readable name for this frame's function. @@ -79,7 +81,8 @@ WASM_API_EXTERN bool wasmtime_trap_code(const wasm_trap_t*, wasmtime_trap_code_t * * The lifetime of the returned name is the same as the #wasm_frame_t itself. */ -WASM_API_EXTERN const wasm_name_t *wasmtime_frame_func_name(const wasm_frame_t*); +WASM_API_EXTERN const wasm_name_t * +wasmtime_frame_func_name(const wasm_frame_t *); /** * \brief Returns a human-readable name for this frame's module. @@ -89,11 +92,11 @@ WASM_API_EXTERN const wasm_name_t *wasmtime_frame_func_name(const wasm_frame_t*) * * The lifetime of the returned name is the same as the #wasm_frame_t itself. */ -WASM_API_EXTERN const wasm_name_t *wasmtime_frame_module_name(const wasm_frame_t*); - +WASM_API_EXTERN const wasm_name_t * +wasmtime_frame_module_name(const wasm_frame_t *); #ifdef __cplusplus -} // extern "C" +} // extern "C" #endif #endif // WASMTIME_TRAP_H diff --git a/crates/c-api/include/wasmtime/val.h b/crates/c-api/include/wasmtime/val.h index 4c4081336a68..61c82873be50 100644 --- a/crates/c-api/include/wasmtime/val.h +++ b/crates/c-api/include/wasmtime/val.h @@ -41,7 +41,8 @@ typedef struct wasmtime_externref wasmtime_externref_t; * * The returned value must be deleted with #wasmtime_externref_delete */ -WASM_API_EXTERN wasmtime_externref_t *wasmtime_externref_new(void *data, void (*finalizer)(void*)); +WASM_API_EXTERN wasmtime_externref_t * +wasmtime_externref_new(void *data, void (*finalizer)(void *)); /** * \brief Get an `externref`'s wrapped data @@ -55,7 +56,8 @@ WASM_API_EXTERN void *wasmtime_externref_data(wasmtime_externref_t *data); * \brief Creates a shallow copy of the `externref` argument, returning a * separately owned pointer (increases the reference count). */ -WASM_API_EXTERN wasmtime_externref_t *wasmtime_externref_clone(wasmtime_externref_t *ref); +WASM_API_EXTERN wasmtime_externref_t * +wasmtime_externref_clone(wasmtime_externref_t *ref); /** * \brief Decrements the reference count of the `ref`, deleting it if it's the @@ -70,7 +72,8 @@ WASM_API_EXTERN void wasmtime_externref_delete(wasmtime_externref_t *ref); * Note that the returned #wasmtime_externref_t is an owned value that must be * deleted via #wasmtime_externref_delete by the caller if it is non-null. */ -WASM_API_EXTERN wasmtime_externref_t *wasmtime_externref_from_raw(wasmtime_context_t *context, void *raw); +WASM_API_EXTERN wasmtime_externref_t * +wasmtime_externref_from_raw(wasmtime_context_t *context, void *raw); /** * \brief Converts a #wasmtime_externref_t to a raw value suitable for storing @@ -82,9 +85,9 @@ WASM_API_EXTERN wasmtime_externref_t *wasmtime_externref_from_raw(wasmtime_conte * context of the store. Do not perform a GC between calling this function and * passing it to WebAssembly. */ -WASM_API_EXTERN void *wasmtime_externref_to_raw( - wasmtime_context_t *context, - const wasmtime_externref_t *ref); +WASM_API_EXTERN void * +wasmtime_externref_to_raw(wasmtime_context_t *context, + const wasmtime_externref_t *ref); /// \brief Discriminant stored in #wasmtime_val::kind typedef uint8_t wasmtime_valkind_t; @@ -98,9 +101,11 @@ typedef uint8_t wasmtime_valkind_t; #define WASMTIME_F64 3 /// \brief Value of #wasmtime_valkind_t meaning that #wasmtime_val_t is a v128 #define WASMTIME_V128 4 -/// \brief Value of #wasmtime_valkind_t meaning that #wasmtime_val_t is a funcref +/// \brief Value of #wasmtime_valkind_t meaning that #wasmtime_val_t is a +/// funcref #define WASMTIME_FUNCREF 5 -/// \brief Value of #wasmtime_valkind_t meaning that #wasmtime_val_t is an externref +/// \brief Value of #wasmtime_valkind_t meaning that #wasmtime_val_t is an +/// externref #define WASMTIME_EXTERNREF 6 /// \brief A 128-bit value representing the WebAssembly `v128` type. Bytes are @@ -222,11 +227,11 @@ WASM_API_EXTERN void wasmtime_val_delete(wasmtime_val_t *val); /** * \brief Copies `src` into `dst`. */ -WASM_API_EXTERN void wasmtime_val_copy(wasmtime_val_t *dst, const wasmtime_val_t *src); +WASM_API_EXTERN void wasmtime_val_copy(wasmtime_val_t *dst, + const wasmtime_val_t *src); #ifdef __cplusplus -} // extern "C" +} // extern "C" #endif #endif // WASMTIME_VAL_H - diff --git a/crates/c-api/src/async.rs b/crates/c-api/src/async.rs index 1e7e887a72bd..99ee3387b499 100644 --- a/crates/c-api/src/async.rs +++ b/crates/c-api/src/async.rs @@ -271,7 +271,7 @@ pub unsafe extern "C" fn wasmtime_linker_define_async_func( data: *mut c_void, finalizer: Option, ) -> Option> { - let ty = ty.ty().ty.clone(); + let ty = ty.ty().ty(linker.linker.engine()); let module = to_str!(module, module_len); let name = to_str!(name, name_len); let cb = c_async_callback_to_rust_fn(callback, data, finalizer); diff --git a/crates/c-api/src/config.rs b/crates/c-api/src/config.rs index 201e0519665e..19fcda036c00 100644 --- a/crates/c-api/src/config.rs +++ b/crates/c-api/src/config.rs @@ -75,6 +75,11 @@ pub extern "C" fn wasmtime_config_wasm_threads_set(c: &mut wasm_config_t, enable c.config.wasm_threads(enable); } +#[no_mangle] +pub extern "C" fn wasmtime_config_wasm_tail_call_set(c: &mut wasm_config_t, enable: bool) { + c.config.wasm_tail_call(enable); +} + #[no_mangle] pub extern "C" fn wasmtime_config_wasm_reference_types_set(c: &mut wasm_config_t, enable: bool) { c.config.wasm_reference_types(enable); @@ -240,6 +245,11 @@ pub unsafe extern "C" fn wasmtime_config_target_set( handle_result(c.config.target(target), |_cfg| {}) } +#[no_mangle] +pub extern "C" fn wasmtime_config_macos_use_mach_ports_set(c: &mut wasm_config_t, enabled: bool) { + c.config.macos_use_mach_ports(enabled); +} + #[no_mangle] pub unsafe extern "C" fn wasmtime_config_cranelift_flag_enable( c: &mut wasm_config_t, diff --git a/crates/c-api/src/error.rs b/crates/c-api/src/error.rs index 0c9dde87900b..9ebc389a7372 100644 --- a/crates/c-api/src/error.rs +++ b/crates/c-api/src/error.rs @@ -56,7 +56,7 @@ pub extern "C" fn wasmtime_error_message(error: &wasmtime_error_t, message: &mut #[no_mangle] pub extern "C" fn wasmtime_error_exit_status(raw: &wasmtime_error_t, status: &mut i32) -> bool { #[cfg(feature = "wasi")] - if let Some(exit) = raw.error.downcast_ref::() { + if let Some(exit) = raw.error.downcast_ref::() { *status = exit.0; return true; } diff --git a/crates/c-api/src/extern.rs b/crates/c-api/src/extern.rs index 516e21b28467..b97ba1f19f18 100644 --- a/crates/c-api/src/extern.rs +++ b/crates/c-api/src/extern.rs @@ -26,7 +26,9 @@ pub extern "C" fn wasm_extern_kind(e: &wasm_extern_t) -> wasm_externkind_t { #[no_mangle] pub unsafe extern "C" fn wasm_extern_type(e: &wasm_extern_t) -> Box { - Box::new(wasm_externtype_t::new(e.which.ty(&e.store.context()))) + Box::new(wasm_externtype_t::from_extern_type( + e.which.ty(&e.store.context()), + )) } #[no_mangle] @@ -135,5 +137,5 @@ pub unsafe extern "C" fn wasmtime_extern_type( store: CStoreContext<'_>, e: &wasmtime_extern_t, ) -> Box { - Box::new(wasm_externtype_t::new(e.to_extern().ty(store))) + Box::new(wasm_externtype_t::from_extern_type(e.to_extern().ty(store))) } diff --git a/crates/c-api/src/func.rs b/crates/c-api/src/func.rs index 8fbec441da29..95f46b89aee4 100644 --- a/crates/c-api/src/func.rs +++ b/crates/c-api/src/func.rs @@ -55,7 +55,7 @@ unsafe fn create_function( + Sync + 'static, ) -> Box { - let ty = ty.ty().ty.clone(); + let ty = ty.ty().ty(store.store.context().engine()); let func = Func::new( store.store.context_mut(), ty, @@ -228,7 +228,7 @@ pub unsafe extern "C" fn wasmtime_func_new( finalizer: Option, func: &mut Func, ) { - let ty = ty.ty().ty.clone(); + let ty = ty.ty().ty(store.engine()); let cb = c_callback_to_rust_fn(callback, data, finalizer); let f = Func::new(store, ty, cb); *func = f; @@ -293,7 +293,7 @@ pub unsafe extern "C" fn wasmtime_func_new_unchecked( finalizer: Option, func: &mut Func, ) { - let ty = ty.ty().ty.clone(); + let ty = ty.ty().ty(store.engine()); let cb = c_unchecked_callback_to_rust_fn(callback, data, finalizer); *func = Func::new_unchecked(store, ty, cb); } diff --git a/crates/c-api/src/instance.rs b/crates/c-api/src/instance.rs index b8ae5bc82341..6a6e71196915 100644 --- a/crates/c-api/src/instance.rs +++ b/crates/c-api/src/instance.rs @@ -170,3 +170,11 @@ pub unsafe extern "C" fn wasmtime_instance_pre_instantiate( let result = instance_pre.underlying.instantiate(store); handle_instantiate(result, instance_ptr, trap_ptr) } + +#[no_mangle] +pub unsafe extern "C" fn wasmtime_instance_pre_module( + instance_pre: &wasmtime_instance_pre_t, +) -> Box { + let module = instance_pre.underlying.module().clone(); + Box::new(wasmtime_module_t { module }) +} diff --git a/crates/c-api/src/lib.rs b/crates/c-api/src/lib.rs index fb686427e6d6..fa5368cdd86e 100644 --- a/crates/c-api/src/lib.rs +++ b/crates/c-api/src/lib.rs @@ -1,8 +1,11 @@ //! This crate is the implementation of Wasmtime's C API. //! -//! This crate is not intended to be used from Rust itself, for that see the -//! `wasmtime` crate. Otherwise this is typically compiled as a -//! cdylib/staticlib. Documentation for this crate largely lives in the header +//! This crate is normally not intended to be used from Rust itself. For that, +//! see the `wasmtime` crate. It is possible to use this crate via Cargo, for +//! Rust crates that wrap C libraries that use wasmtime. Most often, this crate +//! is compiled as a cdylib or staticlib, via the `wasmtime-c-api` crate. +//! +//! Documentation for this crate largely lives in the header //! files of the `include` directory for this crate. //! //! At a high level this crate implements the `wasm.h` API with some gymnastics, @@ -23,6 +26,8 @@ mod instance; mod linker; mod memory; mod module; +#[cfg(feature = "profiling")] +mod profiling; mod r#ref; mod store; mod table; diff --git a/crates/c-api/src/linker.rs b/crates/c-api/src/linker.rs index 7cf9391d8f8a..6ea36fa05388 100644 --- a/crates/c-api/src/linker.rs +++ b/crates/c-api/src/linker.rs @@ -69,7 +69,7 @@ pub unsafe extern "C" fn wasmtime_linker_define_func( data: *mut c_void, finalizer: Option, ) -> Option> { - let ty = ty.ty().ty.clone(); + let ty = ty.ty().ty(linker.linker.engine()); let module = to_str!(module, module_len); let name = to_str!(name, name_len); let cb = crate::func::c_callback_to_rust_fn(callback, data, finalizer); @@ -88,7 +88,7 @@ pub unsafe extern "C" fn wasmtime_linker_define_func_unchecked( data: *mut c_void, finalizer: Option, ) -> Option> { - let ty = ty.ty().ty.clone(); + let ty = ty.ty().ty(linker.linker.engine()); let module = to_str!(module, module_len); let name = to_str!(name, name_len); let cb = crate::func::c_unchecked_callback_to_rust_fn(callback, data, finalizer); diff --git a/crates/c-api/src/module.rs b/crates/c-api/src/module.rs index 3a1a6e6664cc..537bcfd73dd9 100644 --- a/crates/c-api/src/module.rs +++ b/crates/c-api/src/module.rs @@ -1,6 +1,6 @@ use crate::{ handle_result, wasm_byte_vec_t, wasm_engine_t, wasm_exporttype_t, wasm_exporttype_vec_t, - wasm_importtype_t, wasm_importtype_vec_t, wasm_store_t, wasmtime_error_t, + wasm_importtype_t, wasm_importtype_vec_t, wasm_store_t, wasmtime_error_t, CExternType, }; use anyhow::Context; use std::ffi::CStr; @@ -53,7 +53,7 @@ fn fill_exports(module: &Module, out: &mut wasm_exporttype_vec_t) { .map(|e| { Some(Box::new(wasm_exporttype_t::new( e.name().to_owned(), - e.ty(), + CExternType::new(e.ty()), ))) }) .collect::>(); @@ -67,7 +67,7 @@ fn fill_imports(module: &Module, out: &mut wasm_importtype_vec_t) { Some(Box::new(wasm_importtype_t::new( i.module().to_owned(), i.name().to_owned(), - i.ty(), + CExternType::new(i.ty()), ))) }) .collect::>(); diff --git a/crates/c-api/src/profiling.rs b/crates/c-api/src/profiling.rs new file mode 100644 index 000000000000..1b59b6c2e50a --- /dev/null +++ b/crates/c-api/src/profiling.rs @@ -0,0 +1,67 @@ +use crate::{wasm_byte_vec_t, wasm_name_t, wasmtime_error_t, wasmtime_module_t, wasmtime_store_t}; +use std::slice; +use std::str::from_utf8; +use std::time::Duration; +use wasmtime::GuestProfiler; + +pub struct wasmtime_guestprofiler_t { + guest_profiler: GuestProfiler, +} + +wasmtime_c_api_macros::declare_own!(wasmtime_guestprofiler_t); + +#[repr(C)] +pub struct wasmtime_guestprofiler_modules_t<'a> { + name: &'a wasm_name_t, + module: &'a wasmtime_module_t, +} + +#[no_mangle] +pub unsafe extern "C" fn wasmtime_guestprofiler_new( + module_name: &wasm_name_t, + interval_nanos: u64, + modules: *const wasmtime_guestprofiler_modules_t, + modules_len: usize, +) -> Box { + let module_name = from_utf8(&module_name.as_slice()).expect("not valid utf-8"); + let list = slice::from_raw_parts(modules, modules_len) + .iter() + .map(|entry| { + ( + from_utf8(entry.name.as_slice()) + .expect("not valid utf-8") + .to_owned(), + entry.module.module.clone(), + ) + }) + .collect(); + Box::new(wasmtime_guestprofiler_t { + guest_profiler: GuestProfiler::new(module_name, Duration::from_nanos(interval_nanos), list), + }) +} + +#[no_mangle] +pub extern "C" fn wasmtime_guestprofiler_sample( + guestprofiler: &mut wasmtime_guestprofiler_t, + store: &wasmtime_store_t, + delta_nanos: u64, +) { + guestprofiler + .guest_profiler + .sample(&store.store, Duration::from_nanos(delta_nanos)); +} + +#[no_mangle] +pub extern "C" fn wasmtime_guestprofiler_finish( + guestprofiler: Box, + out: &mut wasm_byte_vec_t, +) -> Option> { + let mut buf = vec![]; + match guestprofiler.guest_profiler.finish(&mut buf) { + Ok(()) => { + out.set_buffer(buf); + None + } + Err(e) => Some(Box::new(e.into())), + } +} diff --git a/crates/c-api/src/store.rs b/crates/c-api/src/store.rs index 72954ddeb572..32ff1a3d8f26 100644 --- a/crates/c-api/src/store.rs +++ b/crates/c-api/src/store.rs @@ -71,7 +71,7 @@ pub type CStoreContextMut<'a> = StoreContextMut<'a, StoreData>; pub struct StoreData { foreign: crate::ForeignData, #[cfg(feature = "wasi")] - pub(crate) wasi: Option, + pub(crate) wasi: Option, /// Temporary storage for usage during a wasm->host call to store values /// in a slice we pass to the C API. diff --git a/crates/c-api/src/types/export.rs b/crates/c-api/src/types/export.rs index 3d83cc41faca..2eca463d82b2 100644 --- a/crates/c-api/src/types/export.rs +++ b/crates/c-api/src/types/export.rs @@ -1,12 +1,11 @@ -use crate::{wasm_externtype_t, wasm_name_t}; +use crate::{wasm_externtype_t, wasm_name_t, CExternType}; use once_cell::unsync::OnceCell; -use wasmtime::ExternType; #[repr(C)] #[derive(Clone)] pub struct wasm_exporttype_t { name: String, - ty: ExternType, + ty: CExternType, name_cache: OnceCell, type_cache: OnceCell, } @@ -14,7 +13,7 @@ pub struct wasm_exporttype_t { wasmtime_c_api_macros::declare_ty!(wasm_exporttype_t); impl wasm_exporttype_t { - pub(crate) fn new(name: String, ty: ExternType) -> wasm_exporttype_t { + pub(crate) fn new(name: String, ty: CExternType) -> wasm_exporttype_t { wasm_exporttype_t { name, ty, @@ -31,7 +30,7 @@ pub extern "C" fn wasm_exporttype_new( ) -> Option> { let name = name.take(); let name = String::from_utf8(name).ok()?; - Some(Box::new(wasm_exporttype_t::new(name, ty.ty()))) + Some(Box::new(wasm_exporttype_t::new(name, ty.which.clone()))) } #[no_mangle] @@ -43,5 +42,5 @@ pub extern "C" fn wasm_exporttype_name(et: &wasm_exporttype_t) -> &wasm_name_t { #[no_mangle] pub extern "C" fn wasm_exporttype_type(et: &wasm_exporttype_t) -> &wasm_externtype_t { et.type_cache - .get_or_init(|| wasm_externtype_t::new(et.ty.clone())) + .get_or_init(|| wasm_externtype_t::from_cextern_type(et.ty.clone())) } diff --git a/crates/c-api/src/types/extern.rs b/crates/c-api/src/types/extern.rs index 21278a25e722..c85dcbb25cfd 100644 --- a/crates/c-api/src/types/extern.rs +++ b/crates/c-api/src/types/extern.rs @@ -18,6 +18,17 @@ pub(crate) enum CExternType { Table(CTableType), } +impl CExternType { + pub(crate) fn new(ty: ExternType) -> CExternType { + match ty { + ExternType::Func(f) => CExternType::Func(CFuncType::new(f)), + ExternType::Global(f) => CExternType::Global(CGlobalType::new(f)), + ExternType::Memory(f) => CExternType::Memory(CMemoryType::new(f)), + ExternType::Table(f) => CExternType::Table(CTableType::new(f)), + } + } +} + pub type wasm_externkind_t = u8; pub const WASM_EXTERN_FUNC: wasm_externkind_t = 0; @@ -26,24 +37,14 @@ pub const WASM_EXTERN_TABLE: wasm_externkind_t = 2; pub const WASM_EXTERN_MEMORY: wasm_externkind_t = 3; impl wasm_externtype_t { - pub(crate) fn new(ty: ExternType) -> wasm_externtype_t { + pub(crate) fn from_extern_type(ty: ExternType) -> wasm_externtype_t { wasm_externtype_t { - which: match ty { - ExternType::Func(f) => CExternType::Func(CFuncType::new(f)), - ExternType::Global(f) => CExternType::Global(CGlobalType::new(f)), - ExternType::Memory(f) => CExternType::Memory(CMemoryType::new(f)), - ExternType::Table(f) => CExternType::Table(CTableType::new(f)), - }, + which: CExternType::new(ty), } } - pub(crate) fn ty(&self) -> ExternType { - match &self.which { - CExternType::Func(f) => ExternType::Func(f.ty.clone()), - CExternType::Table(f) => ExternType::Table(f.ty.clone()), - CExternType::Global(f) => ExternType::Global(f.ty.clone()), - CExternType::Memory(f) => ExternType::Memory(f.ty.clone()), - } + pub(crate) fn from_cextern_type(ty: CExternType) -> wasm_externtype_t { + wasm_externtype_t { which: ty } } } diff --git a/crates/c-api/src/types/func.rs b/crates/c-api/src/types/func.rs index 1b4ca752febf..c2158902b2de 100644 --- a/crates/c-api/src/types/func.rs +++ b/crates/c-api/src/types/func.rs @@ -1,6 +1,10 @@ use crate::{wasm_externtype_t, wasm_valtype_t, wasm_valtype_vec_t, CExternType}; use once_cell::unsync::OnceCell; -use wasmtime::FuncType; +use std::{ + mem, + sync::{Arc, Mutex}, +}; +use wasmtime::{Engine, FuncType, ValType}; #[repr(transparent)] #[derive(Clone)] @@ -10,9 +14,75 @@ pub struct wasm_functype_t { wasmtime_c_api_macros::declare_ty!(wasm_functype_t); +#[derive(Clone)] +enum LazyFuncType { + Lazy { + params: Vec, + results: Vec, + }, + FuncType(FuncType), +} + +impl LazyFuncType { + pub(crate) fn force(&mut self, engine: &Engine) -> FuncType { + match self { + LazyFuncType::FuncType(ty) => ty.clone(), + LazyFuncType::Lazy { params, results } => { + let params = mem::take(params); + let results = mem::take(results); + let ty = FuncType::new(engine, params, results); + *self = LazyFuncType::FuncType(ty.clone()); + ty + } + } + } + + fn params(&self) -> impl ExactSizeIterator + '_ { + match self { + LazyFuncType::Lazy { params, .. } => LazyFuncTypeIter::Lazy(params.iter()), + LazyFuncType::FuncType(f) => LazyFuncTypeIter::FuncType(f.params()), + } + } + + fn results(&self) -> impl ExactSizeIterator + '_ { + match self { + LazyFuncType::Lazy { results, .. } => LazyFuncTypeIter::Lazy(results.iter()), + LazyFuncType::FuncType(f) => LazyFuncTypeIter::FuncType(f.results()), + } + } +} + +enum LazyFuncTypeIter<'a, T> { + Lazy(std::slice::Iter<'a, ValType>), + FuncType(T), +} + +impl<'a, T> Iterator for LazyFuncTypeIter<'a, T> +where + T: Iterator, +{ + type Item = ValType; + + fn next(&mut self) -> Option { + match self { + LazyFuncTypeIter::FuncType(i) => i.next(), + LazyFuncTypeIter::Lazy(i) => i.next().cloned(), + } + } + + fn size_hint(&self) -> (usize, Option) { + match self { + LazyFuncTypeIter::FuncType(i) => i.size_hint(), + LazyFuncTypeIter::Lazy(i) => i.size_hint(), + } + } +} + +impl<'a, T> ExactSizeIterator for LazyFuncTypeIter<'a, T> where T: ExactSizeIterator {} + #[derive(Clone)] pub(crate) struct CFuncType { - pub(crate) ty: FuncType, + ty: Arc>, params_cache: OnceCell, returns_cache: OnceCell, } @@ -20,7 +90,15 @@ pub(crate) struct CFuncType { impl wasm_functype_t { pub(crate) fn new(ty: FuncType) -> wasm_functype_t { wasm_functype_t { - ext: wasm_externtype_t::new(ty.into()), + ext: wasm_externtype_t::from_extern_type(ty.into()), + } + } + + pub(crate) fn lazy(params: Vec, results: Vec) -> wasm_functype_t { + wasm_functype_t { + ext: wasm_externtype_t::from_cextern_type(CExternType::Func(CFuncType::lazy( + params, results, + ))), } } @@ -42,11 +120,24 @@ impl wasm_functype_t { impl CFuncType { pub(crate) fn new(ty: FuncType) -> CFuncType { CFuncType { - ty, + ty: Arc::new(Mutex::new(LazyFuncType::FuncType(ty))), params_cache: OnceCell::new(), returns_cache: OnceCell::new(), } } + + pub(crate) fn lazy(params: Vec, results: Vec) -> CFuncType { + CFuncType { + ty: Arc::new(Mutex::new(LazyFuncType::Lazy { params, results })), + params_cache: OnceCell::new(), + returns_cache: OnceCell::new(), + } + } + + pub(crate) fn ty(&self, engine: &Engine) -> FuncType { + let mut ty = self.ty.lock().unwrap(); + ty.force(engine) + } } #[no_mangle] @@ -54,18 +145,25 @@ pub extern "C" fn wasm_functype_new( params: &mut wasm_valtype_vec_t, results: &mut wasm_valtype_vec_t, ) -> Box { - let params = params.take().into_iter().map(|vt| vt.unwrap().ty.clone()); - let results = results.take().into_iter().map(|vt| vt.unwrap().ty.clone()); - let functype = FuncType::new(params, results); - Box::new(wasm_functype_t::new(functype)) + let params = params + .take() + .into_iter() + .map(|vt| vt.unwrap().ty.clone()) + .collect(); + let results = results + .take() + .into_iter() + .map(|vt| vt.unwrap().ty.clone()) + .collect(); + Box::new(wasm_functype_t::lazy(params, results)) } #[no_mangle] pub extern "C" fn wasm_functype_params(ft: &wasm_functype_t) -> &wasm_valtype_vec_t { let ft = ft.ty(); ft.params_cache.get_or_init(|| { - ft.ty - .params() + let ty = ft.ty.lock().unwrap(); + ty.params() .map(|p| Some(Box::new(wasm_valtype_t { ty: p.clone() }))) .collect::>() .into() @@ -76,8 +174,8 @@ pub extern "C" fn wasm_functype_params(ft: &wasm_functype_t) -> &wasm_valtype_ve pub extern "C" fn wasm_functype_results(ft: &wasm_functype_t) -> &wasm_valtype_vec_t { let ft = ft.ty(); ft.returns_cache.get_or_init(|| { - ft.ty - .results() + let ty = ft.ty.lock().unwrap(); + ty.results() .map(|p| Some(Box::new(wasm_valtype_t { ty: p.clone() }))) .collect::>() .into() diff --git a/crates/c-api/src/types/global.rs b/crates/c-api/src/types/global.rs index 9fde1f304dc1..176c41865036 100644 --- a/crates/c-api/src/types/global.rs +++ b/crates/c-api/src/types/global.rs @@ -24,7 +24,7 @@ pub(crate) struct CGlobalType { impl wasm_globaltype_t { pub(crate) fn new(ty: GlobalType) -> wasm_globaltype_t { wasm_globaltype_t { - ext: wasm_externtype_t::new(ty.into()), + ext: wasm_externtype_t::from_extern_type(ty.into()), } } diff --git a/crates/c-api/src/types/import.rs b/crates/c-api/src/types/import.rs index f9e97a287074..9484ab528070 100644 --- a/crates/c-api/src/types/import.rs +++ b/crates/c-api/src/types/import.rs @@ -1,13 +1,12 @@ -use crate::{wasm_externtype_t, wasm_name_t}; +use crate::{wasm_externtype_t, wasm_name_t, CExternType}; use once_cell::unsync::OnceCell; -use wasmtime::ExternType; #[repr(C)] #[derive(Clone)] pub struct wasm_importtype_t { pub(crate) module: String, pub(crate) name: String, - pub(crate) ty: ExternType, + pub(crate) ty: CExternType, module_cache: OnceCell, name_cache: OnceCell, type_cache: OnceCell, @@ -16,7 +15,7 @@ pub struct wasm_importtype_t { wasmtime_c_api_macros::declare_ty!(wasm_importtype_t); impl wasm_importtype_t { - pub(crate) fn new(module: String, name: String, ty: ExternType) -> wasm_importtype_t { + pub(crate) fn new(module: String, name: String, ty: CExternType) -> wasm_importtype_t { wasm_importtype_t { module, name, @@ -38,7 +37,11 @@ pub extern "C" fn wasm_importtype_new( let name = name.take(); let module = String::from_utf8(module).ok()?; let name = String::from_utf8(name).ok()?; - Some(Box::new(wasm_importtype_t::new(module, name, ty.ty()))) + Some(Box::new(wasm_importtype_t::new( + module, + name, + ty.which.clone(), + ))) } #[no_mangle] @@ -56,5 +59,5 @@ pub extern "C" fn wasm_importtype_name(it: &wasm_importtype_t) -> &wasm_name_t { #[no_mangle] pub extern "C" fn wasm_importtype_type(it: &wasm_importtype_t) -> &wasm_externtype_t { it.type_cache - .get_or_init(|| wasm_externtype_t::new(it.ty.clone())) + .get_or_init(|| wasm_externtype_t::from_cextern_type(it.ty.clone())) } diff --git a/crates/c-api/src/types/memory.rs b/crates/c-api/src/types/memory.rs index 45f9a5c19f99..034bea862be6 100644 --- a/crates/c-api/src/types/memory.rs +++ b/crates/c-api/src/types/memory.rs @@ -20,7 +20,7 @@ pub(crate) struct CMemoryType { impl wasm_memorytype_t { pub(crate) fn new(ty: MemoryType) -> wasm_memorytype_t { wasm_memorytype_t { - ext: wasm_externtype_t::new(ty.into()), + ext: wasm_externtype_t::from_extern_type(ty.into()), } } diff --git a/crates/c-api/src/types/table.rs b/crates/c-api/src/types/table.rs index 6599baecd10d..dd8ac097634f 100644 --- a/crates/c-api/src/types/table.rs +++ b/crates/c-api/src/types/table.rs @@ -20,7 +20,7 @@ pub(crate) struct CTableType { impl wasm_tabletype_t { pub(crate) fn new(ty: TableType) -> wasm_tabletype_t { wasm_tabletype_t { - ext: wasm_externtype_t::new(ty.into()), + ext: wasm_externtype_t::from_extern_type(ty.into()), } } diff --git a/crates/c-api/src/wasi.rs b/crates/c-api/src/wasi.rs index 848409bcc866..7061eacc030e 100644 --- a/crates/c-api/src/wasi.rs +++ b/crates/c-api/src/wasi.rs @@ -9,8 +9,8 @@ use std::fs::File; use std::os::raw::{c_char, c_int}; use std::path::{Path, PathBuf}; use std::slice; -use wasi_common::pipe::ReadPipe; -use wasmtime_wasi::{ +use wasi_common::{ + pipe::ReadPipe, sync::{Dir, TcpListener, WasiCtxBuilder}, WasiCtx, }; @@ -100,7 +100,7 @@ impl wasi_config_t { } WasiConfigReadPipe::File(file) => { let file = cap_std::fs::File::from_std(file); - let file = wasi_cap_std_sync::file::File::from_cap_std(file); + let file = wasi_common::sync::file::File::from_cap_std(file); builder.stdin(Box::new(file)); } WasiConfigReadPipe::Bytes(binary) => { @@ -115,7 +115,7 @@ impl wasi_config_t { } WasiConfigWritePipe::File(file) => { let file = cap_std::fs::File::from_std(file); - let file = wasi_cap_std_sync::file::File::from_cap_std(file); + let file = wasi_common::sync::file::File::from_cap_std(file); builder.stdout(Box::new(file)); } }; @@ -126,7 +126,7 @@ impl wasi_config_t { } WasiConfigWritePipe::File(file) => { let file = cap_std::fs::File::from_std(file); - let file = wasi_cap_std_sync::file::File::from_cap_std(file); + let file = wasi_common::sync::file::File::from_cap_std(file); builder.stderr(Box::new(file)); } }; diff --git a/crates/cache/Cargo.toml b/crates/cache/Cargo.toml index 0b72cd6b8828..5156afc3588d 100644 --- a/crates/cache/Cargo.toml +++ b/crates/cache/Cargo.toml @@ -8,6 +8,9 @@ repository = "https://github.com/bytecodealliance/wasmtime" documentation = "https://docs.rs/wasmtime-cache/" edition.workspace = true +[lints] +workspace = true + [dependencies] anyhow = { workspace = true } base64 = "0.21.0" @@ -17,8 +20,8 @@ log = { workspace = true } serde = "1.0.188" serde_derive = "1.0.188" sha2 = "0.10.2" -toml = "0.5.5" -zstd = { version = "0.11.1", default-features = false } +toml = { workspace = true } +zstd = { version = "0.13.0", default-features = false } [target.'cfg(target_os = "windows")'.dependencies.windows-sys] workspace = true diff --git a/crates/cache/src/config.rs b/crates/cache/src/config.rs index d7b8f3d4f019..e0bdc6d45d5e 100644 --- a/crates/cache/src/config.rs +++ b/crates/cache/src/config.rs @@ -407,11 +407,11 @@ impl CacheConfig { match (entity_exists, user_custom_file) { (false, false) => Ok(Self::new_cache_enabled_template()), _ => { - let bytes = fs::read(&config_file).context(format!( + let contents = fs::read_to_string(&config_file).context(format!( "failed to read config file: {}", config_file.display() ))?; - let config = toml::from_slice::(&bytes[..]).context(format!( + let config = toml::from_str::(&contents).context(format!( "failed to parse config file: {}", config_file.display() ))?; diff --git a/crates/cache/src/config/tests.rs b/crates/cache/src/config/tests.rs index 0c1dc873fb69..a845bec682ec 100644 --- a/crates/cache/src/config/tests.rs +++ b/crates/cache/src/config/tests.rs @@ -19,10 +19,7 @@ pub fn test_prolog() -> (TempDir, PathBuf, PathBuf) { macro_rules! load_config { ($config_path:ident, $content_fmt:expr, $cache_dir:ident) => {{ let config_path = &$config_path; - let content = format!( - $content_fmt, - cache_dir = toml::to_string_pretty(&format!("{}", $cache_dir.display())).unwrap() - ); + let content = format!($content_fmt, cache_dir = $cache_dir.display()); fs::write(config_path, content).expect("Failed to write test config file"); CacheConfig::from_file(Some(config_path)).unwrap() }}; @@ -31,10 +28,7 @@ macro_rules! load_config { macro_rules! bad_config { ($config_path:ident, $content_fmt:expr, $cache_dir:ident) => {{ let config_path = &$config_path; - let content = format!( - $content_fmt, - cache_dir = toml::to_string_pretty(&format!("{}", $cache_dir.display())).unwrap() - ); + let content = format!($content_fmt, cache_dir = $cache_dir.display()); fs::write(config_path, content).expect("Failed to write test config file"); assert!(CacheConfig::from_file(Some(config_path)).is_err()); }}; @@ -60,7 +54,7 @@ fn test_unrecognized_settings() { "unrecognized-setting = 42\n\ [cache]\n\ enabled = true\n\ - directory = {cache_dir}", + directory = '{cache_dir}'", cd ); @@ -68,7 +62,7 @@ fn test_unrecognized_settings() { cp, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ unrecognized-setting = 42", cd ); @@ -81,7 +75,7 @@ fn test_all_settings() { cp, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ worker-event-queue-size = '16'\n\ baseline-compression-level = 3\n\ optimized-compression-level = 20\n\ @@ -102,7 +96,7 @@ fn test_all_settings() { // added some white spaces "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ worker-event-queue-size = ' 16\t'\n\ baseline-compression-level = 3\n\ optimized-compression-level =\t 20\n\ @@ -151,7 +145,7 @@ fn test_compression_level_settings() { cp, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ baseline-compression-level = 1\n\ optimized-compression-level = 21", cd @@ -164,7 +158,7 @@ fn test_compression_level_settings() { cp, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ baseline-compression-level = -1\n\ optimized-compression-level = 21", cd @@ -174,7 +168,7 @@ fn test_compression_level_settings() { cp, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ baseline-compression-level = 15\n\ optimized-compression-level = 10", cd @@ -188,7 +182,7 @@ fn test_si_prefix_settings() { cp, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ worker-event-queue-size = '42'\n\ optimized-compression-usage-counter-threshold = '4K'\n\ file-count-soft-limit = '3M'", @@ -203,7 +197,7 @@ fn test_si_prefix_settings() { cp, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ worker-event-queue-size = '2K'\n\ optimized-compression-usage-counter-threshold = '4444T'\n\ file-count-soft-limit = '1P'", @@ -222,7 +216,7 @@ fn test_si_prefix_settings() { cp, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ worker-event-queue-size = '2g'", cd ); @@ -231,7 +225,7 @@ fn test_si_prefix_settings() { cp, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ file-count-soft-limit = 1", cd ); @@ -240,7 +234,7 @@ fn test_si_prefix_settings() { cp, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ file-count-soft-limit = '-31337'", cd ); @@ -249,7 +243,7 @@ fn test_si_prefix_settings() { cp, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ file-count-soft-limit = '3.14M'", cd ); @@ -262,7 +256,7 @@ fn test_disk_space_settings() { cp, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ files-total-size-soft-limit = '76'", cd ); @@ -273,7 +267,7 @@ fn test_disk_space_settings() { cp, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ files-total-size-soft-limit = '42 Mi'", cd ); @@ -284,7 +278,7 @@ fn test_disk_space_settings() { cp, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ files-total-size-soft-limit = '2 Gi'", cd ); @@ -295,7 +289,7 @@ fn test_disk_space_settings() { cp, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ files-total-size-soft-limit = '31337 Ti'", cd ); @@ -306,7 +300,7 @@ fn test_disk_space_settings() { cp, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ files-total-size-soft-limit = '7 Pi'", cd ); @@ -317,7 +311,7 @@ fn test_disk_space_settings() { cp, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ files-total-size-soft-limit = '7M'", cd ); @@ -329,7 +323,7 @@ fn test_disk_space_settings() { cp, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ files-total-size-soft-limit = '7 mi'", cd ); @@ -338,7 +332,7 @@ fn test_disk_space_settings() { cp, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ files-total-size-soft-limit = 1", cd ); @@ -347,7 +341,7 @@ fn test_disk_space_settings() { cp, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ files-total-size-soft-limit = '-31337'", cd ); @@ -356,7 +350,7 @@ fn test_disk_space_settings() { cp, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ files-total-size-soft-limit = '3.14Ki'", cd ); @@ -369,7 +363,7 @@ fn test_duration_settings() { cp, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ cleanup-interval = '100s'\n\ optimizing-compression-task-timeout = '3m'\n\ allowed-clock-drift-for-files-from-future = '4h'", @@ -390,7 +384,7 @@ fn test_duration_settings() { cp, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ cleanup-interval = '2d'\n\ optimizing-compression-task-timeout = '333 m'", cd @@ -410,7 +404,7 @@ fn test_duration_settings() { cp, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ optimizing-compression-task-timeout = '333'", cd ); @@ -419,7 +413,7 @@ fn test_duration_settings() { cp, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ optimizing-compression-task-timeout = 333", cd ); @@ -428,7 +422,7 @@ fn test_duration_settings() { cp, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ optimizing-compression-task-timeout = '10 M'", cd ); @@ -437,7 +431,7 @@ fn test_duration_settings() { cp, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ optimizing-compression-task-timeout = '10 min'", cd ); @@ -446,7 +440,7 @@ fn test_duration_settings() { cp, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ optimizing-compression-task-timeout = '-10s'", cd ); @@ -455,7 +449,7 @@ fn test_duration_settings() { cp, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ optimizing-compression-task-timeout = '1.5m'", cd ); @@ -468,7 +462,7 @@ fn test_percent_settings() { cp, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ file-count-limit-percent-if-deleting = '62%'\n\ files-total-size-limit-percent-if-deleting = '23 %'", cd @@ -482,7 +476,7 @@ fn test_percent_settings() { cp, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ files-total-size-limit-percent-if-deleting = '23'", cd ); @@ -491,7 +485,7 @@ fn test_percent_settings() { cp, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ files-total-size-limit-percent-if-deleting = '22.5%'", cd ); @@ -500,7 +494,7 @@ fn test_percent_settings() { cp, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ files-total-size-limit-percent-if-deleting = '0.5'", cd ); @@ -509,7 +503,7 @@ fn test_percent_settings() { cp, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ files-total-size-limit-percent-if-deleting = '-1%'", cd ); @@ -518,7 +512,7 @@ fn test_percent_settings() { cp, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ files-total-size-limit-percent-if-deleting = '101%'", cd ); diff --git a/crates/cache/src/tests.rs b/crates/cache/src/tests.rs index 4362aaba2222..7866802272df 100644 --- a/crates/cache/src/tests.rs +++ b/crates/cache/src/tests.rs @@ -15,9 +15,9 @@ fn test_cache_init() { let config_content = format!( "[cache]\n\ enabled = true\n\ - directory = {}\n\ + directory = '{}'\n\ baseline-compression-level = {}\n", - toml::to_string_pretty(&format!("{}", cache_dir.display())).unwrap(), + cache_dir.display(), baseline_compression_level, ); fs::write(&config_path, config_content).expect("Failed to write test config file"); @@ -47,7 +47,7 @@ fn test_write_read_cache() { config_path, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ baseline-compression-level = 3\n", cache_dir ); diff --git a/crates/cache/src/worker.rs b/crates/cache/src/worker.rs index 64eff12f3897..5aed7066e93d 100644 --- a/crates/cache/src/worker.rs +++ b/crates/cache/src/worker.rs @@ -728,7 +728,7 @@ impl WorkerThread { } fn read_stats_file(path: &Path) -> Option { - fs::read(path) + fs::read_to_string(path) .map_err(|err| { trace!( "Failed to read stats file, path: {}, err: {}", @@ -736,8 +736,8 @@ fn read_stats_file(path: &Path) -> Option { err ) }) - .and_then(|bytes| { - toml::from_slice::(&bytes[..]).map_err(|err| { + .and_then(|contents| { + toml::from_str::(&contents).map_err(|err| { trace!( "Failed to parse stats file, path: {}, err: {}", path.display(), diff --git a/crates/cache/src/worker/tests.rs b/crates/cache/src/worker/tests.rs index d2652c6c2d28..2ab58f4522d4 100644 --- a/crates/cache/src/worker/tests.rs +++ b/crates/cache/src/worker/tests.rs @@ -15,7 +15,7 @@ fn test_on_get_create_stats_file() { config_path, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}", + directory = '{cache_dir}'", cache_dir ); assert!(cache_config.enabled()); @@ -42,7 +42,7 @@ fn test_on_get_update_usage_counter() { config_path, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ worker-event-queue-size = '16'", cache_dir ); @@ -76,7 +76,7 @@ fn test_on_get_recompress_no_mod_file() { config_path, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ worker-event-queue-size = '16'\n\ baseline-compression-level = 3\n\ optimized-compression-level = 7\n\ @@ -118,7 +118,7 @@ fn test_on_get_recompress_with_mod_file() { config_path, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ worker-event-queue-size = '16'\n\ baseline-compression-level = 3\n\ optimized-compression-level = 7\n\ @@ -193,7 +193,7 @@ fn test_on_get_recompress_lock() { config_path, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ worker-event-queue-size = '16'\n\ baseline-compression-level = 3\n\ optimized-compression-level = 7\n\ @@ -263,7 +263,7 @@ fn test_on_update_fresh_stats_file() { config_path, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ worker-event-queue-size = '16'\n\ baseline-compression-level = 3\n\ optimized-compression-level = 7\n\ @@ -312,7 +312,7 @@ fn test_on_update_cleanup_limits_trash_locks() { config_path, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ worker-event-queue-size = '16'\n\ cleanup-interval = '30m'\n\ optimizing-compression-task-timeout = '30m'\n\ @@ -453,7 +453,7 @@ fn test_on_update_cleanup_lru_policy() { config_path, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ worker-event-queue-size = '16'\n\ file-count-soft-limit = '5'\n\ files-total-size-soft-limit = '30K'\n\ @@ -585,7 +585,7 @@ fn test_on_update_cleanup_future_files() { config_path, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ worker-event-queue-size = '16'\n\ allowed-clock-drift-for-files-from-future = '1d'\n\ file-count-soft-limit = '3'\n\ @@ -693,7 +693,7 @@ fn test_on_update_cleanup_self_lock() { config_path, "[cache]\n\ enabled = true\n\ - directory = {cache_dir}\n\ + directory = '{cache_dir}'\n\ worker-event-queue-size = '16'\n\ cleanup-interval = '30m'\n\ allowed-clock-drift-for-files-from-future = '1d'", diff --git a/crates/cli-flags/Cargo.toml b/crates/cli-flags/Cargo.toml index 249d0e276ca1..67e02dbe9bf3 100644 --- a/crates/cli-flags/Cargo.toml +++ b/crates/cli-flags/Cargo.toml @@ -8,6 +8,9 @@ repository = "https://github.com/bytecodealliance/wasmtime" documentation = "https://docs.rs/wasmtime-cache/" edition.workspace = true +[lints] +workspace = true + [dependencies] anyhow = { workspace = true } clap = { workspace = true } diff --git a/crates/cli-flags/src/lib.rs b/crates/cli-flags/src/lib.rs index d785435b6c02..199a4f0825ab 100644 --- a/crates/cli-flags/src/lib.rs +++ b/crates/cli-flags/src/lib.rs @@ -1,8 +1,5 @@ //! Contains the common Wasmtime command line interface (CLI) flags. -#![deny(trivial_numeric_casts, unused_extern_crates, unstable_features)] -#![warn(unused_import_braces)] - use anyhow::Result; use clap::Parser; use std::time::Duration; @@ -73,6 +70,10 @@ wasmtime_option_group! { /// pooling allocator in tables. pub pooling_table_keep_resident: Option, + /// Enable memory protection keys for the pooling allocator; this can + /// optimize the size of memory slots. + pub memory_protection_keys: Option, + /// Configure attempting to initialize linear memory via a /// copy-on-write mapping (default: yes) pub memory_init_cow: Option, @@ -262,7 +263,12 @@ wasmtime_option_group! { pub inherit_network: Option, /// Indicates whether `wasi:sockets/ip-name-lookup` is enabled or not. pub allow_ip_name_lookup: Option, - + /// Indicates whether `wasi:sockets` TCP support is enabled or not. + pub tcp: Option, + /// Indicates whether `wasi:sockets` UDP support is enabled or not. + pub udp: Option, + /// Allows imports from the `wasi_unstable` core wasm module. + pub preview0: Option, } enum Wasi { @@ -288,39 +294,39 @@ pub struct CommonOptions { // now. /// Optimization and tuning related options for wasm performance, `-O help` to /// see all. - #[clap(short = 'O', long = "optimize", value_name = "KEY[=VAL[,..]]")] + #[arg(short = 'O', long = "optimize", value_name = "KEY[=VAL[,..]]")] opts_raw: Vec>, /// Codegen-related configuration options, `-C help` to see all. - #[clap(short = 'C', long = "codegen", value_name = "KEY[=VAL[,..]]")] + #[arg(short = 'C', long = "codegen", value_name = "KEY[=VAL[,..]]")] codegen_raw: Vec>, /// Debug-related configuration options, `-D help` to see all. - #[clap(short = 'D', long = "debug", value_name = "KEY[=VAL[,..]]")] + #[arg(short = 'D', long = "debug", value_name = "KEY[=VAL[,..]]")] debug_raw: Vec>, /// Options for configuring semantic execution of WebAssembly, `-W help` to see /// all. - #[clap(short = 'W', long = "wasm", value_name = "KEY[=VAL[,..]]")] + #[arg(short = 'W', long = "wasm", value_name = "KEY[=VAL[,..]]")] wasm_raw: Vec>, /// Options for configuring WASI and its proposals, `-S help` to see all. - #[clap(short = 'S', long = "wasi", value_name = "KEY[=VAL[,..]]")] + #[arg(short = 'S', long = "wasi", value_name = "KEY[=VAL[,..]]")] wasi_raw: Vec>, // These fields are filled in by the `configure` method below via the // options parsed from the CLI above. This is what the CLI should use. - #[clap(skip)] + #[arg(skip)] configured: bool, - #[clap(skip)] + #[arg(skip)] pub opts: OptimizeOptions, - #[clap(skip)] + #[arg(skip)] pub codegen: CodegenOptions, - #[clap(skip)] + #[arg(skip)] pub debug: DebugOptions, - #[clap(skip)] + #[arg(skip)] pub wasm: WasmOptions, - #[clap(skip)] + #[arg(skip)] pub wasi: WasiOptions, } @@ -515,12 +521,23 @@ impl CommonOptions { if let Some(size) = self.opts.pooling_table_keep_resident { cfg.table_keep_resident(size); } + if let Some(enable) = self.opts.memory_protection_keys { + if enable { + cfg.memory_protection_keys(wasmtime::MpkEnabled::Enable); + } + } config.allocation_strategy(wasmtime::InstanceAllocationStrategy::Pooling(cfg)); } }, true => err, } + if self.opts.memory_protection_keys.unwrap_or(false) + && !self.opts.pooling_allocator.unwrap_or(false) + { + anyhow::bail!("memory protection keys require the pooling allocator"); + } + if let Some(max) = self.wasm.max_wasm_stack { config.max_wasm_stack(max); } diff --git a/crates/component-macro/Cargo.toml b/crates/component-macro/Cargo.toml index 069a560f5bb3..672279140c59 100644 --- a/crates/component-macro/Cargo.toml +++ b/crates/component-macro/Cargo.toml @@ -10,6 +10,9 @@ categories = ["wasm"] keywords = ["webassembly", "wasm"] edition.workspace = true +[lints] +workspace = true + [lib] proc-macro = true test = false diff --git a/crates/component-macro/build.rs b/crates/component-macro/build.rs new file mode 100644 index 000000000000..be0ad5bc97cb --- /dev/null +++ b/crates/component-macro/build.rs @@ -0,0 +1,5 @@ +fn main() { + println!("cargo:rerun-if-changed=build.rs"); + let out_dir = std::env::var("OUT_DIR").unwrap(); + println!("cargo:rustc-env=DEBUG_OUTPUT_DIR={out_dir}"); +} diff --git a/crates/component-macro/src/bindgen.rs b/crates/component-macro/src/bindgen.rs index a508d1e99483..5bfd968b3044 100644 --- a/crates/component-macro/src/bindgen.rs +++ b/crates/component-macro/src/bindgen.rs @@ -3,6 +3,7 @@ use quote::ToTokens; use std::collections::HashMap; use std::collections::HashSet; use std::path::{Path, PathBuf}; +use std::sync::atomic::{AtomicUsize, Ordering::Relaxed}; use syn::parse::{Error, Parse, ParseStream, Result}; use syn::punctuated::Punctuated; use syn::{braced, token, Token}; @@ -24,7 +25,31 @@ pub fn expand(input: &Config) -> Result { )); } - let src = input.opts.generate(&input.resolve, input.world); + let mut src = input.opts.generate(&input.resolve, input.world); + + // If a magical `WASMTIME_DEBUG_BINDGEN` environment variable is set then + // place a formatted version of the expanded code into a file. This file + // will then show up in rustc error messages for any codegen issues and can + // be inspected manually. + if std::env::var("WASMTIME_DEBUG_BINDGEN").is_ok() { + static INVOCATION: AtomicUsize = AtomicUsize::new(0); + let root = Path::new(env!("DEBUG_OUTPUT_DIR")); + let world_name = &input.resolve.worlds[input.world].name; + let n = INVOCATION.fetch_add(1, Relaxed); + let path = root.join(format!("{world_name}{n}.rs")); + + std::fs::write(&path, &src).unwrap(); + + // optimistically format the code but don't require success + drop( + std::process::Command::new("rustfmt") + .arg(&path) + .arg("--edition=2021") + .output(), + ); + + src = format!("include!({path:?});"); + } let mut contents = src.parse::().unwrap(); // Include a dummy `include_str!` for any files we read so rustc knows that @@ -141,25 +166,19 @@ fn parse_source( let root = PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").unwrap()); let mut parse = |resolve: &mut Resolve, path: &Path| -> anyhow::Result<_> { - if path.is_dir() { - let (pkg, sources) = resolve.push_dir(path)?; - files = sources; - Ok(pkg) - } else { - let pkg = UnresolvedPackage::parse_file(path)?; - files.extend(pkg.source_files().map(|s| s.to_owned())); - resolve.push(pkg) - } + let (pkg, sources) = resolve.push_path(path)?; + files.extend(sources); + Ok(pkg) }; let path_pkg = if let Some(path) = path { - Some(parse(&mut resolve, &root.join(&path))?) + Some(parse(&mut resolve, &root.join(path))?) } else { None }; let inline_pkg = if let Some(inline) = inline { - Some(resolve.push(UnresolvedPackage::parse("macro-input".as_ref(), &inline)?)?) + Some(resolve.push(UnresolvedPackage::parse("macro-input".as_ref(), inline)?)?) } else { None }; @@ -298,7 +317,7 @@ impl Parse for Opt { let _lbrace = braced!(contents in input); let fields: Punctuated<_, Token![,]> = contents.parse_terminated(trappable_error_field_parse, Token![,])?; - Ok(Opt::TrappableErrorType(Vec::from_iter(fields.into_iter()))) + Ok(Opt::TrappableErrorType(Vec::from_iter(fields))) } else if l.peek(kw::interfaces) { input.parse::()?; input.parse::()?; @@ -310,7 +329,7 @@ impl Parse for Opt { let _lbrace = braced!(contents in input); let fields: Punctuated<(String, String), Token![,]> = contents.parse_terminated(with_field_parse, Token![,])?; - Ok(Opt::With(HashMap::from_iter(fields.into_iter()))) + Ok(Opt::With(HashMap::from_iter(fields))) } else { Err(l.error()) } diff --git a/crates/component-macro/test-helpers/Cargo.toml b/crates/component-macro/test-helpers/Cargo.toml index 6a56a77dc0ab..da543c9190e7 100644 --- a/crates/component-macro/test-helpers/Cargo.toml +++ b/crates/component-macro/test-helpers/Cargo.toml @@ -5,6 +5,9 @@ edition.workspace = true publish = false license = "Apache-2.0 WITH LLVM-exception" +[lints] +workspace = true + [lib] proc-macro = true test = false diff --git a/crates/component-macro/tests/codegen.rs b/crates/component-macro/tests/codegen.rs index 66f9fb1c26bb..c7fb0f51a72d 100644 --- a/crates/component-macro/tests/codegen.rs +++ b/crates/component-macro/tests/codegen.rs @@ -148,3 +148,17 @@ mod trappable_errors { #[allow(dead_code)] type MyX = u32; } + +mod interface_name_with_rust_keyword { + wasmtime::component::bindgen!({ + inline: " + package foo:foo; + + interface crate { } + + world foo { + export crate; + } + " + }); +} diff --git a/crates/component-macro/tests/codegen/multiversion/root.wit b/crates/component-macro/tests/codegen/multiversion/root.wit index 52225f02beb3..b3bb3c80d3da 100644 --- a/crates/component-macro/tests/codegen/multiversion/root.wit +++ b/crates/component-macro/tests/codegen/multiversion/root.wit @@ -3,5 +3,6 @@ package foo:bar; world foo { import my:dep/a@0.1.0; import my:dep/a@0.2.0; + export my:dep/a@0.1.0; export my:dep/a@0.2.0; } diff --git a/crates/component-macro/tests/codegen/wat.wit b/crates/component-macro/tests/codegen/wat.wit new file mode 100644 index 000000000000..cba93e0d4fd8 --- /dev/null +++ b/crates/component-macro/tests/codegen/wat.wit @@ -0,0 +1,10 @@ +package same:name; + +interface this-name-is-duplicated { + resource this-name-is-duplicated { + } +} + +world example { + export this-name-is-duplicated; +} diff --git a/crates/cranelift-shared/Cargo.toml b/crates/cranelift-shared/Cargo.toml index 78446e42add7..5c2bf264372c 100644 --- a/crates/cranelift-shared/Cargo.toml +++ b/crates/cranelift-shared/Cargo.toml @@ -8,6 +8,9 @@ repository = "https://github.com/bytecodealliance/wasmtime" documentation = "https://docs.rs/wasmtime-cranelift-shared/" edition.workspace = true +[lints] +workspace = true + [dependencies] anyhow = { workspace = true } wasmtime-environ = { workspace = true } diff --git a/crates/cranelift-shared/src/isa_builder.rs b/crates/cranelift-shared/src/isa_builder.rs index ad16bb8e8591..94c241be22fe 100644 --- a/crates/cranelift-shared/src/isa_builder.rs +++ b/crates/cranelift-shared/src/isa_builder.rs @@ -20,7 +20,7 @@ pub struct IsaBuilder { impl IsaBuilder { /// Create a new ISA builder with the given lookup function. - pub fn new(lookup: fn(Triple) -> Result>) -> Self { + pub fn new(triple: Option, lookup: fn(Triple) -> Result>) -> Result { let mut flags = settings::builder(); // We don't use probestack as a stack limit mechanism @@ -28,14 +28,15 @@ impl IsaBuilder { .set("enable_probestack", "false") .expect("should be valid flag"); - let mut isa_flags = lookup(Triple::host()).expect("host machine is not a supported target"); + let triple = triple.unwrap_or_else(Triple::host); + let mut isa_flags = lookup(triple)?; cranelift_native::infer_native_flags(&mut isa_flags).unwrap(); - Self { + Ok(Self { shared_flags: flags, inner: isa_flags, lookup, - } + }) } pub fn triple(&self) -> &target_lexicon::Triple { diff --git a/crates/cranelift/Cargo.toml b/crates/cranelift/Cargo.toml index 1ef91e7f5e7d..cde0d4e711f5 100644 --- a/crates/cranelift/Cargo.toml +++ b/crates/cranelift/Cargo.toml @@ -10,12 +10,15 @@ categories = ["wasm"] keywords = ["webassembly", "wasm"] edition.workspace = true +[lints] +workspace = true + [dependencies] anyhow = { workspace = true } log = { workspace = true } wasmtime-environ = { workspace = true } cranelift-wasm = { workspace = true } -cranelift-codegen = { workspace = true, features = ["default"] } +cranelift-codegen = { workspace = true, features = ["host-arch"] } cranelift-frontend = { workspace = true } cranelift-entity = { workspace = true } cranelift-native = { workspace = true } @@ -31,6 +34,7 @@ wasmtime-versioned-export-macros = { workspace = true } [features] all-arch = ["cranelift-codegen/all-arch"] +host-arch = ["cranelift-codegen/host-arch"] component-model = ["wasmtime-environ/component-model"] incremental-cache = ["cranelift-codegen/incremental-cache"] wmemcheck = [] diff --git a/crates/cranelift/src/builder.rs b/crates/cranelift/src/builder.rs index b2c86107cb7c..2c85832376ba 100644 --- a/crates/cranelift/src/builder.rs +++ b/crates/cranelift/src/builder.rs @@ -11,11 +11,12 @@ use cranelift_codegen::{ use std::fmt; use std::path; use std::sync::Arc; +use target_lexicon::Triple; use wasmtime_cranelift_shared::isa_builder::IsaBuilder; use wasmtime_environ::{CacheStore, CompilerBuilder, Setting, Tunables}; struct Builder { - tunables: Tunables, + tunables: Option, inner: IsaBuilder>, linkopts: LinkOptions, cache_store: Option>, @@ -36,15 +37,15 @@ pub struct LinkOptions { pub force_jump_veneers: bool, } -pub fn builder() -> Box { - Box::new(Builder { - tunables: Tunables::default(), - inner: IsaBuilder::new(|triple| isa::lookup(triple).map_err(|e| e.into())), +pub fn builder(triple: Option) -> Result> { + Ok(Box::new(Builder { + tunables: None, + inner: IsaBuilder::new(triple, |triple| isa::lookup(triple).map_err(|e| e.into()))?, linkopts: LinkOptions::default(), cache_store: None, clif_dir: None, wmemcheck: false, - }) + })) } impl CompilerBuilder for Builder { @@ -81,14 +82,17 @@ impl CompilerBuilder for Builder { } fn set_tunables(&mut self, tunables: Tunables) -> Result<()> { - self.tunables = tunables; + self.tunables = Some(tunables); Ok(()) } fn build(&self) -> Result> { let isa = self.inner.build()?; Ok(Box::new(crate::compiler::Compiler::new( - self.tunables.clone(), + self.tunables + .as_ref() + .expect("set_tunables not called") + .clone(), isa, self.cache_store.clone(), self.linkopts.clone(), diff --git a/crates/cranelift/src/compiler.rs b/crates/cranelift/src/compiler.rs index 7a0f038daddf..9b396a88b517 100644 --- a/crates/cranelift/src/compiler.rs +++ b/crates/cranelift/src/compiler.rs @@ -17,7 +17,7 @@ use cranelift_entity::{EntityRef, PrimaryMap}; use cranelift_frontend::FunctionBuilder; use cranelift_wasm::{ DefinedFuncIndex, FuncIndex, FuncTranslator, MemoryIndex, OwnedMemoryIndex, WasmFuncType, - WasmType, + WasmValType, }; use object::write::{Object, StandardSegment, SymbolId}; use object::{RelocationEncoding, RelocationKind, SectionKind}; @@ -32,8 +32,8 @@ use wasmparser::{FuncValidatorAllocations, FunctionBody}; use wasmtime_cranelift_shared::{CompiledFunction, ModuleTextBuilder}; use wasmtime_environ::{ AddressMapSection, CacheStore, CompileError, FlagValue, FunctionBodyData, FunctionLoc, - ModuleTranslation, ModuleTypes, PtrSize, StackMapInformation, TrapEncodingBuilder, Tunables, - VMOffsets, WasmFunctionInfo, + ModuleTranslation, ModuleTypesBuilder, PtrSize, StackMapInformation, TrapEncodingBuilder, + Tunables, VMOffsets, WasmFunctionInfo, }; #[cfg(feature = "component-model")] @@ -131,7 +131,7 @@ impl wasmtime_environ::Compiler for Compiler { translation: &ModuleTranslation<'_>, func_index: DefinedFuncIndex, input: FunctionBodyData<'_>, - types: &ModuleTypes, + types: &ModuleTypesBuilder, ) -> Result<(WasmFunctionInfo, Box), CompileError> { let isa = &*self.isa; let module = &translation.module; @@ -240,7 +240,7 @@ impl wasmtime_environ::Compiler for Compiler { fn compile_array_to_wasm_trampoline( &self, translation: &ModuleTranslation<'_>, - types: &ModuleTypes, + types: &ModuleTypesBuilder, def_func_index: DefinedFuncIndex, ) -> Result, CompileError> { let func_index = translation.module.func_index(def_func_index); @@ -308,7 +308,7 @@ impl wasmtime_environ::Compiler for Compiler { fn compile_native_to_wasm_trampoline( &self, translation: &ModuleTranslation<'_>, - types: &ModuleTypes, + types: &ModuleTypesBuilder, def_func_index: DefinedFuncIndex, ) -> Result, CompileError> { let func_index = translation.module.func_index(def_func_index); @@ -893,7 +893,7 @@ impl Compiler { fn store_values_to_array( &self, builder: &mut FunctionBuilder, - types: &[WasmType], + types: &[WasmValType], values: &[Value], values_vec_ptr: Value, values_vec_capacity: Value, @@ -925,7 +925,7 @@ impl Compiler { /// function that uses the array calling convention. fn load_values_from_array( &self, - types: &[WasmType], + types: &[WasmValType], builder: &mut FunctionBuilder, values_vec_ptr: Value, values_vec_capacity: Value, @@ -1266,10 +1266,10 @@ impl NativeRet { let mut max_align = 1; for ty in other[1..].iter() { let size = match ty { - WasmType::I32 | WasmType::F32 => 4, - WasmType::I64 | WasmType::F64 => 8, - WasmType::Ref(_) => pointer_type.bytes(), - WasmType::V128 => 16, + WasmValType::I32 | WasmValType::F32 => 4, + WasmValType::I64 | WasmValType::F64 => 8, + WasmValType::Ref(_) => pointer_type.bytes(), + WasmValType::V128 => 16, }; offset = align_to(offset, size); offsets.push(offset); diff --git a/crates/cranelift/src/compiler/component.rs b/crates/cranelift/src/compiler/component.rs index e914d8a26805..61c6d2905055 100644 --- a/crates/cranelift/src/compiler/component.rs +++ b/crates/cranelift/src/compiler/component.rs @@ -5,21 +5,22 @@ use anyhow::Result; use cranelift_codegen::ir::{self, InstBuilder, MemFlags}; use cranelift_codegen::isa::{CallConv, TargetIsa}; use cranelift_frontend::FunctionBuilder; +use cranelift_wasm::ModuleInternedTypeIndex; use std::any::Any; use wasmtime_cranelift_shared::{ALWAYS_TRAP_CODE, CANNOT_ENTER_CODE}; use wasmtime_environ::component::*; -use wasmtime_environ::{PtrSize, SignatureIndex, WasmType}; +use wasmtime_environ::{PtrSize, WasmValType}; struct TrampolineCompiler<'a> { compiler: &'a Compiler, isa: &'a (dyn TargetIsa + 'static), builder: FunctionBuilder<'a>, component: &'a Component, - types: &'a ComponentTypes, + types: &'a ComponentTypesBuilder, offsets: VMComponentOffsets, abi: Abi, block0: ir::Block, - signature: SignatureIndex, + signature: ModuleInternedTypeIndex, } #[derive(Copy, Clone)] @@ -34,7 +35,7 @@ impl<'a> TrampolineCompiler<'a> { compiler: &'a Compiler, func_compiler: &'a mut super::FunctionCompiler<'_>, component: &'a Component, - types: &'a ComponentTypes, + types: &'a ComponentTypesBuilder, index: TrampolineIndex, abi: Abi, ) -> TrampolineCompiler<'a> { @@ -288,7 +289,7 @@ impl<'a> TrampolineCompiler<'a> { host_args.push(args[2]); // Currently this only support resources represented by `i32` - assert_eq!(self.types[self.signature].params()[0], WasmType::I32); + assert_eq!(self.types[self.signature].params()[0], WasmValType::I32); let (host_sig, offset) = host::resource_new32(self.isa, &mut self.builder.func); let host_fn = self.load_libcall(vmctx, offset); @@ -319,7 +320,7 @@ impl<'a> TrampolineCompiler<'a> { host_args.push(args[2]); // Currently this only support resources represented by `i32` - assert_eq!(self.types[self.signature].returns()[0], WasmType::I32); + assert_eq!(self.types[self.signature].returns()[0], WasmValType::I32); let (host_sig, offset) = host::resource_rep32(self.isa, &mut self.builder.func); let host_fn = self.load_libcall(vmctx, offset); @@ -625,7 +626,7 @@ impl ComponentCompiler for Compiler { fn compile_trampoline( &self, component: &ComponentTranslation, - types: &ComponentTypes, + types: &ComponentTypesBuilder, index: TrampolineIndex, ) -> Result>> { let compile = |abi: Abi| -> Result<_> { diff --git a/crates/cranelift/src/debug/transform/attr.rs b/crates/cranelift/src/debug/transform/attr.rs index 13bf62e9fba8..354bcdacef84 100644 --- a/crates/cranelift/src/debug/transform/attr.rs +++ b/crates/cranelift/src/debug/transform/attr.rs @@ -95,7 +95,7 @@ where let addr = addr_tr.translate(u).unwrap_or(write::Address::Constant(0)); write::AttributeValue::Address(addr) } - AttributeValue::Block(d) => write::AttributeValue::Block(d.to_slice()?.to_vec()), + AttributeValue::Block(d) => write::AttributeValue::Block(d.to_slice()?.into_owned()), AttributeValue::Udata(u) => write::AttributeValue::Udata(u), AttributeValue::Data1(d) => write::AttributeValue::Data1(d), AttributeValue::Data2(d) => write::AttributeValue::Data2(d), @@ -295,6 +295,7 @@ where pending_di_refs.insert(current_scope_id, attr.name(), offset); continue; } + AttributeValue::String(d) => write::AttributeValue::String(d.to_slice()?.into_owned()), a => bail!("Unexpected attribute: {:?}", a), }; let current_scope = out_unit.get_mut(current_scope_id); diff --git a/crates/cranelift/src/debug/transform/expression.rs b/crates/cranelift/src/debug/transform/expression.rs index aae55791c4bc..241f2907053d 100644 --- a/crates/cranelift/src/debug/transform/expression.rs +++ b/crates/cranelift/src/debug/transform/expression.rs @@ -1,3 +1,5 @@ +#![allow(trivial_numeric_casts)] + use super::address_transform::AddressTransform; use crate::debug::ModuleMemoryOffset; use anyhow::{Context, Error, Result}; diff --git a/crates/cranelift/src/debug/transform/line_program.rs b/crates/cranelift/src/debug/transform/line_program.rs index 52d20ead62bc..8eb068e10f44 100644 --- a/crates/cranelift/src/debug/transform/line_program.rs +++ b/crates/cranelift/src/debug/transform/line_program.rs @@ -23,7 +23,7 @@ enum SavedLineProgramRow { epilogue_begin: bool, isa: u64, }, - EndOfSequence(u64), + EndOfSequence, } #[derive(Debug)] @@ -167,7 +167,7 @@ where saved_rows = Vec::new(); state = ReadLineProgramState::SequenceEnded; - SavedLineProgramRow::EndOfSequence(row.address()) + SavedLineProgramRow::EndOfSequence } else { if state == ReadLineProgramState::SequenceEnded { // Discard sequences for non-existent code. diff --git a/crates/cranelift/src/debug/transform/simulate.rs b/crates/cranelift/src/debug/transform/simulate.rs index df06268d86cc..5ff7fabee16d 100644 --- a/crates/cranelift/src/debug/transform/simulate.rs +++ b/crates/cranelift/src/debug/transform/simulate.rs @@ -12,7 +12,8 @@ use std::collections::{HashMap, HashSet}; use std::path::PathBuf; use std::sync::atomic::{AtomicUsize, Ordering::SeqCst}; use wasmtime_environ::{ - DebugInfoData, DefinedFuncIndex, EntityRef, FuncIndex, FunctionMetadata, WasmFileInfo, WasmType, + DebugInfoData, DefinedFuncIndex, EntityRef, FuncIndex, FunctionMetadata, WasmFileInfo, + WasmValType, }; const PRODUCER_NAME: &str = "wasmtime"; @@ -70,7 +71,7 @@ fn generate_line_info( out_program.row().address_offset = address_offset; out_program.row().op_index = 0; out_program.row().file = file_index; - let wasm_offset = w.code_section_offset + addr_map.wasm as u64; + let wasm_offset = w.code_section_offset + addr_map.wasm; out_program.row().line = wasm_offset; out_program.row().column = 0; out_program.row().discriminator = 1; @@ -173,10 +174,10 @@ fn resolve_var_type( (func_meta.locals[j].1, false) }; let type_die_id = match ty { - WasmType::I32 => wasm_types.i32, - WasmType::I64 => wasm_types.i64, - WasmType::F32 => wasm_types.f32, - WasmType::F64 => wasm_types.f64, + WasmValType::I32 => wasm_types.i32, + WasmValType::I64 => wasm_types.i64, + WasmValType::F32 => wasm_types.f32, + WasmValType::F64 => wasm_types.f64, _ => { // Ignore unsupported types. return None; @@ -363,7 +364,7 @@ pub fn generate_simulated_dwarf( ); die.set( gimli::DW_AT_high_pc, - write::AttributeValue::Udata((end - start) as u64), + write::AttributeValue::Udata(end - start), ); let func_index = imported_func_count + (index as u32); @@ -383,7 +384,7 @@ pub fn generate_simulated_dwarf( ); let f_start = map.addresses[0].wasm; - let wasm_offset = di.wasm_file.code_section_offset + f_start as u64; + let wasm_offset = di.wasm_file.code_section_offset + f_start; die.set( gimli::DW_AT_decl_file, write::AttributeValue::Udata(wasm_offset), diff --git a/crates/cranelift/src/func_environ.rs b/crates/cranelift/src/func_environ.rs index 0a52276ebee5..cb695cdab044 100644 --- a/crates/cranelift/src/func_environ.rs +++ b/crates/cranelift/src/func_environ.rs @@ -15,14 +15,14 @@ use cranelift_frontend::Variable; use cranelift_wasm::{ self, FuncIndex, FuncTranslationState, GlobalIndex, GlobalVariable, Heap, HeapData, HeapStyle, MemoryIndex, TableIndex, TargetEnvironment, TypeIndex, WasmHeapType, WasmRefType, WasmResult, - WasmType, + WasmValType, }; use std::convert::TryFrom; use std::mem; use wasmparser::Operator; use wasmtime_environ::{ - BuiltinFunctionIndex, MemoryPlan, MemoryStyle, Module, ModuleTranslation, ModuleTypes, PtrSize, - TableStyle, Tunables, TypeConvert, VMOffsets, WASM_PAGE_SIZE, + BuiltinFunctionIndex, MemoryPlan, MemoryStyle, Module, ModuleTranslation, ModuleTypesBuilder, + PtrSize, TableStyle, Tunables, TypeConvert, VMOffsets, WASM_PAGE_SIZE, }; use wasmtime_environ::{FUNCREF_INIT_BIT, FUNCREF_MASK}; @@ -112,7 +112,7 @@ wasmtime_environ::foreach_builtin_function!(declare_function_signatures); pub struct FuncEnvironment<'module_environment> { isa: &'module_environment (dyn TargetIsa + 'module_environment), module: &'module_environment Module, - types: &'module_environment ModuleTypes, + types: &'module_environment ModuleTypesBuilder, translation: &'module_environment ModuleTranslation<'module_environment>, @@ -169,7 +169,7 @@ impl<'module_environment> FuncEnvironment<'module_environment> { pub fn new( isa: &'module_environment (dyn TargetIsa + 'module_environment), translation: &'module_environment ModuleTranslation<'module_environment>, - types: &'module_environment ModuleTypes, + types: &'module_environment ModuleTypesBuilder, tunables: &'module_environment Tunables, wmemcheck: bool, ) -> Self { @@ -870,10 +870,12 @@ impl<'module_environment> FuncEnvironment<'module_environment> { let value = builder.ins().load(pointer_type, flags, table_entry_addr, 0); // Mask off the "initialized bit". See documentation on // FUNCREF_INIT_BIT in crates/environ/src/ref_bits.rs for more - // details. - let value_masked = builder - .ins() - .band_imm(value, Imm64::from(FUNCREF_MASK as i64)); + // details. Note that `FUNCREF_MASK` has type `usize` which may not be + // appropriate for the target architecture. Right now its value is + // always -2 so assert that part doesn't change and then thread through + // -2 as the immediate. + assert_eq!(FUNCREF_MASK as isize, -2); + let value_masked = builder.ins().band_imm(value, Imm64::from(-2)); let null_block = builder.create_block(); let continuation_block = builder.create_block(); @@ -1067,7 +1069,7 @@ impl<'a, 'func, 'module_env> Call<'a, 'func, 'module_env> { // If necessary, check the signature. match self.env.module.table_plans[table_index].style { TableStyle::CallerChecksSignature => { - let sig_id_size = self.env.offsets.size_of_vmshared_signature_index(); + let sig_id_size = self.env.offsets.size_of_vmshared_type_index(); let sig_id_type = Type::int(u16::from(sig_id_size) * 8).unwrap(); let vmctx = self.env.vmctx(self.builder.func); let base = self.builder.ins().global_value(pointer_type, vmctx); @@ -1080,7 +1082,7 @@ impl<'a, 'func, 'module_env> Call<'a, 'func, 'module_env> { pointer_type, mem_flags, base, - i32::try_from(self.env.offsets.vmctx_signature_ids_array()).unwrap(), + i32::try_from(self.env.offsets.vmctx_type_ids_array()).unwrap(), ); let sig_index = self.env.module.types[ty_index].unwrap_function(); let offset = @@ -1204,8 +1206,12 @@ impl<'a, 'func, 'module_env> Call<'a, 'func, 'module_env> { } impl TypeConvert for FuncEnvironment<'_> { - fn lookup_heap_type(&self, ty: TypeIndex) -> WasmHeapType { - self.module.lookup_heap_type(ty) + fn lookup_heap_type(&self, ty: wasmparser::UnpackedIndex) -> WasmHeapType { + wasmtime_environ::WasmparserTypeConverter { + module: self.module, + types: self.types, + } + .lookup_heap_type(ty) } } @@ -1314,7 +1320,7 @@ impl<'module_environment> cranelift_wasm::FuncEnvironment for FuncEnvironment<'m ) -> WasmResult { let (func_idx, func_sig) = match self.module.table_plans[table_index].table.wasm_ty.heap_type { - WasmHeapType::Func | WasmHeapType::TypedFunc(_) => ( + WasmHeapType::Func | WasmHeapType::Concrete(_) => ( BuiltinFunctionIndex::table_grow_func_ref(), self.builtin_function_signatures .table_grow_func_ref(&mut pos.func), @@ -1349,7 +1355,7 @@ impl<'module_environment> cranelift_wasm::FuncEnvironment for FuncEnvironment<'m let plan = &self.module.table_plans[table_index]; match plan.table.wasm_ty.heap_type { - WasmHeapType::Func | WasmHeapType::TypedFunc(_) => match plan.style { + WasmHeapType::Func | WasmHeapType::Concrete(_) => match plan.style { TableStyle::CallerChecksSignature => { Ok(self.get_or_init_func_ref_table_elem(builder, table_index, table, index)) } @@ -1484,7 +1490,7 @@ impl<'module_environment> cranelift_wasm::FuncEnvironment for FuncEnvironment<'m let pointer_type = self.pointer_type(); let plan = &self.module.table_plans[table_index]; match plan.table.wasm_ty.heap_type { - WasmHeapType::Func | WasmHeapType::TypedFunc(_) => match plan.style { + WasmHeapType::Func | WasmHeapType::Concrete(_) => match plan.style { TableStyle::CallerChecksSignature => { let table_entry_addr = builder.ins().table_addr(pointer_type, table, index, 0); // Set the "initialized bit". See doc-comment on @@ -1644,7 +1650,7 @@ impl<'module_environment> cranelift_wasm::FuncEnvironment for FuncEnvironment<'m ) -> WasmResult<()> { let (builtin_idx, builtin_sig) = match self.module.table_plans[table_index].table.wasm_ty.heap_type { - WasmHeapType::Func | WasmHeapType::TypedFunc(_) => ( + WasmHeapType::Func | WasmHeapType::Concrete(_) => ( BuiltinFunctionIndex::table_fill_func_ref(), self.builtin_function_signatures .table_fill_func_ref(&mut pos.func), @@ -1675,7 +1681,7 @@ impl<'module_environment> cranelift_wasm::FuncEnvironment for FuncEnvironment<'m ht: WasmHeapType, ) -> WasmResult { Ok(match ht { - WasmHeapType::Func | WasmHeapType::TypedFunc(_) => { + WasmHeapType::Func | WasmHeapType::Concrete(_) => { pos.ins().iconst(self.pointer_type(), 0) } WasmHeapType::Extern => pos.ins().null(self.reference_type(ht)), @@ -1725,7 +1731,7 @@ impl<'module_environment> cranelift_wasm::FuncEnvironment for FuncEnvironment<'m ) -> WasmResult { debug_assert_eq!( self.module.globals[index].wasm_ty, - WasmType::Ref(WasmRefType::EXTERNREF), + WasmValType::Ref(WasmRefType::EXTERNREF), "We only use GlobalVariable::Custom for externref" ); @@ -1753,7 +1759,7 @@ impl<'module_environment> cranelift_wasm::FuncEnvironment for FuncEnvironment<'m ) -> WasmResult<()> { debug_assert_eq!( self.module.globals[index].wasm_ty, - WasmType::Ref(WasmRefType::EXTERNREF), + WasmValType::Ref(WasmRefType::EXTERNREF), "We only use GlobalVariable::Custom for externref" ); @@ -2018,7 +2024,7 @@ impl<'module_environment> cranelift_wasm::FuncEnvironment for FuncEnvironment<'m // `GlobalVariable::Custom`, as that is the only kind of // `GlobalVariable` for which `cranelift-wasm` supports custom // access translation. - WasmType::Ref(WasmRefType { + WasmValType::Ref(WasmRefType { heap_type: WasmHeapType::Extern, .. }) => return Ok(GlobalVariable::Custom), @@ -2026,14 +2032,18 @@ impl<'module_environment> cranelift_wasm::FuncEnvironment for FuncEnvironment<'m // Funcrefs are represented as pointers which survive for the // entire lifetime of the `Store` so there's no need for barriers. // This means that they can fall through to memory as well. - WasmType::Ref(WasmRefType { - heap_type: WasmHeapType::Func | WasmHeapType::TypedFunc(_), + WasmValType::Ref(WasmRefType { + heap_type: WasmHeapType::Func | WasmHeapType::Concrete(_), .. }) => {} // Value types all live in memory so let them fall through to a // memory-based global. - WasmType::I32 | WasmType::I64 | WasmType::F32 | WasmType::F64 | WasmType::V128 => {} + WasmValType::I32 + | WasmValType::I64 + | WasmValType::F32 + | WasmValType::F64 + | WasmValType::V128 => {} } let (gv, offset) = self.get_global_location(func, index); diff --git a/crates/cranelift/src/lib.rs b/crates/cranelift/src/lib.rs index 439437261bce..4d25aa4e80a0 100644 --- a/crates/cranelift/src/lib.rs +++ b/crates/cranelift/src/lib.rs @@ -6,7 +6,7 @@ use cranelift_codegen::ir; use cranelift_codegen::isa::{CallConv, TargetIsa}; use cranelift_entity::PrimaryMap; -use cranelift_wasm::{DefinedFuncIndex, WasmFuncType, WasmType}; +use cranelift_wasm::{DefinedFuncIndex, WasmFuncType, WasmValType}; use target_lexicon::Architecture; use wasmtime_cranelift_shared::CompiledFunctionMetadata; @@ -40,14 +40,14 @@ fn blank_sig(isa: &dyn TargetIsa, call_conv: CallConv) -> ir::Signature { } /// Returns the corresponding cranelift type for the provided wasm type. -fn value_type(isa: &dyn TargetIsa, ty: WasmType) -> ir::types::Type { +fn value_type(isa: &dyn TargetIsa, ty: WasmValType) -> ir::types::Type { match ty { - WasmType::I32 => ir::types::I32, - WasmType::I64 => ir::types::I64, - WasmType::F32 => ir::types::F32, - WasmType::F64 => ir::types::F64, - WasmType::V128 => ir::types::I8X16, - WasmType::Ref(rt) => reference_type(rt.heap_type, isa.pointer_type()), + WasmValType::I32 => ir::types::I32, + WasmValType::I64 => ir::types::I64, + WasmValType::F32 => ir::types::F32, + WasmValType::F64 => ir::types::F64, + WasmValType::V128 => ir::types::I8X16, + WasmValType::Ref(rt) => reference_type(rt.heap_type, isa.pointer_type()), } } @@ -89,7 +89,7 @@ fn value_type(isa: &dyn TargetIsa, ty: WasmType) -> ir::types::Type { /// pointer. fn native_call_signature(isa: &dyn TargetIsa, wasm: &WasmFuncType) -> ir::Signature { let mut sig = blank_sig(isa, CallConv::triple_default(isa.triple())); - let cvt = |ty: &WasmType| ir::AbiParam::new(value_type(isa, *ty)); + let cvt = |ty: &WasmValType| ir::AbiParam::new(value_type(isa, *ty)); sig.params.extend(wasm.params().iter().map(&cvt)); if let Some(first_ret) = wasm.returns().get(0) { sig.returns.push(cvt(first_ret)); @@ -165,7 +165,7 @@ fn wasm_call_signature( _ => CallConv::Fast, }; let mut sig = blank_sig(isa, call_conv); - let cvt = |ty: &WasmType| ir::AbiParam::new(value_type(isa, *ty)); + let cvt = |ty: &WasmValType| ir::AbiParam::new(value_type(isa, *ty)); sig.params.extend(wasm_func_ty.params().iter().map(&cvt)); sig.returns.extend(wasm_func_ty.returns().iter().map(&cvt)); sig @@ -174,7 +174,7 @@ fn wasm_call_signature( /// Returns the reference type to use for the provided wasm type. fn reference_type(wasm_ht: cranelift_wasm::WasmHeapType, pointer_type: ir::Type) -> ir::Type { match wasm_ht { - cranelift_wasm::WasmHeapType::Func | cranelift_wasm::WasmHeapType::TypedFunc(_) => { + cranelift_wasm::WasmHeapType::Func | cranelift_wasm::WasmHeapType::Concrete(_) => { pointer_type } cranelift_wasm::WasmHeapType::Extern => match pointer_type { diff --git a/crates/environ/Cargo.toml b/crates/environ/Cargo.toml index 3651744ea14e..cb471956bb38 100644 --- a/crates/environ/Cargo.toml +++ b/crates/environ/Cargo.toml @@ -10,8 +10,13 @@ categories = ["wasm"] keywords = ["webassembly", "wasm"] edition.workspace = true +[lints] +workspace = true + [dependencies] anyhow = { workspace = true } +bincode = "1.2.1" +cpp_demangle = { version = "0.4.3", optional = true } cranelift-entity = { workspace = true } wasmtime-types = { workspace = true } wasmparser = { workspace = true } @@ -22,6 +27,7 @@ serde_derive = "1.0.188" log = { workspace = true } gimli = { workspace = true, features = ["write"] } object = { workspace = true, features = ['write_core'] } +rustc-demangle = { version = "0.1.16", optional = true } target-lexicon = { workspace = true } wasm-encoder = { workspace = true, optional = true } wasmprinter = { workspace = true, optional = true } @@ -42,3 +48,4 @@ component-model = [ "dep:wasmprinter", "dep:wasmtime-component-util", ] +demangle = ['dep:rustc-demangle', 'dep:cpp_demangle'] diff --git a/crates/environ/examples/factc.rs b/crates/environ/examples/factc.rs index 0416b1613453..d0f49b547c6a 100644 --- a/crates/environ/examples/factc.rs +++ b/crates/environ/examples/factc.rs @@ -24,53 +24,53 @@ use wasmtime_environ::fact::Module; #[derive(Parser)] struct Factc { /// Whether or not debug code is inserted into the generated adapter. - #[clap(long)] + #[arg(long)] debug: bool, /// Whether or not the lifting options (the callee of the exported adapter) /// uses a 64-bit memory as opposed to a 32-bit memory. - #[clap(long)] + #[arg(long)] lift64: bool, /// Whether or not the lowering options (the caller of the exported adapter) /// uses a 64-bit memory as opposed to a 32-bit memory. - #[clap(long)] + #[arg(long)] lower64: bool, /// Whether or not a call to a `post-return` configured function is enabled /// or not. - #[clap(long)] + #[arg(long)] post_return: bool, /// Whether or not to skip validation of the generated adapter module. - #[clap(long)] + #[arg(long)] skip_validate: bool, /// Where to place the generated adapter module. Standard output is used if /// this is not specified. - #[clap(short, long)] + #[arg(short, long)] output: Option, /// Output the text format for WebAssembly instead of the binary format. - #[clap(short, long)] + #[arg(short, long)] text: bool, - #[clap(long, value_parser = parse_string_encoding, default_value = "utf8")] + #[arg(long, value_parser = parse_string_encoding, default_value = "utf8")] lift_str: StringEncoding, - #[clap(long, value_parser = parse_string_encoding, default_value = "utf8")] + #[arg(long, value_parser = parse_string_encoding, default_value = "utf8")] lower_str: StringEncoding, /// TODO input: PathBuf, } -fn parse_string_encoding(name: &str) -> anyhow::Result { +fn parse_string_encoding(name: &str) -> Result { Ok(match name { "utf8" => StringEncoding::Utf8, "utf16" => StringEncoding::Utf16, "compact-utf16" => StringEncoding::CompactUtf16, - other => anyhow::bail!("invalid string encoding: `{other}`"), + other => bail!("invalid string encoding: `{other}`"), }) } diff --git a/crates/environ/src/compilation.rs b/crates/environ/src/compilation.rs index 3cee62b856ad..a6475f63c90c 100644 --- a/crates/environ/src/compilation.rs +++ b/crates/environ/src/compilation.rs @@ -3,7 +3,7 @@ use crate::{obj, Tunables}; use crate::{ - DefinedFuncIndex, FilePos, FuncIndex, FunctionBodyData, ModuleTranslation, ModuleTypes, + DefinedFuncIndex, FilePos, FuncIndex, FunctionBodyData, ModuleTranslation, ModuleTypesBuilder, PrimaryMap, StackMap, WasmError, WasmFuncType, }; use anyhow::Result; @@ -179,7 +179,7 @@ pub trait Compiler: Send + Sync { translation: &ModuleTranslation<'_>, index: DefinedFuncIndex, data: FunctionBodyData<'_>, - types: &ModuleTypes, + types: &ModuleTypesBuilder, ) -> Result<(WasmFunctionInfo, Box), CompileError>; /// Compile a trampoline for an array-call host function caller calling the @@ -190,7 +190,7 @@ pub trait Compiler: Send + Sync { fn compile_array_to_wasm_trampoline( &self, translation: &ModuleTranslation<'_>, - types: &ModuleTypes, + types: &ModuleTypesBuilder, index: DefinedFuncIndex, ) -> Result, CompileError>; @@ -202,7 +202,7 @@ pub trait Compiler: Send + Sync { fn compile_native_to_wasm_trampoline( &self, translation: &ModuleTranslation<'_>, - types: &ModuleTypes, + types: &ModuleTypesBuilder, index: DefinedFuncIndex, ) -> Result, CompileError>; diff --git a/crates/environ/src/component.rs b/crates/environ/src/component.rs index b5537adc0016..4ec045a1e55c 100644 --- a/crates/environ/src/component.rs +++ b/crates/environ/src/component.rs @@ -37,12 +37,14 @@ pub const MAX_FLAT_PARAMS: usize = 16; /// are transferred through memory. pub const MAX_FLAT_RESULTS: usize = 1; +mod artifacts; mod compiler; pub mod dfg; mod info; mod translate; mod types; mod vmcomponent_offsets; +pub use self::artifacts::*; pub use self::compiler::*; pub use self::info::*; pub use self::translate::*; diff --git a/crates/environ/src/component/artifacts.rs b/crates/environ/src/component/artifacts.rs new file mode 100644 index 000000000000..3acafbd30a1b --- /dev/null +++ b/crates/environ/src/component/artifacts.rs @@ -0,0 +1,45 @@ +//! Definitions of compilation artifacts of the component compilation process +//! which are serialized with `bincode` into output ELF files. + +use crate::{ + component::{AllCallFunc, Component, ComponentTypes, TrampolineIndex, TypeComponentIndex}, + CompiledModuleInfo, FunctionLoc, PrimaryMap, StaticModuleIndex, +}; +use serde_derive::{Deserialize, Serialize}; + +/// Serializable state that's stored in a compilation artifact. +#[derive(Serialize, Deserialize)] +pub struct ComponentArtifacts { + /// The type of this component. + pub ty: TypeComponentIndex, + /// Information all kept available at runtime as-is. + pub info: CompiledComponentInfo, + /// Type information for this component and all contained modules. + pub types: ComponentTypes, + /// Serialized metadata about all included core wasm modules. + pub static_modules: PrimaryMap, +} + +/// Runtime state that a component retains to support its operation. +#[derive(Serialize, Deserialize)] +pub struct CompiledComponentInfo { + /// Type information calculated during translation about this component. + pub component: Component, + + /// Where lowered function trampolines are located within the `text` + /// section of `code_memory`. + /// + /// These are the + /// + /// 1. Wasm-call, + /// 2. array-call, and + /// 3. native-call + /// + /// function pointers that end up in a `VMFuncRef` for each + /// lowering. + pub trampolines: PrimaryMap>, + + /// The location of the wasm-to-native trampoline for the `resource.drop` + /// intrinsic. + pub resource_drop_wasm_to_native_trampoline: Option, +} diff --git a/crates/environ/src/component/compiler.rs b/crates/environ/src/component/compiler.rs index 13b4a3a4a4c7..b89f67a77fc3 100644 --- a/crates/environ/src/component/compiler.rs +++ b/crates/environ/src/component/compiler.rs @@ -1,4 +1,4 @@ -use crate::component::{ComponentTranslation, ComponentTypes, TrampolineIndex}; +use crate::component::{ComponentTranslation, ComponentTypesBuilder, TrampolineIndex}; use anyhow::Result; use serde_derive::{Deserialize, Serialize}; use std::any::Any; @@ -41,7 +41,7 @@ pub trait ComponentCompiler: Send + Sync { fn compile_trampoline( &self, component: &ComponentTranslation, - types: &ComponentTypes, + types: &ComponentTypesBuilder, trampoline: TrampolineIndex, ) -> Result>>; } diff --git a/crates/environ/src/component/dfg.rs b/crates/environ/src/component/dfg.rs index 2fab963234b4..81031ad09fb2 100644 --- a/crates/environ/src/component/dfg.rs +++ b/crates/environ/src/component/dfg.rs @@ -28,11 +28,12 @@ //! fused adapters, what arguments make their way to core wasm modules, etc. use crate::component::*; -use crate::{EntityIndex, EntityRef, PrimaryMap, SignatureIndex, WasmType}; +use crate::{EntityIndex, EntityRef, PrimaryMap, WasmValType}; use indexmap::IndexMap; use std::collections::HashMap; use std::hash::Hash; use std::ops::Index; +use wasmtime_types::ModuleInternedTypeIndex; #[derive(Default)] #[allow(missing_docs)] @@ -48,7 +49,7 @@ pub struct ComponentDfg { /// All trampolines and their type signature which will need to get /// compiled by Cranelift. - pub trampolines: Intern, + pub trampolines: Intern, /// Know reallocation functions which are used by `lowerings` (e.g. will be /// used by the host) @@ -184,8 +185,14 @@ pub enum Export { options: CanonicalOptions, }, ModuleStatic(StaticModuleIndex), - ModuleImport(RuntimeImportIndex), - Instance(IndexMap), + ModuleImport { + ty: TypeModuleIndex, + import: RuntimeImportIndex, + }, + Instance { + ty: Option, + exports: IndexMap, + }, Type(TypeDef), } @@ -277,7 +284,7 @@ pub struct CanonicalOptions { /// Same as `info::Resource` #[allow(missing_docs)] pub struct Resource { - pub rep: WasmType, + pub rep: WasmValType, pub dtor: Option, pub instance: RuntimeComponentInstanceIndex, } @@ -407,7 +414,7 @@ impl ComponentDfg { struct LinearizeDfg<'a> { dfg: &'a ComponentDfg, initializers: Vec, - trampolines: PrimaryMap, + trampolines: PrimaryMap, trampoline_defs: PrimaryMap, trampoline_map: HashMap, runtime_memories: HashMap, @@ -487,12 +494,17 @@ impl LinearizeDfg<'_> { } } Export::ModuleStatic(i) => info::Export::ModuleStatic(*i), - Export::ModuleImport(i) => info::Export::ModuleImport(*i), - Export::Instance(map) => info::Export::Instance( - map.iter() + Export::ModuleImport { ty, import } => info::Export::ModuleImport { + ty: *ty, + import: *import, + }, + Export::Instance { ty, exports } => info::Export::Instance { + ty: *ty, + exports: exports + .iter() .map(|(name, export)| (name.clone(), self.export(export))) .collect(), - ), + }, Export::Type(def) => info::Export::Type(*def), } } diff --git a/crates/environ/src/component/info.rs b/crates/environ/src/component/info.rs index dff80ffe9bfa..fc47dbc3082c 100644 --- a/crates/environ/src/component/info.rs +++ b/crates/environ/src/component/info.rs @@ -47,9 +47,10 @@ // requirements of embeddings change over time. use crate::component::*; -use crate::{EntityIndex, PrimaryMap, SignatureIndex, WasmType}; +use crate::{EntityIndex, PrimaryMap, WasmValType}; use indexmap::IndexMap; use serde_derive::{Deserialize, Serialize}; +use wasmtime_types::ModuleInternedTypeIndex; /// Metadata as a result of compiling a component. pub struct ComponentTranslation { @@ -146,7 +147,7 @@ pub struct Component { pub num_runtime_post_returns: u32, /// WebAssembly type signature of all trampolines. - pub trampolines: PrimaryMap, + pub trampolines: PrimaryMap, /// The number of lowered host functions (maximum `LoweredIndex`) needed to /// instantiate this component. @@ -402,10 +403,20 @@ pub enum Export { /// A module defined within this component is exported. ModuleStatic(StaticModuleIndex), /// A module imported into this component is exported. - ModuleImport(RuntimeImportIndex), + ModuleImport { + /// Module type index + ty: TypeModuleIndex, + /// Module runtime import index + import: RuntimeImportIndex, + }, /// A nested instance is being exported which has recursively defined /// `Export` items. - Instance(IndexMap), + Instance { + /// Instance type index, if such is assigned + ty: Option, + /// Instance export map + exports: IndexMap, + }, /// An exported type from a component or instance, currently only /// informational. Type(TypeDef), @@ -456,7 +467,7 @@ pub struct Resource { /// The local index of the resource being defined. pub index: DefinedResourceIndex, /// Core wasm representation of this resource. - pub rep: WasmType, + pub rep: WasmValType, /// Optionally-specified destructor and where it comes from. pub dtor: Option, /// Which component instance this resource logically belongs to. diff --git a/crates/environ/src/component/translate.rs b/crates/environ/src/component/translate.rs index df404bd5afa1..3334b17361ad 100644 --- a/crates/environ/src/component/translate.rs +++ b/crates/environ/src/component/translate.rs @@ -1,8 +1,8 @@ use crate::component::*; use crate::ScopeVec; use crate::{ - EntityIndex, ModuleEnvironment, ModuleTranslation, ModuleTypesBuilder, PrimaryMap, - SignatureIndex, Tunables, TypeConvert, WasmHeapType, WasmType, + EntityIndex, ModuleEnvironment, ModuleTranslation, ModuleTypesBuilder, PrimaryMap, Tunables, + TypeConvert, WasmHeapType, WasmValType, }; use anyhow::{bail, Result}; use indexmap::IndexMap; @@ -12,6 +12,7 @@ use wasmparser::types::{ AliasableResourceId, ComponentEntityType, ComponentFuncTypeId, ComponentInstanceTypeId, Types, }; use wasmparser::{Chunk, ComponentImportName, Encoding, Parser, Payload, Validator}; +use wasmtime_types::ModuleInternedTypeIndex; mod adapt; pub use self::adapt::*; @@ -173,16 +174,16 @@ enum LocalInitializer<'data> { Lower { func: ComponentFuncIndex, lower_ty: ComponentFuncTypeId, - canonical_abi: SignatureIndex, + canonical_abi: ModuleInternedTypeIndex, options: LocalCanonicalOptions, }, Lift(ComponentFuncTypeId, FuncIndex, LocalCanonicalOptions), // resources - Resource(AliasableResourceId, WasmType, Option), - ResourceNew(AliasableResourceId, SignatureIndex), - ResourceRep(AliasableResourceId, SignatureIndex), - ResourceDrop(AliasableResourceId, SignatureIndex), + Resource(AliasableResourceId, WasmValType, Option), + ResourceNew(AliasableResourceId, ModuleInternedTypeIndex), + ResourceRep(AliasableResourceId, ModuleInternedTypeIndex), + ResourceDrop(AliasableResourceId, ModuleInternedTypeIndex), // core wasm modules ModuleStatic(StaticModuleIndex), @@ -200,7 +201,7 @@ enum LocalInitializer<'data> { HashMap<&'data str, ComponentItem>, ComponentInstanceTypeId, ), - ComponentSynthetic(HashMap<&'data str, ComponentItem>), + ComponentSynthetic(HashMap<&'data str, ComponentItem>, ComponentInstanceTypeId), // alias section AliasExportFunc(ModuleInstanceIndex, &'data str), @@ -581,18 +582,18 @@ impl<'a, 'data> Translator<'a, 'data> { let mut index = self.validator.types(0).unwrap().component_instance_count(); self.validator.component_instance_section(&s)?; for instance in s { + let types = self.validator.types(0).unwrap(); + let ty = types.component_instance_at(index); let init = match instance? { wasmparser::ComponentInstance::Instantiate { component_index, args, } => { - let types = self.validator.types(0).unwrap(); - let ty = types.component_instance_at(index); let index = ComponentIndex::from_u32(component_index); self.instantiate_component(index, &args, ty)? } wasmparser::ComponentInstance::FromExports(exports) => { - self.instantiate_component_from_exports(&exports)? + self.instantiate_component_from_exports(&exports, ty)? } }; self.result.initializers.push(init); @@ -746,6 +747,7 @@ impl<'a, 'data> Translator<'a, 'data> { fn instantiate_component_from_exports( &mut self, exports: &[wasmparser::ComponentExport<'data>], + ty: ComponentInstanceTypeId, ) -> Result> { let mut map = HashMap::with_capacity(exports.len()); for export in exports { @@ -753,7 +755,7 @@ impl<'a, 'data> Translator<'a, 'data> { map.insert(export.name.0, idx); } - Ok(LocalInitializer::ComponentSynthetic(map)) + Ok(LocalInitializer::ComponentSynthetic(map, ty)) } fn kind_to_item( @@ -889,12 +891,12 @@ impl<'a, 'data> Translator<'a, 'data> { return ret; } - fn core_func_signature(&mut self, idx: u32) -> SignatureIndex { + fn core_func_signature(&mut self, idx: u32) -> ModuleInternedTypeIndex { let types = self.validator.types(0).unwrap(); let id = types.core_function_at(idx); let ty = types[id].unwrap_func(); let ty = self.types.convert_func_type(ty); - self.types.module_types_builder().wasm_func_type(ty) + self.types.module_types_builder().wasm_func_type(id, ty) } } @@ -928,7 +930,7 @@ mod pre_inlining { } pub fn module_types_builder(&mut self) -> &mut ModuleTypesBuilder { - self.types.module_types_builder() + self.types.module_types_builder_mut() } pub fn types(&self) -> &ComponentTypesBuilder { @@ -943,7 +945,7 @@ mod pre_inlining { } impl TypeConvert for PreInliningComponentTypes<'_> { - fn lookup_heap_type(&self, index: TypeIndex) -> WasmHeapType { + fn lookup_heap_type(&self, index: wasmparser::UnpackedIndex) -> WasmHeapType { self.types.lookup_heap_type(index) } } diff --git a/crates/environ/src/component/translate/inline.rs b/crates/environ/src/component/translate/inline.rs index 629eee6936dd..d88ec64dfddd 100644 --- a/crates/environ/src/component/translate/inline.rs +++ b/crates/environ/src/component/translate/inline.rs @@ -330,7 +330,10 @@ enum ComponentInstanceDef<'a> { // // FIXME: same as the issue on `ComponentClosure` where this is cloned a lot // and may need `Rc`. - Items(IndexMap<&'a str, ComponentItemDef<'a>>), + Items( + IndexMap<&'a str, ComponentItemDef<'a>>, + Option, + ), } #[derive(Clone)] @@ -397,7 +400,7 @@ impl<'a> Inliner<'a> { match frames.last_mut() { Some((parent, _)) => { parent.finish_instantiate( - ComponentInstanceDef::Items(exports), + ComponentInstanceDef::Items(exports, None), instance_ty.unwrap(), types, ); @@ -783,14 +786,16 @@ impl<'a> Inliner<'a> { return Ok(Some(frame)); } - ComponentSynthetic(map) => { + ComponentSynthetic(map, ty) => { let items = map .iter() .map(|(name, index)| Ok((*name, frame.item(*index, types)?))) .collect::>()?; + let types_ref = frame.translation.types_ref(); + let ty = types.convert_instance(types_ref, *ty)?; frame .component_instances - .push(ComponentInstanceDef::Items(items)); + .push(ComponentInstanceDef::Items(items, Some(ty))); } // Core wasm aliases, this and the cases below, are creating @@ -846,7 +851,7 @@ impl<'a> Inliner<'a> { // through instantiation of a component or through a // synthetic renaming of items we just schlep around the // definitions of various items here. - ComponentInstanceDef::Items(map) => frame.push_item(map[*name].clone()), + ComponentInstanceDef::Items(map, _) => frame.push_item(map[*name].clone()), } } @@ -1029,7 +1034,10 @@ impl<'a> Inliner<'a> { // from. ComponentItemDef::Module(module) => match module { ModuleDef::Static(idx) => dfg::Export::ModuleStatic(idx), - ModuleDef::Import(path, _) => dfg::Export::ModuleImport(self.runtime_import(&path)), + ModuleDef::Import(path, ty) => dfg::Export::ModuleImport { + ty, + import: self.runtime_import(&path), + }, }, ComponentItemDef::Func(func) => match func { @@ -1051,7 +1059,7 @@ impl<'a> Inliner<'a> { }, ComponentItemDef::Instance(instance) => { - let mut result = IndexMap::new(); + let mut exports = IndexMap::new(); match instance { // If this instance is one that was originally imported by // the component itself then the imports are translated here @@ -1064,20 +1072,24 @@ impl<'a> Inliner<'a> { for (name, ty) in types[ty].exports.iter() { let path = path.push(name); let def = ComponentItemDef::from_import(path, *ty)?; - self.record_export(name, def, types, &mut result)?; + self.record_export(name, def, types, &mut exports)?; + } + dfg::Export::Instance { + ty: Some(ty), + exports, } } // An exported instance which is itself a bag of items is - // translated recursively here to our `result` map which is + // translated recursively here to our `exports` map which is // the bag of items we're exporting. - ComponentInstanceDef::Items(map) => { + ComponentInstanceDef::Items(map, ty) => { for (name, def) in map { - self.record_export(name, def, types, &mut result)?; + self.record_export(name, def, types, &mut exports)?; } + dfg::Export::Instance { ty, exports } } } - dfg::Export::Instance(result) } // FIXME(#4283) should make an official decision on whether this is @@ -1292,7 +1304,7 @@ impl<'a> ComponentItemDef<'a> { cur = match instance { // If this instance is a "bag of things" then this is as easy as // looking up the name in the bag of names. - ComponentInstanceDef::Items(names) => names[element].clone(), + ComponentInstanceDef::Items(names, _) => names[element].clone(), // If, however, this instance is an imported instance then this // is a further projection within the import with one more path diff --git a/crates/environ/src/component/types.rs b/crates/environ/src/component/types.rs index ecf38d4b135b..f873d86e3902 100644 --- a/crates/environ/src/component/types.rs +++ b/crates/environ/src/component/types.rs @@ -1,7 +1,7 @@ -use crate::component::{MAX_FLAT_PARAMS, MAX_FLAT_RESULTS}; +use crate::component::{Export, MAX_FLAT_PARAMS, MAX_FLAT_RESULTS}; use crate::{ - EntityType, ModuleTypes, ModuleTypesBuilder, PrimaryMap, SignatureIndex, TypeConvert, - WasmHeapType, WasmType, + CompiledModuleInfo, EntityType, ModuleTypes, ModuleTypesBuilder, PrimaryMap, TypeConvert, + WasmHeapType, WasmValType, }; use anyhow::{bail, Result}; use cranelift_entity::EntityRef; @@ -13,6 +13,7 @@ use std::ops::Index; use wasmparser::names::KebabString; use wasmparser::types; use wasmtime_component_util::{DiscriminantSize, FlagsSize}; +use wasmtime_types::ModuleInternedTypeIndex; pub use wasmtime_types::StaticModuleIndex; @@ -219,7 +220,7 @@ indices! { // Reexport for convenience some core-wasm indices which are also used in the // component model, typically for when aliasing exports of core wasm modules. -pub use crate::{FuncIndex, GlobalIndex, MemoryIndex, TableIndex, TypeIndex}; +pub use crate::{FuncIndex, GlobalIndex, MemoryIndex, TableIndex}; /// Equivalent of `EntityIndex` but for the component model instead of core /// wasm. @@ -294,25 +295,6 @@ impl ComponentTypes { InterfaceType::Result(i) => &self[*i].abi, } } - - /// Smaller helper method to find a `SignatureIndex` which corresponds to - /// the `resource.drop` intrinsic in components, namely a core wasm function - /// type which takes one `i32` argument and has no results. - /// - /// This is a bit of a hack right now as ideally this find operation - /// wouldn't be needed and instead the `SignatureIndex` itself would be - /// threaded through appropriately, but that's left for a future - /// refactoring. Try not to lean too hard on this method though. - pub fn find_resource_drop_signature(&self) -> Option { - self.module_types - .wasm_signatures() - .find(|(_, sig)| { - sig.params().len() == 1 - && sig.returns().len() == 0 - && sig.params()[0] == WasmType::I32 - }) - .map(|(i, _)| i) - } } macro_rules! impl_index { @@ -324,6 +306,14 @@ macro_rules! impl_index { &self.$field[idx] } } + + impl std::ops::Index<$ty> for ComponentTypesBuilder { + type Output = $output; + #[inline] + fn index(&self, idx: $ty) -> &$output { + &self.component_types[idx] + } + } )*) } @@ -355,6 +345,16 @@ where } } +impl Index for ComponentTypesBuilder +where + ModuleTypes: Index, +{ + type Output = >::Output; + fn index(&self, idx: T) -> &Self::Output { + self.module_types.index(idx) + } +} + /// Structured used to build a [`ComponentTypes`] during translation. /// /// This contains tables to intern any component types found as well as @@ -398,23 +398,98 @@ macro_rules! intern_and_fill_flat_types { } impl ComponentTypesBuilder { + fn export_type_def( + &mut self, + static_modules: &PrimaryMap, + ty: &Export, + ) -> TypeDef { + match ty { + Export::LiftedFunction { ty, .. } => TypeDef::ComponentFunc(*ty), + Export::ModuleStatic(idx) => { + let mut module_ty = TypeModule::default(); + let module = &static_modules[*idx].module; + for (namespace, name, ty) in module.imports() { + module_ty + .imports + .insert((namespace.to_string(), name.to_string()), ty); + } + for (name, ty) in module.exports.iter() { + module_ty + .exports + .insert(name.to_string(), module.type_of(*ty)); + } + TypeDef::Module(self.component_types.modules.push(module_ty)) + } + Export::ModuleImport { ty, .. } => TypeDef::Module(*ty), + Export::Instance { ty: Some(ty), .. } => TypeDef::ComponentInstance(*ty), + Export::Instance { exports, .. } => { + let mut instance_ty = TypeComponentInstance::default(); + for (name, ty) in exports { + instance_ty + .exports + .insert(name.to_string(), self.export_type_def(static_modules, ty)); + } + TypeDef::ComponentInstance( + self.component_types.component_instances.push(instance_ty), + ) + } + Export::Type(ty) => *ty, + } + } + /// Finishes this list of component types and returns the finished - /// structure. - pub fn finish(mut self) -> ComponentTypes { + /// structure and the [`TypeComponentIndex`] corresponding to top-level component + /// with `imports` and `exports` specified. + pub fn finish<'a>( + mut self, + static_modules: &PrimaryMap, + imports: impl IntoIterator, + exports: impl IntoIterator, + ) -> (ComponentTypes, TypeComponentIndex) { + let mut component_ty = TypeComponent::default(); + for (name, ty) in imports { + component_ty.imports.insert(name, ty); + } + for (name, ty) in exports { + component_ty + .exports + .insert(name, self.export_type_def(static_modules, ty)); + } + let ty = self.component_types.components.push(component_ty); + self.component_types.module_types = self.module_types.finish(); - self.component_types + (self.component_types, ty) } - /// Returns the `ComponentTypes`-in-progress. - pub fn component_types(&self) -> &ComponentTypes { - &self.component_types + /// Smaller helper method to find a `SignatureIndex` which corresponds to + /// the `resource.drop` intrinsic in components, namely a core wasm function + /// type which takes one `i32` argument and has no results. + /// + /// This is a bit of a hack right now as ideally this find operation + /// wouldn't be needed and instead the `SignatureIndex` itself would be + /// threaded through appropriately, but that's left for a future + /// refactoring. Try not to lean too hard on this method though. + pub fn find_resource_drop_signature(&self) -> Option { + self.module_types + .wasm_signatures() + .find(|(_, sig)| { + sig.params().len() == 1 + && sig.returns().len() == 0 + && sig.params()[0] == WasmValType::I32 + }) + .map(|(i, _)| i) } /// Returns the underlying builder used to build up core wasm module types. /// /// Note that this is shared across all modules found within a component to /// improve the wins from deduplicating function signatures. - pub fn module_types_builder(&mut self) -> &mut ModuleTypesBuilder { + pub fn module_types_builder(&self) -> &ModuleTypesBuilder { + &self.module_types + } + + /// Same as `module_types_builder`, but `mut`. + pub fn module_types_builder_mut(&mut self) -> &mut ModuleTypesBuilder { &mut self.module_types } @@ -540,7 +615,7 @@ impl ComponentTypesBuilder { Ok(self.component_types.components.push(result)) } - fn convert_instance( + pub(crate) fn convert_instance( &mut self, types: types::TypesRef<'_>, id: types::ComponentInstanceTypeId, @@ -586,7 +661,7 @@ impl ComponentTypesBuilder { types::EntityType::Func(idx) => { let ty = types[*idx].unwrap_func(); let ty = self.convert_func_type(ty); - EntityType::Function(self.module_types_builder().wasm_func_type(ty)) + EntityType::Function(self.module_types_builder_mut().wasm_func_type(*idx, ty)) } types::EntityType::Table(ty) => EntityType::Table(self.convert_table_type(ty)), types::EntityType::Memory(ty) => EntityType::Memory(ty.clone().into()), @@ -897,23 +972,11 @@ impl ComponentTypesBuilder { } impl TypeConvert for ComponentTypesBuilder { - fn lookup_heap_type(&self, _index: TypeIndex) -> WasmHeapType { + fn lookup_heap_type(&self, _index: wasmparser::UnpackedIndex) -> WasmHeapType { panic!("heap types are not supported yet") } } -// Forward the indexing impl to the internal `TypeTables` -impl Index for ComponentTypesBuilder -where - ComponentTypes: Index, -{ - type Output = >::Output; - - fn index(&self, sig: T) -> &Self::Output { - &self.component_types[sig] - } -} - fn intern(map: &mut HashMap, list: &mut PrimaryMap, item: T) -> U where T: Hash + Clone + Eq, @@ -945,7 +1008,7 @@ pub enum TypeDef { /// A core wasm module and its type. Module(TypeModuleIndex), /// A core wasm function using only core wasm types. - CoreFunc(SignatureIndex), + CoreFunc(ModuleInternedTypeIndex), /// A resource type which operates on the specified resource table. /// /// Note that different resource tables may point to the same underlying diff --git a/crates/jit/src/demangling.rs b/crates/environ/src/demangling.rs similarity index 100% rename from crates/jit/src/demangling.rs rename to crates/environ/src/demangling.rs diff --git a/crates/environ/src/lib.rs b/crates/environ/src/lib.rs index be32c25b5c23..4df17658a11f 100644 --- a/crates/environ/src/lib.rs +++ b/crates/environ/src/lib.rs @@ -3,13 +3,15 @@ //! the translation the base addresses of regions of memory that will hold the globals, tables and //! linear memories. -#![deny(missing_docs, trivial_numeric_casts, unused_extern_crates)] -#![warn(unused_import_braces)] +#![deny(missing_docs)] +#![warn(clippy::cast_sign_loss)] mod address_map; mod builtin; mod compilation; +mod demangling; mod module; +mod module_artifacts; mod module_environ; mod module_types; pub mod obj; @@ -23,6 +25,7 @@ mod vmoffsets; pub use crate::address_map::*; pub use crate::builtin::*; pub use crate::compilation::*; +pub use crate::demangling::*; pub use crate::module::*; pub use crate::module_environ::*; pub use crate::module_types::*; @@ -30,10 +33,14 @@ pub use crate::ref_bits::*; pub use crate::scopevec::ScopeVec; pub use crate::stack_map::StackMap; pub use crate::trap_encoding::*; -pub use crate::tunables::Tunables; +pub use crate::tunables::*; pub use crate::vmoffsets::*; pub use object; +pub use crate::module_artifacts::{ + CompiledFunctionInfo, CompiledModuleInfo, FinishedObject, FunctionName, Metadata, ObjectBuilder, +}; + #[cfg(feature = "component-model")] pub mod component; #[cfg(feature = "component-model")] diff --git a/crates/environ/src/module.rs b/crates/environ/src/module.rs index 5bce7ae16134..e478bda118f7 100644 --- a/crates/environ/src/module.rs +++ b/crates/environ/src/module.rs @@ -474,7 +474,7 @@ impl ModuleTranslation<'_> { .wasm_ty .heap_type { - WasmHeapType::Func | WasmHeapType::TypedFunc(_) => {} + WasmHeapType::Func | WasmHeapType::Concrete(_) => {} // If this is not a funcref table, then we can't support a // pre-computed table of function indices. Technically this // initializer won't trap so we could continue processing @@ -780,13 +780,13 @@ pub struct TableSegment { #[derive(Debug, Copy, Clone, Serialize, Deserialize)] #[allow(missing_docs)] pub enum ModuleType { - Function(SignatureIndex), + Function(ModuleInternedTypeIndex), } impl ModuleType { /// Asserts this is a `ModuleType::Function`, returning the underlying /// `SignatureIndex`. - pub fn unwrap_function(&self) -> SignatureIndex { + pub fn unwrap_function(&self) -> ModuleInternedTypeIndex { match self { ModuleType::Function(f) => *f, } @@ -1029,7 +1029,7 @@ impl Module { /// Appends a new function to this module with the given type information, /// used for functions that either don't escape or aren't certain whether /// they escape yet. - pub fn push_function(&mut self, signature: SignatureIndex) -> FuncIndex { + pub fn push_function(&mut self, signature: ModuleInternedTypeIndex) -> FuncIndex { self.functions.push(FunctionType { signature, func_ref: FuncRefIndex::reserved_value(), @@ -1039,7 +1039,7 @@ impl Module { /// Appends a new function to this module with the given type information. pub fn push_escaped_function( &mut self, - signature: SignatureIndex, + signature: ModuleInternedTypeIndex, func_ref: FuncRefIndex, ) -> FuncIndex { self.functions.push(FunctionType { @@ -1049,20 +1049,12 @@ impl Module { } } -impl TypeConvert for Module { - fn lookup_heap_type(&self, index: TypeIndex) -> WasmHeapType { - match self.types[index] { - ModuleType::Function(i) => WasmHeapType::TypedFunc(i), - } - } -} - /// Type information about functions in a wasm module. #[derive(Debug, Serialize, Deserialize)] pub struct FunctionType { /// The type of this function, indexed into the module-wide type tables for /// a module compilation. - pub signature: SignatureIndex, + pub signature: ModuleInternedTypeIndex, /// The index into the funcref table, if present. Note that this is /// `reserved_value()` if the function does not escape from a module. pub func_ref: FuncRefIndex, diff --git a/crates/environ/src/module_artifacts.rs b/crates/environ/src/module_artifacts.rs new file mode 100644 index 000000000000..1ebf6cf3b455 --- /dev/null +++ b/crates/environ/src/module_artifacts.rs @@ -0,0 +1,378 @@ +//! Definitions of runtime structures and metadata which are serialized into ELF +//! with `bincode` as part of a module's compilation process. + +use crate::{ + obj, DefinedFuncIndex, FuncIndex, FunctionLoc, MemoryInitialization, Module, ModuleTranslation, + PrimaryMap, Tunables, WasmFunctionInfo, +}; +use anyhow::{bail, Result}; +use object::write::{Object, SectionId, StandardSegment, WritableBuffer}; +use object::SectionKind; +use serde_derive::{Deserialize, Serialize}; +use std::convert::TryFrom; +use std::ops::Range; +use std::str; +use wasmtime_types::ModuleInternedTypeIndex; + +/// Secondary in-memory results of function compilation. +#[derive(Serialize, Deserialize)] +pub struct CompiledFunctionInfo { + /// The [`WasmFunctionInfo`] for this function. + pub wasm_func_info: WasmFunctionInfo, + /// The [`FunctionLoc`] indicating the location of this function in the text + /// section of the compition artifact. + pub wasm_func_loc: FunctionLoc, + /// A trampoline for array callers (e.g. `Func::new`) calling into this function (if needed). + pub array_to_wasm_trampoline: Option, + /// A trampoline for native callers (e.g. `Func::wrap`) calling into this function (if needed). + pub native_to_wasm_trampoline: Option, +} + +/// Secondary in-memory results of module compilation. +/// +/// This opaque structure can be optionally passed back to +/// `CompiledModule::from_artifacts` to avoid decoding extra information there. +#[derive(Serialize, Deserialize)] +pub struct CompiledModuleInfo { + /// Type information about the compiled WebAssembly module. + pub module: Module, + + /// Metadata about each compiled function. + pub funcs: PrimaryMap, + + /// Sorted list, by function index, of names we have for this module. + pub func_names: Vec, + + /// Metadata about wasm-to-native trampolines. Used when exposing a native + /// callee (e.g. `Func::wrap`) to a Wasm caller. Sorted by signature index. + pub wasm_to_native_trampolines: Vec<(ModuleInternedTypeIndex, FunctionLoc)>, + + /// General compilation metadata. + pub meta: Metadata, +} + +/// The name of a function stored in the +/// [`ELF_NAME_DATA`](crate::obj::ELF_NAME_DATA) section. +#[derive(Serialize, Deserialize)] +pub struct FunctionName { + /// The Wasm function index of this function. + pub idx: FuncIndex, + /// The offset of the name in the + /// [`ELF_NAME_DATA`](crate::obj::ELF_NAME_DATA) section. + pub offset: u32, + /// The length of the name in bytes. + pub len: u32, +} + +/// Metadata associated with a compiled ELF artifact. +#[derive(Serialize, Deserialize)] +pub struct Metadata { + /// Whether or not native debug information is available in `obj` + pub native_debug_info_present: bool, + + /// Whether or not the original wasm module contained debug information that + /// we skipped and did not parse. + pub has_unparsed_debuginfo: bool, + + /// Offset in the original wasm file to the code section. + pub code_section_offset: u64, + + /// Whether or not custom wasm-specific dwarf sections were inserted into + /// the ELF image. + /// + /// Note that even if this flag is `true` sections may be missing if they + /// weren't found in the original wasm module itself. + pub has_wasm_debuginfo: bool, + + /// Dwarf sections and the offsets at which they're stored in the + /// ELF_WASMTIME_DWARF + pub dwarf: Vec<(u8, Range)>, +} + +/// Helper structure to create an ELF file as a compilation artifact. +/// +/// This structure exposes the process which Wasmtime will encode a core wasm +/// module into an ELF file, notably managing data sections and all that good +/// business going into the final file. +pub struct ObjectBuilder<'a> { + /// The `object`-crate-defined ELF file write we're using. + obj: Object<'a>, + + /// General compilation configuration. + tunables: &'a Tunables, + + /// The section identifier for "rodata" which is where wasm data segments + /// will go. + data: SectionId, + + /// The section identifier for function name information, or otherwise where + /// the `name` custom section of wasm is copied into. + /// + /// This is optional and lazily created on demand. + names: Option, + + /// The section identifier for dwarf information copied from the original + /// wasm files. + /// + /// This is optional and lazily created on demand. + dwarf: Option, +} + +impl<'a> ObjectBuilder<'a> { + /// Creates a new builder for the `obj` specified. + pub fn new(mut obj: Object<'a>, tunables: &'a Tunables) -> ObjectBuilder<'a> { + let data = obj.add_section( + obj.segment_name(StandardSegment::Data).to_vec(), + obj::ELF_WASM_DATA.as_bytes().to_vec(), + SectionKind::ReadOnlyData, + ); + ObjectBuilder { + obj, + tunables, + data, + names: None, + dwarf: None, + } + } + + /// Completes compilation of the `translation` specified, inserting + /// everything necessary into the `Object` being built. + /// + /// This function will consume the final results of compiling a wasm module + /// and finish the ELF image in-progress as part of `self.obj` by appending + /// any compiler-agnostic sections. + /// + /// The auxiliary `CompiledModuleInfo` structure returned here has also been + /// serialized into the object returned, but if the caller will quickly + /// turn-around and invoke `CompiledModule::from_artifacts` after this then + /// the information can be passed to that method to avoid extra + /// deserialization. This is done to avoid a serialize-then-deserialize for + /// API calls like `Module::new` where the compiled module is immediately + /// going to be used. + /// + /// The various arguments here are: + /// + /// * `translation` - the core wasm translation that's being completed. + /// + /// * `funcs` - compilation metadata about functions within the translation + /// as well as where the functions are located in the text section and any + /// associated trampolines. + /// + /// * `wasm_to_native_trampolines` - list of all trampolines necessary for + /// Wasm callers calling native callees (e.g. `Func::wrap`). One for each + /// function signature in the module. Must be sorted by `SignatureIndex`. + /// + /// Returns the `CompiledModuleInfo` corresponding to this core Wasm module + /// as a result of this append operation. This is then serialized into the + /// final artifact by the caller. + pub fn append( + &mut self, + translation: ModuleTranslation<'_>, + funcs: PrimaryMap, + wasm_to_native_trampolines: Vec<(ModuleInternedTypeIndex, FunctionLoc)>, + ) -> Result { + let ModuleTranslation { + mut module, + debuginfo, + has_unparsed_debuginfo, + data, + data_align, + passive_data, + .. + } = translation; + + // Place all data from the wasm module into a section which will the + // source of the data later at runtime. This additionally keeps track of + // the offset of + let mut total_data_len = 0; + let data_offset = self + .obj + .append_section_data(self.data, &[], data_align.unwrap_or(1)); + for (i, data) in data.iter().enumerate() { + // The first data segment has its alignment specified as the alignment + // for the entire section, but everything afterwards is adjacent so it + // has alignment of 1. + let align = if i == 0 { data_align.unwrap_or(1) } else { 1 }; + self.obj.append_section_data(self.data, data, align); + total_data_len += data.len(); + } + for data in passive_data.iter() { + self.obj.append_section_data(self.data, data, 1); + } + + // If any names are present in the module then the `ELF_NAME_DATA` section + // is create and appended. + let mut func_names = Vec::new(); + if debuginfo.name_section.func_names.len() > 0 { + let name_id = *self.names.get_or_insert_with(|| { + self.obj.add_section( + self.obj.segment_name(StandardSegment::Data).to_vec(), + obj::ELF_NAME_DATA.as_bytes().to_vec(), + SectionKind::ReadOnlyData, + ) + }); + let mut sorted_names = debuginfo.name_section.func_names.iter().collect::>(); + sorted_names.sort_by_key(|(idx, _name)| *idx); + for (idx, name) in sorted_names { + let offset = self.obj.append_section_data(name_id, name.as_bytes(), 1); + let offset = match u32::try_from(offset) { + Ok(offset) => offset, + Err(_) => bail!("name section too large (> 4gb)"), + }; + let len = u32::try_from(name.len()).unwrap(); + func_names.push(FunctionName { + idx: *idx, + offset, + len, + }); + } + } + + // Data offsets in `MemoryInitialization` are offsets within the + // `translation.data` list concatenated which is now present in the data + // segment that's appended to the object. Increase the offsets by + // `self.data_size` to account for any previously added module. + let data_offset = u32::try_from(data_offset).unwrap(); + match &mut module.memory_initialization { + MemoryInitialization::Segmented(list) => { + for segment in list { + segment.data.start = segment.data.start.checked_add(data_offset).unwrap(); + segment.data.end = segment.data.end.checked_add(data_offset).unwrap(); + } + } + MemoryInitialization::Static { map } => { + for (_, segment) in map { + if let Some(segment) = segment { + segment.data.start = segment.data.start.checked_add(data_offset).unwrap(); + segment.data.end = segment.data.end.checked_add(data_offset).unwrap(); + } + } + } + } + + // Data offsets for passive data are relative to the start of + // `translation.passive_data` which was appended to the data segment + // of this object, after active data in `translation.data`. Update the + // offsets to account prior modules added in addition to active data. + let data_offset = data_offset + u32::try_from(total_data_len).unwrap(); + for (_, range) in module.passive_data_map.iter_mut() { + range.start = range.start.checked_add(data_offset).unwrap(); + range.end = range.end.checked_add(data_offset).unwrap(); + } + + // Insert the wasm raw wasm-based debuginfo into the output, if + // requested. Note that this is distinct from the native debuginfo + // possibly generated by the native compiler, hence these sections + // getting wasm-specific names. + let mut dwarf = Vec::new(); + if self.tunables.parse_wasm_debuginfo { + self.push_debug(&mut dwarf, &debuginfo.dwarf.debug_abbrev); + self.push_debug(&mut dwarf, &debuginfo.dwarf.debug_addr); + self.push_debug(&mut dwarf, &debuginfo.dwarf.debug_aranges); + self.push_debug(&mut dwarf, &debuginfo.dwarf.debug_info); + self.push_debug(&mut dwarf, &debuginfo.dwarf.debug_line); + self.push_debug(&mut dwarf, &debuginfo.dwarf.debug_line_str); + self.push_debug(&mut dwarf, &debuginfo.dwarf.debug_str); + self.push_debug(&mut dwarf, &debuginfo.dwarf.debug_str_offsets); + self.push_debug(&mut dwarf, &debuginfo.debug_ranges); + self.push_debug(&mut dwarf, &debuginfo.debug_rnglists); + } + // Sort this for binary-search-lookup later in `symbolize_context`. + dwarf.sort_by_key(|(id, _)| *id); + + Ok(CompiledModuleInfo { + module, + funcs, + wasm_to_native_trampolines, + func_names, + meta: Metadata { + native_debug_info_present: self.tunables.generate_native_debuginfo, + has_unparsed_debuginfo, + code_section_offset: debuginfo.wasm_file.code_section_offset, + has_wasm_debuginfo: self.tunables.parse_wasm_debuginfo, + dwarf, + }, + }) + } + + fn push_debug<'b, T>(&mut self, dwarf: &mut Vec<(u8, Range)>, section: &T) + where + T: gimli::Section>, + { + let data = section.reader().slice(); + if data.is_empty() { + return; + } + let section_id = *self.dwarf.get_or_insert_with(|| { + self.obj.add_section( + self.obj.segment_name(StandardSegment::Debug).to_vec(), + obj::ELF_WASMTIME_DWARF.as_bytes().to_vec(), + SectionKind::Debug, + ) + }); + let offset = self.obj.append_section_data(section_id, data, 1); + dwarf.push((T::id() as u8, offset..offset + data.len() as u64)); + } + + /// Creates the `ELF_WASMTIME_INFO` section from the given serializable data + /// structure. + pub fn serialize_info(&mut self, info: &T) + where + T: serde::Serialize, + { + let section = self.obj.add_section( + self.obj.segment_name(StandardSegment::Data).to_vec(), + obj::ELF_WASMTIME_INFO.as_bytes().to_vec(), + SectionKind::ReadOnlyData, + ); + let data = bincode::serialize(info).unwrap(); + self.obj.set_section_data(section, data, 1); + } + + /// Serializes `self` into a buffer. This can be used for execution as well + /// as serialization. + pub fn finish(self, t: &mut T) -> Result<()> { + self.obj.emit(t).map_err(|e| e.into()) + } +} + +/// A type which can be the result of serializing an object. +pub trait FinishedObject: Sized { + /// Emit the object as `Self`. + fn finish_object(obj: ObjectBuilder<'_>) -> Result; +} + +impl FinishedObject for Vec { + fn finish_object(obj: ObjectBuilder<'_>) -> Result { + let mut result = ObjectVec::default(); + obj.finish(&mut result)?; + return Ok(result.0); + + #[derive(Default)] + struct ObjectVec(Vec); + + impl WritableBuffer for ObjectVec { + fn len(&self) -> usize { + self.0.len() + } + + fn reserve(&mut self, additional: usize) -> Result<(), ()> { + assert_eq!(self.0.len(), 0, "cannot reserve twice"); + self.0 = Vec::with_capacity(additional); + Ok(()) + } + + fn resize(&mut self, new_len: usize) { + if new_len <= self.0.len() { + self.0.truncate(new_len) + } else { + self.0.extend(vec![0; new_len - self.0.len()]) + } + } + + fn write_bytes(&mut self, val: &[u8]) { + self.0.extend(val); + } + } + } +} diff --git a/crates/environ/src/module_environ.rs b/crates/environ/src/module_environ.rs index 00a5885c6f7e..85adaed5d303 100644 --- a/crates/environ/src/module_environ.rs +++ b/crates/environ/src/module_environ.rs @@ -4,9 +4,9 @@ use crate::module::{ }; use crate::{ DataIndex, DefinedFuncIndex, ElemIndex, EntityIndex, EntityType, FuncIndex, GlobalIndex, - GlobalInit, MemoryIndex, ModuleTypesBuilder, PrimaryMap, SignatureIndex, TableIndex, - TableInitialValue, Tunables, TypeConvert, TypeIndex, WasmError, WasmFuncType, WasmHeapType, - WasmResult, WasmType, + GlobalInit, MemoryIndex, ModuleTypesBuilder, PrimaryMap, TableIndex, TableInitialValue, + Tunables, TypeConvert, TypeIndex, Unsigned, WasmError, WasmHeapType, WasmResult, WasmValType, + WasmparserTypeConverter, }; use cranelift_entity::packed_option::ReservedValue; use std::borrow::Cow; @@ -14,11 +14,13 @@ use std::collections::HashMap; use std::convert::TryFrom; use std::path::PathBuf; use std::sync::Arc; +use wasmparser::types::{CoreTypeId, Types}; use wasmparser::{ - types::Types, CustomSectionReader, DataKind, ElementItems, ElementKind, Encoding, ExternalKind, - FuncToValidate, FunctionBody, NameSectionReader, Naming, Operator, Parser, Payload, TypeRef, - Validator, ValidatorResources, + CompositeType, CustomSectionReader, DataKind, ElementItems, ElementKind, Encoding, + ExternalKind, FuncToValidate, FunctionBody, NameSectionReader, Naming, Operator, Parser, + Payload, TypeRef, Validator, ValidatorResources, }; +use wasmtime_types::ModuleInternedTypeIndex; /// Object containing the standalone environment information. pub struct ModuleEnvironment<'a, 'data> { @@ -54,7 +56,7 @@ pub struct ModuleTranslation<'data> { /// A list of type signatures which are considered exported from this /// module, or those that can possibly be called. This list is sorted, and /// trampolines for each of these signatures are required. - pub exported_signatures: Vec, + pub exported_signatures: Vec, /// DWARF debug information, if enabled, parsed from the module. pub debuginfo: DebugInfoData<'data>, @@ -151,8 +153,8 @@ pub struct WasmFileInfo { #[derive(Debug)] #[allow(missing_docs)] pub struct FunctionMetadata { - pub params: Box<[WasmType]>, - pub locals: Box<[(u32, WasmType)]>, + pub params: Box<[WasmValType]>, + pub locals: Box<[(u32, WasmValType)]>, } impl<'a, 'data> ModuleEnvironment<'a, 'data> { @@ -237,9 +239,10 @@ impl<'a, 'data> ModuleEnvironment<'a, 'data> { self.result.module.types.reserve(num); self.types.reserve_wasm_signatures(num); - for ty in types.into_iter_err_on_gc_types() { - let ty = self.convert_func_type(&ty?); - self.declare_type_func(ty)?; + for i in 0..types.count() { + let types = self.validator.types(0).unwrap(); + let ty = types.core_type_at(i); + self.declare_type(ty.unwrap_sub())?; } } @@ -487,7 +490,7 @@ impl<'a, 'data> ModuleEnvironment<'a, 'data> { let table_index = TableIndex::from_u32(table_index.unwrap_or(0)); let mut offset_expr_reader = offset_expr.get_binary_reader(); let (base, offset) = match offset_expr_reader.read_operator()? { - Operator::I32Const { value } => (None, value as u32), + Operator::I32Const { value } => (None, value.unsigned()), Operator::GlobalGet { global_index } => { (Some(GlobalIndex::from_u32(global_index)), 0) } @@ -607,8 +610,8 @@ impl<'a, 'data> ModuleEnvironment<'a, 'data> { let memory_index = MemoryIndex::from_u32(memory_index); let mut offset_expr_reader = offset_expr.get_binary_reader(); let (base, offset) = match offset_expr_reader.read_operator()? { - Operator::I32Const { value } => (None, value as u64), - Operator::I64Const { value } => (None, value as u64), + Operator::I32Const { value } => (None, value.unsigned().into()), + Operator::I64Const { value } => (None, value.unsigned()), Operator::GlobalGet { global_index } => { (Some(GlobalIndex::from_u32(global_index)), 0) } @@ -791,12 +794,22 @@ and for re-adding support for interface types you can see this issue: self.result.module.num_escaped_funcs += 1; } - fn declare_type_func(&mut self, wasm: WasmFuncType) -> WasmResult<()> { - let sig_index = self.types.wasm_func_type(wasm); - self.result - .module - .types - .push(ModuleType::Function(sig_index)); + fn declare_type(&mut self, id: CoreTypeId) -> WasmResult<()> { + let types = self.validator.types(0).unwrap(); + let ty = &types[id]; + assert!(ty.is_final); + assert!(ty.supertype_idx.is_none()); + match &ty.composite_type { + CompositeType::Func(ty) => { + let wasm = self.convert_func_type(ty); + let sig_index = self.types.wasm_func_type(id, wasm); + self.result + .module + .types + .push(ModuleType::Function(sig_index)); + } + CompositeType::Array(_) | CompositeType::Struct(_) => unimplemented!(), + } Ok(()) } @@ -862,6 +875,7 @@ and for re-adding support for interface types you can see this issue: | wasmparser::Name::Memory(_) | wasmparser::Name::Element(_) | wasmparser::Name::Data(_) + | wasmparser::Name::Tag(_) | wasmparser::Name::Unknown { .. } => {} } } @@ -870,7 +884,11 @@ and for re-adding support for interface types you can see this issue: } impl TypeConvert for ModuleEnvironment<'_, '_> { - fn lookup_heap_type(&self, index: TypeIndex) -> WasmHeapType { - self.result.module.lookup_heap_type(index) + fn lookup_heap_type(&self, index: wasmparser::UnpackedIndex) -> WasmHeapType { + WasmparserTypeConverter { + types: &self.types, + module: &self.result.module, + } + .lookup_heap_type(index) } } diff --git a/crates/environ/src/module_types.rs b/crates/environ/src/module_types.rs index 287cbb667b63..35bb60744f9c 100644 --- a/crates/environ/src/module_types.rs +++ b/crates/environ/src/module_types.rs @@ -1,7 +1,10 @@ -use crate::{PrimaryMap, SignatureIndex, WasmFuncType}; +use crate::{Module, ModuleType, PrimaryMap, TypeConvert, WasmFuncType, WasmHeapType}; use serde_derive::{Deserialize, Serialize}; use std::collections::HashMap; use std::ops::Index; +use wasmparser::types::CoreTypeId; +use wasmparser::UnpackedIndex; +use wasmtime_types::{ModuleInternedTypeIndex, TypeIndex}; /// All types used in a core wasm module. /// @@ -13,22 +16,22 @@ use std::ops::Index; #[derive(Default, Serialize, Deserialize)] #[allow(missing_docs)] pub struct ModuleTypes { - wasm_signatures: PrimaryMap, + wasm_types: PrimaryMap, } impl ModuleTypes { /// Returns an iterator over all the wasm function signatures found within /// this module. - pub fn wasm_signatures(&self) -> impl Iterator { - self.wasm_signatures.iter() + pub fn wasm_types(&self) -> impl Iterator { + self.wasm_types.iter() } } -impl Index for ModuleTypes { +impl Index for ModuleTypes { type Output = WasmFuncType; - fn index(&self, sig: SignatureIndex) -> &WasmFuncType { - &self.wasm_signatures[sig] + fn index(&self, sig: ModuleInternedTypeIndex) -> &WasmFuncType { + &self.wasm_types[sig] } } @@ -37,24 +40,31 @@ impl Index for ModuleTypes { #[allow(missing_docs)] pub struct ModuleTypesBuilder { types: ModuleTypes, - interned_func_types: HashMap, + interned_func_types: HashMap, + wasmparser_to_wasmtime: HashMap, } impl ModuleTypesBuilder { /// Reserves space for `amt` more type signatures. pub fn reserve_wasm_signatures(&mut self, amt: usize) { - self.types.wasm_signatures.reserve(amt); + self.types.wasm_types.reserve(amt); } /// Interns the `sig` specified and returns a unique `SignatureIndex` that /// can be looked up within [`ModuleTypes`] to recover the [`WasmFuncType`] /// at runtime. - pub fn wasm_func_type(&mut self, sig: WasmFuncType) -> SignatureIndex { + pub fn wasm_func_type(&mut self, id: CoreTypeId, sig: WasmFuncType) -> ModuleInternedTypeIndex { + let sig = self.intern_func_type(sig); + self.wasmparser_to_wasmtime.insert(id, sig); + sig + } + + fn intern_func_type(&mut self, sig: WasmFuncType) -> ModuleInternedTypeIndex { if let Some(idx) = self.interned_func_types.get(&sig) { return *idx; } - let idx = self.types.wasm_signatures.push(sig.clone()); + let idx = self.types.wasm_types.push(sig.clone()); self.interned_func_types.insert(sig, idx); return idx; } @@ -63,6 +73,14 @@ impl ModuleTypesBuilder { pub fn finish(self) -> ModuleTypes { self.types } + + /// Returns an iterator over all the wasm function signatures found within + /// this module. + pub fn wasm_signatures( + &self, + ) -> impl Iterator { + self.types.wasm_types() + } } // Forward the indexing impl to the internal `ModuleTypes` @@ -76,3 +94,27 @@ where &self.types[sig] } } + +#[allow(missing_docs)] +pub struct WasmparserTypeConverter<'a> { + pub types: &'a ModuleTypesBuilder, + pub module: &'a Module, +} + +impl TypeConvert for WasmparserTypeConverter<'_> { + fn lookup_heap_type(&self, index: UnpackedIndex) -> WasmHeapType { + match index { + UnpackedIndex::Id(id) => { + let signature = self.types.wasmparser_to_wasmtime[&id]; + WasmHeapType::Concrete(signature) + } + UnpackedIndex::RecGroup(_) => unreachable!(), + UnpackedIndex::Module(i) => { + let i = TypeIndex::from_u32(i); + match self.module.types[i] { + ModuleType::Function(sig) => WasmHeapType::Concrete(sig), + } + } + } + } +} diff --git a/crates/environ/src/scopevec.rs b/crates/environ/src/scopevec.rs index 6c7e58a163e9..ea95aaf68af0 100644 --- a/crates/environ/src/scopevec.rs +++ b/crates/environ/src/scopevec.rs @@ -28,10 +28,12 @@ impl ScopeVec { /// /// The original data will be deallocated when `self` is dropped. pub fn push(&self, data: Vec) -> &mut [T] { - let mut data: Box<[T]> = data.into(); - let ptr = data.as_mut_ptr(); + let data: Box<[T]> = data.into(); let len = data.len(); - self.data.borrow_mut().push(data); + + let mut storage = self.data.borrow_mut(); + storage.push(data); + let ptr = storage.last_mut().unwrap().as_mut_ptr(); // This should be safe for a few reasons: // @@ -55,3 +57,22 @@ impl ScopeVec { unsafe { std::slice::from_raw_parts_mut(ptr, len) } } } + +#[cfg(test)] +mod tests { + use super::ScopeVec; + + #[test] + fn smoke() { + let scope = ScopeVec::new(); + let a = scope.push(Vec::new()); + let b = scope.push(vec![1, 2, 3]); + let c = scope.push(vec![4, 5, 6]); + assert_eq!(a.len(), 0); + b[0] = 4; + c[2] = 5; + assert_eq!(a, []); + assert_eq!(b, [4, 2, 3]); + assert_eq!(c, [4, 5, 5]); + } +} diff --git a/crates/environ/src/tunables.rs b/crates/environ/src/tunables.rs index 7ba3e6fdfc9b..4ff360fcb523 100644 --- a/crates/environ/src/tunables.rs +++ b/crates/environ/src/tunables.rs @@ -1,7 +1,7 @@ use serde_derive::{Deserialize, Serialize}; /// Tunable parameters for WebAssembly compilation. -#[derive(Clone, Hash, Serialize, Deserialize)] +#[derive(Clone, Hash, Serialize, Deserialize, Debug)] pub struct Tunables { /// For static heaps, the size in wasm pages of the heap protected by bounds /// checking. @@ -56,62 +56,85 @@ pub struct Tunables { pub tail_callable: bool, } -impl Default for Tunables { - fn default() -> Self { - let (static_memory_bound, static_memory_offset_guard_size) = if cfg!(miri) { +impl Tunables { + /// Returns a `Tunables` configuration assumed for running code on the host. + pub fn default_host() -> Self { + if cfg!(miri) { + Tunables::default_miri() + } else if cfg!(target_pointer_width = "32") { + Tunables::default_u32() + } else if cfg!(target_pointer_width = "64") { + Tunables::default_u64() + } else { + panic!("unsupported target_pointer_width"); + } + } + + /// Returns the default set of tunables for running under MIRI. + pub fn default_miri() -> Tunables { + Tunables { // No virtual memory tricks are available on miri so make these // limits quite conservative. - ((1 << 20) / crate::WASM_PAGE_SIZE as u64, 0) - } else if cfg!(target_pointer_width = "64") { + static_memory_bound: (1 << 20) / crate::WASM_PAGE_SIZE as u64, + static_memory_offset_guard_size: 0, + dynamic_memory_offset_guard_size: 0, + dynamic_memory_growth_reserve: 0, + + // General options which have the same defaults regardless of + // architecture. + generate_native_debuginfo: false, + parse_wasm_debuginfo: true, + consume_fuel: false, + epoch_interruption: false, + static_memory_bound_is_maximum: false, + guard_before_linear_memory: true, + generate_address_map: true, + debug_adapter_modules: false, + relaxed_simd_deterministic: false, + tail_callable: false, + } + } + + /// Returns the default set of tunables for running under a 32-bit host. + pub fn default_u32() -> Tunables { + Tunables { + // For 32-bit we scale way down to 10MB of reserved memory. This + // impacts performance severely but allows us to have more than a + // few instances running around. + static_memory_bound: (10 * (1 << 20)) / crate::WASM_PAGE_SIZE as u64, + static_memory_offset_guard_size: 0x1_0000, + dynamic_memory_offset_guard_size: 0x1_0000, + dynamic_memory_growth_reserve: 1 << 20, // 1MB + + ..Tunables::default_miri() + } + } + + /// Returns the default set of tunables for running under a 64-bit host. + pub fn default_u64() -> Tunables { + Tunables { // 64-bit has tons of address space to static memories can have 4gb // address space reservations liberally by default, allowing us to // help eliminate bounds checks. // // Coupled with a 2 GiB address space guard it lets us translate // wasm offsets into x86 offsets as aggressively as we can. - (0x1_0000, 0x8000_0000) - } else if cfg!(target_pointer_width = "32") { - // For 32-bit we scale way down to 10MB of reserved memory. This - // impacts performance severely but allows us to have more than a - // few instances running around. - ((10 * (1 << 20)) / crate::WASM_PAGE_SIZE as u64, 0x1_0000) - } else { - panic!("unsupported target_pointer_width"); - }; - Self { - static_memory_bound, - static_memory_offset_guard_size, + static_memory_bound: 0x1_0000, + static_memory_offset_guard_size: 0x8000_0000, // Size in bytes of the offset guard for dynamic memories. // // Allocate a small guard to optimize common cases but without // wasting too much memory. - dynamic_memory_offset_guard_size: if cfg!(miri) { 0 } else { 0x1_0000 }, + dynamic_memory_offset_guard_size: 0x1_0000, // We've got lots of address space on 64-bit so use a larger // grow-into-this area, but on 32-bit we aren't as lucky. Miri is // not exactly fast so reduce memory consumption instead of trying // to avoid memory movement. - dynamic_memory_growth_reserve: if cfg!(miri) { - 0 - } else if cfg!(target_pointer_width = "64") { - 2 << 30 // 2GB - } else if cfg!(target_pointer_width = "32") { - 1 << 20 // 1MB - } else { - panic!("unsupported target_pointer_width"); - }, + dynamic_memory_growth_reserve: 2 << 30, // 2GB - generate_native_debuginfo: false, - parse_wasm_debuginfo: true, - consume_fuel: false, - epoch_interruption: false, - static_memory_bound_is_maximum: false, - guard_before_linear_memory: true, - generate_address_map: true, - debug_adapter_modules: false, - relaxed_simd_deterministic: false, - tail_callable: false, + ..Tunables::default_miri() } } } diff --git a/crates/environ/src/vmoffsets.rs b/crates/environ/src/vmoffsets.rs index a9409568acd7..7faec80ea7ab 100644 --- a/crates/environ/src/vmoffsets.rs +++ b/crates/environ/src/vmoffsets.rs @@ -11,7 +11,7 @@ // externref_activations_table: *mut VMExternRefActivationsTable, // store: *mut dyn Store, // builtins: *mut VMBuiltinFunctionsArray, -// signature_ids: *const VMSharedSignatureIndex, +// type_ids: *const VMSharedTypeIndex, // imported_functions: [VMFunctionImport; module.num_imported_functions], // imported_tables: [VMTableImport; module.num_imported_tables], // imported_memories: [VMMemoryImport; module.num_imported_memories], @@ -80,7 +80,7 @@ pub struct VMOffsets

{ externref_activations_table: u32, store: u32, builtin_functions: u32, - signature_ids: u32, + type_ids: u32, imported_functions: u32, imported_tables: u32, imported_memories: u32, @@ -355,7 +355,7 @@ impl VMOffsets

{ imported_memories: "imported memories", imported_tables: "imported tables", imported_functions: "imported functions", - signature_ids: "module types", + type_ids: "module types", builtin_functions: "jit builtin functions state", store: "jit store state", externref_activations_table: "jit host externref state", @@ -387,7 +387,7 @@ impl From> for VMOffsets

{ externref_activations_table: 0, store: 0, builtin_functions: 0, - signature_ids: 0, + type_ids: 0, imported_functions: 0, imported_tables: 0, imported_memories: 0, @@ -438,7 +438,7 @@ impl From> for VMOffsets

{ size(externref_activations_table) = ret.ptr.size(), size(store) = ret.ptr.size() * 2, size(builtin_functions) = ret.pointer_size(), - size(signature_ids) = ret.ptr.size(), + size(type_ids) = ret.ptr.size(), size(imported_functions) = cmul(ret.num_imported_functions, ret.size_of_vmfunction_import()), size(imported_tables) @@ -596,11 +596,11 @@ impl VMOffsets

{ } } -/// Offsets for `VMSharedSignatureIndex`. +/// Offsets for `VMSharedTypeIndex`. impl VMOffsets

{ - /// Return the size of `VMSharedSignatureIndex`. + /// Return the size of `VMSharedTypeIndex`. #[inline] - pub fn size_of_vmshared_signature_index(&self) -> u8 { + pub fn size_of_vmshared_type_index(&self) -> u8 { 4 } } @@ -643,10 +643,10 @@ impl VMOffsets

{ self.store } - /// The offset of the `signature_ids` array pointer. + /// The offset of the `type_ids` array pointer. #[inline] - pub fn vmctx_signature_ids_array(&self) -> u32 { - self.signature_ids + pub fn vmctx_type_ids_array(&self) -> u32 { + self.type_ids } /// The offset of the `tables` array. diff --git a/crates/explorer/Cargo.toml b/crates/explorer/Cargo.toml index 408518e1e35b..dcda32acc279 100644 --- a/crates/explorer/Cargo.toml +++ b/crates/explorer/Cargo.toml @@ -8,6 +8,9 @@ license = "Apache-2.0 WITH LLVM-exception" repository = "https://github.com/bytecodealliance/wasmtime" version.workspace = true +[lints] +workspace = true + [dependencies] anyhow = { workspace = true } capstone = { workspace = true } @@ -16,4 +19,4 @@ serde_derive = { workspace = true } serde_json = { workspace = true } target-lexicon = { workspace = true } wasmprinter = { workspace = true } -wasmtime = { workspace = true, features = ["cranelift"] } +wasmtime = { workspace = true, features = ["cranelift", "runtime"] } diff --git a/crates/fiber/Cargo.toml b/crates/fiber/Cargo.toml index 555733050f51..7ba3878efd4c 100644 --- a/crates/fiber/Cargo.toml +++ b/crates/fiber/Cargo.toml @@ -7,6 +7,9 @@ license = "Apache-2.0 WITH LLVM-exception" repository = "https://github.com/bytecodealliance/wasmtime" edition.workspace = true +[lints] +workspace = true + [dependencies] anyhow = { workspace = true } cfg-if = { workspace = true } diff --git a/crates/fiber/src/lib.rs b/crates/fiber/src/lib.rs index 5b20157cf7eb..4b0e31a876ad 100644 --- a/crates/fiber/src/lib.rs +++ b/crates/fiber/src/lib.rs @@ -65,7 +65,8 @@ impl FiberStack { /// A creator of RuntimeFiberStacks. pub unsafe trait RuntimeFiberStackCreator: Send + Sync { - /// Creates a new RuntimeFiberStack with the specified size, guard pages should be included. + /// Creates a new RuntimeFiberStack with the specified size, guard pages should be included, + /// memory should be zeroed. /// /// This is useful to plugin previously allocated memory instead of mmap'ing a new stack for /// every instance. diff --git a/crates/fiber/src/unix.rs b/crates/fiber/src/unix.rs index 7b6534344ecd..6880be7f9c5d 100644 --- a/crates/fiber/src/unix.rs +++ b/crates/fiber/src/unix.rs @@ -130,14 +130,14 @@ impl FiberStack { assert!( start_ptr.align_offset(page_size) == 0, "expected fiber stack end ({}) to be page aligned ({})", - range.start as usize, + range.start, page_size ); let end_ptr = range.end as *const u8; assert!( end_ptr.align_offset(page_size) == 0, "expected fiber stack start ({}) to be page aligned ({})", - range.end as usize, + range.end, page_size ); range diff --git a/crates/fiber/src/windows.c b/crates/fiber/src/windows.c index 9d4176eb1b7b..bd7c083db281 100644 --- a/crates/fiber/src/windows.c +++ b/crates/fiber/src/windows.c @@ -1,9 +1,9 @@ #include -#define CONCAT2(a, b) a ## b -#define CONCAT(a, b) CONCAT2(a , b) +#define CONCAT2(a, b) a##b +#define CONCAT(a, b) CONCAT2(a, b) #define VERSIONED_SYMBOL(a) CONCAT(a, VERSIONED_SUFFIX) LPVOID VERSIONED_SYMBOL(wasmtime_fiber_get_current)() { - return GetCurrentFiber(); + return GetCurrentFiber(); } diff --git a/crates/fuzzing/Cargo.toml b/crates/fuzzing/Cargo.toml index 4e56f948489e..6828481bb09b 100644 --- a/crates/fuzzing/Cargo.toml +++ b/crates/fuzzing/Cargo.toml @@ -7,6 +7,9 @@ publish = false version = "0.0.0" license = "Apache-2.0 WITH LLVM-exception" +[lints] +workspace = true + [dependencies] anyhow = { workspace = true } arbitrary = { workspace = true, features = ["derive"] } @@ -25,7 +28,7 @@ wasm-encoder = { workspace = true } wasm-smith = { workspace = true } wasm-mutate = { workspace = true } wasm-spec-interpreter = { path = "./wasm-spec-interpreter", optional = true } -wasmi = "0.20.0" +wasmi = "0.31.1" # We rely on precompiled v8 binaries, but rusty-v8 doesn't have a precompiled # binary for MinGW which is built on our CI. It does have one for Windows-msvc, diff --git a/crates/fuzzing/src/generators/config.rs b/crates/fuzzing/src/generators/config.rs index a5914ee36b84..d91de86b8200 100644 --- a/crates/fuzzing/src/generators/config.rs +++ b/crates/fuzzing/src/generators/config.rs @@ -47,7 +47,8 @@ impl Config { // Allow a memory to be generated, but don't let it get too large. // Additionally require the maximum size to guarantee that the growth // behavior is consistent across engines. - config.max_memory_pages = 10; + config.max_memory32_pages = 10; + config.max_memory64_pages = 10; config.memory_max_size_required = true; // If tables are generated make sure they don't get too large to avoid @@ -339,11 +340,13 @@ impl<'a> Arbitrary<'a> for Config { // Ensure the pooling allocator can support the maximal size of // memory, picking the smaller of the two to win. - if cfg.max_memory_pages < pooling.memory_pages { - pooling.memory_pages = cfg.max_memory_pages; - } else { - cfg.max_memory_pages = pooling.memory_pages; - } + let min = cfg + .max_memory32_pages + .min(cfg.max_memory64_pages) + .min(pooling.memory_pages); + pooling.memory_pages = min; + cfg.max_memory32_pages = min; + cfg.max_memory64_pages = min; // If traps are disallowed then memories must have at least one page // of memory so if we still are only allowing 0 pages of memory then @@ -351,7 +354,8 @@ impl<'a> Arbitrary<'a> for Config { if cfg.disallow_traps { if pooling.memory_pages == 0 { pooling.memory_pages = 1; - cfg.max_memory_pages = 1; + cfg.max_memory32_pages = 1; + cfg.max_memory64_pages = 1; } // .. additionally update tables if pooling.table_elements == 0 { diff --git a/crates/fuzzing/src/generators/module.rs b/crates/fuzzing/src/generators/module.rs index 7ff78c2b7d68..b669ff25d71c 100644 --- a/crates/fuzzing/src/generators/module.rs +++ b/crates/fuzzing/src/generators/module.rs @@ -1,21 +1,20 @@ //! Generate a Wasm module and the configuration for generating it. use arbitrary::{Arbitrary, Unstructured}; -use wasm_smith::SwarmConfig; /// Default module-level configuration for fuzzing Wasmtime. /// -/// Internally this uses `wasm-smith`'s own `SwarmConfig` but we further refine +/// Internally this uses `wasm-smith`'s own `Config` but we further refine /// the defaults here as well. #[derive(Debug, Clone)] pub struct ModuleConfig { #[allow(missing_docs)] - pub config: SwarmConfig, + pub config: wasm_smith::Config, } impl<'a> Arbitrary<'a> for ModuleConfig { fn arbitrary(u: &mut Unstructured<'a>) -> arbitrary::Result { - let mut config = SwarmConfig::arbitrary(u)?; + let mut config = wasm_smith::Config::arbitrary(u)?; // Allow multi-memory but make it unlikely if u.ratio(1, 20)? { @@ -63,7 +62,7 @@ impl ModuleConfig { let mut module = wasm_smith::Module::new(self.config.clone(), input)?; if let Some(default_fuel) = default_fuel { - module.ensure_termination(default_fuel); + module.ensure_termination(default_fuel).unwrap(); } Ok(module) diff --git a/crates/fuzzing/src/generators/single_inst_module.rs b/crates/fuzzing/src/generators/single_inst_module.rs index e42b452244a3..9a66fcdf1761 100644 --- a/crates/fuzzing/src/generators/single_inst_module.rs +++ b/crates/fuzzing/src/generators/single_inst_module.rs @@ -314,11 +314,11 @@ static INSTRUCTIONS: &[SingleInstModule] = &[ inst!(F32Ge, (f32, f32) -> i32), inst!(F64Ge, (f64, f64) -> i32), // Integer conversions ("to integer"). - inst!(I32Extend8S, (i32) -> i32, |c| c.config.sign_extension_enabled), - inst!(I32Extend16S, (i32) -> i32, |c| c.config.sign_extension_enabled), - inst!(I64Extend8S, (i64) -> i64, |c| c.config.sign_extension_enabled), - inst!(I64Extend16S, (i64) -> i64, |c| c.config.sign_extension_enabled), - inst!(I64Extend32S, (i64) -> i64, |c| c.config.sign_extension_enabled), + inst!(I32Extend8S, (i32) -> i32, |c| c.config.sign_extension_ops_enabled), + inst!(I32Extend16S, (i32) -> i32, |c| c.config.sign_extension_ops_enabled), + inst!(I64Extend8S, (i64) -> i64, |c| c.config.sign_extension_ops_enabled), + inst!(I64Extend16S, (i64) -> i64, |c| c.config.sign_extension_ops_enabled), + inst!(I64Extend32S, (i64) -> i64, |c| c.config.sign_extension_ops_enabled), inst!(I32WrapI64, (i64) -> i32), inst!(I64ExtendI32S, (i32) -> i64), inst!(I64ExtendI32U, (i32) -> i64), diff --git a/crates/fuzzing/src/generators/table_ops.rs b/crates/fuzzing/src/generators/table_ops.rs index 48440ba0c85b..e22780a7cb49 100644 --- a/crates/fuzzing/src/generators/table_ops.rs +++ b/crates/fuzzing/src/generators/table_ops.rs @@ -112,7 +112,7 @@ impl TableOps { func.instruction(&Instruction::Loop(wasm_encoder::BlockType::Empty)); for op in &self.ops { - op.insert(&mut func, self.num_params as u32); + op.insert(&mut func, self.num_params); } func.instruction(&Instruction::Br(0)); func.instruction(&Instruction::End); diff --git a/crates/fuzzing/src/oracles.rs b/crates/fuzzing/src/oracles.rs index 844654b4e4d2..9381e5785537 100644 --- a/crates/fuzzing/src/oracles.rs +++ b/crates/fuzzing/src/oracles.rs @@ -21,6 +21,7 @@ mod stacks; use self::diff_wasmtime::WasmtimeInstance; use self::engine::{DiffEngine, DiffInstance}; use crate::generators::{self, DiffValue, DiffValueType}; +use crate::single_module_fuzzer::KnownValid; use arbitrary::Arbitrary; pub use stacks::check_stacks; use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering::SeqCst}; @@ -135,7 +136,12 @@ pub enum Timeout { /// panic or segfault or anything else that can be detected "passively". /// /// The engine will be configured using provided config. -pub fn instantiate(wasm: &[u8], known_valid: bool, config: &generators::Config, timeout: Timeout) { +pub fn instantiate( + wasm: &[u8], + known_valid: KnownValid, + config: &generators::Config, + timeout: Timeout, +) { let mut store = config.to_store(); let module = match compile_module(store.engine(), wasm, known_valid, config) { @@ -193,7 +199,7 @@ pub enum Command { /// The modules are expected to *not* have start functions as no timeouts are configured. pub fn instantiate_many( modules: &[Vec], - known_valid: bool, + known_valid: KnownValid, config: &generators::Config, commands: &[Command], ) { @@ -246,13 +252,13 @@ pub fn instantiate_many( fn compile_module( engine: &Engine, bytes: &[u8], - known_valid: bool, + known_valid: KnownValid, config: &generators::Config, ) -> Option { log_wasm(bytes); match config.compile(engine, bytes) { Ok(module) => Some(module), - Err(_) if !known_valid => None, + Err(_) if known_valid == KnownValid::No => None, Err(e) => { if let generators::InstanceAllocationStrategy::Pooling(c) = &config.wasmtime.strategy { // When using the pooling allocator, accept failures to compile @@ -602,7 +608,7 @@ pub fn table_ops( let wasm = ops.to_wasm_binary(); log_wasm(&wasm); - let module = match compile_module(store.engine(), &wasm, false, &fuzz_config) { + let module = match compile_module(store.engine(), &wasm, KnownValid::No, &fuzz_config) { Some(m) => m, None => return 0, }; @@ -616,36 +622,34 @@ pub fn table_ops( // NB: use `Func::new` so that this can still compile on the old x86 // backend, where `IntoFunc` isn't implemented for multi-value // returns. - let func = Func::new( - &mut store, - FuncType::new( - vec![], - vec![ValType::ExternRef, ValType::ExternRef, ValType::ExternRef], - ), - { - let num_dropped = num_dropped.clone(); - let expected_drops = expected_drops.clone(); - let num_gcs = num_gcs.clone(); - move |mut caller: Caller<'_, StoreLimits>, _params, results| { - log::info!("table_ops: GC"); - if num_gcs.fetch_add(1, SeqCst) < MAX_GCS { - caller.gc(); - } + let func_ty = FuncType::new( + store.engine(), + vec![], + vec![ValType::ExternRef, ValType::ExternRef, ValType::ExternRef], + ); + let func = Func::new(&mut store, func_ty, { + let num_dropped = num_dropped.clone(); + let expected_drops = expected_drops.clone(); + let num_gcs = num_gcs.clone(); + move |mut caller: Caller<'_, StoreLimits>, _params, results| { + log::info!("table_ops: GC"); + if num_gcs.fetch_add(1, SeqCst) < MAX_GCS { + caller.gc(); + } - let a = ExternRef::new(CountDrops(num_dropped.clone())); - let b = ExternRef::new(CountDrops(num_dropped.clone())); - let c = ExternRef::new(CountDrops(num_dropped.clone())); + let a = ExternRef::new(CountDrops(num_dropped.clone())); + let b = ExternRef::new(CountDrops(num_dropped.clone())); + let c = ExternRef::new(CountDrops(num_dropped.clone())); - log::info!("table_ops: make_refs() -> ({:p}, {:p}, {:p})", a, b, c); + log::info!("table_ops: make_refs() -> ({:p}, {:p}, {:p})", a, b, c); - expected_drops.fetch_add(3, SeqCst); - results[0] = Some(a).into(); - results[1] = Some(b).into(); - results[2] = Some(c).into(); - Ok(()) - } - }, - ); + expected_drops.fetch_add(3, SeqCst); + results[0] = Some(a).into(); + results[1] = Some(b).into(); + results[2] = Some(c).into(); + Ok(()) + } + }); linker.define(&store, "", "gc", func).unwrap(); linker @@ -691,25 +695,23 @@ pub fn table_ops( // NB: use `Func::new` so that this can still compile on the old // x86 backend, where `IntoFunc` isn't implemented for // multi-value returns. - let func = Func::new( - &mut store, - FuncType::new( - vec![], - vec![ValType::ExternRef, ValType::ExternRef, ValType::ExternRef], - ), - { - let num_dropped = num_dropped.clone(); - let expected_drops = expected_drops.clone(); - move |_caller, _params, results| { - log::info!("table_ops: make_refs"); - expected_drops.fetch_add(3, SeqCst); - results[0] = Some(ExternRef::new(CountDrops(num_dropped.clone()))).into(); - results[1] = Some(ExternRef::new(CountDrops(num_dropped.clone()))).into(); - results[2] = Some(ExternRef::new(CountDrops(num_dropped.clone()))).into(); - Ok(()) - } - }, + let func_ty = FuncType::new( + store.engine(), + vec![], + vec![ValType::ExternRef, ValType::ExternRef, ValType::ExternRef], ); + let func = Func::new(&mut store, func_ty, { + let num_dropped = num_dropped.clone(); + let expected_drops = expected_drops.clone(); + move |_caller, _params, results| { + log::info!("table_ops: make_refs"); + expected_drops.fetch_add(3, SeqCst); + results[0] = Some(ExternRef::new(CountDrops(num_dropped.clone()))).into(); + results[1] = Some(ExternRef::new(CountDrops(num_dropped.clone()))).into(); + results[2] = Some(ExternRef::new(CountDrops(num_dropped.clone()))).into(); + Ok(()) + } + }); linker.define(&store, "", "make_refs", func).unwrap(); let instance = linker.instantiate(&mut store, &module).unwrap(); diff --git a/crates/fuzzing/src/oracles/diff_v8.rs b/crates/fuzzing/src/oracles/diff_v8.rs index 1d03c200411c..d059967387bb 100644 --- a/crates/fuzzing/src/oracles/diff_v8.rs +++ b/crates/fuzzing/src/oracles/diff_v8.rs @@ -297,7 +297,7 @@ fn get_diff_value( scope: &mut v8::HandleScope<'_>, ) -> DiffValue { match ty { - DiffValueType::I32 => DiffValue::I32(val.to_int32(scope).unwrap().value() as i32), + DiffValueType::I32 => DiffValue::I32(val.to_int32(scope).unwrap().value()), DiffValueType::I64 => { let (val, todo) = val.to_big_int(scope).unwrap().i64_value(); assert!(todo); diff --git a/crates/fuzzing/src/oracles/diff_wasmi.rs b/crates/fuzzing/src/oracles/diff_wasmi.rs index 0864d34d5431..c57cca89a3e1 100644 --- a/crates/fuzzing/src/oracles/diff_wasmi.rs +++ b/crates/fuzzing/src/oracles/diff_wasmi.rs @@ -13,18 +13,29 @@ pub struct WasmiEngine { impl WasmiEngine { pub(crate) fn new(config: &mut Config) -> Self { let config = &mut config.module_config.config; - config.reference_types_enabled = false; + // Force generated Wasm modules to never have features that Wasmi doesn't support. config.simd_enabled = false; + config.relaxed_simd_enabled = false; config.memory64_enabled = false; - config.bulk_memory_enabled = false; config.threads_enabled = false; + config.exceptions_enabled = false; config.max_memories = config.max_memories.min(1); config.min_memories = config.min_memories.min(1); - config.max_tables = config.max_tables.min(1); - config.min_tables = config.min_tables.min(1); + let mut wasmi_config = wasmi::Config::default(); + wasmi_config + .consume_fuel(false) + .floats(true) + .wasm_mutable_global(true) + .wasm_sign_extension(config.sign_extension_ops_enabled) + .wasm_saturating_float_to_int(config.saturating_float_to_int_enabled) + .wasm_multi_value(config.multi_value_enabled) + .wasm_bulk_memory(config.bulk_memory_enabled) + .wasm_reference_types(config.reference_types_enabled) + .wasm_tail_call(config.tail_call_enabled) + .wasm_extended_const(true); Self { - engine: wasmi::Engine::default(), + engine: wasmi::Engine::new(&wasmi_config), } } } @@ -38,7 +49,7 @@ impl DiffEngine for WasmiEngine { let module = wasmi::Module::new(&self.engine, wasm).context("unable to validate Wasm module")?; let mut store = wasmi::Store::new(&self.engine, ()); - let instance = wasmi::Linker::<()>::new() + let instance = wasmi::Linker::<()>::new(&self.engine) .instantiate(&mut store, &module) .and_then(|i| i.start(&mut store)) .context("unable to instantiate module in wasmi")?; @@ -76,8 +87,11 @@ impl DiffEngine for WasmiEngine { .downcast_ref::() .expect(&format!("not a trap: {:?}", err)), }; - assert!(wasmi.as_code().is_some()); - assert_eq!(wasmi_to_wasmtime_trap_code(wasmi.as_code().unwrap()), *trap); + assert!(wasmi.trap_code().is_some()); + assert_eq!( + wasmi_to_wasmtime_trap_code(wasmi.trap_code().unwrap()), + *trap + ); } fn is_stack_overflow(&self, err: &Error) -> bool { @@ -89,7 +103,7 @@ impl DiffEngine for WasmiEngine { None => return false, }, }; - matches!(trap.as_code(), Some(wasmi::core::TrapCode::StackOverflow)) + matches!(trap.trap_code(), Some(wasmi::core::TrapCode::StackOverflow)) } } @@ -97,15 +111,17 @@ impl DiffEngine for WasmiEngine { fn wasmi_to_wasmtime_trap_code(trap: wasmi::core::TrapCode) -> Trap { use wasmi::core::TrapCode; match trap { - TrapCode::Unreachable => Trap::UnreachableCodeReached, - TrapCode::MemoryAccessOutOfBounds => Trap::MemoryOutOfBounds, - TrapCode::TableAccessOutOfBounds => Trap::TableOutOfBounds, - TrapCode::ElemUninitialized => Trap::IndirectCallToNull, - TrapCode::DivisionByZero => Trap::IntegerDivisionByZero, + TrapCode::UnreachableCodeReached => Trap::UnreachableCodeReached, + TrapCode::MemoryOutOfBounds => Trap::MemoryOutOfBounds, + TrapCode::TableOutOfBounds => Trap::TableOutOfBounds, + TrapCode::IndirectCallToNull => Trap::IndirectCallToNull, + TrapCode::IntegerDivisionByZero => Trap::IntegerDivisionByZero, TrapCode::IntegerOverflow => Trap::IntegerOverflow, - TrapCode::InvalidConversionToInt => Trap::BadConversionToInteger, + TrapCode::BadConversionToInteger => Trap::BadConversionToInteger, TrapCode::StackOverflow => Trap::StackOverflow, - TrapCode::UnexpectedSignature => Trap::BadSignature, + TrapCode::BadSignature => Trap::BadSignature, + TrapCode::OutOfFuel => unimplemented!("built-in fuel metering is unused"), + TrapCode::GrowthOperationLimited => unimplemented!("resource limiter is unused"), } } @@ -132,7 +148,7 @@ impl DiffInstance for WasmiInstance { .and_then(wasmi::Extern::into_func) .unwrap(); let arguments: Vec<_> = arguments.iter().map(|x| x.into()).collect(); - let mut results = vec![wasmi::core::Value::I32(0); result_tys.len()]; + let mut results = vec![wasmi::Value::I32(0); result_tys.len()]; function .call(&mut self.store, &arguments, &mut results) .context("wasmi function trap")?; @@ -165,29 +181,37 @@ impl DiffInstance for WasmiInstance { } } -impl From<&DiffValue> for wasmi::core::Value { +impl From<&DiffValue> for wasmi::Value { fn from(v: &DiffValue) -> Self { - use wasmi::core::Value::*; + use wasmi::Value as WasmiValue; match *v { - DiffValue::I32(n) => I32(n), - DiffValue::I64(n) => I64(n), - DiffValue::F32(n) => F32(wasmi::core::F32::from_bits(n)), - DiffValue::F64(n) => F64(wasmi::core::F64::from_bits(n)), - DiffValue::V128(_) | DiffValue::FuncRef { .. } | DiffValue::ExternRef { .. } => { - unimplemented!() + DiffValue::I32(n) => WasmiValue::I32(n), + DiffValue::I64(n) => WasmiValue::I64(n), + DiffValue::F32(n) => WasmiValue::F32(wasmi::core::F32::from_bits(n)), + DiffValue::F64(n) => WasmiValue::F64(wasmi::core::F64::from_bits(n)), + DiffValue::V128(_) => unimplemented!(), + DiffValue::FuncRef { null } => { + assert!(null); + WasmiValue::FuncRef(wasmi::FuncRef::null()) + } + DiffValue::ExternRef { null } => { + assert!(null); + WasmiValue::ExternRef(wasmi::ExternRef::null()) } } } } -impl From for DiffValue { - fn from(value: wasmi::core::Value) -> Self { - use wasmi::core::Value as WasmiValue; +impl From for DiffValue { + fn from(value: wasmi::Value) -> Self { + use wasmi::Value as WasmiValue; match value { WasmiValue::I32(n) => DiffValue::I32(n), WasmiValue::I64(n) => DiffValue::I64(n), WasmiValue::F32(n) => DiffValue::F32(n.to_bits()), WasmiValue::F64(n) => DiffValue::F64(n.to_bits()), + WasmiValue::FuncRef(f) => DiffValue::FuncRef { null: f.is_null() }, + WasmiValue::ExternRef(e) => DiffValue::ExternRef { null: e.is_null() }, } } } diff --git a/crates/fuzzing/src/oracles/diff_wasmtime.rs b/crates/fuzzing/src/oracles/diff_wasmtime.rs index 9333c02e6579..f844a1901270 100644 --- a/crates/fuzzing/src/oracles/diff_wasmtime.rs +++ b/crates/fuzzing/src/oracles/diff_wasmtime.rs @@ -4,6 +4,7 @@ use crate::generators::{self, DiffValue, DiffValueType, WasmtimeConfig}; use crate::oracles::dummy; use crate::oracles::engine::DiffInstance; use crate::oracles::{compile_module, engine::DiffEngine, StoreLimits}; +use crate::single_module_fuzzer::KnownValid; use anyhow::{Context, Error, Result}; use arbitrary::Unstructured; use wasmtime::{Extern, FuncType, Instance, Module, Store, Trap, Val}; @@ -36,7 +37,7 @@ impl DiffEngine for WasmtimeEngine { fn instantiate(&mut self, wasm: &[u8]) -> Result> { let store = self.config.to_store(); - let module = compile_module(store.engine(), wasm, true, &self.config).unwrap(); + let module = compile_module(store.engine(), wasm, KnownValid::Yes, &self.config).unwrap(); let instance = WasmtimeInstance::new(store, module)?; Ok(Box::new(instance)) } diff --git a/crates/fuzzing/src/oracles/dummy.rs b/crates/fuzzing/src/oracles/dummy.rs index 69350693ae5b..ab3c7dc65da0 100644 --- a/crates/fuzzing/src/oracles/dummy.rs +++ b/crates/fuzzing/src/oracles/dummy.rs @@ -114,7 +114,7 @@ mod tests { #[test] fn dummy_function_import() { let mut store = store(); - let func_ty = FuncType::new(vec![ValType::I32], vec![ValType::I64]); + let func_ty = FuncType::new(store.engine(), vec![ValType::I32], vec![ValType::I64]); let func = dummy_func(&mut store, func_ty.clone()); assert_eq!(func.ty(&store), func_ty); } diff --git a/crates/fuzzing/src/single_module_fuzzer.rs b/crates/fuzzing/src/single_module_fuzzer.rs index 6e2ef0738fde..3a0f3cb13036 100644 --- a/crates/fuzzing/src/single_module_fuzzer.rs +++ b/crates/fuzzing/src/single_module_fuzzer.rs @@ -95,8 +95,8 @@ macro_rules! single_module_fuzzer { /// module. pub fn execute<'a, T, U>( input: &'a [u8], - run: fn(&[u8], bool, T, &mut Unstructured<'a>) -> Result, - gen_module: fn(&mut T, &mut Unstructured<'a>) -> Result>, + run: fn(&[u8], KnownValid, T, &mut Unstructured<'a>) -> Result, + gen_module: fn(&mut T, &mut Unstructured<'a>) -> Result<(Vec, KnownValid)>, ) -> Result where T: Arbitrary<'a>, @@ -113,12 +113,29 @@ where }; let mut u = Unstructured::new(fuzz_data); let mut config = u.arbitrary()?; - let generated = gen_module(&mut config, &mut u)?; + let (generated, known_valid) = gen_module(&mut config, &mut u)?; let module = module_in_input.unwrap_or(&generated); if let Ok(file) = std::env::var("WRITE_FUZZ_INPUT_TO") { std::fs::write(file, encode_module(&module, &fuzz_data)).unwrap(); } - run(module, module_in_input.is_none(), config, &mut u) + let known_valid = if module_in_input.is_some() { + KnownValid::No + } else { + known_valid + }; + run(module, known_valid, config, &mut u) +} + +/// Used as part of `execute` above to determine whether a module is known to +/// be valid ahead of time. +#[derive(Debug, PartialEq, Eq, Copy, Clone)] +pub enum KnownValid { + /// This module is known to be valid so it should assert compilation + /// succeeds for example. + Yes, + /// This module is not known to be valid and it may not compile + /// successfully. Note that it's also not known to compile unsuccessfully. + No, } const SECTION_NAME: &str = "wasmtime-fuzz-input"; @@ -133,7 +150,7 @@ pub fn mutate( data: &mut [u8], mut size: usize, max_size: usize, - gen_module: fn(&mut T, &mut Unstructured<'_>) -> Result>, + gen_module: fn(&mut T, &mut Unstructured<'_>) -> Result<(Vec, KnownValid)>, mutate: fn(&mut [u8], usize, usize) -> usize, ) -> usize where @@ -170,7 +187,7 @@ where .arbitrary() .and_then(|mut config| gen_module(&mut config, &mut u)) { - Ok(module) => { + Ok((module, _known_valid)) => { let module = encode_module(&module, &data[..new_size]); if module.len() < max_size { @@ -295,10 +312,10 @@ mod tests { let run2 = run_config::<(u32, u32)>; if let Ok((module, known_valid)) = execute(&buf[..seed_size], run1, gen) { - assert!(known_valid); + assert_eq!(known_valid, KnownValid::Yes); let new_size = mutate(&mut buf, seed_size, max_size, gen, noop_mutate); if let Ok((module2, known_valid)) = execute(&buf[..new_size], run2, gen) { - assert!(!known_valid); + assert_eq!(known_valid, KnownValid::No); compares += 1; if module != module2 { panic!("modules differ"); @@ -313,21 +330,24 @@ mod tests { fn run_config( data: &[u8], - known_valid: bool, + known_valid: KnownValid, _: T, _: &mut Unstructured<'_>, - ) -> Result<(Vec, bool)> + ) -> Result<(Vec, KnownValid)> where T: for<'a> Arbitrary<'a>, { Ok((data.to_vec(), known_valid)) } - fn gen(_: &mut T, u: &mut Unstructured<'_>) -> Result> + fn gen(_: &mut T, u: &mut Unstructured<'_>) -> Result<(Vec, KnownValid)> where T: for<'a> Arbitrary<'a>, { - Ok(u.arbitrary::()?.to_bytes()) + Ok(( + u.arbitrary::()?.to_bytes(), + KnownValid::Yes, + )) } fn noop_mutate(_buf: &mut [u8], size: usize, _new_size: usize) -> usize { diff --git a/crates/fuzzing/wasm-spec-interpreter/Cargo.toml b/crates/fuzzing/wasm-spec-interpreter/Cargo.toml index 3ec8efdaccac..b18dc066c7fe 100644 --- a/crates/fuzzing/wasm-spec-interpreter/Cargo.toml +++ b/crates/fuzzing/wasm-spec-interpreter/Cargo.toml @@ -7,6 +7,9 @@ publish = false edition.workspace = true license = "Apache-2.0 WITH LLVM-exception" +[lints] +workspace = true + # Until https://gitlab.com/ocaml-rust/ocaml-boxroot/-/issues/1 is resolved and # this crate can use the `without-ocamlopt` feature to avoid build failures, it # is better to only build the OCaml dependencies when fuzzing (see the diff --git a/crates/jit-debug/Cargo.toml b/crates/jit-debug/Cargo.toml index 85c6b6840db3..11045bd81d7c 100644 --- a/crates/jit-debug/Cargo.toml +++ b/crates/jit-debug/Cargo.toml @@ -10,6 +10,9 @@ repository = "https://github.com/bytecodealliance/wasmtime" readme = "README.md" edition.workspace = true +[lints] +workspace = true + [dependencies] once_cell = { workspace = true, optional = true } object = { workspace = true, optional = true } diff --git a/crates/jit-icache-coherence/Cargo.toml b/crates/jit-icache-coherence/Cargo.toml index 8500c7924a77..729db45dd0d3 100644 --- a/crates/jit-icache-coherence/Cargo.toml +++ b/crates/jit-icache-coherence/Cargo.toml @@ -8,6 +8,9 @@ license = "Apache-2.0 WITH LLVM-exception" repository = "https://github.com/bytecodealliance/wasmtime" edition.workspace = true +[lints] +workspace = true + [dependencies] cfg-if = { workspace = true } diff --git a/crates/jit/Cargo.toml b/crates/jit/Cargo.toml deleted file mode 100644 index cc36542c066b..000000000000 --- a/crates/jit/Cargo.toml +++ /dev/null @@ -1,45 +0,0 @@ -[package] -name = "wasmtime-jit" -version.workspace = true -authors.workspace = true -description = "JIT-style execution for WebAsssembly code in Cranelift" -documentation = "https://docs.rs/wasmtime-jit" -license = "Apache-2.0 WITH LLVM-exception" -categories = ["wasm"] -keywords = ["webassembly", "wasm"] -repository = "https://github.com/bytecodealliance/wasmtime" -edition.workspace = true - -[dependencies] -wasmtime-environ = { workspace = true } -wasmtime-jit-debug = { workspace = true, features = [ - "perf_jitdump", -], optional = true } -wasmtime-runtime = { workspace = true } -target-lexicon = { workspace = true } -anyhow = { workspace = true } -cfg-if = { workspace = true } -gimli = { workspace = true } -object = { workspace = true } -serde = "1.0.188" -serde_derive = "1.0.188" -addr2line = { version = "0.21.0", default-features = false, optional = true } -bincode = "1.2.1" -rustc-demangle = { version = "0.1.16", optional = true } -cpp_demangle = { version = "0.3.2", optional = true } -log = { workspace = true } -wasmtime-jit-icache-coherence = { workspace = true } - -[target.'cfg(target_os = "linux")'.dependencies] -rustix = { workspace = true, features = ['thread'] } - -[target.'cfg(target_os = "windows")'.dependencies.windows-sys] -workspace = true -features = ["Win32_System_Diagnostics_Debug"] - -[target.'cfg(all(target_arch = "x86_64", not(target_os = "android")))'.dependencies] -ittapi = { version = "0.4.0", optional = true } - -[features] -profiling = ['dep:wasmtime-jit-debug', 'dep:ittapi'] -demangle = ['dep:rustc-demangle', 'dep:cpp_demangle'] diff --git a/crates/jit/LICENSE b/crates/jit/LICENSE deleted file mode 100644 index f9d81955f4bc..000000000000 --- a/crates/jit/LICENSE +++ /dev/null @@ -1,220 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - ---- LLVM Exceptions to the Apache 2.0 License ---- - -As an exception, if, as a result of your compiling your source code, portions -of this Software are embedded into an Object form of such source code, you -may redistribute such embedded portions in such Object form without complying -with the conditions of Sections 4(a), 4(b) and 4(d) of the License. - -In addition, if you combine or link compiled forms of this Software with -software that is licensed under the GPLv2 ("Combined Software") and if a -court of competent jurisdiction determines that the patent provision (Section -3), the indemnity provision (Section 9) or other Section of the License -conflicts with the conditions of the GPLv2, you may retroactively and -prospectively choose to deem waived or otherwise exclude such Section(s) of -the License, but only in their entirety and only with respect to the Combined -Software. - diff --git a/crates/jit/src/instantiate.rs b/crates/jit/src/instantiate.rs deleted file mode 100644 index a991c9a4cbb8..000000000000 --- a/crates/jit/src/instantiate.rs +++ /dev/null @@ -1,766 +0,0 @@ -//! Define the `instantiate` function, which takes a byte array containing an -//! encoded wasm module and returns a live wasm instance. Also, define -//! `CompiledModule` to allow compiling and instantiating to be done as separate -//! steps. - -use crate::code_memory::CodeMemory; -use crate::debug::create_gdbjit_image; -use crate::profiling::ProfilingAgent; -use anyhow::{bail, Context, Error, Result}; -use object::write::{Object, SectionId, StandardSegment, WritableBuffer}; -use object::SectionKind; -use serde_derive::{Deserialize, Serialize}; -use std::convert::TryFrom; -use std::ops::Range; -use std::str; -use std::sync::Arc; -use wasmtime_environ::obj; -use wasmtime_environ::{ - DefinedFuncIndex, FuncIndex, FunctionLoc, MemoryInitialization, Module, ModuleTranslation, - PrimaryMap, SignatureIndex, StackMapInformation, Tunables, WasmFunctionInfo, -}; -use wasmtime_runtime::{ - CompiledModuleId, CompiledModuleIdAllocator, GdbJitImageRegistration, MmapVec, -}; - -/// Secondary in-memory results of function compilation. -#[derive(Serialize, Deserialize)] -pub struct CompiledFunctionInfo { - wasm_func_info: WasmFunctionInfo, - wasm_func_loc: FunctionLoc, - array_to_wasm_trampoline: Option, - native_to_wasm_trampoline: Option, -} - -impl CompiledFunctionInfo { - /// Create a new `CompiledFunctionInfo`. - pub fn new( - wasm_func_info: WasmFunctionInfo, - wasm_func_loc: FunctionLoc, - array_to_wasm_trampoline: Option, - native_to_wasm_trampoline: Option, - ) -> CompiledFunctionInfo { - CompiledFunctionInfo { - wasm_func_info, - wasm_func_loc, - array_to_wasm_trampoline, - native_to_wasm_trampoline, - } - } -} - -/// Secondary in-memory results of module compilation. -/// -/// This opaque structure can be optionally passed back to -/// `CompiledModule::from_artifacts` to avoid decoding extra information there. -#[derive(Serialize, Deserialize)] -pub struct CompiledModuleInfo { - /// Type information about the compiled WebAssembly module. - pub module: Module, - - /// Metadata about each compiled function. - funcs: PrimaryMap, - - /// Sorted list, by function index, of names we have for this module. - func_names: Vec, - - /// Metadata about wasm-to-native trampolines. Used when exposing a native - /// callee (e.g. `Func::wrap`) to a Wasm caller. Sorted by signature index. - wasm_to_native_trampolines: Vec<(SignatureIndex, FunctionLoc)>, - - /// General compilation metadata. - meta: Metadata, -} - -#[derive(Serialize, Deserialize)] -struct FunctionName { - idx: FuncIndex, - offset: u32, - len: u32, -} - -#[derive(Serialize, Deserialize)] -struct Metadata { - /// Whether or not native debug information is available in `obj` - native_debug_info_present: bool, - - /// Whether or not the original wasm module contained debug information that - /// we skipped and did not parse. - has_unparsed_debuginfo: bool, - - /// Offset in the original wasm file to the code section. - code_section_offset: u64, - - /// Whether or not custom wasm-specific dwarf sections were inserted into - /// the ELF image. - /// - /// Note that even if this flag is `true` sections may be missing if they - /// weren't found in the original wasm module itself. - has_wasm_debuginfo: bool, - - /// Dwarf sections and the offsets at which they're stored in the - /// ELF_WASMTIME_DWARF - dwarf: Vec<(u8, Range)>, -} - -/// Helper structure to create an ELF file as a compilation artifact. -/// -/// This structure exposes the process which Wasmtime will encode a core wasm -/// module into an ELF file, notably managing data sections and all that good -/// business going into the final file. -pub struct ObjectBuilder<'a> { - /// The `object`-crate-defined ELF file write we're using. - obj: Object<'a>, - - /// General compilation configuration. - tunables: &'a Tunables, - - /// The section identifier for "rodata" which is where wasm data segments - /// will go. - data: SectionId, - - /// The section identifier for function name information, or otherwise where - /// the `name` custom section of wasm is copied into. - /// - /// This is optional and lazily created on demand. - names: Option, - - /// The section identifier for dwarf information copied from the original - /// wasm files. - /// - /// This is optional and lazily created on demand. - dwarf: Option, -} - -impl<'a> ObjectBuilder<'a> { - /// Creates a new builder for the `obj` specified. - pub fn new(mut obj: Object<'a>, tunables: &'a Tunables) -> ObjectBuilder<'a> { - let data = obj.add_section( - obj.segment_name(StandardSegment::Data).to_vec(), - obj::ELF_WASM_DATA.as_bytes().to_vec(), - SectionKind::ReadOnlyData, - ); - ObjectBuilder { - obj, - tunables, - data, - names: None, - dwarf: None, - } - } - - /// Completes compilation of the `translation` specified, inserting - /// everything necessary into the `Object` being built. - /// - /// This function will consume the final results of compiling a wasm module - /// and finish the ELF image in-progress as part of `self.obj` by appending - /// any compiler-agnostic sections. - /// - /// The auxiliary `CompiledModuleInfo` structure returned here has also been - /// serialized into the object returned, but if the caller will quickly - /// turn-around and invoke `CompiledModule::from_artifacts` after this then - /// the information can be passed to that method to avoid extra - /// deserialization. This is done to avoid a serialize-then-deserialize for - /// API calls like `Module::new` where the compiled module is immediately - /// going to be used. - /// - /// The various arguments here are: - /// - /// * `translation` - the core wasm translation that's being completed. - /// - /// * `funcs` - compilation metadata about functions within the translation - /// as well as where the functions are located in the text section. - /// - /// * `array_to_wasm_trampolines` - list of all trampolines necessary for - /// array callers (e.g. `Func::new`) calling Wasm callees. One for each - /// defined function that escapes. Must be sorted by `DefinedFuncIndex`. - /// - /// * `native_to_wasm_trampolines` - list of all trampolines necessary for - /// native callers (e.g. `Func::wrap`) calling Wasm callees. One for each - /// defined function that escapes. Must be sorted by `DefinedFuncIndex`. - /// - /// * `wasm_to_native_trampolines` - list of all trampolines necessary for - /// Wasm callers calling native callees (e.g. `Func::wrap`). One for each - /// function signature in the module. Must be sorted by `SignatureIndex`. - /// - /// Returns the `CompiledModuleInfo` corresponding to this core Wasm module - /// as a result of this append operation. This is then serialized into the - /// final artifact by the caller. - pub fn append( - &mut self, - translation: ModuleTranslation<'_>, - funcs: PrimaryMap, - wasm_to_native_trampolines: Vec<(SignatureIndex, FunctionLoc)>, - ) -> Result { - let ModuleTranslation { - mut module, - debuginfo, - has_unparsed_debuginfo, - data, - data_align, - passive_data, - .. - } = translation; - - // Place all data from the wasm module into a section which will the - // source of the data later at runtime. This additionally keeps track of - // the offset of - let mut total_data_len = 0; - let data_offset = self - .obj - .append_section_data(self.data, &[], data_align.unwrap_or(1)); - for (i, data) in data.iter().enumerate() { - // The first data segment has its alignment specified as the alignment - // for the entire section, but everything afterwards is adjacent so it - // has alignment of 1. - let align = if i == 0 { data_align.unwrap_or(1) } else { 1 }; - self.obj.append_section_data(self.data, data, align); - total_data_len += data.len(); - } - for data in passive_data.iter() { - self.obj.append_section_data(self.data, data, 1); - } - - // If any names are present in the module then the `ELF_NAME_DATA` section - // is create and appended. - let mut func_names = Vec::new(); - if debuginfo.name_section.func_names.len() > 0 { - let name_id = *self.names.get_or_insert_with(|| { - self.obj.add_section( - self.obj.segment_name(StandardSegment::Data).to_vec(), - obj::ELF_NAME_DATA.as_bytes().to_vec(), - SectionKind::ReadOnlyData, - ) - }); - let mut sorted_names = debuginfo.name_section.func_names.iter().collect::>(); - sorted_names.sort_by_key(|(idx, _name)| *idx); - for (idx, name) in sorted_names { - let offset = self.obj.append_section_data(name_id, name.as_bytes(), 1); - let offset = match u32::try_from(offset) { - Ok(offset) => offset, - Err(_) => bail!("name section too large (> 4gb)"), - }; - let len = u32::try_from(name.len()).unwrap(); - func_names.push(FunctionName { - idx: *idx, - offset, - len, - }); - } - } - - // Data offsets in `MemoryInitialization` are offsets within the - // `translation.data` list concatenated which is now present in the data - // segment that's appended to the object. Increase the offsets by - // `self.data_size` to account for any previously added module. - let data_offset = u32::try_from(data_offset).unwrap(); - match &mut module.memory_initialization { - MemoryInitialization::Segmented(list) => { - for segment in list { - segment.data.start = segment.data.start.checked_add(data_offset).unwrap(); - segment.data.end = segment.data.end.checked_add(data_offset).unwrap(); - } - } - MemoryInitialization::Static { map } => { - for (_, segment) in map { - if let Some(segment) = segment { - segment.data.start = segment.data.start.checked_add(data_offset).unwrap(); - segment.data.end = segment.data.end.checked_add(data_offset).unwrap(); - } - } - } - } - - // Data offsets for passive data are relative to the start of - // `translation.passive_data` which was appended to the data segment - // of this object, after active data in `translation.data`. Update the - // offsets to account prior modules added in addition to active data. - let data_offset = data_offset + u32::try_from(total_data_len).unwrap(); - for (_, range) in module.passive_data_map.iter_mut() { - range.start = range.start.checked_add(data_offset).unwrap(); - range.end = range.end.checked_add(data_offset).unwrap(); - } - - // Insert the wasm raw wasm-based debuginfo into the output, if - // requested. Note that this is distinct from the native debuginfo - // possibly generated by the native compiler, hence these sections - // getting wasm-specific names. - let mut dwarf = Vec::new(); - if self.tunables.parse_wasm_debuginfo { - self.push_debug(&mut dwarf, &debuginfo.dwarf.debug_abbrev); - self.push_debug(&mut dwarf, &debuginfo.dwarf.debug_addr); - self.push_debug(&mut dwarf, &debuginfo.dwarf.debug_aranges); - self.push_debug(&mut dwarf, &debuginfo.dwarf.debug_info); - self.push_debug(&mut dwarf, &debuginfo.dwarf.debug_line); - self.push_debug(&mut dwarf, &debuginfo.dwarf.debug_line_str); - self.push_debug(&mut dwarf, &debuginfo.dwarf.debug_str); - self.push_debug(&mut dwarf, &debuginfo.dwarf.debug_str_offsets); - self.push_debug(&mut dwarf, &debuginfo.debug_ranges); - self.push_debug(&mut dwarf, &debuginfo.debug_rnglists); - } - // Sort this for binary-search-lookup later in `symbolize_context`. - dwarf.sort_by_key(|(id, _)| *id); - - Ok(CompiledModuleInfo { - module, - funcs, - wasm_to_native_trampolines, - func_names, - meta: Metadata { - native_debug_info_present: self.tunables.generate_native_debuginfo, - has_unparsed_debuginfo, - code_section_offset: debuginfo.wasm_file.code_section_offset, - has_wasm_debuginfo: self.tunables.parse_wasm_debuginfo, - dwarf, - }, - }) - } - - fn push_debug<'b, T>(&mut self, dwarf: &mut Vec<(u8, Range)>, section: &T) - where - T: gimli::Section>, - { - let data = section.reader().slice(); - if data.is_empty() { - return; - } - let section_id = *self.dwarf.get_or_insert_with(|| { - self.obj.add_section( - self.obj.segment_name(StandardSegment::Debug).to_vec(), - obj::ELF_WASMTIME_DWARF.as_bytes().to_vec(), - SectionKind::Debug, - ) - }); - let offset = self.obj.append_section_data(section_id, data, 1); - dwarf.push((T::id() as u8, offset..offset + data.len() as u64)); - } - - /// Creates the `ELF_WASMTIME_INFO` section from the given serializable data - /// structure. - pub fn serialize_info(&mut self, info: &T) - where - T: serde::Serialize, - { - let section = self.obj.add_section( - self.obj.segment_name(StandardSegment::Data).to_vec(), - obj::ELF_WASMTIME_INFO.as_bytes().to_vec(), - SectionKind::ReadOnlyData, - ); - let data = bincode::serialize(info).unwrap(); - self.obj.set_section_data(section, data, 1); - } - - /// Creates a new `MmapVec` from `self.` - /// - /// The returned `MmapVec` will contain the serialized version of `self` - /// and is sized appropriately to the exact size of the object serialized. - pub fn finish(self) -> Result { - let mut result = ObjectMmap::default(); - return match self.obj.emit(&mut result) { - Ok(()) => { - assert!(result.mmap.is_some(), "no reserve"); - let mmap = result.mmap.expect("reserve not called"); - assert_eq!(mmap.len(), result.len); - Ok(mmap) - } - Err(e) => match result.err.take() { - Some(original) => Err(original.context(e)), - None => Err(e.into()), - }, - }; - - /// Helper struct to implement the `WritableBuffer` trait from the `object` - /// crate. - /// - /// This enables writing an object directly into an mmap'd memory so it's - /// immediately usable for execution after compilation. This implementation - /// relies on a call to `reserve` happening once up front with all the needed - /// data, and the mmap internally does not attempt to grow afterwards. - #[derive(Default)] - struct ObjectMmap { - mmap: Option, - len: usize, - err: Option, - } - - impl WritableBuffer for ObjectMmap { - fn len(&self) -> usize { - self.len - } - - fn reserve(&mut self, additional: usize) -> Result<(), ()> { - assert!(self.mmap.is_none(), "cannot reserve twice"); - self.mmap = match MmapVec::with_capacity(additional) { - Ok(mmap) => Some(mmap), - Err(e) => { - self.err = Some(e); - return Err(()); - } - }; - Ok(()) - } - - fn resize(&mut self, new_len: usize) { - // Resizing always appends 0 bytes and since new mmaps start out as 0 - // bytes we don't actually need to do anything as part of this other - // than update our own length. - if new_len <= self.len { - return; - } - self.len = new_len; - } - - fn write_bytes(&mut self, val: &[u8]) { - let mmap = self.mmap.as_mut().expect("write before reserve"); - mmap[self.len..][..val.len()].copy_from_slice(val); - self.len += val.len(); - } - } - } -} - -/// A compiled wasm module, ready to be instantiated. -pub struct CompiledModule { - module: Arc, - funcs: PrimaryMap, - wasm_to_native_trampolines: Vec<(SignatureIndex, FunctionLoc)>, - meta: Metadata, - code_memory: Arc, - dbg_jit_registration: Option, - /// A unique ID used to register this module with the engine. - unique_id: CompiledModuleId, - func_names: Vec, -} - -impl CompiledModule { - /// Creates `CompiledModule` directly from a precompiled artifact. - /// - /// The `code_memory` argument is expected to be the result of a previous - /// call to `ObjectBuilder::finish` above. This is an ELF image, at this - /// time, which contains all necessary information to create a - /// `CompiledModule` from a compilation. - /// - /// This method also takes `info`, an optionally-provided deserialization - /// of the artifacts' compilation metadata section. If this information is - /// not provided then the information will be - /// deserialized from the image of the compilation artifacts. Otherwise it - /// will be assumed to be what would otherwise happen if the section were - /// to be deserialized. - /// - /// The `profiler` argument here is used to inform JIT profiling runtimes - /// about new code that is loaded. - pub fn from_artifacts( - code_memory: Arc, - info: CompiledModuleInfo, - profiler: &dyn ProfilingAgent, - id_allocator: &CompiledModuleIdAllocator, - ) -> Result { - let mut ret = Self { - module: Arc::new(info.module), - funcs: info.funcs, - wasm_to_native_trampolines: info.wasm_to_native_trampolines, - dbg_jit_registration: None, - code_memory, - meta: info.meta, - unique_id: id_allocator.alloc(), - func_names: info.func_names, - }; - ret.register_debug_and_profiling(profiler)?; - - Ok(ret) - } - - fn register_debug_and_profiling(&mut self, profiler: &dyn ProfilingAgent) -> Result<()> { - if self.meta.native_debug_info_present { - let text = self.text(); - let bytes = create_gdbjit_image(self.mmap().to_vec(), (text.as_ptr(), text.len())) - .context("failed to create jit image for gdb")?; - let reg = GdbJitImageRegistration::register(bytes); - self.dbg_jit_registration = Some(reg); - } - profiler.register_module(&self.code_memory, &|addr| { - let (idx, _) = self.func_by_text_offset(addr)?; - let idx = self.module.func_index(idx); - let name = self.func_name(idx)?; - let mut demangled = String::new(); - crate::demangling::demangle_function_name(&mut demangled, name).unwrap(); - Some(demangled) - }); - Ok(()) - } - - /// Get this module's unique ID. It is unique with respect to a - /// single allocator (which is ordinarily held on a Wasm engine). - pub fn unique_id(&self) -> CompiledModuleId { - self.unique_id - } - - /// Returns the underlying memory which contains the compiled module's - /// image. - pub fn mmap(&self) -> &MmapVec { - self.code_memory.mmap() - } - - /// Returns the underlying owned mmap of this compiled image. - pub fn code_memory(&self) -> &Arc { - &self.code_memory - } - - /// Returns the text section of the ELF image for this compiled module. - /// - /// This memory should have the read/execute permissions. - #[inline] - pub fn text(&self) -> &[u8] { - self.code_memory.text() - } - - /// Return a reference-counting pointer to a module. - pub fn module(&self) -> &Arc { - &self.module - } - - /// Looks up the `name` section name for the function index `idx`, if one - /// was specified in the original wasm module. - pub fn func_name(&self, idx: FuncIndex) -> Option<&str> { - // Find entry for `idx`, if present. - let i = self.func_names.binary_search_by_key(&idx, |n| n.idx).ok()?; - let name = &self.func_names[i]; - - // Here we `unwrap` the `from_utf8` but this can theoretically be a - // `from_utf8_unchecked` if we really wanted since this section is - // guaranteed to only have valid utf-8 data. Until it's a problem it's - // probably best to double-check this though. - let data = self.code_memory().func_name_data(); - Some(str::from_utf8(&data[name.offset as usize..][..name.len as usize]).unwrap()) - } - - /// Return a reference to a mutable module (if possible). - pub fn module_mut(&mut self) -> Option<&mut Module> { - Arc::get_mut(&mut self.module) - } - - /// Returns an iterator over all functions defined within this module with - /// their index and their body in memory. - #[inline] - pub fn finished_functions( - &self, - ) -> impl ExactSizeIterator + '_ { - self.funcs - .iter() - .map(move |(i, _)| (i, self.finished_function(i))) - } - - /// Returns the body of the function that `index` points to. - #[inline] - pub fn finished_function(&self, index: DefinedFuncIndex) -> &[u8] { - let loc = self.funcs[index].wasm_func_loc; - &self.text()[loc.start as usize..][..loc.length as usize] - } - - /// Get the array-to-Wasm trampoline for the function `index` points to. - /// - /// If the function `index` points to does not escape, then `None` is - /// returned. - /// - /// These trampolines are used for array callers (e.g. `Func::new`) - /// calling Wasm callees. - pub fn array_to_wasm_trampoline(&self, index: DefinedFuncIndex) -> Option<&[u8]> { - let loc = self.funcs[index].array_to_wasm_trampoline?; - Some(&self.text()[loc.start as usize..][..loc.length as usize]) - } - - /// Get the native-to-Wasm trampoline for the function `index` points to. - /// - /// If the function `index` points to does not escape, then `None` is - /// returned. - /// - /// These trampolines are used for native callers (e.g. `Func::wrap`) - /// calling Wasm callees. - #[inline] - pub fn native_to_wasm_trampoline(&self, index: DefinedFuncIndex) -> Option<&[u8]> { - let loc = self.funcs[index].native_to_wasm_trampoline?; - Some(&self.text()[loc.start as usize..][..loc.length as usize]) - } - - /// Get the Wasm-to-native trampoline for the given signature. - /// - /// These trampolines are used for filling in - /// `VMFuncRef::wasm_call` for `Func::wrap`-style host funcrefs - /// that don't have access to a compiler when created. - pub fn wasm_to_native_trampoline(&self, signature: SignatureIndex) -> &[u8] { - let idx = self - .wasm_to_native_trampolines - .binary_search_by_key(&signature, |entry| entry.0) - .expect("should have a Wasm-to-native trampline for all signatures"); - let (_, loc) = self.wasm_to_native_trampolines[idx]; - &self.text()[loc.start as usize..][..loc.length as usize] - } - - /// Returns the stack map information for all functions defined in this - /// module. - /// - /// The iterator returned iterates over the span of the compiled function in - /// memory with the stack maps associated with those bytes. - pub fn stack_maps(&self) -> impl Iterator { - self.finished_functions().map(|(_, f)| f).zip( - self.funcs - .values() - .map(|f| &f.wasm_func_info.stack_maps[..]), - ) - } - - /// Lookups a defined function by a program counter value. - /// - /// Returns the defined function index and the relative address of - /// `text_offset` within the function itself. - pub fn func_by_text_offset(&self, text_offset: usize) -> Option<(DefinedFuncIndex, u32)> { - let text_offset = u32::try_from(text_offset).unwrap(); - - let index = match self.funcs.binary_search_values_by_key(&text_offset, |e| { - debug_assert!(e.wasm_func_loc.length > 0); - // Return the inclusive "end" of the function - e.wasm_func_loc.start + e.wasm_func_loc.length - 1 - }) { - Ok(k) => { - // Exact match, pc is at the end of this function - k - } - Err(k) => { - // Not an exact match, k is where `pc` would be "inserted" - // Since we key based on the end, function `k` might contain `pc`, - // so we'll validate on the range check below - k - } - }; - - let CompiledFunctionInfo { wasm_func_loc, .. } = self.funcs.get(index)?; - let start = wasm_func_loc.start; - let end = wasm_func_loc.start + wasm_func_loc.length; - - if text_offset < start || end < text_offset { - return None; - } - - Some((index, text_offset - wasm_func_loc.start)) - } - - /// Gets the function location information for a given function index. - pub fn func_loc(&self, index: DefinedFuncIndex) -> &FunctionLoc { - &self - .funcs - .get(index) - .expect("defined function should be present") - .wasm_func_loc - } - - /// Gets the function information for a given function index. - pub fn wasm_func_info(&self, index: DefinedFuncIndex) -> &WasmFunctionInfo { - &self - .funcs - .get(index) - .expect("defined function should be present") - .wasm_func_info - } - - /// Creates a new symbolication context which can be used to further - /// symbolicate stack traces. - /// - /// Basically this makes a thing which parses debuginfo and can tell you - /// what filename and line number a wasm pc comes from. - #[cfg(feature = "addr2line")] - pub fn symbolize_context(&self) -> Result>> { - use gimli::EndianSlice; - if !self.meta.has_wasm_debuginfo { - return Ok(None); - } - let dwarf = gimli::Dwarf::load(|id| -> Result<_> { - // Lookup the `id` in the `dwarf` array prepared for this module - // during module serialization where it's sorted by the `id` key. If - // found this is a range within the general module's concatenated - // dwarf section which is extracted here, otherwise it's just an - // empty list to represent that it's not present. - let data = self - .meta - .dwarf - .binary_search_by_key(&(id as u8), |(id, _)| *id) - .map(|i| { - let (_, range) = &self.meta.dwarf[i]; - &self.code_memory().dwarf()[range.start as usize..range.end as usize] - }) - .unwrap_or(&[]); - Ok(EndianSlice::new(data, gimli::LittleEndian)) - })?; - let cx = addr2line::Context::from_dwarf(dwarf) - .context("failed to create addr2line dwarf mapping context")?; - Ok(Some(SymbolizeContext { - inner: cx, - code_section_offset: self.meta.code_section_offset, - })) - } - - /// Returns whether the original wasm module had unparsed debug information - /// based on the tunables configuration. - pub fn has_unparsed_debuginfo(&self) -> bool { - self.meta.has_unparsed_debuginfo - } - - /// Indicates whether this module came with n address map such that lookups - /// via `wasmtime_environ::lookup_file_pos` will succeed. - /// - /// If this function returns `false` then `lookup_file_pos` will always - /// return `None`. - pub fn has_address_map(&self) -> bool { - !self.code_memory.address_map_data().is_empty() - } - - /// Returns the bounds, in host memory, of where this module's compiled - /// image resides. - pub fn image_range(&self) -> Range { - let base = self.mmap().as_ptr() as usize; - let len = self.mmap().len(); - base..base + len - } -} - -#[cfg(feature = "addr2line")] -type Addr2LineContext<'a> = addr2line::Context>; - -/// A context which contains dwarf debug information to translate program -/// counters back to filenames and line numbers. -#[cfg(feature = "addr2line")] -pub struct SymbolizeContext<'a> { - inner: Addr2LineContext<'a>, - code_section_offset: u64, -} - -#[cfg(feature = "addr2line")] -impl<'a> SymbolizeContext<'a> { - /// Returns access to the [`addr2line::Context`] which can be used to query - /// frame information with. - pub fn addr2line(&self) -> &Addr2LineContext<'a> { - &self.inner - } - - /// Returns the offset of the code section in the original wasm file, used - /// to calculate lookup values into the DWARF. - pub fn code_section_offset(&self) -> u64 { - self.code_section_offset - } -} - -/// Returns the range of `inner` within `outer`, such that `outer[range]` is the -/// same as `inner`. -/// -/// This method requires that `inner` is a sub-slice of `outer`, and if that -/// isn't true then this method will panic. -pub fn subslice_range(inner: &[u8], outer: &[u8]) -> Range { - if inner.len() == 0 { - return 0..0; - } - - assert!(outer.as_ptr() <= inner.as_ptr()); - assert!((&inner[inner.len() - 1] as *const _) <= (&outer[outer.len() - 1] as *const _)); - - let start = inner.as_ptr() as usize - outer.as_ptr() as usize; - start..start + inner.len() -} diff --git a/crates/jit/src/lib.rs b/crates/jit/src/lib.rs deleted file mode 100644 index 677575183705..000000000000 --- a/crates/jit/src/lib.rs +++ /dev/null @@ -1,22 +0,0 @@ -//! JIT-style runtime for WebAssembly using Cranelift. - -#![deny(missing_docs, trivial_numeric_casts, unused_extern_crates)] -#![warn(unused_import_braces)] - -mod code_memory; -mod debug; -mod demangling; -mod instantiate; -pub mod profiling; -mod unwind; - -pub use crate::code_memory::CodeMemory; -#[cfg(feature = "addr2line")] -pub use crate::instantiate::SymbolizeContext; -pub use crate::instantiate::{ - subslice_range, CompiledFunctionInfo, CompiledModule, CompiledModuleInfo, ObjectBuilder, -}; -pub use demangling::*; - -/// Version number of this crate. -pub const VERSION: &str = env!("CARGO_PKG_VERSION"); diff --git a/crates/jit/src/unwind.rs b/crates/jit/src/unwind.rs deleted file mode 100644 index 9ce8660f36c9..000000000000 --- a/crates/jit/src/unwind.rs +++ /dev/null @@ -1,14 +0,0 @@ -cfg_if::cfg_if! { - if #[cfg(all(windows, any(target_arch = "x86_64", target_arch = "aarch64")))] { - mod winx64; - pub use self::winx64::*; - } else if #[cfg(miri)] { - mod miri; - pub use self::miri::*; - } else if #[cfg(unix)] { - mod systemv; - pub use self::systemv::*; - } else { - compile_error!("unsupported target platform for unwind"); - } -} diff --git a/crates/misc/component-fuzz-util/Cargo.toml b/crates/misc/component-fuzz-util/Cargo.toml index dbfe8aba1bad..9a23fa2cf57f 100644 --- a/crates/misc/component-fuzz-util/Cargo.toml +++ b/crates/misc/component-fuzz-util/Cargo.toml @@ -6,6 +6,9 @@ version = "0.0.0" edition.workspace = true publish = false +[lints] +workspace = true + [dependencies] anyhow = { workspace = true } arbitrary = { workspace = true, features = ["derive"] } diff --git a/crates/runtime/Cargo.toml b/crates/runtime/Cargo.toml index d2f39ac10bb7..3738335b4035 100644 --- a/crates/runtime/Cargo.toml +++ b/crates/runtime/Cargo.toml @@ -10,26 +10,30 @@ keywords = ["webassembly", "wasm"] repository = "https://github.com/bytecodealliance/wasmtime" edition.workspace = true +[lints] +workspace = true + [dependencies] wasmtime-wmemcheck = { workspace = true } wasmtime-asm-macros = { workspace = true } wasmtime-environ = { workspace = true } wasmtime-fiber = { workspace = true, optional = true } -wasmtime-jit-debug = { workspace = true, features = ["gdb_jit_int"] } +wasmtime-jit-debug = { workspace = true, features = ["gdb_jit_int"], optional = true } wasmtime-versioned-export-macros = { workspace = true } libc = { version = "0.2.112", default-features = false } log = { workspace = true } memoffset = "0.9.0" indexmap = { workspace = true } cfg-if = { workspace = true } -rand = { version = "0.8.3", features = ['small_rng'] } anyhow = { workspace = true } -memfd = "0.6.2" paste = "1.0.3" encoding_rs = { version = "0.8.31", optional = true } sptr = "0.3.2" wasm-encoder = { workspace = true } +[target.'cfg(target_os = "linux")'.dependencies] +memfd = "0.6.2" + [target.'cfg(target_os = "macos")'.dependencies] mach = "0.3.2" @@ -48,9 +52,13 @@ features = [ "Win32_Security", ] +[target.'cfg(target_arch = "s390x")'.dependencies] +psm = "0.1.11" + [dev-dependencies] once_cell = { workspace = true } proptest = "1.0.0" +rand = { version = "0.8.3", features = ['small_rng'] } [build-dependencies] cc = "1.0" @@ -61,4 +69,4 @@ async = ["wasmtime-fiber"] pooling-allocator = [] component-model = ["wasmtime-environ/component-model", "dep:encoding_rs"] wmemcheck = [] -debug-builtins = [] +debug-builtins = ['wasmtime-jit-debug'] diff --git a/crates/runtime/build.rs b/crates/runtime/build.rs index 571f0c4b2267..d8ba14f6ccbd 100644 --- a/crates/runtime/build.rs +++ b/crates/runtime/build.rs @@ -2,6 +2,15 @@ use std::env; use wasmtime_versioned_export_macros::versioned_suffix; fn main() { + println!("cargo:rerun-if-changed=build.rs"); + + // If this platform is neither unix nor windows then there's no default need + // for a C helper library since `helpers.c` is tailored for just these + // platforms currently. + if env::var("CARGO_CFG_UNIX").is_err() && env::var("CARGO_CFG_WINDOWS").is_err() { + return; + } + let mut build = cc::Build::new(); build.warnings(true); let arch = env::var("CARGO_CFG_TARGET_ARCH").unwrap(); @@ -11,7 +20,7 @@ fn main() { build.define("VERSIONED_SUFFIX", Some(versioned_suffix!())); if arch == "s390x" { println!("cargo:rerun-if-changed=src/trampolines/s390x.S"); - build.file("src/trampolines/s390x.S"); + build.file("src/arch/s390x.S"); } println!("cargo:rerun-if-changed=src/helpers.c"); build.file("src/helpers.c"); diff --git a/crates/runtime/proptest-regressions/instance/allocator/pooling/memory_pool.txt b/crates/runtime/proptest-regressions/instance/allocator/pooling/memory_pool.txt index f95bfcd3875f..c1d3c19df592 100644 --- a/crates/runtime/proptest-regressions/instance/allocator/pooling/memory_pool.txt +++ b/crates/runtime/proptest-regressions/instance/allocator/pooling/memory_pool.txt @@ -6,3 +6,4 @@ # everyone who runs the test benefits from these saved cases. cc 696808084287d5d58b85c60c4720227ab4dd83ada7be6841a67162023aaf4914 # shrinks to c = SlabConstraints { max_memory_bytes: 0, num_memory_slots: 1, num_pkeys_available: 0, guard_bytes: 9223372036854775808 } cc cf9f6c36659f7f56ed8ea646e8c699cbf46708cef6911cdd376418ad69ea1388 # shrinks to c = SlabConstraints { max_memory_bytes: 14161452635954640438, num_memory_slots: 0, num_pkeys_available: 0, guard_bytes: 4285291437754911178 } +cc 58f42405c4fbfb4b464950f372995d4d08a77d6884335e38c2e68d590cacf7d8 # shrinks to c = SlabConstraints { expected_slot_bytes: 0, max_memory_bytes: 8483846582232735745, num_slots: 0, num_pkeys_available: 0, guard_bytes: 0, guard_before_slots: false } diff --git a/crates/runtime/src/traphandlers/backtrace/aarch64.rs b/crates/runtime/src/arch/aarch64.rs similarity index 53% rename from crates/runtime/src/traphandlers/backtrace/aarch64.rs rename to crates/runtime/src/arch/aarch64.rs index 8c36291e37af..e212b412d2e4 100644 --- a/crates/runtime/src/traphandlers/backtrace/aarch64.rs +++ b/crates/runtime/src/arch/aarch64.rs @@ -1,3 +1,24 @@ +//! Arm64-specific definitions of architecture-specific functions in Wasmtime. + +/// AArch64 uses vector registered which here is used with a vector type. +/// Note that the specific type shouldn't matter too much but the choice +/// of using a vector is the significant part. +pub type V128Abi = std::arch::aarch64::uint8x16_t; + +#[inline] +#[allow(missing_docs)] +pub fn get_stack_pointer() -> usize { + let stack_pointer: usize; + unsafe { + std::arch::asm!( + "mov {}, sp", + out(reg) stack_pointer, + options(nostack,nomem), + ); + } + stack_pointer +} + // The aarch64 calling conventions save the return PC one i64 above the FP and // the previous FP is pointed to by the current FP: // @@ -53,3 +74,47 @@ pub fn assert_fp_is_aligned(_fp: usize) { // // [0]: https://github.com/ARM-software/abi-aa/blob/2022Q1/aapcs64/aapcs64.rst#the-frame-pointer } + +#[rustfmt::skip] +macro_rules! wasm_to_libcall_trampoline { + ($libcall:ident ; $libcall_impl:ident) => { + wasmtime_asm_macros::asm_func!( + wasmtime_versioned_export_macros::versioned_stringify_ident!($libcall), + " + .cfi_startproc + bti c + + // Load the pointer to `VMRuntimeLimits` in `x9`. + ldur x9, [x0, #8] + + // Store the last Wasm FP into the `last_wasm_exit_fp` in the limits. + stur fp, [x9, #24] + + // Store the last Wasm PC into the `last_wasm_exit_pc` in the limits. + stur lr, [x9, #32] + + // Tail call to the actual implementation of this libcall. + b {} + + .cfi_endproc + ", + sym $libcall_impl + ); + }; +} +pub(crate) use wasm_to_libcall_trampoline; + +#[cfg(test)] +mod wasm_to_libcall_trampoline_offsets_tests { + use wasmtime_environ::{Module, PtrSize, VMOffsets}; + + #[test] + fn test() { + let module = Module::new(); + let offsets = VMOffsets::new(std::mem::size_of::<*mut u8>() as u8, &module); + + assert_eq!(8, offsets.vmctx_runtime_limits()); + assert_eq!(24, offsets.ptr.vmruntime_limits_last_wasm_exit_fp()); + assert_eq!(32, offsets.ptr.vmruntime_limits_last_wasm_exit_pc()); + } +} diff --git a/crates/runtime/src/arch/mod.rs b/crates/runtime/src/arch/mod.rs new file mode 100644 index 000000000000..a46f152dbd33 --- /dev/null +++ b/crates/runtime/src/arch/mod.rs @@ -0,0 +1,32 @@ +//! Architecture-specific support required by Wasmtime. +//! +//! This crate houses any architecture-specific tidbits required when running +//! Wasmtime. Each architecture has its own file in the `arch` folder which is +//! referenced here. +//! +//! All architectures have the same interface when exposed to the rest of the +//! crate. + +cfg_if::cfg_if! { + if #[cfg(target_arch = "x86_64")] { + mod x86_64; + pub use x86_64::*; + } else if #[cfg(target_arch = "aarch64")] { + mod aarch64; + pub use aarch64::*; + } else if #[cfg(target_arch = "s390x")] { + mod s390x; + pub use s390x::*; + } else if #[cfg(target_arch = "riscv64")] { + mod riscv64; + pub use riscv64::*; + } else { + compile_error!( + "Wasmtime is being compiled for an architecture \ + that it does not support. If this architecture is \ + one you would like to see supported you may file an \ + issue on Wasmtime's issue tracker: \ + https://github.com/bytecodealliance/wasmtime/issues/new\ + "); + } +} diff --git a/crates/runtime/src/trampolines/riscv64.rs b/crates/runtime/src/arch/riscv64.rs similarity index 53% rename from crates/runtime/src/trampolines/riscv64.rs rename to crates/runtime/src/arch/riscv64.rs index b43afcbf4518..7f600b43dfe2 100644 --- a/crates/runtime/src/trampolines/riscv64.rs +++ b/crates/runtime/src/arch/riscv64.rs @@ -1,3 +1,45 @@ +//! Riscv64-specific definitions of architecture-specific functions in Wasmtime. + +/// RISC-V currently always passes all vector arguments indirectly in the +/// ABI. Currently Rust has no stable means of representing this meaning +/// that a 128-bit representation is chosen here but it can't be passed +/// directly to WebAssembly, for example, and must instead be passed +/// through an array-call trampoline. +pub type V128Abi = u128; + +#[inline] +#[allow(missing_docs)] +pub fn get_stack_pointer() -> usize { + let stack_pointer: usize; + unsafe { + std::arch::asm!( + "mv {}, sp", + out(reg) stack_pointer, + options(nostack,nomem), + ); + } + stack_pointer +} + +pub unsafe fn get_next_older_pc_from_fp(fp: usize) -> usize { + *(fp as *mut usize).offset(1) +} + +// And the current frame pointer points to the next older frame pointer. +pub const NEXT_OLDER_FP_FROM_FP_OFFSET: usize = 0; + +pub fn reached_entry_sp(fp: usize, entry_sp: usize) -> bool { + fp >= entry_sp +} + +pub fn assert_entry_sp_is_aligned(sp: usize) { + assert_eq!(sp % 16, 0, "stack should always be aligned to 16"); +} + +pub fn assert_fp_is_aligned(fp: usize) { + assert_eq!(fp % 16, 0, "stack should always be aligned to 16"); +} + #[rustfmt::skip] macro_rules! wasm_to_libcall_trampoline { ($libcall:ident ; $libcall_impl:ident) => { @@ -28,6 +70,7 @@ macro_rules! wasm_to_libcall_trampoline { ); }; } +pub(crate) use wasm_to_libcall_trampoline; #[cfg(test)] mod wasm_to_libcall_trampoline_offsets_tests { diff --git a/crates/runtime/src/trampolines/s390x.S b/crates/runtime/src/arch/s390x.S similarity index 100% rename from crates/runtime/src/trampolines/s390x.S rename to crates/runtime/src/arch/s390x.S diff --git a/crates/runtime/src/arch/s390x.rs b/crates/runtime/src/arch/s390x.rs new file mode 100644 index 000000000000..3ad6889b1efb --- /dev/null +++ b/crates/runtime/src/arch/s390x.rs @@ -0,0 +1,61 @@ +//! s390x-specific definitions of architecture-specific functions in Wasmtime. + +/// Currently Rust has no stable means of representing vector registers +/// so like RISC-V at this time this uses a bland 128-bit representation. +pub type V128Abi = u128; + +#[inline] +#[allow(missing_docs)] +pub fn get_stack_pointer() -> usize { + psm::stack_pointer() as usize +} + +pub unsafe fn get_next_older_pc_from_fp(fp: usize) -> usize { + // The next older PC can be found in register %r14 at function entry, which + // was saved into slot 14 of the register save area pointed to by "FP" (the + // backchain pointer). + *(fp as *mut usize).offset(14) +} + +// The next older "FP" (backchain pointer) was saved in the slot pointed to +// by the current "FP". +pub const NEXT_OLDER_FP_FROM_FP_OFFSET: usize = 0; + +pub fn reached_entry_sp(fp: usize, entry_sp: usize) -> bool { + fp > entry_sp +} + +pub fn assert_entry_sp_is_aligned(sp: usize) { + assert_eq!(sp % 8, 0, "stack should always be aligned to 8"); +} + +pub fn assert_fp_is_aligned(fp: usize) { + assert_eq!(fp % 8, 0, "stack should always be aligned to 8"); +} + +// The implementation for libcall trampolines is in the s390x.S +// file. We provide this dummy definition of wasm_to_libcall_trampoline +// here to make libcalls.rs compile on s390x. Note that this means we +// have to duplicate the list of libcalls used in the assembler file. + +macro_rules! wasm_to_libcall_trampoline { + ($libcall:ident ; $libcall_impl:ident) => {}; +} +pub(crate) use wasm_to_libcall_trampoline; + +// The wasm_to_host_trampoline implementation is in the s390x.S +// file, but we still want to have this unit test here. +#[cfg(test)] +mod wasm_to_libcall_trampoline_offsets_tests { + use wasmtime_environ::{Module, PtrSize, VMOffsets}; + + #[test] + fn test() { + let module = Module::new(); + let offsets = VMOffsets::new(std::mem::size_of::<*mut u8>() as u8, &module); + + assert_eq!(8, offsets.vmctx_runtime_limits()); + assert_eq!(24, offsets.ptr.vmruntime_limits_last_wasm_exit_fp()); + assert_eq!(32, offsets.ptr.vmruntime_limits_last_wasm_exit_pc()); + } +} diff --git a/crates/runtime/src/trampolines/x86_64.rs b/crates/runtime/src/arch/x86_64.rs similarity index 51% rename from crates/runtime/src/trampolines/x86_64.rs rename to crates/runtime/src/arch/x86_64.rs index d22bcaf1a0e3..a179831f955a 100644 --- a/crates/runtime/src/trampolines/x86_64.rs +++ b/crates/runtime/src/arch/x86_64.rs @@ -1,21 +1,62 @@ +//! x86_64-specific definitions of architecture-specific functions in Wasmtime. + +/// x86 vectors are represented with XMM registers which are represented +/// with the `__m128i` type. This type is considered a vector type for +/// ABI purposes which is implemented by Cranelift. +pub type V128Abi = std::arch::x86_64::__m128i; + +#[inline] +#[allow(missing_docs)] +pub fn get_stack_pointer() -> usize { + let stack_pointer: usize; + unsafe { + std::arch::asm!( + "mov {}, rsp", + out(reg) stack_pointer, + options(nostack,nomem), + ); + } + stack_pointer +} + +pub unsafe fn get_next_older_pc_from_fp(fp: usize) -> usize { + // The calling convention always pushes the return pointer (aka the PC of + // the next older frame) just before this frame. + *(fp as *mut usize).offset(1) +} + +// And the current frame pointer points to the next older frame pointer. +pub const NEXT_OLDER_FP_FROM_FP_OFFSET: usize = 0; + +pub fn reached_entry_sp(fp: usize, entry_sp: usize) -> bool { + fp >= entry_sp +} + +pub fn assert_entry_sp_is_aligned(sp: usize) { + assert_eq!(sp % 16, 0, "stack should always be aligned to 16"); +} + +pub fn assert_fp_is_aligned(fp: usize) { + assert_eq!(fp % 16, 0, "stack should always be aligned to 16"); +} + // Helper macros for getting the first and second arguments according to the // system calling convention, as well as some callee-saved scratch registers we // can safely use in the trampolines. cfg_if::cfg_if! { if #[cfg(windows)] { macro_rules! callee_vmctx { () => ("rcx") } - #[allow(unused)] macro_rules! caller_vmctx { () => ("rdx") } macro_rules! scratch0 { () => ("r10") } macro_rules! scratch1 { () => ("r11") } } else if #[cfg(unix)] { macro_rules! callee_vmctx { () => ("rdi") } - #[allow(unused)] macro_rules! caller_vmctx { () => ("rsi") } macro_rules! scratch0 { () => ("r10") } macro_rules! scratch1 { () => ("r11") } } else { - compile_error!("platform not supported"); + compile_error!("default calling convention for this platform is not known"); } } +pub(crate) use {callee_vmctx, scratch0, scratch1}; #[rustfmt::skip] macro_rules! wasm_to_libcall_trampoline { @@ -27,15 +68,15 @@ macro_rules! wasm_to_libcall_trampoline { .cfi_startproc simple .cfi_def_cfa_offset 0 - // Load the pointer to `VMRuntimeLimits` in `", scratch0!(), "`. - mov ", scratch0!(), ", 8[", callee_vmctx!(), "] + // Load the pointer to `VMRuntimeLimits` in `scratch0!()`. + mov ", crate::arch::scratch0!(), ", 8[", crate::arch::callee_vmctx!(), "] // Store the last Wasm FP into the `last_wasm_exit_fp` in the limits. - mov 24[", scratch0!(), "], rbp + mov 24[", crate::arch::scratch0!(), "], rbp // Store the last Wasm PC into the `last_wasm_exit_pc` in the limits. - mov ", scratch1!(), ", [rsp] - mov 32[", scratch0!(), "], ", scratch1!(), " + mov ", crate::arch::scratch1!(), ", [rsp] + mov 32[", crate::arch::scratch0!(), "], ", crate::arch::scratch1!(), " // Tail call to the actual implementation of this libcall. jmp {} @@ -47,6 +88,7 @@ macro_rules! wasm_to_libcall_trampoline { ); }; } +pub(crate) use wasm_to_libcall_trampoline; #[cfg(test)] mod wasm_to_libcall_trampoline_offsets_tests { diff --git a/crates/runtime/src/component.rs b/crates/runtime/src/component.rs index fc0d4bf2a983..6a92c7bd91e3 100644 --- a/crates/runtime/src/component.rs +++ b/crates/runtime/src/component.rs @@ -8,7 +8,7 @@ use crate::{ SendSyncPtr, Store, VMArrayCallFunction, VMFuncRef, VMGlobalDefinition, VMMemoryDefinition, - VMNativeCallFunction, VMOpaqueContext, VMSharedSignatureIndex, VMWasmCallFunction, ValRaw, + VMNativeCallFunction, VMOpaqueContext, VMSharedTypeIndex, VMWasmCallFunction, ValRaw, }; use anyhow::Result; use memoffset::offset_of; @@ -395,7 +395,7 @@ impl ComponentInstance { wasm_call: NonNull, native_call: NonNull, array_call: VMArrayCallFunction, - type_index: VMSharedSignatureIndex, + type_index: VMSharedTypeIndex, ) { unsafe { let offset = self.offsets.trampoline_func_ref(idx); @@ -732,7 +732,7 @@ impl OwnedComponentInstance { wasm_call: NonNull, native_call: NonNull, array_call: VMArrayCallFunction, - type_index: VMSharedSignatureIndex, + type_index: VMSharedTypeIndex, ) { unsafe { self.instance_mut() diff --git a/crates/runtime/src/cow.rs b/crates/runtime/src/cow.rs index ccd34b828910..75738be7f35c 100644 --- a/crates/runtime/src/cow.rs +++ b/crates/runtime/src/cow.rs @@ -1,12 +1,10 @@ //! Copy-on-write initialization support: creation of backing images for //! modules, and logic to support mapping these backing images into memory. -#![cfg_attr(any(not(unix), miri), allow(unused_imports, unused_variables))] - +use crate::sys::vm::{self, MemoryImageSource}; use crate::{MmapVec, SendSyncPtr}; use anyhow::Result; -use libc::c_void; -use std::fs::File; +use std::ffi::c_void; use std::ptr::NonNull; use std::sync::Arc; use std::{convert::TryFrom, ops::Range}; @@ -32,12 +30,12 @@ impl ModuleMemoryImages { /// One backing image for one memory. #[derive(Debug, PartialEq)] pub struct MemoryImage { - /// The file descriptor source of this image. + /// The platform-specific source of this image. /// - /// This might be an mmaped `*.cwasm` file or on Linux it could also be a - /// `Memfd` as an anonymous file in memory. In either case this is used as - /// the backing-source for the CoW image. - fd: FdSource, + /// This might be a mapped `*.cwasm` file or on Unix it could also be a + /// `Memfd` as an anonymous file in memory on Linux. In either case this is + /// used as the backing-source for the CoW image. + source: MemoryImageSource, /// Length of image, in bytes. /// @@ -47,13 +45,13 @@ pub struct MemoryImage { /// Must be a multiple of the system page size. len: usize, - /// Image starts this many bytes into `fd` source. + /// Image starts this many bytes into `source`. /// - /// This is 0 for anonymous-backed memfd files and is the offset of the data - /// section in a `*.cwasm` file for `*.cwasm`-backed images. + /// This is 0 for anonymous-backed memfd files and is the offset of the + /// data section in a `*.cwasm` file for `*.cwasm`-backed images. /// /// Must be a multiple of the system page size. - fd_offset: u64, + source_offset: u64, /// Image starts this many bytes into heap space. /// @@ -61,39 +59,6 @@ pub struct MemoryImage { linear_memory_offset: usize, } -#[derive(Debug)] -enum FdSource { - #[cfg(all(unix, not(miri)))] - Mmap(Arc), - #[cfg(all(target_os = "linux", not(miri)))] - Memfd(memfd::Memfd), -} - -impl FdSource { - #[cfg(all(unix, not(miri)))] - fn as_file(&self) -> &File { - match self { - FdSource::Mmap(ref file) => file, - #[cfg(target_os = "linux")] - FdSource::Memfd(ref memfd) => memfd.as_file(), - } - } -} - -impl PartialEq for FdSource { - fn eq(&self, other: &FdSource) -> bool { - cfg_if::cfg_if! { - if #[cfg(all(unix, not(miri)))] { - use rustix::fd::AsRawFd; - self.as_file().as_raw_fd() == other.as_file().as_raw_fd() - } else { - let _ = other; - match *self {} - } - } - } -} - impl MemoryImage { fn new( page_size: u32, @@ -124,7 +89,6 @@ impl MemoryImage { // files, but for now this is still a Linux-specific region of Wasmtime. // Some work will be needed to get this file compiling for macOS and // Windows. - #[cfg(not(any(windows, miri)))] if let Some(mmap) = mmap { let start = mmap.as_ptr() as usize; let end = start + mmap.len(); @@ -137,126 +101,45 @@ impl MemoryImage { assert_eq!((mmap.original_offset() as u32) % page_size, 0); if let Some(file) = mmap.original_file() { - return Ok(Some(MemoryImage { - fd: FdSource::Mmap(file.clone()), - fd_offset: u64::try_from(mmap.original_offset() + (data_start - start)) - .unwrap(), - linear_memory_offset, - len, - })); + if let Some(source) = MemoryImageSource::from_file(file) { + return Ok(Some(MemoryImage { + source, + source_offset: u64::try_from(mmap.original_offset() + (data_start - start)) + .unwrap(), + linear_memory_offset, + len, + })); + } } } // If `mmap` doesn't come from a file then platform-specific mechanisms // may be used to place the data in a form that's amenable to an mmap. - - cfg_if::cfg_if! { - if #[cfg(all(target_os = "linux", not(miri)))] { - // On Linux `memfd_create` is used to create an anonymous - // in-memory file to represent the heap image. This anonymous - // file is then used as the basis for further mmaps. - - use std::io::Write; - - let memfd = match create_memfd()? { - Some(memfd) => memfd, - None => return Ok(None), - }; - memfd.as_file().write_all(data)?; - - // Seal the memfd's data and length. - // - // This is a defense-in-depth security mitigation. The - // memfd will serve as the starting point for the heap of - // every instance of this module. If anything were to - // write to this, it could affect every execution. The - // memfd object itself is owned by the machinery here and - // not exposed elsewhere, but it is still an ambient open - // file descriptor at the syscall level, so some other - // vulnerability that allowed writes to arbitrary fds - // could modify it. Or we could have some issue with the - // way that we map it into each instance. To be - // extra-super-sure that it never changes, and because - // this costs very little, we use the kernel's "seal" API - // to make the memfd image permanently read-only. - memfd.add_seals(&[ - memfd::FileSeal::SealGrow, - memfd::FileSeal::SealShrink, - memfd::FileSeal::SealWrite, - memfd::FileSeal::SealSeal, - ])?; - - Ok(Some(MemoryImage { - fd: FdSource::Memfd(memfd), - fd_offset: 0, - linear_memory_offset, - len, - })) - } else { - // Other platforms don't have an easily available way of - // representing the heap image as an mmap-source right now. We - // could theoretically create a file and immediately unlink it - // but that means that data may likely be preserved to disk - // which isn't what we want here. - Ok(None) - } + if let Some(source) = MemoryImageSource::from_data(data)? { + return Ok(Some(MemoryImage { + source, + source_offset: 0, + linear_memory_offset, + len, + })); } + + Ok(None) } unsafe fn map_at(&self, base: *mut u8) -> Result<()> { - cfg_if::cfg_if! { - if #[cfg(all(unix, not(miri)))] { - let ptr = rustix::mm::mmap( - base.add(self.linear_memory_offset).cast(), - self.len, - rustix::mm::ProtFlags::READ | rustix::mm::ProtFlags::WRITE, - rustix::mm::MapFlags::PRIVATE | rustix::mm::MapFlags::FIXED, - self.fd.as_file(), - self.fd_offset, - )?; - assert_eq!(ptr, base.add(self.linear_memory_offset).cast()); - Ok(()) - } else { - match self.fd {} - } - } + self.source.map_at( + base.add(self.linear_memory_offset), + self.len, + self.source_offset, + )?; + Ok(()) } unsafe fn remap_as_zeros_at(&self, base: *mut u8) -> Result<()> { - cfg_if::cfg_if! { - if #[cfg(unix)] { - let ptr = rustix::mm::mmap_anonymous( - base.add(self.linear_memory_offset).cast(), - self.len, - rustix::mm::ProtFlags::READ | rustix::mm::ProtFlags::WRITE, - rustix::mm::MapFlags::PRIVATE | rustix::mm::MapFlags::FIXED, - )?; - assert_eq!(ptr.cast(), base.add(self.linear_memory_offset)); - Ok(()) - } else { - match self.fd {} - } - } - } -} - -#[cfg(all(target_os = "linux", not(miri)))] -fn create_memfd() -> Result> { - use std::io::ErrorKind; - - // Create the memfd. It needs a name, but the - // documentation for `memfd_create()` says that names can - // be duplicated with no issues. - match memfd::MemfdOptions::new() - .allow_sealing(true) - .create("wasm-memory-image") - { - Ok(memfd) => Ok(Some(memfd)), - // If this kernel is old enough to not support memfd then attempt to - // gracefully handle that and fall back to skipping the memfd - // optimization. - Err(memfd::Error::Create(err)) if err.kind() == ErrorKind::Unsupported => Ok(None), - Err(e) => Err(e.into()), + self.source + .remap_as_zeros_at(base.add(self.linear_memory_offset), self.len)?; + Ok(()) } } @@ -593,7 +476,7 @@ impl MemoryImageSlot { #[allow(dead_code)] // ignore warnings as this is only used in some cfgs unsafe fn reset_all_memory_contents(&mut self, keep_resident: usize) -> Result<()> { - if !cfg!(target_os = "linux") || cfg!(miri) { + if !vm::supports_madvise_dontneed() { // If we're not on Linux then there's no generic platform way to // reset memory back to its original state, so instead reset memory // back to entirely zeros with an anonymous backing. @@ -703,18 +586,8 @@ impl MemoryImageSlot { if len == 0 { return Ok(()); } - cfg_if::cfg_if! { - if #[cfg(target_os = "linux")] { - rustix::mm::madvise( - self.base.as_ptr().add(base).cast(), - len, - rustix::mm::Advice::LinuxDontNeed, - )?; - Ok(()) - } else { - unreachable!(); - } - } + vm::madvise_dontneed(self.base.as_ptr().add(base), len)?; + Ok(()) } fn set_protection(&self, range: Range, readwrite: bool) -> Result<()> { @@ -726,30 +599,10 @@ impl MemoryImageSlot { unsafe { let start = self.base.as_ptr().add(range.start); - cfg_if::cfg_if! { - if #[cfg(miri)] { - if readwrite { - std::ptr::write_bytes(start, 0u8, range.len()); - } - } else if #[cfg(unix)] { - let flags = if readwrite { - rustix::mm::MprotectFlags::READ | rustix::mm::MprotectFlags::WRITE - } else { - rustix::mm::MprotectFlags::empty() - }; - rustix::mm::mprotect(start.cast(), range.len(), flags)?; - } else { - use windows_sys::Win32::System::Memory::*; - - let failure = if readwrite { - VirtualAlloc(start.cast(), range.len(), MEM_COMMIT, PAGE_READWRITE).is_null() - } else { - VirtualFree(start.cast(), range.len(), MEM_DECOMMIT) == 0 - }; - if failure { - return Err(std::io::Error::last_os_error().into()); - } - } + if readwrite { + vm::expose_existing_mapping(start, range.len())?; + } else { + vm::hide_existing_mapping(start, range.len())?; } } @@ -775,24 +628,7 @@ impl MemoryImageSlot { } unsafe { - cfg_if::cfg_if! { - if #[cfg(miri)] { - std::ptr::write_bytes(self.base.as_ptr(), 0, self.static_size); - } else if #[cfg(unix)] { - let ptr = rustix::mm::mmap_anonymous( - self.base.as_ptr().cast(), - self.static_size, - rustix::mm::ProtFlags::empty(), - rustix::mm::MapFlags::PRIVATE | rustix::mm::MapFlags::FIXED, - )?; - assert_eq!(ptr, self.base.as_ptr().cast()); - } else { - use windows_sys::Win32::System::Memory::*; - if VirtualFree(self.base.as_ptr().cast(), self.static_size, MEM_DECOMMIT) == 0 { - return Err(std::io::Error::last_os_error().into()); - } - } - } + vm::erase_existing_mapping(self.base.as_ptr(), self.static_size)?; } self.image = None; @@ -845,31 +681,23 @@ impl Drop for MemoryImageSlot { mod test { use std::sync::Arc; - use super::{FdSource, MemoryImage, MemoryImageSlot, MemoryPlan, MemoryStyle}; + use super::{MemoryImage, MemoryImageSlot, MemoryImageSource, MemoryPlan, MemoryStyle}; use crate::mmap::Mmap; use anyhow::Result; - use std::io::Write; use wasmtime_environ::Memory; - fn create_memfd() -> Result { - Ok(super::create_memfd()?.expect("kernel doesn't support memfd")) - } - fn create_memfd_with_data(offset: usize, data: &[u8]) -> Result { // Offset must be page-aligned. let page_size = crate::page_size(); assert_eq!(offset & (page_size - 1), 0); - let memfd = create_memfd()?; - memfd.as_file().write_all(data)?; // The image length is rounded up to the nearest page size let image_len = (data.len() + page_size - 1) & !(page_size - 1); - memfd.as_file().set_len(image_len as u64)?; Ok(MemoryImage { - fd: FdSource::Memfd(memfd), + source: MemoryImageSource::from_data(data)?.unwrap(), len: image_len, - fd_offset: 0, + source_offset: 0, linear_memory_offset: offset, }) } diff --git a/crates/runtime/src/helpers.c b/crates/runtime/src/helpers.c index e3c9bb58240b..08fcfeb75018 100644 --- a/crates/runtime/src/helpers.c +++ b/crates/runtime/src/helpers.c @@ -2,28 +2,22 @@ #include #include +#if (defined(__GNUC__) && !defined(__clang__)) +#define WASMTIME_GCC 1 +#endif + #ifdef CFG_TARGET_OS_windows +// Windows is required to use normal `setjmp` and `longjmp`. #define platform_setjmp(buf) setjmp(buf) #define platform_longjmp(buf, arg) longjmp(buf, arg) typedef jmp_buf platform_jmp_buf; -#elif defined(__clang__) && (defined(__aarch64__) || defined(__s390x__)) - -// Clang on aarch64 and s390x doesn't support `__builtin_setjmp`, so use -//`sigsetjmp` from libc. -// -// Note that `sigsetjmp` and `siglongjmp` are used here where possible to -// explicitly pass a 0 argument to `sigsetjmp` that we don't need to preserve -// the process signal mask. This should make this call a bit faster b/c it -// doesn't need to touch the kernel signal handling routines. -#define platform_setjmp(buf) sigsetjmp(buf, 0) -#define platform_longjmp(buf, arg) siglongjmp(buf, arg) -typedef sigjmp_buf platform_jmp_buf; +#elif defined(WASMTIME_GCC) || defined(__x86_64__) -#else +// clang-format off -// GCC and Clang both provide `__builtin_setjmp`/`__builtin_longjmp`, which +// GCC and Clang on x86_64 provide `__builtin_setjmp`/`__builtin_longjmp`, which // differ from plain `setjmp` and `longjmp` in that they're implemented by // the compiler inline rather than in libc, and the compiler can avoid saving // and restoring most of the registers. See the [GCC docs] and [clang docs] @@ -36,21 +30,34 @@ typedef sigjmp_buf platform_jmp_buf; // // [GCC docs]: https://gcc.gnu.org/onlinedocs/gcc/Nonlocal-Gotos.html // [clang docs]: https://llvm.org/docs/ExceptionHandling.html#llvm-eh-sjlj-setjmp + +// clang-format on #define platform_setjmp(buf) __builtin_setjmp(buf) #define platform_longjmp(buf, arg) __builtin_longjmp(buf, arg) -typedef void *platform_jmp_buf[5]; // this is the documented size; see the docs links for details. +typedef void *platform_jmp_buf[5]; // this is the documented size; see the docs + // links for details. + +#else + +// All other platforms/compilers funnel in here. +// +// Note that `sigsetjmp` and `siglongjmp` are used here where possible to +// explicitly pass a 0 argument to `sigsetjmp` that we don't need to preserve +// the process signal mask. This should make this call a bit faster b/c it +// doesn't need to touch the kernel signal handling routines. +#define platform_setjmp(buf) sigsetjmp(buf, 0) +#define platform_longjmp(buf, arg) siglongjmp(buf, arg) +typedef sigjmp_buf platform_jmp_buf; #endif -#define CONCAT2(a, b) a ## b -#define CONCAT(a, b) CONCAT2(a , b) +#define CONCAT2(a, b) a##b +#define CONCAT(a, b) CONCAT2(a, b) #define VERSIONED_SYMBOL(a) CONCAT(a, VERSIONED_SUFFIX) -int VERSIONED_SYMBOL(wasmtime_setjmp)( - void **buf_storage, - void (*body)(void*, void*), - void *payload, - void *callee) { +int VERSIONED_SYMBOL(wasmtime_setjmp)(void **buf_storage, + void (*body)(void *, void *), + void *payload, void *callee) { platform_jmp_buf buf; if (platform_setjmp(buf) != 0) { return 0; @@ -61,23 +68,23 @@ int VERSIONED_SYMBOL(wasmtime_setjmp)( } void VERSIONED_SYMBOL(wasmtime_longjmp)(void *JmpBuf) { - platform_jmp_buf *buf = (platform_jmp_buf*) JmpBuf; + platform_jmp_buf *buf = (platform_jmp_buf *)JmpBuf; platform_longjmp(*buf, 1); } #ifdef CFG_TARGET_OS_windows - // export required for external access. +// export required for external access. __declspec(dllexport) #else - // Note the `weak` linkage here, though, which is intended to let other code - // override this symbol if it's defined elsewhere, since this definition doesn't - // matter. - // Just in case cross-language LTO is enabled we set the `noinline` attribute - // and also try to have some sort of side effect in this function with a dummy - // `asm` statement. +// Note the `weak` linkage here, though, which is intended to let other code +// override this symbol if it's defined elsewhere, since this definition doesn't +// matter. +// Just in case cross-language LTO is enabled we set the `noinline` attribute +// and also try to have some sort of side effect in this function with a dummy +// `asm` statement. __attribute__((weak, noinline)) #endif -void __jit_debug_register_code() { + void __jit_debug_register_code() { #ifndef CFG_TARGET_OS_windows __asm__(""); #endif @@ -86,23 +93,21 @@ void __jit_debug_register_code() { struct JITDescriptor { uint32_t version_; uint32_t action_flag_; - void* relevant_entry_; - void* first_entry_; + void *relevant_entry_; + void *first_entry_; }; #ifdef CFG_TARGET_OS_windows - // export required for external access. - __declspec(dllexport) +// export required for external access. +__declspec(dllexport) #else - // Note the `weak` linkage here which is the same purpose as above. We want to - // let other runtimes be able to override this since our own definition isn't - // important. - __attribute__((weak)) +// Note the `weak` linkage here which is the same purpose as above. We want to +// let other runtimes be able to override this since our own definition isn't +// important. +__attribute__((weak)) #endif -struct JITDescriptor __jit_debug_descriptor = {1, 0, NULL, NULL}; - - + struct JITDescriptor __jit_debug_descriptor = {1, 0, NULL, NULL}; -struct JITDescriptor* VERSIONED_SYMBOL(wasmtime_jit_debug_descriptor)() { +struct JITDescriptor *VERSIONED_SYMBOL(wasmtime_jit_debug_descriptor)() { return &__jit_debug_descriptor; } diff --git a/crates/runtime/src/instance.rs b/crates/runtime/src/instance.rs index 8035f5db7f4a..30cf5f4f6db2 100644 --- a/crates/runtime/src/instance.rs +++ b/crates/runtime/src/instance.rs @@ -13,7 +13,7 @@ use crate::vmcontext::{ }; use crate::{ ExportFunction, ExportGlobal, ExportMemory, ExportTable, Imports, ModuleRuntimeInfo, - SendSyncPtr, Store, VMFunctionBody, VMSharedSignatureIndex, WasmFault, + SendSyncPtr, Store, VMFunctionBody, VMSharedTypeIndex, WasmFault, }; use anyhow::Error; use anyhow::Result; @@ -26,11 +26,12 @@ use std::ptr::NonNull; use std::sync::atomic::AtomicU64; use std::sync::Arc; use std::{mem, ptr}; +use wasmtime_environ::ModuleInternedTypeIndex; use wasmtime_environ::{ packed_option::ReservedValue, DataIndex, DefinedGlobalIndex, DefinedMemoryIndex, DefinedTableIndex, ElemIndex, EntityIndex, EntityRef, EntitySet, FuncIndex, GlobalIndex, - GlobalInit, HostPtr, MemoryIndex, MemoryPlan, Module, PrimaryMap, SignatureIndex, TableIndex, - TableInitialValue, Trap, VMOffsets, WasmHeapType, WasmRefType, WasmType, VMCONTEXT_MAGIC, + GlobalInit, HostPtr, MemoryIndex, MemoryPlan, Module, PrimaryMap, TableIndex, + TableInitialValue, Trap, VMOffsets, WasmHeapType, WasmRefType, WasmValType, VMCONTEXT_MAGIC, }; #[cfg(feature = "wmemcheck")] use wasmtime_wmemcheck::Wmemcheck; @@ -690,10 +691,15 @@ impl Instance { /// than tracking state related to whether it's been initialized /// before, because resetting that state on (re)instantiation is /// very expensive if there are many funcrefs. - fn construct_func_ref(&mut self, index: FuncIndex, sig: SignatureIndex, into: *mut VMFuncRef) { + fn construct_func_ref( + &mut self, + index: FuncIndex, + sig: ModuleInternedTypeIndex, + into: *mut VMFuncRef, + ) { let type_index = unsafe { - let base: *const VMSharedSignatureIndex = - *self.vmctx_plus_offset_mut(self.offsets().vmctx_signature_ids_array()); + let base: *const VMSharedTypeIndex = + *self.vmctx_plus_offset_mut(self.offsets().vmctx_type_ids_array()); *base.add(sig.index()) }; @@ -1119,9 +1125,9 @@ impl Instance { self.set_callee(None); self.set_store(store.as_raw()); - // Initialize shared signatures - let signatures = self.runtime_info.signature_ids(); - *self.vmctx_plus_offset_mut(offsets.vmctx_signature_ids_array()) = signatures.as_ptr(); + // Initialize shared types + let types = self.runtime_info.type_ids(); + *self.vmctx_plus_offset_mut(offsets.vmctx_type_ids_array()) = types.as_ptr(); // Initialize the built-in functions *self.vmctx_plus_offset_mut(offsets.vmctx_builtin_functions()) = @@ -1229,7 +1235,7 @@ impl Instance { // count as values move between globals, everything else is just // copy-able bits. match wasm_ty { - WasmType::Ref(WasmRefType { + WasmValType::Ref(WasmRefType { heap_type: WasmHeapType::Extern, .. }) => *(*to).as_externref_mut() = from.as_externref().clone(), @@ -1241,7 +1247,7 @@ impl Instance { } GlobalInit::RefNullConst => match wasm_ty { // `VMGlobalDefinition::new()` already zeroed out the bits - WasmType::Ref(WasmRefType { nullable: true, .. }) => {} + WasmValType::Ref(WasmRefType { nullable: true, .. }) => {} ty => panic!("unsupported reference type for global: {:?}", ty), }, } @@ -1277,7 +1283,7 @@ impl Drop for Instance { }; match global.wasm_ty { // For now only externref globals need to get destroyed - WasmType::Ref(WasmRefType { + WasmValType::Ref(WasmRefType { heap_type: WasmHeapType::Extern, .. }) => {} diff --git a/crates/runtime/src/instance/allocator.rs b/crates/runtime/src/instance/allocator.rs index 5205d87c3444..205d569f1a2e 100644 --- a/crates/runtime/src/instance/allocator.rs +++ b/crates/runtime/src/instance/allocator.rs @@ -9,7 +9,7 @@ use std::{alloc, any::Any, mem, ptr, sync::Arc}; use wasmtime_environ::{ DefinedMemoryIndex, DefinedTableIndex, HostPtr, InitMemory, MemoryInitialization, MemoryInitializer, MemoryPlan, Module, PrimaryMap, TableInitialValue, TablePlan, TableSegment, - Trap, VMOffsets, WasmType, WASM_PAGE_SIZE, + Trap, VMOffsets, WasmValType, WASM_PAGE_SIZE, }; #[cfg(feature = "component-model")] @@ -613,7 +613,7 @@ fn initialize_memories(instance: &mut Instance, module: &Module) -> Result<()> { // 32-bit globals which can be used as the base for 32-bit memories. let get_global_as_u64 = &mut |instance: &mut Instance, global| unsafe { let def = instance.defined_or_imported_global_ptr(global); - if module.globals[global].wasm_ty == WasmType::I64 { + if module.globals[global].wasm_ty == WasmValType::I64 { *(*def).as_u64() } else { u64::from(*(*def).as_u32()) diff --git a/crates/runtime/src/instance/allocator/pooling.rs b/crates/runtime/src/instance/allocator/pooling.rs index e0584726fa67..a7154c7c9984 100644 --- a/crates/runtime/src/instance/allocator/pooling.rs +++ b/crates/runtime/src/instance/allocator/pooling.rs @@ -13,50 +13,10 @@ //! └──────┴──────┴──────┴──────┴──────┘ //! ``` //! -//! Note that these slots are a useful abstraction but not exactly how this is -//! mapped to memory in fact. Each new instance _does_ get associated with a -//! slot number (see uses of `index` and [`SlotId`] in this module) but the -//! parts of the instances are stored in separate pools: memories in the -//! [`MemoryPool`], tables in the [`TablePool`], etc. What ties these various -//! parts together is the slot number generated by an [`IndexAllocator`] . -//! -//! The [`MemoryPool`] protects Wasmtime from out-of-bounds memory accesses by -//! inserting inaccessible guard regions between memory slots. The -//! [`MemoryPool`] documentation has a more in-depth chart but one can think of -//! memories being laid out like the following: -//! -//! ```text -//! ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ -//! │Guard│Mem 0│Guard│Mem 1│Guard│Mem 2│.....│Guard│ -//! └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ -//! ``` -//! -//! To complicate matters, each instance can have multiple memories, multiple -//! tables, etc. You might think these would be stored consecutively in their -//! respective pools (for instance `n`, table 0 is at table pool slot `n + 0` -//! and table 1 is at `n + 1`), but for memories this is not the case. With -//! protection keys enabled, memories do not need interleaved guard regions -//! because the protection key will signal a fault if the wrong memory is -//! accessed. Instead, the pooling allocator "stripes" the memories with -//! different protection keys. -//! -//! This concept, dubbed [ColorGuard] in the original paper, relies on careful -//! calculation of the memory sizes to prevent any "overlapping access": there -//! are limited protection keys available (15) so the next memory using the same -//! key must be at least as far away as the guard region we would insert -//! otherwise. This ends up looking like the following, where a store for -//! instance 0 (`I0`) "stripes" two memories (`M0` and `M1`) with the same -//! protection key 1 and far enough apart to signal an OOB access: -//! -//! ```text -//! ┌─────┬─────┬─────┬─────┬────────────────┬─────┬─────┬─────┐ -//! │.....│I0:M1│.....│.....│..│I0:M2│.....│.....│ -//! ├─────┼─────┼─────┼─────┼────────────────┼─────┼─────┼─────┤ -//! │.....│key 1│key 2│key 3│.....│key 1│key 2│.....│ -//! └─────┴─────┴─────┴─────┴────────────────┴─────┴─────┴─────┘ -//! ``` -//! -//! [ColorGuard]: https://plas2022.github.io/files/pdf/SegueColorGuard.pdf +//! Each slot has a "slot ID"--an index into the pool. Slot IDs are handed out +//! by the [`index_allocator`] module. Note that each kind of pool-allocated +//! item is stored in its own separate pool: [`memory_pool`], [`table_pool`], +//! [`stack_pool`]. See those modules for more details. mod index_allocator; mod memory_pool; @@ -65,16 +25,6 @@ mod table_pool; #[cfg(all(feature = "async", unix, not(miri)))] mod stack_pool; -cfg_if::cfg_if! { - if #[cfg(windows)] { - mod windows; - use windows as imp; - } else { - mod unix; - use unix as imp; - } -} - use super::{ InstanceAllocationRequest, InstanceAllocatorImpl, MemoryAllocationIndex, TableAllocationIndex, }; @@ -629,7 +579,7 @@ mod test { &config, &Tunables { static_memory_bound: 1, - ..Tunables::default() + ..Tunables::default_host() }, ) .map_err(|e| e.to_string()) @@ -653,7 +603,7 @@ mod test { async_stack_zeroing: true, ..PoolingInstanceAllocatorConfig::default() }; - let allocator = PoolingInstanceAllocator::new(&config, &Tunables::default())?; + let allocator = PoolingInstanceAllocator::new(&config, &Tunables::default_host())?; unsafe { for _ in 0..255 { @@ -687,7 +637,7 @@ mod test { async_stack_zeroing: false, ..PoolingInstanceAllocatorConfig::default() }; - let allocator = PoolingInstanceAllocator::new(&config, &Tunables::default())?; + let allocator = PoolingInstanceAllocator::new(&config, &Tunables::default_host())?; unsafe { for i in 0..255 { diff --git a/crates/runtime/src/instance/allocator/pooling/memory_pool.rs b/crates/runtime/src/instance/allocator/pooling/memory_pool.rs index 2b25a6d076ae..414ecb7978cf 100644 --- a/crates/runtime/src/instance/allocator/pooling/memory_pool.rs +++ b/crates/runtime/src/instance/allocator/pooling/memory_pool.rs @@ -1,11 +1,9 @@ //! Implements a memory pool using a single allocated memory slab. //! -//! The pooling instance allocator maps memory in advance and allocates -//! instances, memories, tables, and stacks from a pool of available resources. -//! Using the pooling instance allocator can speed up module instantiation when -//! modules can be constrained based on configurable limits -//! ([`InstanceLimits`]). Each new instance is stored in a "slot"; as instances -//! are allocated and freed, these slots are either filled or emptied: +//! The pooling instance allocator maps one large slab of memory in advance and +//! allocates WebAssembly memories from this slab--a [`MemoryPool`]. Each +//! WebAssembly memory is allocated in its own slot (see uses of `index` and +//! [`SlotId`] in this module): //! //! ```text //! ┌──────┬──────┬──────┬──────┬──────┐ @@ -13,17 +11,12 @@ //! └──────┴──────┴──────┴──────┴──────┘ //! ``` //! -//! Note that these slots are a useful abstraction but not exactly how this is -//! mapped to memory in fact. Each new instance _does_ get associated with a -//! slot number (see uses of `index` and [`SlotId`] in this module) but the -//! parts of the instances are stored in separate pools: memories in the -//! [`MemoryPool`], tables in the [`TablePool`], etc. What ties these various -//! parts together is the slot number generated by an [`IndexAllocator`] . -//! -//! The [`MemoryPool`] protects Wasmtime from out-of-bounds memory accesses by -//! inserting inaccessible guard regions between memory slots. The -//! [`MemoryPool`] documentation has a more in-depth chart but one can think of -//! memories being laid out like the following: +//! Diving deeper, we note that a [`MemoryPool`] protects Wasmtime from +//! out-of-bounds memory accesses by inserting inaccessible guard regions +//! between memory slots. These guard regions are configured to raise a signal +//! if they are accessed--a WebAssembly out-of-bounds (OOB) memory access. The +//! [`MemoryPool`] documentation has a more detailed chart but one can think of +//! memory slots being laid out like the following: //! //! ```text //! ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐ @@ -31,22 +24,21 @@ //! └─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘ //! ``` //! -//! To complicate matters, each instance can have multiple memories, multiple -//! tables, etc. You might think these would be stored consecutively in their -//! respective pools (for instance `n`, table 0 is at table pool slot `n + 0` -//! and table 1 is at `n + 1`), but for memories this is not the case. With -//! protection keys enabled, memories do not need interleaved guard regions -//! because the protection key will signal a fault if the wrong memory is -//! accessed. Instead, the pooling allocator "stripes" the memories with -//! different protection keys. +//! But we can be more efficient about guard regions: with memory protection +//! keys (MPK) enabled, the interleaved guard regions can be smaller. If we +//! surround a memory with memories from other instances and each instance is +//! protected by different protection keys, the guard region can be smaller AND +//! the pool will still raise a signal on an OOB access. This complicates how we +//! lay out memory slots: we must store memories from the same instance in the +//! same "stripe". Each stripe is protected by a different protection key. //! //! This concept, dubbed [ColorGuard] in the original paper, relies on careful -//! calculation of the memory sizes to prevent any "overlapping access": there -//! are limited protection keys available (15) so the next memory using the same -//! key must be at least as far away as the guard region we would insert -//! otherwise. This ends up looking like the following, where a store for -//! instance 0 (`I0`) "stripes" two memories (`M0` and `M1`) with the same -//! protection key 1 and far enough apart to signal an OOB access: +//! calculation of the memory sizes to prevent any "overlapping access" (see +//! [`calculate`]): there are limited protection keys available (15) so the next +//! memory using the same key must be at least as far away as the guard region +//! we would insert otherwise. This ends up looking like the following, where a +//! store for instance 0 (`I0`) "stripes" two memories (`M0` and `M1`) with the +//! same protection key 1 and far enough apart to signal an OOB access: //! //! ```text //! ┌─────┬─────┬─────┬─────┬────────────────┬─────┬─────┬─────┐ @@ -68,7 +60,7 @@ use crate::{ MpkEnabled, PoolingInstanceAllocatorConfig, }; use anyhow::{anyhow, bail, Context, Result}; -use libc::c_void; +use std::ffi::c_void; use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::Mutex; use wasmtime_environ::{ @@ -92,21 +84,21 @@ struct Stripe { /// Represents a pool of WebAssembly linear memories. /// -/// A linear memory is divided into accessible pages and guard pages. -/// -/// A diagram for this struct's fields is: +/// A linear memory is divided into accessible pages and guard pages. A memory +/// pool contains linear memories: each memory occupies a slot in an +/// allocated slab (i.e., `mapping`): /// /// ```text /// layout.max_memory_bytes layout.slot_bytes /// | | -/// <-----+----> <-----------+-----------> -/// +-----------+------------+-----------+ +--------+---+-----------+-----------+ -/// | PROT_NONE | | PROT_NONE | ... | | PROT_NONE | PROT_NONE | -/// +-----------+------------+-----------+ +--------+---+-----------+-----------+ -/// | |<------------------+----------------------------------> <----+----> -/// \ | \ | -/// mapping | `layout.num_slots` memories layout.post_slab_guard_size -/// / +/// ◄─────┴────► ◄───────────┴──────────► +/// ┌───────────┬────────────┬───────────┐ ┌───────────┬───────────┬───────────┐ +/// | PROT_NONE | | PROT_NONE | ... | | PROT_NONE | PROT_NONE | +/// └───────────┴────────────┴───────────┘ └───────────┴───────────┴───────────┘ +/// | |◄──────────────────┬─────────────────────────────────► ◄────┬────► +/// | | | | +/// mapping | `layout.num_slots` memories layout.post_slab_guard_size +/// | /// layout.pre_slab_guard_size /// ``` #[derive(Debug)] @@ -189,7 +181,10 @@ impl MemoryPool { // region to start--`PROT_NONE`. let constraints = SlabConstraints::new(&config.limits, tunables, pkeys.len())?; let layout = calculate(&constraints)?; - log::debug!("creating memory pool: {constraints:?} -> {layout:?}"); + log::debug!( + "creating memory pool: {constraints:?} -> {layout:?} (total: {})", + layout.total_slab_bytes()? + ); let mut mapping = Mmap::accessible_reserved(0, layout.total_slab_bytes()?) .context("failed to create memory pool mapping")?; @@ -275,7 +270,7 @@ impl MemoryPool { { match plan.style { MemoryStyle::Static { bound } => { - if u64::try_from(self.layout.pages_to_next_stripe_slot()).unwrap() < bound { + if self.layout.pages_to_next_stripe_slot() < bound { bail!( "memory size allocated per-memory is too small to \ satisfy static bound of {bound:#x} pages" @@ -341,9 +336,7 @@ impl MemoryPool { // but double-check here to be sure. match memory_plan.style { MemoryStyle::Static { bound } => { - let pages_to_next_stripe_slot = - u64::try_from(self.layout.pages_to_next_stripe_slot()).unwrap(); - assert!(bound <= pages_to_next_stripe_slot); + assert!(bound <= self.layout.pages_to_next_stripe_slot()); } MemoryStyle::Dynamic { .. } => {} } @@ -375,7 +368,7 @@ impl MemoryPool { base_ptr, base_capacity, slot, - self.layout.slot_bytes, + self.layout.bytes_to_next_stripe_slot(), unsafe { &mut *request.store.get().unwrap() }, ) })() { @@ -595,17 +588,16 @@ struct SlabLayout { /// guard region after the memory to catch OOB access. On these guard /// regions, note that: /// - users can configure how aggressively (or not) to elide bounds checks - /// via `Config::static_memory_guard_size` + /// via `Config::static_memory_guard_size` (see also: + /// `memory_and_guard_size`) /// - memory protection keys can compress the size of the guard region by /// placing slots from a different key (i.e., a stripe) in the guard /// region; this means the slot itself can be smaller and we can allocate /// more of them. slot_bytes: usize, - // The maximum size that can become accessible, in bytes, for each linear - // memory. Guaranteed to be a whole number of wasm pages. + /// The maximum size that can become accessible, in bytes, for each linear + /// memory. Guaranteed to be a whole number of Wasm pages. max_memory_bytes: usize, - /// The total number of bytes to allocate for the memory pool slab. - // total_slab_bytes: usize, /// If necessary, the number of bytes to reserve as a guard region at the /// beginning of the slab. pre_slab_guard_bytes: usize, @@ -632,7 +624,7 @@ impl SlabLayout { .ok_or_else(|| anyhow!("total size of memory reservation exceeds addressable memory")) } - /// Returns the number of Wasm pages from the beginning of one slot to the + /// Returns the number of Wasm bytes from the beginning of one slot to the /// next slot in the same stripe--this is the striped equivalent of /// `static_memory_bound`. Recall that between slots of the same stripe we /// will see a slot from every other stripe. @@ -641,13 +633,20 @@ impl SlabLayout { /// from the beginning of slot 1 to slot 4, which are of the same stripe: /// /// ```text + /// ◄────────────────────► /// ┌────────┬──────┬──────┬────────┬───┐ /// │*slot 1*│slot 2│slot 3│*slot 4*│...| /// └────────┴──────┴──────┴────────┴───┘ /// ``` - fn pages_to_next_stripe_slot(&self) -> usize { - let slot_pages = self.slot_bytes / WASM_PAGE_SIZE as usize; - slot_pages * self.num_stripes + fn bytes_to_next_stripe_slot(&self) -> usize { + self.slot_bytes * self.num_stripes + } + + /// Same as `bytes_to_next_stripe_slot` but in Wasm pages. + fn pages_to_next_stripe_slot(&self) -> u64 { + let bytes = self.bytes_to_next_stripe_slot(); + let pages = bytes / WASM_PAGE_SIZE as usize; + u64::try_from(pages).unwrap() } } @@ -671,21 +670,20 @@ fn calculate(constraints: &SlabConstraints) -> Result { // To calculate the slot size, we start with the default configured size and // attempt to chip away at this via MPK protection. Note here how we begin // to define a slot as "all of the memory and guard region." - let slot_bytes = expected_slot_bytes + let faulting_region_bytes = expected_slot_bytes .max(max_memory_bytes) - .checked_add(guard_bytes) - .unwrap_or(usize::MAX); + .saturating_add(guard_bytes); let (num_stripes, slot_bytes) = if guard_bytes == 0 || max_memory_bytes == 0 || num_slots == 0 { // In the uncommon case where the memory/guard regions are empty or we don't need any slots , we // will not need any stripes: we just lay out the slots back-to-back // using a single stripe. - (1, slot_bytes) + (1, faulting_region_bytes) } else if num_pkeys_available < 2 { // If we do not have enough protection keys to stripe the memory, we do // the same. We can't elide any of the guard bytes because we aren't // overlapping guard regions with other stripes... - (1, slot_bytes) + (1, faulting_region_bytes) } else { // ...but if we can create at least two stripes, we can use another // stripe (i.e., a different pkey) as this slot's guard region--this @@ -702,21 +700,22 @@ fn calculate(constraints: &SlabConstraints) -> Result { // pool is configured with only three slots (`num_memory_slots = // 3`), we will run into failures if we attempt to set up more than // three stripes. - let needed_num_stripes = - slot_bytes / max_memory_bytes + usize::from(slot_bytes % max_memory_bytes != 0) + 1; + let needed_num_stripes = faulting_region_bytes / max_memory_bytes + + usize::from(faulting_region_bytes % max_memory_bytes != 0); + assert!(needed_num_stripes > 0); let num_stripes = num_pkeys_available.min(needed_num_stripes).min(num_slots); - // Next, we try to reduce the slot size by "overlapping" the - // stripes: we can make slot `n` smaller since we know that slot - // `n+1` and following are in different stripes and will look just - // like `PROT_NONE` memory. - let next_slots_overlapping_bytes = max_memory_bytes - .checked_mul(num_stripes - 1) - .unwrap_or(usize::MAX); - let needed_slot_bytes = slot_bytes - .checked_sub(next_slots_overlapping_bytes) - .unwrap_or(0) + // Next, we try to reduce the slot size by "overlapping" the stripes: we + // can make slot `n` smaller since we know that slot `n+1` and following + // are in different stripes and will look just like `PROT_NONE` memory. + // Recall that codegen expects a guarantee that at least + // `faulting_region_bytes` will catch OOB accesses via segfaults. + let needed_slot_bytes = faulting_region_bytes + .checked_div(num_stripes) + .unwrap_or(faulting_region_bytes) .max(max_memory_bytes); + assert!(needed_slot_bytes >= max_memory_bytes); + (num_stripes, needed_slot_bytes) }; @@ -728,13 +727,11 @@ fn calculate(constraints: &SlabConstraints) -> Result { .ok_or_else(|| anyhow!("slot size is too large"))?; // We may need another guard region (like `pre_slab_guard_bytes`) at the end - // of our slab. We could be conservative and just create it as large as - // `guard_bytes`, but because we know that the last slot already has - // `guard_bytes` factored in to its guard region, we can reduce the final - // guard region by that much. - let post_slab_guard_bytes = guard_bytes - .checked_sub(slot_bytes - max_memory_bytes) - .unwrap_or(0); + // of our slab to maintain our `faulting_region_bytes` guarantee. We could + // be conservative and just create it as large as `faulting_region_bytes`, + // but because we know that the last slot's `slot_bytes` make up the first + // part of that region, we reduce the final guard region by that much. + let post_slab_guard_bytes = faulting_region_bytes.saturating_sub(slot_bytes); // Check that we haven't exceeded the slab we can calculate given the limits // of `usize`. @@ -777,7 +774,7 @@ mod tests { &Tunables { static_memory_bound: 1, static_memory_offset_guard_size: 0, - ..Tunables::default() + ..Tunables::default_host() }, )?; @@ -811,7 +808,7 @@ mod tests { &Tunables { static_memory_bound: 1, static_memory_offset_guard_size: 0, - ..Tunables::default() + ..Tunables::default_host() }, ) .unwrap(); @@ -831,7 +828,7 @@ mod tests { memory_protection_keys: MpkEnabled::Enable, ..PoolingInstanceAllocatorConfig::default() }; - let pool = MemoryPool::new(&config, &Tunables::default()).unwrap(); + let pool = MemoryPool::new(&config, &Tunables::default_host()).unwrap(); assert!(pool.stripes.len() >= 2); let max_memory_slots = config.limits.total_memories; @@ -979,13 +976,14 @@ mod tests { // Check that the memory-striping will not allow OOB access. // - we may have reduced the slot size from `expected_slot_bytes` to - // `slot_bytes` assuming MPK striping; we check that the expectation - // still holds + // `slot_bytes` assuming MPK striping; we check that our guaranteed + // "faulting region" is respected // - the last slot won't have MPK striping after it; we check that the // `post_slab_guard_bytes` accounts for this assert!( - s.slot_bytes * s.num_stripes >= c.expected_slot_bytes + c.guard_bytes, - "slot may allow OOB access: {c:?} => {s:?}" + s.bytes_to_next_stripe_slot() + >= c.expected_slot_bytes.max(c.max_memory_bytes) + c.guard_bytes, + "faulting region not large enough: {c:?} => {s:?}" ); assert!( s.slot_bytes + s.post_slab_guard_bytes >= c.expected_slot_bytes, diff --git a/crates/runtime/src/instance/allocator/pooling/stack_pool.rs b/crates/runtime/src/instance/allocator/pooling/stack_pool.rs index edb169f348da..eb1581d5f669 100644 --- a/crates/runtime/src/instance/allocator/pooling/stack_pool.rs +++ b/crates/runtime/src/instance/allocator/pooling/stack_pool.rs @@ -1,8 +1,8 @@ use super::{ - imp::{commit_stack_pages, reset_stack_pages_to_zero}, index_allocator::{SimpleIndexAllocator, SlotId}, round_up_to_pow2, }; +use crate::sys::vm::{commit_stack_pages, reset_stack_pages_to_zero}; use crate::{Mmap, PoolingInstanceAllocatorConfig}; use anyhow::{anyhow, bail, Context, Result}; @@ -166,10 +166,10 @@ impl StackPool { 0, size_to_memset, ); - } - // Use the system to reset remaining stack pages to zero. - reset_stack_pages_to_zero(bottom as _, size - size_to_memset).unwrap(); + // Use the system to reset remaining stack pages to zero. + reset_stack_pages_to_zero(bottom as _, size - size_to_memset).unwrap(); + } } } diff --git a/crates/runtime/src/instance/allocator/pooling/table_pool.rs b/crates/runtime/src/instance/allocator/pooling/table_pool.rs index 558cb548e966..45ce3c3b965f 100644 --- a/crates/runtime/src/instance/allocator/pooling/table_pool.rs +++ b/crates/runtime/src/instance/allocator/pooling/table_pool.rs @@ -1,8 +1,8 @@ use super::{ - imp::{commit_table_pages, decommit_table_pages}, index_allocator::{SimpleIndexAllocator, SlotId}, round_up_to_pow2, TableAllocationIndex, }; +use crate::sys::vm::{commit_table_pages, decommit_table_pages}; use crate::{InstanceAllocationRequest, Mmap, PoolingInstanceAllocatorConfig, SendSyncPtr, Table}; use anyhow::{anyhow, bail, Context, Result}; use std::mem; @@ -129,10 +129,12 @@ impl TablePool { match (|| { let base = self.get(allocation_index); - commit_table_pages( - base as *mut u8, - self.table_elements * mem::size_of::<*mut u8>(), - )?; + unsafe { + commit_table_pages( + base as *mut u8, + self.table_elements * mem::size_of::<*mut u8>(), + )?; + } let ptr = NonNull::new(std::ptr::slice_from_raw_parts_mut( base.cast(), diff --git a/crates/runtime/src/instance/allocator/pooling/unix.rs b/crates/runtime/src/instance/allocator/pooling/unix.rs deleted file mode 100644 index 00259f4b0afd..000000000000 --- a/crates/runtime/src/instance/allocator/pooling/unix.rs +++ /dev/null @@ -1,56 +0,0 @@ -use anyhow::Result; - -fn decommit(addr: *mut u8, len: usize) -> Result<()> { - if len == 0 { - return Ok(()); - } - - unsafe { - cfg_if::cfg_if! { - if #[cfg(miri)] { - std::ptr::write_bytes(addr, 0, len); - } else if #[cfg(target_os = "linux")] { - use rustix::mm::{madvise, Advice}; - - // On Linux, this is enough to cause the kernel to initialize - // the pages to 0 on next access - madvise(addr as _, len, Advice::LinuxDontNeed)?; - } else { - use rustix::mm::{mmap_anonymous, ProtFlags, MapFlags}; - - // By creating a new mapping at the same location, this will - // discard the mapping for the pages in the given range. - // The new mapping will be to the CoW zero page, so this - // effectively zeroes the pages. - mmap_anonymous( - addr as _, - len, - ProtFlags::READ | ProtFlags::WRITE, - MapFlags::PRIVATE | MapFlags::FIXED, - )?; - } - } - } - - Ok(()) -} - -pub fn commit_table_pages(_addr: *mut u8, _len: usize) -> Result<()> { - // A no-op as table pages remain READ|WRITE - Ok(()) -} - -pub fn decommit_table_pages(addr: *mut u8, len: usize) -> Result<()> { - decommit(addr, len) -} - -#[cfg(all(feature = "async", not(miri)))] -pub fn commit_stack_pages(_addr: *mut u8, _len: usize) -> Result<()> { - // A no-op as stack pages remain READ|WRITE - Ok(()) -} - -#[cfg(all(feature = "async", not(miri)))] -pub fn reset_stack_pages_to_zero(addr: *mut u8, len: usize) -> Result<()> { - decommit(addr, len) -} diff --git a/crates/runtime/src/instance/allocator/pooling/windows.rs b/crates/runtime/src/instance/allocator/pooling/windows.rs deleted file mode 100644 index 5e9d0c51e414..000000000000 --- a/crates/runtime/src/instance/allocator/pooling/windows.rs +++ /dev/null @@ -1,38 +0,0 @@ -use anyhow::{bail, Result}; -use windows_sys::Win32::System::Memory::*; - -pub fn commit(addr: *mut u8, len: usize) -> Result<()> { - if len == 0 { - return Ok(()); - } - - // Memory needs to be committed, so don't use the `region` crate - if unsafe { VirtualAlloc(addr as _, len, MEM_COMMIT, PAGE_READWRITE).is_null() } { - bail!("failed to commit memory as read/write"); - } - - Ok(()) -} - -pub fn decommit(addr: *mut u8, len: usize) -> Result<()> { - if len == 0 { - return Ok(()); - } - - if unsafe { VirtualFree(addr as _, len, MEM_DECOMMIT) } == 0 { - bail!( - "failed to decommit memory pages: {}", - std::io::Error::last_os_error() - ); - } - - Ok(()) -} - -pub fn commit_table_pages(addr: *mut u8, len: usize) -> Result<()> { - commit(addr, len) -} - -pub fn decommit_table_pages(addr: *mut u8, len: usize) -> Result<()> { - decommit(addr, len) -} diff --git a/crates/runtime/src/lib.rs b/crates/runtime/src/lib.rs index ebf3fe37cb79..46ec141ff7ed 100644 --- a/crates/runtime/src/lib.rs +++ b/crates/runtime/src/lib.rs @@ -1,7 +1,7 @@ //! Runtime library support for Wasmtime. -#![deny(missing_docs, trivial_numeric_casts, unused_extern_crates)] -#![warn(unused_import_braces)] +#![deny(missing_docs)] +#![warn(clippy::cast_sign_loss)] use anyhow::{Error, Result}; use std::fmt; @@ -10,9 +10,7 @@ use std::sync::atomic::{AtomicU64, AtomicUsize, Ordering}; use std::sync::Arc; use wasmtime_environ::{DefinedFuncIndex, DefinedMemoryIndex, HostPtr, VMOffsets}; -#[macro_use] -mod trampolines; - +mod arch; #[cfg(feature = "component-model")] pub mod component; mod export; @@ -25,6 +23,7 @@ mod mmap_vec; mod parking_spot; mod send_sync_ptr; mod store_box; +mod sys; mod table; mod traphandlers; mod vmcontext; @@ -34,8 +33,10 @@ pub mod debug_builtins; pub mod libcalls; pub mod mpk; +#[cfg(feature = "debug-builtins")] pub use wasmtime_jit_debug::gdb_jit_int::GdbJitImageRegistration; +pub use crate::arch::{get_stack_pointer, V128Abi}; pub use crate::export::*; pub use crate::externref::*; pub use crate::imports::Imports; @@ -54,13 +55,14 @@ pub use crate::mmap::Mmap; pub use crate::mmap_vec::MmapVec; pub use crate::mpk::MpkEnabled; pub use crate::store_box::*; +pub use crate::sys::unwind::UnwindRegistration; pub use crate::table::{Table, TableElement}; pub use crate::traphandlers::*; pub use crate::vmcontext::{ VMArrayCallFunction, VMArrayCallHostFuncContext, VMContext, VMFuncRef, VMFunctionBody, VMFunctionImport, VMGlobalDefinition, VMGlobalImport, VMInvokeArgument, VMMemoryDefinition, VMMemoryImport, VMNativeCallFunction, VMNativeCallHostFuncContext, VMOpaqueContext, - VMRuntimeLimits, VMSharedSignatureIndex, VMTableDefinition, VMTableImport, VMWasmCallFunction, + VMRuntimeLimits, VMSharedTypeIndex, VMTableDefinition, VMTableImport, VMWasmCallFunction, ValRaw, }; pub use send_sync_ptr::SendSyncPtr; @@ -189,7 +191,7 @@ pub trait ModuleRuntimeInfo: Send + Sync + 'static { /// call a native function of the given signature. fn wasm_to_native_trampoline( &self, - signature: VMSharedSignatureIndex, + signature: VMSharedTypeIndex, ) -> Option>; /// Returns the `MemoryImage` structure used for copy-on-write @@ -207,7 +209,7 @@ pub trait ModuleRuntimeInfo: Send + Sync + 'static { /// Returns an array, indexed by `SignatureIndex` of all /// `VMSharedSignatureIndex` entries corresponding to the `SignatureIndex`. - fn signature_ids(&self) -> &[VMSharedSignatureIndex]; + fn type_ids(&self) -> &[VMSharedTypeIndex]; /// Offset information for the current host. fn offsets(&self) -> &VMOffsets; @@ -219,30 +221,13 @@ pub fn page_size() -> usize { return match PAGE_SIZE.load(Ordering::Relaxed) { 0 => { - let size = get_page_size(); + let size = sys::vm::get_page_size(); assert!(size != 0); PAGE_SIZE.store(size, Ordering::Relaxed); size } n => n, }; - - #[cfg(windows)] - fn get_page_size() -> usize { - use std::mem::MaybeUninit; - use windows_sys::Win32::System::SystemInformation::*; - - unsafe { - let mut info = MaybeUninit::uninit(); - GetSystemInfo(info.as_mut_ptr()); - info.assume_init_ref().dwPageSize as usize - } - } - - #[cfg(unix)] - fn get_page_size() -> usize { - unsafe { libc::sysconf(libc::_SC_PAGESIZE) as usize } - } } /// Result of [`Memory::atomic_wait32`] and [`Memory::atomic_wait64`] diff --git a/crates/runtime/src/libcalls.rs b/crates/runtime/src/libcalls.rs index f4c35e1bc59f..539a1b3f5f31 100644 --- a/crates/runtime/src/libcalls.rs +++ b/crates/runtime/src/libcalls.rs @@ -66,7 +66,7 @@ use std::mem; use std::ptr::{self, NonNull}; use std::time::{Duration, Instant}; use wasmtime_environ::{ - DataIndex, ElemIndex, FuncIndex, GlobalIndex, MemoryIndex, TableIndex, Trap, + DataIndex, ElemIndex, FuncIndex, GlobalIndex, MemoryIndex, TableIndex, Trap, Unsigned, }; #[cfg(feature = "wmemcheck")] use wasmtime_wmemcheck::AccessError::{ @@ -80,6 +80,7 @@ use wasmtime_wmemcheck::AccessError::{ /// now to ensure that the fp/sp on exit are recorded for backtraces to work /// properly. pub mod trampolines { + use crate::arch::wasm_to_libcall_trampoline; use crate::{Instance, TrapReason, VMContext}; macro_rules! libcall { @@ -233,7 +234,7 @@ unsafe fn table_grow( }; Ok(match instance.table_grow(table_index, delta, element)? { Some(r) => r, - None => -1_i32 as u32, + None => (-1_i32).unsigned(), }) } diff --git a/crates/runtime/src/memory.rs b/crates/runtime/src/memory.rs index ecdeda3f1897..26b518e31f23 100644 --- a/crates/runtime/src/memory.rs +++ b/crates/runtime/src/memory.rs @@ -3,11 +3,12 @@ //! `RuntimeLinearMemory` is to WebAssembly linear memories what `Table` is to WebAssembly tables. use crate::mmap::Mmap; -use crate::parking_spot::ParkingSpot; +use crate::parking_spot::{ParkingSpot, Waiter}; use crate::vmcontext::VMMemoryDefinition; use crate::{MemoryImage, MemoryImageSlot, SendSyncPtr, Store, WaitResult}; use anyhow::Error; use anyhow::{bail, format_err, Result}; +use std::cell::RefCell; use std::convert::TryFrom; use std::ops::Range; use std::ptr::NonNull; @@ -564,9 +565,10 @@ impl SharedMemory { /// Implementation of `memory.atomic.notify` for this shared memory. pub fn atomic_notify(&self, addr_index: u64, count: u32) -> Result { - validate_atomic_addr(&self.0.def.0, addr_index, 4, 4)?; + let ptr = validate_atomic_addr(&self.0.def.0, addr_index, 4, 4)?; log::trace!("memory.atomic.notify(addr={addr_index:#x}, count={count})"); - Ok(self.0.spot.unpark(addr_index, count)) + let ptr = unsafe { &*ptr }; + Ok(self.0.spot.notify(ptr, count)) } /// Implementation of `memory.atomic.wait32` for this shared memory. @@ -586,12 +588,10 @@ impl SharedMemory { assert!(std::mem::align_of::() <= 4); let atomic = unsafe { &*(addr as *const AtomicU32) }; - // We want the sequential consistency of `SeqCst` to ensure that the - // `load` sees the value that the `notify` will/would see. All WASM - // atomic operations are also `SeqCst`. - let validate = || atomic.load(Ordering::SeqCst) == expected; - - Ok(self.0.spot.park(addr_index, validate, timeout)) + WAITER.with(|waiter| { + let mut waiter = waiter.borrow_mut(); + Ok(self.0.spot.wait32(atomic, expected, timeout, &mut waiter)) + }) } /// Implementation of `memory.atomic.wait64` for this shared memory. @@ -611,14 +611,19 @@ impl SharedMemory { assert!(std::mem::align_of::() <= 8); let atomic = unsafe { &*(addr as *const AtomicU64) }; - // We want the sequential consistency of `SeqCst` to ensure that the `load` sees the value that the `notify` will/would see. - // All WASM atomic operations are also `SeqCst`. - let validate = || atomic.load(Ordering::SeqCst) == expected; - - Ok(self.0.spot.park(addr_index, validate, timeout)) + WAITER.with(|waiter| { + let mut waiter = waiter.borrow_mut(); + Ok(self.0.spot.wait64(atomic, expected, timeout, &mut waiter)) + }) } } +thread_local! { + /// Structure used in conjunction with `ParkingSpot` to block the current + /// thread if necessary. Note that this is lazily initialized. + static WAITER: RefCell = const { RefCell::new(Waiter::new()) }; +} + /// Shared memory needs some representation of a `VMMemoryDefinition` for /// JIT-generated code to access. This structure owns the base pointer and /// length to the actual memory and we share this definition across threads by: diff --git a/crates/runtime/src/mmap.rs b/crates/runtime/src/mmap.rs index 341cd4deea36..4275cd68f833 100644 --- a/crates/runtime/src/mmap.rs +++ b/crates/runtime/src/mmap.rs @@ -1,30 +1,18 @@ //! Low-level abstraction for allocating and managing zero-filled pages //! of memory. +use crate::sys::mmap; use anyhow::{Context, Result}; use std::fs::File; use std::ops::Range; use std::path::Path; use std::sync::Arc; -cfg_if::cfg_if! { - if #[cfg(windows)] { - mod windows; - use windows as sys; - } else if #[cfg(miri)] { - mod miri; - use miri as sys; - } else { - mod unix; - use unix as sys; - } -} - /// A simple struct consisting of a page-aligned pointer to page-aligned /// and initially-zeroed memory and a length. #[derive(Debug)] pub struct Mmap { - sys: sys::Mmap, + sys: mmap::Mmap, file: Option>, } @@ -47,7 +35,7 @@ impl Mmap { /// The memory mapping and the length of the file within the mapping are /// returned. pub fn from_file(path: &Path) -> Result { - let (sys, file) = sys::Mmap::from_file(path)?; + let (sys, file) = mmap::Mmap::from_file(path)?; Ok(Mmap { sys, file: Some(Arc::new(file)), @@ -70,18 +58,18 @@ impl Mmap { if mapping_size == 0 { Ok(Mmap { - sys: sys::Mmap::new_empty(), + sys: mmap::Mmap::new_empty(), file: None, }) } else if accessible_size == mapping_size { Ok(Mmap { - sys: sys::Mmap::new(mapping_size) + sys: mmap::Mmap::new(mapping_size) .context(format!("mmap failed to allocate {mapping_size:#x} bytes"))?, file: None, }) } else { let mut result = Mmap { - sys: sys::Mmap::reserve(mapping_size) + sys: mmap::Mmap::reserve(mapping_size) .context(format!("mmap failed to reserve {mapping_size:#x} bytes"))?, file: None, }; diff --git a/crates/runtime/src/mpk/enabled.rs b/crates/runtime/src/mpk/enabled.rs index f8a045d3a814..19827532ced0 100644 --- a/crates/runtime/src/mpk/enabled.rs +++ b/crates/runtime/src/mpk/enabled.rs @@ -50,7 +50,11 @@ static KEYS: OnceLock> = OnceLock::new(); /// Any accesses to pages marked by another key will result in a `SIGSEGV` /// fault. pub fn allow(mask: ProtectionMask) { - let previous = pkru::read(); + let previous = if log::log_enabled!(log::Level::Trace) { + pkru::read() + } else { + 0 + }; pkru::write(mask.0); log::trace!("PKRU change: {:#034b} => {:#034b}", previous, pkru::read()); } @@ -152,6 +156,9 @@ mod tests { #[test] fn check_is_supported() { println!("is pku supported = {}", is_supported()); + if std::env::var("WASMTIME_TEST_FORCE_MPK").is_ok() { + assert!(is_supported()); + } } #[test] diff --git a/crates/runtime/src/mpk/pkru.rs b/crates/runtime/src/mpk/pkru.rs index ea9689686ef4..0bb7f63210c7 100644 --- a/crates/runtime/src/mpk/pkru.rs +++ b/crates/runtime/src/mpk/pkru.rs @@ -30,6 +30,7 @@ pub const ALLOW_ACCESS: u32 = 0; pub const DISABLE_ACCESS: u32 = 0b11111111_11111111_11111111_11111111; /// Read the value of the `PKRU` register. +#[inline] pub fn read() -> u32 { // ECX must be 0 to prevent a general protection exception (#GP). let ecx: u32 = 0; @@ -42,6 +43,7 @@ pub fn read() -> u32 { } /// Write a value to the `PKRU` register. +#[inline] pub fn write(pkru: u32) { // Both ECX and EDX must be 0 to prevent a general protection exception // (#GP). @@ -53,12 +55,13 @@ pub fn write(pkru: u32) { } } -/// Check the `ECX.PKU` flag (bit 3) of the `07h` `CPUID` leaf; see the Intel -/// Software Development Manual, vol 3a, section 2.7. This flag is only set on -/// Intel CPUs, so this function also checks the `CPUID` vendor string. +/// Check the `ECX.PKU` flag (bit 3, zero-based) of the `07h` `CPUID` leaf; see +/// the Intel Software Development Manual, vol 3a, section 2.7. This flag is +/// only set on Intel CPUs, so this function also checks the `CPUID` vendor +/// string. pub fn has_cpuid_bit_set() -> bool { let result = unsafe { std::arch::x86_64::__cpuid(0x07) }; - is_intel_cpu() && (result.ecx & 0b100) != 0 + is_intel_cpu() && (result.ecx & 0b1000) != 0 } /// Check the `CPUID` vendor string for `GenuineIntel`; see the Intel Software diff --git a/crates/runtime/src/parking_spot.rs b/crates/runtime/src/parking_spot.rs index e444164f524e..7f916a1f2e8e 100644 --- a/crates/runtime/src/parking_spot.rs +++ b/crates/runtime/src/parking_spot.rs @@ -10,24 +10,19 @@ //! and resuming it. #![deny(missing_docs)] -#![deny(unsafe_code)] -use crate::WaitResult; +use crate::{SendSyncPtr, WaitResult}; use std::collections::BTreeMap; -use std::sync::{Arc, Condvar, Mutex}; -use std::time::Instant; +use std::ptr::NonNull; +use std::sync::atomic::{AtomicU32, AtomicU64, Ordering::SeqCst}; +use std::sync::Mutex; +use std::thread::{self, Thread}; +use std::time::{Duration, Instant}; #[derive(Default, Debug)] struct Spot { - /// The number of threads parked on this spot. - num_parked: u32, - - /// The number of threads that have been unparked but not yet woken up. - /// This is used to avoid spurious wakeups. - to_unpark: u32, - - /// The [`Condvar`] used to notify parked threads. - cvar: Arc, + head: Option>, + tail: Option>, } /// The thread global `ParkingSpot`. @@ -36,167 +31,194 @@ pub struct ParkingSpot { inner: Mutex>, } +#[derive(Default)] +pub struct Waiter { + inner: Option>, +} + +struct WaiterInner { + // NB: this field may be read concurrently, but is only written under the + // lock of a `ParkingSpot`. + thread: Thread, + + // NB: these fields are only modified/read under the lock of a + // `ParkingSpot`. + notified: bool, + next: Option>, + prev: Option>, +} + impl ParkingSpot { - /// Park the current thread until it is unparked or a timeout is reached. + /// Atomically validates if `atomic == expected` and, if so, blocks the + /// current thread. /// - /// The `key` is used to identify the parking spot. If another thread calls - /// `unpark_all` or `unpark` with the same key, the current thread will be unparked. + /// This method will first check to see if `atomic == expected` using a + /// `SeqCst` load ordering. If the values are not equal then the method + /// immediately returns with `WaitResult::Mismatch`. Otherwise the thread + /// will be blocked and can only be woken up with `notify` on the same + /// address. Note that the check-and-block operation is atomic with respect + /// to `notify`. /// - /// The `validate` callback is called before parking. - /// If it returns `false`, the thread is not parked and `WaitResult::Mismatch` is returned. + /// The optional `deadline` specified can indicate a point in time after + /// which this thread will be unblocked. If this thread is not notified and + /// `deadline` is reached then `WaitResult::TimedOut` is returned. If + /// `deadline` is `None` then this thread will block forever waiting for + /// `notify`. /// - /// The `timeout` argument specifies the maximum amount of time the thread will be parked. - pub fn park( + /// The `waiter` argument is metadata used by this structure to block + /// the current thread. + /// + /// This method will not spuriously wake up one blocked. + pub fn wait32( &self, - key: u64, - validate: impl FnOnce() -> bool, - timeout: impl Into>, + atomic: &AtomicU32, + expected: u32, + deadline: impl Into>, + waiter: &mut Waiter, + ) -> WaitResult { + self.wait( + atomic.as_ptr() as u64, + || atomic.load(SeqCst) == expected, + deadline.into(), + waiter, + ) + } + + /// Same as `wait32`, but for 64-bit values. + pub fn wait64( + &self, + atomic: &AtomicU64, + expected: u64, + deadline: impl Into>, + waiter: &mut Waiter, ) -> WaitResult { - self.park_inner(key, validate, timeout.into()) + self.wait( + atomic.as_ptr() as u64, + || atomic.load(SeqCst) == expected, + deadline.into(), + waiter, + ) } - fn park_inner( + fn wait( &self, key: u64, validate: impl FnOnce() -> bool, - timeout: Option, + deadline: Option, + waiter: &mut Waiter, ) -> WaitResult { let mut inner = self .inner .lock() .expect("failed to lock inner parking table"); - // check validation with lock held + // This is the "atomic" part of the `validate` check which ensure that + // the memory location still indicates that we're allowed to block. if !validate() { return WaitResult::Mismatch; } - // clone the condvar, so we can move the lock - let cvar = { - let spot = inner.entry(key).or_insert_with(Spot::default); - spot.num_parked = spot - .num_parked - .checked_add(1) - .expect("parking spot number overflow"); - spot.cvar.clone() - }; + // Lazily initialize the `waiter` node if it hasn't been already, and + // additionally ensure it's not accidentally in some other queue. + let waiter = waiter.inner.get_or_insert_with(|| { + Box::new(WaiterInner { + next: None, + prev: None, + notified: false, + thread: thread::current(), + }) + }); + assert!(waiter.next.is_none()); + assert!(waiter.prev.is_none()); + + // Clear the `notified` flag if it was previously notified and + // configure the thread to wakeup as our own. + waiter.notified = false; + waiter.thread = thread::current(); + + let ptr = SendSyncPtr::new(NonNull::from(&mut **waiter)); + let spot = inner.entry(key).or_insert_with(Spot::default); + unsafe { + // Enqueue our `waiter` in the internal queue for this spot. + spot.push(ptr); + + // Wait for a notification to arrive. This is done through + // `std::thread::park_timeout` by dropping the lock that is held. + // This loop is somewhat similar to a condition variable. + // + // If no timeout was given then the maximum duration is effectively + // infinite (500 billion years), otherwise the timeout is + // calculated relative to the `deadline` specified. + // + // To handle spurious wakeups if the thread wakes up but a + // notification wasn't received then the thread goes back to sleep. + let timed_out = loop { + let timeout = match deadline { + Some(deadline) => { + let now = Instant::now(); + if deadline <= now { + break true; + } else { + deadline - now + } + } + None => Duration::MAX, + }; - loop { - let timed_out = if let Some(timeout) = timeout { - let now = Instant::now(); - if now >= timeout { - true - } else { - let dur = timeout - now; - let (lock, result) = cvar - .wait_timeout(inner, dur) - .expect("failed to wait for condition"); - inner = lock; - result.timed_out() + drop(inner); + thread::park_timeout(timeout); + inner = self.inner.lock().unwrap(); + + if ptr.as_ref().notified { + break false; } - } else { - inner = cvar.wait(inner).expect("failed to wait for condition"); - false }; - let spot = inner.get_mut(&key).expect("failed to get spot"); - if timed_out { - // If waiting on the cvar timed out then due to how system cvars - // are implemented we may need to continue to sleep longer. If - // the deadline has not been reached then turn the crank again - // and go back to sleep. - if Instant::now() < timeout.unwrap() { - continue; - } - - // Opportunistically consume `to_unpark` signals even on - // timeout. From the perspective of `unpark` this "agent" raced - // between its own timeout and receiving the unpark signal, but - // from unpark's perspective it's definitely going to wake up N - // agents as returned from the `unpark` return value. - // - // Note that this may actually prevent other threads from - // getting unparked. For example: - // - // * Thread A parks with a timeout - // * Thread B parks with no timeout - // * Thread C decides to unpark 1 thread - // * Thread A's cvar wakes up due to a timeout, blocks on the - // lock - // * Thread C finishes unpark and signals the cvar once - // * Thread B wakes up - // * Thread A and B contend for the lock and A wins - // * A consumes the "to_unpark" value - // * B goes back to sleep since `to_unpark == 0`, thinking that - // a spurious wakeup happened. - // - // It's believed that this is ok, however, since from C's - // perspective one agent was still woken up and is allowed to - // continue, notably A in this case. C doesn't know that A raced - // with B and "stole" its wakeup signal. - if spot.to_unpark > 0 { - spot.to_unpark -= 1; - } + // If this thread timed out then it is still present in the + // waiter queue, so remove it. + inner.get_mut(&key).unwrap().remove(ptr); + WaitResult::TimedOut } else { - if spot.to_unpark == 0 { - // If no timeout happen but nothing has unparked this spot (as - // signaled through `to_unpark`) then this is indicative of a - // spurious wakeup. In this situation turn the crank again and - // go back to sleep as this interface doesn't allow for spurious - // wakeups. - continue; - } - // No timeout happened, and some other thread registered to - // unpark this thread, so consume one unpark notification. - spot.to_unpark -= 1; - } - - spot.num_parked = spot - .num_parked - .checked_sub(1) - .expect("corrupted parking spot state"); - - if spot.num_parked == 0 { - assert_eq!(spot.to_unpark, 0); - inner - .remove(&key) - .expect("failed to remove spot from inner parking table"); + // If this node was notified then we should not be in a queue + // at this point. + assert!(ptr.as_ref().next.is_none()); + assert!(ptr.as_ref().prev.is_none()); + WaitResult::Ok } - - if timed_out { - return WaitResult::TimedOut; - } - - return WaitResult::Ok; } } - /// Unpark at most `n` threads that are parked with the given key. + /// Notify at most `n` threads that are blocked on the given address. /// /// Returns the number of threads that were actually unparked. - pub fn unpark(&self, key: u64, n: u32) -> u32 { + pub fn notify(&self, addr: &T, n: u32) -> u32 { if n == 0 { return 0; } - let mut num_unpark = 0; - - self.with_lot(key, |spot| { - num_unpark = n.min(spot.num_parked - spot.to_unpark); - spot.to_unpark += num_unpark; - if n >= num_unpark { - spot.cvar.notify_all(); - } else { - for _ in 0..num_unpark { - spot.cvar.notify_one(); + let mut unparked = 0; + + // It's known here that `n > 0` so dequeue items until `unparked` + // equals `n` or the queue runs out. Each thread dequeued is signaled + // that it's been notified and then woken up. + self.with_lot(addr, |spot| unsafe { + while let Some(mut head) = spot.pop() { + let head = head.as_mut(); + assert!(head.next.is_none()); + head.notified = true; + head.thread.unpark(); + unparked += 1; + if unparked == n { + break; } } }); - num_unpark + unparked } - fn with_lot(&self, key: u64, mut f: F) { + fn with_lot(&self, addr: &T, mut f: F) { + let key = addr as *const _ as u64; let mut inner = self .inner .lock() @@ -207,51 +229,127 @@ impl ParkingSpot { } } +impl Waiter { + pub const fn new() -> Waiter { + Waiter { inner: None } + } +} + +impl Spot { + /// Adds `waiter` to the queue at the end. + /// + /// # Unsafety + /// + /// This method is `unsafe` as it can only be invoked under the parking + /// spot's mutex. Additionally `waiter` must be a valid pointer not already + /// in any other queue and additionally only exclusively used by this queue + /// now. + unsafe fn push(&mut self, mut waiter: SendSyncPtr) { + assert!(waiter.as_ref().next.is_none()); + assert!(waiter.as_ref().prev.is_none()); + + waiter.as_mut().prev = self.tail; + match self.tail { + Some(mut tail) => tail.as_mut().next = Some(waiter), + None => self.head = Some(waiter), + } + self.tail = Some(waiter); + } + + /// Removes `waiter` from the queue. + /// + /// # Unsafety + /// + /// This method is `unsafe` as it can only be invoked under the parking + /// spot's mutex. Additionally `waiter` must be a valid pointer in this + /// queue. + unsafe fn remove(&mut self, mut waiter: SendSyncPtr) { + let w = waiter.as_mut(); + match w.prev { + Some(mut prev) => prev.as_mut().next = w.next, + None => self.head = w.next, + } + match w.next { + Some(mut next) => next.as_mut().prev = w.prev, + None => self.tail = w.prev, + } + w.prev = None; + w.next = None; + } + + /// Pops the head of the queue from this linked list to wake up a waiter. + /// + /// # Unsafety + /// + /// This method is `unsafe` as it can only be invoked under the parking + /// spot's mutex. + unsafe fn pop(&mut self) -> Option> { + let ret = self.head?; + self.remove(ret); + Some(ret) + } + + #[cfg(test)] + fn num_parked(&self) -> u32 { + let mut ret = 0; + let mut cur = self.head; + while let Some(next) = cur { + ret += 1; + cur = unsafe { next.as_ref().next }; + } + ret + } +} + #[cfg(test)] mod tests { - use super::ParkingSpot; - use std::ptr::addr_of; + use super::{ParkingSpot, Waiter}; use std::sync::atomic::{AtomicU64, Ordering}; use std::thread; use std::time::{Duration, Instant}; #[test] fn atomic_wait_notify() { - let parking_spot = &ParkingSpot::default(); - let atomic = &AtomicU64::new(0); + let parking_spot = ParkingSpot::default(); + let atomic = AtomicU64::new(0); + + let wait_until_value = |val: u64, waiter: &mut Waiter| loop { + let cur = atomic.load(Ordering::SeqCst); + if cur == val { + break; + } else { + parking_spot.wait64(&atomic, cur, None, waiter); + } + }; thread::scope(|s| { - let atomic_key = addr_of!(atomic) as u64; - let thread1 = s.spawn(move || { + let thread1 = s.spawn(|| { + let mut waiter = Waiter::default(); atomic.store(1, Ordering::SeqCst); - parking_spot.unpark(atomic_key, u32::MAX); - parking_spot.park(atomic_key, || atomic.load(Ordering::SeqCst) == 1, None); + parking_spot.notify(&atomic, u32::MAX); + parking_spot.wait64(&atomic, 1, None, &mut waiter); }); - let thread2 = s.spawn(move || { - while atomic.load(Ordering::SeqCst) != 1 { - parking_spot.park(atomic_key, || atomic.load(Ordering::SeqCst) != 1, None); - } + let thread2 = s.spawn(|| { + let mut waiter = Waiter::default(); + wait_until_value(1, &mut waiter); atomic.store(2, Ordering::SeqCst); - parking_spot.unpark(atomic_key, u32::MAX); - parking_spot.park(atomic_key, || atomic.load(Ordering::SeqCst) == 2, None); + parking_spot.notify(&atomic, u32::MAX); + parking_spot.wait64(&atomic, 2, None, &mut waiter); }); - let thread3 = s.spawn(move || { - while atomic.load(Ordering::SeqCst) != 2 { - parking_spot.park(atomic_key, || atomic.load(Ordering::SeqCst) != 2, None); - } + let thread3 = s.spawn(|| { + let mut waiter = Waiter::default(); + wait_until_value(2, &mut waiter); atomic.store(3, Ordering::SeqCst); - parking_spot.unpark(atomic_key, u32::MAX); - - parking_spot.park(atomic_key, || atomic.load(Ordering::SeqCst) == 3, None); + parking_spot.notify(&atomic, u32::MAX); + parking_spot.wait64(&atomic, 3, None, &mut waiter); }); - while atomic.load(Ordering::SeqCst) != 3 { - parking_spot.park(atomic_key, || atomic.load(Ordering::SeqCst) != 3, None); - } + let mut waiter = Waiter::default(); + wait_until_value(3, &mut waiter); atomic.store(4, Ordering::SeqCst); - parking_spot.unpark(atomic_key, u32::MAX); + parking_spot.notify(&atomic, u32::MAX); thread1.join().unwrap(); thread2.join().unwrap(); @@ -263,7 +361,7 @@ mod tests { // This is a modified version of the parking_lot_core tests, // which are licensed under the MIT and Apache 2.0 licenses. use super::*; - use std::sync::atomic::{AtomicIsize, AtomicU32}; + use std::sync::atomic::AtomicU32; use std::sync::Arc; use std::time::Duration; @@ -367,7 +465,7 @@ mod tests { } struct SingleLatchTest<'a> { - semaphore: AtomicIsize, + semaphore: AtomicU32, num_awake: AtomicU32, /// Total number of threads participating in this test. num_threads: u32, @@ -378,7 +476,7 @@ mod tests { pub fn new(num_threads: u32, spot: &'a ParkingSpot) -> Self { Self { // This implements a fair (FIFO) semaphore, and it starts out unavailable. - semaphore: AtomicIsize::new(0), + semaphore: AtomicU32::new(0), num_awake: AtomicU32::new(0), num_threads, spot, @@ -412,14 +510,14 @@ mod tests { // still be threads that has not yet parked. while num_threads_left > 0 { let mut num_waiting_on_address = 0; - self.spot.with_lot(self.semaphore_addr(), |thread_data| { - num_waiting_on_address = thread_data.num_parked; + self.spot.with_lot(&self.semaphore, |thread_data| { + num_waiting_on_address = thread_data.num_parked(); }); assert!(num_waiting_on_address <= num_threads_left); let num_awake_before_unpark = self.num_awake.load(Ordering::SeqCst); - let num_unparked = self.spot.unpark(self.semaphore_addr(), u32::MAX); + let num_unparked = self.spot.notify(&self.semaphore, u32::MAX); assert!(num_unparked >= num_waiting_on_address); assert!(num_unparked <= num_threads_left); @@ -437,27 +535,36 @@ mod tests { // Make sure no thread is parked on our semaphore address let mut num_waiting_on_address = 0; - self.spot.with_lot(self.semaphore_addr(), |thread_data| { - num_waiting_on_address = thread_data.num_parked; + self.spot.with_lot(&self.semaphore, |thread_data| { + num_waiting_on_address = thread_data.num_parked(); }); assert_eq!(num_waiting_on_address, 0); } pub fn down(&self) { - let old_semaphore_value = self.semaphore.fetch_sub(1, Ordering::SeqCst); + let mut old_semaphore_value = self.semaphore.fetch_sub(1, Ordering::SeqCst); - if old_semaphore_value > 0 { + if (old_semaphore_value as i32) > 0 { // We acquired the semaphore. Done. return; } - // We need to wait. - let validate = || true; - self.spot.park(self.semaphore_addr(), validate, None); + // Force this thread to go to sleep. + let mut waiter = Waiter::new(); + loop { + match self + .spot + .wait32(&self.semaphore, old_semaphore_value, None, &mut waiter) + { + crate::WaitResult::Mismatch => {} + _ => break, + } + old_semaphore_value = self.semaphore.load(Ordering::SeqCst); + } } pub fn up(&self) { - let old_semaphore_value = self.semaphore.fetch_add(1, Ordering::SeqCst); + let old_semaphore_value = self.semaphore.fetch_add(1, Ordering::SeqCst) as i32; // Check if anyone was waiting on the semaphore. If they were, then pass ownership to them. if old_semaphore_value < 0 { @@ -465,7 +572,7 @@ mod tests { // the thread we want to pass ownership to has decremented the semaphore counter, // but not yet parked. loop { - match self.spot.unpark(self.semaphore_addr(), 1) { + match self.spot.notify(&self.semaphore, 1) { 1 => break, 0 => (), i => panic!("Should not wake up {i} threads"), @@ -473,41 +580,36 @@ mod tests { } } } - - fn semaphore_addr(&self) -> u64 { - addr_of!(self.semaphore) as _ - } } } #[test] fn wait_with_timeout() { - let parking_spot = &ParkingSpot::default(); - let atomic = &AtomicU64::new(0); + let parking_spot = ParkingSpot::default(); + let atomic = AtomicU64::new(0); thread::scope(|s| { - let atomic_key = addr_of!(atomic) as u64; - const N: u64 = 5; const M: u64 = if cfg!(miri) { 10 } else { 1000 }; - let thread = s.spawn(move || { - while atomic.load(Ordering::SeqCst) != N * M { + let thread = s.spawn(|| { + let mut waiter = Waiter::new(); + loop { + let cur = atomic.load(Ordering::SeqCst); + if cur == N * M { + break; + } let timeout = Instant::now() + Duration::from_millis(1); - parking_spot.park( - atomic_key, - || atomic.load(Ordering::SeqCst) != N * M, - Some(timeout), - ); + parking_spot.wait64(&atomic, cur, Some(timeout), &mut waiter); } }); let mut threads = vec![thread]; for _ in 0..N { - threads.push(s.spawn(move || { + threads.push(s.spawn(|| { for _ in 0..M { atomic.fetch_add(1, Ordering::SeqCst); - parking_spot.unpark(atomic_key, 1); + parking_spot.notify(&atomic, 1); } })); } diff --git a/crates/runtime/src/mmap/miri.rs b/crates/runtime/src/sys/miri/mmap.rs similarity index 100% rename from crates/runtime/src/mmap/miri.rs rename to crates/runtime/src/sys/miri/mmap.rs diff --git a/crates/runtime/src/sys/miri/mod.rs b/crates/runtime/src/sys/miri/mod.rs new file mode 100644 index 000000000000..76cf11e686ae --- /dev/null +++ b/crates/runtime/src/sys/miri/mod.rs @@ -0,0 +1,10 @@ +//! "Dummy" implementations of some system primitives for MIRI emulation. +//! +//! Note that at this time this is just enough to run some tests in MIRI but +//! notably WebAssembly tests are not executed at this time (MIRI can't execute +//! Cranelift-generated code). + +pub mod mmap; +pub mod traphandlers; +pub mod unwind; +pub mod vm; diff --git a/crates/runtime/src/sys/miri/traphandlers.rs b/crates/runtime/src/sys/miri/traphandlers.rs new file mode 100644 index 000000000000..ab600913ebb9 --- /dev/null +++ b/crates/runtime/src/sys/miri/traphandlers.rs @@ -0,0 +1,42 @@ +// For MIRI, set up just enough of a setjmp/longjmp with catching panics +// to get a few tests working that use this. +// +// Note that no actual JIT code runs in MIRI so this is purely here for +// host-to-host calls. + +use crate::VMContext; + +struct WasmtimeLongjmp; + +pub fn wasmtime_setjmp( + _jmp_buf: *mut *const u8, + callback: extern "C" fn(*mut u8, *mut VMContext), + payload: *mut u8, + callee: *mut VMContext, +) -> i32 { + use std::panic::{self, AssertUnwindSafe}; + let result = panic::catch_unwind(AssertUnwindSafe(|| { + callback(payload, callee); + })); + match result { + Ok(()) => 1, + Err(e) => { + if e.is::() { + 0 + } else { + panic::resume_unwind(e) + } + } + } +} + +pub fn wasmtime_longjmp(_jmp_buf: *const u8) -> ! { + std::panic::panic_any(WasmtimeLongjmp) +} + +#[allow(missing_docs)] +pub type SignalHandler<'a> = dyn Fn() + Send + Sync + 'a; + +pub fn platform_init(_macos_use_mach_ports: bool) {} + +pub fn lazy_per_thread_init() {} diff --git a/crates/jit/src/unwind/miri.rs b/crates/runtime/src/sys/miri/unwind.rs similarity index 93% rename from crates/jit/src/unwind/miri.rs rename to crates/runtime/src/sys/miri/unwind.rs index 4b4527e66834..d6181940cd0f 100644 --- a/crates/jit/src/unwind/miri.rs +++ b/crates/runtime/src/sys/miri/unwind.rs @@ -1,3 +1,5 @@ +#![allow(missing_docs)] + use anyhow::Result; pub struct UnwindRegistration {} diff --git a/crates/runtime/src/sys/miri/vm.rs b/crates/runtime/src/sys/miri/vm.rs new file mode 100644 index 000000000000..a4bf0de57e4b --- /dev/null +++ b/crates/runtime/src/sys/miri/vm.rs @@ -0,0 +1,63 @@ +use std::fs::File; +use std::io; +use std::sync::Arc; + +pub unsafe fn expose_existing_mapping(ptr: *mut u8, len: usize) -> io::Result<()> { + std::ptr::write_bytes(ptr, 0u8, len); + Ok(()) +} + +pub unsafe fn hide_existing_mapping(ptr: *mut u8, len: usize) -> io::Result<()> { + std::ptr::write_bytes(ptr, 0, len); + Ok(()) +} + +pub unsafe fn erase_existing_mapping(ptr: *mut u8, len: usize) -> io::Result<()> { + std::ptr::write_bytes(ptr, 0, len); + Ok(()) +} + +#[cfg(feature = "pooling-allocator")] +pub unsafe fn commit_table_pages(ptr: *mut u8, len: usize) -> io::Result<()> { + std::ptr::write_bytes(ptr, 0, len); + Ok(()) +} + +#[cfg(feature = "pooling-allocator")] +pub unsafe fn decommit_table_pages(ptr: *mut u8, len: usize) -> io::Result<()> { + std::ptr::write_bytes(ptr, 0, len); + Ok(()) +} + +pub fn get_page_size() -> usize { + 4096 +} + +pub fn supports_madvise_dontneed() -> bool { + false +} + +pub unsafe fn madvise_dontneed(_ptr: *mut u8, _len: usize) -> io::Result<()> { + unreachable!() +} + +#[derive(PartialEq, Debug)] +pub enum MemoryImageSource {} + +impl MemoryImageSource { + pub fn from_file(_file: &Arc) -> Option { + None + } + + pub fn from_data(_data: &[u8]) -> io::Result> { + Ok(None) + } + + pub unsafe fn map_at(&self, _base: *mut u8, _len: usize, _offset: u64) -> io::Result<()> { + match *self {} + } + + pub unsafe fn remap_as_zeros_at(&self, _base: *mut u8, _len: usize) -> io::Result<()> { + match *self {} + } +} diff --git a/crates/runtime/src/sys/mod.rs b/crates/runtime/src/sys/mod.rs new file mode 100644 index 000000000000..e88435682f01 --- /dev/null +++ b/crates/runtime/src/sys/mod.rs @@ -0,0 +1,30 @@ +//! OS-related abstractions required by Wasmtime. +//! +//! This module is intended to house all logic that's specific to either Unix +//! or Windows, for example. The goal of this module is to be the "single +//! module" to edit if Wasmtime is ported to a new platform. Ideally all that's +//! needed is an extra block below and a new platform should be good to go after +//! filling out the implementation. + +#![allow(clippy::cast_sign_loss)] // platforms too fiddly to worry about this + +cfg_if::cfg_if! { + if #[cfg(miri)] { + mod miri; + pub use miri::*; + } else if #[cfg(windows)] { + mod windows; + pub use windows::*; + } else if #[cfg(unix)] { + mod unix; + pub use unix::*; + } else { + compile_error!( + "Wasmtime is being compiled for a platform \ + that it does not support. If this platform is \ + one you would like to see supported you may file an \ + issue on Wasmtime's issue tracker: \ + https://github.com/bytecodealliance/wasmtime/issues/new\ + "); + } +} diff --git a/crates/runtime/src/traphandlers/macos.rs b/crates/runtime/src/sys/unix/machports.rs similarity index 98% rename from crates/runtime/src/traphandlers/macos.rs rename to crates/runtime/src/sys/unix/machports.rs index 9cbe059bd9a2..7ab1276fcd41 100644 --- a/crates/runtime/src/traphandlers/macos.rs +++ b/crates/runtime/src/sys/unix/machports.rs @@ -31,9 +31,10 @@ //! function declarations. Many bits and pieces are copied or translated from //! the SpiderMonkey implementation and it should pass all the tests! -#![allow(non_snake_case)] +#![allow(non_snake_case, clippy::cast_sign_loss)] -use crate::traphandlers::{tls, wasmtime_longjmp}; +use crate::sys::traphandlers::wasmtime_longjmp; +use crate::traphandlers::tls; use mach::exception_types::*; use mach::kern_return::*; use mach::mach_init::*; @@ -43,6 +44,7 @@ use mach::port::*; use mach::thread_act::*; use mach::traps::*; use std::mem; +use std::ptr::addr_of_mut; use std::thread; /// Other `mach` declarations awaiting @@ -167,9 +169,6 @@ static mut WASMTIME_PORT: mach_port_name_t = MACH_PORT_NULL; static mut CHILD_OF_FORKED_PROCESS: bool = false; pub unsafe fn platform_init() { - if cfg!(miri) { - return; - } // Mach ports do not currently work across forks, so configure Wasmtime to // panic in `lazy_per_thread_init` if the child attempts to invoke // WebAssembly. @@ -182,7 +181,7 @@ pub unsafe fn platform_init() { // Allocate our WASMTIME_PORT and make sure that it can be sent to so we // can receive exceptions. let me = mach_task_self(); - let kret = mach_port_allocate(me, MACH_PORT_RIGHT_RECEIVE, &mut WASMTIME_PORT); + let kret = mach_port_allocate(me, MACH_PORT_RIGHT_RECEIVE, addr_of_mut!(WASMTIME_PORT)); assert_eq!(kret, KERN_SUCCESS, "failed to allocate port"); let kret = mach_port_insert_right(me, WASMTIME_PORT, WASMTIME_PORT, MACH_MSG_TYPE_MAKE_SEND); assert_eq!(kret, KERN_SUCCESS, "failed to insert right"); @@ -404,7 +403,7 @@ unsafe fn handle_exception(request: &mut ExceptionRequest) -> bool { // pointer value and if `MAP` changes happen after we read our entry that's // ok since they won't invalidate our entry. let (pc, fp) = get_pc_and_fp(&thread_state); - if !super::IS_WASM_PC(pc as usize) { + if !crate::traphandlers::IS_WASM_PC(pc as usize) { return false; } @@ -443,7 +442,7 @@ unsafe extern "C" fn unwind( None }; state.set_jit_trap(wasm_pc, wasm_fp, faulting_addr); - state.jmp_buf.get() + state.take_jmp_buf() }); debug_assert!(!jmp_buf.is_null()); wasmtime_longjmp(jmp_buf); @@ -468,9 +467,6 @@ unsafe extern "C" fn unwind( /// exception handlers to get registered. #[cold] pub fn lazy_per_thread_init() { - if cfg!(miri) { - return; - } unsafe { assert!( !CHILD_OF_FORKED_PROCESS, diff --git a/crates/runtime/src/sys/unix/macos_traphandlers.rs b/crates/runtime/src/sys/unix/macos_traphandlers.rs new file mode 100644 index 000000000000..fd0d607530fc --- /dev/null +++ b/crates/runtime/src/sys/unix/macos_traphandlers.rs @@ -0,0 +1,28 @@ +/// Whether or not macOS is using mach ports. +#[cfg(target_os = "macos")] +static mut USE_MACH_PORTS: bool = false; + +pub use super::signals::{wasmtime_longjmp, wasmtime_setjmp, SignalHandler}; + +pub unsafe fn platform_init(macos_use_mach_ports: bool) { + USE_MACH_PORTS = macos_use_mach_ports; + if macos_use_mach_ports { + super::machports::platform_init(); + } else { + super::signals::platform_init(false); + } +} + +pub fn using_mach_ports() -> bool { + unsafe { USE_MACH_PORTS } +} + +pub fn lazy_per_thread_init() { + unsafe { + if USE_MACH_PORTS { + super::machports::lazy_per_thread_init(); + } else { + super::signals::lazy_per_thread_init(); + } + } +} diff --git a/crates/runtime/src/mmap/unix.rs b/crates/runtime/src/sys/unix/mmap.rs similarity index 100% rename from crates/runtime/src/mmap/unix.rs rename to crates/runtime/src/sys/unix/mmap.rs diff --git a/crates/runtime/src/sys/unix/mod.rs b/crates/runtime/src/sys/unix/mod.rs new file mode 100644 index 000000000000..f124598acf7d --- /dev/null +++ b/crates/runtime/src/sys/unix/mod.rs @@ -0,0 +1,21 @@ +//! Implementation of Wasmtime's system primitives for Unix-like operating +//! systems. +//! +//! This module handles Linux and macOS for example. + +pub mod mmap; +pub mod unwind; +pub mod vm; + +pub mod signals; + +cfg_if::cfg_if! { + if #[cfg(target_os = "macos")] { + pub mod machports; + + pub mod macos_traphandlers; + pub use macos_traphandlers as traphandlers; + } else { + pub use signals as traphandlers; + } +} diff --git a/crates/runtime/src/traphandlers/unix.rs b/crates/runtime/src/sys/unix/signals.rs similarity index 91% rename from crates/runtime/src/traphandlers/unix.rs rename to crates/runtime/src/sys/unix/signals.rs index 760295d70798..df6f25a40cae 100644 --- a/crates/runtime/src/traphandlers/unix.rs +++ b/crates/runtime/src/sys/unix/signals.rs @@ -1,9 +1,27 @@ -use crate::traphandlers::{tls, wasmtime_longjmp}; +//! Trap handling on Unix based on POSIX signals. + +use crate::traphandlers::tls; +use crate::VMContext; use std::cell::RefCell; use std::io; use std::mem::{self, MaybeUninit}; use std::ptr::{self, null_mut}; +#[link(name = "wasmtime-helpers")] +extern "C" { + #[wasmtime_versioned_export_macros::versioned_link] + #[allow(improper_ctypes)] + pub fn wasmtime_setjmp( + jmp_buf: *mut *const u8, + callback: extern "C" fn(*mut u8, *mut VMContext), + payload: *mut u8, + callee: *mut VMContext, + ) -> i32; + + #[wasmtime_versioned_export_macros::versioned_link] + pub fn wasmtime_longjmp(jmp_buf: *const u8) -> !; +} + /// Function which may handle custom signals while processing traps. pub type SignalHandler<'a> = dyn Fn(libc::c_int, *const libc::siginfo_t, *const libc::c_void) -> bool + Send + Sync + 'a; @@ -13,11 +31,12 @@ static mut PREV_SIGBUS: MaybeUninit = MaybeUninit::uninit(); static mut PREV_SIGILL: MaybeUninit = MaybeUninit::uninit(); static mut PREV_SIGFPE: MaybeUninit = MaybeUninit::uninit(); -pub unsafe fn platform_init() { - if cfg!(miri) { - return; - } - let register = |slot: &mut MaybeUninit, signal: i32| { +pub unsafe fn platform_init(macos_use_mach_ports: bool) { + // Either mach ports shouldn't be in use or we shouldn't be on macOS, + // otherwise the `machports.rs` module should be used instead. + assert!(!macos_use_mach_ports || !cfg!(target_os = "macos")); + + let register = |slot: *mut libc::sigaction, signal: i32| { let mut handler: libc::sigaction = mem::zeroed(); // The flags here are relatively careful, and they are... // @@ -35,7 +54,7 @@ pub unsafe fn platform_init() { handler.sa_flags = libc::SA_SIGINFO | libc::SA_NODEFER | libc::SA_ONSTACK; handler.sa_sigaction = trap_handler as usize; libc::sigemptyset(&mut handler.sa_mask); - if libc::sigaction(signal, &handler, slot.as_mut_ptr()) != 0 { + if libc::sigaction(signal, &handler, slot) != 0 { panic!( "unable to install signal handler: {}", io::Error::last_os_error(), @@ -44,20 +63,20 @@ pub unsafe fn platform_init() { }; // Allow handling OOB with signals on all architectures - register(&mut PREV_SIGSEGV, libc::SIGSEGV); + register(PREV_SIGSEGV.as_mut_ptr(), libc::SIGSEGV); // Handle `unreachable` instructions which execute `ud2` right now - register(&mut PREV_SIGILL, libc::SIGILL); + register(PREV_SIGILL.as_mut_ptr(), libc::SIGILL); // x86 and s390x use SIGFPE to report division by zero if cfg!(target_arch = "x86_64") || cfg!(target_arch = "s390x") { - register(&mut PREV_SIGFPE, libc::SIGFPE); + register(PREV_SIGFPE.as_mut_ptr(), libc::SIGFPE); } // Sometimes we need to handle SIGBUS too: // - On Darwin, guard page accesses are raised as SIGBUS. if cfg!(target_os = "macos") || cfg!(target_os = "freebsd") { - register(&mut PREV_SIGBUS, libc::SIGBUS); + register(PREV_SIGBUS.as_mut_ptr(), libc::SIGBUS); } // TODO(#1980): x86-32, if we support it, will also need a SIGFPE handler. @@ -70,10 +89,10 @@ unsafe extern "C" fn trap_handler( context: *mut libc::c_void, ) { let previous = match signum { - libc::SIGSEGV => &PREV_SIGSEGV, - libc::SIGBUS => &PREV_SIGBUS, - libc::SIGFPE => &PREV_SIGFPE, - libc::SIGILL => &PREV_SIGILL, + libc::SIGSEGV => PREV_SIGSEGV.as_ptr(), + libc::SIGBUS => PREV_SIGBUS.as_ptr(), + libc::SIGFPE => PREV_SIGFPE.as_ptr(), + libc::SIGILL => PREV_SIGILL.as_ptr(), _ => panic!("unknown signal: {}", signum), }; let handled = tls::with(|info| { @@ -161,13 +180,13 @@ unsafe extern "C" fn trap_handler( // it. It will either crash synchronously, fix up the instruction // so that execution can continue and return, or trigger a crash by // returning the signal to it's original disposition and returning. - let previous = &*previous.as_ptr(); + let previous = *previous; if previous.sa_flags & libc::SA_SIGINFO != 0 { mem::transmute::( previous.sa_sigaction, )(signum, siginfo, context) } else if previous.sa_sigaction == libc::SIG_DFL || previous.sa_sigaction == libc::SIG_IGN { - libc::sigaction(signum, previous, ptr::null_mut()); + libc::sigaction(signum, &previous as *const _, ptr::null_mut()); } else { mem::transmute::(previous.sa_sigaction)(signum) } @@ -315,10 +334,6 @@ pub fn lazy_per_thread_init() { }); unsafe fn allocate_sigaltstack() -> Option { - if cfg!(miri) { - return None; - } - // Check to see if the existing sigaltstack, if it exists, is big // enough. If so we don't need to allocate our own. let mut old_stack = mem::zeroed(); diff --git a/crates/jit/src/unwind/systemv.rs b/crates/runtime/src/sys/unix/unwind.rs similarity index 97% rename from crates/jit/src/unwind/systemv.rs rename to crates/runtime/src/sys/unix/unwind.rs index 2233e4dcb350..87d0a28d421a 100644 --- a/crates/jit/src/unwind/systemv.rs +++ b/crates/runtime/src/sys/unix/unwind.rs @@ -14,6 +14,7 @@ extern "C" { } impl UnwindRegistration { + #[allow(missing_docs)] pub const SECTION_NAME: &'static str = ".eh_frame"; /// Registers precompiled unwinding information with the system. @@ -28,7 +29,7 @@ impl UnwindRegistration { unwind_len: usize, ) -> Result { debug_assert_eq!( - unwind_info as usize % wasmtime_runtime::page_size(), + unwind_info as usize % crate::page_size(), 0, "The unwind info must always be aligned to a page" ); diff --git a/crates/runtime/src/sys/unix/vm.rs b/crates/runtime/src/sys/unix/vm.rs new file mode 100644 index 000000000000..d0e76a14567f --- /dev/null +++ b/crates/runtime/src/sys/unix/vm.rs @@ -0,0 +1,208 @@ +use rustix::fd::AsRawFd; +use rustix::mm::{mmap, mmap_anonymous, mprotect, MapFlags, MprotectFlags, ProtFlags}; +use std::fs::File; +use std::io; +use std::sync::Arc; + +pub unsafe fn expose_existing_mapping(ptr: *mut u8, len: usize) -> io::Result<()> { + mprotect(ptr.cast(), len, MprotectFlags::READ | MprotectFlags::WRITE)?; + Ok(()) +} + +pub unsafe fn hide_existing_mapping(ptr: *mut u8, len: usize) -> io::Result<()> { + mprotect(ptr.cast(), len, MprotectFlags::empty())?; + Ok(()) +} + +pub unsafe fn erase_existing_mapping(ptr: *mut u8, len: usize) -> io::Result<()> { + let ret = mmap_anonymous( + ptr.cast(), + len, + ProtFlags::empty(), + MapFlags::PRIVATE | MapFlags::FIXED, + )?; + assert_eq!(ptr, ret.cast()); + Ok(()) +} + +#[cfg(feature = "pooling-allocator")] +unsafe fn decommit(addr: *mut u8, len: usize) -> io::Result<()> { + if len == 0 { + return Ok(()); + } + + unsafe { + cfg_if::cfg_if! { + if #[cfg(target_os = "linux")] { + use rustix::mm::{madvise, Advice}; + + // On Linux, this is enough to cause the kernel to initialize + // the pages to 0 on next access + madvise(addr as _, len, Advice::LinuxDontNeed)?; + } else { + // By creating a new mapping at the same location, this will + // discard the mapping for the pages in the given range. + // The new mapping will be to the CoW zero page, so this + // effectively zeroes the pages. + mmap_anonymous( + addr as _, + len, + ProtFlags::READ | ProtFlags::WRITE, + MapFlags::PRIVATE | MapFlags::FIXED, + )?; + } + } + } + + Ok(()) +} + +#[cfg(feature = "pooling-allocator")] +pub unsafe fn commit_table_pages(_addr: *mut u8, _len: usize) -> io::Result<()> { + // Table pages are always READ | WRITE so there's nothing that needs to be + // done here. + Ok(()) +} + +#[cfg(feature = "pooling-allocator")] +pub unsafe fn decommit_table_pages(addr: *mut u8, len: usize) -> io::Result<()> { + decommit(addr, len) +} + +#[cfg(all(feature = "pooling-allocator", feature = "async"))] +pub unsafe fn commit_stack_pages(_addr: *mut u8, _len: usize) -> io::Result<()> { + // Like table pages stack pages are always READ | WRITE so nothing extra + // needs to be done to ensure they can be committed. + Ok(()) +} + +#[cfg(all(feature = "pooling-allocator", feature = "async"))] +pub unsafe fn reset_stack_pages_to_zero(addr: *mut u8, len: usize) -> io::Result<()> { + decommit(addr, len) +} + +pub fn get_page_size() -> usize { + unsafe { libc::sysconf(libc::_SC_PAGESIZE).try_into().unwrap() } +} + +pub fn supports_madvise_dontneed() -> bool { + cfg!(target_os = "linux") +} + +pub unsafe fn madvise_dontneed(ptr: *mut u8, len: usize) -> io::Result<()> { + cfg_if::cfg_if! { + if #[cfg(target_os = "linux")] { + rustix::mm::madvise(ptr.cast(), len, rustix::mm::Advice::LinuxDontNeed)?; + Ok(()) + } else { + let _ = (ptr, len); + unreachable!(); + } + } +} + +#[derive(Debug)] +pub enum MemoryImageSource { + Mmap(Arc), + #[cfg(target_os = "linux")] + Memfd(memfd::Memfd), +} + +impl MemoryImageSource { + pub fn from_file(file: &Arc) -> Option { + Some(MemoryImageSource::Mmap(file.clone())) + } + + #[cfg(not(target_os = "linux"))] + pub fn from_data(_data: &[u8]) -> io::Result> { + Ok(None) + } + + #[cfg(target_os = "linux")] + pub fn from_data(data: &[u8]) -> anyhow::Result> { + // On Linux `memfd_create` is used to create an anonymous + // in-memory file to represent the heap image. This anonymous + // file is then used as the basis for further mmaps. + + use std::io::{ErrorKind, Write}; + + // Create the memfd. It needs a name, but the documentation for + // `memfd_create()` says that names can be duplicated with no issues. + let memfd = match memfd::MemfdOptions::new() + .allow_sealing(true) + .create("wasm-memory-image") + { + Ok(memfd) => memfd, + // If this kernel is old enough to not support memfd then attempt to + // gracefully handle that and fall back to skipping the memfd + // optimization. + Err(memfd::Error::Create(err)) if err.kind() == ErrorKind::Unsupported => { + return Ok(None) + } + Err(e) => return Err(e.into()), + }; + memfd.as_file().write_all(data)?; + + // Seal the memfd's data and length. + // + // This is a defense-in-depth security mitigation. The + // memfd will serve as the starting point for the heap of + // every instance of this module. If anything were to + // write to this, it could affect every execution. The + // memfd object itself is owned by the machinery here and + // not exposed elsewhere, but it is still an ambient open + // file descriptor at the syscall level, so some other + // vulnerability that allowed writes to arbitrary fds + // could modify it. Or we could have some issue with the + // way that we map it into each instance. To be + // extra-super-sure that it never changes, and because + // this costs very little, we use the kernel's "seal" API + // to make the memfd image permanently read-only. + memfd.add_seals(&[ + memfd::FileSeal::SealGrow, + memfd::FileSeal::SealShrink, + memfd::FileSeal::SealWrite, + memfd::FileSeal::SealSeal, + ])?; + + Ok(Some(MemoryImageSource::Memfd(memfd))) + } + + fn as_file(&self) -> &File { + match self { + MemoryImageSource::Mmap(file) => file, + #[cfg(target_os = "linux")] + MemoryImageSource::Memfd(memfd) => memfd.as_file(), + } + } + + pub unsafe fn map_at(&self, base: *mut u8, len: usize, offset: u64) -> io::Result<()> { + let ptr = mmap( + base.cast(), + len, + ProtFlags::READ | ProtFlags::WRITE, + MapFlags::PRIVATE | MapFlags::FIXED, + self.as_file(), + offset, + )?; + assert_eq!(base, ptr.cast()); + Ok(()) + } + + pub unsafe fn remap_as_zeros_at(&self, base: *mut u8, len: usize) -> io::Result<()> { + let ptr = mmap_anonymous( + base.cast(), + len, + ProtFlags::READ | ProtFlags::WRITE, + MapFlags::PRIVATE | MapFlags::FIXED, + )?; + assert_eq!(base, ptr.cast()); + Ok(()) + } +} + +impl PartialEq for MemoryImageSource { + fn eq(&self, other: &MemoryImageSource) -> bool { + self.as_file().as_raw_fd() == other.as_file().as_raw_fd() + } +} diff --git a/crates/runtime/src/mmap/windows.rs b/crates/runtime/src/sys/windows/mmap.rs similarity index 96% rename from crates/runtime/src/mmap/windows.rs rename to crates/runtime/src/sys/windows/mmap.rs index 4a8396c44275..42142dfa034a 100644 --- a/crates/runtime/src/mmap/windows.rs +++ b/crates/runtime/src/sys/windows/mmap.rs @@ -104,7 +104,8 @@ impl Mmap { 0, 0, len, - ) as *mut std::ffi::c_void; + ) + .Value; let err = io::Error::last_os_error(); CloseHandle(mapping); if ptr.is_null() { @@ -201,7 +202,11 @@ impl Drop for Mmap { } if self.is_file { - let r = unsafe { UnmapViewOfFile(self.as_mut_ptr() as MEMORYMAPPEDVIEW_HANDLE) }; + let r = unsafe { + UnmapViewOfFile(MEMORY_MAPPED_VIEW_ADDRESS { + Value: self.as_mut_ptr().cast(), + }) + }; assert_ne!(r, 0); } else { let r = unsafe { VirtualFree(self.as_mut_ptr().cast(), 0, MEM_RELEASE) }; diff --git a/crates/runtime/src/sys/windows/mod.rs b/crates/runtime/src/sys/windows/mod.rs new file mode 100644 index 000000000000..d055ef6926aa --- /dev/null +++ b/crates/runtime/src/sys/windows/mod.rs @@ -0,0 +1,6 @@ +//! Implementation of Wasmtime's system primitives for Windows. + +pub mod mmap; +pub mod traphandlers; +pub mod unwind; +pub mod vm; diff --git a/crates/runtime/src/traphandlers/windows.rs b/crates/runtime/src/sys/windows/traphandlers.rs similarity index 86% rename from crates/runtime/src/traphandlers/windows.rs rename to crates/runtime/src/sys/windows/traphandlers.rs index 5ad7295f5e3c..f383477ff59c 100644 --- a/crates/runtime/src/traphandlers/windows.rs +++ b/crates/runtime/src/sys/windows/traphandlers.rs @@ -1,13 +1,29 @@ -use crate::traphandlers::{tls, wasmtime_longjmp}; +use crate::traphandlers::tls; +use crate::VMContext; use std::io; use windows_sys::Win32::Foundation::*; use windows_sys::Win32::System::Diagnostics::Debug::*; use windows_sys::Win32::System::Kernel::*; +#[link(name = "wasmtime-helpers")] +extern "C" { + #[wasmtime_versioned_export_macros::versioned_link] + #[allow(improper_ctypes)] + pub fn wasmtime_setjmp( + jmp_buf: *mut *const u8, + callback: extern "C" fn(*mut u8, *mut VMContext), + payload: *mut u8, + callee: *mut VMContext, + ) -> i32; + + #[wasmtime_versioned_export_macros::versioned_link] + pub fn wasmtime_longjmp(jmp_buf: *const u8) -> !; +} + /// Function which may handle custom signals while processing traps. pub type SignalHandler<'a> = dyn Fn(*mut EXCEPTION_POINTERS) -> bool + Send + Sync + 'a; -pub unsafe fn platform_init() { +pub unsafe fn platform_init(_macos_use_mach_ports: bool) { // our trap handler needs to go first, so that we can recover from // wasm faults and continue execution, so pass `1` as a true value // here. diff --git a/crates/jit/src/unwind/winx64.rs b/crates/runtime/src/sys/windows/unwind.rs similarity index 95% rename from crates/jit/src/unwind/winx64.rs rename to crates/runtime/src/sys/windows/unwind.rs index 6468b87c3ec4..30f136180c15 100644 --- a/crates/jit/src/unwind/winx64.rs +++ b/crates/runtime/src/sys/windows/unwind.rs @@ -10,8 +10,10 @@ pub struct UnwindRegistration { } impl UnwindRegistration { + #[allow(missing_docs)] pub const SECTION_NAME: &'static str = ".pdata"; + #[allow(missing_docs)] pub unsafe fn new( base_address: *const u8, unwind_info: *const u8, diff --git a/crates/runtime/src/sys/windows/vm.rs b/crates/runtime/src/sys/windows/vm.rs new file mode 100644 index 000000000000..52501f5cf4db --- /dev/null +++ b/crates/runtime/src/sys/windows/vm.rs @@ -0,0 +1,79 @@ +use std::fs::File; +use std::io; +use std::mem::MaybeUninit; +use std::sync::Arc; +use windows_sys::Win32::System::Memory::*; +use windows_sys::Win32::System::SystemInformation::*; + +pub unsafe fn expose_existing_mapping(ptr: *mut u8, len: usize) -> io::Result<()> { + if len == 0 { + return Ok(()); + } + if VirtualAlloc(ptr.cast(), len, MEM_COMMIT, PAGE_READWRITE).is_null() { + Err(std::io::Error::last_os_error()) + } else { + Ok(()) + } +} + +pub unsafe fn hide_existing_mapping(ptr: *mut u8, len: usize) -> io::Result<()> { + erase_existing_mapping(ptr, len) +} + +pub unsafe fn erase_existing_mapping(ptr: *mut u8, len: usize) -> io::Result<()> { + if len == 0 { + return Ok(()); + } + if VirtualFree(ptr.cast(), len, MEM_DECOMMIT) == 0 { + Err(std::io::Error::last_os_error()) + } else { + Ok(()) + } +} + +#[cfg(feature = "pooling-allocator")] +pub unsafe fn commit_table_pages(addr: *mut u8, len: usize) -> io::Result<()> { + expose_existing_mapping(addr, len) +} + +#[cfg(feature = "pooling-allocator")] +pub unsafe fn decommit_table_pages(addr: *mut u8, len: usize) -> io::Result<()> { + erase_existing_mapping(addr, len) +} + +pub fn get_page_size() -> usize { + unsafe { + let mut info = MaybeUninit::uninit(); + GetSystemInfo(info.as_mut_ptr()); + info.assume_init_ref().dwPageSize as usize + } +} + +pub fn supports_madvise_dontneed() -> bool { + false +} + +pub unsafe fn madvise_dontneed(_ptr: *mut u8, _len: usize) -> io::Result<()> { + unreachable!() +} + +#[derive(PartialEq, Debug)] +pub enum MemoryImageSource {} + +impl MemoryImageSource { + pub fn from_file(_file: &Arc) -> Option { + None + } + + pub fn from_data(_data: &[u8]) -> io::Result> { + Ok(None) + } + + pub unsafe fn map_at(&self, _base: *mut u8, _len: usize, _offset: u64) -> io::Result<()> { + match *self {} + } + + pub unsafe fn remap_as_zeros_at(&self, _base: *mut u8, _len: usize) -> io::Result<()> { + match *self {} + } +} diff --git a/crates/runtime/src/table.rs b/crates/runtime/src/table.rs index 2e5fcf3f4359..53408b821c41 100644 --- a/crates/runtime/src/table.rs +++ b/crates/runtime/src/table.rs @@ -178,7 +178,7 @@ fn wasm_to_table_type(ty: WasmRefType) -> Result { match ty.heap_type { WasmHeapType::Func => Ok(TableElementType::Func), WasmHeapType::Extern => Ok(TableElementType::Extern), - WasmHeapType::TypedFunc(_) => Ok(TableElementType::Func), + WasmHeapType::Concrete(_) => Ok(TableElementType::Func), } } diff --git a/crates/runtime/src/trampolines.rs b/crates/runtime/src/trampolines.rs deleted file mode 100644 index 16741075cef5..000000000000 --- a/crates/runtime/src/trampolines.rs +++ /dev/null @@ -1,19 +0,0 @@ -//! Wasm-to-libcall trampolines. - -cfg_if::cfg_if! { - if #[cfg(target_arch = "x86_64")] { - #[macro_use] - mod x86_64; - } else if #[cfg(target_arch = "aarch64")] { - #[macro_use] - mod aarch64; - } else if #[cfg(target_arch = "s390x")] { - #[macro_use] - mod s390x; - }else if #[cfg(target_arch = "riscv64")] { - #[macro_use] - mod riscv64; - } else { - compile_error!("unsupported architecture"); - } -} diff --git a/crates/runtime/src/trampolines/aarch64.rs b/crates/runtime/src/trampolines/aarch64.rs deleted file mode 100644 index 29852bad1ae1..000000000000 --- a/crates/runtime/src/trampolines/aarch64.rs +++ /dev/null @@ -1,42 +0,0 @@ -#[rustfmt::skip] -macro_rules! wasm_to_libcall_trampoline { - ($libcall:ident ; $libcall_impl:ident) => { - wasmtime_asm_macros::asm_func!( - wasmtime_versioned_export_macros::versioned_stringify_ident!($libcall), - " - .cfi_startproc - bti c - - // Load the pointer to `VMRuntimeLimits` in `x9`. - ldur x9, [x0, #8] - - // Store the last Wasm FP into the `last_wasm_exit_fp` in the limits. - stur fp, [x9, #24] - - // Store the last Wasm PC into the `last_wasm_exit_pc` in the limits. - stur lr, [x9, #32] - - // Tail call to the actual implementation of this libcall. - b {} - - .cfi_endproc - ", - sym $libcall_impl - ); - }; -} - -#[cfg(test)] -mod wasm_to_libcall_trampoline_offsets_tests { - use wasmtime_environ::{Module, PtrSize, VMOffsets}; - - #[test] - fn test() { - let module = Module::new(); - let offsets = VMOffsets::new(std::mem::size_of::<*mut u8>() as u8, &module); - - assert_eq!(8, offsets.vmctx_runtime_limits()); - assert_eq!(24, offsets.ptr.vmruntime_limits_last_wasm_exit_fp()); - assert_eq!(32, offsets.ptr.vmruntime_limits_last_wasm_exit_pc()); - } -} diff --git a/crates/runtime/src/trampolines/s390x.rs b/crates/runtime/src/trampolines/s390x.rs deleted file mode 100644 index f8ca65ca4fc9..000000000000 --- a/crates/runtime/src/trampolines/s390x.rs +++ /dev/null @@ -1,25 +0,0 @@ -// The implementation for libcall trampolines is in the s390x.S -// file. We provide this dummy definition of wasm_to_libcall_trampoline -// here to make libcalls.rs compile on s390x. Note that this means we -// have to duplicate the list of libcalls used in the assembler file. - -macro_rules! wasm_to_libcall_trampoline { - ($libcall:ident ; $libcall_impl:ident) => {}; -} - -// The wasm_to_host_trampoline implementation is in the s390x.S -// file, but we still want to have this unit test here. -#[cfg(test)] -mod wasm_to_libcall_trampoline_offsets_tests { - use wasmtime_environ::{Module, PtrSize, VMOffsets}; - - #[test] - fn test() { - let module = Module::new(); - let offsets = VMOffsets::new(std::mem::size_of::<*mut u8>() as u8, &module); - - assert_eq!(8, offsets.vmctx_runtime_limits()); - assert_eq!(24, offsets.ptr.vmruntime_limits_last_wasm_exit_fp()); - assert_eq!(32, offsets.ptr.vmruntime_limits_last_wasm_exit_pc()); - } -} diff --git a/crates/runtime/src/traphandlers.rs b/crates/runtime/src/traphandlers.rs index 21a7a519a1d1..3a0eeed68bc5 100644 --- a/crates/runtime/src/traphandlers.rs +++ b/crates/runtime/src/traphandlers.rs @@ -4,6 +4,7 @@ mod backtrace; mod coredump; +use crate::sys::traphandlers; use crate::{Instance, VMContext, VMRuntimeLimits}; use anyhow::Error; use std::any::Any; @@ -16,85 +17,14 @@ pub use self::backtrace::{Backtrace, Frame}; pub use self::coredump::CoreDumpStack; pub use self::tls::{tls_eager_initialize, AsyncWasmCallState, PreviousAsyncWasmCallState}; -cfg_if::cfg_if! { - if #[cfg(miri)] { - // With MIRI set up just enough of a setjmp/longjmp with catching panics - // to get a few tests working that use this. - // - // Note that no actual JIT code runs in MIRI so this is purely here for - // host-to-host calls. - - struct WasmtimeLongjmp; - - #[wasmtime_versioned_export_macros::versioned_export] - unsafe extern "C" fn wasmtime_setjmp( - _jmp_buf: *mut *const u8, - callback: extern "C" fn(*mut u8, *mut VMContext), - payload: *mut u8, - callee: *mut VMContext, - ) -> i32 { - use std::panic::{self, AssertUnwindSafe}; - let result = panic::catch_unwind(AssertUnwindSafe(|| { - callback(payload, callee); - })); - match result { - Ok(()) => 1, - Err(e) => { - if e.is::() { - 0 - } else { - panic::resume_unwind(e) - } - } - } - } - - #[wasmtime_versioned_export_macros::versioned_export] - unsafe extern "C" fn wasmtime_longjmp(_jmp_buf: *const u8) -> ! { - std::panic::panic_any(WasmtimeLongjmp) - } - } else { - #[link(name = "wasmtime-helpers")] - extern "C" { - #[wasmtime_versioned_export_macros::versioned_link] - #[allow(improper_ctypes)] - fn wasmtime_setjmp( - jmp_buf: *mut *const u8, - callback: extern "C" fn(*mut u8, *mut VMContext), - payload: *mut u8, - callee: *mut VMContext, - ) -> i32; - #[wasmtime_versioned_export_macros::versioned_link] - fn wasmtime_longjmp(jmp_buf: *const u8) -> !; - } - } -} - -cfg_if::cfg_if! { - if #[cfg(unix)] { - mod unix; - use unix as sys; - } else if #[cfg(target_os = "windows")] { - mod windows; - use windows as sys; - } -} - -#[cfg(target_os = "macos")] -mod macos; - -pub use sys::SignalHandler; +pub use traphandlers::SignalHandler; /// Globally-set callback to determine whether a program counter is actually a /// wasm trap. /// /// This is initialized during `init_traps` below. The definition lives within /// `wasmtime` currently. -static mut IS_WASM_PC: fn(usize) -> bool = |_| false; - -/// Whether or not macOS is using mach ports. -#[cfg(target_os = "macos")] -static mut MACOS_USE_MACH_PORTS: bool = false; +pub(crate) static mut IS_WASM_PC: fn(usize) -> bool = |_| false; /// This function is required to be called before any WebAssembly is entered. /// This will configure global state such as signal handlers to prepare the @@ -112,38 +42,21 @@ static mut MACOS_USE_MACH_PORTS: bool = false; pub fn init_traps(is_wasm_pc: fn(usize) -> bool, macos_use_mach_ports: bool) { static INIT: Once = Once::new(); - // only used on macos, so squelch warnings about this not being used on - // other platform. - let _ = macos_use_mach_ports; - INIT.call_once(|| unsafe { IS_WASM_PC = is_wasm_pc; - #[cfg(target_os = "macos")] - if macos_use_mach_ports { - MACOS_USE_MACH_PORTS = macos_use_mach_ports; - return macos::platform_init(); - } - sys::platform_init(); + traphandlers::platform_init(macos_use_mach_ports); }); #[cfg(target_os = "macos")] - unsafe { - assert_eq!( - MACOS_USE_MACH_PORTS, macos_use_mach_ports, - "cannot configure two different methods of signal handling in the same process" - ); - } + assert_eq!( + traphandlers::using_mach_ports(), + macos_use_mach_ports, + "cannot configure two different methods of signal handling in the same process" + ); } fn lazy_per_thread_init() { - #[cfg(target_os = "macos")] - unsafe { - if MACOS_USE_MACH_PORTS { - return macos::lazy_per_thread_init(); - } - } - - sys::lazy_per_thread_init(); + traphandlers::lazy_per_thread_init(); } /// Raises a trap immediately. @@ -303,7 +216,7 @@ where let result = CallThreadState::new(signal_handler, capture_backtrace, capture_coredump, *limits) .with(|cx| { - wasmtime_setjmp( + traphandlers::wasmtime_setjmp( cx.jmp_buf.as_ptr(), call_closure::, &mut closure as *mut F as *mut u8, @@ -470,7 +383,7 @@ impl CallThreadState { (*self.unwind.get()) .as_mut_ptr() .write((reason, backtrace, coredump)); - wasmtime_longjmp(self.jmp_buf.get()); + traphandlers::wasmtime_longjmp(self.jmp_buf.get()); } } @@ -489,8 +402,8 @@ impl CallThreadState { /// instance, and the trap handler should quickly return. /// * a different pointer - a jmp_buf buffer to longjmp to, meaning that /// the wasm trap was succesfully handled. - #[cfg_attr(target_os = "macos", allow(dead_code))] // macOS is more raw and doesn't use this - fn take_jmp_buf_if_trap( + #[cfg_attr(miri, allow(dead_code))] // miri doesn't handle traps yet + pub(crate) fn take_jmp_buf_if_trap( &self, pc: *const u8, call_handler: impl Fn(&SignalHandler) -> bool, @@ -516,10 +429,15 @@ impl CallThreadState { // If all that passed then this is indeed a wasm trap, so return the // `jmp_buf` passed to `wasmtime_longjmp` to resume. + self.take_jmp_buf() + } + + pub(crate) fn take_jmp_buf(&self) -> *const u8 { self.jmp_buf.replace(ptr::null()) } - fn set_jit_trap(&self, pc: *const u8, fp: usize, faulting_addr: Option) { + #[cfg_attr(miri, allow(dead_code))] // miri doesn't handle traps yet + pub(crate) fn set_jit_trap(&self, pc: *const u8, fp: usize, faulting_addr: Option) { let backtrace = self.capture_backtrace(self.limits, Some((pc as usize, fp))); let coredump = self.capture_coredump(self.limits, Some((pc as usize, fp))); unsafe { @@ -581,7 +499,7 @@ impl Drop for ResetCell<'_, T> { // happen which requires us to read some contextual state to figure out what to // do with the trap. This `tls` module is used to persist that information from // the caller to the trap site. -mod tls { +pub(crate) mod tls { use super::CallThreadState; use std::mem; use std::ops::Range; diff --git a/crates/runtime/src/traphandlers/backtrace.rs b/crates/runtime/src/traphandlers/backtrace.rs index 0b61fb425f5d..4cab189dcfc4 100644 --- a/crates/runtime/src/traphandlers/backtrace.rs +++ b/crates/runtime/src/traphandlers/backtrace.rs @@ -20,39 +20,13 @@ //! exit FP and stopping once we reach the entry SP (meaning that the next older //! frame is a host frame). +use crate::arch; use crate::{ traphandlers::{tls, CallThreadState}, VMRuntimeLimits, }; -use cfg_if::cfg_if; use std::ops::ControlFlow; -// Architecture-specific bits for stack walking. Each of these modules should -// define and export the following functions: -// -// * `unsafe fn get_next_older_pc_from_fp(fp: usize) -> usize` -// * `unsafe fn get_next_older_fp_from_fp(fp: usize) -> usize` -// * `fn reached_entry_sp(fp: usize, first_wasm_sp: usize) -> bool` -// * `fn assert_entry_sp_is_aligned(sp: usize)` -// * `fn assert_fp_is_aligned(fp: usize)` -cfg_if! { - if #[cfg(target_arch = "x86_64")] { - mod x86_64; - use x86_64 as arch; - } else if #[cfg(target_arch = "aarch64")] { - mod aarch64; - use aarch64 as arch; - } else if #[cfg(target_arch = "s390x")] { - mod s390x; - use s390x as arch; - } else if #[cfg(target_arch = "riscv64")] { - mod riscv64; - use riscv64 as arch; - } else { - compile_error!("unsupported architecture"); - } -} - /// A WebAssembly stack trace. #[derive(Debug)] pub struct Backtrace(Vec); diff --git a/crates/runtime/src/traphandlers/backtrace/riscv64.rs b/crates/runtime/src/traphandlers/backtrace/riscv64.rs deleted file mode 100644 index bc3f5b0840d3..000000000000 --- a/crates/runtime/src/traphandlers/backtrace/riscv64.rs +++ /dev/null @@ -1,18 +0,0 @@ -pub unsafe fn get_next_older_pc_from_fp(fp: usize) -> usize { - *(fp as *mut usize).offset(1) -} - -// And the current frame pointer points to the next older frame pointer. -pub const NEXT_OLDER_FP_FROM_FP_OFFSET: usize = 0; - -pub fn reached_entry_sp(fp: usize, entry_sp: usize) -> bool { - fp >= entry_sp -} - -pub fn assert_entry_sp_is_aligned(sp: usize) { - assert_eq!(sp % 16, 0, "stack should always be aligned to 16"); -} - -pub fn assert_fp_is_aligned(fp: usize) { - assert_eq!(fp % 16, 0, "stack should always be aligned to 16"); -} diff --git a/crates/runtime/src/traphandlers/backtrace/s390x.rs b/crates/runtime/src/traphandlers/backtrace/s390x.rs deleted file mode 100644 index 7290c4850c9a..000000000000 --- a/crates/runtime/src/traphandlers/backtrace/s390x.rs +++ /dev/null @@ -1,22 +0,0 @@ -pub unsafe fn get_next_older_pc_from_fp(fp: usize) -> usize { - // The next older PC can be found in register %r14 at function entry, which - // was saved into slot 14 of the register save area pointed to by "FP" (the - // backchain pointer). - *(fp as *mut usize).offset(14) -} - -// The next older "FP" (backchain pointer) was saved in the slot pointed to -// by the current "FP". -pub const NEXT_OLDER_FP_FROM_FP_OFFSET: usize = 0; - -pub fn reached_entry_sp(fp: usize, entry_sp: usize) -> bool { - fp > entry_sp -} - -pub fn assert_entry_sp_is_aligned(sp: usize) { - assert_eq!(sp % 8, 0, "stack should always be aligned to 8"); -} - -pub fn assert_fp_is_aligned(fp: usize) { - assert_eq!(fp % 8, 0, "stack should always be aligned to 8"); -} diff --git a/crates/runtime/src/traphandlers/backtrace/x86_64.rs b/crates/runtime/src/traphandlers/backtrace/x86_64.rs deleted file mode 100644 index ed1a3eb4b14b..000000000000 --- a/crates/runtime/src/traphandlers/backtrace/x86_64.rs +++ /dev/null @@ -1,20 +0,0 @@ -pub unsafe fn get_next_older_pc_from_fp(fp: usize) -> usize { - // The calling convention always pushes the return pointer (aka the PC of - // the next older frame) just before this frame. - *(fp as *mut usize).offset(1) -} - -// And the current frame pointer points to the next older frame pointer. -pub const NEXT_OLDER_FP_FROM_FP_OFFSET: usize = 0; - -pub fn reached_entry_sp(fp: usize, entry_sp: usize) -> bool { - fp >= entry_sp -} - -pub fn assert_entry_sp_is_aligned(sp: usize) { - assert_eq!(sp % 16, 0, "stack should always be aligned to 16"); -} - -pub fn assert_fp_is_aligned(fp: usize) { - assert_eq!(fp % 16, 0, "stack should always be aligned to 16"); -} diff --git a/crates/runtime/src/vmcontext.rs b/crates/runtime/src/vmcontext.rs index a46e59c3fde2..17bfff9bb121 100644 --- a/crates/runtime/src/vmcontext.rs +++ b/crates/runtime/src/vmcontext.rs @@ -12,7 +12,7 @@ use std::ptr::NonNull; use std::sync::atomic::{AtomicUsize, Ordering}; use std::u32; pub use vm_host_func_context::{VMArrayCallHostFuncContext, VMNativeCallHostFuncContext}; -use wasmtime_environ::{DefinedMemoryIndex, VMCONTEXT_MAGIC}; +use wasmtime_environ::{DefinedMemoryIndex, Unsigned, VMCONTEXT_MAGIC}; /// A function pointer that exposes the array calling convention. /// @@ -557,33 +557,38 @@ impl VMGlobalDefinition { } } -/// An index into the shared signature registry, usable for checking signatures +/// An index into the shared type registry, usable for checking signatures /// at indirect calls. #[repr(C)] #[derive(Debug, Eq, PartialEq, Clone, Copy, Hash)] -pub struct VMSharedSignatureIndex(u32); +pub struct VMSharedTypeIndex(u32); #[cfg(test)] -mod test_vmshared_signature_index { - use super::VMSharedSignatureIndex; +mod test_vmshared_type_index { + use super::VMSharedTypeIndex; use std::mem::size_of; use wasmtime_environ::{Module, VMOffsets}; #[test] - fn check_vmshared_signature_index() { + fn check_vmshared_type_index() { let module = Module::new(); let offsets = VMOffsets::new(size_of::<*mut u8>() as u8, &module); assert_eq!( - size_of::(), - usize::from(offsets.size_of_vmshared_signature_index()) + size_of::(), + usize::from(offsets.size_of_vmshared_type_index()) ); } } -impl VMSharedSignatureIndex { - /// Create a new `VMSharedSignatureIndex`. +impl VMSharedTypeIndex { + /// Create a new `VMSharedTypeIndex`. #[inline] pub fn new(value: u32) -> Self { + assert_ne!( + value, + u32::MAX, + "u32::MAX is reserved for the default value" + ); Self(value) } @@ -594,16 +599,16 @@ impl VMSharedSignatureIndex { } } -impl Default for VMSharedSignatureIndex { +impl Default for VMSharedTypeIndex { #[inline] fn default() -> Self { - Self::new(u32::MAX) + Self(u32::MAX) } } /// The VM caller-checked "funcref" record, for caller-side signature checking. /// -/// It consists of function pointer(s), a signature id to be checked by the +/// It consists of function pointer(s), a type id to be checked by the /// caller, and the vmctx closure associated with this function. #[derive(Debug, Clone)] #[repr(C)] @@ -636,8 +641,8 @@ pub struct VMFuncRef { /// the vast vast vast majority of the time. pub wasm_call: Option>, - /// Function signature id. - pub type_index: VMSharedSignatureIndex, + /// Function signature's type id. + pub type_index: VMSharedTypeIndex, /// The VM state associated with this function. /// @@ -1038,7 +1043,7 @@ impl ValRaw { // `wasmtime` crate. Otherwise though all `ValRaw` constructors are // otherwise constrained to guarantee that the initial 64-bits are // always initialized. - ValRaw::u64((i as u32).into()) + ValRaw::u64(i.unsigned().into()) } /// Creates a WebAssembly `i64` value @@ -1112,13 +1117,13 @@ impl ValRaw { /// Gets the WebAssembly `i32` value #[inline] pub fn get_u32(&self) -> u32 { - self.get_i32() as u32 + self.get_i32().unsigned() } /// Gets the WebAssembly `i64` value #[inline] pub fn get_u64(&self) -> u64 { - self.get_i64() as u64 + self.get_i64().unsigned() } /// Gets the WebAssembly `f32` value diff --git a/crates/test-programs/Cargo.toml b/crates/test-programs/Cargo.toml index f195b3d591d1..86854364ff43 100644 --- a/crates/test-programs/Cargo.toml +++ b/crates/test-programs/Cargo.toml @@ -6,9 +6,13 @@ edition.workspace = true publish = false license = "Apache-2.0 WITH LLVM-exception" +[lints] +workspace = true + [dependencies] anyhow = { workspace = true } wasi = "0.11.0" +wasi-nn = "0.6.0" wit-bindgen = { workspace = true, features = ['default'] } libc = { workspace = true } getrandom = "0.2.9" diff --git a/crates/test-programs/artifacts/Cargo.toml b/crates/test-programs/artifacts/Cargo.toml index 4c1e69d49128..e87f837b2c6f 100644 --- a/crates/test-programs/artifacts/Cargo.toml +++ b/crates/test-programs/artifacts/Cargo.toml @@ -6,7 +6,10 @@ edition.workspace = true publish = false license = "Apache-2.0 WITH LLVM-exception" +[lints] +workspace = true + [build-dependencies] heck = { workspace = true } wit-component = { workspace = true } -cargo_metadata = "0.15.3" +cargo_metadata = "0.18.1" diff --git a/crates/test-programs/artifacts/build.rs b/crates/test-programs/artifacts/build.rs index eb446fd0ba0d..a515415b604c 100644 --- a/crates/test-programs/artifacts/build.rs +++ b/crates/test-programs/artifacts/build.rs @@ -19,6 +19,11 @@ fn build_and_generate_tests() { "command", &["--no-default-features", "--features=command"], ); + let proxy_adapter = build_adapter( + &out_dir, + "proxy", + &["--no-default-features", "--features=proxy"], + ); println!("cargo:rerun-if-changed=../src"); @@ -60,13 +65,6 @@ fn build_and_generate_tests() { generated_code += &format!("pub const {camel}: &'static str = {wasm:?};\n"); - let adapter = match target.as_str() { - "reactor" => &reactor_adapter, - _ => &command_adapter, - }; - let path = compile_component(&wasm, adapter); - generated_code += &format!("pub const {camel}_COMPONENT: &'static str = {path:?};\n"); - // Bucket, based on the name of the test, into a "kind" which generates // a `foreach_*` macro below. let kind = match target.as_str() { @@ -75,6 +73,8 @@ fn build_and_generate_tests() { s if s.starts_with("preview2_") => "preview2", s if s.starts_with("cli_") => "cli", s if s.starts_with("api_") => "api", + s if s.starts_with("nn_") => "nn", + s if s.starts_with("piped_") => "piped", // If you're reading this because you hit this panic, either add it // to a test suite above or add a new "suite". The purpose of the // categorization above is to have a static assertion that tests @@ -87,6 +87,18 @@ fn build_and_generate_tests() { if !kind.is_empty() { kinds.entry(kind).or_insert(Vec::new()).push(target); } + + // Generate a component from each test. + if kind == "nn" { + continue; + } + let adapter = match target.as_str() { + "reactor" => &reactor_adapter, + s if s.starts_with("api_proxy") => &proxy_adapter, + _ => &command_adapter, + }; + let path = compile_component(&wasm, adapter); + generated_code += &format!("pub const {camel}_COMPONENT: &'static str = {path:?};\n"); } for (kind, targets) in kinds { diff --git a/crates/test-programs/artifacts/src/lib.rs b/crates/test-programs/artifacts/src/lib.rs index e312491e9883..93ec058bb096 100644 --- a/crates/test-programs/artifacts/src/lib.rs +++ b/crates/test-programs/artifacts/src/lib.rs @@ -15,25 +15,15 @@ pub fn wasi_tests_environment() -> &'static [(&'static str, &'static str)] { // Windows does not support renaming a directory to an empty directory - // empty directory must be deleted. ("NO_RENAME_DIR_TO_EMPTY_DIR", "1"), - // cap-std-sync does not support the sync family of fdflags - ("NO_FDFLAGS_SYNC_SUPPORT", "1"), ] } #[cfg(all(unix, not(target_os = "macos")))] { - &[ - ("ERRNO_MODE_UNIX", "1"), - // cap-std-sync does not support the sync family of fdflags - ("NO_FDFLAGS_SYNC_SUPPORT", "1"), - ] + &[("ERRNO_MODE_UNIX", "1")] } #[cfg(target_os = "macos")] { - &[ - ("ERRNO_MODE_MACOS", "1"), - // cap-std-sync does not support the sync family of fdflags - ("NO_FDFLAGS_SYNC_SUPPORT", "1"), - ] + &[("ERRNO_MODE_MACOS", "1")] } } diff --git a/crates/test-programs/src/bin/api_proxy.rs b/crates/test-programs/src/bin/api_proxy.rs index d9ca3936fab0..77e6bba83fce 100644 --- a/crates/test-programs/src/bin/api_proxy.rs +++ b/crates/test-programs/src/bin/api_proxy.rs @@ -16,11 +16,17 @@ struct T; impl bindings::exports::wasi::http::incoming_handler::Guest for T { fn handle(request: IncomingRequest, outparam: ResponseOutparam) { + assert!(request.scheme().is_some()); + assert!(request.authority().is_some()); + assert!(request.path_with_query().is_some()); + + test_filesystem(); + let header = String::from("custom-forbidden-header"); let req_hdrs = request.headers(); assert!( - req_hdrs.get(&header).is_empty(), + !req_hdrs.has(&header), "forbidden `custom-forbidden-header` found in request" ); @@ -28,10 +34,15 @@ impl bindings::exports::wasi::http::incoming_handler::Guest for T { assert!(req_hdrs.append(&header, &b"no".to_vec()).is_err()); assert!( - req_hdrs.get(&header).is_empty(), + !req_hdrs.has(&header), "append of forbidden header succeeded" ); + assert!( + !req_hdrs.has(&"host".to_owned()), + "forbidden host header present in incoming request" + ); + let hdrs = bindings::wasi::http::types::Headers::new(); let resp = bindings::wasi::http::types::OutgoingResponse::new(hdrs); let body = resp.body().expect("outgoing response"); @@ -51,3 +62,7 @@ impl bindings::exports::wasi::http::incoming_handler::Guest for T { // Technically this should not be here for a proxy, but given the current // framework for tests it's required since this file is built as a `bin` fn main() {} + +fn test_filesystem() { + assert!(std::fs::File::open(".").is_err()); +} diff --git a/crates/test-programs/src/bin/api_proxy_streaming.rs b/crates/test-programs/src/bin/api_proxy_streaming.rs index b2a354650b83..d03ff362381e 100644 --- a/crates/test-programs/src/bin/api_proxy_streaming.rs +++ b/crates/test-programs/src/bin/api_proxy_streaming.rs @@ -33,6 +33,8 @@ impl bindings::exports::wasi::http::incoming_handler::Guest for Handler { async fn handle_request(request: IncomingRequest, response_out: ResponseOutparam) { let headers = request.headers().entries(); + assert!(request.authority().is_some()); + match (request.method(), request.path_with_query().as_deref()) { (Method::Get, Some("/hash-all")) => { // Send outgoing GET requests to the specified URLs and stream the hashes of the response bodies as diff --git a/crates/test-programs/src/bin/cli_no_ip_name_lookup.rs b/crates/test-programs/src/bin/cli_no_ip_name_lookup.rs new file mode 100644 index 000000000000..c0aeb1329ce3 --- /dev/null +++ b/crates/test-programs/src/bin/cli_no_ip_name_lookup.rs @@ -0,0 +1,15 @@ +//! This test assumes that it will be run without ip lookup support enabled +use test_programs::wasi::sockets::{ + ip_name_lookup::{ErrorCode, IpAddress}, + network::Network, +}; + +fn main() { + let res = resolve("example.com"); + eprintln!("Result of resolve: {res:?}"); + assert!(matches!(res, Err(ErrorCode::PermanentResolverFailure))); +} + +fn resolve(name: &str) -> Result, ErrorCode> { + Network::default().permissive_blocking_resolve_addresses(name) +} diff --git a/crates/test-programs/src/bin/cli_no_tcp.rs b/crates/test-programs/src/bin/cli_no_tcp.rs new file mode 100644 index 000000000000..58ca3de8958d --- /dev/null +++ b/crates/test-programs/src/bin/cli_no_tcp.rs @@ -0,0 +1,28 @@ +//! This test assumes that it will be run without tcp support enabled +use test_programs::wasi::sockets::{ + network::IpAddress, + tcp::{ErrorCode, IpAddressFamily, IpSocketAddress, Network, TcpSocket}, +}; + +fn main() { + let net = Network::default(); + let family = IpAddressFamily::Ipv4; + let remote1 = IpSocketAddress::new(IpAddress::new_loopback(family), 4321); + let sock = TcpSocket::new(family).unwrap(); + + let bind = sock.blocking_bind(&net, remote1); + eprintln!("Result of binding: {bind:?}"); + assert!(matches!(bind, Err(ErrorCode::AccessDenied))); + + let listen = sock.blocking_listen(); + eprintln!("Result of listen: {listen:?}"); + assert!(matches!(listen, Err(ErrorCode::AccessDenied))); + + let connect = sock.blocking_connect(&net, remote1); + eprintln!("Result of connect: {connect:?}"); + assert!(matches!(connect, Err(ErrorCode::AccessDenied))); + + let accept = sock.blocking_accept(); + eprintln!("Result of accept: {accept:?}"); + assert!(matches!(accept, Err(ErrorCode::AccessDenied))); +} diff --git a/crates/test-programs/src/bin/cli_no_udp.rs b/crates/test-programs/src/bin/cli_no_udp.rs new file mode 100644 index 000000000000..1dd0240612db --- /dev/null +++ b/crates/test-programs/src/bin/cli_no_udp.rs @@ -0,0 +1,16 @@ +//! This test assumes that it will be run without udp support enabled +use test_programs::wasi::sockets::{ + network::IpAddress, + udp::{ErrorCode, IpAddressFamily, IpSocketAddress, Network, UdpSocket}, +}; + +fn main() { + let net = Network::default(); + let family = IpAddressFamily::Ipv4; + let remote1 = IpSocketAddress::new(IpAddress::new_loopback(family), 4321); + let sock = UdpSocket::new(family).unwrap(); + + let bind = sock.blocking_bind(&net, remote1); + eprintln!("Result of binding: {bind:?}"); + assert!(matches!(bind, Err(ErrorCode::AccessDenied))); +} diff --git a/crates/test-programs/src/bin/http_outbound_request_content_length.rs b/crates/test-programs/src/bin/http_outbound_request_content_length.rs index ea7d69c58f4b..59b6254316ab 100644 --- a/crates/test-programs/src/bin/http_outbound_request_content_length.rs +++ b/crates/test-programs/src/bin/http_outbound_request_content_length.rs @@ -54,11 +54,7 @@ fn main() { http_types::OutgoingBody::finish(outgoing_body, None).expect_err("finish should fail"); assert!( - matches!( - &e, - http_types::ErrorCode::InternalError(Some(s)) - if s == "not enough written to body stream", - ), + matches!(&e, http_types::ErrorCode::HttpRequestBodySize(Some(3))), "unexpected error: {e:#?}" ); } @@ -75,25 +71,26 @@ fn main() { .expect_err("write should fail"); let e = match e { - test_programs::wasi::io::streams::StreamError::LastOperationFailed(e) => e, + test_programs::wasi::io::streams::StreamError::LastOperationFailed(e) => { + http_types::http_error_code(&e) + } test_programs::wasi::io::streams::StreamError::Closed => panic!("request closed"), }; - assert!(matches!( - http_types::http_error_code(&e), - Some(http_types::ErrorCode::InternalError(Some(msg))) - if msg == "too much written to output stream")); + assert!( + matches!( + e, + Some(http_types::ErrorCode::HttpRequestBodySize(Some(18))) + ), + "unexpected error {e:?}" + ); } let e = http_types::OutgoingBody::finish(outgoing_body, None).expect_err("finish should fail"); assert!( - matches!( - &e, - http_types::ErrorCode::InternalError(Some(s)) - if s == "too much written to body stream", - ), + matches!(&e, http_types::ErrorCode::HttpRequestBodySize(Some(18))), "unexpected error: {e:#?}" ); } diff --git a/crates/test-programs/src/bin/http_outbound_request_get.rs b/crates/test-programs/src/bin/http_outbound_request_get.rs index 49eb88d63779..91a7bc719c8b 100644 --- a/crates/test-programs/src/bin/http_outbound_request_get.rs +++ b/crates/test-programs/src/bin/http_outbound_request_get.rs @@ -21,7 +21,7 @@ fn main() { let uri = res.header("x-wasmtime-test-uri").unwrap(); assert_eq!( std::str::from_utf8(uri).unwrap(), - format!("http://{addr}/get?some=arg&goes=here") + format!("/get?some=arg&goes=here") ); assert_eq!(res.body, b""); } diff --git a/crates/test-programs/src/bin/http_outbound_request_invalid_header.rs b/crates/test-programs/src/bin/http_outbound_request_invalid_header.rs index 65931dd6115e..1f532ee25e2c 100644 --- a/crates/test-programs/src/bin/http_outbound_request_invalid_header.rs +++ b/crates/test-programs/src/bin/http_outbound_request_invalid_header.rs @@ -27,6 +27,11 @@ fn main() { Err(HeaderError::Forbidden) )); + assert!(matches!( + hdrs.append(&"Host".to_owned(), &b"example.com".to_vec()), + Err(HeaderError::Forbidden) + )); + assert!(matches!( hdrs.append( &"custom-forbidden-header".to_owned(), diff --git a/crates/test-programs/src/bin/http_outbound_request_post.rs b/crates/test-programs/src/bin/http_outbound_request_post.rs index 3831f0a274a5..89f8b6ba86bf 100644 --- a/crates/test-programs/src/bin/http_outbound_request_post.rs +++ b/crates/test-programs/src/bin/http_outbound_request_post.rs @@ -18,5 +18,7 @@ fn main() { assert_eq!(res.status, 200); let method = res.header("x-wasmtime-test-method").unwrap(); assert_eq!(std::str::from_utf8(method).unwrap(), "POST"); + let uri = res.header("x-wasmtime-test-uri").unwrap(); + assert_eq!(std::str::from_utf8(uri).unwrap(), format!("/post")); assert_eq!(res.body, b"{\"foo\": \"bar\"}", "invalid body returned"); } diff --git a/crates/test-programs/src/bin/http_outbound_request_put.rs b/crates/test-programs/src/bin/http_outbound_request_put.rs index ae01967c1df5..5184464e2dd7 100644 --- a/crates/test-programs/src/bin/http_outbound_request_put.rs +++ b/crates/test-programs/src/bin/http_outbound_request_put.rs @@ -12,5 +12,7 @@ fn main() { assert_eq!(res.status, 200); let method = res.header("x-wasmtime-test-method").unwrap(); assert_eq!(std::str::from_utf8(method).unwrap(), "PUT"); + let uri = res.header("x-wasmtime-test-uri").unwrap(); + assert_eq!(std::str::from_utf8(uri).unwrap(), format!("/put")); assert_eq!(res.body, b""); } diff --git a/crates/test-programs/src/bin/nn_image_classification.rs b/crates/test-programs/src/bin/nn_image_classification.rs new file mode 100644 index 000000000000..f81b89154ed1 --- /dev/null +++ b/crates/test-programs/src/bin/nn_image_classification.rs @@ -0,0 +1,59 @@ +use anyhow::Result; +use std::fs; +use wasi_nn::*; + +pub fn main() -> Result<()> { + let xml = fs::read_to_string("fixture/model.xml").unwrap(); + println!("Read graph XML, first 50 characters: {}", &xml[..50]); + + let weights = fs::read("fixture/model.bin").unwrap(); + println!("Read graph weights, size in bytes: {}", weights.len()); + + let graph = GraphBuilder::new(GraphEncoding::Openvino, ExecutionTarget::CPU) + .build_from_bytes([&xml.into_bytes(), &weights])?; + println!("Loaded graph into wasi-nn with ID: {}", graph); + + let mut context = graph.init_execution_context()?; + println!("Created wasi-nn execution context with ID: {}", context); + + // Load a tensor that precisely matches the graph input tensor (see + // `fixture/frozen_inference_graph.xml`). + let data = fs::read("fixture/tensor.bgr").unwrap(); + println!("Read input tensor, size in bytes: {}", data.len()); + context.set_input(0, wasi_nn::TensorType::F32, &[1, 3, 224, 224], &data)?; + + // Execute the inference. + context.compute()?; + println!("Executed graph inference"); + + // Retrieve the output. + let mut output_buffer = vec![0f32; 1001]; + context.get_output(0, &mut output_buffer[..])?; + println!( + "Found results, sorted top 5: {:?}", + &sort_results(&output_buffer)[..5] + ); + + Ok(()) +} + +// Sort the buffer of probabilities. The graph places the match probability for +// each class at the index for that class (e.g. the probability of class 42 is +// placed at buffer[42]). Here we convert to a wrapping InferenceResult and sort +// the results. It is unclear why the MobileNet output indices are "off by one" +// but the `.skip(1)` below seems necessary to get results that make sense (e.g. +// 763 = "revolver" vs 762 = "restaurant"). +fn sort_results(buffer: &[f32]) -> Vec { + let mut results: Vec = buffer + .iter() + .skip(1) + .enumerate() + .map(|(c, p)| InferenceResult(c, *p)) + .collect(); + results.sort_by(|a, b| b.1.partial_cmp(&a.1).unwrap()); + results +} + +// A wrapper for class ID and match probabilities. +#[derive(Debug, PartialEq)] +struct InferenceResult(usize, f32); diff --git a/crates/test-programs/src/bin/nn_image_classification_named.rs b/crates/test-programs/src/bin/nn_image_classification_named.rs new file mode 100644 index 000000000000..9e70770efc10 --- /dev/null +++ b/crates/test-programs/src/bin/nn_image_classification_named.rs @@ -0,0 +1,53 @@ +use anyhow::Result; +use std::fs; +use wasi_nn::*; + +pub fn main() -> Result<()> { + let graph = GraphBuilder::new(GraphEncoding::Openvino, ExecutionTarget::CPU) + .build_from_cache("mobilenet")?; + println!("Loaded a graph: {:?}", graph); + + let mut context = graph.init_execution_context()?; + println!("Created an execution context: {:?}", context); + + // Load a tensor that precisely matches the graph input tensor (see + // `fixture/frozen_inference_graph.xml`). + let tensor_data = fs::read("fixture/tensor.bgr")?; + println!("Read input tensor, size in bytes: {}", tensor_data.len()); + context.set_input(0, TensorType::F32, &[1, 3, 224, 224], &tensor_data)?; + + // Execute the inference. + context.compute()?; + println!("Executed graph inference"); + + // Retrieve the output. + let mut output_buffer = vec![0f32; 1001]; + context.get_output(0, &mut output_buffer[..])?; + + println!( + "Found results, sorted top 5: {:?}", + &sort_results(&output_buffer)[..5] + ); + Ok(()) +} + +// Sort the buffer of probabilities. The graph places the match probability for +// each class at the index for that class (e.g. the probability of class 42 is +// placed at buffer[42]). Here we convert to a wrapping InferenceResult and sort +// the results. It is unclear why the MobileNet output indices are "off by one" +// but the `.skip(1)` below seems necessary to get results that make sense (e.g. +// 763 = "revolver" vs 762 = "restaurant"). +fn sort_results(buffer: &[f32]) -> Vec { + let mut results: Vec = buffer + .iter() + .skip(1) + .enumerate() + .map(|(c, p)| InferenceResult(c, *p)) + .collect(); + results.sort_by(|a, b| b.1.partial_cmp(&a.1).unwrap()); + results +} + +// A wrapper for class ID and match probabilities. +#[derive(Debug, PartialEq)] +struct InferenceResult(usize, f32); diff --git a/crates/test-programs/src/bin/piped_multiple.rs b/crates/test-programs/src/bin/piped_multiple.rs new file mode 100644 index 000000000000..29c1ff4148e8 --- /dev/null +++ b/crates/test-programs/src/bin/piped_multiple.rs @@ -0,0 +1,34 @@ +use test_programs::wasi::cli::{stdin, stdout}; + +fn main() { + match std::env::var("PIPED_SIDE") + .expect("piped tests require the PIPED_SIDE env var") + .as_str() + { + "PRODUCER" => producer(), + "CONSUMER" => consumer(), + side => panic!("unknown piped test side: {side}"), + } +} + +const CHUNK: &[u8] = &[b'a'; 50]; + +fn producer() { + let out = stdout::get_stdout(); + let n = out.check_write().unwrap() as usize; + assert!(n > CHUNK.len()); + out.write(CHUNK).unwrap(); +} + +fn consumer() { + let stdin = stdin::get_stdin(); + let stdin_pollable1 = stdin.subscribe(); + let stdin_pollable2 = stdin.subscribe(); + + // The two pollables are subscribed to the same resource, and must report the same readyness + stdin_pollable1.block(); + assert!(stdin_pollable1.ready() && stdin_pollable2.ready()); + + let bytes = stdin.read(CHUNK.len() as u64).unwrap(); + assert_eq!(&bytes, CHUNK); +} diff --git a/crates/test-programs/src/bin/piped_polling.rs b/crates/test-programs/src/bin/piped_polling.rs new file mode 100644 index 000000000000..05f8b35a8596 --- /dev/null +++ b/crates/test-programs/src/bin/piped_polling.rs @@ -0,0 +1,51 @@ +use test_programs::wasi::cli::{stdin, stdout}; + +fn main() { + match std::env::var("PIPED_SIDE") + .expect("piped tests require the PIPED_SIDE env var") + .as_str() + { + "PRODUCER" => producer(), + "CONSUMER" => consumer(), + side => panic!("unknown piped test side: {side}"), + } +} + +fn producer() { + let out = stdout::get_stdout(); + let out_pollable = out.subscribe(); + + for i in 1..100 { + let message = format!("{i}"); + loop { + let available = out.check_write().unwrap() as usize; + if available >= message.len() { + break; + } + + out_pollable.block(); + assert!(out_pollable.ready()); + } + + out.write(message.as_bytes()).unwrap() + } + + drop(out_pollable); +} + +fn consumer() { + let stdin = stdin::get_stdin(); + let stdin_pollable = stdin.subscribe(); + + for i in 1..100 { + let expected = format!("{i}"); + + stdin_pollable.block(); + assert!(stdin_pollable.ready()); + + let bytes = stdin.read(expected.len() as u64).unwrap(); + assert_eq!(&bytes, expected.as_bytes()); + } + + drop(stdin_pollable); +} diff --git a/crates/test-programs/src/bin/piped_simple.rs b/crates/test-programs/src/bin/piped_simple.rs new file mode 100644 index 000000000000..323e463335aa --- /dev/null +++ b/crates/test-programs/src/bin/piped_simple.rs @@ -0,0 +1,30 @@ +use test_programs::wasi::cli::{stdin, stdout}; + +fn main() { + match std::env::var("PIPED_SIDE") + .expect("piped tests require the PIPED_SIDE env var") + .as_str() + { + "PRODUCER" => producer(), + "CONSUMER" => consumer(), + side => panic!("unknown piped test side: {side}"), + } +} + +const CHUNK: &[u8] = &[b'a'; 50]; + +fn producer() { + let out = stdout::get_stdout(); + let n = out.check_write().unwrap() as usize; + assert!(n > CHUNK.len()); + out.write(CHUNK).unwrap(); +} + +fn consumer() { + let stdin = stdin::get_stdin(); + let stdin_pollable = stdin.subscribe(); + stdin_pollable.block(); + assert!(stdin_pollable.ready()); + let bytes = stdin.read(CHUNK.len() as u64).unwrap(); + assert_eq!(&bytes, CHUNK); +} diff --git a/crates/test-programs/src/bin/preview1_dangling_symlink.rs b/crates/test-programs/src/bin/preview1_dangling_symlink.rs index 8b3fc9bc8a5c..d2f0e37a1c39 100644 --- a/crates/test-programs/src/bin/preview1_dangling_symlink.rs +++ b/crates/test-programs/src/bin/preview1_dangling_symlink.rs @@ -11,14 +11,16 @@ unsafe fn test_dangling_symlink(dir_fd: wasi::Fd) { wasi::path_open(dir_fd, 0, "symlink", wasi::OFLAGS_DIRECTORY, 0, 0, 0) .expect_err("opening a dangling symlink as a directory"), wasi::ERRNO_NOTDIR, - wasi::ERRNO_LOOP + wasi::ERRNO_LOOP, + wasi::ERRNO_NOENT ); // Try to open it as a file with O_NOFOLLOW. assert_errno!( wasi::path_open(dir_fd, 0, "symlink", 0, 0, 0, 0) .expect_err("opening a dangling symlink as a file"), - wasi::ERRNO_LOOP + wasi::ERRNO_LOOP, + wasi::ERRNO_NOENT ); // Clean up. diff --git a/crates/test-programs/src/bin/preview1_fd_filestat_set.rs b/crates/test-programs/src/bin/preview1_fd_filestat_set.rs index b72dec0afe67..d950d7df6d78 100644 --- a/crates/test-programs/src/bin/preview1_fd_filestat_set.rs +++ b/crates/test-programs/src/bin/preview1_fd_filestat_set.rs @@ -1,8 +1,10 @@ -use std::{env, process}; -use test_programs::preview1::open_scratch_directory; +use std::{env, process, time::Duration}; +use test_programs::preview1::{ + assert_errno, assert_fs_time_eq, open_scratch_directory, TestConfig, +}; -unsafe fn test_fd_filestat_set(dir_fd: wasi::Fd) { - // Create a file in the scratch directory. +unsafe fn test_fd_filestat_set_size_rw(dir_fd: wasi::Fd) { + // Create a file in the scratch directory, opened read/write let file_fd = wasi::path_open( dir_fd, 0, @@ -28,22 +30,87 @@ unsafe fn test_fd_filestat_set(dir_fd: wasi::Fd) { let stat = wasi::fd_filestat_get(file_fd).expect("failed filestat 2"); assert_eq!(stat.size, 100, "file size should be 100"); + wasi::fd_close(file_fd).expect("failed to close fd"); + wasi::path_unlink_file(dir_fd, "file").expect("failed to remove file"); +} + +unsafe fn test_fd_filestat_set_size_ro(dir_fd: wasi::Fd) { + // Create a file in the scratch directory. Creating a file implies opening it for writing, so + // we have to close and re-open read-only to observe read-only behavior. + let file_fd = wasi::path_open(dir_fd, 0, "file", wasi::OFLAGS_CREAT, 0, 0, 0) + .expect("failed to create file"); + wasi::fd_close(file_fd).expect("failed to close fd"); + + // Open the created file read-only + let file_fd = wasi::path_open(dir_fd, 0, "file", 0, wasi::RIGHTS_FD_READ, 0, 0) + .expect("failed to create file"); + + // Check file size + let stat = wasi::fd_filestat_get(file_fd).expect("failed filestat"); + assert_eq!(stat.size, 0, "file size should be 0"); + + // Check fd_filestat_set_size on a file opened read-only fails with EINVAL, like ftruncate is defined to do on posix + assert_errno!( + wasi::fd_filestat_set_size(file_fd, 100) + .expect_err("fd_filestat_set_size should error when file is opened read-only"), + windows => wasi::ERRNO_ACCES, + wasi::ERRNO_INVAL + ); + + let stat = wasi::fd_filestat_get(file_fd).expect("failed filestat 2"); + assert_eq!(stat.size, 0, "file size should remain 0"); + + wasi::fd_close(file_fd).expect("failed to close fd"); + wasi::path_unlink_file(dir_fd, "file").expect("failed to remove file"); +} + +unsafe fn test_fd_filestat_set_times(dir_fd: wasi::Fd, rights: wasi::Rights) { + let cfg = TestConfig::from_env(); + + // Create a file in the scratch directory. OFLAGS_CREAT implies opening for writing, so we will + // close it and re-open with the desired rights (FD_READ for read only, FD_READ | FD_WRITE for + // readwrite) + let file_fd = wasi::path_open(dir_fd, 0, "file", wasi::OFLAGS_CREAT, 0, 0, 0) + .expect("failed to create file"); + wasi::fd_close(file_fd).expect("failed to close fd"); + + // Open the file with the rights given. + let file_fd = + wasi::path_open(dir_fd, 0, "file", 0, rights, 0, 0).expect("failed to create file"); + + let stat = wasi::fd_filestat_get(file_fd).expect("failed filestat 2"); + // Check fd_filestat_set_times - let old_atim = stat.atim; - let new_mtim = stat.mtim - 100; - wasi::fd_filestat_set_times(file_fd, new_mtim, new_mtim, wasi::FSTFLAGS_MTIM) - .expect("fd_filestat_set_times"); + let old_atim = Duration::from_nanos(stat.atim); + let new_mtim = Duration::from_nanos(stat.mtim) - cfg.fs_time_precision() * 2; + wasi::fd_filestat_set_times( + file_fd, + new_mtim.as_nanos() as u64, + new_mtim.as_nanos() as u64, + wasi::FSTFLAGS_MTIM, + ) + .expect("fd_filestat_set_times"); let stat = wasi::fd_filestat_get(file_fd).expect("failed filestat 3"); - assert_eq!(stat.size, 100, "file size should remain unchanged at 100"); - assert_eq!(stat.mtim, new_mtim, "mtim should change"); - assert_eq!(stat.atim, old_atim, "atim should not change"); + assert_eq!(stat.size, 0, "file size should remain unchanged at 0"); + + // Support accuracy up to at least 1ms + assert_fs_time_eq!( + Duration::from_nanos(stat.mtim), + new_mtim, + "mtim should change" + ); + assert_fs_time_eq!( + Duration::from_nanos(stat.atim), + old_atim, + "atim should not change" + ); // let status = wasi_fd_filestat_set_times(file_fd, new_mtim, new_mtim, wasi::FILESTAT_SET_MTIM | wasi::FILESTAT_SET_MTIM_NOW); // assert_eq!(status, wasi::EINVAL, "ATIM & ATIM_NOW can't both be set"); wasi::fd_close(file_fd).expect("failed to close fd"); - wasi::path_unlink_file(dir_fd, "file").expect("failed to remove dir"); + wasi::path_unlink_file(dir_fd, "file").expect("failed to remove file"); } fn main() { let mut args = env::args(); @@ -65,5 +132,18 @@ fn main() { }; // Run the tests. - unsafe { test_fd_filestat_set(dir_fd) } + + unsafe { test_fd_filestat_set_size_rw(dir_fd) } + unsafe { test_fd_filestat_set_size_ro(dir_fd) } + + // The fd_filestat_set_times function should behave the same whether the file + // descriptor is open for read-only or read-write, because the underlying + // permissions of the file determine whether or not the filestat can be + // set or not, not than the open mode. + if test_programs::preview1::config().support_dangling_filesystem() { + // Guarding to run on non-windows filesystems. Windows rejects set-times on read-only + // files. + unsafe { test_fd_filestat_set_times(dir_fd, wasi::RIGHTS_FD_READ) } + } + unsafe { test_fd_filestat_set_times(dir_fd, wasi::RIGHTS_FD_READ | wasi::RIGHTS_FD_WRITE) } } diff --git a/crates/test-programs/src/bin/preview1_file_pread_pwrite.rs b/crates/test-programs/src/bin/preview1_file_pread_pwrite.rs index ef55362d0288..9651dcebd648 100644 --- a/crates/test-programs/src/bin/preview1_file_pread_pwrite.rs +++ b/crates/test-programs/src/bin/preview1_file_pread_pwrite.rs @@ -128,6 +128,55 @@ unsafe fn test_file_pread_pwrite(dir_fd: wasi::Fd) { wasi::path_unlink_file(dir_fd, "file").expect("removing a file"); } +unsafe fn test_file_pwrite_and_file_pos(dir_fd: wasi::Fd) { + let path = "file2"; + let file_fd = wasi::path_open( + dir_fd, + 0, + path, + wasi::OFLAGS_CREAT, + wasi::RIGHTS_FD_READ | wasi::RIGHTS_FD_WRITE, + 0, + 0, + ) + .expect("opening a file"); + assert!( + file_fd > libc::STDERR_FILENO as wasi::Fd, + "file descriptor range check", + ); + + // Perform a 0-sized pwrite at an offset beyond the end of the file. Unix + // semantics should pop out where nothing is actually written and the size + // of the file isn't modified. + assert_eq!(wasi::fd_tell(file_fd).unwrap(), 0); + let ciovec = wasi::Ciovec { + buf: [].as_ptr(), + buf_len: 0, + }; + let n = wasi::fd_pwrite(file_fd, &mut [ciovec], 50).expect("writing bytes at offset 2"); + assert_eq!(n, 0); + + assert_eq!(wasi::fd_tell(file_fd).unwrap(), 0); + let stat = wasi::fd_filestat_get(file_fd).unwrap(); + assert_eq!(stat.size, 0); + + // Now write a single byte and make sure it actually works + let buf = [0]; + let ciovec = wasi::Ciovec { + buf: buf.as_ptr(), + buf_len: buf.len(), + }; + let n = wasi::fd_pwrite(file_fd, &mut [ciovec], 50).expect("writing bytes at offset 2"); + assert_eq!(n, 1); + + assert_eq!(wasi::fd_tell(file_fd).unwrap(), 0); + let stat = wasi::fd_filestat_get(file_fd).unwrap(); + assert_eq!(stat.size, 51); + + wasi::fd_close(file_fd).expect("closing a file"); + wasi::path_unlink_file(dir_fd, path).expect("removing a file"); +} + fn main() { let mut args = env::args(); let prog = args.next().unwrap(); @@ -148,5 +197,8 @@ fn main() { }; // Run the tests. - unsafe { test_file_pread_pwrite(dir_fd) } + unsafe { + test_file_pread_pwrite(dir_fd); + test_file_pwrite_and_file_pos(dir_fd); + } } diff --git a/crates/test-programs/src/bin/preview1_file_seek_tell.rs b/crates/test-programs/src/bin/preview1_file_seek_tell.rs index 70bd6e9b9498..8283d6343b27 100644 --- a/crates/test-programs/src/bin/preview1_file_seek_tell.rs +++ b/crates/test-programs/src/bin/preview1_file_seek_tell.rs @@ -79,6 +79,48 @@ unsafe fn test_file_seek_tell(dir_fd: wasi::Fd) { wasi::fd_close(file_fd).expect("closing a file"); wasi::path_unlink_file(dir_fd, "file").expect("deleting a file"); } + +// Test that when a file is opened with `O_APPEND` that acquiring the current +// position indicates the end of the file. +unsafe fn seek_and_o_append(dir_fd: wasi::Fd) { + let path = "file2"; + let file_fd = wasi::path_open( + dir_fd, + 0, + path, + wasi::OFLAGS_CREAT, + wasi::RIGHTS_FD_READ | wasi::RIGHTS_FD_WRITE, + 0, + wasi::FDFLAGS_APPEND, + ) + .expect("opening a file"); + assert!( + file_fd > libc::STDERR_FILENO as wasi::Fd, + "file descriptor range check", + ); + + let mut offset = wasi::fd_seek(file_fd, 0, wasi::WHENCE_CUR).unwrap(); + assert_eq!(offset, 0); + offset = wasi::fd_tell(file_fd).unwrap(); + assert_eq!(offset, 0); + + let data = &[0u8; 100]; + let iov = wasi::Ciovec { + buf: data.as_ptr() as *const _, + buf_len: data.len(), + }; + let nwritten = wasi::fd_write(file_fd, &[iov]).unwrap(); + assert_eq!(nwritten, 100); + + let mut offset = wasi::fd_seek(file_fd, 0, wasi::WHENCE_CUR).unwrap(); + assert_eq!(offset, 100); + offset = wasi::fd_tell(file_fd).unwrap(); + assert_eq!(offset, 100); + + wasi::fd_close(file_fd).unwrap(); + wasi::path_unlink_file(dir_fd, path).unwrap(); +} + fn main() { let mut args = env::args(); let prog = args.next().unwrap(); @@ -99,5 +141,8 @@ fn main() { }; // Run the tests. - unsafe { test_file_seek_tell(dir_fd) } + unsafe { + test_file_seek_tell(dir_fd); + seek_and_o_append(dir_fd); + } } diff --git a/crates/test-programs/src/bin/preview1_interesting_paths.rs b/crates/test-programs/src/bin/preview1_interesting_paths.rs index 264388233249..6ea1e5258bd7 100644 --- a/crates/test-programs/src/bin/preview1_interesting_paths.rs +++ b/crates/test-programs/src/bin/preview1_interesting_paths.rs @@ -35,12 +35,12 @@ unsafe fn test_interesting_paths(dir_fd: wasi::Fd, arg: &str) { ); wasi::fd_close(file_fd).expect("closing a file"); - // Now open it with a trailing NUL. + // Now open it with a trailing NUL. Windows will allow this. assert_errno!( wasi::path_open(dir_fd, 0, "dir/nested/file\0", 0, 0, 0, 0) .expect_err("opening a file with a trailing NUL"), - wasi::ERRNO_INVAL, - wasi::ERRNO_ILSEQ + unix => wasi::ERRNO_INVAL, + windows => wasi::ERRNO_NOENT ); // Now open it with a trailing slash. diff --git a/crates/test-programs/src/bin/preview1_path_filestat.rs b/crates/test-programs/src/bin/preview1_path_filestat.rs index 9901dba3546e..084a991eb8f1 100644 --- a/crates/test-programs/src/bin/preview1_path_filestat.rs +++ b/crates/test-programs/src/bin/preview1_path_filestat.rs @@ -1,12 +1,11 @@ -use std::{env, process}; -use test_programs::preview1::{assert_errno, config, open_scratch_directory}; +use std::{env, process, time::Duration}; +use test_programs::preview1::{ + assert_errno, assert_fs_time_eq, open_scratch_directory, TestConfig, +}; unsafe fn test_path_filestat(dir_fd: wasi::Fd) { - let fdflags = if config().support_fdflags_sync() { - wasi::FDFLAGS_APPEND | wasi::FDFLAGS_SYNC - } else { - wasi::FDFLAGS_APPEND - }; + let cfg = TestConfig::from_env(); + let fdflags = wasi::FDFLAGS_APPEND; // Create a file in the scratch directory. let file_fd = wasi::path_open( @@ -31,42 +30,44 @@ unsafe fn test_path_filestat(dir_fd: wasi::Fd) { wasi::FDFLAGS_APPEND, "file should have the APPEND fdflag used to create the file" ); - if config().support_fdflags_sync() { - assert_eq!( - fdstat.fs_flags & wasi::FDFLAGS_SYNC, + assert_errno!( + wasi::path_open( + dir_fd, + 0, + "file", + 0, + wasi::RIGHTS_FD_READ | wasi::RIGHTS_FD_WRITE, + 0, wasi::FDFLAGS_SYNC, - "file should have the SYNC fdflag used to create the file" - ); - } - - if !config().support_fdflags_sync() { - assert_errno!( - wasi::path_open( - dir_fd, - 0, - "file", - 0, - wasi::RIGHTS_FD_READ | wasi::RIGHTS_FD_WRITE, - 0, - wasi::FDFLAGS_SYNC, - ) - .expect_err("FDFLAGS_SYNC not supported by platform"), - wasi::ERRNO_NOTSUP - ); - } + ) + .expect_err("FDFLAGS_SYNC not supported by platform"), + wasi::ERRNO_NOTSUP + ); // Check file size let file_stat = wasi::path_filestat_get(dir_fd, 0, "file").expect("reading file stats"); assert_eq!(file_stat.size, 0, "file size should be 0"); // Check path_filestat_set_times - let new_mtim = file_stat.mtim - 100; - wasi::path_filestat_set_times(dir_fd, 0, "file", 0, new_mtim, wasi::FSTFLAGS_MTIM) - .expect("path_filestat_set_times should succeed"); + let new_mtim = Duration::from_nanos(file_stat.mtim) - 2 * cfg.fs_time_precision(); + wasi::path_filestat_set_times( + dir_fd, + 0, + "file", + 0, + new_mtim.as_nanos() as u64, + wasi::FSTFLAGS_MTIM, + ) + .expect("path_filestat_set_times should succeed"); let modified_file_stat = wasi::path_filestat_get(dir_fd, 0, "file") .expect("reading file stats after path_filestat_set_times"); - assert_eq!(modified_file_stat.mtim, new_mtim, "mtim should change"); + + assert_fs_time_eq!( + Duration::from_nanos(modified_file_stat.mtim), + new_mtim, + "mtim should change" + ); assert_errno!( wasi::path_filestat_set_times( @@ -74,7 +75,7 @@ unsafe fn test_path_filestat(dir_fd: wasi::Fd) { 0, "file", 0, - new_mtim, + new_mtim.as_nanos() as u64, wasi::FSTFLAGS_MTIM | wasi::FSTFLAGS_MTIM_NOW, ) .expect_err("MTIM and MTIM_NOW can't both be set"), @@ -84,8 +85,10 @@ unsafe fn test_path_filestat(dir_fd: wasi::Fd) { // check if the times were untouched let unmodified_file_stat = wasi::path_filestat_get(dir_fd, 0, "file") .expect("reading file stats after ERRNO_INVAL fd_filestat_set_times"); - assert_eq!( - unmodified_file_stat.mtim, new_mtim, + + assert_fs_time_eq!( + Duration::from_nanos(unmodified_file_stat.mtim), + new_mtim, "mtim should not change" ); diff --git a/crates/test-programs/src/bin/preview1_path_link.rs b/crates/test-programs/src/bin/preview1_path_link.rs index b087e0740003..cc14a0a01ac5 100644 --- a/crates/test-programs/src/bin/preview1_path_link.rs +++ b/crates/test-programs/src/bin/preview1_path_link.rs @@ -1,89 +1,82 @@ use std::{env, process}; use test_programs::preview1::{assert_errno, config, create_file, open_scratch_directory}; -unsafe fn create_or_open(dir_fd: wasi::Fd, name: &str, flags: wasi::Oflags) -> wasi::Fd { - let file_fd = wasi::path_open(dir_fd, 0, name, flags, 0, 0, 0) - .unwrap_or_else(|_| panic!("opening '{}'", name)); - assert!( - file_fd > libc::STDERR_FILENO as wasi::Fd, - "file descriptor range check", - ); - file_fd -} - -unsafe fn open_link(dir_fd: wasi::Fd, name: &str) -> wasi::Fd { - let file_fd = wasi::path_open(dir_fd, 0, name, 0, 0, 0, 0) - .unwrap_or_else(|_| panic!("opening a link '{}'", name)); - assert!( - file_fd > libc::STDERR_FILENO as wasi::Fd, - "file descriptor range check", - ); - file_fd -} - -// This is temporary until `wasi` implements `Debug` and `PartialEq` for -// `wasi::Filestat`. -fn filestats_assert_eq(left: wasi::Filestat, right: wasi::Filestat) { - assert_eq!(left.dev, right.dev, "dev should be equal"); - assert_eq!(left.ino, right.ino, "ino should be equal"); - assert_eq!(left.atim, right.atim, "atim should be equal"); - assert_eq!(left.ctim, right.ctim, "ctim should be equal"); - assert_eq!(left.mtim, right.mtim, "mtim should be equal"); - assert_eq!(left.size, right.size, "size should be equal"); - assert_eq!(left.nlink, right.nlink, "nlink should be equal"); - assert_eq!(left.filetype, right.filetype, "filetype should be equal"); +// These are all macro-rules so the panic line number shows us where +// things went wrong. + +macro_rules! filestats_assert_eq { + ($left:ident, $right:ident) => { + assert_eq!($left.dev, $right.dev, "dev should be equal"); + assert_eq!($left.ino, $right.ino, "ino should be equal"); + assert_eq!($left.atim, $right.atim, "atim should be equal"); + assert_eq!($left.ctim, $right.ctim, "ctim should be equal"); + assert_eq!($left.mtim, $right.mtim, "mtim should be equal"); + assert_eq!($left.size, $right.size, "size should be equal"); + assert_eq!($left.nlink, $right.nlink, "nlink should be equal"); + assert_eq!($left.filetype, $right.filetype, "filetype should be equal"); + }; } -// This is temporary until `wasi` implements `Debug` and `PartialEq` for -// `wasi::Fdstat`. -fn fdstats_assert_eq(left: wasi::Fdstat, right: wasi::Fdstat) { - assert_eq!(left.fs_flags, right.fs_flags, "fs_flags should be equal"); - assert_eq!( - left.fs_filetype, right.fs_filetype, - "fs_filetype should be equal" - ); - assert_eq!( - left.fs_rights_base, right.fs_rights_base, - "fs_rights_base should be equal" - ); - assert_eq!( - left.fs_rights_inheriting, right.fs_rights_inheriting, - "fs_rights_inheriting should be equal" - ); +macro_rules! fdstats_assert_eq { + ($left:ident, $right:ident) => { + assert_eq!($left.fs_flags, $right.fs_flags, "fs_flags should be equal"); + assert_eq!( + $left.fs_filetype, $right.fs_filetype, + "fs_filetype should be equal" + ); + assert_eq!( + $left.fs_rights_base, $right.fs_rights_base, + "fs_rights_base should be equal" + ); + assert_eq!( + $left.fs_rights_inheriting, $right.fs_rights_inheriting, + "fs_rights_inheriting should be equal" + ); + }; } -unsafe fn check_rights(orig_fd: wasi::Fd, link_fd: wasi::Fd) { - // Compare Filestats - let orig_filestat = wasi::fd_filestat_get(orig_fd).expect("reading filestat of the source"); - let link_filestat = wasi::fd_filestat_get(link_fd).expect("reading filestat of the link"); - filestats_assert_eq(orig_filestat, link_filestat); - - // Compare Fdstats - let orig_fdstat = wasi::fd_fdstat_get(orig_fd).expect("reading fdstat of the source"); - let link_fdstat = wasi::fd_fdstat_get(link_fd).expect("reading fdstat of the link"); - fdstats_assert_eq(orig_fdstat, link_fdstat); +macro_rules! check_rights { + ($orig_fd:ident, $link_fd:ident) => { + let orig_filestat = + wasi::fd_filestat_get($orig_fd).expect("reading filestat of the source"); + let link_filestat = wasi::fd_filestat_get($link_fd).expect("reading filestat of the link"); + filestats_assert_eq!(orig_filestat, link_filestat); + + // Compare Fdstats + let orig_fdstat = wasi::fd_fdstat_get($orig_fd).expect("reading fdstat of the source"); + let link_fdstat = wasi::fd_fdstat_get($link_fd).expect("reading fdstat of the link"); + fdstats_assert_eq!(orig_fdstat, link_fdstat); + }; } - // Extra calls of fd_close are needed for Windows, which will not remove // the directory until all handles are closed. unsafe fn test_path_link(dir_fd: wasi::Fd) { // Create a file - let file_fd = create_or_open(dir_fd, "file", wasi::OFLAGS_CREAT); + let create_fd = + wasi::path_open(dir_fd, 0, "file", wasi::OFLAGS_CREAT, 0, 0, 0).expect("create file"); + wasi::fd_close(create_fd).unwrap(); + + // Open a fresh descriptor to the file. We won't have a write right that was implied by OFLAGS_CREAT + // above. + let file_fd = wasi::path_open(dir_fd, 0, "file", 0, 0, 0, 0).expect("open file"); // Create a link in the same directory and compare rights wasi::path_link(dir_fd, 0, "file", dir_fd, "link") .expect("creating a link in the same directory"); - let link_fd = open_link(dir_fd, "link"); - check_rights(file_fd, link_fd); + + let link_fd = wasi::path_open(dir_fd, 0, "link", 0, 0, 0, 0).expect("open link"); + + check_rights!(file_fd, link_fd); wasi::fd_close(link_fd).expect("Closing link_fd"); // needed for Windows wasi::path_unlink_file(dir_fd, "link").expect("removing a link"); // Create a link in a different directory and compare rights wasi::path_create_directory(dir_fd, "subdir").expect("creating a subdirectory"); - let subdir_fd = create_or_open(dir_fd, "subdir", wasi::OFLAGS_DIRECTORY); + let subdir_fd = wasi::path_open(dir_fd, 0, "subdir", wasi::OFLAGS_DIRECTORY, 0, 0, 0) + .expect("open subdir directory"); wasi::path_link(dir_fd, 0, "file", subdir_fd, "link").expect("creating a link in subdirectory"); - let link_fd = open_link(subdir_fd, "link"); - check_rights(file_fd, link_fd); + let link_fd = wasi::path_open(subdir_fd, 0, "link", 0, 0, 0, 0).expect("open link in subdir"); + check_rights!(file_fd, link_fd); wasi::fd_close(link_fd).expect("Closing link_fd"); // needed for Windows wasi::path_unlink_file(subdir_fd, "link").expect("removing a link"); wasi::fd_close(subdir_fd).expect("Closing subdir_fd"); // needed for Windows @@ -118,7 +111,8 @@ unsafe fn test_path_link(dir_fd: wasi::Fd) { // Create a link to a directory wasi::path_create_directory(dir_fd, "subdir").expect("creating a subdirectory"); - let subdir_fd = create_or_open(dir_fd, "subdir", wasi::OFLAGS_DIRECTORY); + let subdir_fd = wasi::path_open(dir_fd, 0, "subdir", wasi::OFLAGS_DIRECTORY, 0, 0, 0) + .expect("open new descriptor to subdir"); assert_errno!( wasi::path_link(dir_fd, 0, "subdir", dir_fd, "link") diff --git a/crates/test-programs/src/bin/preview1_path_open_lots.rs b/crates/test-programs/src/bin/preview1_path_open_lots.rs new file mode 100644 index 000000000000..df163f95c3c7 --- /dev/null +++ b/crates/test-programs/src/bin/preview1_path_open_lots.rs @@ -0,0 +1,107 @@ +use std::{env, process}; +use test_programs::preview1::{create_file, open_scratch_directory}; + +unsafe fn test_path_open_lots(dir_fd: wasi::Fd) { + create_file(dir_fd, "file"); + + for _ in 0..2000 { + let f_readonly = wasi::path_open(dir_fd, 0, "file", 0, wasi::RIGHTS_FD_READ, 0, 0) + .expect("open file readonly"); + + let buffer = &mut [0u8; 100]; + let iovec = wasi::Iovec { + buf: buffer.as_mut_ptr(), + buf_len: buffer.len(), + }; + let nread = wasi::fd_read(f_readonly, &[iovec]).expect("reading readonly file"); + assert_eq!(nread, 0, "readonly file is empty"); + + wasi::fd_close(f_readonly).expect("close readonly"); + } + + for _ in 0..2000 { + let f_readonly = wasi::path_open(dir_fd, 0, "file", 0, wasi::RIGHTS_FD_READ, 0, 0) + .expect("open file readonly"); + + let buffer = &mut [0u8; 100]; + let iovec = wasi::Iovec { + buf: buffer.as_mut_ptr(), + buf_len: buffer.len(), + }; + let nread = wasi::fd_pread(f_readonly, &[iovec], 0).expect("reading readonly file"); + assert_eq!(nread, 0, "readonly file is empty"); + + wasi::fd_close(f_readonly).expect("close readonly"); + } + + for _ in 0..2000 { + let f = wasi::path_open( + dir_fd, + 0, + "file", + 0, + wasi::RIGHTS_FD_READ | wasi::RIGHTS_FD_WRITE, + 0, + 0, + ) + .unwrap(); + + let buffer = &[0u8; 100]; + let ciovec = wasi::Ciovec { + buf: buffer.as_ptr(), + buf_len: buffer.len(), + }; + let nwritten = wasi::fd_write(f, &[ciovec]).expect("write failed"); + assert_eq!(nwritten, 100); + + wasi::fd_close(f).unwrap(); + } + + for _ in 0..2000 { + let f = wasi::path_open( + dir_fd, + 0, + "file", + 0, + wasi::RIGHTS_FD_READ | wasi::RIGHTS_FD_WRITE, + 0, + 0, + ) + .unwrap(); + + let buffer = &[0u8; 100]; + let ciovec = wasi::Ciovec { + buf: buffer.as_ptr(), + buf_len: buffer.len(), + }; + let nwritten = wasi::fd_pwrite(f, &[ciovec], 0).expect("write failed"); + assert_eq!(nwritten, 100); + + wasi::fd_close(f).unwrap(); + } + + wasi::path_unlink_file(dir_fd, "file").expect("removing a file"); +} + +fn main() { + let mut args = env::args(); + let prog = args.next().unwrap(); + let arg = if let Some(arg) = args.next() { + arg + } else { + eprintln!("usage: {} ", prog); + process::exit(1); + }; + + // Open scratch directory + let dir_fd = match open_scratch_directory(&arg) { + Ok(dir_fd) => dir_fd, + Err(err) => { + eprintln!("{}", err); + process::exit(1) + } + }; + + // Run the tests. + unsafe { test_path_open_lots(dir_fd) } +} diff --git a/crates/test-programs/src/bin/preview1_path_open_read_write.rs b/crates/test-programs/src/bin/preview1_path_open_read_write.rs index 3d19daffcbd9..ccee4f5d626c 100644 --- a/crates/test-programs/src/bin/preview1_path_open_read_write.rs +++ b/crates/test-programs/src/bin/preview1_path_open_read_write.rs @@ -30,10 +30,14 @@ unsafe fn test_path_open_read_write(dir_fd: wasi::Fd) { buf: write_buffer.as_ptr(), buf_len: write_buffer.len(), }; + // PERM is only the failure on windows under wasmtime-wasi. wasi-common + // fails on windows with BADF, so we cant use the `windows =>` syntax + // because that doesnt support alternatives like the agnostic syntax does. assert_errno!( wasi::fd_write(f_readonly, &[ciovec]) .err() .expect("read of writeonly fails"), + wasi::ERRNO_PERM, wasi::ERRNO_BADF ); @@ -53,10 +57,12 @@ unsafe fn test_path_open_read_write(dir_fd: wasi::Fd) { "writeonly has write right" ); + // See above for description of PERM assert_errno!( wasi::fd_read(f_writeonly, &[iovec]) .err() .expect("read of writeonly fails"), + wasi::ERRNO_PERM, wasi::ERRNO_BADF ); let bytes_written = wasi::fd_write(f_writeonly, &[ciovec]).expect("write to writeonly"); diff --git a/crates/test-programs/src/bin/preview1_path_rename_file_trailing_slashes.rs b/crates/test-programs/src/bin/preview1_path_rename_file_trailing_slashes.rs deleted file mode 100644 index 2602195558d4..000000000000 --- a/crates/test-programs/src/bin/preview1_path_rename_file_trailing_slashes.rs +++ /dev/null @@ -1,53 +0,0 @@ -use std::{env, process}; -use test_programs::preview1::{assert_errno, create_file, open_scratch_directory}; - -unsafe fn test_path_rename_trailing_slashes(dir_fd: wasi::Fd) { - // Test renaming a file with a trailing slash in the name. - create_file(dir_fd, "source"); - - wasi::path_rename(dir_fd, "source", dir_fd, "target") - .expect("no trailing slashes rename works"); - wasi::path_rename(dir_fd, "target", dir_fd, "source").expect("rename it back to source"); - - assert_errno!( - wasi::path_rename(dir_fd, "source/", dir_fd, "target") - .expect_err("renaming a file with a trailing slash in the source name should fail"), - wasi::ERRNO_NOTDIR - ); - assert_errno!( - wasi::path_rename(dir_fd, "source", dir_fd, "target/").expect_err( - "renaming a file with a trailing slash in the destination name should fail" - ), - wasi::ERRNO_NOTDIR - ); - assert_errno!( - wasi::path_rename(dir_fd, "source/", dir_fd, "target/").expect_err( - "renaming a file with a trailing slash in the source and destination names should fail" - ), - wasi::ERRNO_NOTDIR - ); - wasi::path_unlink_file(dir_fd, "source").expect("removing a file"); -} - -fn main() { - let mut args = env::args(); - let prog = args.next().unwrap(); - let arg = if let Some(arg) = args.next() { - arg - } else { - eprintln!("usage: {} ", prog); - process::exit(1); - }; - - // Open scratch directory - let dir_fd = match open_scratch_directory(&arg) { - Ok(dir_fd) => dir_fd, - Err(err) => { - eprintln!("{}", err); - process::exit(1) - } - }; - - // Run the tests. - unsafe { test_path_rename_trailing_slashes(dir_fd) } -} diff --git a/crates/test-programs/src/bin/preview1_remove_directory_trailing_slashes.rs b/crates/test-programs/src/bin/preview1_remove_directory.rs similarity index 75% rename from crates/test-programs/src/bin/preview1_remove_directory_trailing_slashes.rs rename to crates/test-programs/src/bin/preview1_remove_directory.rs index c9e73b930fbf..60b671fdffa8 100644 --- a/crates/test-programs/src/bin/preview1_remove_directory_trailing_slashes.rs +++ b/crates/test-programs/src/bin/preview1_remove_directory.rs @@ -1,7 +1,7 @@ use std::{env, process}; use test_programs::preview1::{assert_errno, create_file, open_scratch_directory}; -unsafe fn test_remove_directory_trailing_slashes(dir_fd: wasi::Fd) { +unsafe fn test_remove_directory(dir_fd: wasi::Fd) { // Create a directory in the scratch directory. wasi::path_create_directory(dir_fd, "dir").expect("creating a directory"); @@ -9,11 +9,9 @@ unsafe fn test_remove_directory_trailing_slashes(dir_fd: wasi::Fd) { wasi::path_remove_directory(dir_fd, "dir") .expect("remove_directory on a directory should succeed"); - wasi::path_create_directory(dir_fd, "dir").expect("creating a directory"); - - // Test that removing it with a trailing slash succeeds. - wasi::path_remove_directory(dir_fd, "dir/") - .expect("remove_directory with a trailing slash on a directory should succeed"); + // There isn't consistient behavior across operating systems of whether removing with a + // directory where the path has a trailing slash succeeds or fails, so we won't test + // that behavior. // Create a temporary file. create_file(dir_fd, "file"); @@ -29,8 +27,7 @@ unsafe fn test_remove_directory_trailing_slashes(dir_fd: wasi::Fd) { assert_errno!( wasi::path_remove_directory(dir_fd, "file/") .expect_err("remove_directory with a trailing slash on a file should fail"), - unix => wasi::ERRNO_NOTDIR, - windows => wasi::ERRNO_NOENT + wasi::ERRNO_NOTDIR ); wasi::path_unlink_file(dir_fd, "file").expect("removing a file"); @@ -56,5 +53,5 @@ fn main() { }; // Run the tests. - unsafe { test_remove_directory_trailing_slashes(dir_fd) } + unsafe { test_remove_directory(dir_fd) } } diff --git a/crates/test-programs/src/bin/preview1_stdio_isatty.rs b/crates/test-programs/src/bin/preview1_stdio_isatty.rs index 7b0f37708e93..4f1785e31f10 100644 --- a/crates/test-programs/src/bin/preview1_stdio_isatty.rs +++ b/crates/test-programs/src/bin/preview1_stdio_isatty.rs @@ -1,19 +1,7 @@ unsafe fn test_stdio_isatty() { - assert_eq!( - libc::isatty(libc::STDIN_FILENO as std::os::raw::c_int), - 1, - "stdin is a tty" - ); - assert_eq!( - libc::isatty(libc::STDOUT_FILENO as std::os::raw::c_int), - 1, - "stdout is a tty" - ); - assert_eq!( - libc::isatty(libc::STDERR_FILENO as std::os::raw::c_int), - 1, - "stderr is a tty" - ); + assert_eq!(libc::isatty(libc::STDIN_FILENO), 1, "stdin is a tty"); + assert_eq!(libc::isatty(libc::STDOUT_FILENO), 1, "stdout is a tty"); + assert_eq!(libc::isatty(libc::STDERR_FILENO), 1, "stderr is a tty"); } fn main() { diff --git a/crates/test-programs/src/bin/preview1_stdio_not_isatty.rs b/crates/test-programs/src/bin/preview1_stdio_not_isatty.rs index c67d3cf3bfb1..aed1046aacb7 100644 --- a/crates/test-programs/src/bin/preview1_stdio_not_isatty.rs +++ b/crates/test-programs/src/bin/preview1_stdio_not_isatty.rs @@ -1,19 +1,7 @@ unsafe fn test_stdio_not_isatty() { - assert_eq!( - libc::isatty(libc::STDIN_FILENO as std::os::raw::c_int), - 0, - "stdin is not a tty" - ); - assert_eq!( - libc::isatty(libc::STDOUT_FILENO as std::os::raw::c_int), - 0, - "stdout is not a tty" - ); - assert_eq!( - libc::isatty(libc::STDERR_FILENO as std::os::raw::c_int), - 0, - "stderr is not a tty" - ); + assert_eq!(libc::isatty(libc::STDIN_FILENO), 0, "stdin is not a tty"); + assert_eq!(libc::isatty(libc::STDOUT_FILENO), 0, "stdout is not a tty"); + assert_eq!(libc::isatty(libc::STDERR_FILENO), 0, "stderr is not a tty"); } fn main() { diff --git a/crates/test-programs/src/bin/preview1_symlink_filestat.rs b/crates/test-programs/src/bin/preview1_symlink_filestat.rs index 377c68e9398e..ad3cd22f18af 100644 --- a/crates/test-programs/src/bin/preview1_symlink_filestat.rs +++ b/crates/test-programs/src/bin/preview1_symlink_filestat.rs @@ -1,7 +1,8 @@ -use std::{env, process}; -use test_programs::preview1::open_scratch_directory; +use std::{env, process, time::Duration}; +use test_programs::preview1::{assert_fs_time_eq, open_scratch_directory, TestConfig}; unsafe fn test_path_filestat(dir_fd: wasi::Fd) { + let cfg = TestConfig::from_env(); // Create a file in the scratch directory. let file_fd = wasi::path_open( dir_fd, @@ -29,21 +30,31 @@ unsafe fn test_path_filestat(dir_fd: wasi::Fd) { let sym_stat = wasi::path_filestat_get(dir_fd, 0, "symlink").expect("reading symlink stats"); // Modify mtim of symlink - let sym_new_mtim = sym_stat.mtim - 200; - wasi::path_filestat_set_times(dir_fd, 0, "symlink", 0, sym_new_mtim, wasi::FSTFLAGS_MTIM) - .expect("path_filestat_set_times should succeed on symlink"); + let sym_new_mtim = Duration::from_nanos(sym_stat.mtim) - cfg.fs_time_precision() * 2; + wasi::path_filestat_set_times( + dir_fd, + 0, + "symlink", + 0, + sym_new_mtim.as_nanos() as u64, + wasi::FSTFLAGS_MTIM, + ) + .expect("path_filestat_set_times should succeed on symlink"); // Check that symlink mtim motification worked let modified_sym_stat = wasi::path_filestat_get(dir_fd, 0, "symlink") .expect("reading file stats after path_filestat_set_times"); - assert_eq!( - modified_sym_stat.mtim, sym_new_mtim, + + assert_fs_time_eq!( + Duration::from_nanos(modified_sym_stat.mtim), + sym_new_mtim, "symlink mtim should change" ); // Check that pointee mtim is not modified let unmodified_file_stat = wasi::path_filestat_get(dir_fd, 0, "file") .expect("reading file stats after path_filestat_set_times"); + assert_eq!( unmodified_file_stat.mtim, file_stat.mtim, "file mtim should not change" @@ -71,7 +82,12 @@ unsafe fn test_path_filestat(dir_fd: wasi::Fd) { let new_file_stat = wasi::path_filestat_get(dir_fd, 0, "file") .expect("reading file stats after path_filestat_set_times"); - assert_eq!(new_file_stat.mtim, sym_stat.mtim, "mtim should change"); + + assert_fs_time_eq!( + Duration::from_nanos(new_file_stat.mtim), + Duration::from_nanos(sym_stat.mtim), + "mtim should change" + ); wasi::fd_close(file_fd).expect("closing a file"); wasi::path_unlink_file(dir_fd, "symlink").expect("removing a symlink"); diff --git a/crates/test-programs/src/bin/preview2_adapter_badfd.rs b/crates/test-programs/src/bin/preview2_adapter_badfd.rs new file mode 100644 index 000000000000..e437dd668dcc --- /dev/null +++ b/crates/test-programs/src/bin/preview2_adapter_badfd.rs @@ -0,0 +1,46 @@ +fn main() { + #[link(wasm_import_module = "wasi_snapshot_preview1")] + extern "C" { + #[cfg_attr(target_arch = "wasm32", link_name = "adapter_open_badfd")] + fn adapter_open_badfd(fd: *mut u32) -> wasi::Errno; + + #[cfg_attr(target_arch = "wasm32", link_name = "adapter_close_badfd")] + fn adapter_close_badfd(fd: u32) -> wasi::Errno; + } + + unsafe { + let mut fd = 0; + assert_eq!(adapter_open_badfd(&mut fd), wasi::ERRNO_SUCCESS); + + assert_eq!(wasi::fd_close(fd), Err(wasi::ERRNO_BADF)); + + assert_eq!(wasi::fd_fdstat_get(fd).map(drop), Err(wasi::ERRNO_BADF)); + + assert_eq!(wasi::fd_fdstat_set_rights(fd, 0, 0), Err(wasi::ERRNO_BADF)); + + let mut buffer = [0_u8; 1]; + assert_eq!( + wasi::fd_read( + fd, + &[wasi::Iovec { + buf: buffer.as_mut_ptr(), + buf_len: 1 + }] + ), + Err(wasi::ERRNO_BADF) + ); + + assert_eq!( + wasi::fd_write( + fd, + &[wasi::Ciovec { + buf: buffer.as_ptr(), + buf_len: 1 + }] + ), + Err(wasi::ERRNO_BADF) + ); + + assert_eq!(adapter_close_badfd(fd), wasi::ERRNO_SUCCESS); + } +} diff --git a/crates/test-programs/src/bin/preview2_ip_name_lookup.rs b/crates/test-programs/src/bin/preview2_ip_name_lookup.rs index dbad2e807d65..f62f48cbc226 100644 --- a/crates/test-programs/src/bin/preview2_ip_name_lookup.rs +++ b/crates/test-programs/src/bin/preview2_ip_name_lookup.rs @@ -1,5 +1,5 @@ +use test_programs::wasi::sockets::instance_network::Network; use test_programs::wasi::sockets::network::{ErrorCode, IpAddress}; -use test_programs::wasi::sockets::*; fn main() { // Valid domains @@ -50,19 +50,7 @@ fn main() { } fn resolve(name: &str) -> Result, ErrorCode> { - let network = instance_network::instance_network(); - - match network.blocking_resolve_addresses(name) { - // The following error codes signal that the input passed validation - // and a lookup was actually attempted, but failed. Ignore these to - // make the CI tests less flaky: - Err( - ErrorCode::NameUnresolvable - | ErrorCode::TemporaryResolverFailure - | ErrorCode::PermanentResolverFailure, - ) => Ok(vec![]), - r => r, - } + Network::default().permissive_blocking_resolve_addresses(name) } fn resolve_one(name: &str) -> Result { diff --git a/crates/test-programs/src/bin/preview2_random.rs b/crates/test-programs/src/bin/preview2_random.rs index 663a01590fbd..491037d65794 100644 --- a/crates/test-programs/src/bin/preview2_random.rs +++ b/crates/test-programs/src/bin/preview2_random.rs @@ -1,6 +1,40 @@ +use test_programs::wasi::random; + fn main() { let mut bytes = [0_u8; 256]; getrandom::getrandom(&mut bytes).unwrap(); assert!(bytes.iter().any(|x| *x != 0)); + + // Acquired random bytes should be of the expected length. + let array = random::random::get_random_bytes(100); + assert_eq!(array.len(), 100); + + // It shouldn't take 100+ tries to get a nonzero random integer. + for i in 0.. { + if random::random::get_random_u64() == 0 { + continue; + } + assert!(i < 100); + break; + } + + // The `insecure_seed` API should return the same result each time. + let (a1, b1) = random::insecure_seed::insecure_seed(); + let (a2, b2) = random::insecure_seed::insecure_seed(); + assert_eq!(a1, a2); + assert_eq!(b1, b2); + + // Acquired random bytes should be of the expected length. + let array = random::insecure::get_insecure_random_bytes(100); + assert_eq!(array.len(), 100); + + // It shouldn't take 100+ tries to get a nonzero random integer. + for i in 0.. { + if random::insecure::get_insecure_random_u64() == 0 { + continue; + } + assert!(i < 100); + break; + } } diff --git a/crates/test-programs/src/bin/preview2_stream_pollable_correct.rs b/crates/test-programs/src/bin/preview2_stream_pollable_correct.rs index 044ebb336aa9..7b2247764fc9 100644 --- a/crates/test-programs/src/bin/preview2_stream_pollable_correct.rs +++ b/crates/test-programs/src/bin/preview2_stream_pollable_correct.rs @@ -1,11 +1,27 @@ -use test_programs::wasi::cli::stdin; -use test_programs::wasi::io::streams; +use test_programs::wasi::cli::{stdin, stdout}; fn main() { - let stdin: streams::InputStream = stdin::get_stdin(); + let stdin = stdin::get_stdin(); let stdin_pollable = stdin.subscribe(); stdin_pollable.block(); assert!(stdin_pollable.ready(), "after blocking, pollable is ready"); drop(stdin_pollable); drop(stdin); + + // Pollables can be used many times over their lifetime + let stdout = stdout::get_stdout(); + let stdout_pollable = stdout.subscribe(); + + let chunk = [b'a'; 50]; + for _ in 1..10 { + stdout_pollable.block(); + assert!(stdout_pollable.ready(), "after blocking, pollable is ready"); + + let n = stdout.check_write().unwrap() as usize; + assert!(n >= chunk.len()); + stdout.write(&chunk).unwrap(); + } + + drop(stdout_pollable); + drop(stdout); } diff --git a/crates/test-programs/src/bin/preview2_tcp_bind.rs b/crates/test-programs/src/bin/preview2_tcp_bind.rs index faea346a155f..5cc54022e460 100644 --- a/crates/test-programs/src/bin/preview2_tcp_bind.rs +++ b/crates/test-programs/src/bin/preview2_tcp_bind.rs @@ -1,3 +1,4 @@ +use test_programs::sockets::attempt_random_port; use test_programs::wasi::sockets::network::{ ErrorCode, IpAddress, IpAddressFamily, IpSocketAddress, Network, }; @@ -18,23 +19,15 @@ fn test_tcp_bind_ephemeral_port(net: &Network, ip: IpAddress) { /// Bind a socket on a specified port. fn test_tcp_bind_specific_port(net: &Network, ip: IpAddress) { - const PORT: u16 = 54321; + let sock = TcpSocket::new(ip.family()).unwrap(); - let bind_addr = IpSocketAddress::new(ip, PORT); + let bind_addr = + attempt_random_port(ip, |bind_addr| sock.blocking_bind(net, bind_addr)).unwrap(); - let sock = TcpSocket::new(ip.family()).unwrap(); - match sock.blocking_bind(net, bind_addr) { - Ok(()) => { - let bound_addr = sock.local_address().unwrap(); - - assert_eq!(bind_addr.ip(), bound_addr.ip()); - assert_eq!(bind_addr.port(), bound_addr.port()); - } - // Concurrent invocations of this test can yield `AddressInUse` and that - // same error can show up on Windows as `AccessDenied`. - Err(ErrorCode::AddressInUse | ErrorCode::AccessDenied) => {} - Err(e) => panic!("error: {e}"), - } + let bound_addr = sock.local_address().unwrap(); + + assert_eq!(bind_addr.ip(), bound_addr.ip()); + assert_eq!(bind_addr.port(), bound_addr.port()); } /// Two sockets may not be actively bound to the same address at the same time. @@ -54,6 +47,45 @@ fn test_tcp_bind_addrinuse(net: &Network, ip: IpAddress) { ); } +// The WASI runtime should set SO_REUSEADDR for us +fn test_tcp_bind_reuseaddr(net: &Network, ip: IpAddress) { + let client = TcpSocket::new(ip.family()).unwrap(); + + let bind_addr = { + let listener1 = TcpSocket::new(ip.family()).unwrap(); + + let bind_addr = + attempt_random_port(ip, |bind_addr| listener1.blocking_bind(net, bind_addr)).unwrap(); + + listener1.blocking_listen().unwrap(); + + let connect_addr = + IpSocketAddress::new(IpAddress::new_loopback(ip.family()), bind_addr.port()); + client.blocking_connect(net, connect_addr).unwrap(); + + let (accepted_connection, accepted_input, accepted_output) = + listener1.blocking_accept().unwrap(); + accepted_output.blocking_write_zeroes_and_flush(10).unwrap(); + drop(accepted_input); + drop(accepted_output); + drop(accepted_connection); + drop(listener1); + + bind_addr + }; + + { + let listener2 = TcpSocket::new(ip.family()).unwrap(); + + // If SO_REUSEADDR was configured correctly, the following lines shouldn't be + // affected by the TIME_WAIT state of the just closed `listener1` socket: + listener2.blocking_bind(net, bind_addr).unwrap(); + listener2.blocking_listen().unwrap(); + } + + drop(client); +} + // Try binding to an address that is not configured on the system. fn test_tcp_bind_addrnotavail(net: &Network, ip: IpAddress) { let bind_addr = IpSocketAddress::new(ip, 0); @@ -106,23 +138,11 @@ fn test_tcp_bind_dual_stack(net: &Network) { let sock = TcpSocket::new(IpAddressFamily::Ipv6).unwrap(); let addr = IpSocketAddress::new(IpAddress::IPV4_MAPPED_LOOPBACK, 0); - // Even on platforms that don't support dualstack sockets, - // setting ipv6_only to true (disabling dualstack mode) should work. - sock.set_ipv6_only(true).unwrap(); - // Binding an IPv4-mapped-IPv6 address on a ipv6-only socket should fail: assert!(matches!( sock.blocking_bind(net, addr), Err(ErrorCode::InvalidArgument) )); - - sock.set_ipv6_only(false).unwrap(); - - sock.blocking_bind(net, addr).unwrap(); - - let bound_addr = sock.local_address().unwrap(); - - assert_eq!(bound_addr.family(), IpAddressFamily::Ipv6); } fn main() { @@ -141,6 +161,9 @@ fn main() { test_tcp_bind_specific_port(&net, IpAddress::IPV4_UNSPECIFIED); test_tcp_bind_specific_port(&net, IpAddress::IPV6_UNSPECIFIED); + test_tcp_bind_reuseaddr(&net, IpAddress::IPV4_LOOPBACK); + test_tcp_bind_reuseaddr(&net, IpAddress::IPV6_LOOPBACK); + test_tcp_bind_addrinuse(&net, IpAddress::IPV4_LOOPBACK); test_tcp_bind_addrinuse(&net, IpAddress::IPV6_LOOPBACK); test_tcp_bind_addrinuse(&net, IpAddress::IPV4_UNSPECIFIED); diff --git a/crates/test-programs/src/bin/preview2_tcp_connect.rs b/crates/test-programs/src/bin/preview2_tcp_connect.rs index f304e46a5d5d..d840cc5934ff 100644 --- a/crates/test-programs/src/bin/preview2_tcp_connect.rs +++ b/crates/test-programs/src/bin/preview2_tcp_connect.rs @@ -83,23 +83,16 @@ fn test_tcp_connect_dual_stack(net: &Network) { // Tests: - // Even on platforms that don't support dualstack sockets, - // setting ipv6_only to true (disabling dualstack mode) should work. - v6_client.set_ipv6_only(true).unwrap(); - - // Connecting to an IPv4-mapped-IPv6 address on an ipv6-only socket should fail: + // Connecting to an IPv4 address on an IPv6 socket should fail: + assert!(matches!( + v6_client.blocking_connect(net, v4_listener_addr), + Err(ErrorCode::InvalidArgument) + )); + // Connecting to an IPv4-mapped-IPv6 address on an IPv6 socket should fail: assert!(matches!( v6_client.blocking_connect(net, v6_listener_addr), Err(ErrorCode::InvalidArgument) )); - - v6_client.set_ipv6_only(false).unwrap(); - - v6_client.blocking_connect(net, v6_listener_addr).unwrap(); - - let connected_addr = v6_client.local_address().unwrap(); - - assert_eq!(connected_addr.family(), IpAddressFamily::Ipv6); } fn main() { diff --git a/crates/test-programs/src/bin/preview2_tcp_sockopts.rs b/crates/test-programs/src/bin/preview2_tcp_sockopts.rs index 8bc1ef49bca8..d52f7c8f902d 100644 --- a/crates/test-programs/src/bin/preview2_tcp_sockopts.rs +++ b/crates/test-programs/src/bin/preview2_tcp_sockopts.rs @@ -10,10 +10,6 @@ fn test_tcp_sockopt_defaults(family: IpAddressFamily) { assert_eq!(sock.address_family(), family); - if family == IpAddressFamily::Ipv6 { - sock.ipv6_only().unwrap(); // Only verify that it has a default value at all, but either value is valid. - } - sock.keep_alive_enabled().unwrap(); // Only verify that it has a default value at all, but either value is valid. assert!(sock.keep_alive_idle_time().unwrap() > 0); assert!(sock.keep_alive_interval().unwrap() > 0); @@ -26,11 +22,6 @@ fn test_tcp_sockopt_defaults(family: IpAddressFamily) { fn test_tcp_sockopt_input_ranges(family: IpAddressFamily) { let sock = TcpSocket::new(family).unwrap(); - if family == IpAddressFamily::Ipv6 { - assert!(matches!(sock.set_ipv6_only(true), Ok(_))); - assert!(matches!(sock.set_ipv6_only(false), Ok(_))); - } - assert!(matches!( sock.set_listen_backlog_size(0), Err(ErrorCode::InvalidArgument) @@ -90,13 +81,6 @@ fn test_tcp_sockopt_input_ranges(family: IpAddressFamily) { fn test_tcp_sockopt_readback(family: IpAddressFamily) { let sock = TcpSocket::new(family).unwrap(); - if family == IpAddressFamily::Ipv6 { - sock.set_ipv6_only(true).unwrap(); - assert_eq!(sock.ipv6_only().unwrap(), true); - sock.set_ipv6_only(false).unwrap(); - assert_eq!(sock.ipv6_only().unwrap(), false); - } - sock.set_keep_alive_enabled(true).unwrap(); assert_eq!(sock.keep_alive_enabled().unwrap(), true); sock.set_keep_alive_enabled(false).unwrap(); @@ -125,15 +109,10 @@ fn test_tcp_sockopt_inheritance(net: &Network, family: IpAddressFamily) { let bind_addr = IpSocketAddress::new(IpAddress::new_loopback(family), 0); let listener = TcpSocket::new(family).unwrap(); - let default_ipv6_only = listener.ipv6_only().unwrap_or(false); let default_keep_alive = listener.keep_alive_enabled().unwrap(); // Configure options on listener: { - if family == IpAddressFamily::Ipv6 { - listener.set_ipv6_only(!default_ipv6_only).unwrap(); - } - listener .set_keep_alive_enabled(!default_keep_alive) .unwrap(); @@ -154,10 +133,6 @@ fn test_tcp_sockopt_inheritance(net: &Network, family: IpAddressFamily) { // Verify options on accepted socket: { - if family == IpAddressFamily::Ipv6 { - assert_eq!(accepted_client.ipv6_only().unwrap(), !default_ipv6_only); - } - assert_eq!( accepted_client.keep_alive_enabled().unwrap(), !default_keep_alive diff --git a/crates/test-programs/src/bin/preview2_tcp_states.rs b/crates/test-programs/src/bin/preview2_tcp_states.rs index 308c6cfd6c2d..4d31e36cf0c7 100644 --- a/crates/test-programs/src/bin/preview2_tcp_states.rs +++ b/crates/test-programs/src/bin/preview2_tcp_states.rs @@ -35,20 +35,6 @@ fn test_tcp_unbound_state_invariants(family: IpAddressFamily) { assert_eq!(sock.is_listening(), false); assert_eq!(sock.address_family(), family); - if family == IpAddressFamily::Ipv6 { - assert!(matches!(sock.ipv6_only(), Ok(_))); - - // Even on platforms that don't support dualstack sockets, - // setting ipv6_only to true (disabling dualstack mode) should work. - assert!(matches!(sock.set_ipv6_only(true), Ok(_))); - } else { - assert!(matches!(sock.ipv6_only(), Err(ErrorCode::NotSupported))); - assert!(matches!( - sock.set_ipv6_only(true), - Err(ErrorCode::NotSupported) - )); - } - assert!(matches!(sock.set_listen_backlog_size(32), Ok(_))); assert!(matches!(sock.keep_alive_enabled(), Ok(_))); assert!(matches!(sock.set_keep_alive_enabled(false), Ok(_))); @@ -100,20 +86,6 @@ fn test_tcp_bound_state_invariants(net: &Network, family: IpAddressFamily) { assert_eq!(sock.is_listening(), false); assert_eq!(sock.address_family(), family); - if family == IpAddressFamily::Ipv6 { - assert!(matches!(sock.ipv6_only(), Ok(_))); - assert!(matches!( - sock.set_ipv6_only(true), - Err(ErrorCode::InvalidState) - )); - } else { - assert!(matches!(sock.ipv6_only(), Err(ErrorCode::NotSupported))); - assert!(matches!( - sock.set_ipv6_only(true), - Err(ErrorCode::NotSupported) - )); - } - assert!(matches!(sock.set_listen_backlog_size(32), Ok(_))); assert!(matches!(sock.keep_alive_enabled(), Ok(_))); assert!(matches!(sock.set_keep_alive_enabled(false), Ok(_))); @@ -169,20 +141,6 @@ fn test_tcp_listening_state_invariants(net: &Network, family: IpAddressFamily) { assert_eq!(sock.is_listening(), true); assert_eq!(sock.address_family(), family); - if family == IpAddressFamily::Ipv6 { - assert!(matches!(sock.ipv6_only(), Ok(_))); - assert!(matches!( - sock.set_ipv6_only(true), - Err(ErrorCode::InvalidState) - )); - } else { - assert!(matches!(sock.ipv6_only(), Err(ErrorCode::NotSupported))); - assert!(matches!( - sock.set_ipv6_only(true), - Err(ErrorCode::NotSupported) - )); - } - assert!(matches!( sock.set_listen_backlog_size(32), Ok(_) | Err(ErrorCode::NotSupported) @@ -238,20 +196,6 @@ fn test_tcp_connected_state_invariants(net: &Network, family: IpAddressFamily) { assert_eq!(sock.is_listening(), false); assert_eq!(sock.address_family(), family); - if family == IpAddressFamily::Ipv6 { - assert!(matches!(sock.ipv6_only(), Ok(_))); - assert!(matches!( - sock.set_ipv6_only(true), - Err(ErrorCode::InvalidState) - )); - } else { - assert!(matches!(sock.ipv6_only(), Err(ErrorCode::NotSupported))); - assert!(matches!( - sock.set_ipv6_only(true), - Err(ErrorCode::NotSupported) - )); - } - assert!(matches!(sock.keep_alive_enabled(), Ok(_))); assert!(matches!(sock.set_keep_alive_enabled(false), Ok(_))); assert!(matches!(sock.keep_alive_idle_time(), Ok(_))); diff --git a/crates/test-programs/src/bin/preview2_udp_bind.rs b/crates/test-programs/src/bin/preview2_udp_bind.rs index 5fb5e542107c..8b366bcf9e3e 100644 --- a/crates/test-programs/src/bin/preview2_udp_bind.rs +++ b/crates/test-programs/src/bin/preview2_udp_bind.rs @@ -1,3 +1,4 @@ +use test_programs::sockets::attempt_random_port; use test_programs::wasi::sockets::network::{ ErrorCode, IpAddress, IpAddressFamily, IpSocketAddress, Network, }; @@ -18,19 +19,10 @@ fn test_udp_bind_ephemeral_port(net: &Network, ip: IpAddress) { /// Bind a socket on a specified port. fn test_udp_bind_specific_port(net: &Network, ip: IpAddress) { - const PORT: u16 = 54321; - - let bind_addr = IpSocketAddress::new(ip, PORT); - let sock = UdpSocket::new(ip.family()).unwrap(); - match sock.blocking_bind(net, bind_addr) { - Ok(()) => {} - // Concurrent invocations of this test can yield `AddressInUse` and that - // same error can show up on Windows as `AccessDenied`. - Err(ErrorCode::AddressInUse | ErrorCode::AccessDenied) => {} - r => r.unwrap(), - } + let bind_addr = + attempt_random_port(ip, |bind_addr| sock.blocking_bind(net, bind_addr)).unwrap(); let bound_addr = sock.local_address().unwrap(); @@ -83,23 +75,11 @@ fn test_udp_bind_dual_stack(net: &Network) { let sock = UdpSocket::new(IpAddressFamily::Ipv6).unwrap(); let addr = IpSocketAddress::new(IpAddress::IPV4_MAPPED_LOOPBACK, 0); - // Even on platforms that don't support dualstack sockets, - // setting ipv6_only to true (disabling dualstack mode) should work. - sock.set_ipv6_only(true).unwrap(); - // Binding an IPv4-mapped-IPv6 address on a ipv6-only socket should fail: assert!(matches!( sock.blocking_bind(net, addr), Err(ErrorCode::InvalidArgument) )); - - sock.set_ipv6_only(false).unwrap(); - - sock.blocking_bind(net, addr).unwrap(); - - let bound_addr = sock.local_address().unwrap(); - - assert_eq!(bound_addr.family(), IpAddressFamily::Ipv6); } fn main() { diff --git a/crates/test-programs/src/bin/preview2_udp_connect.rs b/crates/test-programs/src/bin/preview2_udp_connect.rs index 7e21c7e7914a..7ce1ad56f689 100644 --- a/crates/test-programs/src/bin/preview2_udp_connect.rs +++ b/crates/test-programs/src/bin/preview2_udp_connect.rs @@ -88,38 +88,21 @@ fn test_udp_connect_dual_stack(net: &Network) { IpSocketAddress::new(IpAddress::IPV4_MAPPED_LOOPBACK, v4_server_addr.port()); // Tests: - { - let v6_client = UdpSocket::new(IpAddressFamily::Ipv6).unwrap(); - - // Even on platforms that don't support dualstack sockets, - // setting ipv6_only to true (disabling dualstack mode) should work. - v6_client.set_ipv6_only(true).unwrap(); - - v6_client.blocking_bind_unspecified(&net).unwrap(); - - // Connecting to an IPv4-mapped-IPv6 address on an ipv6-only socket should fail: - assert!(matches!( - v6_client.stream(Some(v6_server_addr)), - Err(ErrorCode::InvalidArgument) - )); - } - - { - let v6_client = UdpSocket::new(IpAddressFamily::Ipv6).unwrap(); - - v6_client.set_ipv6_only(false).unwrap(); - v6_client.blocking_bind_unspecified(&net).unwrap(); - v6_client.stream(Some(v6_server_addr)).unwrap(); - - assert_eq!( - v6_client.local_address().unwrap().family(), - IpAddressFamily::Ipv6 - ); - assert_eq!( - v6_client.remote_address().unwrap().family(), - IpAddressFamily::Ipv6 - ); - } + let v6_client = UdpSocket::new(IpAddressFamily::Ipv6).unwrap(); + + v6_client.blocking_bind_unspecified(&net).unwrap(); + + // Connecting to an IPv4 address on an IPv6 socket should fail: + assert!(matches!( + v6_client.stream(Some(v4_server_addr)), + Err(ErrorCode::InvalidArgument) + )); + + // Connecting to an IPv4-mapped-IPv6 address on an IPv6 socket should fail: + assert!(matches!( + v6_client.stream(Some(v6_server_addr)), + Err(ErrorCode::InvalidArgument) + )); } fn main() { diff --git a/crates/test-programs/src/bin/preview2_udp_sample_application.rs b/crates/test-programs/src/bin/preview2_udp_sample_application.rs index 171258e5e188..ca001769f69c 100644 --- a/crates/test-programs/src/bin/preview2_udp_sample_application.rs +++ b/crates/test-programs/src/bin/preview2_udp_sample_application.rs @@ -72,52 +72,6 @@ fn test_udp_sample_application(family: IpAddressFamily, bind_address: IpSocketAd } } -fn test_udp_dual_stack_conversation() { - let net = Network::default(); - - let v4_server = UdpSocket::new(IpAddressFamily::Ipv4).unwrap(); - v4_server - .blocking_bind(&net, IpSocketAddress::new(IpAddress::IPV4_LOOPBACK, 0)) - .unwrap(); - let (server_incoming, server_outgoing) = v4_server.stream(None).unwrap(); - - let v4_server_addr = v4_server.local_address().unwrap(); - let v6_server_addr = - IpSocketAddress::new(IpAddress::IPV4_MAPPED_LOOPBACK, v4_server_addr.port()); - - let v6_client = UdpSocket::new(IpAddressFamily::Ipv6).unwrap(); - - v6_client.set_ipv6_only(false).unwrap(); - v6_client.blocking_bind_unspecified(&net).unwrap(); - let (client_incoming, client_outgoing) = v6_client.stream(None).unwrap(); - - // Send from v6 client to v4 server: - client_outgoing - .blocking_send(&[OutgoingDatagram { - data: "Hi!".into(), - remote_address: Some(v6_server_addr), - }]) - .unwrap(); - - // Receive from v6 client on v4 server: - let results = server_incoming.blocking_receive(1..1).unwrap(); - let msg = results.first().unwrap(); - assert_eq!(msg.remote_address.family(), IpAddressFamily::Ipv4); - - // Send from v4 server to v6 client: - server_outgoing - .blocking_send(&[OutgoingDatagram { - data: msg.data.clone(), - remote_address: Some(msg.remote_address), - }]) - .unwrap(); - - // Receive from v4 server on v6 client: - let results = client_incoming.blocking_receive(1..1).unwrap(); - let msg = results.first().unwrap(); - assert_eq!(msg.remote_address.family(), IpAddressFamily::Ipv6); -} - fn main() { test_udp_sample_application( IpAddressFamily::Ipv4, @@ -135,6 +89,4 @@ fn main() { scope_id: 0, }), ); - - test_udp_dual_stack_conversation(); } diff --git a/crates/test-programs/src/bin/preview2_udp_sockopts.rs b/crates/test-programs/src/bin/preview2_udp_sockopts.rs index f705b476c36e..893789b508b4 100644 --- a/crates/test-programs/src/bin/preview2_udp_sockopts.rs +++ b/crates/test-programs/src/bin/preview2_udp_sockopts.rs @@ -6,10 +6,6 @@ fn test_udp_sockopt_defaults(family: IpAddressFamily) { assert_eq!(sock.address_family(), family); - if family == IpAddressFamily::Ipv6 { - sock.ipv6_only().unwrap(); // Only verify that it has a default value at all, but either value is valid. - } - assert!(sock.unicast_hop_limit().unwrap() > 0); assert!(sock.receive_buffer_size().unwrap() > 0); assert!(sock.send_buffer_size().unwrap() > 0); @@ -18,11 +14,6 @@ fn test_udp_sockopt_defaults(family: IpAddressFamily) { fn test_udp_sockopt_input_ranges(family: IpAddressFamily) { let sock = UdpSocket::new(family).unwrap(); - if family == IpAddressFamily::Ipv6 { - assert!(matches!(sock.set_ipv6_only(true), Ok(_))); - assert!(matches!(sock.set_ipv6_only(false), Ok(_))); - } - assert!(matches!( sock.set_unicast_hop_limit(0), Err(ErrorCode::InvalidArgument) @@ -47,13 +38,6 @@ fn test_udp_sockopt_input_ranges(family: IpAddressFamily) { fn test_udp_sockopt_readback(family: IpAddressFamily) { let sock = UdpSocket::new(family).unwrap(); - if family == IpAddressFamily::Ipv6 { - sock.set_ipv6_only(true).unwrap(); - assert_eq!(sock.ipv6_only().unwrap(), true); - sock.set_ipv6_only(false).unwrap(); - assert_eq!(sock.ipv6_only().unwrap(), false); - } - sock.set_unicast_hop_limit(42).unwrap(); assert_eq!(sock.unicast_hop_limit().unwrap(), 42); diff --git a/crates/test-programs/src/bin/preview2_udp_states.rs b/crates/test-programs/src/bin/preview2_udp_states.rs index 4081b971e8d7..314f94a25bd8 100644 --- a/crates/test-programs/src/bin/preview2_udp_states.rs +++ b/crates/test-programs/src/bin/preview2_udp_states.rs @@ -18,20 +18,6 @@ fn test_udp_unbound_state_invariants(family: IpAddressFamily) { )); assert_eq!(sock.address_family(), family); - if family == IpAddressFamily::Ipv6 { - assert!(matches!(sock.ipv6_only(), Ok(_))); - - // Even on platforms that don't support dualstack sockets, - // setting ipv6_only to true (disabling dualstack mode) should work. - assert!(matches!(sock.set_ipv6_only(true), Ok(_))); - } else { - assert!(matches!(sock.ipv6_only(), Err(ErrorCode::NotSupported))); - assert!(matches!( - sock.set_ipv6_only(true), - Err(ErrorCode::NotSupported) - )); - } - assert!(matches!(sock.unicast_hop_limit(), Ok(_))); assert!(matches!(sock.set_unicast_hop_limit(255), Ok(_))); assert!(matches!(sock.receive_buffer_size(), Ok(_))); @@ -59,20 +45,6 @@ fn test_udp_bound_state_invariants(net: &Network, family: IpAddressFamily) { )); assert_eq!(sock.address_family(), family); - if family == IpAddressFamily::Ipv6 { - assert!(matches!(sock.ipv6_only(), Ok(_))); - assert!(matches!( - sock.set_ipv6_only(true), - Err(ErrorCode::InvalidState) - )); - } else { - assert!(matches!(sock.ipv6_only(), Err(ErrorCode::NotSupported))); - assert!(matches!( - sock.set_ipv6_only(true), - Err(ErrorCode::NotSupported) - )); - } - assert!(matches!(sock.unicast_hop_limit(), Ok(_))); assert!(matches!(sock.set_unicast_hop_limit(255), Ok(_))); assert!(matches!(sock.receive_buffer_size(), Ok(_))); @@ -99,20 +71,6 @@ fn test_udp_connected_state_invariants(net: &Network, family: IpAddressFamily) { assert!(matches!(sock.remote_address(), Ok(_))); assert_eq!(sock.address_family(), family); - if family == IpAddressFamily::Ipv6 { - assert!(matches!(sock.ipv6_only(), Ok(_))); - assert!(matches!( - sock.set_ipv6_only(true), - Err(ErrorCode::InvalidState) - )); - } else { - assert!(matches!(sock.ipv6_only(), Err(ErrorCode::NotSupported))); - assert!(matches!( - sock.set_ipv6_only(true), - Err(ErrorCode::NotSupported) - )); - } - assert!(matches!(sock.unicast_hop_limit(), Ok(_))); assert!(matches!(sock.set_unicast_hop_limit(255), Ok(_))); assert!(matches!(sock.receive_buffer_size(), Ok(_))); diff --git a/crates/test-programs/src/preview1.rs b/crates/test-programs/src/preview1.rs index 6f646bb4e047..bc327391edb3 100644 --- a/crates/test-programs/src/preview1.rs +++ b/crates/test-programs/src/preview1.rs @@ -1,4 +1,4 @@ -use std::sync::OnceLock; +use std::{sync::OnceLock, time::Duration}; pub fn config() -> &'static TestConfig { static TESTCONFIG: OnceLock = OnceLock::new(); @@ -45,9 +45,9 @@ pub unsafe fn create_file(dir_fd: wasi::Fd, filename: &str) { wasi::fd_close(file_fd).expect("closing a file"); } -// Small workaround to get the crate's `assert_errno`, through the +// Small workaround to get the crate's macros, through the // `#[macro_export]` attribute below, also available from this module. -pub use crate::assert_errno; +pub use crate::{assert_errno, assert_fs_time_eq}; #[macro_export] macro_rules! assert_errno { @@ -114,11 +114,19 @@ macro_rules! assert_errno { }; } +#[macro_export] +macro_rules! assert_fs_time_eq { + ($l:expr, $r:expr, $n:literal) => { + let diff = if $l > $r { $l - $r } else { $r - $l }; + assert!(diff < $crate::preview1::config().fs_time_precision(), $n); + }; +} + pub struct TestConfig { errno_mode: ErrnoMode, + fs_time_precision: u64, no_dangling_filesystem: bool, no_rename_dir_to_empty_dir: bool, - no_fdflags_sync_support: bool, } enum ErrnoMode { @@ -139,14 +147,17 @@ impl TestConfig { } else { ErrnoMode::Permissive }; + let fs_time_precision = match std::env::var("FS_TIME_PRECISION") { + Ok(p) => p.parse().unwrap(), + Err(_) => 100, + }; let no_dangling_filesystem = std::env::var("NO_DANGLING_FILESYSTEM").is_ok(); let no_rename_dir_to_empty_dir = std::env::var("NO_RENAME_DIR_TO_EMPTY_DIR").is_ok(); - let no_fdflags_sync_support = std::env::var("NO_FDFLAGS_SYNC_SUPPORT").is_ok(); TestConfig { errno_mode, + fs_time_precision, no_dangling_filesystem, no_rename_dir_to_empty_dir, - no_fdflags_sync_support, } } pub fn errno_expect_unix(&self) -> bool { @@ -167,13 +178,13 @@ impl TestConfig { _ => false, } } + pub fn fs_time_precision(&self) -> Duration { + Duration::from_nanos(self.fs_time_precision) + } pub fn support_dangling_filesystem(&self) -> bool { !self.no_dangling_filesystem } pub fn support_rename_dir_to_empty_dir(&self) -> bool { !self.no_rename_dir_to_empty_dir } - pub fn support_fdflags_sync(&self) -> bool { - !self.no_fdflags_sync_support - } } diff --git a/crates/test-programs/src/sockets.rs b/crates/test-programs/src/sockets.rs index 1d0e7f0895f3..c77ad8d7f819 100644 --- a/crates/test-programs/src/sockets.rs +++ b/crates/test-programs/src/sockets.rs @@ -1,6 +1,7 @@ use crate::wasi::clocks::monotonic_clock; use crate::wasi::io::poll::{self, Pollable}; use crate::wasi::io::streams::{InputStream, OutputStream, StreamError}; +use crate::wasi::random; use crate::wasi::sockets::instance_network; use crate::wasi::sockets::ip_name_lookup; use crate::wasi::sockets::network::{ @@ -17,7 +18,7 @@ use std::ops::Range; const TIMEOUT_NS: u64 = 1_000_000_000; impl Pollable { - pub fn wait_until(&self, timeout: &Pollable) -> Result<(), ErrorCode> { + pub fn block_until(&self, timeout: &Pollable) -> Result<(), ErrorCode> { let ready = poll::poll(&[self, timeout]); assert!(ready.len() > 0); match ready[0] { @@ -30,10 +31,11 @@ impl Pollable { impl OutputStream { pub fn blocking_write_util(&self, mut bytes: &[u8]) -> Result<(), StreamError> { + let timeout = monotonic_clock::subscribe_duration(TIMEOUT_NS); let pollable = self.subscribe(); while !bytes.is_empty() { - pollable.block(); + pollable.block_until(&timeout).expect("write timed out"); let permit = self.check_write()?; @@ -73,12 +75,27 @@ impl Network { _ => return Ok(addresses), }, Err(ErrorCode::WouldBlock) => { - pollable.wait_until(&timeout)?; + pollable.block_until(&timeout)?; } Err(err) => return Err(err), } } } + + /// Same as `Network::blocking_resolve_addresses` but ignores post validation errors + /// + /// The ignored error codes signal that the input passed validation + /// and a lookup was actually attempted, but failed. These are ignored to + /// make the CI tests less flaky. + pub fn permissive_blocking_resolve_addresses( + &self, + name: &str, + ) -> Result, ErrorCode> { + match self.blocking_resolve_addresses(name) { + Err(ErrorCode::NameUnresolvable | ErrorCode::TemporaryResolverFailure) => Ok(vec![]), + r => r, + } + } } impl TcpSocket { @@ -91,26 +108,28 @@ impl TcpSocket { network: &Network, local_address: IpSocketAddress, ) -> Result<(), ErrorCode> { + let timeout = monotonic_clock::subscribe_duration(TIMEOUT_NS); let sub = self.subscribe(); self.start_bind(&network, local_address)?; loop { match self.finish_bind() { - Err(ErrorCode::WouldBlock) => sub.block(), + Err(ErrorCode::WouldBlock) => sub.block_until(&timeout)?, result => return result, } } } pub fn blocking_listen(&self) -> Result<(), ErrorCode> { + let timeout = monotonic_clock::subscribe_duration(TIMEOUT_NS); let sub = self.subscribe(); self.start_listen()?; loop { match self.finish_listen() { - Err(ErrorCode::WouldBlock) => sub.block(), + Err(ErrorCode::WouldBlock) => sub.block_until(&timeout)?, result => return result, } } @@ -121,24 +140,26 @@ impl TcpSocket { network: &Network, remote_address: IpSocketAddress, ) -> Result<(InputStream, OutputStream), ErrorCode> { + let timeout = monotonic_clock::subscribe_duration(TIMEOUT_NS); let sub = self.subscribe(); self.start_connect(&network, remote_address)?; loop { match self.finish_connect() { - Err(ErrorCode::WouldBlock) => sub.block(), + Err(ErrorCode::WouldBlock) => sub.block_until(&timeout)?, result => return result, } } } pub fn blocking_accept(&self) -> Result<(TcpSocket, InputStream, OutputStream), ErrorCode> { + let timeout = monotonic_clock::subscribe_duration(TIMEOUT_NS); let sub = self.subscribe(); loop { match self.accept() { - Err(ErrorCode::WouldBlock) => sub.block(), + Err(ErrorCode::WouldBlock) => sub.block_until(&timeout)?, result => return result, } } @@ -155,13 +176,14 @@ impl UdpSocket { network: &Network, local_address: IpSocketAddress, ) -> Result<(), ErrorCode> { + let timeout = monotonic_clock::subscribe_duration(TIMEOUT_NS); let sub = self.subscribe(); self.start_bind(&network, local_address)?; loop { match self.finish_bind() { - Err(ErrorCode::WouldBlock) => sub.block(), + Err(ErrorCode::WouldBlock) => sub.block_until(&timeout)?, result => return result, } } @@ -181,7 +203,7 @@ impl OutgoingDatagramStream { loop { match self.check_send() { - Ok(0) => sub.wait_until(timeout)?, + Ok(0) => sub.block_until(timeout)?, result => return result, } } @@ -221,7 +243,7 @@ impl IncomingDatagramStream { if datagrams.len() >= count.start as usize { return Ok(datagrams); } else { - pollable.wait_until(&timeout)?; + pollable.block_until(&timeout)?; } } Err(err) => return Err(err), @@ -336,3 +358,37 @@ impl PartialEq for IpSocketAddress { } } } + +fn generate_random_u16(range: Range) -> u16 { + let start = range.start as u64; + let end = range.end as u64; + let port = start + (random::random::get_random_u64() % (end - start)); + port as u16 +} + +/// Execute the inner function with a randomly generated port. +/// To prevent random failures, we make a few attempts before giving up. +pub fn attempt_random_port( + local_address: IpAddress, + mut f: F, +) -> Result +where + F: FnMut(IpSocketAddress) -> Result<(), ErrorCode>, +{ + const MAX_ATTEMPTS: u32 = 10; + let mut i = 0; + loop { + i += 1; + + let port: u16 = generate_random_u16(1024..u16::MAX); + let sock_addr = IpSocketAddress::new(local_address, port); + + match f(sock_addr) { + Ok(_) => return Ok(sock_addr), + Err(e) if i >= MAX_ATTEMPTS => return Err(e), + // Try again if the port is already taken. This can sometimes show up as `AccessDenied` on Windows. + Err(ErrorCode::AddressInUse | ErrorCode::AccessDenied) => {} + Err(e) => return Err(e), + } + } +} diff --git a/crates/types/src/lib.rs b/crates/types/src/lib.rs index 2719e6df9337..2a1939b20cdd 100644 --- a/crates/types/src/lib.rs +++ b/crates/types/src/lib.rs @@ -10,9 +10,9 @@ use std::fmt; mod error; pub use error::*; -/// WebAssembly value type -- equivalent of `wasmparser`'s Type. +/// WebAssembly value type -- equivalent of `wasmparser::ValType`. #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] -pub enum WasmType { +pub enum WasmValType { /// I32 type I32, /// I64 type @@ -27,15 +27,15 @@ pub enum WasmType { Ref(WasmRefType), } -impl fmt::Display for WasmType { +impl fmt::Display for WasmValType { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { - WasmType::I32 => write!(f, "i32"), - WasmType::I64 => write!(f, "i64"), - WasmType::F32 => write!(f, "f32"), - WasmType::F64 => write!(f, "f64"), - WasmType::V128 => write!(f, "v128"), - WasmType::Ref(rt) => write!(f, "{rt}"), + WasmValType::I32 => write!(f, "i32"), + WasmValType::I64 => write!(f, "i64"), + WasmValType::F32 => write!(f, "f32"), + WasmValType::F64 => write!(f, "f64"), + WasmValType::V128 => write!(f, "v128"), + WasmValType::Ref(rt) => write!(f, "{rt}"), } } } @@ -79,17 +79,17 @@ impl fmt::Display for WasmRefType { pub enum WasmHeapType { Func, Extern, - // FIXME: the `SignatureIndex` payload here is not suitable given all the + // FIXME: the `TypeIndex` payload here is not suitable given all the // contexts that this type is used within. For example the Engine in // wasmtime hashes this index which is not appropriate because the index is // not globally unique. // // This probably needs to become `WasmHeapType` where all of translation - // uses `WasmHeapType` and all of engine-level "stuff" uses - // `WasmHeapType`. This `` would need to be + // uses `WasmHeapType` and all of engine-level "stuff" uses + // `WasmHeapType`. This `` would need to be // propagated to quite a few locations though so it's left for a future // refactoring at this time. - TypedFunc(SignatureIndex), + Concrete(ModuleInternedTypeIndex), } impl fmt::Display for WasmHeapType { @@ -97,7 +97,7 @@ impl fmt::Display for WasmHeapType { match self { Self::Func => write!(f, "func"), Self::Extern => write!(f, "extern"), - Self::TypedFunc(i) => write!(f, "func_sig{}", i.as_u32()), + Self::Concrete(i) => write!(f, "func_sig{}", i.as_u32()), } } } @@ -105,26 +105,26 @@ impl fmt::Display for WasmHeapType { /// WebAssembly function type -- equivalent of `wasmparser`'s FuncType. #[derive(Debug, Clone, Eq, PartialEq, Hash, Serialize, Deserialize)] pub struct WasmFuncType { - params: Box<[WasmType]>, + params: Box<[WasmValType]>, externref_params_count: usize, - returns: Box<[WasmType]>, + returns: Box<[WasmValType]>, externref_returns_count: usize, } impl WasmFuncType { #[inline] - pub fn new(params: Box<[WasmType]>, returns: Box<[WasmType]>) -> Self { + pub fn new(params: Box<[WasmValType]>, returns: Box<[WasmValType]>) -> Self { let externref_params_count = params .iter() .filter(|p| match **p { - WasmType::Ref(rt) => rt.heap_type == WasmHeapType::Extern, + WasmValType::Ref(rt) => rt.heap_type == WasmHeapType::Extern, _ => false, }) .count(); let externref_returns_count = returns .iter() .filter(|r| match **r { - WasmType::Ref(rt) => rt.heap_type == WasmHeapType::Extern, + WasmValType::Ref(rt) => rt.heap_type == WasmHeapType::Extern, _ => false, }) .count(); @@ -138,7 +138,7 @@ impl WasmFuncType { /// Function params types. #[inline] - pub fn params(&self) -> &[WasmType] { + pub fn params(&self) -> &[WasmValType] { &self.params } @@ -150,7 +150,7 @@ impl WasmFuncType { /// Returns params types. #[inline] - pub fn returns(&self) -> &[WasmType] { + pub fn returns(&self) -> &[WasmValType] { &self.returns } @@ -206,10 +206,19 @@ entity_impl!(GlobalIndex); pub struct MemoryIndex(u32); entity_impl!(MemoryIndex); -/// Index type of a signature (imported or defined) inside the WebAssembly module. +/// Index type of a type (imported or defined) inside the WebAssembly module. #[derive(Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Debug, Serialize, Deserialize)] -pub struct SignatureIndex(u32); -entity_impl!(SignatureIndex); +pub struct TypeIndex(u32); +entity_impl!(TypeIndex); + +/// Index type of a deduplicated type (imported or defined) inside a WebAssembly +/// module. +/// +/// Note that this is deduplicated only at the level of a WebAssembly module, +/// not at the level of a whole store or engine. +#[derive(Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Debug, Serialize, Deserialize)] +pub struct ModuleInternedTypeIndex(u32); +entity_impl!(ModuleInternedTypeIndex); /// Index type of a passive data segment inside the WebAssembly module. #[derive(Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Debug, Serialize, Deserialize)] @@ -221,11 +230,6 @@ entity_impl!(DataIndex); pub struct ElemIndex(u32); entity_impl!(ElemIndex); -/// Index type of a type inside the WebAssembly module. -#[derive(Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Debug, Serialize, Deserialize)] -pub struct TypeIndex(u32); -entity_impl!(TypeIndex); - /// Index type of an event inside the WebAssembly module. #[derive(Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Debug, Serialize, Deserialize)] pub struct TagIndex(u32); @@ -291,7 +295,7 @@ pub enum EntityType { Table(Table), /// A function type where the index points to the type section and records a /// function signature. - Function(SignatureIndex), + Function(ModuleInternedTypeIndex), } impl EntityType { @@ -328,7 +332,7 @@ impl EntityType { } /// Assert that this entity is a function - pub fn unwrap_func(&self) -> SignatureIndex { + pub fn unwrap_func(&self) -> ModuleInternedTypeIndex { match self { EntityType::Function(g) => *g, _ => panic!("not a func"), @@ -346,7 +350,7 @@ impl EntityType { #[derive(Debug, Clone, Copy, Hash, Eq, PartialEq, Serialize, Deserialize)] pub struct Global { /// The Wasm type of the value stored in the global. - pub wasm_ty: crate::WasmType, + pub wasm_ty: crate::WasmValType, /// A flag indicating whether the value may change at runtime. pub mutability: bool, } @@ -459,14 +463,14 @@ pub trait TypeConvert { } /// Converts a wasmparser value type to a wasmtime type - fn convert_valtype(&self, ty: wasmparser::ValType) -> WasmType { + fn convert_valtype(&self, ty: wasmparser::ValType) -> WasmValType { match ty { - wasmparser::ValType::I32 => WasmType::I32, - wasmparser::ValType::I64 => WasmType::I64, - wasmparser::ValType::F32 => WasmType::F32, - wasmparser::ValType::F64 => WasmType::F64, - wasmparser::ValType::V128 => WasmType::V128, - wasmparser::ValType::Ref(t) => WasmType::Ref(self.convert_ref_type(t)), + wasmparser::ValType::I32 => WasmValType::I32, + wasmparser::ValType::I64 => WasmValType::I64, + wasmparser::ValType::F32 => WasmValType::F32, + wasmparser::ValType::F64 => WasmValType::F64, + wasmparser::ValType::V128 => WasmValType::V128, + wasmparser::ValType::Ref(t) => WasmValType::Ref(self.convert_ref_type(t)), } } @@ -483,9 +487,10 @@ pub trait TypeConvert { match ty { wasmparser::HeapType::Func => WasmHeapType::Func, wasmparser::HeapType::Extern => WasmHeapType::Extern, - wasmparser::HeapType::Concrete(i) => self.lookup_heap_type(TypeIndex::from_u32(i)), + wasmparser::HeapType::Concrete(i) => self.lookup_heap_type(i), wasmparser::HeapType::Any + | wasmparser::HeapType::Exn | wasmparser::HeapType::None | wasmparser::HeapType::NoExtern | wasmparser::HeapType::NoFunc @@ -500,5 +505,5 @@ pub trait TypeConvert { /// Converts the specified type index from a heap type into a canonicalized /// heap type. - fn lookup_heap_type(&self, index: TypeIndex) -> WasmHeapType; + fn lookup_heap_type(&self, index: wasmparser::UnpackedIndex) -> WasmHeapType; } diff --git a/crates/wasi-common/Cargo.toml b/crates/wasi-common/Cargo.toml index dbce4a957906..e230f59f42b3 100644 --- a/crates/wasi-common/Cargo.toml +++ b/crates/wasi-common/Cargo.toml @@ -9,7 +9,7 @@ keywords = ["webassembly", "wasm"] repository = "https://github.com/bytecodealliance/wasmtime" readme = "README.md" edition.workspace = true -include = ["src/**/*", "WASI/phases/**/*", "README.md", "LICENSE", "build.rs"] +include = ["src/**/*", "tests/**/*", "WASI/phases/**/*", "README.md", "LICENSE", "build.rs"] build = "build.rs" # This doesn't actually link to a native library, but it allows us to set env @@ -17,22 +17,40 @@ build = "build.rs" # on this crate, allowing other crates to use the same witx files. links = "wasi-common-19" +[lints] +workspace = true + [dependencies] anyhow = { workspace = true } thiserror = { workspace = true } wiggle = { workspace = true } -wasmtime = { workspace = true } tracing = { workspace = true } cap-std = { workspace = true } cap-rand = { workspace = true } bitflags = { workspace = true } log = { workspace = true } +# Optional, enabled by wasmtime feature: +wasmtime = { workspace = true, optional = true, features = ['runtime'] } +# Optional, enabled by sync feature: +cap-fs-ext = { workspace = true, optional = true } +cap-time-ext = { workspace = true, optional = true } +fs-set-times = { workspace = true, optional = true } +system-interface = { workspace = true, features = ["cap_std_impls"], optional = true } +io-lifetimes = { workspace = true, optional = true } +# Optional, enabled by tokio feature: +tokio = { workspace = true, features = [ "rt", "fs", "time", "io-util", "net", "io-std", "rt-multi-thread"], optional = true } + +# Optional, enabled by exit feature: +libc = { workspace = true, optional = true } + [target.'cfg(unix)'.dependencies] -rustix = { workspace = true, features = ["fs"] } +rustix = { workspace = true, features = ["fs", "event"] } [target.'cfg(windows)'.dependencies] +once_cell = { workspace = true } io-extras = { workspace = true } +rustix = { workspace = true, features = ["net"] } [target.'cfg(windows)'.dependencies.windows-sys] workspace = true @@ -45,13 +63,12 @@ features = [ tempfile = { workspace = true } test-log = { workspace = true } tracing-subscriber = { workspace = true } -wasmtime = { workspace = true, features = ['cranelift', 'async'] } -wasmtime-wasi = { path = '../wasi', features = ['sync', 'tokio'] } +wasmtime = { workspace = true, features = ['cranelift', 'async', 'runtime'] } test-programs-artifacts = { workspace = true } tokio = { workspace = true, features = ['macros', 'rt-multi-thread'] } [features] -default = ["trace_log"] +default = ["trace_log", "wasmtime", "sync"] # This feature enables the `tracing` logs in the calls to target the `log` # ecosystem of backends (e.g. `env_logger`. Disable this if you want to use # `tracing-subscriber`. @@ -59,3 +76,29 @@ trace_log = [ "wiggle/tracing_log", "tracing/log" ] # Need to make the wiggle_metadata feature available to consumers of this # crate if they want the snapshots to have metadata available. wiggle_metadata = ["wiggle/wiggle_metadata"] +# This feature enables integration with wasmtime. +wasmtime = [ + "dep:wasmtime", + "wiggle/wasmtime", +] +# This feature enables an implementation of the Wasi traits for a +# synchronous wasmtime embedding. +sync = [ + "wasmtime", + "dep:cap-fs-ext", + "dep:cap-time-ext", + "dep:fs-set-times", + "dep:system-interface", + "dep:io-lifetimes", +] +tokio = [ + "sync", + "wasmtime/async", + "wiggle/wasmtime_async", + "dep:tokio", +] +exit = [ "wasmtime", "dep:libc" ] + +[[test]] +name = "all" +required-features = ["wasmtime", "sync", "tokio"] diff --git a/crates/wasi-common/cap-std-sync/Cargo.toml b/crates/wasi-common/cap-std-sync/Cargo.toml deleted file mode 100644 index f9811bbb51f6..000000000000 --- a/crates/wasi-common/cap-std-sync/Cargo.toml +++ /dev/null @@ -1,42 +0,0 @@ -[package] -name = "wasi-cap-std-sync" -version.workspace = true -authors.workspace = true -description = "WASI implementation in Rust" -license = "Apache-2.0 WITH LLVM-exception" -categories = ["wasm"] -keywords = ["webassembly", "wasm"] -repository = "https://github.com/bytecodealliance/wasmtime" -readme = "README.md" -edition.workspace = true -include = ["src/**/*", "README.md", "LICENSE" ] - -[dependencies] -wasi-common = { workspace = true } -async-trait = { workspace = true } -anyhow = { workspace = true } -cap-std = { workspace = true } -cap-fs-ext = { workspace = true } -cap-time-ext = { workspace = true } -cap-rand = { workspace = true } -fs-set-times = { workspace = true } -system-interface = { workspace = true, features = ["cap_std_impls"] } -tracing = { workspace = true } -io-lifetimes = { workspace = true } - -[target.'cfg(unix)'.dependencies] -rustix = { workspace = true, features = ["fs", "event"] } - -[target.'cfg(windows)'.dependencies] -once_cell = { workspace = true } -io-extras = { workspace = true } -rustix = { workspace = true, features = ["net"] } - -[target.'cfg(windows)'.dependencies.windows-sys] -workspace = true -features = [ - "Win32_Foundation", -] - -[dev-dependencies] -tempfile = "3.1.0" diff --git a/crates/wasi-common/cap-std-sync/LICENSE b/crates/wasi-common/cap-std-sync/LICENSE deleted file mode 100644 index f9d81955f4bc..000000000000 --- a/crates/wasi-common/cap-std-sync/LICENSE +++ /dev/null @@ -1,220 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - ---- LLVM Exceptions to the Apache 2.0 License ---- - -As an exception, if, as a result of your compiling your source code, portions -of this Software are embedded into an Object form of such source code, you -may redistribute such embedded portions in such Object form without complying -with the conditions of Sections 4(a), 4(b) and 4(d) of the License. - -In addition, if you combine or link compiled forms of this Software with -software that is licensed under the GPLv2 ("Combined Software") and if a -court of competent jurisdiction determines that the patent provision (Section -3), the indemnity provision (Section 9) or other Section of the License -conflicts with the conditions of the GPLv2, you may retroactively and -prospectively choose to deem waived or otherwise exclude such Section(s) of -the License, but only in their entirety and only with respect to the Combined -Software. - diff --git a/crates/wasi-common/cap-std-sync/README.md b/crates/wasi-common/cap-std-sync/README.md deleted file mode 100644 index 76497dbcf332..000000000000 --- a/crates/wasi-common/cap-std-sync/README.md +++ /dev/null @@ -1 +0,0 @@ -WASI implementation in Rust, using cap-std. diff --git a/crates/wasi-common/src/error.rs b/crates/wasi-common/src/error.rs index b1a5135bb2b0..11b43ecd4952 100644 --- a/crates/wasi-common/src/error.rs +++ b/crates/wasi-common/src/error.rs @@ -7,7 +7,7 @@ //! can be provided with the [`Error::context`] method. This context is only observable with the //! `Display` and `Debug` impls of the error. -pub use crate::snapshots::preview_1::error::{Errno, Error, ErrorExt}; +pub use crate::snapshots::preview_1::error::{Error, ErrorExt}; use std::fmt; /// An error returned from the `proc_exit` host syscall. diff --git a/crates/wasi-common/src/lib.rs b/crates/wasi-common/src/lib.rs index b6da9c1f984a..e3c18d6c94ce 100644 --- a/crates/wasi-common/src/lib.rs +++ b/crates/wasi-common/src/lib.rs @@ -1,3 +1,15 @@ +//! # wasi-common +//! +//! This is Wasmtime's legacy implementation of WASI 0.1 (Preview 1). The +//! Wasmtime maintainers suggest all users upgrade to the implementation +//! of WASI 0.1 and 0.2 provided by the `wasmtime-wasi` crate. This +//! implementation remains in the wasmtime tree because it is required to use +//! the `wasmtime-wasi-threads` crate, an implementation of the `wasi-threads` +//! proposal which is not compatible with WASI 0.2. +//! +//! In addition to integration with Wasmtime, this implementation may be used +//! by other runtimes by disabling the `wasmtime` feature on this crate. +//! //! ## The `WasiFile` and `WasiDir` traits //! //! The WASI specification only defines one `handle` type, `fd`, on which all @@ -28,7 +40,11 @@ //! reason about access to the local filesystem by examining what impls are //! linked into an application. We found that this separation of concerns also //! makes it pretty enjoyable to write alternative implementations, e.g. a -//! virtual filesystem (which will land in a future PR). +//! virtual filesystem. +//! +//! Implementations of the `WasiFile` and `WasiDir` traits are provided +//! for synchronous embeddings (i.e. Config::async_support(false)) in +//! `wasi_common::sync` and for Tokio embeddings in `wasi_common::tokio`. //! //! ## Traits for the rest of WASI's features //! @@ -50,6 +66,9 @@ //! `WasiCtx::builder(...)` function. The //! `wasi_cap_std_sync::WasiCtxBuilder::new()` function uses this public //! interface to plug in its own implementations of each of these resources. + +#![warn(clippy::cast_sign_loss)] + pub mod clocks; mod ctx; pub mod dir; @@ -60,7 +79,11 @@ pub mod random; pub mod sched; pub mod snapshots; mod string_array; +#[cfg(feature = "sync")] +pub mod sync; pub mod table; +#[cfg(feature = "tokio")] +pub mod tokio; pub use cap_rand::RngCore; pub use clocks::{SystemTimeSpec, WasiClocks, WasiMonotonicClock, WasiSystemClock}; @@ -71,3 +94,100 @@ pub use file::WasiFile; pub use sched::{Poll, WasiSched}; pub use string_array::{StringArray, StringArrayError}; pub use table::Table; + +// The only difference between these definitions for sync vs async is whether +// the wasmtime::Funcs generated are async (& therefore need an async Store and an executor to run) +// or whether they have an internal "dummy executor" that expects the implementation of all +// the async funcs to poll to Ready immediately. +#[cfg(feature = "wasmtime")] +#[doc(hidden)] +#[macro_export] +macro_rules! define_wasi { + ($async_mode:tt $($bounds:tt)*) => { + + use wasmtime::Linker; + + pub fn add_to_linker( + linker: &mut Linker, + get_cx: impl Fn(&mut T) -> &mut U + Send + Sync + Copy + 'static, + ) -> anyhow::Result<()> + where U: Send + + crate::snapshots::preview_0::wasi_unstable::WasiUnstable + + crate::snapshots::preview_1::wasi_snapshot_preview1::WasiSnapshotPreview1, + $($bounds)* + { + snapshots::preview_1::add_wasi_snapshot_preview1_to_linker(linker, get_cx)?; + snapshots::preview_0::add_wasi_unstable_to_linker(linker, get_cx)?; + Ok(()) + } + + pub mod snapshots { + pub mod preview_1 { + wiggle::wasmtime_integration!({ + // The wiggle code to integrate with lives here: + target: crate::snapshots::preview_1, + // This must be the same witx document as used above. This should be ensured by + // the `WASI_ROOT` env variable, which is set in wasi-common's `build.rs`. + witx: ["$WASI_ROOT/phases/snapshot/witx/wasi_snapshot_preview1.witx"], + errors: { errno => trappable Error }, + $async_mode: * + }); + } + pub mod preview_0 { + wiggle::wasmtime_integration!({ + // The wiggle code to integrate with lives here: + target: crate::snapshots::preview_0, + // This must be the same witx document as used above. This should be ensured by + // the `WASI_ROOT` env variable, which is set in wasi-common's `build.rs`. + witx: ["$WASI_ROOT/phases/old/snapshot_0/witx/wasi_unstable.witx"], + errors: { errno => trappable Error }, + $async_mode: * + }); + } + } +}} + +/// Exit the process with a conventional OS error code as long as Wasmtime +/// understands the error. If the error is not an `I32Exit` or `Trap`, return +/// the error back to the caller for it to decide what to do. +/// +/// Note: this function is designed for usage where it is acceptable for +/// Wasmtime failures to terminate the parent process, such as in the Wasmtime +/// CLI; this would not be suitable for use in multi-tenant embeddings. +#[cfg(feature = "exit")] +pub fn maybe_exit_on_error(e: anyhow::Error) -> anyhow::Error { + use std::process; + use wasmtime::Trap; + + // If a specific WASI error code was requested then that's + // forwarded through to the process here without printing any + // extra error information. + let code = e.downcast_ref::().map(|e| e.0); + if let Some(exit) = code { + // Print the error message in the usual way. + // On Windows, exit status 3 indicates an abort (see below), + // so return 1 indicating a non-zero status to avoid ambiguity. + if cfg!(windows) && exit >= 3 { + process::exit(1); + } + process::exit(exit); + } + + // If the program exited because of a trap, return an error code + // to the outside environment indicating a more severe problem + // than a simple failure. + if e.is::() { + eprintln!("Error: {:?}", e); + + if cfg!(unix) { + // On Unix, return the error code of an abort. + process::exit(128 + libc::SIGABRT); + } else if cfg!(windows) { + // On Windows, return 3. + // https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/abort?view=vs-2019 + process::exit(3); + } + } + + e +} diff --git a/crates/wasi-common/src/snapshots/preview_1.rs b/crates/wasi-common/src/snapshots/preview_1.rs index 465af436da45..eab543b46817 100644 --- a/crates/wasi-common/src/snapshots/preview_1.rs +++ b/crates/wasi-common/src/snapshots/preview_1.rs @@ -554,7 +554,9 @@ impl wasi_snapshot_preview1::WasiSnapshotPreview1 for WasiCtx { let whence = match whence { types::Whence::Cur => SeekFrom::Current(offset), types::Whence::End => SeekFrom::End(offset), - types::Whence::Set => SeekFrom::Start(offset as u64), + types::Whence::Set => { + SeekFrom::Start(offset.try_into().map_err(|_| Error::invalid_argument())?) + } }; let newoffset = self .table() diff --git a/crates/wasi-common/src/snapshots/preview_1/error.rs b/crates/wasi-common/src/snapshots/preview_1/error.rs index f0b7cdf4ad94..f5b8afcfcce0 100644 --- a/crates/wasi-common/src/snapshots/preview_1/error.rs +++ b/crates/wasi-common/src/snapshots/preview_1/error.rs @@ -216,6 +216,7 @@ impl From for Error { std::io::ErrorKind::PermissionDenied => Errno::Perm.into(), std::io::ErrorKind::AlreadyExists => Errno::Exist.into(), std::io::ErrorKind::InvalidInput => Errno::Inval.into(), + std::io::ErrorKind::WouldBlock => Errno::Again.into(), _ => Error::trap(anyhow::anyhow!(err).context("Unknown OS error")), }, } diff --git a/crates/wasi-common/cap-std-sync/src/clocks.rs b/crates/wasi-common/src/sync/clocks.rs similarity index 94% rename from crates/wasi-common/cap-std-sync/src/clocks.rs rename to crates/wasi-common/src/sync/clocks.rs index 71eb34252bb0..1b85fe1140a4 100644 --- a/crates/wasi-common/cap-std-sync/src/clocks.rs +++ b/crates/wasi-common/src/sync/clocks.rs @@ -1,7 +1,7 @@ +use crate::clocks::{WasiClocks, WasiMonotonicClock, WasiSystemClock}; use cap_std::time::{Duration, Instant, SystemTime}; use cap_std::{ambient_authority, AmbientAuthority}; use cap_time_ext::{MonotonicClockExt, SystemClockExt}; -use wasi_common::clocks::{WasiClocks, WasiMonotonicClock, WasiSystemClock}; pub struct SystemClock(cap_std::time::SystemClock); diff --git a/crates/wasi-common/cap-std-sync/src/dir.rs b/crates/wasi-common/src/sync/dir.rs similarity index 92% rename from crates/wasi-common/cap-std-sync/src/dir.rs rename to crates/wasi-common/src/sync/dir.rs index c4ba736502d8..b54e88e8b894 100644 --- a/crates/wasi-common/cap-std-sync/src/dir.rs +++ b/crates/wasi-common/src/sync/dir.rs @@ -1,14 +1,14 @@ -use crate::file::{filetype_from, File}; +use crate::sync::file::{filetype_from, File}; +use crate::{ + dir::{ReaddirCursor, ReaddirEntity, WasiDir}, + file::{FdFlags, FileType, Filestat, OFlags}, + Error, ErrorExt, +}; use cap_fs_ext::{DirEntryExt, DirExt, MetadataExt, OpenOptionsMaybeDirExt, SystemTimeSpec}; use cap_std::fs; use std::any::Any; use std::path::{Path, PathBuf}; use system_interface::fs::GetSetFdFlags; -use wasi_common::{ - dir::{ReaddirCursor, ReaddirEntity, WasiDir}, - file::{FdFlags, FileType, Filestat, OFlags}, - Error, ErrorExt, -}; pub struct Dir(fs::Dir); @@ -71,9 +71,7 @@ impl Dir { // ideally OpenOptions would just support this though: // https://github.com/bytecodealliance/cap-std/issues/146 if fdflags.intersects( - wasi_common::file::FdFlags::DSYNC - | wasi_common::file::FdFlags::SYNC - | wasi_common::file::FdFlags::RSYNC, + crate::file::FdFlags::DSYNC | crate::file::FdFlags::SYNC | crate::file::FdFlags::RSYNC, ) { return Err(Error::not_supported().context("SYNC family of FdFlags")); } @@ -96,7 +94,7 @@ impl Dir { Err(Error::not_dir().context("expected directory but got file")) } else { // NONBLOCK does not have an OpenOption either, but we can patch that on with set_fd_flags: - if fdflags.contains(wasi_common::file::FdFlags::NONBLOCK) { + if fdflags.contains(crate::file::FdFlags::NONBLOCK) { let set_fd_flags = f.new_set_fd_flags(system_interface::fs::FdFlags::NONBLOCK)?; f.set_fd_flags(set_fd_flags)?; } @@ -122,7 +120,7 @@ impl Dir { } } -#[async_trait::async_trait] +#[wiggle::async_trait] impl WasiDir for Dir { fn as_any(&self) -> &dyn Any { self @@ -135,11 +133,11 @@ impl WasiDir for Dir { read: bool, write: bool, fdflags: FdFlags, - ) -> Result { + ) -> Result { let f = self.open_file_(symlink_follow, path, oflags, read, write, fdflags)?; match f { - OpenResult::File(f) => Ok(wasi_common::dir::OpenResult::File(Box::new(f))), - OpenResult::Dir(d) => Ok(wasi_common::dir::OpenResult::Dir(Box::new(d))), + OpenResult::File(f) => Ok(crate::dir::OpenResult::File(Box::new(f))), + OpenResult::Dir(d) => Ok(crate::dir::OpenResult::Dir(Box::new(d))), } } @@ -307,8 +305,8 @@ impl WasiDir for Dir { async fn set_times( &self, path: &str, - atime: Option, - mtime: Option, + atime: Option, + mtime: Option, follow_symlinks: bool, ) -> Result<(), Error> { if follow_symlinks { @@ -328,10 +326,10 @@ impl WasiDir for Dir { } } -fn convert_systimespec(t: Option) -> Option { +fn convert_systimespec(t: Option) -> Option { match t { - Some(wasi_common::SystemTimeSpec::Absolute(t)) => Some(SystemTimeSpec::Absolute(t)), - Some(wasi_common::SystemTimeSpec::SymbolicNow) => Some(SystemTimeSpec::SymbolicNow), + Some(crate::SystemTimeSpec::Absolute(t)) => Some(SystemTimeSpec::Absolute(t)), + Some(crate::SystemTimeSpec::SymbolicNow) => Some(SystemTimeSpec::SymbolicNow), None => None, } } @@ -339,8 +337,8 @@ fn convert_systimespec(t: Option) -> Option HashMap { let mut out = HashMap::new(); diff --git a/crates/wasi-common/cap-std-sync/src/file.rs b/crates/wasi-common/src/sync/file.rs similarity index 83% rename from crates/wasi-common/cap-std-sync/src/file.rs rename to crates/wasi-common/src/sync/file.rs index e986c173404d..2fda17641655 100644 --- a/crates/wasi-common/cap-std-sync/src/file.rs +++ b/crates/wasi-common/src/sync/file.rs @@ -1,3 +1,7 @@ +use crate::{ + file::{Advice, FdFlags, FileType, Filestat, WasiFile}, + Error, ErrorExt, +}; use cap_fs_ext::MetadataExt; use fs_set_times::{SetTimes, SystemTimeSpec}; use io_lifetimes::AsFilelike; @@ -8,10 +12,6 @@ use system_interface::{ fs::{FileIoExt, GetSetFdFlags}, io::{IoExt, ReadReady}, }; -use wasi_common::{ - file::{Advice, FdFlags, FileType, Filestat, WasiFile}, - Error, ErrorExt, -}; pub struct File(cap_std::fs::File); @@ -21,7 +21,7 @@ impl File { } } -#[async_trait::async_trait] +#[wiggle::async_trait] impl WasiFile for File { fn as_any(&self) -> &dyn Any { self @@ -52,9 +52,7 @@ impl WasiFile for File { } async fn set_fdflags(&mut self, fdflags: FdFlags) -> Result<(), Error> { if fdflags.intersects( - wasi_common::file::FdFlags::DSYNC - | wasi_common::file::FdFlags::SYNC - | wasi_common::file::FdFlags::RSYNC, + crate::file::FdFlags::DSYNC | crate::file::FdFlags::SYNC | crate::file::FdFlags::RSYNC, ) { return Err(Error::invalid_argument().context("cannot set DSYNC, SYNC, or RSYNC flag")); } @@ -85,8 +83,8 @@ impl WasiFile for File { } async fn set_times( &self, - atime: Option, - mtime: Option, + atime: Option, + mtime: Option, ) -> Result<(), Error> { self.0 .set_times(convert_systimespec(atime), convert_systimespec(mtime))?; @@ -113,6 +111,9 @@ impl WasiFile for File { bufs: &[io::IoSlice<'a>], offset: u64, ) -> Result { + if bufs.iter().map(|i| i.len()).sum::() == 0 { + return Ok(0); + } let n = self.0.write_vectored_at(bufs, offset)?; Ok(n.try_into()?) } @@ -186,33 +187,29 @@ impl AsFd for File { } } -pub(crate) fn convert_systimespec( - t: Option, -) -> Option { +pub(crate) fn convert_systimespec(t: Option) -> Option { match t { - Some(wasi_common::SystemTimeSpec::Absolute(t)) => { - Some(SystemTimeSpec::Absolute(t.into_std())) - } - Some(wasi_common::SystemTimeSpec::SymbolicNow) => Some(SystemTimeSpec::SymbolicNow), + Some(crate::SystemTimeSpec::Absolute(t)) => Some(SystemTimeSpec::Absolute(t.into_std())), + Some(crate::SystemTimeSpec::SymbolicNow) => Some(SystemTimeSpec::SymbolicNow), None => None, } } -pub(crate) fn to_sysif_fdflags(f: wasi_common::file::FdFlags) -> system_interface::fs::FdFlags { +pub(crate) fn to_sysif_fdflags(f: crate::file::FdFlags) -> system_interface::fs::FdFlags { let mut out = system_interface::fs::FdFlags::empty(); - if f.contains(wasi_common::file::FdFlags::APPEND) { + if f.contains(crate::file::FdFlags::APPEND) { out |= system_interface::fs::FdFlags::APPEND; } - if f.contains(wasi_common::file::FdFlags::DSYNC) { + if f.contains(crate::file::FdFlags::DSYNC) { out |= system_interface::fs::FdFlags::DSYNC; } - if f.contains(wasi_common::file::FdFlags::NONBLOCK) { + if f.contains(crate::file::FdFlags::NONBLOCK) { out |= system_interface::fs::FdFlags::NONBLOCK; } - if f.contains(wasi_common::file::FdFlags::RSYNC) { + if f.contains(crate::file::FdFlags::RSYNC) { out |= system_interface::fs::FdFlags::RSYNC; } - if f.contains(wasi_common::file::FdFlags::SYNC) { + if f.contains(crate::file::FdFlags::SYNC) { out |= system_interface::fs::FdFlags::SYNC; } out @@ -221,23 +218,23 @@ pub(crate) fn to_sysif_fdflags(f: wasi_common::file::FdFlags) -> system_interfac /// Return the file-descriptor flags for a given file-like object. /// /// This returns the flags needed to implement [`WasiFile::get_fdflags`]. -pub fn get_fd_flags(f: Filelike) -> io::Result { +pub fn get_fd_flags(f: Filelike) -> io::Result { let f = f.as_filelike().get_fd_flags()?; - let mut out = wasi_common::file::FdFlags::empty(); + let mut out = crate::file::FdFlags::empty(); if f.contains(system_interface::fs::FdFlags::APPEND) { - out |= wasi_common::file::FdFlags::APPEND; + out |= crate::file::FdFlags::APPEND; } if f.contains(system_interface::fs::FdFlags::DSYNC) { - out |= wasi_common::file::FdFlags::DSYNC; + out |= crate::file::FdFlags::DSYNC; } if f.contains(system_interface::fs::FdFlags::NONBLOCK) { - out |= wasi_common::file::FdFlags::NONBLOCK; + out |= crate::file::FdFlags::NONBLOCK; } if f.contains(system_interface::fs::FdFlags::RSYNC) { - out |= wasi_common::file::FdFlags::RSYNC; + out |= crate::file::FdFlags::RSYNC; } if f.contains(system_interface::fs::FdFlags::SYNC) { - out |= wasi_common::file::FdFlags::SYNC; + out |= crate::file::FdFlags::SYNC; } Ok(out) } diff --git a/crates/wasi-common/cap-std-sync/src/lib.rs b/crates/wasi-common/src/sync/mod.rs similarity index 61% rename from crates/wasi-common/cap-std-sync/src/lib.rs rename to crates/wasi-common/src/sync/mod.rs index 832c77cfa496..8fe5db70226d 100644 --- a/crates/wasi-common/cap-std-sync/src/lib.rs +++ b/crates/wasi-common/src/sync/mod.rs @@ -7,31 +7,12 @@ //! and windows in separate modules. //! //! Any `wasi_common::{WasiCtx, WasiCtxBuilder}` is interoperable with the -//! `wasi-cap-std-sync` crate. However, for convenience, `wasi-cap-std-sync` -//! provides its own `WasiCtxBuilder` that hooks up to all of the crate's -//! components, i.e. it fills in all of the arguments to +//! implementations provided in `wasi_common::sync`. However, for convenience, +//! this module provides its own `WasiCtxBuilder` that hooks up to all of the +//! crate's components, i.e. it fills in all of the arguments to //! `WasiCtx::builder(...)`, presents `preopen_dir` in terms of //! `cap_std::fs::Dir`, and provides convenience methods for inheriting the //! parent process's stdio, args, and env. -//! -//! For the convenience of consumers, `cap_std::fs::Dir` is re-exported from -//! this crate. This saves consumers tracking an additional dep on the exact -//! version of cap_std used by this crate, if they want to avoid it. -//! -//! The only place we expect to run into long-term compatibility issues -//! between `wasi-cap-std-sync` and the other impl crates that will come later -//! is in the `Sched` abstraction. Once we can build an async scheduler based -//! on Rust `Future`s, async impls will be able to interoperate, but the -//! synchronous scheduler depends on downcasting the `WasiFile` type down to -//! concrete types it knows about (which in turn impl `AsFd` for passing to -//! unix `poll`, or the analogous traits on windows). -//! -//! Why is this impl suffixed with `-sync`? Because `async` is coming soon! -//! The async impl may end up depending on tokio or other relatively heavy -//! deps, so we will retain a sync implementation so that wasi-common users -//! have an option of not pulling in an async runtime. - -#![cfg_attr(io_lifetimes_use_std, feature(io_safety))] pub mod clocks; pub mod dir; @@ -46,11 +27,11 @@ pub use cap_std::net::TcpListener; pub use clocks::clocks_ctx; pub use sched::sched_ctx; -use crate::net::Socket; +use self::net::Socket; +use crate::{file::FileAccessMode, table::Table, Error, WasiCtx, WasiFile}; use cap_rand::{Rng, RngCore, SeedableRng}; use std::mem; use std::path::Path; -use wasi_common::{file::FileAccessMode, table::Table, Error, WasiCtx, WasiFile}; pub struct WasiCtxBuilder { ctx: WasiCtx, @@ -64,40 +45,33 @@ impl WasiCtxBuilder { built: false, } } - pub fn env( - &mut self, - var: &str, - value: &str, - ) -> Result<&mut Self, wasi_common::StringArrayError> { + pub fn env(&mut self, var: &str, value: &str) -> Result<&mut Self, crate::StringArrayError> { self.ctx.push_env(var, value)?; Ok(self) } - pub fn envs( - &mut self, - env: &[(String, String)], - ) -> Result<&mut Self, wasi_common::StringArrayError> { + pub fn envs(&mut self, env: &[(String, String)]) -> Result<&mut Self, crate::StringArrayError> { for (k, v) in env { self.ctx.push_env(k, v)?; } Ok(self) } - pub fn inherit_env(&mut self) -> Result<&mut Self, wasi_common::StringArrayError> { + pub fn inherit_env(&mut self) -> Result<&mut Self, crate::StringArrayError> { for (key, value) in std::env::vars() { self.ctx.push_env(&key, &value)?; } Ok(self) } - pub fn arg(&mut self, arg: &str) -> Result<&mut Self, wasi_common::StringArrayError> { + pub fn arg(&mut self, arg: &str) -> Result<&mut Self, crate::StringArrayError> { self.ctx.push_arg(arg)?; Ok(self) } - pub fn args(&mut self, arg: &[String]) -> Result<&mut Self, wasi_common::StringArrayError> { + pub fn args(&mut self, arg: &[String]) -> Result<&mut Self, crate::StringArrayError> { for a in arg { self.ctx.push_arg(&a)?; } Ok(self) } - pub fn inherit_args(&mut self) -> Result<&mut Self, wasi_common::StringArrayError> { + pub fn inherit_args(&mut self) -> Result<&mut Self, crate::StringArrayError> { for arg in std::env::args() { self.ctx.push_arg(&arg)?; } @@ -116,13 +90,13 @@ impl WasiCtxBuilder { self } pub fn inherit_stdin(&mut self) -> &mut Self { - self.stdin(Box::new(crate::stdio::stdin())) + self.stdin(Box::new(crate::sync::stdio::stdin())) } pub fn inherit_stdout(&mut self) -> &mut Self { - self.stdout(Box::new(crate::stdio::stdout())) + self.stdout(Box::new(crate::sync::stdio::stdout())) } pub fn inherit_stderr(&mut self) -> &mut Self { - self.stderr(Box::new(crate::stdio::stderr())) + self.stderr(Box::new(crate::sync::stdio::stderr())) } pub fn inherit_stdio(&mut self) -> &mut Self { self.inherit_stdin().inherit_stdout().inherit_stderr() @@ -132,7 +106,7 @@ impl WasiCtxBuilder { dir: Dir, guest_path: impl AsRef, ) -> Result<&mut Self, Error> { - let dir = Box::new(crate::dir::Dir::from_cap_std(dir)); + let dir = Box::new(crate::sync::dir::Dir::from_cap_std(dir)); self.ctx.push_preopened_dir(dir, guest_path)?; Ok(self) } @@ -159,3 +133,6 @@ pub fn random_ctx() -> Box { let mut rng = cap_rand::thread_rng(cap_rand::ambient_authority()); Box::new(cap_rand::rngs::StdRng::from_seed(rng.gen())) } + +#[cfg(feature = "wasmtime")] +super::define_wasi!(block_on); diff --git a/crates/wasi-common/cap-std-sync/src/net.rs b/crates/wasi-common/src/sync/net.rs similarity index 91% rename from crates/wasi-common/cap-std-sync/src/net.rs rename to crates/wasi-common/src/sync/net.rs index c0750cd83e46..14dcaa14d482 100644 --- a/crates/wasi-common/cap-std-sync/src/net.rs +++ b/crates/wasi-common/src/sync/net.rs @@ -1,3 +1,7 @@ +use crate::{ + file::{FdFlags, FileType, RiFlags, RoFlags, SdFlags, SiFlags, WasiFile}, + Error, ErrorExt, +}; #[cfg(windows)] use io_extras::os::windows::{AsRawHandleOrSocket, RawHandleOrSocket}; use io_lifetimes::AsSocketlike; @@ -13,10 +17,6 @@ use system_interface::fs::GetSetFdFlags; use system_interface::io::IoExt; use system_interface::io::IsReadWrite; use system_interface::io::ReadReady; -use wasi_common::{ - file::{FdFlags, FileType, RiFlags, RoFlags, SdFlags, SiFlags, WasiFile}, - Error, ErrorExt, -}; pub enum Socket { TcpListener(cap_std::net::TcpListener), @@ -57,10 +57,10 @@ impl From for Socket { impl From for Box { fn from(listener: Socket) -> Self { match listener { - Socket::TcpListener(l) => Box::new(crate::net::TcpListener::from_cap_std(l)), - Socket::UnixListener(l) => Box::new(crate::net::UnixListener::from_cap_std(l)), - Socket::TcpStream(l) => Box::new(crate::net::TcpStream::from_cap_std(l)), - Socket::UnixStream(l) => Box::new(crate::net::UnixStream::from_cap_std(l)), + Socket::TcpListener(l) => Box::new(crate::sync::net::TcpListener::from_cap_std(l)), + Socket::UnixListener(l) => Box::new(crate::sync::net::UnixListener::from_cap_std(l)), + Socket::TcpStream(l) => Box::new(crate::sync::net::TcpStream::from_cap_std(l)), + Socket::UnixStream(l) => Box::new(crate::sync::net::UnixStream::from_cap_std(l)), } } } @@ -69,15 +69,15 @@ impl From for Box { impl From for Box { fn from(listener: Socket) -> Self { match listener { - Socket::TcpListener(l) => Box::new(crate::net::TcpListener::from_cap_std(l)), - Socket::TcpStream(l) => Box::new(crate::net::TcpStream::from_cap_std(l)), + Socket::TcpListener(l) => Box::new(crate::sync::net::TcpListener::from_cap_std(l)), + Socket::TcpStream(l) => Box::new(crate::sync::net::TcpStream::from_cap_std(l)), } } } macro_rules! wasi_listen_write_impl { ($ty:ty, $stream:ty) => { - #[async_trait::async_trait] + #[wiggle::async_trait] impl WasiFile for $ty { fn as_any(&self) -> &dyn Any { self @@ -105,7 +105,7 @@ macro_rules! wasi_listen_write_impl { Ok(fdflags) } async fn set_fdflags(&mut self, fdflags: FdFlags) -> Result<(), Error> { - if fdflags == wasi_common::file::FdFlags::NONBLOCK { + if fdflags == crate::file::FdFlags::NONBLOCK { self.0.set_nonblocking(true)?; } else if fdflags.is_empty() { self.0.set_nonblocking(false)?; @@ -170,7 +170,7 @@ wasi_listen_write_impl!(UnixListener, UnixStream); macro_rules! wasi_stream_write_impl { ($ty:ty, $std_ty:ty) => { - #[async_trait::async_trait] + #[wiggle::async_trait] impl WasiFile for $ty { fn as_any(&self) -> &dyn Any { self @@ -192,7 +192,7 @@ macro_rules! wasi_stream_write_impl { Ok(fdflags) } async fn set_fdflags(&mut self, fdflags: FdFlags) -> Result<(), Error> { - if fdflags == wasi_common::file::FdFlags::NONBLOCK { + if fdflags == crate::file::FdFlags::NONBLOCK { self.0.set_nonblocking(true)?; } else if fdflags.is_empty() { self.0.set_nonblocking(false)?; @@ -356,18 +356,16 @@ pub fn filetype_from(ft: &cap_std::fs::FileType) -> FileType { /// Return the file-descriptor flags for a given file-like object. /// /// This returns the flags needed to implement [`WasiFile::get_fdflags`]. -pub fn get_fd_flags( - f: Socketlike, -) -> io::Result { +pub fn get_fd_flags(f: Socketlike) -> io::Result { // On Unix-family platforms, we can use the same system call that we'd use // for files on sockets here. #[cfg(not(windows))] { - let mut out = wasi_common::file::FdFlags::empty(); + let mut out = crate::file::FdFlags::empty(); if f.get_fd_flags()? .contains(system_interface::fs::FdFlags::NONBLOCK) { - out |= wasi_common::file::FdFlags::NONBLOCK; + out |= crate::file::FdFlags::NONBLOCK; } Ok(out) } @@ -377,8 +375,8 @@ pub fn get_fd_flags( // by testing whether a zero-length `recv` appears to block. #[cfg(windows)] match rustix::net::recv(f, &mut [], rustix::net::RecvFlags::empty()) { - Ok(_) => Ok(wasi_common::file::FdFlags::empty()), - Err(rustix::io::Errno::WOULDBLOCK) => Ok(wasi_common::file::FdFlags::NONBLOCK), + Ok(_) => Ok(crate::file::FdFlags::empty()), + Err(rustix::io::Errno::WOULDBLOCK) => Ok(crate::file::FdFlags::NONBLOCK), Err(e) => Err(e.into()), } } diff --git a/crates/wasi-common/cap-std-sync/src/sched.rs b/crates/wasi-common/src/sync/sched.rs similarity index 94% rename from crates/wasi-common/cap-std-sync/src/sched.rs rename to crates/wasi-common/src/sync/sched.rs index df8622f07d8b..e49ef46428fc 100644 --- a/crates/wasi-common/cap-std-sync/src/sched.rs +++ b/crates/wasi-common/src/sync/sched.rs @@ -8,12 +8,12 @@ pub mod windows; #[cfg(windows)] pub use windows::poll_oneoff; -use std::thread; -use std::time::Duration; -use wasi_common::{ +use crate::{ sched::{Poll, WasiSched}, Error, }; +use std::thread; +use std::time::Duration; pub struct SyncSched {} impl SyncSched { @@ -21,7 +21,7 @@ impl SyncSched { Self {} } } -#[async_trait::async_trait] +#[wiggle::async_trait] impl WasiSched for SyncSched { async fn poll_oneoff<'a>(&self, poll: &mut Poll<'a>) -> Result<(), Error> { poll_oneoff(poll).await diff --git a/crates/wasi-common/cap-std-sync/src/sched/unix.rs b/crates/wasi-common/src/sync/sched/unix.rs similarity index 96% rename from crates/wasi-common/cap-std-sync/src/sched/unix.rs rename to crates/wasi-common/src/sync/sched/unix.rs index 77176a7e272b..0d9db86ae311 100644 --- a/crates/wasi-common/cap-std-sync/src/sched/unix.rs +++ b/crates/wasi-common/src/sync/sched/unix.rs @@ -1,8 +1,8 @@ +use crate::sched::subscription::{RwEventFlags, Subscription}; +use crate::{sched::Poll, Error, ErrorExt}; use cap_std::time::Duration; use rustix::event::{PollFd, PollFlags}; use std::convert::TryInto; -use wasi_common::sched::subscription::{RwEventFlags, Subscription}; -use wasi_common::{sched::Poll, Error, ErrorExt}; pub async fn poll_oneoff<'a>(poll: &mut Poll<'a>) -> Result<(), Error> { if poll.is_empty() { diff --git a/crates/wasi-common/cap-std-sync/src/sched/windows.rs b/crates/wasi-common/src/sync/sched/windows.rs similarity index 97% rename from crates/wasi-common/cap-std-sync/src/sched/windows.rs rename to crates/wasi-common/src/sync/sched/windows.rs index d67d30d922d1..6a5499c8f5d2 100644 --- a/crates/wasi-common/cap-std-sync/src/sched/windows.rs +++ b/crates/wasi-common/src/sync/sched/windows.rs @@ -8,13 +8,13 @@ // We suspect there are bugs in this scheduler, however, we have not // taken the time to improve it. See bug #2880. +use crate::sched::subscription::{RwEventFlags, Subscription}; +use crate::{file::WasiFile, sched::Poll, Error, ErrorExt}; use once_cell::sync::Lazy; use std::sync::mpsc::{self, Receiver, RecvTimeoutError, Sender, TryRecvError}; use std::sync::Mutex; use std::thread; use std::time::Duration; -use wasi_common::sched::subscription::{RwEventFlags, Subscription}; -use wasi_common::{file::WasiFile, sched::Poll, Error, ErrorExt}; pub async fn poll_oneoff<'a>(poll: &mut Poll<'a>) -> Result<(), Error> { poll_oneoff_(poll, wasi_file_is_stdin).await @@ -122,7 +122,7 @@ pub async fn poll_oneoff_<'a>( } pub fn wasi_file_is_stdin(f: &dyn WasiFile) -> bool { - f.as_any().is::() + f.as_any().is::() } enum PollState { diff --git a/crates/wasi-common/cap-std-sync/src/stdio.rs b/crates/wasi-common/src/sync/stdio.rs similarity index 94% rename from crates/wasi-common/cap-std-sync/src/stdio.rs rename to crates/wasi-common/src/sync/stdio.rs index af4d52faab28..70ce38c33afb 100644 --- a/crates/wasi-common/cap-std-sync/src/stdio.rs +++ b/crates/wasi-common/src/sync/stdio.rs @@ -1,20 +1,20 @@ -use crate::file::convert_systimespec; +use crate::sync::file::convert_systimespec; use fs_set_times::SetTimes; use std::any::Any; use std::convert::TryInto; use std::io::{self, IsTerminal, Read, Write}; use system_interface::io::ReadReady; +use crate::{ + file::{FdFlags, FileType, WasiFile}, + Error, ErrorExt, +}; #[cfg(windows)] use io_extras::os::windows::{AsRawHandleOrSocket, RawHandleOrSocket}; #[cfg(unix)] use io_lifetimes::{AsFd, BorrowedFd}; #[cfg(windows)] use io_lifetimes::{AsHandle, BorrowedHandle}; -use wasi_common::{ - file::{FdFlags, FileType, WasiFile}, - Error, ErrorExt, -}; pub struct Stdin(std::io::Stdin); @@ -22,7 +22,7 @@ pub fn stdin() -> Stdin { Stdin(std::io::stdin()) } -#[async_trait::async_trait] +#[wiggle::async_trait] impl WasiFile for Stdin { fn as_any(&self) -> &dyn Any { self @@ -64,8 +64,8 @@ impl WasiFile for Stdin { } async fn set_times( &self, - atime: Option, - mtime: Option, + atime: Option, + mtime: Option, ) -> Result<(), Error> { self.0 .set_times(convert_systimespec(atime), convert_systimespec(mtime))?; @@ -103,7 +103,7 @@ impl AsFd for Stdin { macro_rules! wasi_file_write_impl { ($ty:ty, $ident:ident) => { - #[async_trait::async_trait] + #[wiggle::async_trait] impl WasiFile for $ty { fn as_any(&self) -> &dyn Any { self @@ -149,8 +149,8 @@ macro_rules! wasi_file_write_impl { } async fn set_times( &self, - atime: Option, - mtime: Option, + atime: Option, + mtime: Option, ) -> Result<(), Error> { self.0 .set_times(convert_systimespec(atime), convert_systimespec(mtime))?; diff --git a/crates/wasi-common/tokio/src/dir.rs b/crates/wasi-common/src/tokio/dir.rs similarity index 88% rename from crates/wasi-common/tokio/src/dir.rs rename to crates/wasi-common/src/tokio/dir.rs index 5482a08c7619..22bf16a9dd13 100644 --- a/crates/wasi-common/tokio/src/dir.rs +++ b/crates/wasi-common/src/tokio/dir.rs @@ -1,17 +1,17 @@ -use crate::{block_on_dummy_executor, file::File}; -use std::any::Any; -use std::path::PathBuf; -use wasi_common::{ +use crate::tokio::{block_on_dummy_executor, file::File}; +use crate::{ dir::{ReaddirCursor, ReaddirEntity, WasiDir}, file::{FdFlags, Filestat, OFlags}, Error, ErrorExt, }; +use std::any::Any; +use std::path::PathBuf; -pub struct Dir(wasi_cap_std_sync::dir::Dir); +pub struct Dir(crate::sync::dir::Dir); impl Dir { pub fn from_cap_std(dir: cap_std::fs::Dir) -> Self { - Dir(wasi_cap_std_sync::dir::Dir::from_cap_std(dir)) + Dir(crate::sync::dir::Dir::from_cap_std(dir)) } } @@ -28,17 +28,17 @@ impl WasiDir for Dir { read: bool, write: bool, fdflags: FdFlags, - ) -> Result { + ) -> Result { let f = block_on_dummy_executor(move || async move { self.0 .open_file_(symlink_follow, path, oflags, read, write, fdflags) })?; match f { - wasi_cap_std_sync::dir::OpenResult::File(f) => Ok(wasi_common::dir::OpenResult::File( - Box::new(File::from_inner(f)), - )), - wasi_cap_std_sync::dir::OpenResult::Dir(d) => { - Ok(wasi_common::dir::OpenResult::Dir(Box::new(Dir(d)))) + crate::sync::dir::OpenResult::File(f) => { + Ok(crate::dir::OpenResult::File(Box::new(File::from_inner(f)))) + } + crate::sync::dir::OpenResult::Dir(d) => { + Ok(crate::dir::OpenResult::Dir(Box::new(Dir(d)))) } } } @@ -116,8 +116,8 @@ impl WasiDir for Dir { async fn set_times( &self, path: &str, - atime: Option, - mtime: Option, + atime: Option, + mtime: Option, follow_symlinks: bool, ) -> Result<(), Error> { block_on_dummy_executor(move || self.0.set_times(path, atime, mtime, follow_symlinks)) @@ -127,8 +127,8 @@ impl WasiDir for Dir { #[cfg(test)] mod test { use super::Dir; + use crate::file::{FdFlags, OFlags}; use cap_std::ambient_authority; - use wasi_common::file::{FdFlags, OFlags}; #[tokio::test(flavor = "multi_thread")] async fn scratch_dir() { @@ -139,7 +139,7 @@ mod test { let preopen_dir = cap_std::fs::Dir::open_ambient_dir(tempdir.path(), ambient_authority()) .expect("open ambient temporary dir"); let preopen_dir = Dir::from_cap_std(preopen_dir); - wasi_common::WasiDir::open_file( + crate::WasiDir::open_file( &preopen_dir, false, ".", @@ -156,9 +156,9 @@ mod test { #[cfg(not(windows))] #[tokio::test(flavor = "multi_thread")] async fn readdir() { + use crate::dir::{ReaddirCursor, ReaddirEntity, WasiDir}; + use crate::file::{FdFlags, FileType, OFlags}; use std::collections::HashMap; - use wasi_common::dir::{ReaddirCursor, ReaddirEntity, WasiDir}; - use wasi_common::file::{FdFlags, FileType, OFlags}; async fn readdir_into_map(dir: &dyn WasiDir) -> HashMap { let mut out = HashMap::new(); diff --git a/crates/wasi-common/tokio/src/file.rs b/crates/wasi-common/src/tokio/file.rs similarity index 83% rename from crates/wasi-common/tokio/src/file.rs rename to crates/wasi-common/src/tokio/file.rs index 2fa8ddaf8639..adcb68baa6fd 100644 --- a/crates/wasi-common/tokio/src/file.rs +++ b/crates/wasi-common/src/tokio/file.rs @@ -1,4 +1,8 @@ -use crate::block_on_dummy_executor; +use crate::tokio::block_on_dummy_executor; +use crate::{ + file::{Advice, FdFlags, FileType, Filestat, WasiFile}, + Error, +}; #[cfg(windows)] use io_extras::os::windows::{AsRawHandleOrSocket, RawHandleOrSocket}; #[cfg(not(windows))] @@ -6,86 +10,82 @@ use io_lifetimes::AsFd; use std::any::Any; use std::borrow::Borrow; use std::io; -use wasi_common::{ - file::{Advice, FdFlags, FileType, Filestat, WasiFile}, - Error, -}; -pub struct File(wasi_cap_std_sync::file::File); +pub struct File(crate::sync::file::File); impl File { - pub(crate) fn from_inner(file: wasi_cap_std_sync::file::File) -> Self { + pub(crate) fn from_inner(file: crate::sync::file::File) -> Self { File(file) } pub fn from_cap_std(file: cap_std::fs::File) -> Self { - Self::from_inner(wasi_cap_std_sync::file::File::from_cap_std(file)) + Self::from_inner(crate::sync::file::File::from_cap_std(file)) } } -pub struct TcpListener(wasi_cap_std_sync::net::TcpListener); +pub struct TcpListener(crate::sync::net::TcpListener); impl TcpListener { - pub(crate) fn from_inner(listener: wasi_cap_std_sync::net::TcpListener) -> Self { + pub(crate) fn from_inner(listener: crate::sync::net::TcpListener) -> Self { TcpListener(listener) } pub fn from_cap_std(listener: cap_std::net::TcpListener) -> Self { - Self::from_inner(wasi_cap_std_sync::net::TcpListener::from_cap_std(listener)) + Self::from_inner(crate::sync::net::TcpListener::from_cap_std(listener)) } } -pub struct TcpStream(wasi_cap_std_sync::net::TcpStream); +pub struct TcpStream(crate::sync::net::TcpStream); impl TcpStream { - pub(crate) fn from_inner(stream: wasi_cap_std_sync::net::TcpStream) -> Self { + pub(crate) fn from_inner(stream: crate::sync::net::TcpStream) -> Self { TcpStream(stream) } pub fn from_cap_std(stream: cap_std::net::TcpStream) -> Self { - Self::from_inner(wasi_cap_std_sync::net::TcpStream::from_cap_std(stream)) + Self::from_inner(crate::sync::net::TcpStream::from_cap_std(stream)) } } #[cfg(unix)] -pub struct UnixListener(wasi_cap_std_sync::net::UnixListener); +pub struct UnixListener(crate::sync::net::UnixListener); #[cfg(unix)] impl UnixListener { - pub(crate) fn from_inner(listener: wasi_cap_std_sync::net::UnixListener) -> Self { + pub(crate) fn from_inner(listener: crate::sync::net::UnixListener) -> Self { UnixListener(listener) } pub fn from_cap_std(listener: cap_std::os::unix::net::UnixListener) -> Self { - Self::from_inner(wasi_cap_std_sync::net::UnixListener::from_cap_std(listener)) + Self::from_inner(crate::sync::net::UnixListener::from_cap_std(listener)) } } #[cfg(unix)] -pub struct UnixStream(wasi_cap_std_sync::net::UnixStream); +pub struct UnixStream(crate::sync::net::UnixStream); #[cfg(unix)] impl UnixStream { - fn from_inner(stream: wasi_cap_std_sync::net::UnixStream) -> Self { + fn from_inner(stream: crate::sync::net::UnixStream) -> Self { UnixStream(stream) } pub fn from_cap_std(stream: cap_std::os::unix::net::UnixStream) -> Self { - Self::from_inner(wasi_cap_std_sync::net::UnixStream::from_cap_std(stream)) + Self::from_inner(crate::sync::net::UnixStream::from_cap_std(stream)) } } -pub struct Stdin(wasi_cap_std_sync::stdio::Stdin); +pub struct Stdin(crate::sync::stdio::Stdin); pub fn stdin() -> Stdin { - Stdin(wasi_cap_std_sync::stdio::stdin()) + Stdin(crate::sync::stdio::stdin()) } -pub struct Stdout(wasi_cap_std_sync::stdio::Stdout); +pub struct Stdout(crate::sync::stdio::Stdout); pub fn stdout() -> Stdout { - Stdout(wasi_cap_std_sync::stdio::stdout()) + Stdout(crate::sync::stdio::stdout()) } -pub struct Stderr(wasi_cap_std_sync::stdio::Stderr); +pub struct Stderr(crate::sync::stdio::Stderr); pub fn stderr() -> Stderr { - Stderr(wasi_cap_std_sync::stdio::stderr()) + Stderr(crate::sync::stdio::stderr()) } macro_rules! wasi_file_impl { @@ -148,6 +148,9 @@ macro_rules! wasi_file_impl { bufs: &[io::IoSlice<'a>], offset: u64, ) -> Result { + if bufs.iter().map(|i| i.len()).sum::() == 0 { + return Ok(0); + } block_on_dummy_executor(move || self.0.write_vectored_at(bufs, offset)) } async fn seek(&self, pos: std::io::SeekFrom) -> Result { @@ -158,8 +161,8 @@ macro_rules! wasi_file_impl { } async fn set_times( &self, - atime: Option, - mtime: Option, + atime: Option, + mtime: Option, ) -> Result<(), Error> { block_on_dummy_executor(move || self.0.set_times(atime, mtime)) } diff --git a/crates/wasi-common/tokio/src/lib.rs b/crates/wasi-common/src/tokio/mod.rs similarity index 73% rename from crates/wasi-common/tokio/src/lib.rs rename to crates/wasi-common/src/tokio/mod.rs index a65021c19af5..9042eb4d671d 100644 --- a/crates/wasi-common/tokio/src/lib.rs +++ b/crates/wasi-common/src/tokio/mod.rs @@ -6,16 +6,16 @@ pub mod net; pub mod sched; pub mod stdio; -use crate::sched::sched_ctx; +use self::sched::sched_ctx; +use crate::sync::net::Socket; +pub use crate::sync::{clocks_ctx, random_ctx}; +use crate::{file::FileAccessMode, Error, Table, WasiCtx, WasiFile}; pub use dir::Dir; pub use file::File; pub use net::*; use std::future::Future; use std::mem; use std::path::Path; -use wasi_cap_std_sync::net::Socket; -pub use wasi_cap_std_sync::{clocks_ctx, random_ctx}; -use wasi_common::{file::FileAccessMode, Error, Table, WasiCtx, WasiFile}; pub struct WasiCtxBuilder { ctx: WasiCtx, @@ -29,40 +29,33 @@ impl WasiCtxBuilder { built: false, } } - pub fn env( - &mut self, - var: &str, - value: &str, - ) -> Result<&mut Self, wasi_common::StringArrayError> { + pub fn env(&mut self, var: &str, value: &str) -> Result<&mut Self, crate::StringArrayError> { self.ctx.push_env(var, value)?; Ok(self) } - pub fn envs( - &mut self, - env: &[(String, String)], - ) -> Result<&mut Self, wasi_common::StringArrayError> { + pub fn envs(&mut self, env: &[(String, String)]) -> Result<&mut Self, crate::StringArrayError> { for (k, v) in env { self.ctx.push_env(k, v)?; } Ok(self) } - pub fn inherit_env(&mut self) -> Result<&mut Self, wasi_common::StringArrayError> { + pub fn inherit_env(&mut self) -> Result<&mut Self, crate::StringArrayError> { for (key, value) in std::env::vars() { self.ctx.push_env(&key, &value)?; } Ok(self) } - pub fn arg(&mut self, arg: &str) -> Result<&mut Self, wasi_common::StringArrayError> { + pub fn arg(&mut self, arg: &str) -> Result<&mut Self, crate::StringArrayError> { self.ctx.push_arg(arg)?; Ok(self) } - pub fn args(&mut self, arg: &[String]) -> Result<&mut Self, wasi_common::StringArrayError> { + pub fn args(&mut self, arg: &[String]) -> Result<&mut Self, crate::StringArrayError> { for a in arg { self.ctx.push_arg(&a)?; } Ok(self) } - pub fn inherit_args(&mut self) -> Result<&mut Self, wasi_common::StringArrayError> { + pub fn inherit_args(&mut self) -> Result<&mut Self, crate::StringArrayError> { for arg in std::env::args() { self.ctx.push_arg(&arg)?; } @@ -81,13 +74,13 @@ impl WasiCtxBuilder { self } pub fn inherit_stdin(&mut self) -> &mut Self { - self.stdin(Box::new(crate::stdio::stdin())) + self.stdin(Box::new(crate::tokio::stdio::stdin())) } pub fn inherit_stdout(&mut self) -> &mut Self { - self.stdout(Box::new(crate::stdio::stdout())) + self.stdout(Box::new(crate::tokio::stdio::stdout())) } pub fn inherit_stderr(&mut self) -> &mut Self { - self.stderr(Box::new(crate::stdio::stderr())) + self.stderr(Box::new(crate::tokio::stdio::stderr())) } pub fn inherit_stdio(&mut self) -> &mut Self { self.inherit_stdin().inherit_stdout().inherit_stderr() @@ -97,7 +90,7 @@ impl WasiCtxBuilder { dir: cap_std::fs::Dir, guest_path: impl AsRef, ) -> Result<&mut Self, Error> { - let dir = Box::new(crate::dir::Dir::from_cap_std(dir)); + let dir = Box::new(crate::tokio::dir::Dir::from_cap_std(dir)); self.ctx.push_preopened_dir(dir, guest_path)?; Ok(self) } @@ -121,8 +114,8 @@ impl WasiCtxBuilder { } } -// Much of this crate is implemented in terms of `async` methods from the -// wasi-cap-std-sync crate. These methods may be async in signature, however, +// Much of this mod is implemented in terms of `async` methods from the +// wasmtime_wasi::sync module. These methods may be async in signature, however, // they are synchronous in implementation (always Poll::Ready on first poll) // and perform blocking syscalls. // @@ -139,3 +132,6 @@ where wiggle::run_in_dummy_executor(f()).expect("wrapped operation should be synchronous") }) } + +#[cfg(feature = "wasmtime")] +super::define_wasi!(async T: Send); diff --git a/crates/wasi-common/src/tokio/net.rs b/crates/wasi-common/src/tokio/net.rs new file mode 100644 index 000000000000..93a807ec8294 --- /dev/null +++ b/crates/wasi-common/src/tokio/net.rs @@ -0,0 +1,6 @@ +pub use super::file::TcpListener; +pub use super::file::TcpStream; +#[cfg(unix)] +pub use super::file::UnixListener; +#[cfg(unix)] +pub use super::file::UnixStream; diff --git a/crates/wasi-common/tokio/src/sched.rs b/crates/wasi-common/src/tokio/sched.rs similarity index 90% rename from crates/wasi-common/tokio/src/sched.rs rename to crates/wasi-common/src/tokio/sched.rs index 1b971666415b..e5c5a42a789d 100644 --- a/crates/wasi-common/tokio/src/sched.rs +++ b/crates/wasi-common/src/tokio/sched.rs @@ -8,12 +8,12 @@ mod windows; #[cfg(windows)] pub use windows::poll_oneoff; -use wasi_common::{ +use crate::{ sched::{Duration, Poll, WasiSched}, Error, }; -pub fn sched_ctx() -> Box { +pub fn sched_ctx() -> Box { struct AsyncSched; #[wiggle::async_trait] diff --git a/crates/wasi-common/tokio/src/sched/unix.rs b/crates/wasi-common/src/tokio/sched/unix.rs similarity index 99% rename from crates/wasi-common/tokio/src/sched/unix.rs rename to crates/wasi-common/src/tokio/sched/unix.rs index 4fd47d1cb248..ca28242342fb 100644 --- a/crates/wasi-common/tokio/src/sched/unix.rs +++ b/crates/wasi-common/src/tokio/sched/unix.rs @@ -1,13 +1,13 @@ -use std::future::Future; -use std::pin::Pin; -use std::task::{Context, Poll as FPoll}; -use wasi_common::{ +use crate::{ sched::{ subscription::{RwEventFlags, Subscription}, Poll, }, Error, }; +use std::future::Future; +use std::pin::Pin; +use std::task::{Context, Poll as FPoll}; struct FirstReady<'a, T>(Vec + Send + 'a>>>); diff --git a/crates/wasi-common/tokio/src/sched/windows.rs b/crates/wasi-common/src/tokio/sched/windows.rs similarity index 55% rename from crates/wasi-common/tokio/src/sched/windows.rs rename to crates/wasi-common/src/tokio/sched/windows.rs index 54cf8615b69f..55b4f5f5374e 100644 --- a/crates/wasi-common/tokio/src/sched/windows.rs +++ b/crates/wasi-common/src/tokio/sched/windows.rs @@ -1,15 +1,15 @@ -use crate::block_on_dummy_executor; -use wasi_cap_std_sync::sched::windows::poll_oneoff_; -use wasi_common::{file::WasiFile, sched::Poll, Error}; +use crate::sync::sched::windows::poll_oneoff_; +use crate::tokio::block_on_dummy_executor; +use crate::{file::WasiFile, sched::Poll, Error}; pub async fn poll_oneoff<'a>(poll: &mut Poll<'a>) -> Result<(), Error> { // Tokio doesn't provide us the AsyncFd primitive on Windows, so instead - // we use the blocking poll_oneoff implementation from the wasi-cap-std-crate. - // We provide a function specific to this crate's WasiFile types for downcasting + // we use the blocking poll_oneoff implementation from the wasi_common::sync impl. + // We provide a function specific to this impl's WasiFile types for downcasting // to a RawHandle. block_on_dummy_executor(move || poll_oneoff_(poll, wasi_file_is_stdin)) } pub fn wasi_file_is_stdin(f: &dyn WasiFile) -> bool { - f.as_any().is::() + f.as_any().is::() } diff --git a/crates/wasi-common/src/tokio/stdio.rs b/crates/wasi-common/src/tokio/stdio.rs new file mode 100644 index 000000000000..91590363ede3 --- /dev/null +++ b/crates/wasi-common/src/tokio/stdio.rs @@ -0,0 +1 @@ +pub use super::file::{stderr, stdin, stdout, Stderr, Stdin, Stdout}; diff --git a/crates/wasi-common/tests/all/async_.rs b/crates/wasi-common/tests/all/async_.rs index e235d180b38e..4bcf8e828dd8 100644 --- a/crates/wasi-common/tests/all/async_.rs +++ b/crates/wasi-common/tests/all/async_.rs @@ -1,6 +1,6 @@ use super::*; use test_programs_artifacts::*; -use wasmtime_wasi::tokio::{add_to_linker, WasiCtxBuilder}; +use wasi_common::tokio::{add_to_linker, WasiCtxBuilder}; foreach_preview1!(assert_test_exists); @@ -75,8 +75,7 @@ async fn run(path: &str, inherit_stdio: bool) -> Result<()> { } // Below here is mechanical: there should be one test for every binary in -// wasi-tests. The only differences should be should_panic annotations for -// tests which fail. +// wasi-tests. #[test_log::test(tokio::test(flavor = "multi_thread"))] async fn preview1_big_random_buf() { run(PREVIEW1_BIG_RANDOM_BUF, true).await.unwrap() @@ -146,7 +145,6 @@ async fn preview1_file_unbuffered_write() { run(PREVIEW1_FILE_UNBUFFERED_WRITE, true).await.unwrap() } #[test_log::test(tokio::test(flavor = "multi_thread"))] -#[cfg_attr(windows, should_panic)] async fn preview1_interesting_paths() { run(PREVIEW1_INTERESTING_PATHS, true).await.unwrap() } @@ -201,13 +199,6 @@ async fn preview1_path_rename_dir_trailing_slashes() { .unwrap() } #[test_log::test(tokio::test(flavor = "multi_thread"))] -#[should_panic] -async fn preview1_path_rename_file_trailing_slashes() { - run(PREVIEW1_PATH_RENAME_FILE_TRAILING_SLASHES, false) - .await - .unwrap() -} -#[test_log::test(tokio::test(flavor = "multi_thread"))] async fn preview1_path_rename() { run(PREVIEW1_PATH_RENAME, true).await.unwrap() } @@ -230,11 +221,8 @@ async fn preview1_readlink() { run(PREVIEW1_READLINK, true).await.unwrap() } #[test_log::test(tokio::test(flavor = "multi_thread"))] -#[should_panic] -async fn preview1_remove_directory_trailing_slashes() { - run(PREVIEW1_REMOVE_DIRECTORY_TRAILING_SLASHES, false) - .await - .unwrap() +async fn preview1_remove_directory() { + run(PREVIEW1_REMOVE_DIRECTORY, true).await.unwrap() } #[test_log::test(tokio::test(flavor = "multi_thread"))] async fn preview1_remove_nonempty_directory() { @@ -295,3 +283,7 @@ async fn preview1_unicode_output() { async fn preview1_file_write() { run(PREVIEW1_FILE_WRITE, true).await.unwrap() } +#[test_log::test(tokio::test(flavor = "multi_thread"))] +async fn preview1_path_open_lots() { + run(PREVIEW1_PATH_OPEN_LOTS, true).await.unwrap() +} diff --git a/crates/wasi-common/tests/all/main.rs b/crates/wasi-common/tests/all/main.rs index 5324e8656e7d..2746f8c8884e 100644 --- a/crates/wasi-common/tests/all/main.rs +++ b/crates/wasi-common/tests/all/main.rs @@ -5,7 +5,7 @@ use wasi_common::pipe::WritePipe; use wasmtime::{Config, Engine, Linker, Module, Store}; pub fn prepare_workspace(exe_name: &str) -> Result { - let prefix = format!("wasi_cap_std_sync_{}_", exe_name); + let prefix = format!("wasi_common_{}_", exe_name); let tempdir = tempfile::Builder::new().prefix(&prefix).tempdir()?; Ok(tempdir) } diff --git a/crates/wasi-common/tests/all/sync.rs b/crates/wasi-common/tests/all/sync.rs index 7edb83d5584d..4af52d33a1cb 100644 --- a/crates/wasi-common/tests/all/sync.rs +++ b/crates/wasi-common/tests/all/sync.rs @@ -1,6 +1,6 @@ use super::*; use test_programs_artifacts::*; -use wasmtime_wasi::sync::{add_to_linker, WasiCtxBuilder}; +use wasi_common::sync::{add_to_linker, WasiCtxBuilder}; foreach_preview1!(assert_test_exists); @@ -67,8 +67,7 @@ fn run(path: &str, inherit_stdio: bool) -> Result<()> { } // Below here is mechanical: there should be one test for every binary in -// wasi-tests. The only differences should be should_panic annotations for -// tests which fail. +// wasi-tests. #[test_log::test] fn preview1_big_random_buf() { run(PREVIEW1_BIG_RANDOM_BUF, true).unwrap() @@ -138,7 +137,6 @@ fn preview1_file_unbuffered_write() { run(PREVIEW1_FILE_UNBUFFERED_WRITE, true).unwrap() } #[test_log::test] -#[cfg_attr(windows, should_panic)] fn preview1_interesting_paths() { run(PREVIEW1_INTERESTING_PATHS, true).unwrap() } @@ -191,11 +189,6 @@ fn preview1_path_rename_dir_trailing_slashes() { run(PREVIEW1_PATH_RENAME_DIR_TRAILING_SLASHES, true).unwrap() } #[test_log::test] -#[should_panic] -fn preview1_path_rename_file_trailing_slashes() { - run(PREVIEW1_PATH_RENAME_FILE_TRAILING_SLASHES, false).unwrap() -} -#[test_log::test] fn preview1_path_rename() { run(PREVIEW1_PATH_RENAME, true).unwrap() } @@ -216,9 +209,8 @@ fn preview1_readlink() { run(PREVIEW1_READLINK, true).unwrap() } #[test_log::test] -#[should_panic] -fn preview1_remove_directory_trailing_slashes() { - run(PREVIEW1_REMOVE_DIRECTORY_TRAILING_SLASHES, false).unwrap() +fn preview1_remove_directory() { + run(PREVIEW1_REMOVE_DIRECTORY, true).unwrap() } #[test_log::test] fn preview1_remove_nonempty_directory() { @@ -277,3 +269,7 @@ fn preview1_unicode_output() { fn preview1_file_write() { run(PREVIEW1_FILE_WRITE, true).unwrap() } +#[test_log::test] +fn preview1_path_open_lots() { + run(PREVIEW1_PATH_OPEN_LOTS, true).unwrap() +} diff --git a/crates/wasi-common/tokio/Cargo.toml b/crates/wasi-common/tokio/Cargo.toml deleted file mode 100644 index 43ad576a86a9..000000000000 --- a/crates/wasi-common/tokio/Cargo.toml +++ /dev/null @@ -1,31 +0,0 @@ -[package] -name = "wasi-tokio" -version.workspace = true -authors.workspace = true -description = "WASI implementation in Rust" -license = "Apache-2.0 WITH LLVM-exception" -categories = ["wasm"] -keywords = ["webassembly", "wasm"] -repository = "https://github.com/bytecodealliance/wasmtime" -edition.workspace = true -include = ["src/**/*", "LICENSE" ] - -[dependencies] -wasi-common = { workspace = true } -wasi-cap-std-sync = { workspace = true } -wiggle = { workspace = true } -tokio = { workspace = true, features = [ "rt", "fs", "time", "io-util", "net", "io-std", "rt-multi-thread"] } -cap-std = { workspace = true } -anyhow = { workspace = true } -io-lifetimes = { workspace = true } - -[target.'cfg(unix)'.dependencies] -rustix = { workspace = true, features = ["fs"] } - -[target.'cfg(windows)'.dependencies] -io-extras = { workspace = true } - -[dev-dependencies] -tempfile = "3.1.0" -tokio = { workspace = true, features = [ "macros" ] } -cap-tempfile = { workspace = true } diff --git a/crates/wasi-common/tokio/LICENSE b/crates/wasi-common/tokio/LICENSE deleted file mode 100644 index f9d81955f4bc..000000000000 --- a/crates/wasi-common/tokio/LICENSE +++ /dev/null @@ -1,220 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - ---- LLVM Exceptions to the Apache 2.0 License ---- - -As an exception, if, as a result of your compiling your source code, portions -of this Software are embedded into an Object form of such source code, you -may redistribute such embedded portions in such Object form without complying -with the conditions of Sections 4(a), 4(b) and 4(d) of the License. - -In addition, if you combine or link compiled forms of this Software with -software that is licensed under the GPLv2 ("Combined Software") and if a -court of competent jurisdiction determines that the patent provision (Section -3), the indemnity provision (Section 9) or other Section of the License -conflicts with the conditions of the GPLv2, you may retroactively and -prospectively choose to deem waived or otherwise exclude such Section(s) of -the License, but only in their entirety and only with respect to the Combined -Software. - diff --git a/crates/wasi-common/tokio/src/net.rs b/crates/wasi-common/tokio/src/net.rs deleted file mode 100644 index 03e390a83bcd..000000000000 --- a/crates/wasi-common/tokio/src/net.rs +++ /dev/null @@ -1,6 +0,0 @@ -pub use crate::file::TcpListener; -pub use crate::file::TcpStream; -#[cfg(unix)] -pub use crate::file::UnixListener; -#[cfg(unix)] -pub use crate::file::UnixStream; diff --git a/crates/wasi-common/tokio/src/stdio.rs b/crates/wasi-common/tokio/src/stdio.rs deleted file mode 100644 index dd23c0555aab..000000000000 --- a/crates/wasi-common/tokio/src/stdio.rs +++ /dev/null @@ -1 +0,0 @@ -pub use crate::file::{stderr, stdin, stdout, Stderr, Stdin, Stdout}; diff --git a/crates/wasi-common/tokio/tests/poll_oneoff.rs b/crates/wasi-common/tokio/tests/poll_oneoff.rs deleted file mode 100644 index 852abce2aad2..000000000000 --- a/crates/wasi-common/tokio/tests/poll_oneoff.rs +++ /dev/null @@ -1,176 +0,0 @@ -use anyhow::{Context, Error}; -use cap_std::time::Duration; -use std::collections::HashMap; -use wasi_common::{ - dir::OpenResult, - file::{FdFlags, OFlags}, - sched::{Poll, RwEventFlags, SubscriptionResult, Userdata}, - WasiDir, WasiFile, -}; -use wasi_tokio::{clocks_ctx, sched::poll_oneoff, Dir}; - -const TIMEOUT: Duration = Duration::from_millis(200); // Required for slow execution in CI - -#[tokio::test(flavor = "multi_thread")] -async fn empty_file_readable() -> Result<(), Error> { - let clocks = clocks_ctx(); - - let workspace = - cap_tempfile::tempdir(cap_tempfile::ambient_authority()).expect("create tempdir"); - workspace.create_dir("d").context("create dir")?; - let d = workspace.open_dir("d").context("open dir")?; - let d = Dir::from_cap_std(d); - - let f = d - .open_file(false, "f", OFlags::CREATE, false, true, FdFlags::empty()) - .await - .context("create writable file f")?; - let to_write: Vec = vec![0]; - if let OpenResult::File(ref f) = f { - f.write_vectored(&vec![std::io::IoSlice::new(&to_write)]) - .await - .context("write to f")?; - } else { - unreachable!(); - } - drop(f); - - let f = d - .open_file(false, "f", OFlags::empty(), true, false, FdFlags::empty()) - .await - .context("open f as readable")?; - - let mut poll = Poll::new(); - if let OpenResult::File(ref f) = f { - poll.subscribe_read(f.as_ref(), Userdata::from(123)); - } else { - unreachable!(); - } - // Timeout bounds time in poll_oneoff - let monotonic = &*clocks.monotonic()?.abs_clock; - poll.subscribe_monotonic_clock( - monotonic, - monotonic - .now(monotonic.resolution()) - .checked_add(TIMEOUT) - .unwrap(), - monotonic.resolution(), - Userdata::from(0), - ); - poll_oneoff(&mut poll).await?; - - let events = poll.results(); - - match events.get(0).expect("at least one event") { - (SubscriptionResult::Read(Ok((1, flags))), ud) => { - assert_eq!(*flags, RwEventFlags::empty()); - assert_eq!(*ud, Userdata::from(123)); - } - _ => panic!("expected (Read(Ok(1, empty), 123), got: {:?}", events[0]), - } - - Ok(()) -} - -#[tokio::test(flavor = "multi_thread")] -async fn empty_file_writable() -> Result<(), Error> { - let clocks = clocks_ctx(); - - let workspace = - cap_tempfile::tempdir(cap_tempfile::ambient_authority()).expect("create tempdir"); - workspace.create_dir("d").context("create dir")?; - let d = workspace.open_dir("d").context("open dir")?; - let d = Dir::from_cap_std(d); - - let writable_f = d - .open_file(false, "f", OFlags::CREATE, true, true, FdFlags::empty()) - .await - .context("create writable file")?; - - let mut poll = Poll::new(); - if let OpenResult::File(ref writable_f) = writable_f { - poll.subscribe_write(writable_f.as_ref(), Userdata::from(123)); - } else { - unreachable!(); - } - // Timeout bounds time in poll_oneoff - let monotonic = &*clocks.monotonic()?.abs_clock; - poll.subscribe_monotonic_clock( - monotonic, - monotonic - .now(monotonic.resolution()) - .checked_add(TIMEOUT) - .unwrap(), - monotonic.resolution(), - Userdata::from(0), - ); - poll_oneoff(&mut poll).await?; - - let events = poll.results(); - - match events.get(0).expect("at least one event") { - (SubscriptionResult::Write(Ok((0, flags))), ud) => { - assert_eq!(*flags, RwEventFlags::empty()); - assert_eq!(*ud, Userdata::from(123)); - } - _ => panic!(""), - } - - Ok(()) -} - -#[tokio::test(flavor = "multi_thread")] -async fn stdio_readable() -> Result<(), Error> { - let clocks = clocks_ctx(); - - let monotonic = &*clocks.monotonic()?.abs_clock; - let deadline = monotonic - .now(monotonic.resolution()) - .checked_add(TIMEOUT) - .unwrap(); - - let mut waiting_on: HashMap> = vec![ - ( - 1, - Box::new(wasi_tokio::stdio::stdout()) as Box, - ), - (2, Box::new(wasi_tokio::stdio::stderr())), - ] - .into_iter() - .collect(); - - while !waiting_on.is_empty() { - let mut poll = Poll::new(); - - for (ix, file) in waiting_on.iter_mut() { - poll.subscribe_write(&mut **file, Userdata::from(*ix)); - } - // Timeout bounds time in poll_oneoff - let monotonic = &*clocks.monotonic()?.abs_clock; - poll.subscribe_monotonic_clock( - monotonic, - deadline, - monotonic.resolution(), - Userdata::from(999), - ); - poll_oneoff(&mut poll).await?; - let events = poll.results(); - - for e in events { - match e { - (SubscriptionResult::Write(Ok(_)), ud) => { - let _ = waiting_on.remove(&u64::from(ud)); - } - (SubscriptionResult::Write(Err(_)), ud) => { - panic!("error on ix {}", u64::from(ud)) - } - (SubscriptionResult::Read { .. }, _) => unreachable!(), - (SubscriptionResult::MonotonicClock { .. }, _) => { - panic!("timed out before stdin and stdout ready for reading") - } - } - } - } - - Ok(()) -} diff --git a/crates/wasi-http/Cargo.toml b/crates/wasi-http/Cargo.toml index 39388f2e91a3..996d8c8aa88d 100644 --- a/crates/wasi-http/Cargo.toml +++ b/crates/wasi-http/Cargo.toml @@ -7,6 +7,9 @@ repository = "https://github.com/bytecodealliance/wasmtime" license = "Apache-2.0 WITH LLVM-exception" description = "Experimental HTTP library for WebAssembly in Wasmtime" +[lints] +workspace = true + [dependencies] anyhow = { workspace = true } async-trait = { workspace = true } @@ -42,7 +45,3 @@ tokio = { workspace = true, features = ['macros'] } futures = { workspace = true, default-features = false, features = ['alloc'] } sha2 = "0.10.2" base64 = "0.21.0" - -[features] -default = ["sync"] -sync = ["wasmtime-wasi/sync"] diff --git a/crates/wasi-http/src/body.rs b/crates/wasi-http/src/body.rs index 41f730286ea2..92e73d420534 100644 --- a/crates/wasi-http/src/body.rs +++ b/crates/wasi-http/src/body.rs @@ -1,4 +1,3 @@ -use crate::internal_error; use crate::{bindings::http::types, types::FieldMap}; use anyhow::anyhow; use bytes::Bytes; @@ -300,6 +299,9 @@ pub enum HostFutureTrailers { /// Note that `Ok(None)` means that there were no trailers for this request /// while `Ok(Some(_))` means that trailers were found in the request. Done(Result, types::ErrorCode>), + + /// Trailers have been consumed by `future-trailers.get`. + Consumed, } #[async_trait::async_trait] @@ -308,6 +310,7 @@ impl Subscribe for HostFutureTrailers { let body = match self { HostFutureTrailers::Waiting(body) => body, HostFutureTrailers::Done(_) => return, + HostFutureTrailers::Consumed => return, }; // If the body is itself being read by a body stream then we need to @@ -337,6 +340,7 @@ impl Subscribe for HostFutureTrailers { let body = match self { HostFutureTrailers::Waiting(body) => body, HostFutureTrailers::Done(_) => return, + HostFutureTrailers::Consumed => return, }; let hyper_body = match &mut body.body { IncomingBodyState::Start(body) => body, @@ -381,6 +385,11 @@ impl WrittenState { } } + /// The number of bytes that have been written so far. + fn written(&self) -> u64 { + self.written.load(std::sync::atomic::Ordering::Relaxed) + } + /// Add `len` to the total number of bytes written. Returns `false` if the new total exceeds /// the number of bytes expected to be written. fn update(&self, len: usize) -> bool { @@ -390,22 +399,17 @@ impl WrittenState { .fetch_add(len, std::sync::atomic::Ordering::Relaxed); old + len <= self.expected } - - /// Return a comparison of total bytes written to the number of bytes expected to be written. - fn finish(self) -> std::cmp::Ordering { - let written = self.written.load(std::sync::atomic::Ordering::Relaxed); - written.cmp(&self.expected) - } } pub struct HostOutgoingBody { pub body_output_stream: Option>, + context: StreamContext, written: Option, finish_sender: Option>, } impl HostOutgoingBody { - pub fn new(size: Option) -> (Self, HyperOutgoingBody) { + pub fn new(context: StreamContext, size: Option) -> (Self, HyperOutgoingBody) { let written = size.map(WrittenState::new); use tokio::sync::oneshot::error::RecvError; @@ -460,11 +464,13 @@ impl HostOutgoingBody { .boxed(); // TODO: this capacity constant is arbitrary, and should be configurable - let output_stream = BodyWriteStream::new(1024 * 1024, body_sender, written.clone()); + let output_stream = + BodyWriteStream::new(context, 1024 * 1024, body_sender, written.clone()); ( Self { body_output_stream: Some(Box::new(output_stream)), + context, written, finish_sender: Some(finish_sender), }, @@ -483,17 +489,10 @@ impl HostOutgoingBody { .expect("outgoing-body trailer_sender consumed by a non-owning function"); if let Some(w) = self.written { - use std::cmp::Ordering; - let res = w.finish(); - if res != Ordering::Equal { - let msg = match res { - Ordering::Less => "not enough", - Ordering::Greater => "too much", - Ordering::Equal => unreachable!(), - }; - + let written = w.written(); + if written != w.expected { let _ = sender.send(FinishMessage::Abort); - return Err(internal_error(format!("{msg} written to body stream"))); + return Err(self.context.as_body_error(written)); } } @@ -523,8 +522,25 @@ impl HostOutgoingBody { } } +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum StreamContext { + Request, + Response, +} + +impl StreamContext { + /// Construct an http request or response body size error. + pub fn as_body_error(&self, size: u64) -> types::ErrorCode { + match self { + StreamContext::Request => types::ErrorCode::HttpRequestBodySize(Some(size)), + StreamContext::Response => types::ErrorCode::HttpResponseBodySize(Some(size)), + } + } +} + /// Provides a [`HostOutputStream`] impl from a [`tokio::sync::mpsc::Sender`]. struct BodyWriteStream { + context: StreamContext, writer: mpsc::Sender, write_budget: usize, written: Option, @@ -533,6 +549,7 @@ struct BodyWriteStream { impl BodyWriteStream { /// Create a [`BodyWriteStream`]. fn new( + context: StreamContext, write_budget: usize, writer: mpsc::Sender, written: Option, @@ -540,6 +557,7 @@ impl BodyWriteStream { // at least one capacity is required to send a message assert!(writer.max_capacity() >= 1); BodyWriteStream { + context, writer, write_budget, written, @@ -557,9 +575,10 @@ impl HostOutputStream for BodyWriteStream { Ok(()) => { if let Some(written) = self.written.as_ref() { if !written.update(len) { - return Err(StreamError::LastOperationFailed(anyhow!(internal_error( - "too much written to output stream".to_owned() - )))); + let total = written.written(); + return Err(StreamError::LastOperationFailed(anyhow!(self + .context + .as_body_error(total)))); } } diff --git a/crates/wasi-http/src/io.rs b/crates/wasi-http/src/io.rs new file mode 100644 index 000000000000..e4f00079eca4 --- /dev/null +++ b/crates/wasi-http/src/io.rs @@ -0,0 +1,50 @@ +use hyper::rt::{Read, ReadBufCursor, Write}; +use std::io::Error; +use std::marker::Unpin; +use std::pin::Pin; +use std::task::{Context, Poll}; +use tokio::io::{AsyncRead, AsyncWrite, ReadBuf}; + +pub struct TokioIo { + inner: T, +} + +impl TokioIo { + pub fn new(inner: T) -> TokioIo { + TokioIo { inner } + } +} + +impl Read for TokioIo { + fn poll_read( + mut self: Pin<&mut Self>, + cx: &mut Context<'_>, + mut buf: ReadBufCursor<'_>, + ) -> Poll> { + unsafe { + let mut dst = ReadBuf::uninit(buf.as_mut()); + let res = Pin::new(&mut self.inner).poll_read(cx, &mut dst); + let amt = dst.filled().len(); + buf.advance(amt); + res + } + } +} + +impl Write for TokioIo { + fn poll_write( + mut self: Pin<&mut Self>, + cx: &mut Context<'_>, + buf: &[u8], + ) -> Poll> { + Pin::new(&mut self.inner).poll_write(cx, buf) + } + + fn poll_flush(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + Pin::new(&mut self.inner).poll_flush(cx) + } + + fn poll_shutdown(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { + Pin::new(&mut self.inner).poll_shutdown(cx) + } +} diff --git a/crates/wasi-http/src/lib.rs b/crates/wasi-http/src/lib.rs index 66852af8985e..e7218250a225 100644 --- a/crates/wasi-http/src/lib.rs +++ b/crates/wasi-http/src/lib.rs @@ -2,6 +2,7 @@ pub use crate::types::{WasiHttpCtx, WasiHttpView}; pub mod body; pub mod http_impl; +pub mod io; pub mod proxy; pub mod types; pub mod types_impl; @@ -10,9 +11,9 @@ pub mod bindings { wasmtime::component::bindgen!({ path: "wit", interfaces: " - import wasi:http/incoming-handler@0.2.0-rc-2023-11-10; - import wasi:http/outgoing-handler@0.2.0-rc-2023-11-10; - import wasi:http/types@0.2.0-rc-2023-11-10; + import wasi:http/incoming-handler@0.2.0; + import wasi:http/outgoing-handler@0.2.0; + import wasi:http/types@0.2.0; ", tracing: true, async: false, diff --git a/crates/wasi-http/src/proxy.rs b/crates/wasi-http/src/proxy.rs index 155a55fd11fd..5c6557678864 100644 --- a/crates/wasi-http/src/proxy.rs +++ b/crates/wasi-http/src/proxy.rs @@ -25,10 +25,24 @@ pub fn add_to_linker(l: &mut wasmtime::component::Linker) -> anyhow::Resul where T: WasiHttpView + preview2::WasiView + bindings::http::types::Host, { - // TODO: this shouldn't be required, but the adapter unconditionally pulls in all of these - // dependencies. - preview2::command::add_to_linker(l)?; + preview2::bindings::clocks::wall_clock::add_to_linker(l, |t| t)?; + preview2::bindings::clocks::monotonic_clock::add_to_linker(l, |t| t)?; + preview2::bindings::io::poll::add_to_linker(l, |t| t)?; + preview2::bindings::io::error::add_to_linker(l, |t| t)?; + preview2::bindings::io::streams::add_to_linker(l, |t| t)?; + preview2::bindings::cli::stdin::add_to_linker(l, |t| t)?; + preview2::bindings::cli::stdout::add_to_linker(l, |t| t)?; + preview2::bindings::cli::stderr::add_to_linker(l, |t| t)?; + preview2::bindings::random::random::add_to_linker(l, |t| t)?; + add_only_http_to_linker(l) +} + +#[doc(hidden)] +pub fn add_only_http_to_linker(l: &mut wasmtime::component::Linker) -> anyhow::Result<()> +where + T: WasiHttpView + preview2::WasiView + bindings::http::types::Host, +{ bindings::http::outgoing_handler::add_to_linker(l, |t| t)?; bindings::http::types::add_to_linker(l, |t| t)?; diff --git a/crates/wasi-http/src/types.rs b/crates/wasi-http/src/types.rs index 4473b3912574..3d8c4ef225cd 100644 --- a/crates/wasi-http/src/types.rs +++ b/crates/wasi-http/src/types.rs @@ -1,6 +1,7 @@ //! Implements the base structure (i.e. [WasiHttpCtx]) that will provide the //! implementation of the wasi-http API. +use crate::io::TokioIo; use crate::{ bindings::http::types::{self, Method, Scheme}, body::{HostIncomingBody, HyperIncomingBody, HyperOutgoingBody}, @@ -13,8 +14,8 @@ use std::sync::Arc; use std::time::Duration; use tokio::net::TcpStream; use tokio::time::timeout; -use wasmtime::component::Resource; -use wasmtime_wasi::preview2::{self, AbortOnDropJoinHandle, Subscribe, Table}; +use wasmtime::component::{Resource, ResourceTable}; +use wasmtime_wasi::preview2::{self, AbortOnDropJoinHandle, Subscribe}; /// Capture the state necessary for use in the wasi-http API implementation. pub struct WasiHttpCtx; @@ -30,7 +31,7 @@ pub struct OutgoingRequest { pub trait WasiHttpView: Send { fn ctx(&mut self) -> &mut WasiHttpCtx; - fn table(&mut self) -> &mut Table; + fn table(&mut self) -> &mut ResourceTable; fn new_incoming_request( &mut self, @@ -76,7 +77,7 @@ pub trait WasiHttpView: Send { /// Returns `true` when the header is forbidden according to this [`WasiHttpView`] implementation. pub(crate) fn is_forbidden_header(view: &mut dyn WasiHttpView, name: &HeaderName) -> bool { - static FORBIDDEN_HEADERS: [HeaderName; 9] = [ + static FORBIDDEN_HEADERS: [HeaderName; 10] = [ hyper::header::CONNECTION, HeaderName::from_static("keep-alive"), hyper::header::PROXY_AUTHENTICATE, @@ -85,6 +86,7 @@ pub(crate) fn is_forbidden_header(view: &mut dyn WasiHttpView, name: &HeaderName hyper::header::TE, hyper::header::TRANSFER_ENCODING, hyper::header::UPGRADE, + hyper::header::HOST, HeaderName::from_static("http2-settings"), ]; @@ -143,7 +145,7 @@ async fn handler( use_tls: bool, connect_timeout: Duration, first_byte_timeout: Duration, - request: http::Request, + mut request: http::Request, between_bytes_timeout: Duration, ) -> Result { let tcp_stream = TcpStream::connect(authority.clone()) @@ -200,6 +202,7 @@ async fn handler( tracing::warn!("tls protocol error: {e:?}"); types::ErrorCode::TlsProtocolError })?; + let stream = TokioIo::new(stream); let (sender, conn) = timeout( connect_timeout, @@ -221,6 +224,7 @@ async fn handler( (sender, worker) } } else { + let tcp_stream = TokioIo::new(tcp_stream); let (sender, conn) = timeout( connect_timeout, // TODO: we should plumb the builder through the http context, and use it here @@ -241,6 +245,20 @@ async fn handler( (sender, worker) }; + // at this point, the request contains the scheme and the authority, but + // the http packet should only include those if addressing a proxy, so + // remove them here, since SendRequest::send_request does not do it for us + *request.uri_mut() = http::Uri::builder() + .path_and_query( + request + .uri() + .path_and_query() + .map(|p| p.as_str()) + .unwrap_or("/"), + ) + .build() + .expect("comes from valid request"); + let resp = timeout(first_byte_timeout, sender.send_request(request)) .await .map_err(|_| types::ErrorCode::ConnectionReadTimeout)? @@ -253,6 +271,7 @@ async fn handler( between_bytes_timeout, }) } + impl From for types::Method { fn from(method: http::Method) -> Self { if method == http::Method::GET { diff --git a/crates/wasi-http/src/types_impl.rs b/crates/wasi-http/src/types_impl.rs index ca11e87fe0ea..351f8f59d775 100644 --- a/crates/wasi-http/src/types_impl.rs +++ b/crates/wasi-http/src/types_impl.rs @@ -1,6 +1,6 @@ use crate::{ bindings::http::types::{self, Headers, Method, Scheme, StatusCode, Trailers}, - body::{HostFutureTrailers, HostIncomingBody, HostOutgoingBody}, + body::{HostFutureTrailers, HostIncomingBody, HostOutgoingBody, StreamContext}, types::{ is_forbidden_header, remove_forbidden_headers, FieldMap, HostFields, HostFutureIncomingResponse, HostIncomingRequest, HostIncomingResponse, HostOutgoingRequest, @@ -11,10 +11,10 @@ use crate::{ use anyhow::Context; use std::any::Any; use std::str::FromStr; -use wasmtime::component::Resource; +use wasmtime::component::{Resource, ResourceTable}; use wasmtime_wasi::preview2::{ bindings::io::streams::{InputStream, OutputStream}, - Pollable, Table, + Pollable, }; impl crate::bindings::http::types::Host for T { @@ -49,7 +49,7 @@ fn get_content_length(fields: &FieldMap) -> Result, ()> { /// Take ownership of the underlying [`FieldMap`] associated with this fields resource. If the /// fields resource references another fields, the returned [`FieldMap`] will be cloned. -fn move_fields(table: &mut Table, id: Resource) -> wasmtime::Result { +fn move_fields(table: &mut ResourceTable, id: Resource) -> wasmtime::Result { match table.delete(id)? { HostFields::Ref { parent, get_fields } => { let entry = table.get_any_mut(parent)?; @@ -61,7 +61,7 @@ fn move_fields(table: &mut Table, id: Resource) -> wasmtime::Result< } fn get_fields<'a>( - table: &'a mut Table, + table: &'a mut ResourceTable, id: &Resource, ) -> wasmtime::Result<&'a FieldMap> { let fields = table.get(&id)?; @@ -80,7 +80,7 @@ fn get_fields<'a>( } fn get_fields_mut<'a>( - table: &'a mut Table, + table: &'a mut ResourceTable, id: &Resource, ) -> wasmtime::Result> { match table.get_mut(&id)? { @@ -145,20 +145,34 @@ impl crate::bindings::http::types::HostFields for T { fields: Resource, name: String, ) -> wasmtime::Result>> { + let fields = get_fields(self.table(), &fields).context("[fields_get] getting fields")?; + let header = match hyper::header::HeaderName::from_bytes(name.as_bytes()) { Ok(header) => header, Err(_) => return Ok(vec![]), }; - let res = get_fields(self.table(), &fields) - .context("[fields_get] getting fields")? - .get_all(header) + if !fields.contains_key(&header) { + return Ok(vec![]); + } + + let res = fields + .get_all(&header) .into_iter() .map(|val| val.as_bytes().to_owned()) .collect(); Ok(res) } + fn has(&mut self, fields: Resource, name: String) -> wasmtime::Result { + let fields = get_fields(self.table(), &fields).context("[fields_get] getting fields")?; + + match hyper::header::HeaderName::from_bytes(name.as_bytes()) { + Ok(header) => Ok(fields.contains_key(&header)), + Err(_) => Ok(false), + } + } + fn set( &mut self, fields: Resource, @@ -384,7 +398,7 @@ impl crate::bindings::http::types::HostOutgoingRequest for T { Err(e) => return Ok(Err(e)), }; - let (host_body, hyper_body) = HostOutgoingBody::new(size); + let (host_body, hyper_body) = HostOutgoingBody::new(StreamContext::Request, size); req.body = Some(hyper_body); @@ -490,7 +504,6 @@ impl crate::bindings::http::types::HostOutgoingRequest for T { let req = self.table().get_mut(&request)?; if let Some(s) = authority.as_ref() { - println!("checking authority {s}"); let auth = match http::uri::Authority::from_str(s.as_str()) { Ok(auth) => auth, Err(_) => return Ok(Err(())), @@ -637,32 +650,31 @@ impl crate::bindings::http::types::HostFutureTrailers for T { fn get( &mut self, id: Resource, - ) -> wasmtime::Result>, types::ErrorCode>>> { + ) -> wasmtime::Result>, types::ErrorCode>, ()>>> + { let trailers = self.table().get_mut(&id)?; match trailers { HostFutureTrailers::Waiting(_) => return Ok(None), - HostFutureTrailers::Done(Err(e)) => return Ok(Some(Err(e.clone()))), - HostFutureTrailers::Done(Ok(None)) => return Ok(Some(Ok(None))), - HostFutureTrailers::Done(Ok(_)) => {} - } + HostFutureTrailers::Consumed => return Ok(Some(Err(()))), + HostFutureTrailers::Done(_) => {} + }; - fn get_fields(elem: &mut dyn Any) -> &mut FieldMap { - let trailers = elem.downcast_mut::().unwrap(); - match trailers { - HostFutureTrailers::Done(Ok(Some(e))) => e, - _ => unreachable!(), - } - } + let res = match std::mem::replace(trailers, HostFutureTrailers::Consumed) { + HostFutureTrailers::Done(res) => res, + _ => unreachable!(), + }; - let hdrs = self.table().push_child( - HostFields::Ref { - parent: id.rep(), - get_fields, - }, - &id, - )?; + let mut fields = match res { + Ok(Some(fields)) => fields, + Ok(None) => return Ok(Some(Ok(Ok(None)))), + Err(e) => return Ok(Some(Ok(Err(e)))), + }; + + remove_forbidden_headers(self, &mut fields); + + let ts = self.table().push(HostFields::Owned { fields })?; - Ok(Some(Ok(Some(hdrs)))) + Ok(Some(Ok(Ok(Some(ts))))) } } @@ -728,7 +740,7 @@ impl crate::bindings::http::types::HostOutgoingResponse for T { Err(e) => return Ok(Err(e)), }; - let (host, body) = HostOutgoingBody::new(size); + let (host, body) = HostOutgoingBody::new(StreamContext::Response, size); resp.body.replace(body); @@ -886,84 +898,84 @@ impl crate::bindings::http::types::HostRequestOptions for T { Ok(id) } - fn connect_timeout_ms( + fn connect_timeout( &mut self, opts: Resource, ) -> wasmtime::Result> { - let millis = self + let nanos = self .table() .get(&opts)? .connect_timeout - .map(|d| d.as_millis()); + .map(|d| d.as_nanos()); - if let Some(millis) = millis { - Ok(Some(millis.try_into()?)) + if let Some(nanos) = nanos { + Ok(Some(nanos.try_into()?)) } else { Ok(None) } } - fn set_connect_timeout_ms( + fn set_connect_timeout( &mut self, opts: Resource, - ms: Option, + duration: Option, ) -> wasmtime::Result> { self.table().get_mut(&opts)?.connect_timeout = - ms.map(|ms| std::time::Duration::from_millis(ms as u64)); + duration.map(std::time::Duration::from_nanos); Ok(Ok(())) } - fn first_byte_timeout_ms( + fn first_byte_timeout( &mut self, opts: Resource, ) -> wasmtime::Result> { - let millis = self + let nanos = self .table() .get(&opts)? .first_byte_timeout - .map(|d| d.as_millis()); + .map(|d| d.as_nanos()); - if let Some(millis) = millis { - Ok(Some(millis.try_into()?)) + if let Some(nanos) = nanos { + Ok(Some(nanos.try_into()?)) } else { Ok(None) } } - fn set_first_byte_timeout_ms( + fn set_first_byte_timeout( &mut self, opts: Resource, - ms: Option, + duration: Option, ) -> wasmtime::Result> { self.table().get_mut(&opts)?.first_byte_timeout = - ms.map(|ms| std::time::Duration::from_millis(ms as u64)); + duration.map(std::time::Duration::from_nanos); Ok(Ok(())) } - fn between_bytes_timeout_ms( + fn between_bytes_timeout( &mut self, opts: Resource, ) -> wasmtime::Result> { - let millis = self + let nanos = self .table() .get(&opts)? .between_bytes_timeout - .map(|d| d.as_millis()); + .map(|d| d.as_nanos()); - if let Some(millis) = millis { - Ok(Some(millis.try_into()?)) + if let Some(nanos) = nanos { + Ok(Some(nanos.try_into()?)) } else { Ok(None) } } - fn set_between_bytes_timeout_ms( + fn set_between_bytes_timeout( &mut self, opts: Resource, - ms: Option, + duration: Option, ) -> wasmtime::Result> { self.table().get_mut(&opts)?.between_bytes_timeout = - ms.map(|ms| std::time::Duration::from_millis(ms as u64)); + duration.map(std::time::Duration::from_nanos); Ok(Ok(())) } diff --git a/crates/wasi-http/tests/all/async_.rs b/crates/wasi-http/tests/all/async_.rs index e9d735279290..19ce8c1ae514 100644 --- a/crates/wasi-http/tests/all/async_.rs +++ b/crates/wasi-http/tests/all/async_.rs @@ -13,7 +13,8 @@ async fn run(path: &str, server: &Server) -> Result<()> { let component = Component::from_file(&engine, path)?; let mut store = store(&engine, server); let mut linker = Linker::new(&engine); - wasmtime_wasi_http::proxy::add_to_linker(&mut linker)?; + wasmtime_wasi::preview2::command::add_to_linker(&mut linker)?; + wasmtime_wasi_http::proxy::add_only_http_to_linker(&mut linker)?; let (command, _instance) = Command::instantiate_async(&mut store, &component, &linker).await?; let result = command.wasi_cli_run().call_run(&mut store).await?; result.map_err(|()| anyhow::anyhow!("run returned an error")) diff --git a/crates/wasi-http/tests/all/http_server.rs b/crates/wasi-http/tests/all/http_server.rs index d22fe5b201bc..f1a22abf7edd 100644 --- a/crates/wasi-http/tests/all/http_server.rs +++ b/crates/wasi-http/tests/all/http_server.rs @@ -7,6 +7,7 @@ use std::{ thread::JoinHandle, }; use tokio::net::TcpListener; +use wasmtime_wasi_http::io::TokioIo; async fn test( mut req: Request, @@ -30,7 +31,9 @@ pub struct Server { } impl Server { - fn new(run: impl FnOnce(tokio::net::TcpStream) -> F + Send + Sync + 'static) -> Result + fn new( + run: impl FnOnce(TokioIo) -> F + Send + 'static, + ) -> Result where F: Future>, { @@ -52,7 +55,7 @@ impl Server { rt.block_on(async move { tracing::debug!("preparing to accept connection"); let (stream, _) = listener.accept().await.map_err(anyhow::Error::from)?; - run(stream).await + run(TokioIo::new(stream)).await }) }); Ok(Self { diff --git a/crates/wasi-http/tests/all/main.rs b/crates/wasi-http/tests/all/main.rs index 323d41892feb..268c67c50898 100644 --- a/crates/wasi-http/tests/all/main.rs +++ b/crates/wasi-http/tests/all/main.rs @@ -8,15 +8,14 @@ use sha2::{Digest, Sha256}; use std::{collections::HashMap, iter, net::Ipv4Addr, str, sync::Arc}; use tokio::task; use wasmtime::{ - component::{Component, Linker, Resource}, + component::{Component, Linker, Resource, ResourceTable}, Config, Engine, Store, }; -use wasmtime_wasi::preview2::{ - self, pipe::MemoryOutputPipe, Table, WasiCtx, WasiCtxBuilder, WasiView, -}; +use wasmtime_wasi::preview2::{self, pipe::MemoryOutputPipe, WasiCtx, WasiCtxBuilder, WasiView}; use wasmtime_wasi_http::{ bindings::http::types::ErrorCode, body::HyperIncomingBody, + io::TokioIo, types::{self, HostFutureIncomingResponse, IncomingResponseInternal, OutgoingRequest}, WasiHttpCtx, WasiHttpView, }; @@ -30,7 +29,7 @@ type RequestSender = Arc< >; struct Ctx { - table: Table, + table: ResourceTable, wasi: WasiCtx, http: WasiHttpCtx, stdout: MemoryOutputPipe, @@ -39,16 +38,10 @@ struct Ctx { } impl WasiView for Ctx { - fn table(&self) -> &Table { - &self.table - } - fn table_mut(&mut self) -> &mut Table { + fn table(&mut self) -> &mut ResourceTable { &mut self.table } - fn ctx(&self) -> &WasiCtx { - &self.wasi - } - fn ctx_mut(&mut self) -> &mut WasiCtx { + fn ctx(&mut self) -> &mut WasiCtx { &mut self.wasi } } @@ -58,7 +51,7 @@ impl WasiHttpView for Ctx { &mut self.http } - fn table(&mut self) -> &mut Table { + fn table(&mut self) -> &mut ResourceTable { &mut self.table } @@ -88,7 +81,7 @@ fn store(engine: &Engine, server: &Server) -> Store { builder.stderr(stderr.clone()); builder.env("HTTP_SERVER", server.addr().to_string()); let ctx = Ctx { - table: Table::new(), + table: ResourceTable::new(), wasi: builder.build(), http: WasiHttpCtx {}, stderr, @@ -131,7 +124,7 @@ async fn run_wasi_http( ) -> anyhow::Result>, ErrorCode>> { let stdout = MemoryOutputPipe::new(4096); let stderr = MemoryOutputPipe::new(4096); - let table = Table::new(); + let table = ResourceTable::new(); let mut config = Config::new(); config.wasm_backtrace_details(wasmtime::WasmBacktraceDetails::Enable); @@ -181,29 +174,28 @@ async fn run_wasi_http( use http_body_util::BodyExt; let (parts, body) = resp.into_parts(); let collected = BodyExt::collect(body).await?; - Ok(hyper::Response::from_parts(parts, collected)) + Some(Ok(hyper::Response::from_parts(parts, collected))) } + Ok(Err(e)) => Some(Err(e)), - Ok(Err(e)) => Err(e), - - // This happens if the wasm never calls `set-response-outparam` - Err(e) => panic!("Failed to receive a response: {e:?}"), + // Fall through below to the `resp.expect(...)` which will hopefully + // return a more specific error from `handle.await`. + Err(_) => None, }; - // Now that the response has been processed, we can wait on the wasm to finish without - // deadlocking. + // Now that the response has been processed, we can wait on the wasm to + // finish without deadlocking. handle.await.context("Component execution")?; - Ok(resp) + Ok(resp.expect("wasm never called set-response-outparam")) } #[test_log::test(tokio::test)] async fn wasi_http_proxy_tests() -> anyhow::Result<()> { - let mut req = hyper::Request::builder().method(http::Method::GET); - - req.headers_mut() - .unwrap() - .append("custom-forbidden-header", "yes".parse().unwrap()); + let req = hyper::Request::builder() + .header("custom-forbidden-header", "yes") + .uri("http://example.com:8080/test-path") + .method(http::Method::GET); let resp = run_wasi_http( test_programs_artifacts::API_PROXY_COMPONENT, @@ -279,15 +271,14 @@ async fn do_wasi_http_hash_all(override_send_request: bool) -> Result<()> { between_bytes_timeout, }) }); - Ok(view - .table() - .push(HostFutureIncomingResponse::Ready(response))?) + Ok(WasiHttpView::table(view).push(HostFutureIncomingResponse::Ready(response))?) }, ) as RequestSender) } else { let server = async move { loop { let (stream, _) = listener.accept().await?; + let stream = TokioIo::new(stream); let handle = handle.clone(); task::spawn(async move { if let Err(e) = http1::Builder::new() @@ -326,7 +317,9 @@ async fn do_wasi_http_hash_all(override_send_request: bool) -> Result<()> { None }; - let mut request = hyper::Request::get("/hash-all"); + let mut request = hyper::Request::builder() + .method(http::Method::GET) + .uri("http://example.com:8080/hash-all"); for path in bodies.keys() { request = request.header("url", format!("{prefix}{path}")); } @@ -384,6 +377,7 @@ async fn wasi_http_double_echo() -> Result<()> { let server = async move { loop { let (stream, _) = listener.accept().await?; + let stream = TokioIo::new(stream); task::spawn(async move { if let Err(e) = http1::Builder::new() .keep_alive(true) @@ -448,8 +442,10 @@ async fn do_wasi_http_echo(uri: &str, url_header: Option<&str>) -> Result<()> { .collect::>() }; - let mut request = - hyper::Request::post(&format!("/{uri}")).header("content-type", "application/octet-stream"); + let mut request = hyper::Request::builder() + .method(http::Method::POST) + .uri(format!("http://example.com:8080/{uri}")) + .header("content-type", "application/octet-stream"); if let Some(url_header) = url_header { request = request.header("url", url_header); diff --git a/crates/wasi-http/wit/command-extended.wit b/crates/wasi-http/wit/command-extended.wit index 92c7be0db02b..4bff99e65a19 100644 --- a/crates/wasi-http/wit/command-extended.wit +++ b/crates/wasi-http/wit/command-extended.wit @@ -1,6 +1,6 @@ // All of the same imports and exports available in the wasi:cli/command world // with addition of HTTP proxy related imports: world command-extended { - include wasi:cli/command@0.2.0-rc-2023-11-10; - import wasi:http/outgoing-handler@0.2.0-rc-2023-11-10; + include wasi:cli/command@0.2.0; + import wasi:http/outgoing-handler@0.2.0; } diff --git a/crates/wasi-http/wit/deps/cli/command.wit b/crates/wasi-http/wit/deps/cli/command.wit index 74811d3272d6..d8005bd38819 100644 --- a/crates/wasi-http/wit/deps/cli/command.wit +++ b/crates/wasi-http/wit/deps/cli/command.wit @@ -1,7 +1,7 @@ -package wasi:cli@0.2.0-rc-2023-11-10; +package wasi:cli@0.2.0; world command { - include reactor; + include imports; export run; } diff --git a/crates/wasi-http/wit/deps/cli/imports.wit b/crates/wasi-http/wit/deps/cli/imports.wit new file mode 100644 index 000000000000..083b84a036d7 --- /dev/null +++ b/crates/wasi-http/wit/deps/cli/imports.wit @@ -0,0 +1,20 @@ +package wasi:cli@0.2.0; + +world imports { + include wasi:clocks/imports@0.2.0; + include wasi:filesystem/imports@0.2.0; + include wasi:sockets/imports@0.2.0; + include wasi:random/imports@0.2.0; + include wasi:io/imports@0.2.0; + + import environment; + import exit; + import stdin; + import stdout; + import stderr; + import terminal-input; + import terminal-output; + import terminal-stdin; + import terminal-stdout; + import terminal-stderr; +} diff --git a/crates/wasi-http/wit/deps/cli/reactor.wit b/crates/wasi-http/wit/deps/cli/reactor.wit deleted file mode 100644 index eafa2fd49950..000000000000 --- a/crates/wasi-http/wit/deps/cli/reactor.wit +++ /dev/null @@ -1,31 +0,0 @@ -package wasi:cli@0.2.0-rc-2023-11-10; - -world reactor { - import wasi:clocks/wall-clock@0.2.0-rc-2023-11-10; - import wasi:clocks/monotonic-clock@0.2.0-rc-2023-11-10; - import wasi:filesystem/types@0.2.0-rc-2023-11-10; - import wasi:filesystem/preopens@0.2.0-rc-2023-11-10; - import wasi:sockets/instance-network@0.2.0-rc-2023-11-10; - import wasi:sockets/ip-name-lookup@0.2.0-rc-2023-11-10; - import wasi:sockets/network@0.2.0-rc-2023-11-10; - import wasi:sockets/tcp-create-socket@0.2.0-rc-2023-11-10; - import wasi:sockets/tcp@0.2.0-rc-2023-11-10; - import wasi:sockets/udp-create-socket@0.2.0-rc-2023-11-10; - import wasi:sockets/udp@0.2.0-rc-2023-11-10; - import wasi:random/random@0.2.0-rc-2023-11-10; - import wasi:random/insecure@0.2.0-rc-2023-11-10; - import wasi:random/insecure-seed@0.2.0-rc-2023-11-10; - import wasi:io/poll@0.2.0-rc-2023-11-10; - import wasi:io/streams@0.2.0-rc-2023-11-10; - - import environment; - import exit; - import stdin; - import stdout; - import stderr; - import terminal-input; - import terminal-output; - import terminal-stdin; - import terminal-stdout; - import terminal-stderr; -} diff --git a/crates/wasi-http/wit/deps/cli/stdio.wit b/crates/wasi-http/wit/deps/cli/stdio.wit index 1b653b6e2d02..31ef35b5a760 100644 --- a/crates/wasi-http/wit/deps/cli/stdio.wit +++ b/crates/wasi-http/wit/deps/cli/stdio.wit @@ -1,17 +1,17 @@ interface stdin { - use wasi:io/streams@0.2.0-rc-2023-11-10.{input-stream}; + use wasi:io/streams@0.2.0.{input-stream}; get-stdin: func() -> input-stream; } interface stdout { - use wasi:io/streams@0.2.0-rc-2023-11-10.{output-stream}; + use wasi:io/streams@0.2.0.{output-stream}; get-stdout: func() -> output-stream; } interface stderr { - use wasi:io/streams@0.2.0-rc-2023-11-10.{output-stream}; + use wasi:io/streams@0.2.0.{output-stream}; get-stderr: func() -> output-stream; } diff --git a/crates/wasi-http/wit/deps/cli/terminal.wit b/crates/wasi-http/wit/deps/cli/terminal.wit index 47495769b31f..38c724efc840 100644 --- a/crates/wasi-http/wit/deps/cli/terminal.wit +++ b/crates/wasi-http/wit/deps/cli/terminal.wit @@ -1,19 +1,21 @@ +/// Terminal input. +/// +/// In the future, this may include functions for disabling echoing, +/// disabling input buffering so that keyboard events are sent through +/// immediately, querying supported features, and so on. interface terminal-input { /// The input side of a terminal. resource terminal-input; - - // In the future, this may include functions for disabling echoing, - // disabling input buffering so that keyboard events are sent through - // immediately, querying supported features, and so on. } +/// Terminal output. +/// +/// In the future, this may include functions for querying the terminal +/// size, being notified of terminal size changes, querying supported +/// features, and so on. interface terminal-output { /// The output side of a terminal. resource terminal-output; - - // In the future, this may include functions for querying the terminal - // size, being notified of terminal size changes, querying supported - // features, and so on. } /// An interface providing an optional `terminal-input` for stdin as a diff --git a/crates/wasi-http/wit/deps/clocks/monotonic-clock.wit b/crates/wasi-http/wit/deps/clocks/monotonic-clock.wit index 09ef32c36378..4e4dc3a19967 100644 --- a/crates/wasi-http/wit/deps/clocks/monotonic-clock.wit +++ b/crates/wasi-http/wit/deps/clocks/monotonic-clock.wit @@ -1,4 +1,4 @@ -package wasi:clocks@0.2.0-rc-2023-11-10; +package wasi:clocks@0.2.0; /// WASI Monotonic Clock is a clock API intended to let users measure elapsed /// time. /// @@ -10,7 +10,7 @@ package wasi:clocks@0.2.0-rc-2023-11-10; /// /// It is intended for measuring elapsed time. interface monotonic-clock { - use wasi:io/poll@0.2.0-rc-2023-11-10.{pollable}; + use wasi:io/poll@0.2.0.{pollable}; /// An instant in time, in nanoseconds. An instant is relative to an /// unspecified initial value, and can only be compared to instances from diff --git a/crates/wasi-http/wit/deps/clocks/wall-clock.wit b/crates/wasi-http/wit/deps/clocks/wall-clock.wit index 8abb9a0c0e83..440ca0f3364f 100644 --- a/crates/wasi-http/wit/deps/clocks/wall-clock.wit +++ b/crates/wasi-http/wit/deps/clocks/wall-clock.wit @@ -1,4 +1,4 @@ -package wasi:clocks@0.2.0-rc-2023-11-10; +package wasi:clocks@0.2.0; /// WASI Wall Clock is a clock API intended to let users query the current /// time. The name "wall" makes an analogy to a "clock on the wall", which /// is not necessarily monotonic as it may be reset. diff --git a/crates/wasi-http/wit/deps/clocks/world.wit b/crates/wasi-http/wit/deps/clocks/world.wit index 8fa080f0e2eb..c0224572a55b 100644 --- a/crates/wasi-http/wit/deps/clocks/world.wit +++ b/crates/wasi-http/wit/deps/clocks/world.wit @@ -1,4 +1,4 @@ -package wasi:clocks@0.2.0-rc-2023-11-10; +package wasi:clocks@0.2.0; world imports { import monotonic-clock; diff --git a/crates/wasi-http/wit/deps/filesystem/preopens.wit b/crates/wasi-http/wit/deps/filesystem/preopens.wit index 95ec67843474..da801f6d604e 100644 --- a/crates/wasi-http/wit/deps/filesystem/preopens.wit +++ b/crates/wasi-http/wit/deps/filesystem/preopens.wit @@ -1,4 +1,4 @@ -package wasi:filesystem@0.2.0-rc-2023-11-10; +package wasi:filesystem@0.2.0; interface preopens { use types.{descriptor}; diff --git a/crates/wasi-http/wit/deps/filesystem/types.wit b/crates/wasi-http/wit/deps/filesystem/types.wit index 059722ab8627..11108fcda230 100644 --- a/crates/wasi-http/wit/deps/filesystem/types.wit +++ b/crates/wasi-http/wit/deps/filesystem/types.wit @@ -1,4 +1,4 @@ -package wasi:filesystem@0.2.0-rc-2023-11-10; +package wasi:filesystem@0.2.0; /// WASI filesystem is a filesystem API primarily intended to let users run WASI /// programs that access their files on their existing filesystems, without /// significant overhead. @@ -24,8 +24,8 @@ package wasi:filesystem@0.2.0-rc-2023-11-10; /// /// [WASI filesystem path resolution]: https://github.com/WebAssembly/wasi-filesystem/blob/main/path-resolution.md interface types { - use wasi:io/streams@0.2.0-rc-2023-11-10.{input-stream, output-stream, error}; - use wasi:clocks/wall-clock@0.2.0-rc-2023-11-10.{datetime}; + use wasi:io/streams@0.2.0.{input-stream, output-stream, error}; + use wasi:clocks/wall-clock@0.2.0.{datetime}; /// File size or length of a region within a file. type filesize = u64; diff --git a/crates/wasi-http/wit/deps/filesystem/world.wit b/crates/wasi-http/wit/deps/filesystem/world.wit index 285e0bae9eb3..663f57920d5d 100644 --- a/crates/wasi-http/wit/deps/filesystem/world.wit +++ b/crates/wasi-http/wit/deps/filesystem/world.wit @@ -1,4 +1,4 @@ -package wasi:filesystem@0.2.0-rc-2023-11-10; +package wasi:filesystem@0.2.0; world imports { import types; diff --git a/crates/wasi-http/wit/deps/http/proxy.wit b/crates/wasi-http/wit/deps/http/proxy.wit index 453f5905119c..687c24d23332 100644 --- a/crates/wasi-http/wit/deps/http/proxy.wit +++ b/crates/wasi-http/wit/deps/http/proxy.wit @@ -1,4 +1,4 @@ -package wasi:http@0.2.0-rc-2023-11-10; +package wasi:http@0.2.0; /// The `wasi:http/proxy` world captures a widely-implementable intersection of /// hosts that includes HTTP forward and reverse proxies. Components targeting @@ -6,20 +6,19 @@ package wasi:http@0.2.0-rc-2023-11-10; /// outgoing HTTP requests. world proxy { /// HTTP proxies have access to time and randomness. - import wasi:clocks/wall-clock@0.2.0-rc-2023-11-10; - import wasi:clocks/monotonic-clock@0.2.0-rc-2023-11-10; - import wasi:random/random@0.2.0-rc-2023-11-10; + include wasi:clocks/imports@0.2.0; + import wasi:random/random@0.2.0; /// Proxies have standard output and error streams which are expected to /// terminate in a developer-facing console provided by the host. - import wasi:cli/stdout@0.2.0-rc-2023-11-10; - import wasi:cli/stderr@0.2.0-rc-2023-11-10; + import wasi:cli/stdout@0.2.0; + import wasi:cli/stderr@0.2.0; /// TODO: this is a temporary workaround until component tooling is able to /// gracefully handle the absence of stdin. Hosts must return an eof stream /// for this import, which is what wasi-libc + tooling will do automatically /// when this import is properly removed. - import wasi:cli/stdin@0.2.0-rc-2023-11-10; + import wasi:cli/stdin@0.2.0; /// This is the default handler to use when user code simply wants to make an /// HTTP request (e.g., via `fetch()`). diff --git a/crates/wasi-http/wit/deps/http/types.wit b/crates/wasi-http/wit/deps/http/types.wit index 1dd4214cd4a1..755ac6a6bc96 100644 --- a/crates/wasi-http/wit/deps/http/types.wit +++ b/crates/wasi-http/wit/deps/http/types.wit @@ -2,10 +2,10 @@ /// HTTP Requests and Responses, both incoming and outgoing, as well as /// their headers, trailers, and bodies. interface types { - use wasi:clocks/monotonic-clock@0.2.0-rc-2023-11-10.{duration}; - use wasi:io/streams@0.2.0-rc-2023-11-10.{input-stream, output-stream}; - use wasi:io/error@0.2.0-rc-2023-11-10.{error as io-error}; - use wasi:io/poll@0.2.0-rc-2023-11-10.{pollable}; + use wasi:clocks/monotonic-clock@0.2.0.{duration}; + use wasi:io/streams@0.2.0.{input-stream, output-stream}; + use wasi:io/error@0.2.0.{error as io-error}; + use wasi:io/poll@0.2.0.{pollable}; /// This type corresponds to HTTP standard Methods. variant method { @@ -169,9 +169,16 @@ interface types { entries: list> ) -> result; - /// Get all of the values corresponding to a key. + /// Get all of the values corresponding to a key. If the key is not present + /// in this `fields`, an empty list is returned. However, if the key is + /// present but empty, this is represented by a list with one or more + /// empty field-values present. get: func(name: field-key) -> list; + /// Returns `true` when the key is present in this `fields`. If the key is + /// syntactically invalid, `false` is returned. + has: func(name: field-key) -> bool; + /// Set all of the values for a key. Clears any existing values for that /// key, if they have been set. /// @@ -191,7 +198,7 @@ interface types { append: func(name: field-key, value: field-value) -> result<_, header-error>; /// Retrieve the full set of keys and values in the Fields. Like the - /// constructor, the list represents each key-value pair. + /// constructor, the list represents each key-value pair. /// /// The outer list represents each key-value pair in the Fields. Keys /// which have multiple values are represented by multiple entries in this @@ -308,9 +315,9 @@ interface types { headers: func() -> headers; } - /// Parameters for making an HTTP Request. Each of these parameters is an - /// optional timeout, with the unit in milliseconds, applicable to the - /// transport layer of the HTTP protocol. + /// Parameters for making an HTTP Request. Each of these parameters is + /// currently an optional timeout applicable to the transport layer of the + /// HTTP protocol. /// /// These timeouts are separate from any the user may use to bound a /// blocking call to `wasi:io/poll.poll`. @@ -319,27 +326,27 @@ interface types { constructor(); /// The timeout for the initial connect to the HTTP Server. - connect-timeout-ms: func() -> option; + connect-timeout: func() -> option; /// Set the timeout for the initial connect to the HTTP Server. An error /// return value indicates that this timeout is not supported. - set-connect-timeout-ms: func(ms: option) -> result; + set-connect-timeout: func(duration: option) -> result; /// The timeout for receiving the first byte of the Response body. - first-byte-timeout-ms: func() -> option; + first-byte-timeout: func() -> option; /// Set the timeout for receiving the first byte of the Response body. An /// error return value indicates that this timeout is not supported. - set-first-byte-timeout-ms: func(ms: option) -> result; + set-first-byte-timeout: func(duration: option) -> result; /// The timeout for receiving subsequent chunks of bytes in the Response /// body stream. - between-bytes-timeout-ms: func() -> option; + between-bytes-timeout: func() -> option; /// Set the timeout for receiving subsequent chunks of bytes in the Response /// body stream. An error return value indicates that this timeout is not /// supported. - set-between-bytes-timeout-ms: func(ms: option) -> result; + set-between-bytes-timeout: func(duration: option) -> result; } /// Represents the ability to send an HTTP Response. @@ -437,16 +444,20 @@ interface types { /// The outer `option` represents future readiness. Users can wait on this /// `option` to become `some` using the `subscribe` method. /// - /// The `result` represents that either the HTTP Request or Response body, - /// as well as any trailers, were received successfully, or that an error - /// occured receiving them. The optional `trailers` indicates whether or not - /// trailers were present in the body. + /// The outer `result` is used to retrieve the trailers or error at most + /// once. It will be success on the first call in which the outer option + /// is `some`, and error on subsequent calls. + /// + /// The inner `result` represents that either the HTTP Request or Response + /// body, as well as any trailers, were received successfully, or that an + /// error occured receiving them. The optional `trailers` indicates whether + /// or not trailers were present in the body. /// /// When some `trailers` are returned by this method, the `trailers` /// resource is immutable, and a child. Use of the `set`, `append`, or /// `delete` methods will return an error, and the resource must be /// dropped before the parent `future-trailers` is dropped. - get: func() -> option, error-code>>; + get: func() -> option, error-code>>>; } /// Represents an outgoing HTTP Response. diff --git a/crates/wasi-http/wit/deps/io/error.wit b/crates/wasi-http/wit/deps/io/error.wit index 31918acbb46d..22e5b64894b8 100644 --- a/crates/wasi-http/wit/deps/io/error.wit +++ b/crates/wasi-http/wit/deps/io/error.wit @@ -1,4 +1,4 @@ -package wasi:io@0.2.0-rc-2023-11-10; +package wasi:io@0.2.0; interface error { diff --git a/crates/wasi-http/wit/deps/io/poll.wit b/crates/wasi-http/wit/deps/io/poll.wit index bddde3c1951f..ddc67f8b7ace 100644 --- a/crates/wasi-http/wit/deps/io/poll.wit +++ b/crates/wasi-http/wit/deps/io/poll.wit @@ -1,9 +1,9 @@ -package wasi:io@0.2.0-rc-2023-11-10; +package wasi:io@0.2.0; /// A poll API intended to let users wait for I/O events on multiple handles /// at once. interface poll { - /// `pollable` epresents a single I/O event which may be ready, or not. + /// `pollable` represents a single I/O event which may be ready, or not. resource pollable { /// Return the readiness of a pollable. This function never blocks. diff --git a/crates/wasi-http/wit/deps/io/streams.wit b/crates/wasi-http/wit/deps/io/streams.wit index e7e1b689a5e4..6d2f871e3b6f 100644 --- a/crates/wasi-http/wit/deps/io/streams.wit +++ b/crates/wasi-http/wit/deps/io/streams.wit @@ -1,4 +1,4 @@ -package wasi:io@0.2.0-rc-2023-11-10; +package wasi:io@0.2.0; /// WASI I/O is an I/O abstraction API which is currently focused on providing /// stream types. @@ -32,6 +32,11 @@ interface streams { resource input-stream { /// Perform a non-blocking read from the stream. /// + /// When the source of a `read` is binary data, the bytes from the source + /// are returned verbatim. When the source of a `read` is known to the + /// implementation to be text, bytes containing the UTF-8 encoding of the + /// text are returned. + /// /// This function returns a list of bytes containing the read data, /// when successful. The returned list will contain up to `len` bytes; /// it may return fewer than requested, but not more. The list is @@ -111,6 +116,12 @@ interface streams { /// Perform a write. This function never blocks. /// + /// When the destination of a `write` is binary data, the bytes from + /// `contents` are written verbatim. When the destination of a `write` is + /// known to the implementation to be text, the bytes of `contents` are + /// transcoded from UTF-8 into the encoding of the destination and then + /// written. + /// /// Precondition: check-write gave permit of Ok(n) and contents has a /// length of less than or equal to n. Otherwise, this function will trap. /// @@ -131,7 +142,7 @@ interface streams { /// let pollable = this.subscribe(); /// while !contents.is_empty() { /// // Wait for the stream to become writable - /// poll-one(pollable); + /// pollable.block(); /// let Ok(n) = this.check-write(); // eliding error handling /// let len = min(n, contents.len()); /// let (chunk, rest) = contents.split_at(len); @@ -140,7 +151,7 @@ interface streams { /// } /// this.flush(); /// // Wait for completion of `flush` - /// poll-one(pollable); + /// pollable.block(); /// // Check for any errors that arose during `flush` /// let _ = this.check-write(); // eliding error handling /// ``` @@ -178,7 +189,7 @@ interface streams { /// Write zeroes to a stream. /// - /// this should be used precisely like `write` with the exact same + /// This should be used precisely like `write` with the exact same /// preconditions (must use check-write first), but instead of /// passing a list of bytes, you simply pass the number of zero-bytes /// that should be written. @@ -199,7 +210,7 @@ interface streams { /// let pollable = this.subscribe(); /// while num_zeroes != 0 { /// // Wait for the stream to become writable - /// poll-one(pollable); + /// pollable.block(); /// let Ok(n) = this.check-write(); // eliding error handling /// let len = min(n, num_zeroes); /// this.write-zeroes(len); // eliding error handling @@ -207,7 +218,7 @@ interface streams { /// } /// this.flush(); /// // Wait for completion of `flush` - /// poll-one(pollable); + /// pollable.block(); /// // Check for any errors that arose during `flush` /// let _ = this.check-write(); // eliding error handling /// ``` diff --git a/crates/wasi-http/wit/deps/io/world.wit b/crates/wasi-http/wit/deps/io/world.wit index 8243da2ee9a4..5f0b43fe50d1 100644 --- a/crates/wasi-http/wit/deps/io/world.wit +++ b/crates/wasi-http/wit/deps/io/world.wit @@ -1,4 +1,4 @@ -package wasi:io@0.2.0-rc-2023-11-10; +package wasi:io@0.2.0; world imports { import streams; diff --git a/crates/wasi-http/wit/deps/random/insecure-seed.wit b/crates/wasi-http/wit/deps/random/insecure-seed.wit index f76e87dadce2..47210ac6bdab 100644 --- a/crates/wasi-http/wit/deps/random/insecure-seed.wit +++ b/crates/wasi-http/wit/deps/random/insecure-seed.wit @@ -1,4 +1,4 @@ -package wasi:random@0.2.0-rc-2023-11-10; +package wasi:random@0.2.0; /// The insecure-seed interface for seeding hash-map DoS resistance. /// /// It is intended to be portable at least between Unix-family platforms and diff --git a/crates/wasi-http/wit/deps/random/insecure.wit b/crates/wasi-http/wit/deps/random/insecure.wit index ec7b9973769f..c58f4ee8522a 100644 --- a/crates/wasi-http/wit/deps/random/insecure.wit +++ b/crates/wasi-http/wit/deps/random/insecure.wit @@ -1,4 +1,4 @@ -package wasi:random@0.2.0-rc-2023-11-10; +package wasi:random@0.2.0; /// The insecure interface for insecure pseudo-random numbers. /// /// It is intended to be portable at least between Unix-family platforms and diff --git a/crates/wasi-http/wit/deps/random/random.wit b/crates/wasi-http/wit/deps/random/random.wit index 7a7dfa27a994..0c017f09340e 100644 --- a/crates/wasi-http/wit/deps/random/random.wit +++ b/crates/wasi-http/wit/deps/random/random.wit @@ -1,4 +1,4 @@ -package wasi:random@0.2.0-rc-2023-11-10; +package wasi:random@0.2.0; /// WASI Random is a random data API. /// /// It is intended to be portable at least between Unix-family platforms and diff --git a/crates/wasi-http/wit/deps/random/world.wit b/crates/wasi-http/wit/deps/random/world.wit index 49e5743b4be9..3da34914a4a7 100644 --- a/crates/wasi-http/wit/deps/random/world.wit +++ b/crates/wasi-http/wit/deps/random/world.wit @@ -1,4 +1,4 @@ -package wasi:random@0.2.0-rc-2023-11-10; +package wasi:random@0.2.0; world imports { import random; diff --git a/crates/wasi-http/wit/deps/sockets/ip-name-lookup.wit b/crates/wasi-http/wit/deps/sockets/ip-name-lookup.wit index 931ccf7e05a9..8e639ec59691 100644 --- a/crates/wasi-http/wit/deps/sockets/ip-name-lookup.wit +++ b/crates/wasi-http/wit/deps/sockets/ip-name-lookup.wit @@ -1,6 +1,6 @@ interface ip-name-lookup { - use wasi:io/poll@0.2.0-rc-2023-11-10.{pollable}; + use wasi:io/poll@0.2.0.{pollable}; use network.{network, error-code, ip-address}; diff --git a/crates/wasi-http/wit/deps/sockets/network.wit b/crates/wasi-http/wit/deps/sockets/network.wit index 6bb07cd6faa7..9cadf0650a49 100644 --- a/crates/wasi-http/wit/deps/sockets/network.wit +++ b/crates/wasi-http/wit/deps/sockets/network.wit @@ -18,8 +18,6 @@ interface network { /// /// See each individual API for what the POSIX equivalents are. They sometimes differ per API. enum error-code { - // ### GENERAL ERRORS ### - /// Unknown error unknown, @@ -64,9 +62,6 @@ interface network { would-block, - - // ### TCP & UDP SOCKET ERRORS ### - /// The operation is not valid in the socket's current state. invalid-state, @@ -83,24 +78,21 @@ interface network { remote-unreachable, - // ### TCP SOCKET ERRORS ### - - /// The connection was forcefully rejected + /// The TCP connection was forcefully rejected connection-refused, - /// The connection was reset. + /// The TCP connection was reset. connection-reset, - /// A connection was aborted. + /// A TCP connection was aborted. connection-aborted, - // ### UDP SOCKET ERRORS ### + /// The size of a datagram sent to a UDP socket exceeded the maximum + /// supported size. datagram-too-large, - // ### NAME LOOKUP ERRORS ### - /// Name does not exist or has no suitable associated IP addresses. name-unresolvable, @@ -128,15 +120,21 @@ interface network { } record ipv4-socket-address { - port: u16, // sin_port - address: ipv4-address, // sin_addr + /// sin_port + port: u16, + /// sin_addr + address: ipv4-address, } record ipv6-socket-address { - port: u16, // sin6_port - flow-info: u32, // sin6_flowinfo - address: ipv6-address, // sin6_addr - scope-id: u32, // sin6_scope_id + /// sin6_port + port: u16, + /// sin6_flowinfo + flow-info: u32, + /// sin6_addr + address: ipv6-address, + /// sin6_scope_id + scope-id: u32, } variant ip-socket-address { diff --git a/crates/wasi-http/wit/deps/sockets/tcp-create-socket.wit b/crates/wasi-http/wit/deps/sockets/tcp-create-socket.wit index 768a07c85021..c7ddf1f228ef 100644 --- a/crates/wasi-http/wit/deps/sockets/tcp-create-socket.wit +++ b/crates/wasi-http/wit/deps/sockets/tcp-create-socket.wit @@ -6,9 +6,10 @@ interface tcp-create-socket { /// Create a new TCP socket. /// /// Similar to `socket(AF_INET or AF_INET6, SOCK_STREAM, IPPROTO_TCP)` in POSIX. + /// On IPv6 sockets, IPV6_V6ONLY is enabled by default and can't be configured otherwise. /// /// This function does not require a network capability handle. This is considered to be safe because - /// at time of creation, the socket is not bound to any `network` yet. Up to the moment `bind`/`listen`/`connect` + /// at time of creation, the socket is not bound to any `network` yet. Up to the moment `bind`/`connect` /// is called, the socket is effectively an in-memory configuration object, unable to communicate with the outside world. /// /// All sockets are non-blocking. Use the wasi-poll interface to block on asynchronous operations. diff --git a/crates/wasi-http/wit/deps/sockets/tcp.wit b/crates/wasi-http/wit/deps/sockets/tcp.wit index b01b65e6c4b5..5902b9ee0519 100644 --- a/crates/wasi-http/wit/deps/sockets/tcp.wit +++ b/crates/wasi-http/wit/deps/sockets/tcp.wit @@ -1,8 +1,8 @@ interface tcp { - use wasi:io/streams@0.2.0-rc-2023-11-10.{input-stream, output-stream}; - use wasi:io/poll@0.2.0-rc-2023-11-10.{pollable}; - use wasi:clocks/monotonic-clock@0.2.0-rc-2023-11-10.{duration}; + use wasi:io/streams@0.2.0.{input-stream, output-stream}; + use wasi:io/poll@0.2.0.{pollable}; + use wasi:clocks/monotonic-clock@0.2.0.{duration}; use network.{network, error-code, ip-socket-address, ip-address-family}; enum shutdown-type { @@ -15,9 +15,28 @@ interface tcp { /// Similar to `SHUT_RDWR` in POSIX. both, } - - - /// A TCP socket handle. + + /// A TCP socket resource. + /// + /// The socket can be in one of the following states: + /// - `unbound` + /// - `bind-in-progress` + /// - `bound` (See note below) + /// - `listen-in-progress` + /// - `listening` + /// - `connect-in-progress` + /// - `connected` + /// - `closed` + /// See + /// for a more information. + /// + /// Note: Except where explicitly mentioned, whenever this documentation uses + /// the term "bound" without backticks it actually means: in the `bound` state *or higher*. + /// (i.e. `bound`, `listen-in-progress`, `listening`, `connect-in-progress` or `connected`) + /// + /// In addition to the general error codes documented on the + /// `network::error-code` type, TCP socket methods may always return + /// `error(invalid-state)` when in the `closed` state. resource tcp-socket { /// Bind the socket to a specific network on the provided IP address and port. /// @@ -25,23 +44,32 @@ interface tcp { /// network interface(s) to bind to. /// If the TCP/UDP port is zero, the socket will be bound to a random free port. /// - /// When a socket is not explicitly bound, the first invocation to a listen or connect operation will - /// implicitly bind the socket. - /// - /// Unlike in POSIX, this function is async. This enables interactive WASI hosts to inject permission prompts. + /// Bind can be attempted multiple times on the same socket, even with + /// different arguments on each iteration. But never concurrently and + /// only as long as the previous bind failed. Once a bind succeeds, the + /// binding can't be changed anymore. /// - /// # Typical `start` errors + /// # Typical errors /// - `invalid-argument`: The `local-address` has the wrong address family. (EAFNOSUPPORT, EFAULT on Windows) /// - `invalid-argument`: `local-address` is not a unicast address. (EINVAL) - /// - `invalid-argument`: `local-address` is an IPv4-mapped IPv6 address, but the socket has `ipv6-only` enabled. (EINVAL) + /// - `invalid-argument`: `local-address` is an IPv4-mapped IPv6 address. (EINVAL) /// - `invalid-state`: The socket is already bound. (EINVAL) - /// - /// # Typical `finish` errors /// - `address-in-use`: No ephemeral ports available. (EADDRINUSE, ENOBUFS on Windows) /// - `address-in-use`: Address is already in use. (EADDRINUSE) /// - `address-not-bindable`: `local-address` is not an address that the `network` can bind to. (EADDRNOTAVAIL) /// - `not-in-progress`: A `bind` operation is not in progress. /// - `would-block`: Can't finish the operation, it is still in progress. (EWOULDBLOCK, EAGAIN) + /// + /// # Implementors note + /// When binding to a non-zero port, this bind operation shouldn't be affected by the TIME_WAIT + /// state of a recently closed socket on the same local address. In practice this means that the SO_REUSEADDR + /// socket option should be set implicitly on all platforms, except on Windows where this is the default behavior + /// and SO_REUSEADDR performs something different entirely. + /// + /// Unlike in POSIX, in WASI the bind operation is async. This enables + /// interactive WASI hosts to inject permission prompts. Runtimes that + /// don't want to make use of this ability can simply call the native + /// `bind` as part of either `start-bind` or `finish-bind`. /// /// # References /// - @@ -54,39 +82,40 @@ interface tcp { /// Connect to a remote endpoint. /// /// On success: - /// - the socket is transitioned into the Connection state + /// - the socket is transitioned into the `connection` state. /// - a pair of streams is returned that can be used to read & write to the connection /// - /// POSIX mentions: - /// > If connect() fails, the state of the socket is unspecified. Conforming applications should - /// > close the file descriptor and create a new socket before attempting to reconnect. + /// After a failed connection attempt, the socket will be in the `closed` + /// state and the only valid action left is to `drop` the socket. A single + /// socket can not be used to connect more than once. /// - /// WASI prescribes the following behavior: - /// - If `connect` fails because an input/state validation error, the socket should remain usable. - /// - If a connection was actually attempted but failed, the socket should become unusable for further network communication. - /// Besides `drop`, any method after such a failure may return an error. - /// - /// # Typical `start` errors + /// # Typical errors /// - `invalid-argument`: The `remote-address` has the wrong address family. (EAFNOSUPPORT) /// - `invalid-argument`: `remote-address` is not a unicast address. (EINVAL, ENETUNREACH on Linux, EAFNOSUPPORT on MacOS) - /// - `invalid-argument`: `remote-address` is an IPv4-mapped IPv6 address, but the socket has `ipv6-only` enabled. (EINVAL, EADDRNOTAVAIL on Illumos) - /// - `invalid-argument`: `remote-address` is a non-IPv4-mapped IPv6 address, but the socket was bound to a specific IPv4-mapped IPv6 address. (or vice versa) + /// - `invalid-argument`: `remote-address` is an IPv4-mapped IPv6 address. (EINVAL, EADDRNOTAVAIL on Illumos) /// - `invalid-argument`: The IP address in `remote-address` is set to INADDR_ANY (`0.0.0.0` / `::`). (EADDRNOTAVAIL on Windows) /// - `invalid-argument`: The port in `remote-address` is set to 0. (EADDRNOTAVAIL on Windows) /// - `invalid-argument`: The socket is already attached to a different network. The `network` passed to `connect` must be identical to the one passed to `bind`. - /// - `invalid-state`: The socket is already in the Connection state. (EISCONN) - /// - `invalid-state`: The socket is already in the Listener state. (EOPNOTSUPP, EINVAL on Windows) - /// - /// # Typical `finish` errors + /// - `invalid-state`: The socket is already in the `connected` state. (EISCONN) + /// - `invalid-state`: The socket is already in the `listening` state. (EOPNOTSUPP, EINVAL on Windows) /// - `timeout`: Connection timed out. (ETIMEDOUT) /// - `connection-refused`: The connection was forcefully rejected. (ECONNREFUSED) /// - `connection-reset`: The connection was reset. (ECONNRESET) /// - `connection-aborted`: The connection was aborted. (ECONNABORTED) /// - `remote-unreachable`: The remote address is not reachable. (EHOSTUNREACH, EHOSTDOWN, ENETUNREACH, ENETDOWN, ENONET) /// - `address-in-use`: Tried to perform an implicit bind, but there were no ephemeral ports available. (EADDRINUSE, EADDRNOTAVAIL on Linux, EAGAIN on BSD) - /// - `not-in-progress`: A `connect` operation is not in progress. + /// - `not-in-progress`: A connect operation is not in progress. /// - `would-block`: Can't finish the operation, it is still in progress. (EWOULDBLOCK, EAGAIN) /// + /// # Implementors note + /// The POSIX equivalent of `start-connect` is the regular `connect` syscall. + /// Because all WASI sockets are non-blocking this is expected to return + /// EINPROGRESS, which should be translated to `ok()` in WASI. + /// + /// The POSIX equivalent of `finish-connect` is a `poll` for event `POLLOUT` + /// with a timeout of 0 on the socket descriptor. Followed by a check for + /// the `SO_ERROR` socket option, in case the poll signaled readiness. + /// /// # References /// - /// - @@ -97,22 +126,24 @@ interface tcp { /// Start listening for new connections. /// - /// Transitions the socket into the Listener state. + /// Transitions the socket into the `listening` state. /// - /// Unlike POSIX: - /// - this function is async. This enables interactive WASI hosts to inject permission prompts. - /// - the socket must already be explicitly bound. + /// Unlike POSIX, the socket must already be explicitly bound. /// - /// # Typical `start` errors + /// # Typical errors /// - `invalid-state`: The socket is not bound to any local address. (EDESTADDRREQ) - /// - `invalid-state`: The socket is already in the Connection state. (EISCONN, EINVAL on BSD) - /// - `invalid-state`: The socket is already in the Listener state. - /// - /// # Typical `finish` errors + /// - `invalid-state`: The socket is already in the `connected` state. (EISCONN, EINVAL on BSD) + /// - `invalid-state`: The socket is already in the `listening` state. /// - `address-in-use`: Tried to perform an implicit bind, but there were no ephemeral ports available. (EADDRINUSE) - /// - `not-in-progress`: A `listen` operation is not in progress. + /// - `not-in-progress`: A listen operation is not in progress. /// - `would-block`: Can't finish the operation, it is still in progress. (EWOULDBLOCK, EAGAIN) /// + /// # Implementors note + /// Unlike in POSIX, in WASI the listen operation is async. This enables + /// interactive WASI hosts to inject permission prompts. Runtimes that + /// don't want to make use of this ability can simply call the native + /// `listen` as part of either `start-listen` or `finish-listen`. + /// /// # References /// - /// - @@ -123,9 +154,8 @@ interface tcp { /// Accept a new client socket. /// - /// The returned socket is bound and in the Connection state. The following properties are inherited from the listener socket: + /// The returned socket is bound and in the `connected` state. The following properties are inherited from the listener socket: /// - `address-family` - /// - `ipv6-only` /// - `keep-alive-enabled` /// - `keep-alive-idle-time` /// - `keep-alive-interval` @@ -138,7 +168,7 @@ interface tcp { /// a pair of streams that can be used to read & write to the connection. /// /// # Typical errors - /// - `invalid-state`: Socket is not in the Listener state. (EINVAL) + /// - `invalid-state`: Socket is not in the `listening` state. (EINVAL) /// - `would-block`: No pending connections at the moment. (EWOULDBLOCK, EAGAIN) /// - `connection-aborted`: An incoming connection was pending, but was terminated by the client before this listener could accept it. (ECONNABORTED) /// - `new-socket-limit`: The new socket resource could not be created because of a system limit. (EMFILE, ENFILE) @@ -180,7 +210,7 @@ interface tcp { /// - remote-address: func() -> result; - /// Whether the socket is listening for new connections. + /// Whether the socket is in the `listening` state. /// /// Equivalent to the SO_ACCEPTCONN socket option. is-listening: func() -> bool; @@ -190,17 +220,6 @@ interface tcp { /// Equivalent to the SO_DOMAIN socket option. address-family: func() -> ip-address-family; - /// Whether IPv4 compatibility (dual-stack) mode is disabled or not. - /// - /// Equivalent to the IPV6_V6ONLY socket option. - /// - /// # Typical errors - /// - `invalid-state`: (set) The socket is already bound. - /// - `not-supported`: (get/set) `this` socket is an IPv4 socket. - /// - `not-supported`: (set) Host does not support dual-stack sockets. (Implementations are not required to.) - ipv6-only: func() -> result; - set-ipv6-only: func(value: bool) -> result<_, error-code>; - /// Hints the desired listen queue size. Implementations are free to ignore this. /// /// If the provided value is 0, an `invalid-argument` error is returned. @@ -209,7 +228,7 @@ interface tcp { /// # Typical errors /// - `not-supported`: (set) The platform does not support changing the backlog size after the initial listen. /// - `invalid-argument`: (set) The provided value was 0. - /// - `invalid-state`: (set) The socket is already in the Connection state. + /// - `invalid-state`: (set) The socket is in the `connect-in-progress` or `connected` state. set-listen-backlog-size: func(value: u64) -> result<_, error-code>; /// Enables or disables keepalive. @@ -269,8 +288,6 @@ interface tcp { /// /// # Typical errors /// - `invalid-argument`: (set) The TTL value must be 1 or higher. - /// - `invalid-state`: (set) The socket is already in the Connection state. - /// - `invalid-state`: (set) The socket is already in the Listener state. hop-limit: func() -> result; set-hop-limit: func(value: u8) -> result<_, error-code>; @@ -284,14 +301,25 @@ interface tcp { /// /// # Typical errors /// - `invalid-argument`: (set) The provided value was 0. - /// - `invalid-state`: (set) The socket is already in the Connection state. - /// - `invalid-state`: (set) The socket is already in the Listener state. receive-buffer-size: func() -> result; set-receive-buffer-size: func(value: u64) -> result<_, error-code>; send-buffer-size: func() -> result; set-send-buffer-size: func(value: u64) -> result<_, error-code>; - /// Create a `pollable` which will resolve once the socket is ready for I/O. + /// Create a `pollable` which can be used to poll for, or block on, + /// completion of any of the asynchronous operations of this socket. + /// + /// When `finish-bind`, `finish-listen`, `finish-connect` or `accept` + /// return `error(would-block)`, this pollable can be used to wait for + /// their success or failure, after which the method can be retried. + /// + /// The pollable is not limited to the async operation that happens to be + /// in progress at the time of calling `subscribe` (if any). Theoretically, + /// `subscribe` only has to be called once per socket and can then be + /// (re)used for the remainder of the socket's lifetime. + /// + /// See + /// for a more information. /// /// Note: this function is here for WASI Preview2 only. /// It's planned to be removed when `future` is natively supported in Preview3. @@ -299,17 +327,21 @@ interface tcp { /// Initiate a graceful shutdown. /// - /// - receive: the socket is not expecting to receive any more data from the peer. All subsequent read - /// operations on the `input-stream` associated with this socket will return an End Of Stream indication. - /// Any data still in the receive queue at time of calling `shutdown` will be discarded. - /// - send: the socket is not expecting to send any more data to the peer. All subsequent write - /// operations on the `output-stream` associated with this socket will return an error. - /// - both: same effect as receive & send combined. + /// - `receive`: The socket is not expecting to receive any data from + /// the peer. The `input-stream` associated with this socket will be + /// closed. Any data still in the receive queue at time of calling + /// this method will be discarded. + /// - `send`: The socket has no more data to send to the peer. The `output-stream` + /// associated with this socket will be closed and a FIN packet will be sent. + /// - `both`: Same effect as `receive` & `send` combined. + /// + /// This function is idempotent. Shutting a down a direction more than once + /// has no effect and returns `ok`. /// /// The shutdown function does not close (drop) the socket. /// /// # Typical errors - /// - `invalid-state`: The socket is not in the Connection state. (ENOTCONN) + /// - `invalid-state`: The socket is not in the `connected` state. (ENOTCONN) /// /// # References /// - diff --git a/crates/wasi-http/wit/deps/sockets/udp-create-socket.wit b/crates/wasi-http/wit/deps/sockets/udp-create-socket.wit index cc58234d8455..0482d1fe7350 100644 --- a/crates/wasi-http/wit/deps/sockets/udp-create-socket.wit +++ b/crates/wasi-http/wit/deps/sockets/udp-create-socket.wit @@ -6,6 +6,7 @@ interface udp-create-socket { /// Create a new UDP socket. /// /// Similar to `socket(AF_INET or AF_INET6, SOCK_DGRAM, IPPROTO_UDP)` in POSIX. + /// On IPv6 sockets, IPV6_V6ONLY is enabled by default and can't be configured otherwise. /// /// This function does not require a network capability handle. This is considered to be safe because /// at time of creation, the socket is not bound to any `network` yet. Up to the moment `bind` is called, diff --git a/crates/wasi-http/wit/deps/sockets/udp.wit b/crates/wasi-http/wit/deps/sockets/udp.wit index c8dafadfcb21..d987a0a90801 100644 --- a/crates/wasi-http/wit/deps/sockets/udp.wit +++ b/crates/wasi-http/wit/deps/sockets/udp.wit @@ -1,6 +1,6 @@ interface udp { - use wasi:io/poll@0.2.0-rc-2023-11-10.{pollable}; + use wasi:io/poll@0.2.0.{pollable}; use network.{network, error-code, ip-socket-address, ip-address-family}; /// A received datagram. @@ -43,19 +43,21 @@ interface udp { /// network interface(s) to bind to. /// If the port is zero, the socket will be bound to a random free port. /// - /// Unlike in POSIX, this function is async. This enables interactive WASI hosts to inject permission prompts. - /// - /// # Typical `start` errors + /// # Typical errors /// - `invalid-argument`: The `local-address` has the wrong address family. (EAFNOSUPPORT, EFAULT on Windows) /// - `invalid-state`: The socket is already bound. (EINVAL) - /// - /// # Typical `finish` errors /// - `address-in-use`: No ephemeral ports available. (EADDRINUSE, ENOBUFS on Windows) /// - `address-in-use`: Address is already in use. (EADDRINUSE) /// - `address-not-bindable`: `local-address` is not an address that the `network` can bind to. (EADDRNOTAVAIL) /// - `not-in-progress`: A `bind` operation is not in progress. /// - `would-block`: Can't finish the operation, it is still in progress. (EWOULDBLOCK, EAGAIN) /// + /// # Implementors note + /// Unlike in POSIX, in WASI the bind operation is async. This enables + /// interactive WASI hosts to inject permission prompts. Runtimes that + /// don't want to make use of this ability can simply call the native + /// `bind` as part of either `start-bind` or `finish-bind`. + /// /// # References /// - /// - @@ -92,7 +94,6 @@ interface udp { /// /// # Typical errors /// - `invalid-argument`: The `remote-address` has the wrong address family. (EAFNOSUPPORT) - /// - `invalid-argument`: `remote-address` is a non-IPv4-mapped IPv6 address, but the socket was bound to a specific IPv4-mapped IPv6 address. (or vice versa) /// - `invalid-argument`: The IP address in `remote-address` is set to INADDR_ANY (`0.0.0.0` / `::`). (EDESTADDRREQ, EADDRNOTAVAIL) /// - `invalid-argument`: The port in `remote-address` is set to 0. (EDESTADDRREQ, EADDRNOTAVAIL) /// - `invalid-state`: The socket is not bound. @@ -142,17 +143,6 @@ interface udp { /// Equivalent to the SO_DOMAIN socket option. address-family: func() -> ip-address-family; - /// Whether IPv4 compatibility (dual-stack) mode is disabled or not. - /// - /// Equivalent to the IPV6_V6ONLY socket option. - /// - /// # Typical errors - /// - `not-supported`: (get/set) `this` socket is an IPv4 socket. - /// - `invalid-state`: (set) The socket is already bound. - /// - `not-supported`: (set) Host does not support dual-stack sockets. (Implementations are not required to.) - ipv6-only: func() -> result; - set-ipv6-only: func(value: bool) -> result<_, error-code>; - /// Equivalent to the IP_TTL & IPV6_UNICAST_HOPS socket options. /// /// If the provided value is 0, an `invalid-argument` error is returned. @@ -248,7 +238,6 @@ interface udp { /// /// # Typical errors /// - `invalid-argument`: The `remote-address` has the wrong address family. (EAFNOSUPPORT) - /// - `invalid-argument`: `remote-address` is a non-IPv4-mapped IPv6 address, but the socket was bound to a specific IPv4-mapped IPv6 address. (or vice versa) /// - `invalid-argument`: The IP address in `remote-address` is set to INADDR_ANY (`0.0.0.0` / `::`). (EDESTADDRREQ, EADDRNOTAVAIL) /// - `invalid-argument`: The port in `remote-address` is set to 0. (EDESTADDRREQ, EADDRNOTAVAIL) /// - `invalid-argument`: The socket is in "connected" mode and `remote-address` is `some` value that does not match the address passed to `stream`. (EISCONN) diff --git a/crates/wasi-http/wit/deps/sockets/world.wit b/crates/wasi-http/wit/deps/sockets/world.wit index 49ad8d3d9fde..f8bb92ae0457 100644 --- a/crates/wasi-http/wit/deps/sockets/world.wit +++ b/crates/wasi-http/wit/deps/sockets/world.wit @@ -1,4 +1,4 @@ -package wasi:sockets@0.2.0-rc-2023-11-10; +package wasi:sockets@0.2.0; world imports { import instance-network; diff --git a/crates/wasi-http/wit/test.wit b/crates/wasi-http/wit/test.wit index 68dfaeaf378b..f590391035c4 100644 --- a/crates/wasi-http/wit/test.wit +++ b/crates/wasi-http/wit/test.wit @@ -2,21 +2,21 @@ package wasmtime:wasi; // only used as part of `test-programs` world test-reactor { - include wasi:cli/reactor@0.2.0-rc-2023-11-10; + include wasi:cli/imports@0.2.0; export add-strings: func(s: list) -> u32; export get-strings: func() -> list; - use wasi:io/streams@0.2.0-rc-2023-11-10.{output-stream}; + use wasi:io/streams@0.2.0.{output-stream}; export write-strings-to: func(o: output-stream) -> result; - use wasi:filesystem/types@0.2.0-rc-2023-11-10.{descriptor-stat}; + use wasi:filesystem/types@0.2.0.{descriptor-stat}; export pass-an-imported-record: func(d: descriptor-stat) -> string; } world test-command { - include wasi:cli/reactor@0.2.0-rc-2023-11-10; - import wasi:http/types@0.2.0-rc-2023-11-10; - import wasi:http/outgoing-handler@0.2.0-rc-2023-11-10; + include wasi:cli/imports@0.2.0; + import wasi:http/types@0.2.0; + import wasi:http/outgoing-handler@0.2.0; } diff --git a/crates/wasi-nn/Cargo.toml b/crates/wasi-nn/Cargo.toml index 13f1501583e4..4c8734eec9b7 100644 --- a/crates/wasi-nn/Cargo.toml +++ b/crates/wasi-nn/Cargo.toml @@ -11,18 +11,27 @@ repository = "https://github.com/bytecodealliance/wasmtime" readme = "README.md" edition.workspace = true +[lints] +workspace = true + [dependencies] # These dependencies are necessary for the WITX-generation macros to work: anyhow = { workspace = true } -wiggle = { workspace = true } +wiggle = { workspace = true, features = ["wasmtime"] } # This dependency is necessary for the WIT-generation macros to work: -wasmtime = { workspace = true, features = ["component-model"] } +wasmtime = { workspace = true, features = ["component-model", "runtime"] } # These dependencies are necessary for the wasi-nn implementation: tracing = { workspace = true } -openvino = { version = "0.5.0", features = ["runtime-linking"] } +openvino = { version = "0.6.0", features = ["runtime-linking"] } thiserror = { workspace = true } [build-dependencies] walkdir = { workspace = true } + +[dev-dependencies] +cap-std = { workspace = true } +test-programs-artifacts = { workspace = true } +wasi-common = { workspace = true, features = ["sync"] } +wasmtime = { workspace = true, features = ["cranelift"] } diff --git a/crates/wasi-nn/README.md b/crates/wasi-nn/README.md index 4933fcba339c..c726c7c90cd6 100644 --- a/crates/wasi-nn/README.md +++ b/crates/wasi-nn/README.md @@ -37,9 +37,3 @@ An end-to-end example demonstrating ML classification is included in [examples]: `examples/classification-example` contains a standalone Rust project that uses the [wasi-nn] APIs and is compiled to the `wasm32-wasi` target using the high-level `wasi-nn` [bindings]. - -Run the example from the Wasmtime project directory: - -```sh -$ ci/run-wasi-nn-example.sh -``` diff --git a/crates/wasi-nn/src/lib.rs b/crates/wasi-nn/src/lib.rs index 71d089d07489..e66c59fb2a05 100644 --- a/crates/wasi-nn/src/lib.rs +++ b/crates/wasi-nn/src/lib.rs @@ -4,6 +4,7 @@ mod registry; pub mod backend; pub use ctx::{preload, WasiNnCtx}; pub use registry::{GraphRegistry, InMemoryRegistry}; +pub mod testing; pub mod wit; pub mod witx; diff --git a/crates/wasi-nn/src/testing.rs b/crates/wasi-nn/src/testing.rs new file mode 100644 index 000000000000..b960335dc500 --- /dev/null +++ b/crates/wasi-nn/src/testing.rs @@ -0,0 +1,97 @@ +//! This is testing-specific code--it is public only so that it can be +//! accessible both in unit and integration tests. +//! +//! This module checks: +//! - that OpenVINO can be found in the environment +//! - that some ML model artifacts can be downloaded and cached. + +use anyhow::{anyhow, Context, Result}; +use std::{env, fs, path::Path, path::PathBuf, process::Command, sync::Mutex}; + +/// Return the directory in which the test artifacts are stored. +pub fn artifacts_dir() -> PathBuf { + PathBuf::from(env!("OUT_DIR")).join("mobilenet") +} + +/// Early-return from a test if the test environment is not met. If the `CI` +/// or `FORCE_WASINN_TEST_CHECK` environment variables are set, though, this +/// will return an error instead. +#[macro_export] +macro_rules! check_test { + () => { + if let Err(e) = $crate::testing::check() { + if std::env::var_os("CI").is_some() + || std::env::var_os("FORCE_WASINN_TEST_CHECK").is_some() + { + return Err(e); + } else { + println!("> ignoring test: {}", e); + return Ok(()); + } + } + }; +} + +/// Return `Ok` if all checks pass. +pub fn check() -> Result<()> { + check_openvino_is_installed()?; + check_openvino_artifacts_are_available()?; + Ok(()) +} + +/// Return `Ok` if we find a working OpenVINO installation. +fn check_openvino_is_installed() -> Result<()> { + match std::panic::catch_unwind(|| println!("> found openvino version: {}", openvino::version())) + { + Ok(_) => Ok(()), + Err(e) => Err(anyhow!("unable to find an OpenVINO installation: {:?}", e)), + } +} + +/// Protect `check_openvino_artifacts_are_available` from concurrent access; +/// when running tests in parallel, we want to avoid two threads attempting to +/// create the same directory or download the same file. +static ARTIFACTS: Mutex<()> = Mutex::new(()); + +/// Return `Ok` if we find the cached MobileNet test artifacts; this will +/// download the artifacts if necessary. +fn check_openvino_artifacts_are_available() -> Result<()> { + let _exclusively_retrieve_artifacts = ARTIFACTS.lock().unwrap(); + const BASE_URL: &str = + "https://github.com/intel/openvino-rs/raw/main/crates/openvino/tests/fixtures/mobilenet"; + let artifacts_dir = artifacts_dir(); + if !artifacts_dir.is_dir() { + fs::create_dir(&artifacts_dir)?; + } + for (from, to) in [ + ("mobilenet.bin", "model.bin"), + ("mobilenet.xml", "model.xml"), + ("tensor-1x224x224x3-f32.bgr", "tensor.bgr"), + ] { + let remote_url = [BASE_URL, from].join("/"); + let local_path = artifacts_dir.join(to); + if !local_path.is_file() { + download(&remote_url, &local_path) + .with_context(|| "unable to retrieve test artifact")?; + } else { + println!("> using cached artifact: {}", local_path.display()) + } + } + Ok(()) +} + +/// Retrieve the bytes at the `from` URL and place them in the `to` file. +fn download(from: &str, to: &Path) -> anyhow::Result<()> { + let mut curl = Command::new("curl"); + curl.arg("--location").arg(from).arg("--output").arg(to); + println!("> downloading: {:?}", &curl); + let result = curl.output().unwrap(); + if !result.status.success() { + panic!( + "curl failed: {}\n{}", + result.status, + String::from_utf8_lossy(&result.stderr) + ); + } + Ok(()) +} diff --git a/crates/wasi-nn/tests/all.rs b/crates/wasi-nn/tests/all.rs new file mode 100644 index 000000000000..185daec9fbf5 --- /dev/null +++ b/crates/wasi-nn/tests/all.rs @@ -0,0 +1,92 @@ +//! Run the wasi-nn tests in `crates/test-programs`. + +use anyhow::Result; +use std::path::Path; +use test_programs_artifacts::*; +use wasi_common::sync::{Dir, WasiCtxBuilder}; +use wasi_common::WasiCtx; +use wasmtime::{Config, Engine, Linker, Module, Store}; +use wasmtime_wasi_nn::{backend, testing, InMemoryRegistry, WasiNnCtx}; + +const PREOPENED_DIR_NAME: &str = "fixture"; + +/// Run a wasi-nn test program. This is modeled after +/// `crates/wasi/tests/all/main.rs` but still uses the older preview1 API for +/// file reads. +fn run(path: &str, preload_model: bool) -> Result<()> { + wasmtime_wasi_nn::check_test!(); + let path = Path::new(path); + let config = Config::new(); + let engine = Engine::new(&config)?; + let mut linker = Linker::new(&engine); + wasmtime_wasi_nn::witx::add_to_linker(&mut linker, |s: &mut Ctx| &mut s.wasi_nn)?; + wasi_common::sync::add_to_linker(&mut linker, |s: &mut Ctx| &mut s.wasi)?; + let module = Module::from_file(&engine, path)?; + let mut store = Store::new(&engine, Ctx::new(&testing::artifacts_dir(), preload_model)?); + let instance = linker.instantiate(&mut store, &module)?; + let start = instance.get_typed_func::<(), ()>(&mut store, "_start")?; + start.call(&mut store, ())?; + Ok(()) +} + +/// The host state for running wasi-nn tests. +struct Ctx { + wasi: WasiCtx, + wasi_nn: WasiNnCtx, +} +impl Ctx { + fn new(preopen_dir: &Path, preload_model: bool) -> Result { + // Create the WASI context. + let preopen_dir = Dir::open_ambient_dir(preopen_dir, cap_std::ambient_authority())?; + let mut builder = WasiCtxBuilder::new(); + builder + .inherit_stdio() + .preopened_dir(preopen_dir, PREOPENED_DIR_NAME)?; + let wasi = builder.build(); + + // Create the wasi-nn context. + let mut openvino = backend::openvino::OpenvinoBackend::default(); + let mut registry = InMemoryRegistry::new(); + let mobilenet_dir = testing::artifacts_dir(); + if preload_model { + registry.load(&mut openvino, &mobilenet_dir)?; + } + let wasi_nn = WasiNnCtx::new([openvino.into()], registry.into()); + + Ok(Self { wasi, wasi_nn }) + } +} + +// Check that every wasi-nn test in `crates/test-programs` has its +// manually-added `#[test]` function. +macro_rules! assert_test_exists { + ($name:ident) => { + #[allow(unused_imports)] + use self::$name as _; + }; +} +foreach_nn!(assert_test_exists); + +#[cfg_attr( + not(all( + target_arch = "x86_64", + any(target_os = "linux", target_os = "windows") + )), + ignore +)] +#[test] +fn nn_image_classification() { + run(NN_IMAGE_CLASSIFICATION, false).unwrap() +} + +#[cfg_attr( + not(all( + target_arch = "x86_64", + any(target_os = "linux", target_os = "windows") + )), + ignore +)] +#[test] +fn nn_image_classification_named() { + run(NN_IMAGE_CLASSIFICATION_NAMED, true).unwrap() +} diff --git a/crates/wasi-preview1-component-adapter/Cargo.toml b/crates/wasi-preview1-component-adapter/Cargo.toml index 12b9d3f05d7b..cae715a7d074 100644 --- a/crates/wasi-preview1-component-adapter/Cargo.toml +++ b/crates/wasi-preview1-component-adapter/Cargo.toml @@ -5,6 +5,9 @@ authors.workspace = true edition.workspace = true publish = false +[lints] +workspace = true + [dependencies] wasi = { version = "0.11.0", default-features = false } wit-bindgen = { workspace = true, default-features = false, features = ["macros"] } @@ -23,3 +26,4 @@ name = "wasi_snapshot_preview1" default = ["reactor"] reactor = [] command = [] +proxy = [] diff --git a/crates/wasi-preview1-component-adapter/src/descriptors.rs b/crates/wasi-preview1-component-adapter/src/descriptors.rs index da752f08cd2d..52b2378c7ac6 100644 --- a/crates/wasi-preview1-component-adapter/src/descriptors.rs +++ b/crates/wasi-preview1-component-adapter/src/descriptors.rs @@ -1,14 +1,15 @@ -use crate::bindings::wasi::cli::{ - stderr, stdin, stdout, terminal_stderr, terminal_stdin, terminal_stdout, -}; -use crate::bindings::wasi::filesystem::types as filesystem; +use crate::bindings::wasi::cli::{stderr, stdin, stdout}; use crate::bindings::wasi::io::streams::{InputStream, OutputStream}; -use crate::bindings::wasi::sockets::tcp; -use crate::{BlockingMode, BumpArena, File, ImportAlloc, TrappingUnwrap, WasmStr}; +use crate::{BlockingMode, BumpArena, ImportAlloc, TrappingUnwrap, WasmStr}; use core::cell::{Cell, OnceCell, UnsafeCell}; use core::mem::MaybeUninit; use wasi::{Errno, Fd}; +#[cfg(not(feature = "proxy"))] +use crate::bindings::wasi::filesystem::types as filesystem; +#[cfg(not(feature = "proxy"))] +use crate::File; + pub const MAX_DESCRIPTORS: usize = 128; #[repr(C)] @@ -19,6 +20,8 @@ pub enum Descriptor { /// Input and/or output wasi-streams, along with stream metadata. Streams(Streams), + + Bad, } /// Input and/or output wasi-streams, along with a stream type that @@ -44,12 +47,14 @@ impl Streams { let input = match &self.type_ { // For directories, preview 1 behavior was to return ERRNO_BADF on attempts to read // or write. + #[cfg(not(feature = "proxy"))] StreamType::File(File { descriptor_type: filesystem::DescriptorType::Directory, .. }) => return Err(wasi::ERRNO_BADF), // For files, we may have adjusted the position for seeking, so // create a new stream. + #[cfg(not(feature = "proxy"))] StreamType::File(file) => { let input = file.fd.read_via_stream(file.position.get())?; input @@ -70,12 +75,14 @@ impl Streams { let output = match &self.type_ { // For directories, preview 1 behavior was to return ERRNO_BADF on attempts to read // or write. + #[cfg(not(feature = "proxy"))] StreamType::File(File { descriptor_type: filesystem::DescriptorType::Directory, .. }) => return Err(wasi::ERRNO_BADF), // For files, we may have adjusted the position for seeking, so // create a new stream. + #[cfg(not(feature = "proxy"))] StreamType::File(file) => { let output = if file.append { file.fd.append_via_stream()? @@ -93,28 +100,38 @@ impl Streams { } } -#[allow(dead_code)] // until Socket is implemented pub enum StreamType { /// Streams for implementing stdio. - Stdio(IsATTY), + Stdio(Stdio), /// Streaming data with a file. + #[cfg(not(feature = "proxy"))] File(File), - - /// Streaming data with a socket connection. - Socket(tcp::TcpSocket), } -pub enum IsATTY { - Yes, - No, +pub enum Stdio { + Stdin, + Stdout, + Stderr, } -impl IsATTY { +impl Stdio { pub fn filetype(&self) -> wasi::Filetype { - match self { - IsATTY::Yes => wasi::FILETYPE_CHARACTER_DEVICE, - IsATTY::No => wasi::FILETYPE_UNKNOWN, + #[cfg(not(feature = "proxy"))] + let is_terminal = { + use crate::bindings::wasi::cli; + match self { + Stdio::Stdin => cli::terminal_stdin::get_terminal_stdin().is_some(), + Stdio::Stdout => cli::terminal_stdout::get_terminal_stdout().is_some(), + Stdio::Stderr => cli::terminal_stderr::get_terminal_stderr().is_some(), + } + }; + #[cfg(feature = "proxy")] + let is_terminal = false; + if is_terminal { + wasi::FILETYPE_CHARACTER_DEVICE + } else { + wasi::FILETYPE_UNKNOWN } } } @@ -131,6 +148,7 @@ pub struct Descriptors { /// Preopened directories. Initialized lazily. Access with `State::get_preopens` /// to take care of initialization. + #[cfg(not(feature = "proxy"))] preopens: Cell>, } @@ -140,22 +158,10 @@ impl Descriptors { table: UnsafeCell::new(MaybeUninit::uninit()), table_len: Cell::new(0), closed: None, + #[cfg(not(feature = "proxy"))] preopens: Cell::new(None), }; - let stdin_isatty = match terminal_stdin::get_terminal_stdin() { - Some(_) => IsATTY::Yes, - None => IsATTY::No, - }; - let stdout_isatty = match terminal_stdout::get_terminal_stdout() { - Some(_) => IsATTY::Yes, - None => IsATTY::No, - }; - let stderr_isatty = match terminal_stderr::get_terminal_stderr() { - Some(_) => IsATTY::Yes, - None => IsATTY::No, - }; - fn new_once(val: T) -> OnceCell { let cell = OnceCell::new(); let _ = cell.set(val); @@ -165,23 +171,30 @@ impl Descriptors { d.push(Descriptor::Streams(Streams { input: new_once(stdin::get_stdin()), output: OnceCell::new(), - type_: StreamType::Stdio(stdin_isatty), + type_: StreamType::Stdio(Stdio::Stdin), })) .trapping_unwrap(); d.push(Descriptor::Streams(Streams { input: OnceCell::new(), output: new_once(stdout::get_stdout()), - type_: StreamType::Stdio(stdout_isatty), + type_: StreamType::Stdio(Stdio::Stdout), })) .trapping_unwrap(); d.push(Descriptor::Streams(Streams { input: OnceCell::new(), output: new_once(stderr::get_stderr()), - type_: StreamType::Stdio(stderr_isatty), + type_: StreamType::Stdio(Stdio::Stderr), })) .trapping_unwrap(); - #[link(wasm_import_module = "wasi:filesystem/preopens@0.2.0-rc-2023-11-10")] + #[cfg(not(feature = "proxy"))] + d.open_preopens(import_alloc, arena); + d + } + + #[cfg(not(feature = "proxy"))] + fn open_preopens(&self, import_alloc: &ImportAlloc, arena: &BumpArena) { + #[link(wasm_import_module = "wasi:filesystem/preopens@0.2.0")] #[allow(improper_ctypes)] // FIXME(bytecodealliance/wit-bindgen#684) extern "C" { #[link_name = "get-directories"] @@ -206,7 +219,7 @@ impl Descriptors { // Expectation is that the descriptor index is initialized with // stdio (0,1,2) and no others, so that preopens are 3.. let descriptor_type = descriptor.get_type().trapping_unwrap(); - d.push(Descriptor::Streams(Streams { + self.push(Descriptor::Streams(Streams { input: OnceCell::new(), output: OnceCell::new(), type_: StreamType::File(File { @@ -220,8 +233,7 @@ impl Descriptors { .trapping_unwrap(); } - d.preopens.set(Some(preopens)); - d + self.preopens.set(Some(preopens)); } fn push(&self, desc: Descriptor) -> Result { @@ -287,6 +299,7 @@ impl Descriptors { .ok_or(wasi::ERRNO_BADF) } + #[cfg(not(feature = "proxy"))] pub fn get_preopen(&self, fd: Fd) -> Option<&Preopen> { let preopens = self.preopens.get().trapping_unwrap(); // Subtract 3 for the stdio indices to compute the preopen index. @@ -327,7 +340,7 @@ impl Descriptors { // First, ensure from_fd is in bounds: let _ = self.get(from_fd)?; // Expand table until to_fd is in bounds as well: - while self.table_len.get() as u32 <= to_fd as u32 { + while self.table_len.get() as u32 <= to_fd { self.push_closed()?; } // Then, close from_fd and put its contents into to_fd: @@ -347,10 +360,11 @@ impl Descriptors { ) -> Result<&mut Streams, Errno> { match self.get_mut(fd)? { Descriptor::Streams(streams) => Ok(streams), - Descriptor::Closed(_) => Err(error), + Descriptor::Closed(_) | Descriptor::Bad => Err(error), } } + #[cfg(not(feature = "proxy"))] pub fn get_file_with_error(&self, fd: Fd, error: Errno) -> Result<&File, Errno> { match self.get(fd)? { Descriptor::Streams(Streams { @@ -370,22 +384,12 @@ impl Descriptors { } } - #[allow(dead_code)] // until Socket is implemented - pub fn get_socket(&self, fd: Fd) -> Result<&tcp::TcpSocket, Errno> { - match self.get(fd)? { - Descriptor::Streams(Streams { - type_: StreamType::Socket(socket), - .. - }) => Ok(&*socket), - Descriptor::Closed(_) => Err(wasi::ERRNO_BADF), - _ => Err(wasi::ERRNO_INVAL), - } - } - + #[cfg(not(feature = "proxy"))] pub fn get_file(&self, fd: Fd) -> Result<&File, Errno> { self.get_file_with_error(fd, wasi::ERRNO_INVAL) } + #[cfg(not(feature = "proxy"))] pub fn get_dir(&self, fd: Fd) -> Result<&File, Errno> { match self.get(fd)? { Descriptor::Streams(Streams { @@ -406,6 +410,7 @@ impl Descriptors { } } + #[cfg(not(feature = "proxy"))] pub fn get_seekable_file(&self, fd: Fd) -> Result<&File, Errno> { self.get_file_with_error(fd, wasi::ERRNO_SPIPE) } @@ -417,18 +422,19 @@ impl Descriptors { pub fn get_read_stream(&self, fd: Fd) -> Result<&InputStream, Errno> { match self.get(fd)? { Descriptor::Streams(streams) => streams.get_read_stream(), - Descriptor::Closed(_) => Err(wasi::ERRNO_BADF), + Descriptor::Closed(_) | Descriptor::Bad => Err(wasi::ERRNO_BADF), } } pub fn get_write_stream(&self, fd: Fd) -> Result<&OutputStream, Errno> { match self.get(fd)? { Descriptor::Streams(streams) => streams.get_write_stream(), - Descriptor::Closed(_) => Err(wasi::ERRNO_BADF), + Descriptor::Closed(_) | Descriptor::Bad => Err(wasi::ERRNO_BADF), } } } +#[cfg(not(feature = "proxy"))] #[repr(C)] pub struct Preopen { /// This is `MaybeUninit` because we take ownership of the `Descriptor` to @@ -437,6 +443,7 @@ pub struct Preopen { pub path: WasmStr, } +#[cfg(not(feature = "proxy"))] #[repr(C)] pub struct PreopenList { pub base: *const Preopen, diff --git a/crates/wasi-preview1-component-adapter/src/lib.rs b/crates/wasi-preview1-component-adapter/src/lib.rs index aa4efe2a6993..3c86683f3d32 100644 --- a/crates/wasi-preview1-component-adapter/src/lib.rs +++ b/crates/wasi-preview1-component-adapter/src/lib.rs @@ -1,10 +1,21 @@ -use crate::bindings::wasi::cli::exit; +// The proxy world has no filesystem which most of this file is concerned with, +// so disable many warnings to avoid having to contort code too much for the +// proxy world. +#![cfg_attr( + feature = "proxy", + allow( + unused_mut, + unused_variables, + dead_code, + unused_imports, + unreachable_code + ) +)] + use crate::bindings::wasi::clocks::{monotonic_clock, wall_clock}; -use crate::bindings::wasi::filesystem::types as filesystem; use crate::bindings::wasi::io::poll; use crate::bindings::wasi::io::streams; use crate::bindings::wasi::random::random; -use crate::bindings::wasi::sockets::network; use core::cell::OnceCell; use core::cell::{Cell, RefCell, RefMut, UnsafeCell}; use core::cmp::min; @@ -17,8 +28,17 @@ use core::slice; use poll::Pollable; use wasi::*; -#[cfg(all(feature = "command", feature = "reactor"))] -compile_error!("only one of the `command` and `reactor` features may be selected at a time"); +#[cfg(not(feature = "proxy"))] +use crate::bindings::wasi::filesystem::types as filesystem; + +#[cfg(any( + all(feature = "command", feature = "reactor"), + all(feature = "reactor", feature = "proxy"), + all(feature = "command", feature = "proxy"), +))] +compile_error!( + "only one of the `command`, `reactor` or `proxy` features may be selected at a time" +); #[macro_use] mod macros; @@ -45,7 +65,7 @@ pub mod bindings { #[cfg(feature = "reactor")] wit_bindgen::generate!({ path: "../wasi/wit", - world: "wasi:cli/reactor", + world: "wasi:cli/imports", std_feature, raw_strings, // Automatically generated bindings for these functions will allocate @@ -56,9 +76,29 @@ pub mod bindings { // terms of raw pointers. skip: ["get-environment", "poll"], }); + + #[cfg(feature = "proxy")] + wit_bindgen::generate!({ + path: "./crates/wasi/wit", + inline: r#" + package wasmtime:adapter; + + world adapter { + import wasi:clocks/wall-clock@0.2.0; + import wasi:clocks/monotonic-clock@0.2.0; + import wasi:random/random@0.2.0; + import wasi:cli/stdout@0.2.0; + import wasi:cli/stderr@0.2.0; + import wasi:cli/stdin@0.2.0; + } + "#, + std_feature, + raw_strings, + skip: ["poll"], + }); } -#[export_name = "wasi:cli/run@0.2.0-rc-2023-11-10#run"] +#[export_name = "wasi:cli/run@0.2.0#run"] #[cfg(feature = "command")] pub unsafe extern "C" fn run() -> u32 { #[link(wasm_import_module = "__main_module__")] @@ -69,6 +109,17 @@ pub unsafe extern "C" fn run() -> u32 { 0 } +#[cfg(feature = "proxy")] +macro_rules! cfg_filesystem_available { + ($($t:tt)*) => { + wasi::ERRNO_NOTSUP + }; +} +#[cfg(not(feature = "proxy"))] +macro_rules! cfg_filesystem_available { + ($($t:tt)*) => ($($t)*); +} + // The unwrap/expect methods in std pull panic when they fail, which pulls // in unwinding machinery that we can't use in the adapter. Instead, use this // extension trait to get postfixed upwrap on Option and Result. @@ -94,6 +145,26 @@ impl TrappingUnwrap for Result { } } +/// Allocate a file descriptor which will generate an `ERRNO_BADF` if passed to +/// any WASI Preview 1 function implemented by this adapter. +/// +/// This is intended for use by `wasi-libc` during its incremental transition +/// from WASI Preview 1 to Preview 2. It will use this function to reserve +/// descriptors for its own use, valid only for use with libc functions. +#[no_mangle] +pub unsafe extern "C" fn adapter_open_badfd(fd: *mut u32) -> Errno { + State::with(|state| { + *fd = state.descriptors_mut().open(Descriptor::Bad)?; + Ok(()) + }) +} + +/// Close a descriptor previously opened using `adapter_open_badfd`. +#[no_mangle] +pub unsafe extern "C" fn adapter_close_badfd(fd: u32) -> Errno { + State::with(|state| state.descriptors_mut().close(fd)) +} + #[no_mangle] pub unsafe extern "C" fn reset_adapter_state() { let state = get_state_ptr(); @@ -261,19 +332,22 @@ pub unsafe extern "C" fn cabi_export_realloc( #[no_mangle] pub unsafe extern "C" fn args_get(mut argv: *mut *mut u8, mut argv_buf: *mut u8) -> Errno { State::with(|state| { - for arg in state.get_args() { - // Copy the argument into `argv_buf` which must be sized - // appropriately by the caller. - ptr::copy_nonoverlapping(arg.ptr, argv_buf, arg.len); - *argv_buf.add(arg.len) = 0; - - // Copy the argument pointer into the `argv` buf - *argv = argv_buf; - - // Update our pointers past what's written to prepare for the - // next argument. - argv = argv.add(1); - argv_buf = argv_buf.add(arg.len + 1); + #[cfg(not(feature = "proxy"))] + { + for arg in state.get_args() { + // Copy the argument into `argv_buf` which must be sized + // appropriately by the caller. + ptr::copy_nonoverlapping(arg.ptr, argv_buf, arg.len); + *argv_buf.add(arg.len) = 0; + + // Copy the argument pointer into the `argv` buf + *argv = argv_buf; + + // Update our pointers past what's written to prepare for the + // next argument. + argv = argv.add(1); + argv_buf = argv_buf.add(arg.len + 1); + } } Ok(()) }) @@ -283,11 +357,19 @@ pub unsafe extern "C" fn args_get(mut argv: *mut *mut u8, mut argv_buf: *mut u8) #[no_mangle] pub unsafe extern "C" fn args_sizes_get(argc: *mut Size, argv_buf_size: *mut Size) -> Errno { State::with(|state| { - let args = state.get_args(); - *argc = args.len(); - // Add one to each length for the terminating nul byte added by - // the `args_get` function. - *argv_buf_size = args.iter().map(|s| s.len + 1).sum(); + #[cfg(feature = "proxy")] + { + *argc = 0; + *argv_buf_size = 0; + } + #[cfg(not(feature = "proxy"))] + { + let args = state.get_args(); + *argc = args.len(); + // Add one to each length for the terminating nul byte added by + // the `args_get` function. + *argv_buf_size = args.iter().map(|s| s.len + 1).sum(); + } Ok(()) }) } @@ -297,23 +379,26 @@ pub unsafe extern "C" fn args_sizes_get(argc: *mut Size, argv_buf_size: *mut Siz #[no_mangle] pub unsafe extern "C" fn environ_get(environ: *mut *mut u8, environ_buf: *mut u8) -> Errno { State::with(|state| { - let mut offsets = environ; - let mut buffer = environ_buf; - for var in state.get_environment() { - ptr::write(offsets, buffer); - offsets = offsets.add(1); + #[cfg(not(feature = "proxy"))] + { + let mut offsets = environ; + let mut buffer = environ_buf; + for var in state.get_environment() { + ptr::write(offsets, buffer); + offsets = offsets.add(1); - ptr::copy_nonoverlapping(var.key.ptr, buffer, var.key.len); - buffer = buffer.add(var.key.len); + ptr::copy_nonoverlapping(var.key.ptr, buffer, var.key.len); + buffer = buffer.add(var.key.len); - ptr::write(buffer, b'='); - buffer = buffer.add(1); + ptr::write(buffer, b'='); + buffer = buffer.add(1); - ptr::copy_nonoverlapping(var.value.ptr, buffer, var.value.len); - buffer = buffer.add(var.value.len); + ptr::copy_nonoverlapping(var.value.ptr, buffer, var.value.len); + buffer = buffer.add(var.value.len); - ptr::write(buffer, 0); - buffer = buffer.add(1); + ptr::write(buffer, 0); + buffer = buffer.add(1); + } } Ok(()) @@ -326,11 +411,23 @@ pub unsafe extern "C" fn environ_sizes_get( environc: *mut Size, environ_buf_size: *mut Size, ) -> Errno { - if matches!( + if !matches!( get_allocation_state(), AllocationState::StackAllocated | AllocationState::StateAllocated ) { - State::with(|state| { + *environc = 0; + *environ_buf_size = 0; + return ERRNO_SUCCESS; + } + + State::with(|state| { + #[cfg(feature = "proxy")] + { + *environc = 0; + *environ_buf_size = 0; + } + #[cfg(not(feature = "proxy"))] + { let vars = state.get_environment(); *environc = vars.len(); *environ_buf_size = { @@ -340,14 +437,10 @@ pub unsafe extern "C" fn environ_sizes_get( } sum }; + } - Ok(()) - }) - } else { - *environc = 0; - *environ_buf_size = 0; - ERRNO_SUCCESS - } + Ok(()) + }) } /// Return the resolution of a clock. @@ -413,34 +506,38 @@ pub unsafe extern "C" fn fd_advise( len: Filesize, advice: Advice, ) -> Errno { - let advice = match advice { - ADVICE_NORMAL => filesystem::Advice::Normal, - ADVICE_SEQUENTIAL => filesystem::Advice::Sequential, - ADVICE_RANDOM => filesystem::Advice::Random, - ADVICE_WILLNEED => filesystem::Advice::WillNeed, - ADVICE_DONTNEED => filesystem::Advice::DontNeed, - ADVICE_NOREUSE => filesystem::Advice::NoReuse, - _ => return ERRNO_INVAL, - }; - State::with(|state| { - let ds = state.descriptors(); - let file = ds.get_seekable_file(fd)?; - file.fd.advise(offset, len, advice)?; - Ok(()) - }) + cfg_filesystem_available! { + let advice = match advice { + ADVICE_NORMAL => filesystem::Advice::Normal, + ADVICE_SEQUENTIAL => filesystem::Advice::Sequential, + ADVICE_RANDOM => filesystem::Advice::Random, + ADVICE_WILLNEED => filesystem::Advice::WillNeed, + ADVICE_DONTNEED => filesystem::Advice::DontNeed, + ADVICE_NOREUSE => filesystem::Advice::NoReuse, + _ => return ERRNO_INVAL, + }; + State::with(|state| { + let ds = state.descriptors(); + let file = ds.get_seekable_file(fd)?; + file.fd.advise(offset, len, advice)?; + Ok(()) + }) + } } /// Force the allocation of space in a file. /// Note: This is similar to `posix_fallocate` in POSIX. #[no_mangle] pub unsafe extern "C" fn fd_allocate(fd: Fd, _offset: Filesize, _len: Filesize) -> Errno { - State::with(|state| { - let ds = state.descriptors(); - // For not-files, fail with BADF - ds.get_file(fd)?; - // For all files, fail with NOTSUP, because this call does not exist in preview 2. - Err(wasi::ERRNO_NOTSUP) - }) + cfg_filesystem_available! { + State::with(|state| { + let ds = state.descriptors(); + // For not-files, fail with BADF + ds.get_file(fd)?; + // For all files, fail with NOTSUP, because this call does not exist in preview 2. + Err(wasi::ERRNO_NOTSUP) + }) + } } /// Close a file descriptor. @@ -448,9 +545,14 @@ pub unsafe extern "C" fn fd_allocate(fd: Fd, _offset: Filesize, _len: Filesize) #[no_mangle] pub unsafe extern "C" fn fd_close(fd: Fd) -> Errno { State::with(|state| { + if let Descriptor::Bad = state.descriptors().get(fd)? { + return Err(wasi::ERRNO_BADF); + } + // If there's a dirent cache entry for this file descriptor then drop // it since the descriptor is being closed and future calls to // `fd_readdir` should return an error. + #[cfg(not(feature = "proxy"))] if fd == state.dirent_cache.for_fd.get() { drop(state.dirent_cache.stream.replace(None)); } @@ -464,138 +566,137 @@ pub unsafe extern "C" fn fd_close(fd: Fd) -> Errno { /// Note: This is similar to `fdatasync` in POSIX. #[no_mangle] pub unsafe extern "C" fn fd_datasync(fd: Fd) -> Errno { - State::with(|state| { - let ds = state.descriptors(); - let file = ds.get_file(fd)?; - file.fd.sync_data()?; - Ok(()) - }) + cfg_filesystem_available! { + State::with(|state| { + let ds = state.descriptors(); + let file = ds.get_file(fd)?; + file.fd.sync_data()?; + Ok(()) + }) + } } /// Get the attributes of a file descriptor. /// Note: This returns similar flags to `fsync(fd, F_GETFL)` in POSIX, as well as additional fields. #[no_mangle] pub unsafe extern "C" fn fd_fdstat_get(fd: Fd, stat: *mut Fdstat) -> Errno { - State::with(|state| { - let ds = state.descriptors(); - match ds.get(fd)? { - Descriptor::Streams(Streams { - type_: StreamType::File(file), - .. - }) => { - let flags = file.fd.get_flags()?; - let type_ = file.fd.get_type()?; - match type_ { - filesystem::DescriptorType::Directory => { - // Hard-coded set of rights expected by many userlands: - let fs_rights_base = wasi::RIGHTS_PATH_CREATE_DIRECTORY - | wasi::RIGHTS_PATH_CREATE_FILE - | wasi::RIGHTS_PATH_LINK_SOURCE - | wasi::RIGHTS_PATH_LINK_TARGET - | wasi::RIGHTS_PATH_OPEN - | wasi::RIGHTS_FD_READDIR - | wasi::RIGHTS_PATH_READLINK - | wasi::RIGHTS_PATH_RENAME_SOURCE - | wasi::RIGHTS_PATH_RENAME_TARGET - | wasi::RIGHTS_PATH_SYMLINK - | wasi::RIGHTS_PATH_REMOVE_DIRECTORY - | wasi::RIGHTS_PATH_UNLINK_FILE - | wasi::RIGHTS_PATH_FILESTAT_GET - | wasi::RIGHTS_PATH_FILESTAT_SET_TIMES - | wasi::RIGHTS_FD_FILESTAT_GET - | wasi::RIGHTS_FD_FILESTAT_SET_TIMES; - - let fs_rights_inheriting = fs_rights_base - | wasi::RIGHTS_FD_DATASYNC - | wasi::RIGHTS_FD_READ - | wasi::RIGHTS_FD_SEEK - | wasi::RIGHTS_FD_FDSTAT_SET_FLAGS - | wasi::RIGHTS_FD_SYNC - | wasi::RIGHTS_FD_TELL - | wasi::RIGHTS_FD_WRITE - | wasi::RIGHTS_FD_ADVISE - | wasi::RIGHTS_FD_ALLOCATE - | wasi::RIGHTS_FD_FILESTAT_GET - | wasi::RIGHTS_FD_FILESTAT_SET_SIZE - | wasi::RIGHTS_FD_FILESTAT_SET_TIMES - | wasi::RIGHTS_POLL_FD_READWRITE; - - stat.write(Fdstat { - fs_filetype: wasi::FILETYPE_DIRECTORY, - fs_flags: 0, - fs_rights_base, - fs_rights_inheriting, - }); - Ok(()) - } - _ => { - let fs_filetype = type_.into(); - - let mut fs_flags = 0; - let mut fs_rights_base = !0; - if !flags.contains(filesystem::DescriptorFlags::READ) { - fs_rights_base &= !RIGHTS_FD_READ; - } - if !flags.contains(filesystem::DescriptorFlags::WRITE) { - fs_rights_base &= !RIGHTS_FD_WRITE; - } - if flags.contains(filesystem::DescriptorFlags::DATA_INTEGRITY_SYNC) { - fs_flags |= FDFLAGS_DSYNC; - } - if flags.contains(filesystem::DescriptorFlags::REQUESTED_WRITE_SYNC) { - fs_flags |= FDFLAGS_RSYNC; - } - if flags.contains(filesystem::DescriptorFlags::FILE_INTEGRITY_SYNC) { - fs_flags |= FDFLAGS_SYNC; - } - if file.append { - fs_flags |= FDFLAGS_APPEND; + cfg_filesystem_available! { + State::with(|state| { + let ds = state.descriptors(); + match ds.get(fd)? { + Descriptor::Streams(Streams { + type_: StreamType::File(file), + .. + }) => { + let flags = file.fd.get_flags()?; + let type_ = file.fd.get_type()?; + match type_ { + filesystem::DescriptorType::Directory => { + // Hard-coded set of rights expected by many userlands: + let fs_rights_base = wasi::RIGHTS_PATH_CREATE_DIRECTORY + | wasi::RIGHTS_PATH_CREATE_FILE + | wasi::RIGHTS_PATH_LINK_SOURCE + | wasi::RIGHTS_PATH_LINK_TARGET + | wasi::RIGHTS_PATH_OPEN + | wasi::RIGHTS_FD_READDIR + | wasi::RIGHTS_PATH_READLINK + | wasi::RIGHTS_PATH_RENAME_SOURCE + | wasi::RIGHTS_PATH_RENAME_TARGET + | wasi::RIGHTS_PATH_SYMLINK + | wasi::RIGHTS_PATH_REMOVE_DIRECTORY + | wasi::RIGHTS_PATH_UNLINK_FILE + | wasi::RIGHTS_PATH_FILESTAT_GET + | wasi::RIGHTS_PATH_FILESTAT_SET_TIMES + | wasi::RIGHTS_FD_FILESTAT_GET + | wasi::RIGHTS_FD_FILESTAT_SET_TIMES; + + let fs_rights_inheriting = fs_rights_base + | wasi::RIGHTS_FD_DATASYNC + | wasi::RIGHTS_FD_READ + | wasi::RIGHTS_FD_SEEK + | wasi::RIGHTS_FD_FDSTAT_SET_FLAGS + | wasi::RIGHTS_FD_SYNC + | wasi::RIGHTS_FD_TELL + | wasi::RIGHTS_FD_WRITE + | wasi::RIGHTS_FD_ADVISE + | wasi::RIGHTS_FD_ALLOCATE + | wasi::RIGHTS_FD_FILESTAT_GET + | wasi::RIGHTS_FD_FILESTAT_SET_SIZE + | wasi::RIGHTS_FD_FILESTAT_SET_TIMES + | wasi::RIGHTS_POLL_FD_READWRITE; + + stat.write(Fdstat { + fs_filetype: wasi::FILETYPE_DIRECTORY, + fs_flags: 0, + fs_rights_base, + fs_rights_inheriting, + }); + Ok(()) } - if matches!(file.blocking_mode, BlockingMode::NonBlocking) { - fs_flags |= FDFLAGS_NONBLOCK; + _ => { + let fs_filetype = type_.into(); + + let mut fs_flags = 0; + let mut fs_rights_base = !0; + if !flags.contains(filesystem::DescriptorFlags::READ) { + fs_rights_base &= !RIGHTS_FD_READ; + } + if !flags.contains(filesystem::DescriptorFlags::WRITE) { + fs_rights_base &= !RIGHTS_FD_WRITE; + } + if flags.contains(filesystem::DescriptorFlags::DATA_INTEGRITY_SYNC) { + fs_flags |= FDFLAGS_DSYNC; + } + if flags.contains(filesystem::DescriptorFlags::REQUESTED_WRITE_SYNC) { + fs_flags |= FDFLAGS_RSYNC; + } + if flags.contains(filesystem::DescriptorFlags::FILE_INTEGRITY_SYNC) { + fs_flags |= FDFLAGS_SYNC; + } + if file.append { + fs_flags |= FDFLAGS_APPEND; + } + if matches!(file.blocking_mode, BlockingMode::NonBlocking) { + fs_flags |= FDFLAGS_NONBLOCK; + } + let fs_rights_inheriting = fs_rights_base; + + stat.write(Fdstat { + fs_filetype, + fs_flags, + fs_rights_base, + fs_rights_inheriting, + }); + Ok(()) } - let fs_rights_inheriting = fs_rights_base; - - stat.write(Fdstat { - fs_filetype, - fs_flags, - fs_rights_base, - fs_rights_inheriting, - }); - Ok(()) } } - } - Descriptor::Streams(Streams { - input, - output, - type_: StreamType::Stdio(isatty), - }) => { - let fs_flags = 0; - let mut fs_rights_base = 0; - if input.get().is_some() { - fs_rights_base |= RIGHTS_FD_READ; - } - if output.get().is_some() { - fs_rights_base |= RIGHTS_FD_WRITE; + Descriptor::Streams(Streams { + input, + output, + type_: StreamType::Stdio(stdio), + }) => { + let fs_flags = 0; + let mut fs_rights_base = 0; + if input.get().is_some() { + fs_rights_base |= RIGHTS_FD_READ; + } + if output.get().is_some() { + fs_rights_base |= RIGHTS_FD_WRITE; + } + let fs_rights_inheriting = fs_rights_base; + stat.write(Fdstat { + fs_filetype: stdio.filetype(), + fs_flags, + fs_rights_base, + fs_rights_inheriting, + }); + Ok(()) } - let fs_rights_inheriting = fs_rights_base; - stat.write(Fdstat { - fs_filetype: isatty.filetype(), - fs_flags, - fs_rights_base, - fs_rights_inheriting, - }); - Ok(()) + Descriptor::Closed(_) | Descriptor::Bad => Err(ERRNO_BADF), } - Descriptor::Closed(_) => Err(ERRNO_BADF), - Descriptor::Streams(Streams { - input: _, - output: _, - type_: StreamType::Socket(_), - }) => unreachable!(), - } - }) + }) + } } /// Adjust the flags associated with a file descriptor. @@ -607,23 +708,25 @@ pub unsafe extern "C" fn fd_fdstat_set_flags(fd: Fd, flags: Fdflags) -> Errno { return wasi::ERRNO_INVAL; } - State::with(|state| { - let mut ds = state.descriptors_mut(); - let file = match ds.get_mut(fd)? { - Descriptor::Streams(Streams { - type_: StreamType::File(file), - .. - }) if !file.is_dir() => file, - _ => Err(wasi::ERRNO_BADF)?, - }; - file.append = flags & FDFLAGS_APPEND == FDFLAGS_APPEND; - file.blocking_mode = if flags & FDFLAGS_NONBLOCK == FDFLAGS_NONBLOCK { - BlockingMode::NonBlocking - } else { - BlockingMode::Blocking - }; - Ok(()) - }) + cfg_filesystem_available! { + State::with(|state| { + let mut ds = state.descriptors_mut(); + let file = match ds.get_mut(fd)? { + Descriptor::Streams(Streams { + type_: StreamType::File(file), + .. + }) if !file.is_dir() => file, + _ => Err(wasi::ERRNO_BADF)?, + }; + file.append = flags & FDFLAGS_APPEND == FDFLAGS_APPEND; + file.blocking_mode = if flags & FDFLAGS_NONBLOCK == FDFLAGS_NONBLOCK { + BlockingMode::NonBlocking + } else { + BlockingMode::Blocking + }; + Ok(()) + }) + } } /// Does not do anything if `fd` corresponds to a valid descriptor and returns [`wasi::ERRNO_BADF`] otherwise. @@ -637,7 +740,7 @@ pub unsafe extern "C" fn fd_fdstat_set_rights( let ds = state.descriptors(); match ds.get(fd)? { Descriptor::Streams(..) => Ok(()), - Descriptor::Closed(..) => Err(wasi::ERRNO_BADF), + Descriptor::Closed(..) | Descriptor::Bad => Err(wasi::ERRNO_BADF), } }) } @@ -645,62 +748,67 @@ pub unsafe extern "C" fn fd_fdstat_set_rights( /// Return the attributes of an open file. #[no_mangle] pub unsafe extern "C" fn fd_filestat_get(fd: Fd, buf: *mut Filestat) -> Errno { - State::with(|state| { - let ds = state.descriptors(); - match ds.get(fd)? { - Descriptor::Streams(Streams { - type_: StreamType::File(file), - .. - }) => { - let stat = file.fd.stat()?; - let metadata_hash = file.fd.metadata_hash()?; - let filetype = stat.type_.into(); - *buf = Filestat { - dev: 1, - ino: metadata_hash.lower, - filetype, - nlink: stat.link_count, - size: stat.size, - atim: datetime_to_timestamp(stat.data_access_timestamp), - mtim: datetime_to_timestamp(stat.data_modification_timestamp), - ctim: datetime_to_timestamp(stat.status_change_timestamp), - }; - Ok(()) - } - // Stdio is all zero fields, except for filetype character device - Descriptor::Streams(Streams { - type_: StreamType::Stdio(isatty), - .. - }) => { - *buf = Filestat { - dev: 0, - ino: 0, - filetype: isatty.filetype(), - nlink: 0, - size: 0, - atim: 0, - mtim: 0, - ctim: 0, - }; - Ok(()) + cfg_filesystem_available! { + State::with(|state| { + let ds = state.descriptors(); + match ds.get(fd)? { + Descriptor::Streams(Streams { + type_: StreamType::File(file), + .. + }) => { + let stat = file.fd.stat()?; + let metadata_hash = file.fd.metadata_hash()?; + let filetype = stat.type_.into(); + *buf = Filestat { + dev: 1, + ino: metadata_hash.lower, + filetype, + nlink: stat.link_count, + size: stat.size, + atim: datetime_to_timestamp(stat.data_access_timestamp), + mtim: datetime_to_timestamp(stat.data_modification_timestamp), + ctim: datetime_to_timestamp(stat.status_change_timestamp), + }; + Ok(()) + } + // Stdio is all zero fields, except for filetype character device + Descriptor::Streams(Streams { + type_: StreamType::Stdio(stdio), + .. + }) => { + *buf = Filestat { + dev: 0, + ino: 0, + filetype: stdio.filetype(), + nlink: 0, + size: 0, + atim: 0, + mtim: 0, + ctim: 0, + }; + Ok(()) + } + _ => Err(wasi::ERRNO_BADF), } - _ => Err(wasi::ERRNO_BADF), - } - }) + }) + } } /// Adjust the size of an open file. If this increases the file's size, the extra bytes are filled with zeros. /// Note: This is similar to `ftruncate` in POSIX. #[no_mangle] pub unsafe extern "C" fn fd_filestat_set_size(fd: Fd, size: Filesize) -> Errno { - State::with(|state| { - let ds = state.descriptors(); - let file = ds.get_file(fd)?; - file.fd.set_size(size)?; - Ok(()) - }) + cfg_filesystem_available! { + State::with(|state| { + let ds = state.descriptors(); + let file = ds.get_file(fd)?; + file.fd.set_size(size)?; + Ok(()) + }) + } } +#[cfg(not(feature = "proxy"))] fn systimespec(set: bool, ts: Timestamp, now: bool) -> Result { if set && now { Err(wasi::ERRNO_INVAL) @@ -725,22 +833,24 @@ pub unsafe extern "C" fn fd_filestat_set_times( mtim: Timestamp, fst_flags: Fstflags, ) -> Errno { - State::with(|state| { - let atim = systimespec( - fst_flags & FSTFLAGS_ATIM == FSTFLAGS_ATIM, - atim, - fst_flags & FSTFLAGS_ATIM_NOW == FSTFLAGS_ATIM_NOW, - )?; - let mtim = systimespec( - fst_flags & FSTFLAGS_MTIM == FSTFLAGS_MTIM, - mtim, - fst_flags & FSTFLAGS_MTIM_NOW == FSTFLAGS_MTIM_NOW, - )?; - let ds = state.descriptors(); - let file = ds.get_file(fd)?; - file.fd.set_times(atim, mtim)?; - Ok(()) - }) + cfg_filesystem_available! { + State::with(|state| { + let atim = systimespec( + fst_flags & FSTFLAGS_ATIM == FSTFLAGS_ATIM, + atim, + fst_flags & FSTFLAGS_ATIM_NOW == FSTFLAGS_ATIM_NOW, + )?; + let mtim = systimespec( + fst_flags & FSTFLAGS_MTIM == FSTFLAGS_MTIM, + mtim, + fst_flags & FSTFLAGS_MTIM_NOW == FSTFLAGS_MTIM_NOW, + )?; + let ds = state.descriptors(); + let file = ds.get_file(fd)?; + file.fd.set_times(atim, mtim)?; + Ok(()) + }) + } } /// Read from a file descriptor, without using and updating the file descriptor's offset. @@ -753,46 +863,59 @@ pub unsafe extern "C" fn fd_pread( offset: Filesize, nread: *mut Size, ) -> Errno { - // Advance to the first non-empty buffer. - while iovs_len != 0 && (*iovs_ptr).buf_len == 0 { - iovs_ptr = iovs_ptr.add(1); - iovs_len -= 1; - } - if iovs_len == 0 { - *nread = 0; - return ERRNO_SUCCESS; - } + cfg_filesystem_available! { + // Advance to the first non-empty buffer. + while iovs_len != 0 && (*iovs_ptr).buf_len == 0 { + iovs_ptr = iovs_ptr.add(1); + iovs_len -= 1; + } + if iovs_len == 0 { + *nread = 0; + return ERRNO_SUCCESS; + } - State::with(|state| { - let ptr = (*iovs_ptr).buf; - let len = (*iovs_ptr).buf_len; + State::with(|state| { + let ptr = (*iovs_ptr).buf; + let len = (*iovs_ptr).buf_len; - let ds = state.descriptors(); - let file = ds.get_file(fd)?; - let (data, end) = state - .import_alloc - .with_buffer(ptr, len, || file.fd.read(len as u64, offset))?; - assert_eq!(data.as_ptr(), ptr); - assert!(data.len() <= len); - - let len = data.len(); - forget(data); - if !end && len == 0 { - Err(ERRNO_INTR) - } else { - *nread = len; - Ok(()) - } - }) + let ds = state.descriptors(); + let file = ds.get_file(fd)?; + let (data, end) = state + .import_alloc + .with_buffer(ptr, len, || file.fd.read(len as u64, offset))?; + assert_eq!(data.as_ptr(), ptr); + assert!(data.len() <= len); + + let len = data.len(); + forget(data); + if !end && len == 0 { + Err(ERRNO_INTR) + } else { + *nread = len; + Ok(()) + } + }) + } } /// Return a description of the given preopened file descriptor. #[no_mangle] pub unsafe extern "C" fn fd_prestat_get(fd: Fd, buf: *mut Prestat) -> Errno { - if matches!( + if !matches!( get_allocation_state(), AllocationState::StackAllocated | AllocationState::StateAllocated ) { + return ERRNO_BADF; + } + + // For the proxy adapter don't return `ERRNO_NOTSUP` through below, instead + // always return `ERRNO_BADF` which is the indicator that prestats aren't + // available. + if cfg!(feature = "proxy") { + return ERRNO_BADF; + } + + cfg_filesystem_available! { State::with(|state| { let ds = state.descriptors(); if let Some(preopen) = ds.get_preopen(fd) { @@ -810,27 +933,27 @@ pub unsafe extern "C" fn fd_prestat_get(fd: Fd, buf: *mut Prestat) -> Errno { Err(ERRNO_BADF) } }) - } else { - ERRNO_BADF } } /// Return a description of the given preopened file descriptor. #[no_mangle] pub unsafe extern "C" fn fd_prestat_dir_name(fd: Fd, path: *mut u8, path_max_len: Size) -> Errno { - State::with(|state| { - let ds = state.descriptors(); - if let Some(preopen) = ds.get_preopen(fd) { - if preopen.path.len > path_max_len as usize { - Err(ERRNO_NAMETOOLONG) + cfg_filesystem_available! { + State::with(|state| { + let ds = state.descriptors(); + if let Some(preopen) = ds.get_preopen(fd) { + if preopen.path.len > path_max_len { + Err(ERRNO_NAMETOOLONG) + } else { + ptr::copy_nonoverlapping(preopen.path.ptr, path, preopen.path.len); + Ok(()) + } } else { - ptr::copy_nonoverlapping(preopen.path.ptr, path, preopen.path.len); - Ok(()) + Err(ERRNO_NOTDIR) } - } else { - Err(ERRNO_NOTDIR) - } - }) + }) + } } /// Write to a file descriptor, without using and updating the file descriptor's offset. @@ -843,26 +966,28 @@ pub unsafe extern "C" fn fd_pwrite( offset: Filesize, nwritten: *mut Size, ) -> Errno { - // Advance to the first non-empty buffer. - while iovs_len != 0 && (*iovs_ptr).buf_len == 0 { - iovs_ptr = iovs_ptr.add(1); - iovs_len -= 1; - } - if iovs_len == 0 { - *nwritten = 0; - return ERRNO_SUCCESS; - } + cfg_filesystem_available! { + // Advance to the first non-empty buffer. + while iovs_len != 0 && (*iovs_ptr).buf_len == 0 { + iovs_ptr = iovs_ptr.add(1); + iovs_len -= 1; + } + if iovs_len == 0 { + *nwritten = 0; + return ERRNO_SUCCESS; + } - let ptr = (*iovs_ptr).buf; - let len = (*iovs_ptr).buf_len; + let ptr = (*iovs_ptr).buf; + let len = (*iovs_ptr).buf_len; - State::with(|state| { - let ds = state.descriptors(); - let file = ds.get_seekable_file(fd)?; - let bytes = file.fd.write(slice::from_raw_parts(ptr, len), offset)?; - *nwritten = bytes as usize; - Ok(()) - }) + State::with(|state| { + let ds = state.descriptors(); + let file = ds.get_seekable_file(fd)?; + let bytes = file.fd.write(slice::from_raw_parts(ptr, len), offset)?; + *nwritten = bytes as usize; + Ok(()) + }) + } } /// Read from a file descriptor. @@ -891,11 +1016,14 @@ pub unsafe extern "C" fn fd_read( let ds = state.descriptors(); match ds.get(fd)? { Descriptor::Streams(streams) => { + #[cfg(not(feature = "proxy"))] let blocking_mode = if let StreamType::File(file) = &streams.type_ { file.blocking_mode } else { BlockingMode::Blocking }; + #[cfg(feature = "proxy")] + let blocking_mode = BlockingMode::Blocking; let read_len = u64::try_from(len).trapping_unwrap(); let wasi_stream = streams.get_read_stream()?; @@ -917,6 +1045,7 @@ pub unsafe extern "C" fn fd_read( assert!(data.len() <= len); // If this is a file, keep the current-position pointer up to date. + #[cfg(not(feature = "proxy"))] if let StreamType::File(file) = &streams.type_ { file.position .set(file.position.get() + data.len() as filesystem::Filesize); @@ -930,12 +1059,15 @@ pub unsafe extern "C" fn fd_read( forget(data); Ok(()) } - Descriptor::Closed(_) => Err(ERRNO_BADF), + Descriptor::Closed(_) | Descriptor::Bad => Err(ERRNO_BADF), } }) } fn stream_error_to_errno(err: streams::Error) -> Errno { + #[cfg(feature = "proxy")] + return ERRNO_IO; + #[cfg(not(feature = "proxy"))] match filesystem::filesystem_error_code(&err) { Some(code) => code.into(), None => ERRNO_IO, @@ -952,6 +1084,19 @@ fn stream_error_to_errno(err: streams::Error) -> Errno { /// read buffer size in case it's too small to fit a single large directory /// entry, or skip the oversized directory entry. #[no_mangle] +#[cfg(feature = "proxy")] +pub unsafe extern "C" fn fd_readdir( + fd: Fd, + buf: *mut u8, + buf_len: Size, + cookie: Dircookie, + bufused: *mut Size, +) -> Errno { + wasi::ERRNO_NOTSUP +} + +#[no_mangle] +#[cfg(not(feature = "proxy"))] pub unsafe extern "C" fn fd_readdir( fd: Fd, buf: *mut u8, @@ -1200,62 +1345,68 @@ pub unsafe extern "C" fn fd_seek( whence: Whence, newoffset: *mut Filesize, ) -> Errno { - State::with(|state| { - let mut ds = state.descriptors_mut(); - let stream = ds.get_seekable_stream_mut(fd)?; - - // Seeking only works on files. - if let StreamType::File(file) = &mut stream.type_ { - if let filesystem::DescriptorType::Directory = file.descriptor_type { - // This isn't really the "right" errno, but it is consistient with wasmtime's - // preview 1 tests. - return Err(ERRNO_BADF); - } - let from = match whence { - WHENCE_SET if offset >= 0 => offset, - WHENCE_CUR => match (file.position.get() as i64).checked_add(offset) { - Some(pos) if pos >= 0 => pos, - _ => return Err(ERRNO_INVAL), - }, - WHENCE_END => match (file.fd.stat()?.size as i64).checked_add(offset) { - Some(pos) if pos >= 0 => pos, + cfg_filesystem_available! { + State::with(|state| { + let mut ds = state.descriptors_mut(); + let stream = ds.get_seekable_stream_mut(fd)?; + + // Seeking only works on files. + if let StreamType::File(file) = &mut stream.type_ { + if let filesystem::DescriptorType::Directory = file.descriptor_type { + // This isn't really the "right" errno, but it is consistient with wasmtime's + // preview 1 tests. + return Err(ERRNO_BADF); + } + let from = match whence { + WHENCE_SET if offset >= 0 => offset, + WHENCE_CUR => match (file.position.get() as i64).checked_add(offset) { + Some(pos) if pos >= 0 => pos, + _ => return Err(ERRNO_INVAL), + }, + WHENCE_END => match (file.fd.stat()?.size as i64).checked_add(offset) { + Some(pos) if pos >= 0 => pos, + _ => return Err(ERRNO_INVAL), + }, _ => return Err(ERRNO_INVAL), - }, - _ => return Err(ERRNO_INVAL), - }; - drop(stream.input.take()); - drop(stream.output.take()); - file.position.set(from as filesystem::Filesize); - *newoffset = from as filesystem::Filesize; - Ok(()) - } else { - Err(ERRNO_SPIPE) - } - }) + }; + drop(stream.input.take()); + drop(stream.output.take()); + file.position.set(from as filesystem::Filesize); + *newoffset = from as filesystem::Filesize; + Ok(()) + } else { + Err(ERRNO_SPIPE) + } + }) + } } /// Synchronize the data and metadata of a file to disk. /// Note: This is similar to `fsync` in POSIX. #[no_mangle] pub unsafe extern "C" fn fd_sync(fd: Fd) -> Errno { - State::with(|state| { - let ds = state.descriptors(); - let file = ds.get_file(fd)?; - file.fd.sync()?; - Ok(()) - }) + cfg_filesystem_available! { + State::with(|state| { + let ds = state.descriptors(); + let file = ds.get_file(fd)?; + file.fd.sync()?; + Ok(()) + }) + } } /// Return the current offset of a file descriptor. /// Note: This is similar to `lseek(fd, 0, SEEK_CUR)` in POSIX. #[no_mangle] pub unsafe extern "C" fn fd_tell(fd: Fd, offset: *mut Filesize) -> Errno { - State::with(|state| { - let ds = state.descriptors(); - let file = ds.get_seekable_file(fd)?; - *offset = file.position.get() as Filesize; - Ok(()) - }) + cfg_filesystem_available! { + State::with(|state| { + let ds = state.descriptors(); + let file = ds.get_seekable_file(fd)?; + *offset = file.position.get(); + Ok(()) + }) + } } /// Write to a file descriptor. @@ -1267,58 +1418,68 @@ pub unsafe extern "C" fn fd_write( mut iovs_len: usize, nwritten: *mut Size, ) -> Errno { - if matches!( + if !matches!( get_allocation_state(), AllocationState::StackAllocated | AllocationState::StateAllocated ) { - // Advance to the first non-empty buffer. - while iovs_len != 0 && (*iovs_ptr).buf_len == 0 { - iovs_ptr = iovs_ptr.add(1); - iovs_len -= 1; - } - if iovs_len == 0 { - *nwritten = 0; - return ERRNO_SUCCESS; - } + *nwritten = 0; + return ERRNO_IO; + } - let ptr = (*iovs_ptr).buf; - let len = (*iovs_ptr).buf_len; - let bytes = slice::from_raw_parts(ptr, len); + // Advance to the first non-empty buffer. + while iovs_len != 0 && (*iovs_ptr).buf_len == 0 { + iovs_ptr = iovs_ptr.add(1); + iovs_len -= 1; + } + if iovs_len == 0 { + *nwritten = 0; + return ERRNO_SUCCESS; + } - State::with(|state| { - let ds = state.descriptors(); - match ds.get(fd)? { - Descriptor::Streams(streams) => { - let wasi_stream = streams.get_write_stream()?; + let ptr = (*iovs_ptr).buf; + let len = (*iovs_ptr).buf_len; + let bytes = slice::from_raw_parts(ptr, len); - let nbytes = if let StreamType::File(file) = &streams.type_ { - file.blocking_mode.write(wasi_stream, bytes)? - } else { - // Use blocking writes on non-file streams (stdout, stderr, as sockets - // aren't currently used). - BlockingMode::Blocking.write(wasi_stream, bytes)? - }; + State::with(|state| { + let ds = state.descriptors(); + match ds.get(fd)? { + Descriptor::Streams(streams) => { + let wasi_stream = streams.get_write_stream()?; - // If this is a file, keep the current-position pointer up to date. - if let StreamType::File(file) = &streams.type_ { - // But don't update if we're in append mode. Strictly speaking, - // we should set the position to the new end of the file, but - // we don't have an API to do that atomically. - if !file.append { - file.position.set(file.position.get() + nbytes as u64); - } + #[cfg(not(feature = "proxy"))] + let nbytes = if let StreamType::File(file) = &streams.type_ { + file.blocking_mode.write(wasi_stream, bytes)? + } else { + // Use blocking writes on non-file streams (stdout, stderr, as sockets + // aren't currently used). + BlockingMode::Blocking.write(wasi_stream, bytes)? + }; + #[cfg(feature = "proxy")] + let nbytes = BlockingMode::Blocking.write(wasi_stream, bytes)?; + + // If this is a file, keep the current-position pointer up + // to date. Note that for files that perform appending + // writes this function will always update the current + // position to the end of the file. + // + // NB: this isn't "atomic" as it doesn't necessarily account + // for concurrent writes, but there's not much that can be + // done about that. + #[cfg(not(feature = "proxy"))] + if let StreamType::File(file) = &streams.type_ { + if file.append { + file.position.set(file.fd.stat()?.size); + } else { + file.position.set(file.position.get() + nbytes as u64); } - - *nwritten = nbytes; - Ok(()) } - Descriptor::Closed(_) => Err(ERRNO_BADF), + + *nwritten = nbytes; + Ok(()) } - }) - } else { - *nwritten = 0; - ERRNO_IO - } + Descriptor::Closed(_) | Descriptor::Bad => Err(ERRNO_BADF), + } + }) } /// Create a directory. @@ -1329,14 +1490,16 @@ pub unsafe extern "C" fn path_create_directory( path_ptr: *const u8, path_len: usize, ) -> Errno { - let path = slice::from_raw_parts(path_ptr, path_len); + cfg_filesystem_available! { + let path = slice::from_raw_parts(path_ptr, path_len); - State::with(|state| { - let ds = state.descriptors(); - let file = ds.get_dir(fd)?; - file.fd.create_directory_at(path)?; - Ok(()) - }) + State::with(|state| { + let ds = state.descriptors(); + let file = ds.get_dir(fd)?; + file.fd.create_directory_at(path)?; + Ok(()) + }) + } } /// Return the attributes of a file or directory. @@ -1349,27 +1512,29 @@ pub unsafe extern "C" fn path_filestat_get( path_len: usize, buf: *mut Filestat, ) -> Errno { - let path = slice::from_raw_parts(path_ptr, path_len); - let at_flags = at_flags_from_lookupflags(flags); + cfg_filesystem_available! { + let path = slice::from_raw_parts(path_ptr, path_len); + let at_flags = at_flags_from_lookupflags(flags); - State::with(|state| { - let ds = state.descriptors(); - let file = ds.get_dir(fd)?; - let stat = file.fd.stat_at(at_flags, path)?; - let metadata_hash = file.fd.metadata_hash_at(at_flags, path)?; - let filetype = stat.type_.into(); - *buf = Filestat { - dev: 1, - ino: metadata_hash.lower, - filetype, - nlink: stat.link_count, - size: stat.size, - atim: datetime_to_timestamp(stat.data_access_timestamp), - mtim: datetime_to_timestamp(stat.data_modification_timestamp), - ctim: datetime_to_timestamp(stat.status_change_timestamp), - }; - Ok(()) - }) + State::with(|state| { + let ds = state.descriptors(); + let file = ds.get_dir(fd)?; + let stat = file.fd.stat_at(at_flags, path)?; + let metadata_hash = file.fd.metadata_hash_at(at_flags, path)?; + let filetype = stat.type_.into(); + *buf = Filestat { + dev: 1, + ino: metadata_hash.lower, + filetype, + nlink: stat.link_count, + size: stat.size, + atim: datetime_to_timestamp(stat.data_access_timestamp), + mtim: datetime_to_timestamp(stat.data_modification_timestamp), + ctim: datetime_to_timestamp(stat.status_change_timestamp), + }; + Ok(()) + }) + } } /// Adjust the timestamps of a file or directory. @@ -1384,26 +1549,28 @@ pub unsafe extern "C" fn path_filestat_set_times( mtim: Timestamp, fst_flags: Fstflags, ) -> Errno { - let path = slice::from_raw_parts(path_ptr, path_len); - let at_flags = at_flags_from_lookupflags(flags); + cfg_filesystem_available! { + let path = slice::from_raw_parts(path_ptr, path_len); + let at_flags = at_flags_from_lookupflags(flags); - State::with(|state| { - let atim = systimespec( - fst_flags & FSTFLAGS_ATIM == FSTFLAGS_ATIM, - atim, - fst_flags & FSTFLAGS_ATIM_NOW == FSTFLAGS_ATIM_NOW, - )?; - let mtim = systimespec( - fst_flags & FSTFLAGS_MTIM == FSTFLAGS_MTIM, - mtim, - fst_flags & FSTFLAGS_MTIM_NOW == FSTFLAGS_MTIM_NOW, - )?; + State::with(|state| { + let atim = systimespec( + fst_flags & FSTFLAGS_ATIM == FSTFLAGS_ATIM, + atim, + fst_flags & FSTFLAGS_ATIM_NOW == FSTFLAGS_ATIM_NOW, + )?; + let mtim = systimespec( + fst_flags & FSTFLAGS_MTIM == FSTFLAGS_MTIM, + mtim, + fst_flags & FSTFLAGS_MTIM_NOW == FSTFLAGS_MTIM_NOW, + )?; - let ds = state.descriptors(); - let file = ds.get_dir(fd)?; - file.fd.set_times_at(at_flags, path, atim, mtim)?; - Ok(()) - }) + let ds = state.descriptors(); + let file = ds.get_dir(fd)?; + file.fd.set_times_at(at_flags, path, atim, mtim)?; + Ok(()) + }) + } } /// Create a hard link. @@ -1418,17 +1585,19 @@ pub unsafe extern "C" fn path_link( new_path_ptr: *const u8, new_path_len: usize, ) -> Errno { - let old_path = slice::from_raw_parts(old_path_ptr, old_path_len); - let new_path = slice::from_raw_parts(new_path_ptr, new_path_len); - let at_flags = at_flags_from_lookupflags(old_flags); + cfg_filesystem_available! { + let old_path = slice::from_raw_parts(old_path_ptr, old_path_len); + let new_path = slice::from_raw_parts(new_path_ptr, new_path_len); + let at_flags = at_flags_from_lookupflags(old_flags); - State::with(|state| { - let ds = state.descriptors(); - let old = &ds.get_dir(old_fd)?.fd; - let new = &ds.get_dir(new_fd)?.fd; - old.link_at(at_flags, old_path, new, new_path)?; - Ok(()) - }) + State::with(|state| { + let ds = state.descriptors(); + let old = &ds.get_dir(old_fd)?.fd; + let new = &ds.get_dir(new_fd)?.fd; + old.link_at(at_flags, old_path, new, new_path)?; + Ok(()) + }) + } } /// Open a file or directory. @@ -1450,41 +1619,47 @@ pub unsafe extern "C" fn path_open( fdflags: Fdflags, opened_fd: *mut Fd, ) -> Errno { - let _ = fs_rights_inheriting; + cfg_filesystem_available! { + let _ = fs_rights_inheriting; - let path = slice::from_raw_parts(path_ptr, path_len); - let at_flags = at_flags_from_lookupflags(dirflags); - let o_flags = o_flags_from_oflags(oflags); - let flags = descriptor_flags_from_flags(fs_rights_base, fdflags); - let append = fdflags & wasi::FDFLAGS_APPEND == wasi::FDFLAGS_APPEND; + let path = slice::from_raw_parts(path_ptr, path_len); + let at_flags = at_flags_from_lookupflags(dirflags); + let o_flags = o_flags_from_oflags(oflags); + let flags = descriptor_flags_from_flags(fs_rights_base, fdflags); + let append = fdflags & wasi::FDFLAGS_APPEND == wasi::FDFLAGS_APPEND; - State::with(|state| { - let result = state - .descriptors() - .get_dir(fd)? - .fd - .open_at(at_flags, path, o_flags, flags)?; - let descriptor_type = result.get_type()?; - let desc = Descriptor::Streams(Streams { - input: OnceCell::new(), - output: OnceCell::new(), - type_: StreamType::File(File { - fd: result, - descriptor_type, - position: Cell::new(0), - append, - blocking_mode: if fdflags & wasi::FDFLAGS_NONBLOCK == 0 { - BlockingMode::Blocking - } else { - BlockingMode::NonBlocking - }, - }), - }); + #[cfg(feature = "proxy")] + return wasi::ERRNO_NOTSUP; - let fd = state.descriptors_mut().open(desc)?; - *opened_fd = fd; - Ok(()) - }) + #[cfg(not(feature = "proxy"))] + State::with(|state| { + let result = state + .descriptors() + .get_dir(fd)? + .fd + .open_at(at_flags, path, o_flags, flags)?; + let descriptor_type = result.get_type()?; + let desc = Descriptor::Streams(Streams { + input: OnceCell::new(), + output: OnceCell::new(), + type_: StreamType::File(File { + fd: result, + descriptor_type, + position: Cell::new(0), + append, + blocking_mode: if fdflags & wasi::FDFLAGS_NONBLOCK == 0 { + BlockingMode::Blocking + } else { + BlockingMode::NonBlocking + }, + }), + }); + + let fd = state.descriptors_mut().open(desc)?; + *opened_fd = fd; + Ok(()) + }) + } } /// Read the contents of a symbolic link. @@ -1498,44 +1673,46 @@ pub unsafe extern "C" fn path_readlink( buf_len: Size, bufused: *mut Size, ) -> Errno { - let path = slice::from_raw_parts(path_ptr, path_len); + cfg_filesystem_available! { + let path = slice::from_raw_parts(path_ptr, path_len); - State::with(|state| { - // If the user gave us a buffer shorter than `PATH_MAX`, it may not be - // long enough to accept the actual path. `cabi_realloc` can't fail, - // so instead we handle this case specially. - let use_state_buf = buf_len < PATH_MAX; + State::with(|state| { + // If the user gave us a buffer shorter than `PATH_MAX`, it may not be + // long enough to accept the actual path. `cabi_realloc` can't fail, + // so instead we handle this case specially. + let use_state_buf = buf_len < PATH_MAX; - let ds = state.descriptors(); - let file = ds.get_dir(fd)?; - let path = if use_state_buf { - state - .import_alloc - .with_buffer(state.path_buf.get().cast(), PATH_MAX, || { - file.fd.readlink_at(path) - })? - } else { - state - .import_alloc - .with_buffer(buf, buf_len, || file.fd.readlink_at(path))? - }; + let ds = state.descriptors(); + let file = ds.get_dir(fd)?; + let path = if use_state_buf { + state + .import_alloc + .with_buffer(state.path_buf.get().cast(), PATH_MAX, || { + file.fd.readlink_at(path) + })? + } else { + state + .import_alloc + .with_buffer(buf, buf_len, || file.fd.readlink_at(path))? + }; - if use_state_buf { - // Preview1 follows POSIX in truncating the returned path if it - // doesn't fit. - let len = min(path.len(), buf_len); - ptr::copy_nonoverlapping(path.as_ptr().cast(), buf, len); - *bufused = len; - } else { - *bufused = path.len(); - } + if use_state_buf { + // Preview1 follows POSIX in truncating the returned path if it + // doesn't fit. + let len = min(path.len(), buf_len); + ptr::copy_nonoverlapping(path.as_ptr().cast(), buf, len); + *bufused = len; + } else { + *bufused = path.len(); + } - // The returned string's memory was allocated in `buf`, so don't separately - // free it. - forget(path); + // The returned string's memory was allocated in `buf`, so don't separately + // free it. + forget(path); - Ok(()) - }) + Ok(()) + }) + } } /// Remove a directory. @@ -1547,14 +1724,16 @@ pub unsafe extern "C" fn path_remove_directory( path_ptr: *const u8, path_len: usize, ) -> Errno { - let path = slice::from_raw_parts(path_ptr, path_len); + cfg_filesystem_available! { + let path = slice::from_raw_parts(path_ptr, path_len); - State::with(|state| { - let ds = state.descriptors(); - let file = ds.get_dir(fd)?; - file.fd.remove_directory_at(path)?; - Ok(()) - }) + State::with(|state| { + let ds = state.descriptors(); + let file = ds.get_dir(fd)?; + file.fd.remove_directory_at(path)?; + Ok(()) + }) + } } /// Rename a file or directory. @@ -1568,16 +1747,18 @@ pub unsafe extern "C" fn path_rename( new_path_ptr: *const u8, new_path_len: usize, ) -> Errno { - let old_path = slice::from_raw_parts(old_path_ptr, old_path_len); - let new_path = slice::from_raw_parts(new_path_ptr, new_path_len); + cfg_filesystem_available! { + let old_path = slice::from_raw_parts(old_path_ptr, old_path_len); + let new_path = slice::from_raw_parts(new_path_ptr, new_path_len); - State::with(|state| { - let ds = state.descriptors(); - let old = &ds.get_dir(old_fd)?.fd; - let new = &ds.get_dir(new_fd)?.fd; - old.rename_at(old_path, new, new_path)?; - Ok(()) - }) + State::with(|state| { + let ds = state.descriptors(); + let old = &ds.get_dir(old_fd)?.fd; + let new = &ds.get_dir(new_fd)?.fd; + old.rename_at(old_path, new, new_path)?; + Ok(()) + }) + } } /// Create a symbolic link. @@ -1590,15 +1771,17 @@ pub unsafe extern "C" fn path_symlink( new_path_ptr: *const u8, new_path_len: usize, ) -> Errno { - let old_path = slice::from_raw_parts(old_path_ptr, old_path_len); - let new_path = slice::from_raw_parts(new_path_ptr, new_path_len); + cfg_filesystem_available! { + let old_path = slice::from_raw_parts(old_path_ptr, old_path_len); + let new_path = slice::from_raw_parts(new_path_ptr, new_path_len); - State::with(|state| { - let ds = state.descriptors(); - let file = ds.get_dir(fd)?; - file.fd.symlink_at(old_path, new_path)?; - Ok(()) - }) + State::with(|state| { + let ds = state.descriptors(); + let file = ds.get_dir(fd)?; + file.fd.symlink_at(old_path, new_path)?; + Ok(()) + }) + } } /// Unlink a file. @@ -1606,14 +1789,16 @@ pub unsafe extern "C" fn path_symlink( /// Note: This is similar to `unlinkat(fd, path, 0)` in POSIX. #[no_mangle] pub unsafe extern "C" fn path_unlink_file(fd: Fd, path_ptr: *const u8, path_len: usize) -> Errno { - let path = slice::from_raw_parts(path_ptr, path_len); + cfg_filesystem_available! { + let path = slice::from_raw_parts(path_ptr, path_len); - State::with(|state| { - let ds = state.descriptors(); - let file = ds.get_dir(fd)?; - file.fd.unlink_file_at(path)?; - Ok(()) - }) + State::with(|state| { + let ds = state.descriptors(); + let file = ds.get_dir(fd)?; + file.fd.unlink_file_at(path)?; + Ok(()) + }) + } } struct Pollables { @@ -1645,26 +1830,6 @@ impl Drop for Pollables { } } -impl From for Errno { - fn from(error: network::ErrorCode) -> Errno { - match error { - network::ErrorCode::Unknown => unreachable!(), // TODO - /* TODO - // Use a black box to prevent the optimizer from generating a - // lookup table, which would require a static initializer. - ConnectionAborted => black_box(ERRNO_CONNABORTED), - ConnectionRefused => ERRNO_CONNREFUSED, - ConnectionReset => ERRNO_CONNRESET, - HostUnreachable => ERRNO_HOSTUNREACH, - NetworkDown => ERRNO_NETDOWN, - NetworkUnreachable => ERRNO_NETUNREACH, - Timedout => ERRNO_TIMEDOUT, - */ - _ => unreachable!(), - } - } -} - /// Concurrently poll for the occurrence of a set of events. #[no_mangle] pub unsafe extern "C" fn poll_oneoff( @@ -1784,7 +1949,7 @@ pub unsafe extern "C" fn poll_oneoff( }); } - #[link(wasm_import_module = "wasi:io/poll@0.2.0-rc-2023-11-10")] + #[link(wasm_import_module = "wasi:io/poll@0.2.0")] #[allow(improper_ctypes)] // FIXME(bytecodealliance/wit-bindgen#684) extern "C" { #[link_name = "poll"] @@ -1837,6 +2002,7 @@ pub unsafe extern "C" fn poll_oneoff( .trapping_unwrap(); match desc { Descriptor::Streams(streams) => match &streams.type_ { + #[cfg(not(feature = "proxy"))] StreamType::File(file) => match file.fd.stat() { Ok(stat) => { let nbytes = stat.size.saturating_sub(file.position.get()); @@ -1852,25 +2018,6 @@ pub unsafe extern "C" fn poll_oneoff( } Err(e) => (e.into(), 1, 0), }, - StreamType::Socket(_connection) => { - unreachable!() // TODO - /* - match tcp::bytes_readable(*connection) { - Ok(result) => ( - ERRNO_SUCCESS, - result.0, - if result.1 { - EVENTRWFLAGS_FD_READWRITE_HANGUP - } else { - 0 - } - ) - Err(e) => { - (e.into(), 1, 0) - } - } - */ - } StreamType::Stdio(_) => (ERRNO_SUCCESS, 1, 0), }, _ => unreachable!(), @@ -1884,26 +2031,9 @@ pub unsafe extern "C" fn poll_oneoff( .trapping_unwrap(); match desc { Descriptor::Streams(streams) => match &streams.type_ { - StreamType::File(_) | StreamType::Stdio(_) => (ERRNO_SUCCESS, 1, 0), - StreamType::Socket(_connection) => { - unreachable!() // TODO - /* - match tcp::bytes_writable(connection) { - Ok(result) => ( - ERRNO_SUCCESS, - result.0, - if result.1 { - EVENTRWFLAGS_FD_READWRITE_HANGUP - } else { - 0 - } - ) - Err(e) => { - (e.into(), 0, 0) - } - } - */ - } + #[cfg(not(feature = "proxy"))] + StreamType::File(_) => (ERRNO_SUCCESS, 1, 0), + StreamType::Stdio(_) => (ERRNO_SUCCESS, 1, 0), }, _ => unreachable!(), } @@ -1933,9 +2063,16 @@ pub unsafe extern "C" fn poll_oneoff( /// the environment. #[no_mangle] pub unsafe extern "C" fn proc_exit(rval: Exitcode) -> ! { - let status = if rval == 0 { Ok(()) } else { Err(()) }; - exit::exit(status); // does not return - unreachable!("host exit implementation didn't exit!") // actually unreachable + #[cfg(feature = "proxy")] + { + unreachable!("no other implementation available in proxy world"); + } + #[cfg(not(feature = "proxy"))] + { + let status = if rval == 0 { Ok(()) } else { Err(()) }; + crate::bindings::wasi::cli::exit::exit(status); // does not return + unreachable!("host exit implementation didn't exit!") // actually unreachable + } } /// Send a signal to the process of the calling thread. @@ -2027,6 +2164,7 @@ pub unsafe extern "C" fn sock_shutdown(_fd: Fd, _how: Sdflags) -> Errno { unreachable!() } +#[cfg(not(feature = "proxy"))] fn datetime_to_timestamp(datetime: Option) -> Timestamp { match datetime { Some(datetime) => u64::from(datetime.nanoseconds) @@ -2035,6 +2173,7 @@ fn datetime_to_timestamp(datetime: Option) -> Timestamp { } } +#[cfg(not(feature = "proxy"))] fn at_flags_from_lookupflags(flags: Lookupflags) -> filesystem::PathFlags { if flags & LOOKUPFLAGS_SYMLINK_FOLLOW == LOOKUPFLAGS_SYMLINK_FOLLOW { filesystem::PathFlags::SYMLINK_FOLLOW @@ -2043,6 +2182,7 @@ fn at_flags_from_lookupflags(flags: Lookupflags) -> filesystem::PathFlags { } } +#[cfg(not(feature = "proxy"))] fn o_flags_from_oflags(flags: Oflags) -> filesystem::OpenFlags { let mut o_flags = filesystem::OpenFlags::empty(); if flags & OFLAGS_CREAT == OFLAGS_CREAT { @@ -2060,6 +2200,7 @@ fn o_flags_from_oflags(flags: Oflags) -> filesystem::OpenFlags { o_flags } +#[cfg(not(feature = "proxy"))] fn descriptor_flags_from_flags(rights: Rights, fdflags: Fdflags) -> filesystem::DescriptorFlags { let mut flags = filesystem::DescriptorFlags::empty(); if rights & wasi::RIGHTS_FD_READ == wasi::RIGHTS_FD_READ { @@ -2080,6 +2221,7 @@ fn descriptor_flags_from_flags(rights: Rights, fdflags: Fdflags) -> filesystem:: flags } +#[cfg(not(feature = "proxy"))] impl From for Errno { #[inline(never)] // Disable inlining as this is bulky and relatively cold. fn from(err: filesystem::ErrorCode) -> Errno { @@ -2127,6 +2269,7 @@ impl From for Errno { } } +#[cfg(not(feature = "proxy"))] impl From for wasi::Filetype { fn from(ty: filesystem::DescriptorType) -> wasi::Filetype { match ty { @@ -2225,6 +2368,7 @@ impl BlockingMode { } #[repr(C)] +#[cfg(not(feature = "proxy"))] pub struct File { /// The handle to the preview2 descriptor that this file is referencing. fd: filesystem::Descriptor, @@ -2244,6 +2388,7 @@ pub struct File { blocking_mode: BlockingMode, } +#[cfg(not(feature = "proxy"))] impl File { fn is_dir(&self) -> bool { match self.descriptor_type { @@ -2283,6 +2428,7 @@ struct State { descriptors: RefCell>, /// Auxiliary storage to handle the `path_readlink` function. + #[cfg(not(feature = "proxy"))] path_buf: UnsafeCell>, /// Long-lived bump allocated memory arena. @@ -2295,17 +2441,21 @@ struct State { /// Arguments. Initialized lazily. Access with `State::get_args` to take care of /// initialization. + #[cfg(not(feature = "proxy"))] args: Cell>, /// Environment variables. Initialized lazily. Access with `State::get_environment` /// to take care of initialization. + #[cfg(not(feature = "proxy"))] env_vars: Cell>, /// Cache for the `fd_readdir` call for a final `wasi::Dirent` plus path /// name that didn't fit into the caller's buffer. + #[cfg(not(feature = "proxy"))] dirent_cache: DirentCache, /// The string `..` for use by the directory iterator. + #[cfg(not(feature = "proxy"))] dotdot: [UnsafeCell; 2], /// Another canary constant located at the end of the structure to catch @@ -2313,6 +2463,7 @@ struct State { magic2: u32, } +#[cfg(not(feature = "proxy"))] struct DirentCache { stream: Cell>, for_fd: Cell, @@ -2321,6 +2472,7 @@ struct DirentCache { path_data: UnsafeCell>, } +#[cfg(not(feature = "proxy"))] struct DirectoryEntryStream(filesystem::DirectoryEntryStream); #[repr(C)] @@ -2359,14 +2511,17 @@ const fn bump_arena_size() -> usize { // The total size of the struct should be a page, so start there let mut start = PAGE_SIZE; - // Remove the big chunks of the struct, the `path_buf` and `descriptors` - // fields. - start -= PATH_MAX; + // Remove big chunks of the struct for its various fields. start -= size_of::(); - start -= size_of::(); + #[cfg(not(feature = "proxy"))] + { + start -= PATH_MAX; + start -= size_of::(); + } // Remove miscellaneous metadata also stored in state. - start -= 14 * size_of::(); + let misc = if cfg!(feature = "proxy") { 7 } else { 14 }; + start -= misc * size_of::(); // Everything else is the `command_data` allocation. start @@ -2465,10 +2620,14 @@ impl State { magic2: MAGIC, import_alloc: ImportAlloc::new(), descriptors: RefCell::new(None), + #[cfg(not(feature = "proxy"))] path_buf: UnsafeCell::new(MaybeUninit::uninit()), long_lived_arena: BumpArena::new(), + #[cfg(not(feature = "proxy"))] args: Cell::new(None), + #[cfg(not(feature = "proxy"))] env_vars: Cell::new(None), + #[cfg(not(feature = "proxy"))] dirent_cache: DirentCache { stream: Cell::new(None), for_fd: Cell::new(0), @@ -2481,6 +2640,7 @@ impl State { }), path_data: UnsafeCell::new(MaybeUninit::uninit()), }, + #[cfg(not(feature = "proxy"))] dotdot: [UnsafeCell::new(b'.'), UnsafeCell::new(b'.')], }); } @@ -2509,9 +2669,10 @@ impl State { RefMut::map(d, |d| d.as_mut().unwrap_or_else(|| unreachable!())) } + #[cfg(not(feature = "proxy"))] fn get_environment(&self) -> &[StrTuple] { if self.env_vars.get().is_none() { - #[link(wasm_import_module = "wasi:cli/environment@0.2.0-rc-2023-11-10")] + #[link(wasm_import_module = "wasi:cli/environment@0.2.0")] extern "C" { #[link_name = "get-environment"] fn get_environment_import(rval: *mut StrTupleList); @@ -2533,9 +2694,10 @@ impl State { self.env_vars.get().trapping_unwrap() } + #[cfg(not(feature = "proxy"))] fn get_args(&self) -> &[WasmStr] { if self.args.get().is_none() { - #[link(wasm_import_module = "wasi:cli/environment@0.2.0-rc-2023-11-10")] + #[link(wasm_import_module = "wasi:cli/environment@0.2.0")] extern "C" { #[link_name = "get-arguments"] fn get_args_import(rval: *mut WasmStrList); diff --git a/crates/wasi-preview1-component-adapter/verify/Cargo.toml b/crates/wasi-preview1-component-adapter/verify/Cargo.toml index 90349f4bf9bc..f739dd707c9d 100644 --- a/crates/wasi-preview1-component-adapter/verify/Cargo.toml +++ b/crates/wasi-preview1-component-adapter/verify/Cargo.toml @@ -5,6 +5,9 @@ edition.workspace = true authors.workspace = true publish = false +[lints] +workspace = true + [dependencies] wasmparser = { workspace = true } wat = { workspace = true } diff --git a/crates/wasi-threads/Cargo.toml b/crates/wasi-threads/Cargo.toml index b1f82c463652..1f42ba9f3210 100644 --- a/crates/wasi-threads/Cargo.toml +++ b/crates/wasi-threads/Cargo.toml @@ -11,12 +11,12 @@ repository = "https://github.com/bytecodealliance/wasmtime" readme = "README.md" edition.workspace = true +[lints] +workspace = true + [dependencies] anyhow = { workspace = true } log = { workspace = true } rand = "0.8" -wasi-common = { workspace = true } +wasi-common = { workspace = true, features = ["exit"]} wasmtime = { workspace = true } -wasmtime-wasi = { workspace = true, default-features = true, features = [ - "exit", -] } diff --git a/crates/wasi-threads/src/lib.rs b/crates/wasi-threads/src/lib.rs index 76f12edae86a..1af8ce9ff6e2 100644 --- a/crates/wasi-threads/src/lib.rs +++ b/crates/wasi-threads/src/lib.rs @@ -3,12 +3,11 @@ //! [`wasi-threads`]: https://github.com/WebAssembly/wasi-threads use anyhow::{anyhow, Result}; -use rand::Rng; use std::panic::{catch_unwind, AssertUnwindSafe}; +use std::sync::atomic::{AtomicI32, Ordering}; use std::sync::Arc; use std::thread; use wasmtime::{Caller, ExternType, InstancePre, Linker, Module, SharedMemory, Store, ValType}; -use wasmtime_wasi::maybe_exit_on_error; // This name is a function export designated by the wasi-threads specification: // https://github.com/WebAssembly/wasi-threads/#detailed-design-discussion @@ -16,12 +15,14 @@ const WASI_ENTRY_POINT: &str = "wasi_thread_start"; pub struct WasiThreadsCtx { instance_pre: Arc>, + tid: AtomicI32, } impl WasiThreadsCtx { pub fn new(module: Module, linker: Arc>) -> Result { let instance_pre = Arc::new(linker.instantiate_pre(&module)?); - Ok(Self { instance_pre }) + let tid = AtomicI32::new(0); + Ok(Self { instance_pre, tid }) } pub fn spawn(&self, host: T, thread_start_arg: i32) -> Result { @@ -45,8 +46,14 @@ impl WasiThreadsCtx { return Ok(-1); } + let wasi_thread_id = self.next_thread_id(); + if wasi_thread_id.is_none() { + log::error!("ran out of valid thread IDs"); + return Ok(-1); + } + let wasi_thread_id = wasi_thread_id.unwrap(); + // Start a Rust thread running a new instance of the current module. - let wasi_thread_id = random_thread_id(); let builder = thread::Builder::new().name(format!("wasi-thread-{}", wasi_thread_id)); builder.spawn(move || { // Catch any panic failures in host code; e.g., if a WASI module @@ -74,7 +81,7 @@ impl WasiThreadsCtx { Ok(_) => log::trace!("exiting thread id = {} normally", wasi_thread_id), Err(e) => { log::trace!("exiting thread id = {} due to error", wasi_thread_id); - let e = maybe_exit_on_error(e); + let e = wasi_common::maybe_exit_on_error(e); eprintln!("Error: {:?}", e); std::process::exit(1); } @@ -89,16 +96,23 @@ impl WasiThreadsCtx { Ok(wasi_thread_id) } -} -/// Helper for generating valid WASI thread IDs (TID). -/// -/// Callers of `wasi_thread_spawn` expect a TID >=0 to indicate a successful -/// spawning of the thread whereas a negative return value indicates an -/// failure to spawn. -fn random_thread_id() -> i32 { - let tid: u32 = rand::thread_rng().gen(); - (tid >> 1) as i32 + /// Helper for generating valid WASI thread IDs (TID). + /// + /// Callers of `wasi_thread_spawn` expect a TID in range of 0 < TID <= 0x1FFFFFFF + /// to indicate a successful spawning of the thread whereas a negative + /// return value indicates an failure to spawn. + fn next_thread_id(&self) -> Option { + match self + .tid + .fetch_update(Ordering::Relaxed, Ordering::Relaxed, |v| match v { + ..=0x1ffffffe => Some(v + 1), + _ => None, + }) { + Ok(v) => Some(v + 1), + Err(_) => None, + } + } } /// Manually add the WASI `thread_spawn` function to the linker. diff --git a/crates/wasi/Cargo.toml b/crates/wasi/Cargo.toml index 9657139a2490..00ecc334d1d0 100644 --- a/crates/wasi/Cargo.toml +++ b/crates/wasi/Cargo.toml @@ -9,17 +9,15 @@ keywords = ["webassembly", "wasm"] repository = "https://github.com/bytecodealliance/wasmtime" readme = "README.md" edition.workspace = true -include = ["src/**/*", "README.md", "LICENSE", "build.rs", "witx/*", "wit/**/*"] -build = "build.rs" +include = ["src/**/*", "README.md", "LICENSE", "witx/*", "wit/**/*", "tests/*"] + +[lints] +workspace = true [dependencies] wasmtime = { workspace = true } anyhow = { workspace = true } -wasi-common = { workspace = true } -wasi-cap-std-sync = { workspace = true, optional = true } -wasi-tokio = { workspace = true, optional = true } -wiggle = { workspace = true, optional = true } -libc = { workspace = true } +wiggle = { workspace = true, optional = true, features = ["wasmtime"] } once_cell = { workspace = true } log = { workspace = true } url = { workspace = true } @@ -39,6 +37,8 @@ bitflags = { workspace = true, optional = true } async-trait = { workspace = true, optional = true } system-interface = { workspace = true, optional = true} futures = { workspace = true, optional = true } +wasi-common = { workspace = true, optional = true, features = ["sync"] } +cfg-if = { workspace = true, optional = true } [dev-dependencies] tokio = { workspace = true, features = ["time", "sync", "io-std", "io-util", "rt", "rt-multi-thread", "net", "macros"] } @@ -51,22 +51,20 @@ wasmtime = { workspace = true, features = ['cranelift'] } [target.'cfg(unix)'.dependencies] rustix = { workspace = true, features = ["event", "fs", "net"], optional = true } -[target.'cfg(unix)'.dev-dependencies] -libc = { workspace = true } - [target.'cfg(windows)'.dependencies] io-extras = { workspace = true } windows-sys = { workspace = true } rustix = { workspace = true, features = ["event", "net"], optional = true } [features] -default = ["sync", "preview2", "preview1-on-preview2"] -sync = ["wasi-cap-std-sync", "wiggle"] -tokio = ["wasi-tokio", "wasmtime/async", "wiggle/wasmtime_async" ] -exit = [] +default = ["wasi-common-deprecations", "preview2", "preview1-on-preview2"] +wasi-common-deprecations = [ "dep:wasi-common" ] +tokio = [ "wasi-common?/tokio", "wasi-common-deprecations" ] +exit = [ "wasi-common-deprecations", "dep:cfg-if" ] preview2 = [ 'wasmtime/component-model', 'wasmtime/async', + 'wasmtime/runtime', 'dep:thiserror', 'dep:tracing', 'dep:cap-std', @@ -87,3 +85,8 @@ preview1-on-preview2 = [ "preview2", "wiggle", ] + +[[test]] +name = "process_stdin" +harness = false + diff --git a/crates/wasi/build.rs b/crates/wasi/build.rs deleted file mode 100644 index 12ace81f5b13..000000000000 --- a/crates/wasi/build.rs +++ /dev/null @@ -1,6 +0,0 @@ -fn main() { - // wasi-common's links & build.rs ensure this variable points to the wasi root: - let wasi_root = std::env::var("DEP_WASI_COMMON_19_WASI").unwrap(); - // Make it available as WASI_ROOT: - println!("cargo:rustc-env=WASI_ROOT={}", wasi_root); -} diff --git a/crates/wasi/src/lib.rs b/crates/wasi/src/lib.rs index 70671b6172ba..3dcb8d271df7 100644 --- a/crates/wasi/src/lib.rs +++ b/crates/wasi/src/lib.rs @@ -7,83 +7,41 @@ //! Individual snapshots are available through //! `wasmtime_wasi::snapshots::preview_{0, 1}::Wasi::new(&Store, Rc>)`. +#![warn(clippy::cast_sign_loss)] + #[cfg(feature = "preview2")] pub mod preview2; -pub use wasi_common::{Error, I32Exit, WasiCtx, WasiDir, WasiFile}; - -/// Re-export the commonly used wasi-cap-std-sync crate here. This saves -/// consumers of this library from having to keep additional dependencies -/// in sync. -#[cfg(feature = "sync")] +#[cfg(feature = "wasi-common-deprecations")] +#[deprecated( + since = "18.0.0", + note = "The wasmtime_wasi::sync module's functionalty has been moved to + wasi_common::sync. This re-export will be removed from wasmtime_wasi in + 19.0" +)] pub mod sync { - pub use wasi_cap_std_sync::*; - super::define_wasi!(block_on); + pub use wasi_common::sync::*; } -/// Sync mode is the "default" of this crate, so we also export it at the top -/// level. -#[cfg(feature = "sync")] +#[cfg(feature = "wasi-common-deprecations")] +#[allow(deprecated)] // Satisfy linter locally +#[deprecated( + since = "18.0.0", + note = "The wasmtime_wasi module's root export of wasmtime_wasi::sync has + been moved to wasi_common::sync. This re-export will be removed from + wasmtime_wasi in 19.0" +)] pub use sync::*; -/// Re-export the wasi-tokio crate here. This saves consumers of this library from having -/// to keep additional dependencies in sync. #[cfg(feature = "tokio")] +#[deprecated( + since = "18.0.0", + note = "The wasmtime_wasi::tokio module's functionalty has been moved to + wasi_common::tokio. This re-export will be removed from wasmtime_wasi in + 19.0" +)] pub mod tokio { - pub use wasi_tokio::*; - super::define_wasi!(async T: Send); -} - -// The only difference between these definitions for sync vs async is whether -// the wasmtime::Funcs generated are async (& therefore need an async Store and an executor to run) -// or whether they have an internal "dummy executor" that expects the implementation of all -// the async funcs to poll to Ready immediately. -#[doc(hidden)] -#[macro_export] -macro_rules! define_wasi { - ($async_mode:tt $($bounds:tt)*) => { - -use wasmtime::Linker; - -pub fn add_to_linker( - linker: &mut Linker, - get_cx: impl Fn(&mut T) -> &mut U + Send + Sync + Copy + 'static, -) -> anyhow::Result<()> - where U: Send - + wasi_common::snapshots::preview_0::wasi_unstable::WasiUnstable - + wasi_common::snapshots::preview_1::wasi_snapshot_preview1::WasiSnapshotPreview1, - $($bounds)* -{ - snapshots::preview_1::add_wasi_snapshot_preview1_to_linker(linker, get_cx)?; - snapshots::preview_0::add_wasi_unstable_to_linker(linker, get_cx)?; - Ok(()) -} - -pub mod snapshots { - pub mod preview_1 { - wiggle::wasmtime_integration!({ - // The wiggle code to integrate with lives here: - target: wasi_common::snapshots::preview_1, - // This must be the same witx document as used above. This should be ensured by - // the `WASI_ROOT` env variable, which is set in wasi-common's `build.rs`. - witx: ["$WASI_ROOT/phases/snapshot/witx/wasi_snapshot_preview1.witx"], - errors: { errno => trappable Error }, - $async_mode: * - }); - } - pub mod preview_0 { - wiggle::wasmtime_integration!({ - // The wiggle code to integrate with lives here: - target: wasi_common::snapshots::preview_0, - // This must be the same witx document as used above. This should be ensured by - // the `WASI_ROOT` env variable, which is set in wasi-common's `build.rs`. - witx: ["$WASI_ROOT/phases/old/snapshot_0/witx/wasi_unstable.witx"], - errors: { errno => trappable Error }, - $async_mode: * - }); - } -} -} + pub use wasi_common::tokio::*; } /// Exit the process with a conventional OS error code as long as Wasmtime @@ -94,17 +52,25 @@ pub mod snapshots { /// Wasmtime failures to terminate the parent process, such as in the Wasmtime /// CLI; this would not be suitable for use in multi-tenant embeddings. #[cfg(feature = "exit")] +#[deprecated( + since = "18.0.0", + note = "This legacy functionality is migrated to the wasi-common crate, and will be removed in 19.0." +)] pub fn maybe_exit_on_error(e: anyhow::Error) -> anyhow::Error { use std::process; use wasmtime::Trap; + if let Some(exit) = e + .downcast_ref::() + .map(|exit| exit.process_exit_code()) + { + process::exit(exit) + } + // If a specific WASI error code was requested then that's // forwarded through to the process here without printing any // extra error information. - let code = e - .downcast_ref::() - .map(|e| e.0) - .or_else(|| e.downcast_ref::().map(|e| e.0)); + let code = e.downcast_ref::().map(|e| e.0); if let Some(exit) = code { // Print the error message in the usual way. // On Windows, exit status 3 indicates an abort (see below), @@ -121,13 +87,15 @@ pub fn maybe_exit_on_error(e: anyhow::Error) -> anyhow::Error { if e.is::() { eprintln!("Error: {:?}", e); - if cfg!(unix) { - // On Unix, return the error code of an abort. - process::exit(128 + libc::SIGABRT); - } else if cfg!(windows) { - // On Windows, return 3. - // https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/abort?view=vs-2019 - process::exit(3); + cfg_if::cfg_if! { + if #[cfg(unix)] { + // On Unix, return the error code of an abort. + process::exit(rustix::process::EXIT_SIGNALED_SIGABRT); + } else if #[cfg(windows)] { + // On Windows, return 3. + // https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/abort?view=vs-2019 + process::exit(3); + } } } diff --git a/crates/wasi/src/preview2/clocks.rs b/crates/wasi/src/preview2/clocks.rs index 53bca0507058..175ac1990ffc 100644 --- a/crates/wasi/src/preview2/clocks.rs +++ b/crates/wasi/src/preview2/clocks.rs @@ -1,12 +1,12 @@ pub mod host; use cap_std::time::Duration; -pub trait HostWallClock: Send + Sync { +pub trait HostWallClock: Send { fn resolution(&self) -> Duration; fn now(&self) -> Duration; } -pub trait HostMonotonicClock: Send + Sync { +pub trait HostMonotonicClock: Send { fn resolution(&self) -> u64; fn now(&self) -> u64; } diff --git a/crates/wasi/src/preview2/clocks/host.rs b/crates/wasi/src/preview2/clocks/host.rs index e0c9906c7598..20b35ce6438f 100644 --- a/crates/wasi/src/preview2/clocks/host.rs +++ b/crates/wasi/src/preview2/clocks/host.rs @@ -64,10 +64,10 @@ impl HostMonotonicClock for MonotonicClock { } } -pub fn monotonic_clock() -> Box { +pub fn monotonic_clock() -> Box { Box::new(MonotonicClock::new(ambient_authority())) } -pub fn wall_clock() -> Box { +pub fn wall_clock() -> Box { Box::new(WallClock::new(ambient_authority())) } diff --git a/crates/wasi/src/preview2/command.rs b/crates/wasi/src/preview2/command.rs index 6ff304b24b12..3a4683146b38 100644 --- a/crates/wasi/src/preview2/command.rs +++ b/crates/wasi/src/preview2/command.rs @@ -35,6 +35,8 @@ pub fn add_to_linker(l: &mut wasmtime::component::Linker) -> any crate::preview2::bindings::io::poll::add_to_linker(l, |t| t)?; crate::preview2::bindings::io::streams::add_to_linker(l, |t| t)?; crate::preview2::bindings::random::random::add_to_linker(l, |t| t)?; + crate::preview2::bindings::random::insecure::add_to_linker(l, |t| t)?; + crate::preview2::bindings::random::insecure_seed::add_to_linker(l, |t| t)?; crate::preview2::bindings::cli::exit::add_to_linker(l, |t| t)?; crate::preview2::bindings::cli::environment::add_to_linker(l, |t| t)?; crate::preview2::bindings::cli::stdin::add_to_linker(l, |t| t)?; @@ -96,6 +98,8 @@ pub mod sync { crate::preview2::bindings::sync_io::io::poll::add_to_linker(l, |t| t)?; crate::preview2::bindings::sync_io::io::streams::add_to_linker(l, |t| t)?; crate::preview2::bindings::random::random::add_to_linker(l, |t| t)?; + crate::preview2::bindings::random::insecure::add_to_linker(l, |t| t)?; + crate::preview2::bindings::random::insecure_seed::add_to_linker(l, |t| t)?; crate::preview2::bindings::cli::exit::add_to_linker(l, |t| t)?; crate::preview2::bindings::cli::environment::add_to_linker(l, |t| t)?; crate::preview2::bindings::cli::stdin::add_to_linker(l, |t| t)?; diff --git a/crates/wasi/src/preview2/ctx.rs b/crates/wasi/src/preview2/ctx.rs index 73cd0e116e50..f440fa4e5658 100644 --- a/crates/wasi/src/preview2/ctx.rs +++ b/crates/wasi/src/preview2/ctx.rs @@ -1,17 +1,18 @@ -use super::clocks::host::{monotonic_clock, wall_clock}; use crate::preview2::{ - clocks::{self, HostMonotonicClock, HostWallClock}, - filesystem::Dir, + clocks::{ + host::{monotonic_clock, wall_clock}, + HostMonotonicClock, HostWallClock, + }, + filesystem::{Dir, OpenMode}, + network::{SocketAddrCheck, SocketAddrUse}, pipe, random, stdio, stdio::{StdinStream, StdoutStream}, - DirPerms, FilePerms, Table, + DirPerms, FilePerms, }; use cap_rand::{Rng, RngCore, SeedableRng}; -use cap_std::ipnet::{self, IpNet}; -use cap_std::net::Pool; -use cap_std::{ambient_authority, AmbientAuthority}; -use std::mem; -use std::net::{Ipv4Addr, Ipv6Addr}; +use std::sync::Arc; +use std::{mem, net::SocketAddr}; +use wasmtime::component::ResourceTable; pub struct WasiCtxBuilder { stdin: Box, @@ -20,14 +21,13 @@ pub struct WasiCtxBuilder { env: Vec<(String, String)>, args: Vec, preopens: Vec<(Dir, String)>, - - pool: Pool, - random: Box, - insecure_random: Box, + socket_addr_check: SocketAddrCheck, + random: Box, + insecure_random: Box, insecure_random_seed: u128, - wall_clock: Box, - monotonic_clock: Box, - allow_ip_name_lookup: bool, + wall_clock: Box, + monotonic_clock: Box, + allowed_network_uses: AllowedNetworkUses, built: bool, } @@ -71,13 +71,13 @@ impl WasiCtxBuilder { env: Vec::new(), args: Vec::new(), preopens: Vec::new(), - pool: Pool::new(), + socket_addr_check: SocketAddrCheck::default(), random: random::thread_rng(), insecure_random, insecure_random_seed, wall_clock: wall_clock(), monotonic_clock: monotonic_clock(), - allow_ip_name_lookup: false, + allowed_network_uses: AllowedNetworkUses::default(), built: false, } } @@ -144,8 +144,17 @@ impl WasiCtxBuilder { file_perms: FilePerms, path: impl AsRef, ) -> &mut Self { - self.preopens - .push((Dir::new(dir, perms, file_perms), path.as_ref().to_owned())); + let mut open_mode = OpenMode::empty(); + if perms.contains(DirPerms::READ) { + open_mode |= OpenMode::READ; + } + if perms.contains(DirPerms::MUTATE) { + open_mode |= OpenMode::WRITE; + } + self.preopens.push(( + Dir::new(dir, perms, file_perms, open_mode), + path.as_ref().to_owned(), + )); self } @@ -159,98 +168,63 @@ impl WasiCtxBuilder { /// unpredictable random data in order to maintain its security invariants, /// and ideally should use the insecure random API otherwise, so using any /// prerecorded or otherwise predictable data may compromise security. - pub fn secure_random(&mut self, random: impl RngCore + Send + Sync + 'static) -> &mut Self { + pub fn secure_random(&mut self, random: impl RngCore + Send + 'static) -> &mut Self { self.random = Box::new(random); self } - pub fn insecure_random( - &mut self, - insecure_random: impl RngCore + Send + Sync + 'static, - ) -> &mut Self { + pub fn insecure_random(&mut self, insecure_random: impl RngCore + Send + 'static) -> &mut Self { self.insecure_random = Box::new(insecure_random); self } + pub fn insecure_random_seed(&mut self, insecure_random_seed: u128) -> &mut Self { self.insecure_random_seed = insecure_random_seed; self } - pub fn wall_clock(&mut self, clock: impl clocks::HostWallClock + 'static) -> &mut Self { + pub fn wall_clock(&mut self, clock: impl HostWallClock + 'static) -> &mut Self { self.wall_clock = Box::new(clock); self } - pub fn monotonic_clock( - &mut self, - clock: impl clocks::HostMonotonicClock + 'static, - ) -> &mut Self { + pub fn monotonic_clock(&mut self, clock: impl HostMonotonicClock + 'static) -> &mut Self { self.monotonic_clock = Box::new(clock); self } - /// Add all network addresses accessable to the host to the pool. - pub fn inherit_network(&mut self, ambient_authority: AmbientAuthority) -> &mut Self { - self.pool.insert_ip_net_port_any( - IpNet::new(Ipv4Addr::UNSPECIFIED.into(), 0).unwrap(), - ambient_authority, - ); - self.pool.insert_ip_net_port_any( - IpNet::new(Ipv6Addr::UNSPECIFIED.into(), 0).unwrap(), - ambient_authority, - ); - self - } - - /// Add network addresses to the pool. - pub fn insert_addr( - &mut self, - addrs: A, - ) -> std::io::Result<&mut Self> { - self.pool.insert(addrs, ambient_authority())?; - Ok(self) - } - - /// Add a specific [`cap_std::net::SocketAddr`] to the pool. - pub fn insert_socket_addr(&mut self, addr: cap_std::net::SocketAddr) -> &mut Self { - self.pool.insert_socket_addr(addr, ambient_authority()); - self + /// Allow all network addresses accessible to the host + pub fn inherit_network(&mut self) -> &mut Self { + self.socket_addr_check(|_, _| true) } - /// Add a range of network addresses, accepting any port, to the pool. + /// A check that will be called for each socket address that is used. /// - /// Unlike `insert_ip_net`, this function grants access to any requested port. - pub fn insert_ip_net_port_any(&mut self, ip_net: ipnet::IpNet) -> &mut Self { - self.pool - .insert_ip_net_port_any(ip_net, ambient_authority()); + /// Returning `true` will permit socket connections to the `SocketAddr`, + /// while returning `false` will reject the connection. + pub fn socket_addr_check(&mut self, check: F) -> &mut Self + where + F: Fn(&SocketAddr, SocketAddrUse) -> bool + Send + Sync + 'static, + { + self.socket_addr_check = SocketAddrCheck(Arc::new(check)); self } - /// Add a range of network addresses, accepting a range of ports, to - /// per-instance networks. - /// - /// This grants access to the port range starting at `ports_start` and, if - /// `ports_end` is provided, ending before `ports_end`. - pub fn insert_ip_net_port_range( - &mut self, - ip_net: ipnet::IpNet, - ports_start: u16, - ports_end: Option, - ) -> &mut Self { - self.pool - .insert_ip_net_port_range(ip_net, ports_start, ports_end, ambient_authority()); + /// Allow usage of `wasi:sockets/ip-name-lookup` + pub fn allow_ip_name_lookup(&mut self, enable: bool) -> &mut Self { + self.allowed_network_uses.ip_name_lookup = enable; self } - /// Add a range of network addresses with a specific port to the pool. - pub fn insert_ip_net(&mut self, ip_net: ipnet::IpNet, port: u16) -> &mut Self { - self.pool.insert_ip_net(ip_net, port, ambient_authority()); + /// Allow usage of UDP + pub fn allow_udp(&mut self, enable: bool) -> &mut Self { + self.allowed_network_uses.udp = enable; self } - /// Allow usage of `wasi:sockets/ip-name-lookup` - pub fn allow_ip_name_lookup(&mut self, enable: bool) -> &mut Self { - self.allow_ip_name_lookup = enable; + /// Allow usage of TCP + pub fn allow_tcp(&mut self, enable: bool) -> &mut Self { + self.allowed_network_uses.tcp = enable; self } @@ -272,13 +246,13 @@ impl WasiCtxBuilder { env, args, preopens, - pool, + socket_addr_check, random, insecure_random, insecure_random_seed, wall_clock, monotonic_clock, - allow_ip_name_lookup, + allowed_network_uses, built: _, } = mem::replace(self, Self::new()); self.built = true; @@ -290,36 +264,74 @@ impl WasiCtxBuilder { env, args, preopens, - pool, + socket_addr_check, random, insecure_random, insecure_random_seed, wall_clock, monotonic_clock, - allow_ip_name_lookup, + allowed_network_uses, } } } pub trait WasiView: Send { - fn table(&self) -> &Table; - fn table_mut(&mut self) -> &mut Table; - fn ctx(&self) -> &WasiCtx; - fn ctx_mut(&mut self) -> &mut WasiCtx; + fn table(&mut self) -> &mut ResourceTable; + fn ctx(&mut self) -> &mut WasiCtx; } pub struct WasiCtx { - pub(crate) random: Box, - pub(crate) insecure_random: Box, + pub(crate) random: Box, + pub(crate) insecure_random: Box, pub(crate) insecure_random_seed: u128, - pub(crate) wall_clock: Box, - pub(crate) monotonic_clock: Box, + pub(crate) wall_clock: Box, + pub(crate) monotonic_clock: Box, pub(crate) env: Vec<(String, String)>, pub(crate) args: Vec, pub(crate) preopens: Vec<(Dir, String)>, pub(crate) stdin: Box, pub(crate) stdout: Box, pub(crate) stderr: Box, - pub(crate) pool: Pool, - pub(crate) allow_ip_name_lookup: bool, + pub(crate) socket_addr_check: SocketAddrCheck, + pub(crate) allowed_network_uses: AllowedNetworkUses, +} + +pub struct AllowedNetworkUses { + pub ip_name_lookup: bool, + pub udp: bool, + pub tcp: bool, +} + +impl Default for AllowedNetworkUses { + fn default() -> Self { + Self { + ip_name_lookup: false, + udp: true, + tcp: true, + } + } +} + +impl AllowedNetworkUses { + pub(crate) fn check_allowed_udp(&self) -> std::io::Result<()> { + if !self.udp { + return Err(std::io::Error::new( + std::io::ErrorKind::PermissionDenied, + "UDP is not allowed", + )); + } + + Ok(()) + } + + pub(crate) fn check_allowed_tcp(&self) -> std::io::Result<()> { + if !self.tcp { + return Err(std::io::Error::new( + std::io::ErrorKind::PermissionDenied, + "TCP is not allowed", + )); + } + + Ok(()) + } } diff --git a/crates/wasi/src/preview2/error.rs b/crates/wasi/src/preview2/error.rs index f92317c1fef7..a019b4a7a2e7 100644 --- a/crates/wasi/src/preview2/error.rs +++ b/crates/wasi/src/preview2/error.rs @@ -9,6 +9,20 @@ use std::marker; #[derive(Debug)] pub struct I32Exit(pub i32); +impl I32Exit { + /// Accessor for an exit code appropriate for calling `std::process::exit` with, + /// when interpreting this `I32Exit` as an exit for the parent process. + /// + /// This method masks off exit codes which are illegal on Windows. + pub fn process_exit_code(&self) -> i32 { + if cfg!(windows) && self.0 >= 3 { + 1 + } else { + self.0 + } + } +} + impl fmt::Display for I32Exit { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "Exited with i32 exit status {}", self.0) diff --git a/crates/wasi/src/preview2/filesystem.rs b/crates/wasi/src/preview2/filesystem.rs index d8dc2bc68ada..de48aa455cbd 100644 --- a/crates/wasi/src/preview2/filesystem.rs +++ b/crates/wasi/src/preview2/filesystem.rs @@ -1,7 +1,6 @@ use crate::preview2::bindings::filesystem::types; use crate::preview2::{ - spawn_blocking, AbortOnDropJoinHandle, HostOutputStream, StreamError, Subscribe, TableError, - TrappableError, + spawn_blocking, AbortOnDropJoinHandle, HostOutputStream, StreamError, Subscribe, TrappableError, }; use anyhow::anyhow; use bytes::{Bytes, BytesMut}; @@ -13,8 +12,8 @@ pub type FsResult = Result; pub type FsError = TrappableError; -impl From for FsError { - fn from(error: TableError) -> Self { +impl From for FsError { + fn from(error: wasmtime::component::ResourceTableError) -> Self { Self::trap(error) } } @@ -68,20 +67,40 @@ bitflags::bitflags! { } } +bitflags::bitflags! { + #[derive(Copy, Clone, Debug, PartialEq, Eq)] + pub struct OpenMode: usize { + const READ = 0b1; + const WRITE = 0b10; + } +} + pub struct File { + /// The operating system File this struct is mediating access to. + /// /// Wrapped in an Arc because the same underlying file is used for - /// implementing the stream types. Also needed for [`spawn_blocking`]. + /// implementing the stream types. A copy is also needed for + /// [`spawn_blocking`]. /// /// [`spawn_blocking`]: Self::spawn_blocking pub file: Arc, + /// Permissions to enforce on access to the file. These permissions are + /// specified by a user of the `crate::preview2::WasiCtxBuilder`, and are + /// enforced prior to any enforced by the underlying operating system. pub perms: FilePerms, + /// The mode the file was opened under: bits for reading, and writing. + /// Required to correctly report the DescriptorFlags, because cap-std + /// doesn't presently provide a cross-platform equivelant of reading the + /// oflags back out using fcntl. + pub open_mode: OpenMode, } impl File { - pub fn new(file: cap_std::fs::File, perms: FilePerms) -> Self { + pub fn new(file: cap_std::fs::File, perms: FilePerms, open_mode: OpenMode) -> Self { Self { file: Arc::new(file), perms, + open_mode, } } @@ -107,17 +126,41 @@ bitflags::bitflags! { #[derive(Clone)] pub struct Dir { + /// The operating system file descriptor this struct is mediating access + /// to. + /// + /// Wrapped in an Arc because a copy is needed for [`spawn_blocking`]. + /// + /// [`spawn_blocking`]: Self::spawn_blocking pub dir: Arc, + /// Permissions to enforce on access to this directory. These permissions + /// are specified by a user of the `crate::preview2::WasiCtxBuilder`, and + /// are enforced prior to any enforced by the underlying operating system. + /// + /// These permissions are also enforced on any directories opened under + /// this directory. pub perms: DirPerms, + /// Permissions to enforce on any files opened under this directory. pub file_perms: FilePerms, + /// The mode the directory was opened under: bits for reading, and writing. + /// Required to correctly report the DescriptorFlags, because cap-std + /// doesn't presently provide a cross-platform equivelant of reading the + /// oflags back out using fcntl. + pub open_mode: OpenMode, } impl Dir { - pub fn new(dir: cap_std::fs::Dir, perms: DirPerms, file_perms: FilePerms) -> Self { + pub fn new( + dir: cap_std::fs::Dir, + perms: DirPerms, + file_perms: FilePerms, + open_mode: OpenMode, + ) -> Self { Dir { dir: Arc::new(dir), perms, file_perms, + open_mode, } } @@ -229,6 +272,10 @@ impl HostOutputStream for FileOutputStream { } } + if buf.is_empty() { + return Ok(()); + } + let f = Arc::clone(&self.file); let m = self.mode; let task = spawn_blocking(move || match m { diff --git a/crates/wasi/src/preview2/host/clocks.rs b/crates/wasi/src/preview2/host/clocks.rs index 4467b3681ec3..42b6cb7b9236 100644 --- a/crates/wasi/src/preview2/host/clocks.rs +++ b/crates/wasi/src/preview2/host/clocks.rs @@ -43,7 +43,7 @@ impl wall_clock::Host for T { } fn subscribe_to_duration( - table: &mut crate::preview2::Table, + table: &mut wasmtime::component::ResourceTable, duration: tokio::time::Duration, ) -> anyhow::Result> { let sleep = if duration.is_zero() { @@ -77,11 +77,11 @@ impl monotonic_clock::Host for T { } else { Duration::from_nanos(0) }; - subscribe_to_duration(&mut self.table_mut(), duration) + subscribe_to_duration(&mut self.table(), duration) } fn subscribe_duration(&mut self, duration: WasiDuration) -> anyhow::Result> { - subscribe_to_duration(&mut self.table_mut(), Duration::from_nanos(duration)) + subscribe_to_duration(&mut self.table(), Duration::from_nanos(duration)) } } diff --git a/crates/wasi/src/preview2/host/filesystem.rs b/crates/wasi/src/preview2/host/filesystem.rs index 39559ed43aec..c6d93713f561 100644 --- a/crates/wasi/src/preview2/host/filesystem.rs +++ b/crates/wasi/src/preview2/host/filesystem.rs @@ -4,9 +4,10 @@ use crate::preview2::bindings::filesystem::types::{ self, ErrorCode, HostDescriptor, HostDirectoryEntryStream, }; use crate::preview2::bindings::io::streams::{InputStream, OutputStream}; -use crate::preview2::filesystem::{Descriptor, Dir, File, ReaddirIterator}; -use crate::preview2::filesystem::{FileInputStream, FileOutputStream}; -use crate::preview2::{DirPerms, FilePerms, FsError, FsResult, Table, WasiView}; +use crate::preview2::filesystem::{ + Descriptor, Dir, File, FileInputStream, FileOutputStream, OpenMode, ReaddirIterator, +}; +use crate::preview2::{DirPerms, FilePerms, FsError, FsResult, WasiView}; use anyhow::Context; use wasmtime::component::Resource; @@ -19,7 +20,7 @@ impl preopens::Host for T { let mut results = Vec::new(); for (dir, name) in self.ctx().preopens.clone() { let fd = self - .table_mut() + .table() .push(Descriptor::Dir(dir)) .with_context(|| format!("failed to push preopen {name}"))?; results.push((fd, name)); @@ -38,7 +39,7 @@ impl types::Host for T { &mut self, err: Resource, ) -> anyhow::Result> { - let err = self.table_mut().get(&err)?; + let err = self.table().get(&err)?; // Currently `err` always comes from the stream implementation which // uses standard reads/writes so only check for `std::io::Error` here. @@ -78,9 +79,9 @@ impl HostDescriptor for T { } async fn sync_data(&mut self, fd: Resource) -> FsResult<()> { - let table = self.table(); + let descriptor = self.table().get(&fd)?; - match table.get(&fd)? { + match descriptor { Descriptor::File(f) => { match f.spawn_blocking(|f| f.sync_data()).await { Ok(()) => Ok(()), @@ -125,15 +126,15 @@ impl HostDescriptor for T { out } - let table = self.table(); - match table.get(&fd)? { + let descriptor = self.table().get(&fd)?; + match descriptor { Descriptor::File(f) => { let flags = f.spawn_blocking(|f| f.get_fd_flags()).await?; let mut flags = get_from_fdflags(flags); - if f.perms.contains(FilePerms::READ) { + if f.open_mode.contains(OpenMode::READ) { flags |= DescriptorFlags::READ; } - if f.perms.contains(FilePerms::WRITE) { + if f.open_mode.contains(OpenMode::WRITE) { flags |= DescriptorFlags::WRITE; } Ok(flags) @@ -141,10 +142,10 @@ impl HostDescriptor for T { Descriptor::Dir(d) => { let flags = d.spawn_blocking(|d| d.get_fd_flags()).await?; let mut flags = get_from_fdflags(flags); - if d.perms.contains(DirPerms::READ) { + if d.open_mode.contains(OpenMode::READ) { flags |= DescriptorFlags::READ; } - if d.perms.contains(DirPerms::MUTATE) { + if d.open_mode.contains(OpenMode::WRITE) { flags |= DescriptorFlags::MUTATE_DIRECTORY; } Ok(flags) @@ -156,9 +157,9 @@ impl HostDescriptor for T { &mut self, fd: Resource, ) -> FsResult { - let table = self.table(); + let descriptor = self.table().get(&fd)?; - match table.get(&fd)? { + match descriptor { Descriptor::File(f) => { let meta = f.spawn_blocking(|f| f.metadata()).await?; Ok(descriptortype_from(meta.file_type())) @@ -188,8 +189,8 @@ impl HostDescriptor for T { ) -> FsResult<()> { use fs_set_times::SetTimes; - let table = self.table(); - match table.get(&fd)? { + let descriptor = self.table().get(&fd)?; + match descriptor { Descriptor::File(f) => { if !f.perms.contains(FilePerms::WRITE) { return Err(ErrorCode::NotPermitted.into()); @@ -275,7 +276,7 @@ impl HostDescriptor for T { &mut self, fd: Resource, ) -> FsResult> { - let table = self.table_mut(); + let table = self.table(); let d = table.get(&fd)?.dir()?; if !d.perms.contains(DirPerms::READ) { return Err(ErrorCode::NotPermitted.into()); @@ -337,9 +338,9 @@ impl HostDescriptor for T { } async fn sync(&mut self, fd: Resource) -> FsResult<()> { - let table = self.table(); + let descriptor = self.table().get(&fd)?; - match table.get(&fd)? { + match descriptor { Descriptor::File(f) => { match f.spawn_blocking(|f| f.sync_all()).await { Ok(()) => Ok(()), @@ -378,8 +379,8 @@ impl HostDescriptor for T { } async fn stat(&mut self, fd: Resource) -> FsResult { - let table = self.table(); - match table.get(&fd)? { + let descriptor = self.table().get(&fd)?; + match descriptor { Descriptor::File(f) => { // No permissions check on stat: if opened, allowed to stat it let meta = f.spawn_blocking(|f| f.metadata()).await?; @@ -492,7 +493,7 @@ impl HostDescriptor for T { use system_interface::fs::{FdFlags, GetSetFdFlags}; use types::{DescriptorFlags, OpenFlags}; - let table = self.table_mut(); + let table = self.table(); let d = table.get(&fd)?.dir()?; if !d.perms.contains(DirPerms::READ) { Err(ErrorCode::NotPermitted)?; @@ -507,28 +508,40 @@ impl HostDescriptor for T { } } + // Track whether we are creating file, for permission check: + let mut create = false; + // Track open mode, for permission check and recording in created descriptor: + let mut open_mode = OpenMode::empty(); + // Construct the OpenOptions to give the OS: let mut opts = cap_std::fs::OpenOptions::new(); opts.maybe_dir(true); - if oflags.contains(OpenFlags::CREATE | OpenFlags::EXCLUSIVE) { - opts.create_new(true); - opts.write(true); - } else if oflags.contains(OpenFlags::CREATE) { - opts.create(true); + if oflags.contains(OpenFlags::CREATE) { + if oflags.contains(OpenFlags::EXCLUSIVE) { + opts.create_new(true); + } else { + opts.create(true); + } + create = true; opts.write(true); + open_mode |= OpenMode::WRITE; } + if oflags.contains(OpenFlags::TRUNCATE) { opts.truncate(true); } if flags.contains(DescriptorFlags::READ) { opts.read(true); + open_mode |= OpenMode::READ; } if flags.contains(DescriptorFlags::WRITE) { opts.write(true); + open_mode |= OpenMode::WRITE; } else { // If not opened write, open read. This way the OS lets us open // the file, but we can use perms to reject use of the file later. opts.read(true); + open_mode |= OpenMode::READ; } if symlink_follow(path_flags) { opts.follow(FollowSymlinks::Yes); @@ -538,8 +551,8 @@ impl HostDescriptor for T { // These flags are not yet supported in cap-std: if flags.contains(DescriptorFlags::FILE_INTEGRITY_SYNC) - | flags.contains(DescriptorFlags::DATA_INTEGRITY_SYNC) - | flags.contains(DescriptorFlags::REQUESTED_WRITE_SYNC) + || flags.contains(DescriptorFlags::DATA_INTEGRITY_SYNC) + || flags.contains(DescriptorFlags::REQUESTED_WRITE_SYNC) { Err(ErrorCode::Unsupported)?; } @@ -553,6 +566,15 @@ impl HostDescriptor for T { } } + // Now enforce this WasiCtx's permissions before letting the OS have + // its shot: + if !d.perms.contains(DirPerms::MUTATE) && create { + Err(ErrorCode::NotPermitted)?; + } + if !d.file_perms.contains(FilePerms::WRITE) && open_mode.contains(OpenMode::WRITE) { + Err(ErrorCode::NotPermitted)?; + } + // Represents each possible outcome from the spawn_blocking operation. // This makes sure we don't have to give spawn_blocking any way to // manipulate the table. @@ -582,21 +604,23 @@ impl HostDescriptor for T { .await?; match opened { - OpenResult::Dir(dir) => { - Ok(table.push(Descriptor::Dir(Dir::new(dir, d.perms, d.file_perms)))?) - } - - OpenResult::File(file) => Ok(table.push(Descriptor::File(File::new( - file, - mask_file_perms(d.file_perms, flags), + OpenResult::Dir(dir) => Ok(table.push(Descriptor::Dir(Dir::new( + dir, + d.perms, + d.file_perms, + open_mode, )))?), + OpenResult::File(file) => { + Ok(table.push(Descriptor::File(File::new(file, d.file_perms, open_mode)))?) + } + OpenResult::NotDir => Err(ErrorCode::NotDirectory.into()), } } fn drop(&mut self, fd: Resource) -> anyhow::Result<()> { - let table = self.table_mut(); + let table = self.table(); // The Drop will close the file/dir, but if the close syscall // blocks the thread, I will face god and walk backwards into hell. @@ -713,7 +737,7 @@ impl HostDescriptor for T { let reader = FileInputStream::new(clone, offset); // Insert the stream view into the table. Trap if the table is full. - let index = self.table_mut().push(InputStream::File(reader))?; + let index = self.table().push(InputStream::File(reader))?; Ok(index) } @@ -738,7 +762,7 @@ impl HostDescriptor for T { let writer: OutputStream = Box::new(writer); // Insert the stream view into the table. Trap if the table is full. - let index = self.table_mut().push(writer)?; + let index = self.table().push(writer)?; Ok(index) } @@ -761,7 +785,7 @@ impl HostDescriptor for T { let appender: OutputStream = Box::new(appender); // Insert the stream view into the table. Trap if the table is full. - let index = self.table_mut().push(appender)?; + let index = self.table().push(appender)?; Ok(index) } @@ -772,9 +796,10 @@ impl HostDescriptor for T { b: Resource, ) -> anyhow::Result { use cap_fs_ext::MetadataExt; - let table = self.table(); - let meta_a = get_descriptor_metadata(table, a).await?; - let meta_b = get_descriptor_metadata(table, b).await?; + let descriptor_a = self.table().get(&a)?; + let meta_a = get_descriptor_metadata(descriptor_a).await?; + let descriptor_b = self.table().get(&b)?; + let meta_b = get_descriptor_metadata(descriptor_b).await?; if meta_a.dev() == meta_b.dev() && meta_a.ino() == meta_b.ino() { // MetadataHashValue does not derive eq, so use a pair of // comparisons to check equality: @@ -796,8 +821,8 @@ impl HostDescriptor for T { &mut self, fd: Resource, ) -> FsResult { - let table = self.table(); - let meta = get_descriptor_metadata(table, fd).await?; + let descriptor_a = self.table().get(&fd)?; + let meta = get_descriptor_metadata(descriptor_a).await?; Ok(calculate_metadata_hash(&meta)) } async fn metadata_hash_at( @@ -834,16 +859,13 @@ impl HostDirectoryEntryStream for T { } fn drop(&mut self, stream: Resource) -> anyhow::Result<()> { - self.table_mut().delete(stream)?; + self.table().delete(stream)?; Ok(()) } } -async fn get_descriptor_metadata( - table: &Table, - fd: Resource, -) -> FsResult { - match table.get(&fd)? { +async fn get_descriptor_metadata(fd: &types::Descriptor) -> FsResult { + match fd { Descriptor::File(f) => { // No permissions check on metadata: if opened, allowed to stat it Ok(f.spawn_blocking(|f| f.metadata()).await?) @@ -1042,24 +1064,14 @@ fn symlink_follow(path_flags: types::PathFlags) -> bool { path_flags.contains(types::PathFlags::SYMLINK_FOLLOW) } -fn mask_file_perms(p: FilePerms, flags: types::DescriptorFlags) -> FilePerms { - use types::DescriptorFlags; - let mut out = FilePerms::empty(); - if p.contains(FilePerms::READ) && flags.contains(DescriptorFlags::READ) { - out |= FilePerms::READ; - } - if p.contains(FilePerms::WRITE) && flags.contains(DescriptorFlags::WRITE) { - out |= FilePerms::WRITE; - } - out -} - #[cfg(test)] mod test { use super::*; + use wasmtime::component::ResourceTable; + #[test] fn table_readdir_works() { - let mut table = Table::new(); + let mut table = ResourceTable::new(); let ix = table .push(ReaddirIterator::new(std::iter::empty())) .unwrap(); diff --git a/crates/wasi/src/preview2/host/instance_network.rs b/crates/wasi/src/preview2/host/instance_network.rs index 6c36a738404c..8af4d0d8ae10 100644 --- a/crates/wasi/src/preview2/host/instance_network.rs +++ b/crates/wasi/src/preview2/host/instance_network.rs @@ -6,10 +6,10 @@ use wasmtime::component::Resource; impl instance_network::Host for T { fn instance_network(&mut self) -> Result, anyhow::Error> { let network = Network { - pool: self.ctx().pool.clone(), - allow_ip_name_lookup: self.ctx().allow_ip_name_lookup, + socket_addr_check: self.ctx().socket_addr_check.clone(), + allow_ip_name_lookup: self.ctx().allowed_network_uses.ip_name_lookup, }; - let network = self.table_mut().push(network)?; + let network = self.table().push(network)?; Ok(network) } } diff --git a/crates/wasi/src/preview2/host/io.rs b/crates/wasi/src/preview2/host/io.rs index ca5bc44b8d7b..b82ccc8efe43 100644 --- a/crates/wasi/src/preview2/host/io.rs +++ b/crates/wasi/src/preview2/host/io.rs @@ -13,7 +13,7 @@ impl streams::Host for T { match err { StreamError::Closed => Ok(streams::StreamError::Closed), StreamError::LastOperationFailed(e) => Ok(streams::StreamError::LastOperationFailed( - self.table_mut().push(e)?, + self.table().push(e)?, )), StreamError::Trap(e) => Err(e), } @@ -22,34 +22,34 @@ impl streams::Host for T { impl error::HostError for T { fn drop(&mut self, err: Resource) -> anyhow::Result<()> { - self.table_mut().delete(err)?; + self.table().delete(err)?; Ok(()) } fn to_debug_string(&mut self, err: Resource) -> anyhow::Result { - Ok(format!("{:?}", self.table_mut().get(&err)?)) + Ok(format!("{:?}", self.table().get(&err)?)) } } #[async_trait::async_trait] impl streams::HostOutputStream for T { fn drop(&mut self, stream: Resource) -> anyhow::Result<()> { - self.table_mut().delete(stream)?; + self.table().delete(stream)?; Ok(()) } fn check_write(&mut self, stream: Resource) -> StreamResult { - let bytes = self.table_mut().get_mut(&stream)?.check_write()?; + let bytes = self.table().get_mut(&stream)?.check_write()?; Ok(bytes as u64) } fn write(&mut self, stream: Resource, bytes: Vec) -> StreamResult<()> { - self.table_mut().get_mut(&stream)?.write(bytes.into())?; + self.table().get_mut(&stream)?.write(bytes.into())?; Ok(()) } fn subscribe(&mut self, stream: Resource) -> anyhow::Result> { - subscribe(self.table_mut(), stream) + subscribe(self.table(), stream) } async fn blocking_write_and_flush( @@ -57,7 +57,7 @@ impl streams::HostOutputStream for T { stream: Resource, bytes: Vec, ) -> StreamResult<()> { - let s = self.table_mut().get_mut(&stream)?; + let s = self.table().get_mut(&stream)?; if bytes.len() > 4096 { return Err(StreamError::trap( @@ -84,7 +84,7 @@ impl streams::HostOutputStream for T { stream: Resource, len: u64, ) -> StreamResult<()> { - let s = self.table_mut().get_mut(&stream)?; + let s = self.table().get_mut(&stream)?; if len > 4096 { return Err(StreamError::trap( @@ -107,19 +107,17 @@ impl streams::HostOutputStream for T { } fn write_zeroes(&mut self, stream: Resource, len: u64) -> StreamResult<()> { - self.table_mut() - .get_mut(&stream)? - .write_zeroes(len as usize)?; + self.table().get_mut(&stream)?.write_zeroes(len as usize)?; Ok(()) } fn flush(&mut self, stream: Resource) -> StreamResult<()> { - self.table_mut().get_mut(&stream)?.flush()?; + self.table().get_mut(&stream)?.flush()?; Ok(()) } async fn blocking_flush(&mut self, stream: Resource) -> StreamResult<()> { - let s = self.table_mut().get_mut(&stream)?; + let s = self.table().get_mut(&stream)?; s.flush()?; s.write_ready().await?; Ok(()) @@ -134,7 +132,7 @@ impl streams::HostOutputStream for T { let len = len.try_into().unwrap_or(usize::MAX); let permit = { - let output = self.table_mut().get_mut(&dest)?; + let output = self.table().get_mut(&dest)?; output.check_write()? }; let len = len.min(permit); @@ -142,7 +140,7 @@ impl streams::HostOutputStream for T { return Ok(0); } - let contents = match self.table_mut().get_mut(&src)? { + let contents = match self.table().get_mut(&src)? { InputStream::Host(h) => h.read(len)?, InputStream::File(f) => f.read(len).await?, }; @@ -152,7 +150,7 @@ impl streams::HostOutputStream for T { return Ok(0); } - let output = self.table_mut().get_mut(&dest)?; + let output = self.table().get_mut(&dest)?; output.write(contents)?; Ok(len.try_into().expect("usize can fit in u64")) } @@ -165,9 +163,9 @@ impl streams::HostOutputStream for T { ) -> StreamResult { use crate::preview2::Subscribe; - self.table_mut().get_mut(&dest)?.ready().await; + self.table().get_mut(&dest)?.ready().await; - self.table_mut().get_mut(&src)?.ready().await; + self.table().get_mut(&src)?.ready().await; self.splice(dest, src, len).await } @@ -176,17 +174,17 @@ impl streams::HostOutputStream for T { #[async_trait::async_trait] impl streams::HostInputStream for T { fn drop(&mut self, stream: Resource) -> anyhow::Result<()> { - self.table_mut().delete(stream)?; + self.table().delete(stream)?; Ok(()) } async fn read(&mut self, stream: Resource, len: u64) -> StreamResult> { let len = len.try_into().unwrap_or(usize::MAX); - let bytes = match self.table_mut().get_mut(&stream)? { + let bytes = match self.table().get_mut(&stream)? { InputStream::Host(s) => s.read(len)?, InputStream::File(s) => s.read(len).await?, }; - debug_assert!(bytes.len() <= len as usize); + debug_assert!(bytes.len() <= len); Ok(bytes.into()) } @@ -195,7 +193,7 @@ impl streams::HostInputStream for T { stream: Resource, len: u64, ) -> StreamResult> { - if let InputStream::Host(s) = self.table_mut().get_mut(&stream)? { + if let InputStream::Host(s) = self.table().get_mut(&stream)? { s.ready().await; } self.read(stream, len).await @@ -203,7 +201,7 @@ impl streams::HostInputStream for T { async fn skip(&mut self, stream: Resource, len: u64) -> StreamResult { let len = len.try_into().unwrap_or(usize::MAX); - let written = match self.table_mut().get_mut(&stream)? { + let written = match self.table().get_mut(&stream)? { InputStream::Host(s) => s.skip(len)?, InputStream::File(s) => s.skip(len).await?, }; @@ -215,14 +213,14 @@ impl streams::HostInputStream for T { stream: Resource, len: u64, ) -> StreamResult { - if let InputStream::Host(s) = self.table_mut().get_mut(&stream)? { + if let InputStream::Host(s) = self.table().get_mut(&stream)? { s.ready().await; } self.skip(stream, len).await } fn subscribe(&mut self, stream: Resource) -> anyhow::Result> { - crate::preview2::poll::subscribe(self.table_mut(), stream) + crate::preview2::poll::subscribe(self.table(), stream) } } diff --git a/crates/wasi/src/preview2/host/network.rs b/crates/wasi/src/preview2/host/network.rs index ad8d7ed7bfc8..995652a1a4a9 100644 --- a/crates/wasi/src/preview2/host/network.rs +++ b/crates/wasi/src/preview2/host/network.rs @@ -16,7 +16,7 @@ impl network::Host for T { impl crate::preview2::bindings::sockets::network::HostNetwork for T { fn drop(&mut self, this: Resource) -> Result<(), anyhow::Error> { - let table = self.table_mut(); + let table = self.table(); table.delete(this)?; @@ -218,9 +218,8 @@ pub(crate) mod util { use crate::preview2::bindings::sockets::network::ErrorCode; use crate::preview2::network::SocketAddressFamily; use crate::preview2::SocketResult; - use cap_net_ext::{Blocking, TcpBinder, TcpConnecter, TcpListenerExt, UdpBinder}; - use cap_std::net::{TcpListener, TcpStream, UdpSocket}; - use rustix::fd::AsFd; + use cap_net_ext::{AddressFamily, Blocking, UdpSocketExt}; + use rustix::fd::{AsFd, OwnedFd}; use rustix::io::Errno; use rustix::net::sockopt; @@ -261,14 +260,14 @@ pub(crate) mod util { ) -> SocketResult<()> { match (socket_family, addr.ip()) { (SocketAddressFamily::Ipv4, IpAddr::V4(_)) => Ok(()), - (SocketAddressFamily::Ipv6 { v6only }, IpAddr::V6(ipv6)) => { + (SocketAddressFamily::Ipv6, IpAddr::V6(ipv6)) => { if is_deprecated_ipv4_compatible(&ipv6) { // Reject IPv4-*compatible* IPv6 addresses. They have been deprecated // since 2006, OS handling of them is inconsistent and our own // validations don't take them into account either. // Note that these are not the same as IPv4-*mapped* IPv6 addresses. Err(ErrorCode::InvalidArgument.into()) - } else if *v6only && ipv6.to_ipv4_mapped().is_some() { + } else if ipv6.to_ipv4_mapped().is_some() { Err(ErrorCode::InvalidArgument.into()) } else { Ok(()) @@ -302,78 +301,76 @@ pub(crate) mod util { * Syscalls wrappers with (opinionated) portability fixes. */ - pub fn tcp_bind(listener: &TcpListener, binder: &TcpBinder) -> std::io::Result<()> { - binder - .bind_existing_tcp_listener(listener) - .map_err(|error| match Errno::from_io_error(&error) { - #[cfg(windows)] - Some(Errno::NOBUFS) => Errno::ADDRINUSE.into(), // Windows returns WSAENOBUFS when the ephemeral ports have been exhausted. - _ => error, - }) - } - - pub fn udp_bind(socket: &UdpSocket, binder: &UdpBinder) -> std::io::Result<()> { - binder.bind_existing_udp_socket(socket).map_err(|error| { - match Errno::from_io_error(&error) { - #[cfg(windows)] - Some(Errno::NOBUFS) => Errno::ADDRINUSE.into(), // Windows returns WSAENOBUFS when the ephemeral ports have been exhausted. - _ => error, - } - }) - } + pub fn udp_socket(family: AddressFamily, blocking: Blocking) -> std::io::Result { + // Delegate socket creation to cap_net_ext. They handle a couple of things for us: + // - On Windows: call WSAStartup if not done before. + // - Set the NONBLOCK and CLOEXEC flags. Either immediately during socket creation, + // or afterwards using ioctl or fcntl. Exact method depends on the platform. - pub fn tcp_connect(listener: &TcpListener, connecter: &TcpConnecter) -> std::io::Result<()> { - connecter.connect_existing_tcp_listener(listener).map_err( - |error| match Errno::from_io_error(&error) { - // On POSIX, non-blocking `connect` returns `EINPROGRESS`. Windows returns `WSAEWOULDBLOCK`. - #[cfg(windows)] - Some(Errno::WOULDBLOCK) => Errno::INPROGRESS.into(), - _ => error, - }, - ) + let socket = cap_std::net::UdpSocket::new(family, blocking)?; + Ok(OwnedFd::from(socket)) } - pub fn tcp_accept( - listener: &TcpListener, - blocking: Blocking, - ) -> std::io::Result<(TcpStream, SocketAddr)> { - listener - .accept_with(blocking) - .map_err(|error| match Errno::from_io_error(&error) { - #[cfg(windows)] - Some(Errno::INPROGRESS) => Errno::INTR.into(), // "A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function." - - // Normalize Linux' non-standard behavior. - // "Linux accept() passes already-pending network errors on the new socket as an error code from accept(). This behavior differs from other BSD socket implementations." - #[cfg(target_os = "linux")] - Some( - Errno::CONNRESET - | Errno::NETRESET - | Errno::HOSTUNREACH - | Errno::HOSTDOWN - | Errno::NETDOWN - | Errno::NETUNREACH - | Errno::PROTO - | Errno::NOPROTOOPT - | Errno::NONET - | Errno::OPNOTSUPP, - ) => Errno::CONNABORTED.into(), - - _ => error, - }) + pub fn udp_bind(sockfd: Fd, addr: &SocketAddr) -> rustix::io::Result<()> { + rustix::net::bind(sockfd, addr).map_err(|error| match error { + // See: https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-bind#:~:text=WSAENOBUFS + // Windows returns WSAENOBUFS when the ephemeral ports have been exhausted. + #[cfg(windows)] + Errno::NOBUFS => Errno::ADDRINUSE, + _ => error, + }) } pub fn udp_disconnect(sockfd: Fd) -> rustix::io::Result<()> { match rustix::net::connect_unspec(sockfd) { // BSD platforms return an error even if the UDP socket was disconnected successfully. + // + // MacOS was kind enough to document this: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/connect.2.html + // > Datagram sockets may dissolve the association by connecting to an + // > invalid address, such as a null address or an address with the address + // > family set to AF_UNSPEC (the error EAFNOSUPPORT will be harmlessly + // > returned). + // + // ... except that this appears to be incomplete, because experiments + // have shown that MacOS actually returns EINVAL, depending on the + // address family of the socket. #[cfg(target_os = "macos")] Err(Errno::INVAL | Errno::AFNOSUPPORT) => Ok(()), r => r, } } + // Even though SO_REUSEADDR is a SOL_* level option, this function contain a + // compatibility fix specific to TCP. That's why it contains the `_tcp_` infix instead of `_socket_`. + #[allow(unused_variables)] // Parameters are not used on Windows + pub fn set_tcp_reuseaddr(sockfd: Fd, value: bool) -> rustix::io::Result<()> { + // When a TCP socket is closed, the system may + // temporarily reserve that specific address+port pair in a so called + // TIME_WAIT state. During that period, any attempt to rebind to that pair + // will fail. Setting SO_REUSEADDR to true bypasses that behaviour. Unlike + // the name "SO_REUSEADDR" might suggest, it does not allow multiple + // active sockets to share the same local address. + + // On Windows that behavior is the default, so there is no need to manually + // configure such an option. But (!), Windows _does_ have an identically + // named socket option which allows users to "hijack" active sockets. + // This is definitely not what we want to do here. + + // Microsoft's own documentation[1] states that we should set SO_EXCLUSIVEADDRUSE + // instead (to the inverse value), however the github issue below[2] seems + // to indicate that that may no longer be correct. + // [1]: https://docs.microsoft.com/en-us/windows/win32/winsock/using-so-reuseaddr-and-so-exclusiveaddruse + // [2]: https://github.com/python-trio/trio/issues/928 + + #[cfg(not(windows))] + sockopt::set_socket_reuseaddr(sockfd, value)?; + + Ok(()) + } + pub fn set_tcp_keepidle(sockfd: Fd, value: Duration) -> rustix::io::Result<()> { if value <= Duration::ZERO { + // WIT: "If the provided value is 0, an `invalid-argument` error is returned." return Err(Errno::INVAL); } @@ -391,6 +388,7 @@ pub(crate) mod util { pub fn set_tcp_keepintvl(sockfd: Fd, value: Duration) -> rustix::io::Result<()> { if value <= Duration::ZERO { + // WIT: "If the provided value is 0, an `invalid-argument` error is returned." return Err(Errno::INVAL); } @@ -408,6 +406,7 @@ pub(crate) mod util { pub fn set_tcp_keepcnt(sockfd: Fd, value: u32) -> rustix::io::Result<()> { if value == 0 { + // WIT: "If the provided value is 0, an `invalid-argument` error is returned." return Err(Errno::INVAL); } @@ -430,6 +429,8 @@ pub(crate) mod util { pub fn set_ip_ttl(sockfd: Fd, value: u8) -> rustix::io::Result<()> { match value { + // WIT: "If the provided value is 0, an `invalid-argument` error is returned." + // // A well-behaved IP application should never send out new packets with TTL 0. // We validate the value ourselves because OS'es are not consistent in this. // On Linux the validation is even inconsistent between their IPv4 and IPv6 implementation. @@ -440,10 +441,7 @@ pub(crate) mod util { pub fn set_ipv6_unicast_hops(sockfd: Fd, value: u8) -> rustix::io::Result<()> { match value { - // A well-behaved IP application should never send out new packets with TTL 0. - // We validate the value ourselves because OS'es are not consistent in this. - // On Linux the validation is even inconsistent between their IPv4 and IPv6 implementation. - 0 => Err(Errno::INVAL), + 0 => Err(Errno::INVAL), // See `set_ip_ttl` _ => sockopt::set_ipv6_unicast_hops(sockfd, Some(value)), } } @@ -453,6 +451,8 @@ pub(crate) mod util { // Linux doubles the value passed to setsockopt to allow space for bookkeeping overhead. // getsockopt returns this internally doubled value. // We'll half the value to at least get it back into the same ballpark that the application requested it in. + // + // This normalized behavior is tested for in: test-programs/src/bin/preview2_tcp_sockopts.rs value / 2 } else { value @@ -478,6 +478,7 @@ pub(crate) mod util { value: usize, ) -> rustix::io::Result<()> { if value == 0 { + // WIT: "If the provided value is 0, an `invalid-argument` error is returned." return Err(Errno::INVAL); } @@ -492,6 +493,8 @@ pub(crate) mod util { // "performance hint" semantics. In other words; even ENOBUFS is "Ok". // A future improvement could be to query the corresponding sysctl on *BSD platforms and clamp the input // `size` ourselves, to completely close the gap with other platforms. + // + // This normalized behavior is tested for in: test-programs/src/bin/preview2_tcp_sockopts.rs Err(Errno::NOBUFS) => Ok(()), r => r, } @@ -502,6 +505,7 @@ pub(crate) mod util { value: usize, ) -> rustix::io::Result<()> { if value == 0 { + // WIT: "If the provided value is 0, an `invalid-argument` error is returned." return Err(Errno::INVAL); } diff --git a/crates/wasi/src/preview2/host/random.rs b/crates/wasi/src/preview2/host/random.rs index d2483b39f9b9..583ff8e98ebd 100644 --- a/crates/wasi/src/preview2/host/random.rs +++ b/crates/wasi/src/preview2/host/random.rs @@ -4,33 +4,33 @@ use cap_rand::{distributions::Standard, Rng}; impl random::Host for T { fn get_random_bytes(&mut self, len: u64) -> anyhow::Result> { - Ok((&mut self.ctx_mut().random) + Ok((&mut self.ctx().random) .sample_iter(Standard) .take(len as usize) .collect()) } fn get_random_u64(&mut self) -> anyhow::Result { - Ok(self.ctx_mut().random.sample(Standard)) + Ok(self.ctx().random.sample(Standard)) } } impl insecure::Host for T { fn get_insecure_random_bytes(&mut self, len: u64) -> anyhow::Result> { - Ok((&mut self.ctx_mut().insecure_random) + Ok((&mut self.ctx().insecure_random) .sample_iter(Standard) .take(len as usize) .collect()) } fn get_insecure_random_u64(&mut self) -> anyhow::Result { - Ok(self.ctx_mut().insecure_random.sample(Standard)) + Ok(self.ctx().insecure_random.sample(Standard)) } } impl insecure_seed::Host for T { fn insecure_seed(&mut self) -> anyhow::Result<(u64, u64)> { - let seed: u128 = self.ctx_mut().insecure_random_seed; + let seed: u128 = self.ctx().insecure_random_seed; Ok((seed as u64, (seed >> 64) as u64)) } } diff --git a/crates/wasi/src/preview2/host/tcp.rs b/crates/wasi/src/preview2/host/tcp.rs index 1c805467b15d..5780ed864f83 100644 --- a/crates/wasi/src/preview2/host/tcp.rs +++ b/crates/wasi/src/preview2/host/tcp.rs @@ -1,5 +1,6 @@ use crate::preview2::host::network::util; -use crate::preview2::tcp::{TcpSocket, TcpState}; +use crate::preview2::network::SocketAddrUse; +use crate::preview2::tcp::{TcpReadStream, TcpSocket, TcpState, TcpWriteStream}; use crate::preview2::{ bindings::{ io::streams::{InputStream, OutputStream}, @@ -8,15 +9,14 @@ use crate::preview2::{ }, network::SocketAddressFamily, }; -use crate::preview2::{Pollable, SocketResult, WasiView}; -use cap_net_ext::{Blocking, PoolExt, TcpListenerExt}; -use cap_std::net::TcpListener; +use crate::preview2::{with_ambient_tokio_runtime, Pollable, SocketResult, WasiView}; use io_lifetimes::AsSocketlike; use rustix::io::Errno; use rustix::net::sockopt; use std::net::SocketAddr; +use std::sync::Arc; +use std::task::Poll; use std::time::Duration; -use tokio::io::Interest; use wasmtime::component::Resource; impl tcp::Host for T {} @@ -28,49 +28,79 @@ impl crate::preview2::host::tcp::tcp::HostTcpSocket for T { network: Resource, local_address: IpSocketAddress, ) -> SocketResult<()> { - let table = self.table_mut(); + self.ctx().allowed_network_uses.check_allowed_tcp()?; + let table = self.table(); let socket = table.get(&this)?; let network = table.get(&network)?; let local_address: SocketAddr = local_address.into(); - match socket.tcp_state { - TcpState::Default => {} - TcpState::BindStarted => return Err(ErrorCode::ConcurrencyConflict.into()), + let tokio_socket = match &socket.tcp_state { + TcpState::Default(socket) => socket, + TcpState::BindStarted(..) => return Err(ErrorCode::ConcurrencyConflict.into()), _ => return Err(ErrorCode::InvalidState.into()), - } + }; util::validate_unicast(&local_address)?; util::validate_address_family(&local_address, &socket.family)?; { - let binder = network.pool.tcp_binder(local_address)?; - let listener = &*socket.tcp_socket().as_socketlike_view::(); + // Ensure that we're allowed to connect to this address. + network.check_socket_addr(&local_address, SocketAddrUse::TcpBind)?; + + // Automatically bypass the TIME_WAIT state when the user is trying + // to bind to a specific port: + let reuse_addr = local_address.port() > 0; + + // Unconditionally (re)set SO_REUSEADDR, even when the value is false. + // This ensures we're not accidentally affected by any socket option + // state left behind by a previous failed call to this method (start_bind). + util::set_tcp_reuseaddr(&tokio_socket, reuse_addr)?; // Perform the OS bind call. - util::tcp_bind(listener, &binder).map_err(|error| { + tokio_socket.bind(local_address).map_err(|error| { match Errno::from_io_error(&error) { - Some(Errno::AFNOSUPPORT) => ErrorCode::InvalidArgument, // Just in case our own validations weren't sufficient. + // From https://pubs.opengroup.org/onlinepubs/9699919799/functions/bind.html: + // > [EAFNOSUPPORT] The specified address is not a valid address for the address family of the specified socket + // + // The most common reasons for this error should have already + // been handled by our own validation slightly higher up in this + // function. This error mapping is here just in case there is + // an edge case we didn't catch. + Some(Errno::AFNOSUPPORT) => ErrorCode::InvalidArgument, + + // See: https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-bind#:~:text=WSAENOBUFS + // Windows returns WSAENOBUFS when the ephemeral ports have been exhausted. + #[cfg(windows)] + Some(Errno::NOBUFS) => ErrorCode::AddressInUse, + _ => ErrorCode::from(error), } })?; } let socket = table.get_mut(&this)?; - socket.tcp_state = TcpState::BindStarted; + + socket.tcp_state = match std::mem::replace(&mut socket.tcp_state, TcpState::Closed) { + TcpState::Default(socket) => TcpState::BindStarted(socket), + _ => unreachable!(), + }; Ok(()) } fn finish_bind(&mut self, this: Resource) -> SocketResult<()> { - let table = self.table_mut(); + let table = self.table(); let socket = table.get_mut(&this)?; match socket.tcp_state { - TcpState::BindStarted => {} + TcpState::BindStarted(..) => {} _ => return Err(ErrorCode::NotInProgress.into()), } - socket.tcp_state = TcpState::Bound; + socket.tcp_state = match std::mem::replace(&mut socket.tcp_state, TcpState::Closed) { + TcpState::BindStarted(socket) => TcpState::Bound(socket), + _ => unreachable!(), + }; Ok(()) } @@ -81,55 +111,39 @@ impl crate::preview2::host::tcp::tcp::HostTcpSocket for T { network: Resource, remote_address: IpSocketAddress, ) -> SocketResult<()> { - let table = self.table_mut(); - let r = { - let socket = table.get(&this)?; - let network = table.get(&network)?; - let remote_address: SocketAddr = remote_address.into(); - - match socket.tcp_state { - TcpState::Default => {} - TcpState::Bound - | TcpState::Connected - | TcpState::ConnectFailed - | TcpState::Listening => return Err(ErrorCode::InvalidState.into()), - TcpState::Connecting - | TcpState::ConnectReady - | TcpState::ListenStarted - | TcpState::BindStarted => return Err(ErrorCode::ConcurrencyConflict.into()), - } + self.ctx().allowed_network_uses.check_allowed_tcp()?; + let table = self.table(); + let socket = table.get(&this)?; + let network = table.get(&network)?; + let remote_address: SocketAddr = remote_address.into(); - util::validate_unicast(&remote_address)?; - util::validate_remote_address(&remote_address)?; - util::validate_address_family(&remote_address, &socket.family)?; + match socket.tcp_state { + TcpState::Default(..) => {} - let connecter = network.pool.tcp_connecter(remote_address)?; - let listener = &*socket.tcp_socket().as_socketlike_view::(); + TcpState::Connecting(..) | TcpState::ConnectReady(..) => { + return Err(ErrorCode::ConcurrencyConflict.into()) + } - // Do an OS `connect`. Our socket is non-blocking, so it'll either... - util::tcp_connect(listener, &connecter) + _ => return Err(ErrorCode::InvalidState.into()), }; - match r { - // succeed immediately, - Ok(()) => { - let socket = table.get_mut(&this)?; - socket.tcp_state = TcpState::ConnectReady; - return Ok(()); - } - // continue in progress, - Err(err) if Errno::from_io_error(&err) == Some(Errno::INPROGRESS) => {} - // or fail immediately. - Err(err) => { - return Err(match Errno::from_io_error(&err) { - Some(Errno::AFNOSUPPORT) => ErrorCode::InvalidArgument.into(), // Just in case our own validations weren't sufficient. - _ => err.into(), - }); - } - } + util::validate_unicast(&remote_address)?; + util::validate_remote_address(&remote_address)?; + util::validate_address_family(&remote_address, &socket.family)?; + + // Ensure that we're allowed to connect to this address. + network.check_socket_addr(&remote_address, SocketAddrUse::TcpConnect)?; let socket = table.get_mut(&this)?; - socket.tcp_state = TcpState::Connecting; + let TcpState::Default(tokio_socket) = + std::mem::replace(&mut socket.tcp_state, TcpState::Closed) + else { + unreachable!(); + }; + + let future = tokio_socket.connect(remote_address); + + socket.tcp_state = TcpState::Connecting(Box::pin(future)); Ok(()) } @@ -138,89 +152,111 @@ impl crate::preview2::host::tcp::tcp::HostTcpSocket for T { &mut self, this: Resource, ) -> SocketResult<(Resource, Resource)> { - let table = self.table_mut(); + let table = self.table(); let socket = table.get_mut(&this)?; - match socket.tcp_state { - TcpState::ConnectReady => {} - TcpState::Connecting => { - // Do a `poll` to test for completion, using a timeout of zero - // to avoid blocking. - match rustix::event::poll( - &mut [rustix::event::PollFd::new( - socket.tcp_socket(), - rustix::event::PollFlags::OUT, - )], - 0, - ) { - Ok(0) => return Err(ErrorCode::WouldBlock.into()), - Ok(_) => (), - Err(err) => Err(err).unwrap(), - } - - // Check whether the connect succeeded. - match sockopt::get_socket_error(socket.tcp_socket()) { - Ok(Ok(())) => {} - Err(err) | Ok(Err(err)) => { - socket.tcp_state = TcpState::ConnectFailed; - return Err(err.into()); + let previous_state = std::mem::replace(&mut socket.tcp_state, TcpState::Closed); + let result = match previous_state { + TcpState::ConnectReady(result) => result, + TcpState::Connecting(mut future) => { + let mut cx = std::task::Context::from_waker(futures::task::noop_waker_ref()); + match with_ambient_tokio_runtime(|| future.as_mut().poll(&mut cx)) { + Poll::Ready(result) => result, + Poll::Pending => { + socket.tcp_state = TcpState::Connecting(future); + return Err(ErrorCode::WouldBlock.into()); } } } - _ => return Err(ErrorCode::NotInProgress.into()), + previous_state => { + socket.tcp_state = previous_state; + return Err(ErrorCode::NotInProgress.into()); + } }; - socket.tcp_state = TcpState::Connected; - let (input, output) = socket.as_split(); - let input_stream = self.table_mut().push_child(input, &this)?; - let output_stream = self.table_mut().push_child(output, &this)?; + match result { + Ok(stream) => { + let stream = Arc::new(stream); + + let input: InputStream = + InputStream::Host(Box::new(TcpReadStream::new(stream.clone()))); + let output: OutputStream = Box::new(TcpWriteStream::new(stream.clone())); - Ok((input_stream, output_stream)) + let input_stream = self.table().push_child(input, &this)?; + let output_stream = self.table().push_child(output, &this)?; + + let socket = self.table().get_mut(&this)?; + socket.tcp_state = TcpState::Connected(stream); + Ok((input_stream, output_stream)) + } + Err(err) => { + socket.tcp_state = TcpState::Closed; + Err(err.into()) + } + } } fn start_listen(&mut self, this: Resource) -> SocketResult<()> { - let table = self.table_mut(); + self.ctx().allowed_network_uses.check_allowed_tcp()?; + let table = self.table(); let socket = table.get_mut(&this)?; - match socket.tcp_state { - TcpState::Bound => {} - TcpState::Default - | TcpState::Connected - | TcpState::ConnectFailed - | TcpState::Listening => return Err(ErrorCode::InvalidState.into()), - TcpState::ListenStarted - | TcpState::Connecting - | TcpState::ConnectReady - | TcpState::BindStarted => return Err(ErrorCode::ConcurrencyConflict.into()), + match std::mem::replace(&mut socket.tcp_state, TcpState::Closed) { + TcpState::Bound(tokio_socket) => { + socket.tcp_state = TcpState::ListenStarted(tokio_socket); + Ok(()) + } + TcpState::ListenStarted(tokio_socket) => { + socket.tcp_state = TcpState::ListenStarted(tokio_socket); + Err(ErrorCode::ConcurrencyConflict.into()) + } + previous_state => { + socket.tcp_state = previous_state; + Err(ErrorCode::InvalidState.into()) + } } - - socket - .tcp_socket() - .as_socketlike_view::() - .listen(socket.listen_backlog_size) - .map_err(|error| match Errno::from_io_error(&error) { - #[cfg(windows)] - Some(Errno::MFILE) => ErrorCode::OutOfMemory, // We're not trying to create a new socket. Rewrite it to less surprising error code. - _ => ErrorCode::from(error), - })?; - - socket.tcp_state = TcpState::ListenStarted; - - Ok(()) } fn finish_listen(&mut self, this: Resource) -> SocketResult<()> { - let table = self.table_mut(); + let table = self.table(); let socket = table.get_mut(&this)?; - match socket.tcp_state { - TcpState::ListenStarted => {} - _ => return Err(ErrorCode::NotInProgress.into()), - } + let tokio_socket = match std::mem::replace(&mut socket.tcp_state, TcpState::Closed) { + TcpState::ListenStarted(tokio_socket) => tokio_socket, + previous_state => { + socket.tcp_state = previous_state; + return Err(ErrorCode::NotInProgress.into()); + } + }; - socket.tcp_state = TcpState::Listening; + match with_ambient_tokio_runtime(|| tokio_socket.listen(socket.listen_backlog_size)) { + Ok(listener) => { + socket.tcp_state = TcpState::Listening { + listener, + pending_accept: None, + }; + Ok(()) + } + Err(err) => { + socket.tcp_state = TcpState::Closed; + + Err(match Errno::from_io_error(&err) { + // See: https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-listen#:~:text=WSAEMFILE + // According to the docs, `listen` can return EMFILE on Windows. + // This is odd, because we're not trying to create a new socket + // or file descriptor of any kind. So we rewrite it to less + // surprising error code. + // + // At the time of writing, this behavior has never been experimentally + // observed by any of the wasmtime authors, so we're relying fully + // on Microsoft's documentation here. + #[cfg(windows)] + Some(Errno::MFILE) => Errno::NOBUFS.into(), - Ok(()) + _ => err.into(), + }) + } + } } fn accept( @@ -231,19 +267,63 @@ impl crate::preview2::host::tcp::tcp::HostTcpSocket for T { Resource, Resource, )> { + self.ctx().allowed_network_uses.check_allowed_tcp()?; let table = self.table(); - let socket = table.get(&this)?; + let socket = table.get_mut(&this)?; - match socket.tcp_state { - TcpState::Listening => {} - _ => return Err(ErrorCode::InvalidState.into()), - } + let TcpState::Listening { + listener, + pending_accept, + } = &mut socket.tcp_state + else { + return Err(ErrorCode::InvalidState.into()); + }; + + let result = match pending_accept.take() { + Some(result) => result, + None => { + let mut cx = std::task::Context::from_waker(futures::task::noop_waker_ref()); + match with_ambient_tokio_runtime(|| listener.poll_accept(&mut cx)) + .map_ok(|(stream, _)| stream) + { + Poll::Ready(result) => result, + Poll::Pending => Err(Errno::WOULDBLOCK.into()), + } + } + }; - // Do the OS accept call. - let tcp_socket = socket.tcp_socket(); - let (connection, _addr) = tcp_socket.try_io(Interest::READABLE, || { - let listener = &*tcp_socket.as_socketlike_view::(); - util::tcp_accept(listener, Blocking::No) + let client = result.map_err(|err| match Errno::from_io_error(&err) { + // From: https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-accept#:~:text=WSAEINPROGRESS + // > WSAEINPROGRESS: A blocking Windows Sockets 1.1 call is in progress, + // > or the service provider is still processing a callback function. + // + // wasi-sockets doesn't have an equivalent to the EINPROGRESS error, + // because in POSIX this error is only returned by a non-blocking + // `connect` and wasi-sockets has a different solution for that. + #[cfg(windows)] + Some(Errno::INPROGRESS) => Errno::INTR.into(), + + // Normalize Linux' non-standard behavior. + // + // From https://man7.org/linux/man-pages/man2/accept.2.html: + // > Linux accept() passes already-pending network errors on the + // > new socket as an error code from accept(). This behavior + // > differs from other BSD socket implementations. (...) + #[cfg(target_os = "linux")] + Some( + Errno::CONNRESET + | Errno::NETRESET + | Errno::HOSTUNREACH + | Errno::HOSTDOWN + | Errno::NETDOWN + | Errno::NETUNREACH + | Errno::PROTO + | Errno::NOPROTOOPT + | Errno::NONET + | Errno::OPNOTSUPP, + ) => Errno::CONNABORTED.into(), + + _ => err, })?; #[cfg(target_os = "macos")] @@ -253,35 +333,32 @@ impl crate::preview2::host::tcp::tcp::HostTcpSocket for T { // and only if a specific value was explicitly set on the listener. if let Some(size) = socket.receive_buffer_size { - _ = util::set_socket_recv_buffer_size(&connection, size); // Ignore potential error. + _ = util::set_socket_recv_buffer_size(&client, size); // Ignore potential error. } if let Some(size) = socket.send_buffer_size { - _ = util::set_socket_send_buffer_size(&connection, size); // Ignore potential error. + _ = util::set_socket_send_buffer_size(&client, size); // Ignore potential error. } // For some reason, IP_TTL is inherited, but IPV6_UNICAST_HOPS isn't. - if let (SocketAddressFamily::Ipv6 { .. }, Some(ttl)) = (socket.family, socket.hop_limit) - { - _ = util::set_ipv6_unicast_hops(&connection, ttl); // Ignore potential error. + if let (SocketAddressFamily::Ipv6, Some(ttl)) = (socket.family, socket.hop_limit) { + _ = util::set_ipv6_unicast_hops(&client, ttl); // Ignore potential error. } if let Some(value) = socket.keep_alive_idle_time { - _ = util::set_tcp_keepidle(&connection, value); // Ignore potential error. + _ = util::set_tcp_keepidle(&client, value); // Ignore potential error. } } - let mut tcp_socket = TcpSocket::from_tcp_stream(connection, socket.family)?; + let client = Arc::new(client); - // Mark the socket as connected so that we can exit early from methods like `start-bind`. - tcp_socket.tcp_state = TcpState::Connected; + let input: InputStream = InputStream::Host(Box::new(TcpReadStream::new(client.clone()))); + let output: OutputStream = Box::new(TcpWriteStream::new(client.clone())); + let tcp_socket = TcpSocket::from_state(TcpState::Connected(client), socket.family)?; - let (input, output) = tcp_socket.as_split(); - let output: OutputStream = output; - - let tcp_socket = self.table_mut().push(tcp_socket)?; - let input_stream = self.table_mut().push_child(input, &tcp_socket)?; - let output_stream = self.table_mut().push_child(output, &tcp_socket)?; + let tcp_socket = self.table().push(tcp_socket)?; + let input_stream = self.table().push_child(input, &tcp_socket)?; + let output_stream = self.table().push_child(output, &tcp_socket)?; Ok((tcp_socket, input_stream, output_stream)) } @@ -290,36 +367,28 @@ impl crate::preview2::host::tcp::tcp::HostTcpSocket for T { let table = self.table(); let socket = table.get(&this)?; - match socket.tcp_state { - TcpState::Default => return Err(ErrorCode::InvalidState.into()), - TcpState::BindStarted => return Err(ErrorCode::ConcurrencyConflict.into()), - _ => {} - } + let view = match socket.tcp_state { + TcpState::Default(..) => return Err(ErrorCode::InvalidState.into()), + TcpState::BindStarted(..) => return Err(ErrorCode::ConcurrencyConflict.into()), + _ => socket.as_std_view()?, + }; - let addr = socket - .tcp_socket() - .as_socketlike_view::() - .local_addr()?; - Ok(addr.into()) + Ok(view.local_addr()?.into()) } fn remote_address(&mut self, this: Resource) -> SocketResult { let table = self.table(); let socket = table.get(&this)?; - match socket.tcp_state { - TcpState::Connected => {} - TcpState::Connecting | TcpState::ConnectReady => { + let view = match socket.tcp_state { + TcpState::Connected(..) => socket.as_std_view()?, + TcpState::Connecting(..) | TcpState::ConnectReady(..) => { return Err(ErrorCode::ConcurrencyConflict.into()) } _ => return Err(ErrorCode::InvalidState.into()), - } + }; - let addr = socket - .tcp_socket() - .as_socketlike_view::() - .peer_addr()?; - Ok(addr.into()) + Ok(view.peer_addr()?.into()) } fn is_listening(&mut self, this: Resource) -> Result { @@ -327,7 +396,7 @@ impl crate::preview2::host::tcp::tcp::HostTcpSocket for T { let socket = table.get(&this)?; match socket.tcp_state { - TcpState::Listening => Ok(true), + TcpState::Listening { .. } => Ok(true), _ => Ok(false), } } @@ -341,38 +410,7 @@ impl crate::preview2::host::tcp::tcp::HostTcpSocket for T { match socket.family { SocketAddressFamily::Ipv4 => Ok(IpAddressFamily::Ipv4), - SocketAddressFamily::Ipv6 { .. } => Ok(IpAddressFamily::Ipv6), - } - } - - fn ipv6_only(&mut self, this: Resource) -> SocketResult { - let table = self.table(); - let socket = table.get(&this)?; - - // Instead of just calling the OS we return our own internal state, because - // MacOS doesn't propagate the V6ONLY state on to accepted client sockets. - - match socket.family { - SocketAddressFamily::Ipv4 => Err(ErrorCode::NotSupported.into()), - SocketAddressFamily::Ipv6 { v6only } => Ok(v6only), - } - } - - fn set_ipv6_only(&mut self, this: Resource, value: bool) -> SocketResult<()> { - let table = self.table_mut(); - let socket = table.get_mut(&this)?; - - match socket.family { - SocketAddressFamily::Ipv4 => Err(ErrorCode::NotSupported.into()), - SocketAddressFamily::Ipv6 { .. } => match socket.tcp_state { - TcpState::Default => { - sockopt::set_ipv6_v6only(socket.tcp_socket(), value)?; - socket.family = SocketAddressFamily::Ipv6 { v6only: value }; - Ok(()) - } - TcpState::BindStarted => Err(ErrorCode::ConcurrencyConflict.into()), - _ => Err(ErrorCode::InvalidState.into()), - }, + SocketAddressFamily::Ipv6 => Ok(IpAddressFamily::Ipv6), } } @@ -381,10 +419,10 @@ impl crate::preview2::host::tcp::tcp::HostTcpSocket for T { this: Resource, value: u64, ) -> SocketResult<()> { - const MIN_BACKLOG: i32 = 1; - const MAX_BACKLOG: i32 = i32::MAX; // OS'es will most likely limit it down even further. + const MIN_BACKLOG: u32 = 1; + const MAX_BACKLOG: u32 = i32::MAX as u32; // OS'es will most likely limit it down even further. - let table = self.table_mut(); + let table = self.table(); let socket = table.get_mut(&this)?; if value == 0 { @@ -394,38 +432,36 @@ impl crate::preview2::host::tcp::tcp::HostTcpSocket for T { // Silently clamp backlog size. This is OK for us to do, because operating systems do this too. let value = value .try_into() - .unwrap_or(i32::MAX) + .unwrap_or(u32::MAX) .clamp(MIN_BACKLOG, MAX_BACKLOG); - match socket.tcp_state { - TcpState::Default | TcpState::BindStarted | TcpState::Bound => { + match &socket.tcp_state { + TcpState::Default(..) | TcpState::Bound(..) => { // Socket not listening yet. Stash value for first invocation to `listen`. - socket.listen_backlog_size = Some(value); + socket.listen_backlog_size = value; Ok(()) } - TcpState::Listening => { + TcpState::Listening { listener, .. } => { // Try to update the backlog by calling `listen` again. // Not all platforms support this. We'll only update our own value if the OS supports changing the backlog size after the fact. - rustix::net::listen(socket.tcp_socket(), value) + rustix::net::listen(&listener, value.try_into().unwrap()) .map_err(|_| ErrorCode::NotSupported)?; - socket.listen_backlog_size = Some(value); + socket.listen_backlog_size = value; Ok(()) } - TcpState::Connected | TcpState::ConnectFailed => Err(ErrorCode::InvalidState.into()), - TcpState::Connecting | TcpState::ConnectReady | TcpState::ListenStarted => { - Err(ErrorCode::ConcurrencyConflict.into()) - } + _ => Err(ErrorCode::InvalidState.into()), } } fn keep_alive_enabled(&mut self, this: Resource) -> SocketResult { let table = self.table(); let socket = table.get(&this)?; - Ok(sockopt::get_socket_keepalive(socket.tcp_socket())?) + let view = &*socket.as_std_view()?; + Ok(sockopt::get_socket_keepalive(view)?) } fn set_keep_alive_enabled( @@ -435,13 +471,15 @@ impl crate::preview2::host::tcp::tcp::HostTcpSocket for T { ) -> SocketResult<()> { let table = self.table(); let socket = table.get(&this)?; - Ok(sockopt::set_socket_keepalive(socket.tcp_socket(), value)?) + let view = &*socket.as_std_view()?; + Ok(sockopt::set_socket_keepalive(view, value)?) } fn keep_alive_idle_time(&mut self, this: Resource) -> SocketResult { let table = self.table(); let socket = table.get(&this)?; - Ok(sockopt::get_tcp_keepidle(socket.tcp_socket())?.as_nanos() as u64) + let view = &*socket.as_std_view()?; + Ok(sockopt::get_tcp_keepidle(view)?.as_nanos() as u64) } fn set_keep_alive_idle_time( @@ -449,12 +487,14 @@ impl crate::preview2::host::tcp::tcp::HostTcpSocket for T { this: Resource, value: u64, ) -> SocketResult<()> { - let table = self.table_mut(); + let table = self.table(); let socket = table.get_mut(&this)?; - let duration = Duration::from_nanos(value); + { + let view = &*socket.as_std_view()?; - util::set_tcp_keepidle(socket.tcp_socket(), duration)?; + util::set_tcp_keepidle(view, duration)?; + } #[cfg(target_os = "macos")] { @@ -467,7 +507,8 @@ impl crate::preview2::host::tcp::tcp::HostTcpSocket for T { fn keep_alive_interval(&mut self, this: Resource) -> SocketResult { let table = self.table(); let socket = table.get(&this)?; - Ok(sockopt::get_tcp_keepintvl(socket.tcp_socket())?.as_nanos() as u64) + let view = &*socket.as_std_view()?; + Ok(sockopt::get_tcp_keepintvl(view)?.as_nanos() as u64) } fn set_keep_alive_interval( @@ -477,16 +518,15 @@ impl crate::preview2::host::tcp::tcp::HostTcpSocket for T { ) -> SocketResult<()> { let table = self.table(); let socket = table.get(&this)?; - Ok(util::set_tcp_keepintvl( - socket.tcp_socket(), - Duration::from_nanos(value), - )?) + let view = &*socket.as_std_view()?; + Ok(util::set_tcp_keepintvl(view, Duration::from_nanos(value))?) } fn keep_alive_count(&mut self, this: Resource) -> SocketResult { let table = self.table(); let socket = table.get(&this)?; - Ok(sockopt::get_tcp_keepcnt(socket.tcp_socket())?) + let view = &*socket.as_std_view()?; + Ok(sockopt::get_tcp_keepcnt(view)?) } fn set_keep_alive_count( @@ -496,29 +536,32 @@ impl crate::preview2::host::tcp::tcp::HostTcpSocket for T { ) -> SocketResult<()> { let table = self.table(); let socket = table.get(&this)?; - Ok(util::set_tcp_keepcnt(socket.tcp_socket(), value)?) + let view = &*socket.as_std_view()?; + Ok(util::set_tcp_keepcnt(view, value)?) } fn hop_limit(&mut self, this: Resource) -> SocketResult { let table = self.table(); let socket = table.get(&this)?; + let view = &*socket.as_std_view()?; let ttl = match socket.family { - SocketAddressFamily::Ipv4 => util::get_ip_ttl(socket.tcp_socket())?, - SocketAddressFamily::Ipv6 { .. } => util::get_ipv6_unicast_hops(socket.tcp_socket())?, + SocketAddressFamily::Ipv4 => util::get_ip_ttl(view)?, + SocketAddressFamily::Ipv6 => util::get_ipv6_unicast_hops(view)?, }; Ok(ttl) } fn set_hop_limit(&mut self, this: Resource, value: u8) -> SocketResult<()> { - let table = self.table_mut(); + let table = self.table(); let socket = table.get_mut(&this)?; + { + let view = &*socket.as_std_view()?; - match socket.family { - SocketAddressFamily::Ipv4 => util::set_ip_ttl(socket.tcp_socket(), value)?, - SocketAddressFamily::Ipv6 { .. } => { - util::set_ipv6_unicast_hops(socket.tcp_socket(), value)? + match socket.family { + SocketAddressFamily::Ipv4 => util::set_ip_ttl(view, value)?, + SocketAddressFamily::Ipv6 => util::set_ipv6_unicast_hops(view, value)?, } } @@ -533,8 +576,9 @@ impl crate::preview2::host::tcp::tcp::HostTcpSocket for T { fn receive_buffer_size(&mut self, this: Resource) -> SocketResult { let table = self.table(); let socket = table.get(&this)?; + let view = &*socket.as_std_view()?; - let value = util::get_socket_recv_buffer_size(socket.tcp_socket())?; + let value = util::get_socket_recv_buffer_size(view)?; Ok(value as u64) } @@ -543,11 +587,14 @@ impl crate::preview2::host::tcp::tcp::HostTcpSocket for T { this: Resource, value: u64, ) -> SocketResult<()> { - let table = self.table_mut(); + let table = self.table(); let socket = table.get_mut(&this)?; let value = value.try_into().unwrap_or(usize::MAX); + { + let view = &*socket.as_std_view()?; - util::set_socket_recv_buffer_size(socket.tcp_socket(), value)?; + util::set_socket_recv_buffer_size(view, value)?; + } #[cfg(target_os = "macos")] { @@ -560,8 +607,9 @@ impl crate::preview2::host::tcp::tcp::HostTcpSocket for T { fn send_buffer_size(&mut self, this: Resource) -> SocketResult { let table = self.table(); let socket = table.get(&this)?; + let view = &*socket.as_std_view()?; - let value = util::get_socket_send_buffer_size(socket.tcp_socket())?; + let value = util::get_socket_send_buffer_size(view)?; Ok(value as u64) } @@ -570,11 +618,14 @@ impl crate::preview2::host::tcp::tcp::HostTcpSocket for T { this: Resource, value: u64, ) -> SocketResult<()> { - let table = self.table_mut(); + let table = self.table(); let socket = table.get_mut(&this)?; let value = value.try_into().unwrap_or(usize::MAX); + { + let view = &*socket.as_std_view()?; - util::set_socket_send_buffer_size(socket.tcp_socket(), value)?; + util::set_socket_send_buffer_size(view, value)?; + } #[cfg(target_os = "macos")] { @@ -585,7 +636,7 @@ impl crate::preview2::host::tcp::tcp::HostTcpSocket for T { } fn subscribe(&mut self, this: Resource) -> anyhow::Result> { - crate::preview2::poll::subscribe(self.table_mut(), this) + crate::preview2::poll::subscribe(self.table(), this) } fn shutdown( @@ -596,13 +647,10 @@ impl crate::preview2::host::tcp::tcp::HostTcpSocket for T { let table = self.table(); let socket = table.get(&this)?; - match socket.tcp_state { - TcpState::Connected => {} - TcpState::Connecting | TcpState::ConnectReady => { - return Err(ErrorCode::ConcurrencyConflict.into()) - } + let stream = match &socket.tcp_state { + TcpState::Connected(stream) => stream, _ => return Err(ErrorCode::InvalidState.into()), - } + }; let how = match shutdown_type { ShutdownType::Receive => std::net::Shutdown::Read, @@ -610,15 +658,14 @@ impl crate::preview2::host::tcp::tcp::HostTcpSocket for T { ShutdownType::Both => std::net::Shutdown::Both, }; - socket - .tcp_socket() + stream .as_socketlike_view::() .shutdown(how)?; Ok(()) } fn drop(&mut self, this: Resource) -> Result<(), anyhow::Error> { - let table = self.table_mut(); + let table = self.table(); // As in the filesystem implementation, we assume closing a socket // doesn't block. diff --git a/crates/wasi/src/preview2/host/tcp_create_socket.rs b/crates/wasi/src/preview2/host/tcp_create_socket.rs index 3018ef709f8a..90991cb4b82d 100644 --- a/crates/wasi/src/preview2/host/tcp_create_socket.rs +++ b/crates/wasi/src/preview2/host/tcp_create_socket.rs @@ -9,7 +9,7 @@ impl tcp_create_socket::Host for T { address_family: IpAddressFamily, ) -> SocketResult> { let socket = TcpSocket::new(address_family.into())?; - let socket = self.table_mut().push(socket)?; + let socket = self.table().push(socket)?; Ok(socket) } } diff --git a/crates/wasi/src/preview2/host/udp.rs b/crates/wasi/src/preview2/host/udp.rs index 52a796f33585..a33340017195 100644 --- a/crates/wasi/src/preview2/host/udp.rs +++ b/crates/wasi/src/preview2/host/udp.rs @@ -1,5 +1,5 @@ use crate::preview2::host::network::util; -use crate::preview2::network::SocketAddressFamily; +use crate::preview2::network::{SocketAddrUse, SocketAddressFamily}; use crate::preview2::{ bindings::{ sockets::network::{ErrorCode, IpAddressFamily, IpSocketAddress, Network}, @@ -11,10 +11,8 @@ use crate::preview2::{ use crate::preview2::{Pollable, SocketError, SocketResult, WasiView}; use anyhow::anyhow; use async_trait::async_trait; -use cap_net_ext::PoolExt; use io_lifetimes::AsSocketlike; use rustix::io::Errno; -use rustix::net::sockopt; use std::net::SocketAddr; use tokio::io::Interest; use wasmtime::component::Resource; @@ -33,31 +31,41 @@ impl udp::HostUdpSocket for T { network: Resource, local_address: IpSocketAddress, ) -> SocketResult<()> { - let table = self.table_mut(); - let socket = table.get(&this)?; - let network = table.get(&network)?; - let local_address: SocketAddr = local_address.into(); + self.ctx().allowed_network_uses.check_allowed_udp()?; + let table = self.table(); - match socket.udp_state { + match table.get(&this)?.udp_state { UdpState::Default => {} UdpState::BindStarted => return Err(ErrorCode::ConcurrencyConflict.into()), UdpState::Bound | UdpState::Connected => return Err(ErrorCode::InvalidState.into()), } + // Set the socket addr check on the socket so later functions have access to it through the socket handle + let check = table.get(&network)?.socket_addr_check.clone(); + table + .get_mut(&this)? + .socket_addr_check + .replace(check.clone()); + + let socket = table.get(&this)?; + let local_address: SocketAddr = local_address.into(); + util::validate_address_family(&local_address, &socket.family)?; { - let binder = network.pool.udp_binder(local_address)?; - let udp_socket = &*socket - .udp_socket() - .as_socketlike_view::(); + check.check(&local_address, SocketAddrUse::UdpBind)?; // Perform the OS bind call. - util::udp_bind(udp_socket, &binder).map_err(|error| { - match Errno::from_io_error(&error) { - Some(Errno::AFNOSUPPORT) => ErrorCode::InvalidArgument, // Just in case our own validations weren't sufficient. - _ => ErrorCode::from(error), - } + util::udp_bind(socket.udp_socket(), &local_address).map_err(|error| match error { + // From https://pubs.opengroup.org/onlinepubs/9699919799/functions/bind.html: + // > [EAFNOSUPPORT] The specified address is not a valid address for the address family of the specified socket + // + // The most common reasons for this error should have already + // been handled by our own validation slightly higher up in this + // function. This error mapping is here just in case there is + // an edge case we didn't catch. + Errno::AFNOSUPPORT => ErrorCode::InvalidArgument, + _ => ErrorCode::from(error), })?; } @@ -68,7 +76,7 @@ impl udp::HostUdpSocket for T { } fn finish_bind(&mut self, this: Resource) -> SocketResult<()> { - let table = self.table_mut(); + let table = self.table(); let socket = table.get_mut(&this)?; match socket.udp_state { @@ -88,7 +96,7 @@ impl udp::HostUdpSocket for T { Resource, Resource, )> { - let table = self.table_mut(); + let table = self.table(); let has_active_streams = table .iter_children(&this)? @@ -120,12 +128,16 @@ impl udp::HostUdpSocket for T { // Step #2: (Re)connect if let Some(connect_addr) = remote_address { + let Some(check) = socket.socket_addr_check.as_ref() else { + return Err(ErrorCode::InvalidState.into()); + }; util::validate_remote_address(&connect_addr)?; util::validate_address_family(&connect_addr, &socket.family)?; + check.check(&connect_addr, SocketAddrUse::UdpConnect)?; rustix::net::connect(socket.udp_socket(), &connect_addr).map_err( |error| match error { - Errno::AFNOSUPPORT => ErrorCode::InvalidArgument, // Just in case our own validations weren't sufficient. + Errno::AFNOSUPPORT => ErrorCode::InvalidArgument, // See `bind` implementation. Errno::INPROGRESS => { log::debug!("UDP connect returned EINPROGRESS, which should never happen"); ErrorCode::Unknown @@ -145,11 +157,12 @@ impl udp::HostUdpSocket for T { remote_address, family: socket.family, send_state: SendState::Idle, + socket_addr_check: socket.socket_addr_check.clone(), }; Ok(( - self.table_mut().push_child(incoming_stream, &this)?, - self.table_mut().push_child(outgoing_stream, &this)?, + self.table().push_child(incoming_stream, &this)?, + self.table().push_child(outgoing_stream, &this)?, )) } @@ -195,35 +208,7 @@ impl udp::HostUdpSocket for T { match socket.family { SocketAddressFamily::Ipv4 => Ok(IpAddressFamily::Ipv4), - SocketAddressFamily::Ipv6 { .. } => Ok(IpAddressFamily::Ipv6), - } - } - - fn ipv6_only(&mut self, this: Resource) -> SocketResult { - let table = self.table(); - let socket = table.get(&this)?; - - match socket.family { - SocketAddressFamily::Ipv4 => Err(ErrorCode::NotSupported.into()), - SocketAddressFamily::Ipv6 { v6only } => Ok(v6only), - } - } - - fn set_ipv6_only(&mut self, this: Resource, value: bool) -> SocketResult<()> { - let table = self.table_mut(); - let socket = table.get_mut(&this)?; - - match socket.family { - SocketAddressFamily::Ipv4 => Err(ErrorCode::NotSupported.into()), - SocketAddressFamily::Ipv6 { .. } => match socket.udp_state { - UdpState::Default => { - sockopt::set_ipv6_v6only(socket.udp_socket(), value)?; - socket.family = SocketAddressFamily::Ipv6 { v6only: value }; - Ok(()) - } - UdpState::BindStarted => Err(ErrorCode::ConcurrencyConflict.into()), - _ => Err(ErrorCode::InvalidState.into()), - }, + SocketAddressFamily::Ipv6 => Ok(IpAddressFamily::Ipv6), } } @@ -233,7 +218,7 @@ impl udp::HostUdpSocket for T { let ttl = match socket.family { SocketAddressFamily::Ipv4 => util::get_ip_ttl(socket.udp_socket())?, - SocketAddressFamily::Ipv6 { .. } => util::get_ipv6_unicast_hops(socket.udp_socket())?, + SocketAddressFamily::Ipv6 => util::get_ipv6_unicast_hops(socket.udp_socket())?, }; Ok(ttl) @@ -249,9 +234,7 @@ impl udp::HostUdpSocket for T { match socket.family { SocketAddressFamily::Ipv4 => util::set_ip_ttl(socket.udp_socket(), value)?, - SocketAddressFamily::Ipv6 { .. } => { - util::set_ipv6_unicast_hops(socket.udp_socket(), value)? - } + SocketAddressFamily::Ipv6 => util::set_ipv6_unicast_hops(socket.udp_socket(), value)?, } Ok(()) @@ -300,11 +283,11 @@ impl udp::HostUdpSocket for T { } fn subscribe(&mut self, this: Resource) -> anyhow::Result> { - crate::preview2::poll::subscribe(self.table_mut(), this) + crate::preview2::poll::subscribe(self.table(), this) } fn drop(&mut self, this: Resource) -> Result<(), anyhow::Error> { - let table = self.table_mut(); + let table = self.table(); // As in the filesystem implementation, we assume closing a socket // doesn't block. @@ -337,7 +320,6 @@ impl udp::HostIncomingDatagramStream for T { _ => {} } - // FIXME: check permission to receive from `received_addr`. Ok(Some(udp::IncomingDatagram { data: buf[..size].into(), remote_address: received_addr.into(), @@ -381,11 +363,11 @@ impl udp::HostIncomingDatagramStream for T { &mut self, this: Resource, ) -> anyhow::Result> { - crate::preview2::poll::subscribe(self.table_mut(), this) + crate::preview2::poll::subscribe(self.table(), this) } fn drop(&mut self, this: Resource) -> Result<(), anyhow::Error> { - let table = self.table_mut(); + let table = self.table(); // As in the filesystem implementation, we assume closing a socket // doesn't block. @@ -409,7 +391,7 @@ impl Subscribe for IncomingDatagramStream { impl udp::HostOutgoingDatagramStream for T { fn check_send(&mut self, this: Resource) -> SocketResult { - let table = self.table_mut(); + let table = self.table(); let stream = table.get_mut(&this)?; let permit = match stream.send_state { @@ -440,7 +422,13 @@ impl udp::HostOutgoingDatagramStream for T { let provided_addr = datagram.remote_address.map(SocketAddr::from); let addr = match (stream.remote_address, provided_addr) { - (None, Some(addr)) => addr, + (None, Some(addr)) => { + let Some(check) = stream.socket_addr_check.as_ref() else { + return Err(ErrorCode::InvalidState.into()); + }; + check.check(&addr, SocketAddrUse::UdpOutgoingDatagram)?; + addr + } (Some(addr), None) => addr, (Some(connected_addr), Some(provided_addr)) if connected_addr == provided_addr => { connected_addr @@ -451,7 +439,6 @@ impl udp::HostOutgoingDatagramStream for T { util::validate_remote_address(&addr)?; util::validate_address_family(&addr, &stream.family)?; - // FIXME: check permission to send to `addr`. if stream.remote_address == Some(addr) { stream.inner.try_send(&datagram.data)?; } else { @@ -461,7 +448,7 @@ impl udp::HostOutgoingDatagramStream for T { Ok(()) } - let table = self.table_mut(); + let table = self.table(); let stream = table.get_mut(&this)?; match stream.send_state { @@ -510,11 +497,11 @@ impl udp::HostOutgoingDatagramStream for T { &mut self, this: Resource, ) -> anyhow::Result> { - crate::preview2::poll::subscribe(self.table_mut(), this) + crate::preview2::poll::subscribe(self.table(), this) } fn drop(&mut self, this: Resource) -> Result<(), anyhow::Error> { - let table = self.table_mut(); + let table = self.table(); // As in the filesystem implementation, we assume closing a socket // doesn't block. diff --git a/crates/wasi/src/preview2/host/udp_create_socket.rs b/crates/wasi/src/preview2/host/udp_create_socket.rs index 23edbddf949b..f087eb330334 100644 --- a/crates/wasi/src/preview2/host/udp_create_socket.rs +++ b/crates/wasi/src/preview2/host/udp_create_socket.rs @@ -9,7 +9,7 @@ impl udp_create_socket::Host for T { address_family: IpAddressFamily, ) -> SocketResult> { let socket = UdpSocket::new(address_family.into())?; - let socket = self.table_mut().push(socket)?; + let socket = self.table().push(socket)?; Ok(socket) } } diff --git a/crates/wasi/src/preview2/ip_name_lookup.rs b/crates/wasi/src/preview2/ip_name_lookup.rs index ab69f8f1bf9c..dd9243399956 100644 --- a/crates/wasi/src/preview2/ip_name_lookup.rs +++ b/crates/wasi/src/preview2/ip_name_lookup.rs @@ -34,7 +34,7 @@ impl Host for T { } let task = spawn_blocking(move || blocking_resolve(&host)); - let resource = self.table_mut().push(ResolveAddressStream::Waiting(task))?; + let resource = self.table().push(ResolveAddressStream::Waiting(task))?; Ok(resource) } } @@ -45,7 +45,7 @@ impl HostResolveAddressStream for T { &mut self, resource: Resource, ) -> Result, SocketError> { - let stream = self.table_mut().get_mut(&resource)?; + let stream: &mut ResolveAddressStream = self.table().get_mut(&resource)?; loop { match stream { ResolveAddressStream::Waiting(future) => { @@ -69,11 +69,11 @@ impl HostResolveAddressStream for T { &mut self, resource: Resource, ) -> Result> { - subscribe(self.table_mut(), resource) + subscribe(self.table(), resource) } fn drop(&mut self, resource: Resource) -> Result<()> { - self.table_mut().delete(resource)?; + self.table().delete(resource)?; Ok(()) } } diff --git a/crates/wasi/src/preview2/mod.rs b/crates/wasi/src/preview2/mod.rs index b01232ed6d12..16087504364c 100644 --- a/crates/wasi/src/preview2/mod.rs +++ b/crates/wasi/src/preview2/mod.rs @@ -30,11 +30,12 @@ mod network; pub mod pipe; mod poll; #[cfg(feature = "preview1-on-preview2")] +pub mod preview0; +#[cfg(feature = "preview1-on-preview2")] pub mod preview1; mod random; mod stdio; mod stream; -mod table; mod tcp; mod udp; mod write_stream; @@ -52,9 +53,9 @@ pub use self::stdio::{ pub use self::stream::{ HostInputStream, HostOutputStream, InputStream, OutputStream, StreamError, StreamResult, }; -pub use self::table::{Table, TableError}; pub use cap_fs_ext::SystemTimeSpec; pub use cap_rand::RngCore; +pub use wasmtime::component::{ResourceTable, ResourceTableError}; pub mod bindings { // Generate traits for synchronous bindings. @@ -68,9 +69,9 @@ pub mod bindings { wasmtime::component::bindgen!({ path: "wit", interfaces: " - import wasi:io/poll@0.2.0-rc-2023-11-10; - import wasi:io/streams@0.2.0-rc-2023-11-10; - import wasi:filesystem/types@0.2.0-rc-2023-11-10; + import wasi:io/poll@0.2.0; + import wasi:io/streams@0.2.0; + import wasi:filesystem/types@0.2.0; ", tracing: true, trappable_error_type: { @@ -93,7 +94,7 @@ pub mod bindings { wasmtime::component::bindgen!({ path: "wit", - world: "wasi:cli/reactor", + world: "wasi:cli/imports", tracing: true, async: { // Only these functions are `async` and everything else is sync diff --git a/crates/wasi/src/preview2/network.rs b/crates/wasi/src/preview2/network.rs index 65c380bd153c..82b0929bcda3 100644 --- a/crates/wasi/src/preview2/network.rs +++ b/crates/wasi/src/preview2/network.rs @@ -1,19 +1,70 @@ use crate::preview2::bindings::sockets::network::{Ipv4Address, Ipv6Address}; use crate::preview2::bindings::wasi::sockets::network::ErrorCode; -use crate::preview2::{TableError, TrappableError}; -use cap_std::net::Pool; +use crate::preview2::TrappableError; +use std::net::SocketAddr; +use std::sync::Arc; pub struct Network { - pub pool: Pool, + pub socket_addr_check: SocketAddrCheck, pub allow_ip_name_lookup: bool, } +impl Network { + pub fn check_socket_addr( + &self, + addr: &SocketAddr, + reason: SocketAddrUse, + ) -> std::io::Result<()> { + self.socket_addr_check.check(addr, reason) + } +} + +/// A check that will be called for each socket address that is used of whether the address is permitted. +#[derive(Clone)] +pub struct SocketAddrCheck( + pub(crate) Arc bool + Send + Sync>, +); + +impl SocketAddrCheck { + pub fn check(&self, addr: &SocketAddr, reason: SocketAddrUse) -> std::io::Result<()> { + if (self.0)(addr, reason) { + Ok(()) + } else { + Err(std::io::Error::new( + std::io::ErrorKind::PermissionDenied, + "An address was not permitted by the socket address check.", + )) + } + } +} + +impl Default for SocketAddrCheck { + fn default() -> Self { + Self(Arc::new(|_, _| false)) + } +} + +/// The reason what a socket address is being used for. +#[derive(Clone, Copy, Debug)] +pub enum SocketAddrUse { + /// Binding TCP socket + TcpBind, + /// Connecting TCP socket + TcpConnect, + /// Binding UDP socket + UdpBind, + /// Connecting UDP socket + UdpConnect, + /// Sending datagram on non-connected UDP socket + UdpOutgoingDatagram, +} + pub type SocketResult = Result; pub type SocketError = TrappableError; -impl From for SocketError { - fn from(error: TableError) -> Self { +impl From for SocketError { + fn from(error: wasmtime::component::ResourceTableError) -> Self { Self::trap(error) } } @@ -33,7 +84,7 @@ impl From for SocketError { #[derive(Copy, Clone)] pub enum SocketAddressFamily { Ipv4, - Ipv6 { v6only: bool }, + Ipv6, } pub(crate) fn to_ipv4_addr(addr: Ipv4Address) -> std::net::Ipv4Addr { diff --git a/crates/wasi/src/preview2/pipe.rs b/crates/wasi/src/preview2/pipe.rs index bc8d20b1de56..413de2e7f64e 100644 --- a/crates/wasi/src/preview2/pipe.rs +++ b/crates/wasi/src/preview2/pipe.rs @@ -118,7 +118,7 @@ pub struct AsyncReadStream { impl AsyncReadStream { /// Create a [`AsyncReadStream`]. In order to use the [`HostInputStream`] impl /// provided by this struct, the argument must impl [`tokio::io::AsyncRead`]. - pub fn new(mut reader: T) -> Self { + pub fn new(mut reader: T) -> Self { let (sender, receiver) = mpsc::channel(1); let join_handle = crate::preview2::spawn(async move { loop { @@ -354,7 +354,7 @@ mod test { assert_eq!(bs.len(), 0); } - async fn finite_async_reader(contents: &[u8]) -> impl AsyncRead + Send + Sync + 'static { + async fn finite_async_reader(contents: &[u8]) -> impl AsyncRead + Send + 'static { let (r, mut w) = simplex(contents.len()); w.write_all(contents).await.unwrap(); r diff --git a/crates/wasi/src/preview2/poll.rs b/crates/wasi/src/preview2/poll.rs index 8e2b5385ffe1..64be2420f0b4 100644 --- a/crates/wasi/src/preview2/poll.rs +++ b/crates/wasi/src/preview2/poll.rs @@ -1,15 +1,15 @@ -use crate::preview2::{bindings::io::poll, Table, WasiView}; +use crate::preview2::{bindings::io::poll, WasiView}; use anyhow::Result; use std::any::Any; use std::collections::HashMap; use std::future::Future; use std::pin::Pin; use std::task::{Context, Poll}; -use wasmtime::component::Resource; +use wasmtime::component::{Resource, ResourceTable}; pub type PollableFuture<'a> = Pin + Send + 'a>>; pub type MakeFuture = for<'a> fn(&'a mut dyn Any) -> PollableFuture<'a>; -pub type ClosureFuture = Box PollableFuture<'static> + Send + Sync + 'static>; +pub type ClosureFuture = Box PollableFuture<'static> + Send + 'static>; /// A host representation of the `wasi:io/poll.pollable` resource. /// @@ -20,11 +20,11 @@ pub type ClosureFuture = Box PollableFuture<'static> + Send + Sync + pub struct Pollable { index: u32, make_future: MakeFuture, - remove_index_on_delete: Option Result<()>>, + remove_index_on_delete: Option Result<()>>, } #[async_trait::async_trait] -pub trait Subscribe: Send + Sync + 'static { +pub trait Subscribe: Send + 'static { async fn ready(&mut self); } @@ -35,7 +35,7 @@ pub trait Subscribe: Send + Sync + 'static { /// resource is deleted. Otherwise the returned resource is considered a "child" /// of the given `resource` which means that the given resource cannot be /// deleted while the `pollable` is still alive. -pub fn subscribe(table: &mut Table, resource: Resource) -> Result> +pub fn subscribe(table: &mut ResourceTable, resource: Resource) -> Result> where T: Subscribe, { @@ -68,7 +68,7 @@ impl poll::Host for T { async fn poll(&mut self, pollables: Vec>) -> Result> { type ReadylistIndex = u32; - let table = self.table_mut(); + let table = self.table(); let mut table_futures: HashMap)> = HashMap::new(); @@ -121,14 +121,14 @@ impl poll::Host for T { #[async_trait::async_trait] impl crate::preview2::bindings::io::poll::HostPollable for T { async fn block(&mut self, pollable: Resource) -> Result<()> { - let table = self.table_mut(); + let table = self.table(); let pollable = table.get(&pollable)?; let ready = (pollable.make_future)(table.get_any_mut(pollable.index)?); ready.await; Ok(()) } async fn ready(&mut self, pollable: Resource) -> Result { - let table = self.table_mut(); + let table = self.table(); let pollable = table.get(&pollable)?; let ready = (pollable.make_future)(table.get_any_mut(pollable.index)?); futures::pin_mut!(ready); @@ -138,9 +138,9 @@ impl crate::preview2::bindings::io::poll::HostPollable for T { )) } fn drop(&mut self, pollable: Resource) -> Result<()> { - let pollable = self.table_mut().delete(pollable)?; + let pollable = self.table().delete(pollable)?; if let Some(delete) = pollable.remove_index_on_delete { - delete(self.table_mut(), pollable.index)?; + delete(self.table(), pollable.index)?; } Ok(()) } diff --git a/crates/wasi/src/preview2/preview0.rs b/crates/wasi/src/preview2/preview0.rs new file mode 100644 index 000000000000..71c390cdfcd0 --- /dev/null +++ b/crates/wasi/src/preview2/preview0.rs @@ -0,0 +1,870 @@ +use crate::preview2::preview0::types::Error; +use crate::preview2::preview1::types as snapshot1_types; +use crate::preview2::preview1::wasi_snapshot_preview1::WasiSnapshotPreview1 as Snapshot1; +use crate::preview2::preview1::WasiPreview1View; +use wiggle::{GuestError, GuestPtr}; + +pub fn add_to_linker_async( + linker: &mut wasmtime::Linker, +) -> anyhow::Result<()> { + wasi_unstable::add_to_linker(linker, |t| t) +} + +pub fn add_to_linker_sync( + linker: &mut wasmtime::Linker, +) -> anyhow::Result<()> { + sync::add_wasi_unstable_to_linker(linker, |t| t) +} + +wiggle::from_witx!({ + witx: ["$CARGO_MANIFEST_DIR/witx/preview0/wasi_unstable.witx"], + async: { + wasi_unstable::{ + fd_advise, fd_close, fd_datasync, fd_fdstat_get, fd_filestat_get, fd_filestat_set_size, + fd_filestat_set_times, fd_read, fd_pread, fd_seek, fd_sync, fd_readdir, fd_write, + fd_pwrite, poll_oneoff, path_create_directory, path_filestat_get, + path_filestat_set_times, path_link, path_open, path_readlink, path_remove_directory, + path_rename, path_symlink, path_unlink_file + } + }, + errors: { errno => trappable Error }, +}); + +mod sync { + use anyhow::Result; + use std::future::Future; + + wiggle::wasmtime_integration!({ + witx: ["$CARGO_MANIFEST_DIR/witx/preview0/wasi_unstable.witx"], + target: super, + block_on[in_tokio]: { + wasi_unstable::{ + fd_advise, fd_close, fd_datasync, fd_fdstat_get, fd_filestat_get, fd_filestat_set_size, + fd_filestat_set_times, fd_read, fd_pread, fd_seek, fd_sync, fd_readdir, fd_write, + fd_pwrite, poll_oneoff, path_create_directory, path_filestat_get, + path_filestat_set_times, path_link, path_open, path_readlink, path_remove_directory, + path_rename, path_symlink, path_unlink_file + } + }, + errors: { errno => trappable Error }, + }); + + // Small wrapper around `in_tokio` to add a `Result` layer which is always + // `Ok` + fn in_tokio(future: F) -> Result { + Ok(crate::preview2::in_tokio(future)) + } +} + +impl wiggle::GuestErrorType for types::Errno { + fn success() -> Self { + Self::Success + } +} + +#[wiggle::async_trait] +impl wasi_unstable::WasiUnstable for T { + fn args_get<'a>( + &mut self, + argv: &GuestPtr<'a, GuestPtr<'a, u8>>, + argv_buf: &GuestPtr<'a, u8>, + ) -> Result<(), Error> { + Snapshot1::args_get(self, argv, argv_buf)?; + Ok(()) + } + + fn args_sizes_get(&mut self) -> Result<(types::Size, types::Size), Error> { + let s = Snapshot1::args_sizes_get(self)?; + Ok(s) + } + + fn environ_get<'a>( + &mut self, + environ: &GuestPtr<'a, GuestPtr<'a, u8>>, + environ_buf: &GuestPtr<'a, u8>, + ) -> Result<(), Error> { + Snapshot1::environ_get(self, environ, environ_buf)?; + Ok(()) + } + + fn environ_sizes_get(&mut self) -> Result<(types::Size, types::Size), Error> { + let s = Snapshot1::environ_sizes_get(self)?; + Ok(s) + } + + fn clock_res_get(&mut self, id: types::Clockid) -> Result { + let t = Snapshot1::clock_res_get(self, id.into())?; + Ok(t) + } + + fn clock_time_get( + &mut self, + id: types::Clockid, + precision: types::Timestamp, + ) -> Result { + let t = Snapshot1::clock_time_get(self, id.into(), precision)?; + Ok(t) + } + + async fn fd_advise( + &mut self, + fd: types::Fd, + offset: types::Filesize, + len: types::Filesize, + advice: types::Advice, + ) -> Result<(), Error> { + Snapshot1::fd_advise(self, fd.into(), offset, len, advice.into()).await?; + Ok(()) + } + + fn fd_allocate( + &mut self, + fd: types::Fd, + offset: types::Filesize, + len: types::Filesize, + ) -> Result<(), Error> { + Snapshot1::fd_allocate(self, fd.into(), offset, len)?; + Ok(()) + } + + async fn fd_close(&mut self, fd: types::Fd) -> Result<(), Error> { + Snapshot1::fd_close(self, fd.into()).await?; + Ok(()) + } + + async fn fd_datasync(&mut self, fd: types::Fd) -> Result<(), Error> { + Snapshot1::fd_datasync(self, fd.into()).await?; + Ok(()) + } + + async fn fd_fdstat_get(&mut self, fd: types::Fd) -> Result { + Ok(Snapshot1::fd_fdstat_get(self, fd.into()).await?.into()) + } + + fn fd_fdstat_set_flags(&mut self, fd: types::Fd, flags: types::Fdflags) -> Result<(), Error> { + Snapshot1::fd_fdstat_set_flags(self, fd.into(), flags.into())?; + Ok(()) + } + + fn fd_fdstat_set_rights( + &mut self, + fd: types::Fd, + fs_rights_base: types::Rights, + fs_rights_inheriting: types::Rights, + ) -> Result<(), Error> { + Snapshot1::fd_fdstat_set_rights( + self, + fd.into(), + fs_rights_base.into(), + fs_rights_inheriting.into(), + )?; + Ok(()) + } + + async fn fd_filestat_get(&mut self, fd: types::Fd) -> Result { + Ok(Snapshot1::fd_filestat_get(self, fd.into()).await?.into()) + } + + async fn fd_filestat_set_size( + &mut self, + fd: types::Fd, + size: types::Filesize, + ) -> Result<(), Error> { + Snapshot1::fd_filestat_set_size(self, fd.into(), size).await?; + Ok(()) + } + + async fn fd_filestat_set_times( + &mut self, + fd: types::Fd, + atim: types::Timestamp, + mtim: types::Timestamp, + fst_flags: types::Fstflags, + ) -> Result<(), Error> { + Snapshot1::fd_filestat_set_times(self, fd.into(), atim, mtim, fst_flags.into()).await?; + Ok(()) + } + + async fn fd_read<'a>( + &mut self, + fd: types::Fd, + iovs: &types::IovecArray<'a>, + ) -> Result { + assert_iovec_array_same(); + let result = Snapshot1::fd_read(self, fd.into(), &iovs.cast()).await?; + Ok(result) + } + + async fn fd_pread<'a>( + &mut self, + fd: types::Fd, + iovs: &types::IovecArray<'a>, + offset: types::Filesize, + ) -> Result { + assert_iovec_array_same(); + let result = Snapshot1::fd_pread(self, fd.into(), &iovs.cast(), offset).await?; + Ok(result) + } + + async fn fd_write<'a>( + &mut self, + fd: types::Fd, + ciovs: &types::CiovecArray<'a>, + ) -> Result { + assert_ciovec_array_same(); + let result = Snapshot1::fd_write(self, fd.into(), &ciovs.cast()).await?; + Ok(result) + } + + async fn fd_pwrite<'a>( + &mut self, + fd: types::Fd, + ciovs: &types::CiovecArray<'a>, + offset: types::Filesize, + ) -> Result { + assert_ciovec_array_same(); + let result = Snapshot1::fd_pwrite(self, fd.into(), &ciovs.cast(), offset).await?; + Ok(result) + } + + fn fd_prestat_get(&mut self, fd: types::Fd) -> Result { + Ok(Snapshot1::fd_prestat_get(self, fd.into())?.into()) + } + + fn fd_prestat_dir_name( + &mut self, + fd: types::Fd, + path: &GuestPtr<'_, u8>, + path_max_len: types::Size, + ) -> Result<(), Error> { + Snapshot1::fd_prestat_dir_name(self, fd.into(), path, path_max_len)?; + Ok(()) + } + + fn fd_renumber(&mut self, from: types::Fd, to: types::Fd) -> Result<(), Error> { + Snapshot1::fd_renumber(self, from.into(), to.into())?; + Ok(()) + } + + async fn fd_seek( + &mut self, + fd: types::Fd, + offset: types::Filedelta, + whence: types::Whence, + ) -> Result { + Ok(Snapshot1::fd_seek(self, fd.into(), offset, whence.into()).await?) + } + + async fn fd_sync(&mut self, fd: types::Fd) -> Result<(), Error> { + Snapshot1::fd_sync(self, fd.into()).await?; + Ok(()) + } + + fn fd_tell(&mut self, fd: types::Fd) -> Result { + Ok(Snapshot1::fd_tell(self, fd.into())?) + } + + async fn fd_readdir<'a>( + &mut self, + fd: types::Fd, + buf: &GuestPtr<'a, u8>, + buf_len: types::Size, + cookie: types::Dircookie, + ) -> Result { + Ok(Snapshot1::fd_readdir(self, fd.into(), buf, buf_len, cookie).await?) + } + + async fn path_create_directory<'a>( + &mut self, + dirfd: types::Fd, + path: &GuestPtr<'a, str>, + ) -> Result<(), Error> { + Snapshot1::path_create_directory(self, dirfd.into(), path).await?; + Ok(()) + } + + async fn path_filestat_get<'a>( + &mut self, + dirfd: types::Fd, + flags: types::Lookupflags, + path: &GuestPtr<'a, str>, + ) -> Result { + Ok( + Snapshot1::path_filestat_get(self, dirfd.into(), flags.into(), path) + .await? + .into(), + ) + } + + async fn path_filestat_set_times<'a>( + &mut self, + dirfd: types::Fd, + flags: types::Lookupflags, + path: &GuestPtr<'a, str>, + atim: types::Timestamp, + mtim: types::Timestamp, + fst_flags: types::Fstflags, + ) -> Result<(), Error> { + Snapshot1::path_filestat_set_times( + self, + dirfd.into(), + flags.into(), + path, + atim, + mtim, + fst_flags.into(), + ) + .await?; + Ok(()) + } + + async fn path_link<'a>( + &mut self, + src_fd: types::Fd, + src_flags: types::Lookupflags, + src_path: &GuestPtr<'a, str>, + target_fd: types::Fd, + target_path: &GuestPtr<'a, str>, + ) -> Result<(), Error> { + Snapshot1::path_link( + self, + src_fd.into(), + src_flags.into(), + src_path, + target_fd.into(), + target_path, + ) + .await?; + Ok(()) + } + + async fn path_open<'a>( + &mut self, + dirfd: types::Fd, + dirflags: types::Lookupflags, + path: &GuestPtr<'a, str>, + oflags: types::Oflags, + fs_rights_base: types::Rights, + fs_rights_inheriting: types::Rights, + fdflags: types::Fdflags, + ) -> Result { + Ok(Snapshot1::path_open( + self, + dirfd.into(), + dirflags.into(), + path, + oflags.into(), + fs_rights_base.into(), + fs_rights_inheriting.into(), + fdflags.into(), + ) + .await? + .into()) + } + + async fn path_readlink<'a>( + &mut self, + dirfd: types::Fd, + path: &GuestPtr<'a, str>, + buf: &GuestPtr<'a, u8>, + buf_len: types::Size, + ) -> Result { + Ok(Snapshot1::path_readlink(self, dirfd.into(), path, buf, buf_len).await?) + } + + async fn path_remove_directory<'a>( + &mut self, + dirfd: types::Fd, + path: &GuestPtr<'a, str>, + ) -> Result<(), Error> { + Snapshot1::path_remove_directory(self, dirfd.into(), path).await?; + Ok(()) + } + + async fn path_rename<'a>( + &mut self, + src_fd: types::Fd, + src_path: &GuestPtr<'a, str>, + dest_fd: types::Fd, + dest_path: &GuestPtr<'a, str>, + ) -> Result<(), Error> { + Snapshot1::path_rename(self, src_fd.into(), src_path, dest_fd.into(), dest_path).await?; + Ok(()) + } + + async fn path_symlink<'a>( + &mut self, + src_path: &GuestPtr<'a, str>, + dirfd: types::Fd, + dest_path: &GuestPtr<'a, str>, + ) -> Result<(), Error> { + Snapshot1::path_symlink(self, src_path, dirfd.into(), dest_path).await?; + Ok(()) + } + + async fn path_unlink_file<'a>( + &mut self, + dirfd: types::Fd, + path: &GuestPtr<'a, str>, + ) -> Result<(), Error> { + Snapshot1::path_unlink_file(self, dirfd.into(), path).await?; + Ok(()) + } + + // The representation of `SubscriptionClock` is different in preview0 and + // preview1 so a bit of a hack is employed here. The change was to remove a + // field from `SubscriptionClock` so to implement this without copying too + // much the `subs` field is overwritten with preview1-compatible structures + // and then the preview1 implementation is used. Before returning though + // the old values are restored to pretend like we didn't overwrite them. + // + // Surely no one would pass overlapping pointers to this API right? + async fn poll_oneoff<'a>( + &mut self, + subs: &GuestPtr<'a, types::Subscription>, + events: &GuestPtr<'a, types::Event>, + nsubscriptions: types::Size, + ) -> Result { + let subs_array = subs.as_array(nsubscriptions); + let mut old_subs = Vec::new(); + for slot in subs_array.iter() { + let slot = slot?; + let sub = slot.read()?; + old_subs.push(sub.clone()); + slot.cast().write(snapshot1_types::Subscription { + userdata: sub.userdata, + u: match sub.u { + types::SubscriptionU::Clock(c) => { + snapshot1_types::SubscriptionU::Clock(c.into()) + } + types::SubscriptionU::FdRead(c) => { + snapshot1_types::SubscriptionU::FdRead(c.into()) + } + types::SubscriptionU::FdWrite(c) => { + snapshot1_types::SubscriptionU::FdWrite(c.into()) + } + }, + })?; + } + let ret = + Snapshot1::poll_oneoff(self, &subs.cast(), &events.cast(), nsubscriptions).await?; + for (sub, slot) in old_subs.into_iter().zip(subs_array.iter()) { + slot?.write(sub)?; + } + Ok(ret) + } + + fn proc_exit(&mut self, status: types::Exitcode) -> anyhow::Error { + Snapshot1::proc_exit(self, status) + } + + fn proc_raise(&mut self, sig: types::Signal) -> Result<(), Error> { + Snapshot1::proc_raise(self, sig.into())?; + Ok(()) + } + + fn sched_yield(&mut self) -> Result<(), Error> { + Snapshot1::sched_yield(self)?; + Ok(()) + } + + fn random_get(&mut self, buf: &GuestPtr<'_, u8>, buf_len: types::Size) -> Result<(), Error> { + Snapshot1::random_get(self, buf, buf_len)?; + Ok(()) + } + + fn sock_recv( + &mut self, + _fd: types::Fd, + _ri_data: &types::IovecArray<'_>, + _ri_flags: types::Riflags, + ) -> Result<(types::Size, types::Roflags), Error> { + Err(Error::trap(anyhow::Error::msg("sock_recv unsupported"))) + } + + fn sock_send( + &mut self, + _fd: types::Fd, + _si_data: &types::CiovecArray<'_>, + _si_flags: types::Siflags, + ) -> Result { + Err(Error::trap(anyhow::Error::msg("sock_send unsupported"))) + } + + fn sock_shutdown(&mut self, _fd: types::Fd, _how: types::Sdflags) -> Result<(), Error> { + Err(Error::trap(anyhow::Error::msg("sock_shutdown unsupported"))) + } +} + +fn assert_iovec_array_same() { + // NB: this isn't enough to assert the types are the same, but it's + // something. Additionally preview1 and preview0 aren't changing any more + // and it's been manually verified that these two types are the same, so + // it's ok to cast between them. + assert_eq!( + std::mem::size_of::>(), + std::mem::size_of::>() + ); +} + +fn assert_ciovec_array_same() { + // NB: see above too + assert_eq!( + std::mem::size_of::>(), + std::mem::size_of::>() + ); +} + +impl From for Error { + fn from(error: snapshot1_types::Error) -> Error { + match error.downcast() { + Ok(errno) => Error::from(types::Errno::from(errno)), + Err(trap) => Error::trap(trap), + } + } +} + +/// Fd is a newtype wrapper around u32. Unwrap and wrap it. +impl From for snapshot1_types::Fd { + fn from(fd: types::Fd) -> snapshot1_types::Fd { + u32::from(fd).into() + } +} + +/// Fd is a newtype wrapper around u32. Unwrap and wrap it. +impl From for types::Fd { + fn from(fd: snapshot1_types::Fd) -> types::Fd { + u32::from(fd).into() + } +} + +/// Trivial conversion between two c-style enums that have the exact same set of variants. +/// Could we do something unsafe and not list all these variants out? Probably, but doing +/// it this way doesn't bother me much. I copy-pasted the list of variants out of the +/// rendered rustdocs. +/// LLVM ought to compile these From impls into no-ops, inshallah +macro_rules! convert_enum { + ($from:ty, $to:ty, $($var:ident),+) => { + impl From<$from> for $to { + fn from(e: $from) -> $to { + match e { + $( <$from>::$var => <$to>::$var, )+ + } + } + } + } +} +convert_enum!( + snapshot1_types::Errno, + types::Errno, + Success, + TooBig, + Acces, + Addrinuse, + Addrnotavail, + Afnosupport, + Again, + Already, + Badf, + Badmsg, + Busy, + Canceled, + Child, + Connaborted, + Connrefused, + Connreset, + Deadlk, + Destaddrreq, + Dom, + Dquot, + Exist, + Fault, + Fbig, + Hostunreach, + Idrm, + Ilseq, + Inprogress, + Intr, + Inval, + Io, + Isconn, + Isdir, + Loop, + Mfile, + Mlink, + Msgsize, + Multihop, + Nametoolong, + Netdown, + Netreset, + Netunreach, + Nfile, + Nobufs, + Nodev, + Noent, + Noexec, + Nolck, + Nolink, + Nomem, + Nomsg, + Noprotoopt, + Nospc, + Nosys, + Notconn, + Notdir, + Notempty, + Notrecoverable, + Notsock, + Notsup, + Notty, + Nxio, + Overflow, + Ownerdead, + Perm, + Pipe, + Proto, + Protonosupport, + Prototype, + Range, + Rofs, + Spipe, + Srch, + Stale, + Timedout, + Txtbsy, + Xdev, + Notcapable +); +convert_enum!( + types::Clockid, + snapshot1_types::Clockid, + Realtime, + Monotonic, + ProcessCputimeId, + ThreadCputimeId +); + +convert_enum!( + types::Advice, + snapshot1_types::Advice, + Normal, + Sequential, + Random, + Willneed, + Dontneed, + Noreuse +); +convert_enum!( + snapshot1_types::Filetype, + types::Filetype, + Directory, + BlockDevice, + CharacterDevice, + RegularFile, + SocketDgram, + SocketStream, + SymbolicLink, + Unknown +); +convert_enum!(types::Whence, snapshot1_types::Whence, Cur, End, Set); + +convert_enum!( + types::Signal, + snapshot1_types::Signal, + None, + Hup, + Int, + Quit, + Ill, + Trap, + Abrt, + Bus, + Fpe, + Kill, + Usr1, + Segv, + Usr2, + Pipe, + Alrm, + Term, + Chld, + Cont, + Stop, + Tstp, + Ttin, + Ttou, + Urg, + Xcpu, + Xfsz, + Vtalrm, + Prof, + Winch, + Poll, + Pwr, + Sys +); + +/// Prestat isn't a c-style enum, its a union where the variant has a payload. Its the only one of +/// those we need to convert, so write it by hand. +impl From for types::Prestat { + fn from(p: snapshot1_types::Prestat) -> types::Prestat { + match p { + snapshot1_types::Prestat::Dir(d) => types::Prestat::Dir(d.into()), + } + } +} + +/// Trivial conversion between two structs that have the exact same set of fields, +/// with recursive descent into the field types. +macro_rules! convert_struct { + ($from:ty, $to:path, $($field:ident),+) => { + impl From<$from> for $to { + fn from(e: $from) -> $to { + $to { + $( $field: e.$field.into(), )+ + } + } + } + } +} + +convert_struct!(snapshot1_types::PrestatDir, types::PrestatDir, pr_name_len); +convert_struct!( + snapshot1_types::Fdstat, + types::Fdstat, + fs_filetype, + fs_rights_base, + fs_rights_inheriting, + fs_flags +); +convert_struct!( + types::SubscriptionClock, + snapshot1_types::SubscriptionClock, + id, + timeout, + precision, + flags +); +convert_struct!( + types::SubscriptionFdReadwrite, + snapshot1_types::SubscriptionFdReadwrite, + file_descriptor +); + +/// Snapshot1 Filestat is incompatible with Snapshot0 Filestat - the nlink +/// field is u32 on this Filestat, and u64 on theirs. If you've got more than +/// 2^32 links I don't know what to tell you +impl From for types::Filestat { + fn from(f: snapshot1_types::Filestat) -> types::Filestat { + types::Filestat { + dev: f.dev.into(), + ino: f.ino.into(), + filetype: f.filetype.into(), + nlink: f.nlink.try_into().unwrap_or(u32::MAX), + size: f.size.into(), + atim: f.atim.into(), + mtim: f.mtim.into(), + ctim: f.ctim.into(), + } + } +} + +/// Trivial conversion between two bitflags that have the exact same set of flags. +macro_rules! convert_flags { + ($from:ty, $to:ty, $($flag:ident),+) => { + impl From<$from> for $to { + fn from(f: $from) -> $to { + let mut out = <$to>::empty(); + $( + if f.contains(<$from>::$flag) { + out |= <$to>::$flag; + } + )+ + out + } + } + } +} + +/// Need to convert in both directions? This saves listing out the flags twice +macro_rules! convert_flags_bidirectional { + ($from:ty, $to:ty, $($flag:tt)*) => { + convert_flags!($from, $to, $($flag)*); + convert_flags!($to, $from, $($flag)*); + } +} + +convert_flags_bidirectional!( + snapshot1_types::Fdflags, + types::Fdflags, + APPEND, + DSYNC, + NONBLOCK, + RSYNC, + SYNC +); +convert_flags!( + types::Lookupflags, + snapshot1_types::Lookupflags, + SYMLINK_FOLLOW +); +convert_flags!( + types::Fstflags, + snapshot1_types::Fstflags, + ATIM, + ATIM_NOW, + MTIM, + MTIM_NOW +); +convert_flags!( + types::Oflags, + snapshot1_types::Oflags, + CREAT, + DIRECTORY, + EXCL, + TRUNC +); +convert_flags_bidirectional!( + types::Rights, + snapshot1_types::Rights, + FD_DATASYNC, + FD_READ, + FD_SEEK, + FD_FDSTAT_SET_FLAGS, + FD_SYNC, + FD_TELL, + FD_WRITE, + FD_ADVISE, + FD_ALLOCATE, + PATH_CREATE_DIRECTORY, + PATH_CREATE_FILE, + PATH_LINK_SOURCE, + PATH_LINK_TARGET, + PATH_OPEN, + FD_READDIR, + PATH_READLINK, + PATH_RENAME_SOURCE, + PATH_RENAME_TARGET, + PATH_FILESTAT_GET, + PATH_FILESTAT_SET_SIZE, + PATH_FILESTAT_SET_TIMES, + FD_FILESTAT_GET, + FD_FILESTAT_SET_SIZE, + FD_FILESTAT_SET_TIMES, + PATH_SYMLINK, + PATH_REMOVE_DIRECTORY, + PATH_UNLINK_FILE, + POLL_FD_READWRITE, + SOCK_SHUTDOWN +); +convert_flags!( + types::Subclockflags, + snapshot1_types::Subclockflags, + SUBSCRIPTION_CLOCK_ABSTIME +); + +impl From for types::Error { + fn from(err: GuestError) -> Self { + snapshot1_types::Error::from(err).into() + } +} diff --git a/crates/wasi/src/preview2/preview1.rs b/crates/wasi/src/preview2/preview1.rs index 7760bc418733..2b1ddc95eb39 100644 --- a/crates/wasi/src/preview2/preview1.rs +++ b/crates/wasi/src/preview2/preview1.rs @@ -8,7 +8,7 @@ use crate::preview2::bindings::{ filesystem::{preopens, types as filesystem}, io::{poll, streams}, }; -use crate::preview2::{FsError, IsATTY, StreamError, StreamResult, TableError, WasiView}; +use crate::preview2::{FsError, IsATTY, StreamError, StreamResult, WasiView}; use anyhow::{bail, Context}; use std::borrow::Borrow; use std::collections::{BTreeMap, HashSet}; @@ -19,11 +19,11 @@ use std::sync::atomic::{AtomicU64, Ordering}; use std::sync::Arc; use wasmtime::component::Resource; use wiggle::tracing::instrument; -use wiggle::{GuestError, GuestPtr, GuestSlice, GuestSliceMut, GuestStrCow, GuestType}; +use wiggle::{GuestError, GuestPtr, GuestStrCow, GuestType}; #[derive(Debug)] struct File { - /// The handle to the preview2 descriptor that this file is referencing. + /// The handle to the preview2 descriptor of type [`crate::preview2::filesystem::Descriptor::File`]. fd: Resource, /// The current-position pointer. @@ -81,10 +81,13 @@ impl BlockingMode { &self, host: &mut (impl streams::Host + poll::Host), output_stream: Resource, - mut bytes: &[u8], + bytes: GuestPtr<'_, [u8]>, ) -> StreamResult { use streams::HostOutputStream as Streams; + let bytes = bytes.as_cow().map_err(|e| StreamError::Trap(e.into()))?; + let mut bytes = &bytes[..]; + match self { BlockingMode::Blocking => { let total = bytes.len(); @@ -148,7 +151,14 @@ enum Descriptor { stream: Resource, isatty: IsATTY, }, - PreopenDirectory((Resource, String)), + /// A fd of type [`crate::preview2::filesystem::Descriptor::Dir`] + Directory { + fd: Resource, + /// The path this directory was preopened as. + /// `None` means this directory was opened using `open-at`. + preopen_path: Option, + }, + /// A fd of type [`crate::preview2::filesystem::Descriptor::File`] File(File), } @@ -252,7 +262,10 @@ impl Descriptors { .context("failed to call `get-directories`") .map_err(types::Error::trap)? { - descriptors.push(Descriptor::PreopenDirectory((dir.0, dir.1)))?; + descriptors.push(Descriptor::Directory { + fd: dir.0, + preopen_path: Some(dir.1), + })?; } Ok(descriptors) } @@ -297,11 +310,6 @@ impl Descriptors { assert!(self.insert(fd, desc).is_none()); Ok(fd) } - - /// Like [Self::push], but for [`File`] - fn push_file(&mut self, file: File) -> Result { - self.push(Descriptor::File(file)) - } } impl WasiPreview1Adapter { @@ -325,7 +333,7 @@ pub trait WasiPreview1View: WasiView { // `&mut self` receivers and so this struct lets us extend the lifetime of the `&mut self` borrow // of the [`WasiPreview1View`] to provide means to return mutably and immutably borrowed [`Descriptors`] // without having to rely on something like `Arc>`, while also being able to -// call methods like [`TableFsExt::is_file`] and hiding complexity from preview1 method implementations. +// call methods like [`Descriptor::is_file`] and hiding complexity from preview1 method implementations. struct Transaction<'a, T: WasiPreview1View + ?Sized> { view: &'a mut T, descriptors: Descriptors, @@ -352,33 +360,27 @@ impl Transaction<'_, T> { } /// Borrows [`File`] corresponding to `fd` - /// if it describes a [`Descriptor::File`] of [`crate::preview2::filesystem::File`] type + /// if it describes a [`Descriptor::File`] fn get_file(&self, fd: types::Fd) -> Result<&File> { let fd = fd.into(); match self.descriptors.get(&fd) { - Some(Descriptor::File(file @ File { fd, .. })) => { - self.view.table().get(fd)?.file()?; - Ok(file) - } + Some(Descriptor::File(file)) => Ok(file), _ => Err(types::Errno::Badf.into()), } } /// Mutably borrows [`File`] corresponding to `fd` - /// if it describes a [`Descriptor::File`] of [`crate::preview2::filesystem::File`] type + /// if it describes a [`Descriptor::File`] fn get_file_mut(&mut self, fd: types::Fd) -> Result<&mut File> { let fd = fd.into(); match self.descriptors.get_mut(&fd) { - Some(Descriptor::File(file)) => { - self.view.table().get(&file.fd)?.file()?; - Ok(file) - } + Some(Descriptor::File(file)) => Ok(file), _ => Err(types::Errno::Badf.into()), } } /// Borrows [`File`] corresponding to `fd` - /// if it describes a [`Descriptor::File`] of [`crate::preview2::filesystem::File`] type. + /// if it describes a [`Descriptor::File`] /// /// # Errors /// @@ -386,11 +388,7 @@ impl Transaction<'_, T> { fn get_seekable(&self, fd: types::Fd) -> Result<&File> { let fd = fd.into(); match self.descriptors.get(&fd) { - Some(Descriptor::File(file @ File { fd, .. })) - if self.view.table().get(fd)?.is_file() => - { - Ok(file) - } + Some(Descriptor::File(file)) => Ok(file), Some( Descriptor::Stdin { .. } | Descriptor::Stdout { .. } | Descriptor::Stderr { .. }, ) => { @@ -405,7 +403,7 @@ impl Transaction<'_, T> { fn get_fd(&self, fd: types::Fd) -> Result> { match self.get_descriptor(fd)? { Descriptor::File(File { fd, .. }) => Ok(fd.borrowed()), - Descriptor::PreopenDirectory((fd, _)) => Ok(fd.borrowed()), + Descriptor::Directory { fd, .. } => Ok(fd.borrowed()), Descriptor::Stdin { .. } | Descriptor::Stdout { .. } | Descriptor::Stderr { .. } => { Err(types::Errno::Badf.into()) } @@ -413,21 +411,17 @@ impl Transaction<'_, T> { } /// Returns [`filesystem::Descriptor`] corresponding to `fd` - /// if it describes a [`Descriptor::File`] of [`crate::preview2::filesystem::File`] type + /// if it describes a [`Descriptor::File`] fn get_file_fd(&self, fd: types::Fd) -> Result> { self.get_file(fd).map(|File { fd, .. }| fd.borrowed()) } /// Returns [`filesystem::Descriptor`] corresponding to `fd` - /// if it describes a [`Descriptor::File`] or [`Descriptor::PreopenDirectory`] - /// of [`crate::preview2::filesystem::Dir`] type + /// if it describes a [`Descriptor::Directory`] fn get_dir_fd(&self, fd: types::Fd) -> Result> { let fd = fd.into(); match self.descriptors.get(&fd) { - Some(Descriptor::File(File { fd, .. })) if self.view.table().get(fd)?.is_dir() => { - Ok(fd.borrowed()) - } - Some(Descriptor::PreopenDirectory((fd, _))) => Ok(fd.borrowed()), + Some(Descriptor::Directory { fd, .. }) => Ok(fd.borrowed()), _ => Err(types::Errno::Badf.into()), } } @@ -496,13 +490,13 @@ trait WasiPreview1ViewExt: impl WasiPreview1ViewExt for T {} -pub fn add_to_linker_async( +pub fn add_to_linker_async( linker: &mut wasmtime::Linker, ) -> anyhow::Result<()> { wasi_snapshot_preview1::add_to_linker(linker, |t| t) } -pub fn add_to_linker_sync( +pub fn add_to_linker_sync( linker: &mut wasmtime::Linker, ) -> anyhow::Result<()> { sync::add_wasi_snapshot_preview1_to_linker(linker, |t| t) @@ -513,7 +507,7 @@ pub fn add_to_linker_sync( // None of the generated modules, traits, or types should be used externally // to this module. wiggle::from_witx!({ - witx: ["$CARGO_MANIFEST_DIR/witx/wasi_snapshot_preview1.witx"], + witx: ["$CARGO_MANIFEST_DIR/witx/preview1/wasi_snapshot_preview1.witx"], async: { wasi_snapshot_preview1::{ fd_advise, fd_close, fd_datasync, fd_fdstat_get, fd_filestat_get, fd_filestat_set_size, @@ -531,7 +525,7 @@ mod sync { use std::future::Future; wiggle::wasmtime_integration!({ - witx: ["$CARGO_MANIFEST_DIR/witx/wasi_snapshot_preview1.witx"], + witx: ["$CARGO_MANIFEST_DIR/witx/preview1/wasi_snapshot_preview1.witx"], target: super, block_on[in_tokio]: { wasi_snapshot_preview1::{ @@ -772,8 +766,8 @@ impl From for types::Error { } } -impl From for types::Error { - fn from(err: TableError) -> Self { +impl From for types::Error { + fn from(err: wasmtime::component::ResourceTableError) -> Self { types::Error::trap(err.into()) } } @@ -786,8 +780,7 @@ fn write_bytes<'a>( ) -> Result, types::Error> { // NOTE: legacy implementation always returns Inval errno - let buf = buf.as_ref(); - let len = buf.len().try_into()?; + let len = u32::try_from(buf.len())?; let ptr = ptr.borrow(); ptr.as_array(len).copy_from_slice(buf)?; @@ -814,32 +807,27 @@ fn read_string<'a>(ptr: impl Borrow>) -> Result { // Find first non-empty buffer. fn first_non_empty_ciovec<'a, 'b>( ciovs: &'a types::CiovecArray<'b>, -) -> Result>> { +) -> Result>> { for iov in ciovs.iter() { let iov = iov?.read()?; if iov.buf_len == 0 { continue; } - return Ok(iov.buf.as_array(iov.buf_len).as_slice()?); + return Ok(Some(iov.buf.as_array(iov.buf_len))); } Ok(None) } // Find first non-empty buffer. -fn first_non_empty_iovec<'a>( - iovs: &types::IovecArray<'a>, -) -> Result>> { - iovs.iter() - .map(|iov| { - let iov = iov?.read()?; - if iov.buf_len == 0 { - return Ok(None); - } - let slice = iov.buf.as_array(iov.buf_len).as_slice_mut()?; - Ok(slice) - }) - .find_map(Result::transpose) - .transpose() +fn first_non_empty_iovec<'a>(iovs: &types::IovecArray<'a>) -> Result>> { + for iov in iovs.iter() { + let iov = iov?.read()?; + if iov.buf_len == 0 { + continue; + } + return Ok(Some(iov.buf.as_array(iov.buf_len))); + } + Ok(None) } #[async_trait::async_trait] @@ -1024,7 +1012,7 @@ impl< streams::HostOutputStream::drop(self, stream) .context("failed to call `drop` on `output-stream`") } - Descriptor::File(File { fd, .. }) | Descriptor::PreopenDirectory((fd, _)) => { + Descriptor::File(File { fd, .. }) | Descriptor::Directory { fd, .. } => { filesystem::HostDescriptor::drop(self, fd).context("failed to call `drop`") } } @@ -1066,7 +1054,10 @@ impl< fs_rights_inheriting: fs_rights_base, }); } - Descriptor::PreopenDirectory((_, _)) => { + Descriptor::Directory { + preopen_path: Some(_), + .. + } => { // Hard-coded set or rights expected by many userlands: let fs_rights_base = types::Rights::PATH_CREATE_DIRECTORY | types::Rights::PATH_CREATE_FILE @@ -1107,6 +1098,7 @@ impl< fs_rights_inheriting, }); } + Descriptor::Directory { fd, .. } => (fd.borrowed(), BlockingMode::Blocking, false), Descriptor::File(File { fd, blocking_mode, @@ -1220,7 +1212,7 @@ impl< mtim: 0, ctim: 0, }), - Descriptor::PreopenDirectory((fd, _)) | Descriptor::File(File { fd, .. }) => { + Descriptor::Directory { fd, .. } | Descriptor::File(File { fd, .. }) => { let fd = fd.borrowed(); drop(t); let filesystem::DescriptorStat { @@ -1317,13 +1309,13 @@ impl< ) -> Result { let t = self.transact()?; let desc = t.get_descriptor(fd)?; - let (mut buf, read) = match desc { + let (buf, read) = match desc { Descriptor::File(File { fd, blocking_mode, position, .. - }) if t.view.table().get(fd)?.is_file() => { + }) => { let fd = fd.borrowed(); let blocking_mode = *blocking_mode; let position = position.clone(); @@ -1338,7 +1330,11 @@ impl< .context("failed to call `read-via-stream`") .unwrap_or_else(types::Error::trap) })?; - let read = blocking_mode.read(self, stream, buf.len()).await?; + let read = blocking_mode + .read(self, stream.borrowed(), buf.len().try_into()?) + .await; + streams::HostInputStream::drop(self, stream).map_err(|e| types::Error::trap(e))?; + let read = read?; let n = read.len().try_into()?; let pos = pos.checked_add(n).ok_or(types::Errno::Overflow)?; position.store(pos, Ordering::Relaxed); @@ -1351,16 +1347,18 @@ impl< let Some(buf) = first_non_empty_iovec(iovs)? else { return Ok(0); }; - let read = BlockingMode::Blocking.read(self, stream, buf.len()).await?; + let read = BlockingMode::Blocking + .read(self, stream, buf.len().try_into()?) + .await?; (buf, read) } _ => return Err(types::Errno::Badf.into()), }; - if read.len() > buf.len() { + if read.len() > buf.len().try_into()? { return Err(types::Errno::Range.into()); } - let (buf, _) = buf.split_at_mut(read.len()); - buf.copy_from_slice(&read); + let buf = buf.get_range(0..u32::try_from(read.len())?).unwrap(); + buf.copy_from_slice(&read)?; let n = read.len().try_into()?; Ok(n) } @@ -1376,10 +1374,10 @@ impl< ) -> Result { let t = self.transact()?; let desc = t.get_descriptor(fd)?; - let (mut buf, read) = match desc { + let (buf, read) = match desc { Descriptor::File(File { fd, blocking_mode, .. - }) if t.view.table().get(fd)?.is_file() => { + }) => { let fd = fd.borrowed(); let blocking_mode = *blocking_mode; drop(t); @@ -1392,8 +1390,11 @@ impl< .context("failed to call `read-via-stream`") .unwrap_or_else(types::Error::trap) })?; - let read = blocking_mode.read(self, stream, buf.len()).await?; - (buf, read) + let read = blocking_mode + .read(self, stream.borrowed(), buf.len().try_into()?) + .await; + streams::HostInputStream::drop(self, stream).map_err(|e| types::Error::trap(e))?; + (buf, read?) } Descriptor::Stdin { .. } => { // NOTE: legacy implementation returns SPIPE here @@ -1401,11 +1402,11 @@ impl< } _ => return Err(types::Errno::Badf.into()), }; - if read.len() > buf.len() { + if read.len() > buf.len().try_into()? { return Err(types::Errno::Range.into()); } - let (buf, _) = buf.split_at_mut(read.len()); - buf.copy_from_slice(&read); + let buf = buf.get_range(0..u32::try_from(read.len())?).unwrap(); + buf.copy_from_slice(&read)?; let n = read.len().try_into()?; Ok(n) } @@ -1426,8 +1427,9 @@ impl< blocking_mode, append, position, - }) if t.view.table().get(fd)?.is_file() => { + }) => { let fd = fd.borrowed(); + let fd2 = fd.borrowed(); let blocking_mode = *blocking_mode; let position = position.clone(); let append = *append; @@ -1451,8 +1453,13 @@ impl< })?; (stream, pos) }; - let n = blocking_mode.write(self, stream, &buf).await?; - if !append { + let n = blocking_mode.write(self, stream.borrowed(), buf).await; + streams::HostOutputStream::drop(self, stream).map_err(|e| types::Error::trap(e))?; + let n = n?; + if append { + let len = self.stat(fd2).await?; + position.store(len.size, Ordering::Relaxed); + } else { let pos = pos.checked_add(n as u64).ok_or(types::Errno::Overflow)?; position.store(pos, Ordering::Relaxed); } @@ -1466,7 +1473,7 @@ impl< return Ok(0); }; let n = BlockingMode::Blocking - .write(self, stream, &buf) + .write(self, stream, buf) .await? .try_into()?; Ok(n) @@ -1489,7 +1496,7 @@ impl< let n = match desc { Descriptor::File(File { fd, blocking_mode, .. - }) if t.view.table().get(fd)?.is_file() => { + }) => { let fd = fd.borrowed(); let blocking_mode = *blocking_mode; drop(t); @@ -1501,7 +1508,9 @@ impl< .context("failed to call `write-via-stream`") .unwrap_or_else(types::Error::trap) })?; - blocking_mode.write(self, stream, &buf).await? + let result = blocking_mode.write(self, stream.borrowed(), buf).await; + streams::HostOutputStream::drop(self, stream).map_err(|e| types::Error::trap(e))?; + result? } Descriptor::Stdout { .. } | Descriptor::Stderr { .. } => { // NOTE: legacy implementation returns SPIPE here @@ -1515,7 +1524,11 @@ impl< /// Return a description of the given preopened file descriptor. #[instrument(skip(self))] fn fd_prestat_get(&mut self, fd: types::Fd) -> Result { - if let Descriptor::PreopenDirectory((_, p)) = self.transact()?.get_descriptor(fd)? { + if let Descriptor::Directory { + preopen_path: Some(p), + .. + } = self.transact()?.get_descriptor(fd)? + { let pr_name_len = p.len().try_into()?; return Ok(types::Prestat::Dir(types::PrestatDir { pr_name_len })); } @@ -1531,7 +1544,11 @@ impl< path_max_len: types::Size, ) -> Result<(), types::Error> { let path_max_len = path_max_len.try_into()?; - if let Descriptor::PreopenDirectory((_, p)) = self.transact()?.get_descriptor(fd)? { + if let Descriptor::Directory { + preopen_path: Some(p), + .. + } = self.transact()?.get_descriptor(fd)? + { if p.len() > path_max_len { return Err(types::Errno::Nametoolong.into()); } @@ -1565,7 +1582,9 @@ impl< let position = position.clone(); drop(t); let pos = match whence { - types::Whence::Set if offset >= 0 => offset as _, + types::Whence::Set if offset >= 0 => { + offset.try_into().map_err(|_| types::Errno::Inval)? + } types::Whence::Cur => position .load(Ordering::Relaxed) .checked_add_signed(offset) @@ -1651,7 +1670,7 @@ impl< let mut dir = Vec::new(); for (entry, d_next) in self - .table_mut() + .table() // remove iterator from table and use it directly: .delete(stream)? .into_iter() @@ -1884,11 +1903,8 @@ impl< let t = self.transact()?; let dirfd = match t.get_descriptor(dirfd)? { - Descriptor::PreopenDirectory((fd, _)) => fd.borrowed(), - Descriptor::File(File { fd, .. }) => { - t.view.table().get(fd)?.dir()?; - fd.borrowed() - } + Descriptor::Directory { fd, .. } => fd.borrowed(), + Descriptor::File(_) => return Err(types::Errno::Notdir.into()), _ => return Err(types::Errno::Badf.into()), }; drop(t); @@ -1900,12 +1916,20 @@ impl< .context("failed to call `open-at`") .unwrap_or_else(types::Error::trap) })?; - let fd = self.transact()?.descriptors.push_file(File { - fd, - position: Default::default(), - append: fdflags.contains(types::Fdflags::APPEND), - blocking_mode: BlockingMode::from_fdflags(&fdflags), - })?; + let mut t = self.transact()?; + let desc = match t.view.table().get(&fd)? { + crate::preview2::filesystem::Descriptor::Dir(_) => Descriptor::Directory { + fd, + preopen_path: None, + }, + crate::preview2::filesystem::Descriptor::File(_) => Descriptor::File(File { + fd, + position: Default::default(), + append: fdflags.contains(types::Fdflags::APPEND), + blocking_mode: BlockingMode::from_fdflags(&fdflags), + }), + }; + let fd = t.descriptors.push(desc)?; Ok(fd.into()) } @@ -2083,9 +2107,7 @@ impl< let desc = t.get_descriptor(file_descriptor)?; match desc { Descriptor::Stdin { stream, .. } => stream.borrowed(), - Descriptor::File(File { fd, position, .. }) - if t.view.table().get(fd)?.is_file() => - { + Descriptor::File(File { fd, position, .. }) => { let pos = position.load(Ordering::Relaxed); let fd = fd.borrowed(); drop(t); @@ -2117,7 +2139,7 @@ impl< position, append, .. - }) if t.view.table().get(fd)?.is_file() => { + }) => { let fd = fd.borrowed(); let position = position.clone(); let append = *append; @@ -2189,9 +2211,7 @@ impl< nbytes: 1, }, }, - Descriptor::File(File { fd, position, .. }) - if t.view.table().get(fd)?.is_file() => - { + Descriptor::File(File { fd, position, .. }) => { let fd = fd.borrowed(); let position = position.clone(); drop(t); @@ -2234,17 +2254,15 @@ impl< nbytes: 1, }, }, - Descriptor::File(File { fd, .. }) if t.view.table().get(fd)?.is_file() => { - types::Event { - userdata: sub.userdata, - error: types::Errno::Success, - type_: types::Eventtype::FdWrite, - fd_readwrite: types::EventFdReadwrite { - flags: types::Eventrwflags::empty(), - nbytes: 1, - }, - } - } + Descriptor::File(_) => types::Event { + userdata: sub.userdata, + error: types::Errno::Success, + type_: types::Eventtype::FdWrite, + fd_readwrite: types::EventFdReadwrite { + flags: types::Eventrwflags::empty(), + nbytes: 1, + }, + }, // TODO: Support sockets _ => return Err(types::Errno::Badf.into()), } diff --git a/crates/wasi/src/preview2/random.rs b/crates/wasi/src/preview2/random.rs index 9660699e87c1..4a0b33f29ab5 100644 --- a/crates/wasi/src/preview2/random.rs +++ b/crates/wasi/src/preview2/random.rs @@ -51,7 +51,7 @@ mod test { } } -pub fn thread_rng() -> Box { +pub fn thread_rng() -> Box { use cap_rand::{Rng, SeedableRng}; let mut rng = cap_rand::thread_rng(cap_rand::ambient_authority()); Box::new(cap_rand::rngs::StdRng::from_seed(rng.gen())) diff --git a/crates/wasi/src/preview2/stdio.rs b/crates/wasi/src/preview2/stdio.rs index 29ec38f08a2f..193f7c3dcf38 100644 --- a/crates/wasi/src/preview2/stdio.rs +++ b/crates/wasi/src/preview2/stdio.rs @@ -18,7 +18,7 @@ use wasmtime::component::Resource; /// /// Built-in implementations are provided for [`Stdin`], /// [`pipe::MemoryInputPipe`], and [`pipe::ClosedInputStream`]. -pub trait StdinStream: Send + Sync { +pub trait StdinStream: Send { /// Creates a fresh stream which is reading stdin. /// /// Note that the returned stream must share state with all other streams @@ -60,7 +60,7 @@ mod worker_thread_stdin; pub use self::worker_thread_stdin::{stdin, Stdin}; /// Similar to [`StdinStream`], except for output. -pub trait StdoutStream: Send + Sync { +pub trait StdoutStream: Send { /// Returns a fresh new stream which can write to this output stream. /// /// Note that all output streams should output to the same logical source. @@ -191,22 +191,22 @@ pub enum IsATTY { impl stdin::Host for T { fn get_stdin(&mut self) -> Result, anyhow::Error> { - let stream = self.ctx_mut().stdin.stream(); - Ok(self.table_mut().push(streams::InputStream::Host(stream))?) + let stream = self.ctx().stdin.stream(); + Ok(self.table().push(streams::InputStream::Host(stream))?) } } impl stdout::Host for T { fn get_stdout(&mut self) -> Result, anyhow::Error> { - let stream = self.ctx_mut().stdout.stream(); - Ok(self.table_mut().push(stream)?) + let stream = self.ctx().stdout.stream(); + Ok(self.table().push(stream)?) } } impl stderr::Host for T { fn get_stderr(&mut self) -> Result, anyhow::Error> { - let stream = self.ctx_mut().stderr.stream(); - Ok(self.table_mut().push(stream)?) + let stream = self.ctx().stderr.stream(); + Ok(self.table().push(stream)?) } } @@ -216,21 +216,21 @@ pub struct TerminalOutput; impl terminal_input::Host for T {} impl terminal_input::HostTerminalInput for T { fn drop(&mut self, r: Resource) -> anyhow::Result<()> { - self.table_mut().delete(r)?; + self.table().delete(r)?; Ok(()) } } impl terminal_output::Host for T {} impl terminal_output::HostTerminalOutput for T { fn drop(&mut self, r: Resource) -> anyhow::Result<()> { - self.table_mut().delete(r)?; + self.table().delete(r)?; Ok(()) } } impl terminal_stdin::Host for T { fn get_terminal_stdin(&mut self) -> anyhow::Result>> { if self.ctx().stdin.isatty() { - let fd = self.table_mut().push(TerminalInput)?; + let fd = self.table().push(TerminalInput)?; Ok(Some(fd)) } else { Ok(None) @@ -240,7 +240,7 @@ impl terminal_stdin::Host for T { impl terminal_stdout::Host for T { fn get_terminal_stdout(&mut self) -> anyhow::Result>> { if self.ctx().stdout.isatty() { - let fd = self.table_mut().push(TerminalOutput)?; + let fd = self.table().push(TerminalOutput)?; Ok(Some(fd)) } else { Ok(None) @@ -250,201 +250,10 @@ impl terminal_stdout::Host for T { impl terminal_stderr::Host for T { fn get_terminal_stderr(&mut self) -> anyhow::Result>> { if self.ctx().stderr.isatty() { - let fd = self.table_mut().push(TerminalOutput)?; + let fd = self.table().push(TerminalOutput)?; Ok(Some(fd)) } else { Ok(None) } } } - -#[cfg(all(unix, test))] -mod test { - use crate::preview2::HostInputStream; - use libc; - use std::fs::File; - use std::io::{BufRead, BufReader, Write}; - use std::os::fd::FromRawFd; - - fn test_child_stdin(child: T, parent: P) - where - T: FnOnce(File), - P: FnOnce(File, BufReader), - { - unsafe { - // Make pipe for emulating stdin. - let mut stdin_fds: [libc::c_int; 2] = [0; 2]; - assert_eq!( - libc::pipe(stdin_fds.as_mut_ptr()), - 0, - "Failed to create stdin pipe" - ); - let [stdin_read, stdin_write] = stdin_fds; - - // Make pipe for getting results. - let mut result_fds: [libc::c_int; 2] = [0; 2]; - assert_eq!( - libc::pipe(result_fds.as_mut_ptr()), - 0, - "Failed to create result pipe" - ); - let [result_read, result_write] = result_fds; - - let child_pid = libc::fork(); - if child_pid == 0 { - libc::close(stdin_write); - libc::close(result_read); - - libc::close(libc::STDIN_FILENO); - libc::dup2(stdin_read, libc::STDIN_FILENO); - - let result_write = File::from_raw_fd(result_write); - child(result_write); - } else { - libc::close(stdin_read); - libc::close(result_write); - - let stdin_write = File::from_raw_fd(stdin_write); - let result_read = BufReader::new(File::from_raw_fd(result_read)); - parent(stdin_write, result_read); - } - } - } - - // This could even be parameterized somehow to use the worker thread stdin vs the asyncfd - // stdin. - fn test_stdin_by_forking(mk_stdin: T) - where - S: HostInputStream, - T: Fn() -> S, - { - test_child_stdin( - |mut result_write| { - let mut child_running = true; - while child_running { - tokio::runtime::Builder::new_multi_thread() - .enable_all() - .build() - .unwrap() - .block_on(async { - 'task: loop { - println!("child: creating stdin"); - let mut stdin = mk_stdin(); - - println!("child: checking that stdin is not ready"); - assert!( - tokio::time::timeout( - std::time::Duration::from_millis(100), - stdin.ready() - ) - .await - .is_err(), - "stdin available too soon" - ); - - writeln!(&mut result_write, "start").unwrap(); - - println!("child: started"); - - let mut buffer = String::new(); - loop { - println!("child: waiting for stdin to be ready"); - stdin.ready().await; - - println!("child: reading input"); - // We can't effectively test for the case where stdin was closed, so panic if it is... - let bytes = stdin.read(1024).unwrap(); - - println!("child got: {:?}", bytes); - - buffer.push_str(std::str::from_utf8(bytes.as_ref()).unwrap()); - if let Some((line, rest)) = buffer.split_once('\n') { - if line == "all done" { - writeln!(&mut result_write, "done").unwrap(); - println!("child: exiting..."); - child_running = false; - break 'task; - } else if line == "restart_runtime" { - writeln!(&mut result_write, "restarting").unwrap(); - println!("child: restarting runtime..."); - break 'task; - } else if line == "restart_task" { - writeln!(&mut result_write, "restarting").unwrap(); - println!("child: restarting task..."); - continue 'task; - } else { - writeln!(&mut result_write, "{}", line).unwrap(); - } - - buffer = rest.to_owned(); - } - } - } - }); - println!("runtime exited"); - } - println!("child exited"); - }, - |mut stdin_write, mut result_read| { - let mut line = String::new(); - result_read.read_line(&mut line).unwrap(); - assert_eq!(line, "start\n"); - - for i in 0..5 { - let message = format!("some bytes {}\n", i); - stdin_write.write_all(message.as_bytes()).unwrap(); - line.clear(); - result_read.read_line(&mut line).unwrap(); - assert_eq!(line, message); - } - - writeln!(&mut stdin_write, "restart_task").unwrap(); - line.clear(); - result_read.read_line(&mut line).unwrap(); - assert_eq!(line, "restarting\n"); - line.clear(); - - result_read.read_line(&mut line).unwrap(); - assert_eq!(line, "start\n"); - - for i in 0..10 { - let message = format!("more bytes {}\n", i); - stdin_write.write_all(message.as_bytes()).unwrap(); - line.clear(); - result_read.read_line(&mut line).unwrap(); - assert_eq!(line, message); - } - - writeln!(&mut stdin_write, "restart_runtime").unwrap(); - line.clear(); - result_read.read_line(&mut line).unwrap(); - assert_eq!(line, "restarting\n"); - line.clear(); - - result_read.read_line(&mut line).unwrap(); - assert_eq!(line, "start\n"); - - for i in 0..17 { - let message = format!("even more bytes {}\n", i); - stdin_write.write_all(message.as_bytes()).unwrap(); - line.clear(); - result_read.read_line(&mut line).unwrap(); - assert_eq!(line, message); - } - - writeln!(&mut stdin_write, "all done").unwrap(); - - line.clear(); - result_read.read_line(&mut line).unwrap(); - assert_eq!(line, "done\n"); - }, - ) - } - - // This test doesn't work under qemu because of the use of fork in the test helper. - #[test] - #[cfg_attr(not(target_arch = "x86_64"), ignore)] - fn test_worker_thread_stdin() { - test_stdin_by_forking(super::worker_thread_stdin::stdin); - } -} diff --git a/crates/wasi/src/preview2/stream.rs b/crates/wasi/src/preview2/stream.rs index f81f5e2771e9..bf2ce502ba5c 100644 --- a/crates/wasi/src/preview2/stream.rs +++ b/crates/wasi/src/preview2/stream.rs @@ -1,6 +1,5 @@ use crate::preview2::filesystem::FileInputStream; use crate::preview2::poll::Subscribe; -use crate::preview2::TableError; use anyhow::Result; use bytes::Bytes; @@ -73,8 +72,8 @@ impl std::error::Error for StreamError { } } -impl From for StreamError { - fn from(error: TableError) -> Self { +impl From for StreamError { + fn from(error: wasmtime::component::ResourceTableError) -> Self { Self::Trap(error.into()) } } @@ -143,7 +142,7 @@ pub trait HostOutputStream: Subscribe { fn write_zeroes(&mut self, nelem: usize) -> StreamResult<()> { // TODO: We could optimize this to not allocate one big zeroed buffer, and instead write // repeatedly from a 'static buffer of zeros. - let bs = Bytes::from_iter(core::iter::repeat(0 as u8).take(nelem)); + let bs = Bytes::from_iter(core::iter::repeat(0).take(nelem)); self.write(bs)?; Ok(()) } diff --git a/crates/wasi/src/preview2/table.rs b/crates/wasi/src/preview2/table.rs deleted file mode 100644 index 444e7b25f363..000000000000 --- a/crates/wasi/src/preview2/table.rs +++ /dev/null @@ -1,258 +0,0 @@ -use std::any::Any; -use std::collections::{BTreeSet, HashMap}; -use wasmtime::component::Resource; - -#[derive(thiserror::Error, Debug)] -pub enum TableError { - #[error("table has no free keys")] - Full, - #[error("value not present")] - NotPresent, - #[error("value is of another type")] - WrongType, - #[error("entry still has children")] - HasChildren, -} - -/// The `Table` type is designed to map u32 handles to resources. The table is now part of the -/// public interface to a `WasiCtx` - it is reference counted so that it can be shared beyond a -/// `WasiCtx` with other WASI proposals (e.g. `wasi-crypto` and `wasi-nn`) to manage their -/// resources. Elements in the `Table` are `Any` typed. -/// -/// The `Table` type is intended to model how the Interface Types concept of Resources is shaping -/// up. Right now it is just an approximation. -#[derive(Debug)] -pub struct Table { - map: HashMap, - next_key: u32, -} - -/// This structure tracks parent and child relationships for a given table entry. -/// -/// Parents and children are referred to by table index. We maintain the -/// following invariants to prevent orphans and cycles: -/// * parent can only be assigned on creating the entry. -/// * parent, if some, must exist when creating the entry. -/// * whenever a child is created, its index is added to children. -/// * whenever a child is deleted, its index is removed from children. -/// * an entry with children may not be deleted. -#[derive(Debug)] -struct TableEntry { - /// The entry in the table, as a boxed dynamically-typed object - entry: Box, - /// The index of the parent of this entry, if it has one. - parent: Option, - /// The indicies of any children of this entry. - children: BTreeSet, -} - -impl TableEntry { - fn new(entry: Box, parent: Option) -> Self { - Self { - entry, - parent, - children: BTreeSet::new(), - } - } - fn add_child(&mut self, child: u32) { - debug_assert!(!self.children.contains(&child)); - self.children.insert(child); - } - fn remove_child(&mut self, child: u32) { - let was_removed = self.children.remove(&child); - debug_assert!(was_removed); - } -} - -impl Table { - /// Create an empty table - pub fn new() -> Self { - Table { - map: HashMap::new(), - // 0, 1 and 2 are formerly (preview 1) for stdio. To prevent users from assuming these - // indicies are still valid ways to access stdio, they are deliberately left empty. - // Once we have a full implementation of resources, this confusion should hopefully be - // impossible :) - next_key: 3, - } - } - - /// Inserts a new value `T` into this table, returning a corresponding - /// `Resource` which can be used to refer to it after it was inserted. - pub fn push(&mut self, entry: T) -> Result, TableError> - where - T: Send + Sync + 'static, - { - let idx = self.push_(TableEntry::new(Box::new(entry), None))?; - Ok(Resource::new_own(idx)) - } - - fn push_(&mut self, e: TableEntry) -> Result { - // NOTE: The performance of this new key calculation could be very bad once keys wrap - // around. - if self.map.len() == u32::MAX as usize { - return Err(TableError::Full); - } - loop { - let key = self.next_key; - self.next_key = self.next_key.wrapping_add(1); - if self.map.contains_key(&key) { - continue; - } - self.map.insert(key, e); - return Ok(key); - } - } - - /// Insert a resource at the next available index, and track that it has a - /// parent resource. - /// - /// The parent must exist to create a child. All children resources must - /// be destroyed before a parent can be destroyed - otherwise [`Table::delete`] - /// will fail with [`TableError::HasChildren`]. - /// - /// Parent-child relationships are tracked inside the table to ensure that - /// a parent resource is not deleted while it has live children. This - /// allows child resources to hold "references" to a parent by table - /// index, to avoid needing e.g. an `Arc>` and the associated - /// locking overhead and design issues, such as child existence extending - /// lifetime of parent referent even after parent resource is destroyed, - /// possibility for deadlocks. - /// - /// Parent-child relationships may not be modified once created. There - /// is no way to observe these relationships through the [`Table`] methods - /// except for erroring on deletion, or the [`std::fmt::Debug`] impl. - pub fn push_child( - &mut self, - entry: T, - parent: &Resource, - ) -> Result, TableError> - where - T: Send + Sync + 'static, - U: 'static, - { - let idx = self.push_child_(Box::new(entry), parent.rep())?; - Ok(Resource::new_own(idx)) - } - - fn push_child_( - &mut self, - entry: Box, - parent: u32, - ) -> Result { - if !self.map.contains_key(&parent) { - return Err(TableError::NotPresent); - } - let child = self.push_(TableEntry::new(entry, Some(parent)))?; - self.map - .get_mut(&parent) - .expect("parent existence assured above") - .add_child(child); - Ok(child) - } - - /// Get an immutable reference to a resource of a given type at a given - /// index. - /// - /// Multiple shared references can be borrowed at any given time. - pub fn get(&self, key: &Resource) -> Result<&T, TableError> { - self.get_(key.rep())? - .downcast_ref() - .ok_or(TableError::WrongType) - } - - fn get_(&self, key: u32) -> Result<&dyn Any, TableError> { - let r = self.map.get(&key).ok_or(TableError::NotPresent)?; - Ok(&*r.entry) - } - - /// Get an mutable reference to a resource of a given type at a given - /// index. - pub fn get_mut(&mut self, key: &Resource) -> Result<&mut T, TableError> { - self.get_any_mut(key.rep())? - .downcast_mut() - .ok_or(TableError::WrongType) - } - - /// Returns the raw `Any` at the `key` index provided. - pub fn get_any_mut(&mut self, key: u32) -> Result<&mut dyn Any, TableError> { - let r = self.map.get_mut(&key).ok_or(TableError::NotPresent)?; - Ok(&mut *r.entry) - } - - /// Same as `delete`, but typed - pub fn delete(&mut self, resource: Resource) -> Result - where - T: Any, - { - debug_assert!(resource.owned()); - let entry = self.delete_entry(resource.rep())?; - match entry.entry.downcast() { - Ok(t) => Ok(*t), - Err(_e) => Err(TableError::WrongType), - } - } - - fn delete_entry(&mut self, key: u32) -> Result { - if !self - .map - .get(&key) - .ok_or(TableError::NotPresent)? - .children - .is_empty() - { - return Err(TableError::HasChildren); - } - let e = self.map.remove(&key).unwrap(); - if let Some(parent) = e.parent { - // Remove deleted resource from parent's child list. - // Parent must still be present because it cant be deleted while still having - // children: - self.map - .get_mut(&parent) - .expect("missing parent") - .remove_child(key); - } - Ok(e) - } - - /// Zip the values of the map with mutable references to table entries corresponding to each - /// key. As the keys in the [HashMap] are unique, this iterator can give mutable references - /// with the same lifetime as the mutable reference to the [Table]. - pub fn iter_entries<'a, T>( - &'a mut self, - map: HashMap, - ) -> impl Iterator, T)> { - map.into_iter().map(move |(k, v)| { - let item = self - .map - .get_mut(&k) - .map(|e| Box::as_mut(&mut e.entry)) - // Safety: extending the lifetime of the mutable reference. - .map(|item| unsafe { &mut *(item as *mut dyn Any) }) - .ok_or(TableError::NotPresent); - (item, v) - }) - } - - /// Iterate over all children belonging to the provided parent - pub fn iter_children( - &self, - parent: &Resource, - ) -> Result, TableError> - where - T: 'static, - { - let parent_entry = self.map.get(&parent.rep()).ok_or(TableError::NotPresent)?; - Ok(parent_entry.children.iter().map(|child_index| { - let child = self.map.get(child_index).expect("missing child"); - child.entry.as_ref() - })) - } -} - -impl Default for Table { - fn default() -> Self { - Table::new() - } -} diff --git a/crates/wasi/src/preview2/tcp.rs b/crates/wasi/src/preview2/tcp.rs index 23061760c27b..0b27aa3b55db 100644 --- a/crates/wasi/src/preview2/tcp.rs +++ b/crates/wasi/src/preview2/tcp.rs @@ -1,17 +1,21 @@ use super::network::SocketAddressFamily; -use super::{HostInputStream, HostOutputStream, StreamError}; -use crate::preview2::{ - with_ambient_tokio_runtime, AbortOnDropJoinHandle, InputStream, OutputStream, Subscribe, +use super::{ + with_ambient_tokio_runtime, HostInputStream, HostOutputStream, SocketResult, StreamError, }; +use crate::preview2::{AbortOnDropJoinHandle, Subscribe}; use anyhow::{Error, Result}; -use cap_net_ext::{AddressFamily, Blocking, TcpListenerExt}; -use cap_std::net::TcpListener; -use io_lifetimes::raw::{FromRawSocketlike, IntoRawSocketlike}; +use cap_net_ext::AddressFamily; +use futures::Future; +use io_lifetimes::views::SocketlikeView; +use io_lifetimes::AsSocketlike; use rustix::net::sockopt; use std::io; use std::mem; +use std::pin::Pin; use std::sync::Arc; -use tokio::io::Interest; + +/// Value taken from rust std library. +const DEFAULT_BACKLOG: u32 = 128; /// The state of a TCP socket. /// @@ -19,32 +23,34 @@ use tokio::io::Interest; /// activities of binding, listening, accepting, and connecting. pub(crate) enum TcpState { /// The initial state for a newly-created socket. - Default, + Default(tokio::net::TcpSocket), /// Binding started via `start_bind`. - BindStarted, + BindStarted(tokio::net::TcpSocket), /// Binding finished via `finish_bind`. The socket has an address but /// is not yet listening for connections. - Bound, + Bound(tokio::net::TcpSocket), /// Listening started via `listen_start`. - ListenStarted, + ListenStarted(tokio::net::TcpSocket), /// The socket is now listening and waiting for an incoming connection. - Listening, + Listening { + listener: tokio::net::TcpListener, + pending_accept: Option>, + }, /// An outgoing connection is started via `start_connect`. - Connecting, + Connecting(Pin> + Send>>), /// An outgoing connection is ready to be established. - ConnectReady, - - /// An outgoing connection was attempted but failed. - ConnectFailed, + ConnectReady(io::Result), /// An outgoing connection has been established. - Connected, + Connected(Arc), + + Closed, } /// A host TCP socket, plus associated bookkeeping. @@ -52,15 +58,11 @@ pub(crate) enum TcpState { /// The inner state is wrapped in an Arc because the same underlying socket is /// used for implementing the stream types. pub struct TcpSocket { - /// The part of a `TcpSocket` which is reference-counted so that we - /// can pass it to async tasks. - pub(crate) inner: Arc, - /// The current state in the bind/listen/accept/connect progression. pub(crate) tcp_state: TcpState, - /// The desired listen queue size. Set to None to use the system's default. - pub(crate) listen_backlog_size: Option, + /// The desired listen queue size. + pub(crate) listen_backlog_size: u32, pub(crate) family: SocketAddressFamily, @@ -83,7 +85,7 @@ pub(crate) struct TcpReadStream { } impl TcpReadStream { - fn new(stream: Arc) -> Self { + pub(crate) fn new(stream: Arc) -> Self { Self { stream, closed: false, @@ -259,43 +261,28 @@ impl Subscribe for TcpWriteStream { impl TcpSocket { /// Create a new socket in the given family. pub fn new(family: AddressFamily) -> io::Result { - // Create a new host socket and set it to non-blocking, which is needed - // by our async implementation. - let tcp_listener = TcpListener::new(family, Blocking::No)?; - - let socket_address_family = match family { - AddressFamily::Ipv4 => SocketAddressFamily::Ipv4, - AddressFamily::Ipv6 => SocketAddressFamily::Ipv6 { - v6only: sockopt::get_ipv6_v6only(&tcp_listener)?, - }, - }; + with_ambient_tokio_runtime(|| { + let (socket, family) = match family { + AddressFamily::Ipv4 => { + let socket = tokio::net::TcpSocket::new_v4()?; + (socket, SocketAddressFamily::Ipv4) + } + AddressFamily::Ipv6 => { + let socket = tokio::net::TcpSocket::new_v6()?; + sockopt::set_ipv6_v6only(&socket, true)?; + (socket, SocketAddressFamily::Ipv6) + } + }; - Self::from_tcp_listener(tcp_listener, socket_address_family) + Self::from_state(TcpState::Default(socket), family) + }) } /// Create a `TcpSocket` from an existing socket. - /// - /// The socket must be in non-blocking mode. - pub(crate) fn from_tcp_stream( - tcp_socket: cap_std::net::TcpStream, - family: SocketAddressFamily, - ) -> io::Result { - let tcp_listener = TcpListener::from(rustix::fd::OwnedFd::from(tcp_socket)); - Self::from_tcp_listener(tcp_listener, family) - } - - pub(crate) fn from_tcp_listener( - tcp_listener: cap_std::net::TcpListener, - family: SocketAddressFamily, - ) -> io::Result { - let fd = tcp_listener.into_raw_socketlike(); - let std_stream = unsafe { std::net::TcpStream::from_raw_socketlike(fd) }; - let stream = with_ambient_tokio_runtime(|| tokio::net::TcpStream::try_from(std_stream))?; - + pub(crate) fn from_state(state: TcpState, family: SocketAddressFamily) -> io::Result { Ok(Self { - inner: Arc::new(stream), - tcp_state: TcpState::Default, - listen_backlog_size: None, + tcp_state: state, + listen_backlog_size: DEFAULT_BACKLOG, family, #[cfg(target_os = "macos")] receive_buffer_size: None, @@ -308,31 +295,56 @@ impl TcpSocket { }) } - pub fn tcp_socket(&self) -> &tokio::net::TcpStream { - &self.inner - } + pub(crate) fn as_std_view(&self) -> SocketResult> { + use crate::preview2::bindings::sockets::network::ErrorCode; + + match &self.tcp_state { + TcpState::Default(socket) | TcpState::Bound(socket) => { + Ok(socket.as_socketlike_view::()) + } + TcpState::Connected(stream) => Ok(stream.as_socketlike_view::()), + TcpState::Listening { listener, .. } => { + Ok(listener.as_socketlike_view::()) + } - /// Create the input/output stream pair for a tcp socket. - pub fn as_split(&self) -> (InputStream, OutputStream) { - let input = Box::new(TcpReadStream::new(self.inner.clone())); - let output = Box::new(TcpWriteStream::new(self.inner.clone())); - (InputStream::Host(input), output) + TcpState::BindStarted(..) + | TcpState::ListenStarted(..) + | TcpState::Connecting(..) + | TcpState::ConnectReady(..) + | TcpState::Closed => Err(ErrorCode::InvalidState.into()), + } } } #[async_trait::async_trait] impl Subscribe for TcpSocket { async fn ready(&mut self) { - // Some states are ready immediately. - match self.tcp_state { - TcpState::BindStarted | TcpState::ListenStarted | TcpState::ConnectReady => return, - _ => {} + match &mut self.tcp_state { + TcpState::Default(..) + | TcpState::BindStarted(..) + | TcpState::Bound(..) + | TcpState::ListenStarted(..) + | TcpState::ConnectReady(..) + | TcpState::Closed + | TcpState::Connected(..) => { + // No async operation in progress. + } + TcpState::Connecting(future) => { + self.tcp_state = TcpState::ConnectReady(future.as_mut().await); + } + TcpState::Listening { + listener, + pending_accept, + } => match pending_accept { + Some(_) => {} + None => { + let result = futures::future::poll_fn(|cx| { + listener.poll_accept(cx).map_ok(|(stream, _)| stream) + }) + .await; + *pending_accept = Some(result); + } + }, } - - // FIXME: Add `Interest::ERROR` when we update to tokio 1.32. - self.inner - .ready(Interest::READABLE | Interest::WRITABLE) - .await - .unwrap(); } } diff --git a/crates/wasi/src/preview2/udp.rs b/crates/wasi/src/preview2/udp.rs index 16335d60107f..e6a5269a80a6 100644 --- a/crates/wasi/src/preview2/udp.rs +++ b/crates/wasi/src/preview2/udp.rs @@ -1,13 +1,14 @@ +use crate::preview2::host::network::util; use crate::preview2::poll::Subscribe; use crate::preview2::with_ambient_tokio_runtime; use async_trait::async_trait; -use cap_net_ext::{AddressFamily, Blocking, UdpSocketExt}; +use cap_net_ext::{AddressFamily, Blocking}; use io_lifetimes::raw::{FromRawSocketlike, IntoRawSocketlike}; use std::io; use std::net::SocketAddr; use std::sync::Arc; -use super::network::SocketAddressFamily; +use super::network::{SocketAddrCheck, SocketAddressFamily}; /// The state of a UDP socket. /// @@ -42,6 +43,9 @@ pub struct UdpSocket { /// Socket address family. pub(crate) family: SocketAddressFamily, + + /// The check of allowed addresses + pub(crate) socket_addr_check: Option, } #[async_trait] @@ -54,32 +58,32 @@ impl Subscribe for UdpSocket { impl UdpSocket { /// Create a new socket in the given family. pub fn new(family: AddressFamily) -> io::Result { - let socket = Self::new_tokio_socket(family)?; + // Create a new host socket and set it to non-blocking, which is needed + // by our async implementation. + let fd = util::udp_socket(family, Blocking::No)?; let socket_address_family = match family { AddressFamily::Ipv4 => SocketAddressFamily::Ipv4, - AddressFamily::Ipv6 => SocketAddressFamily::Ipv6 { - v6only: rustix::net::sockopt::get_ipv6_v6only(&socket)?, - }, + AddressFamily::Ipv6 => { + rustix::net::sockopt::set_ipv6_v6only(&fd, true)?; + SocketAddressFamily::Ipv6 + } }; + let socket = Self::setup_tokio_udp_socket(fd)?; + Ok(UdpSocket { inner: Arc::new(socket), udp_state: UdpState::Default, family: socket_address_family, + socket_addr_check: None, }) } - fn new_tokio_socket(family: AddressFamily) -> io::Result { - // Create a new host socket and set it to non-blocking, which is needed - // by our async implementation. - let cap_std_socket = cap_std::net::UdpSocket::new(family, Blocking::No)?; - let fd = cap_std_socket.into_raw_socketlike(); - let std_socket = unsafe { std::net::UdpSocket::from_raw_socketlike(fd) }; - let tokio_socket = - with_ambient_tokio_runtime(|| tokio::net::UdpSocket::try_from(std_socket))?; - - Ok(tokio_socket) + fn setup_tokio_udp_socket(fd: rustix::fd::OwnedFd) -> io::Result { + let std_socket = + unsafe { std::net::UdpSocket::from_raw_socketlike(fd.into_raw_socketlike()) }; + with_ambient_tokio_runtime(|| tokio::net::UdpSocket::try_from(std_socket)) } pub fn udp_socket(&self) -> &tokio::net::UdpSocket { @@ -104,6 +108,9 @@ pub struct OutgoingDatagramStream { pub(crate) family: SocketAddressFamily, pub(crate) send_state: SendState, + + /// The check of allowed addresses + pub(crate) socket_addr_check: Option, } pub(crate) enum SendState { diff --git a/crates/wasi/src/preview2/write_stream.rs b/crates/wasi/src/preview2/write_stream.rs index afc2305f007a..79f381537684 100644 --- a/crates/wasi/src/preview2/write_stream.rs +++ b/crates/wasi/src/preview2/write_stream.rs @@ -99,7 +99,7 @@ impl Worker { } self.write_ready_changed.notify_one(); } - async fn work(&self, mut writer: T) { + async fn work(&self, mut writer: T) { use tokio::io::AsyncWriteExt; loop { while let Some(job) = self.pop() { @@ -145,7 +145,7 @@ pub struct AsyncWriteStream { impl AsyncWriteStream { /// Create a [`AsyncWriteStream`]. In order to use the [`HostOutputStream`] impl /// provided by this struct, the argument must impl [`tokio::io::AsyncWrite`]. - pub fn new( + pub fn new( write_budget: usize, writer: T, ) -> Self { diff --git a/crates/wasi/tests/all/api.rs b/crates/wasi/tests/all/api.rs index 4abf8a11923c..0da9c783662b 100644 --- a/crates/wasi/tests/all/api.rs +++ b/crates/wasi/tests/all/api.rs @@ -4,32 +4,25 @@ use cap_std::fs::Dir; use std::io::Write; use std::sync::Mutex; use std::time::Duration; -use wasmtime::component::{Component, Linker}; +use wasmtime::component::{Component, Linker, ResourceTable}; use wasmtime::{Config, Engine, Store}; use wasmtime_wasi::preview2::bindings::wasi::clocks::wall_clock; use wasmtime_wasi::preview2::bindings::wasi::filesystem::types as filesystem; use wasmtime_wasi::preview2::command::{add_to_linker, Command}; use wasmtime_wasi::preview2::{ - self, DirPerms, FilePerms, HostMonotonicClock, HostWallClock, Table, WasiCtx, WasiCtxBuilder, - WasiView, + self, DirPerms, FilePerms, HostMonotonicClock, HostWallClock, WasiCtx, WasiCtxBuilder, WasiView, }; struct CommandCtx { - table: Table, + table: ResourceTable, wasi: WasiCtx, } impl WasiView for CommandCtx { - fn table(&self) -> &Table { - &self.table - } - fn table_mut(&mut self) -> &mut Table { + fn table(&mut self) -> &mut ResourceTable { &mut self.table } - fn ctx(&self) -> &WasiCtx { - &self.wasi - } - fn ctx_mut(&mut self) -> &mut WasiCtx { + fn ctx(&mut self) -> &mut WasiCtx { &mut self.wasi } } @@ -82,7 +75,7 @@ async fn api_time() -> Result<()> { } } - let table = Table::new(); + let table = ResourceTable::new(); let wasi = WasiCtxBuilder::new() .monotonic_clock(FakeMonotonicClock { now: Mutex::new(0) }) .wall_clock(FakeWallClock) @@ -104,7 +97,7 @@ async fn api_read_only() -> Result<()> { std::fs::File::create(dir.path().join("bar.txt"))?.write_all(b"And stood awhile in thought")?; std::fs::create_dir(dir.path().join("sub"))?; - let table = Table::new(); + let table = ResourceTable::new(); let open_dir = Dir::open_ambient_dir(dir.path(), ambient_authority())?; let wasi = WasiCtxBuilder::new() .preopened_dir(open_dir, DirPerms::READ, FilePerms::READ, "/") @@ -155,7 +148,7 @@ wasmtime::component::bindgen!({ #[test_log::test(tokio::test)] async fn api_reactor() -> Result<()> { - let table = Table::new(); + let table = ResourceTable::new(); let wasi = WasiCtxBuilder::new().env("GOOD_DOG", "gussie").build(); let mut config = Config::new(); @@ -185,7 +178,7 @@ async fn api_reactor() -> Result<()> { // `host` crate for `streams`, not because of `with` in the bindgen macro. let writepipe = preview2::pipe::MemoryOutputPipe::new(4096); let stream: preview2::OutputStream = Box::new(writepipe.clone()); - let table_ix = store.data_mut().table_mut().push(stream)?; + let table_ix = store.data_mut().table().push(stream)?; let r = reactor.call_write_strings_to(&mut store, table_ix).await?; assert_eq!(r, Ok(())); diff --git a/crates/wasi/tests/all/async_.rs b/crates/wasi/tests/all/async_.rs index ba6a76f3d685..1aaabe0d5ddf 100644 --- a/crates/wasi/tests/all/async_.rs +++ b/crates/wasi/tests/all/async_.rs @@ -26,8 +26,7 @@ foreach_preview1!(assert_test_exists); foreach_preview2!(assert_test_exists); // Below here is mechanical: there should be one test for every binary in -// wasi-tests. The only differences should be should_panic annotations for -// tests which fail. +// wasi-tests. #[test_log::test(tokio::test(flavor = "multi_thread"))] async fn preview1_big_random_buf() { run(PREVIEW1_BIG_RANDOM_BUF_COMPONENT, false).await.unwrap() @@ -111,9 +110,8 @@ async fn preview1_file_unbuffered_write() { .unwrap() } #[test_log::test(tokio::test(flavor = "multi_thread"))] -#[cfg_attr(windows, should_panic)] async fn preview1_interesting_paths() { - run(PREVIEW1_INTERESTING_PATHS_COMPONENT, false) + run(PREVIEW1_INTERESTING_PATHS_COMPONENT, true) .await .unwrap() } @@ -184,13 +182,6 @@ async fn preview1_path_rename_dir_trailing_slashes() { .unwrap() } #[test_log::test(tokio::test(flavor = "multi_thread"))] -#[should_panic] -async fn preview1_path_rename_file_trailing_slashes() { - run(PREVIEW1_PATH_RENAME_FILE_TRAILING_SLASHES_COMPONENT, false) - .await - .unwrap() -} -#[test_log::test(tokio::test(flavor = "multi_thread"))] async fn preview1_path_rename() { run(PREVIEW1_PATH_RENAME_COMPONENT, false).await.unwrap() } @@ -218,9 +209,8 @@ async fn preview1_readlink() { run(PREVIEW1_READLINK_COMPONENT, false).await.unwrap() } #[test_log::test(tokio::test(flavor = "multi_thread"))] -#[should_panic] -async fn preview1_remove_directory_trailing_slashes() { - run(PREVIEW1_REMOVE_DIRECTORY_TRAILING_SLASHES_COMPONENT, false) +async fn preview1_remove_directory() { + run(PREVIEW1_REMOVE_DIRECTORY_COMPONENT, false) .await .unwrap() } @@ -291,6 +281,10 @@ async fn preview1_unicode_output() { async fn preview1_file_write() { run(PREVIEW1_FILE_WRITE_COMPONENT, false).await.unwrap() } +#[test_log::test(tokio::test(flavor = "multi_thread"))] +async fn preview1_path_open_lots() { + run(PREVIEW1_PATH_OPEN_LOTS_COMPONENT, false).await.unwrap() +} #[test_log::test(tokio::test(flavor = "multi_thread"))] async fn preview2_sleep() { @@ -361,6 +355,10 @@ async fn preview2_stream_pollable_traps() { .unwrap_err(); assert_eq!( format!("{}", e.source().expect("trap source")), - "entry still has children" + "resource has children" ) } +#[test_log::test(tokio::test(flavor = "multi_thread"))] +async fn preview2_adapter_badfd() { + run(PREVIEW2_ADAPTER_BADFD_COMPONENT, false).await.unwrap() +} diff --git a/crates/wasi/tests/all/main.rs b/crates/wasi/tests/all/main.rs index 1af5503f029d..7be20730f493 100644 --- a/crates/wasi/tests/all/main.rs +++ b/crates/wasi/tests/all/main.rs @@ -1,18 +1,17 @@ use anyhow::Result; -use cap_std::ambient_authority; use tempfile::TempDir; use wasmtime::{ - component::{Component, Linker}, + component::{Component, Linker, ResourceTable}, Config, Engine, Store, }; use wasmtime_wasi::preview2::{ pipe::MemoryOutputPipe, preview1::{WasiPreview1Adapter, WasiPreview1View}, - DirPerms, FilePerms, Table, WasiCtx, WasiCtxBuilder, WasiView, + DirPerms, FilePerms, WasiCtx, WasiCtxBuilder, WasiView, }; struct Ctx { - table: Table, + table: ResourceTable, wasi: WasiCtx, stdout: MemoryOutputPipe, stderr: MemoryOutputPipe, @@ -20,16 +19,10 @@ struct Ctx { } impl WasiView for Ctx { - fn table(&self) -> &Table { - &self.table - } - fn table_mut(&mut self) -> &mut Table { + fn table(&mut self) -> &mut ResourceTable { &mut self.table } - fn ctx(&self) -> &WasiCtx { - &self.wasi - } - fn ctx_mut(&mut self) -> &mut WasiCtx { + fn ctx(&mut self) -> &mut WasiCtx { &mut self.wasi } } @@ -64,7 +57,7 @@ fn store(engine: &Engine, name: &str, inherit_stdio: bool) -> Result<(Store builder .args(&[name, "."]) - .inherit_network(ambient_authority()) + .inherit_network() .allow_ip_name_lookup(true); println!("preopen: {:?}", workspace); let preopen_dir = @@ -75,7 +68,7 @@ fn store(engine: &Engine, name: &str, inherit_stdio: bool) -> Result<(Store } let ctx = Ctx { - table: Table::new(), + table: ResourceTable::new(), wasi: builder.build(), stderr, stdout, diff --git a/crates/wasi/tests/all/preview1.rs b/crates/wasi/tests/all/preview1.rs index c30f4d558a0c..dcfcb0041f52 100644 --- a/crates/wasi/tests/all/preview1.rs +++ b/crates/wasi/tests/all/preview1.rs @@ -24,8 +24,7 @@ async fn run(path: &str, inherit_stdio: bool) -> Result<()> { foreach_preview1!(assert_test_exists); // Below here is mechanical: there should be one test for every binary in -// wasi-tests. The only differences should be should_panic annotations for -// tests which fail. +// wasi-tests. #[test_log::test(tokio::test(flavor = "multi_thread"))] async fn preview1_big_random_buf() { run(PREVIEW1_BIG_RANDOM_BUF, false).await.unwrap() @@ -95,9 +94,8 @@ async fn preview1_file_unbuffered_write() { run(PREVIEW1_FILE_UNBUFFERED_WRITE, false).await.unwrap() } #[test_log::test(tokio::test(flavor = "multi_thread"))] -#[cfg_attr(windows, should_panic)] async fn preview1_interesting_paths() { - run(PREVIEW1_INTERESTING_PATHS, false).await.unwrap() + run(PREVIEW1_INTERESTING_PATHS, true).await.unwrap() } #[test_log::test(tokio::test(flavor = "multi_thread"))] async fn preview1_regular_file_isatty() { @@ -152,13 +150,6 @@ async fn preview1_path_rename_dir_trailing_slashes() { .unwrap() } #[test_log::test(tokio::test(flavor = "multi_thread"))] -#[should_panic] -async fn preview1_path_rename_file_trailing_slashes() { - run(PREVIEW1_PATH_RENAME_FILE_TRAILING_SLASHES, false) - .await - .unwrap() -} -#[test_log::test(tokio::test(flavor = "multi_thread"))] async fn preview1_path_rename() { run(PREVIEW1_PATH_RENAME, false).await.unwrap() } @@ -182,11 +173,8 @@ async fn preview1_readlink() { run(PREVIEW1_READLINK, false).await.unwrap() } #[test_log::test(tokio::test(flavor = "multi_thread"))] -#[should_panic] -async fn preview1_remove_directory_trailing_slashes() { - run(PREVIEW1_REMOVE_DIRECTORY_TRAILING_SLASHES, false) - .await - .unwrap() +async fn preview1_remove_directory() { + run(PREVIEW1_REMOVE_DIRECTORY, false).await.unwrap() } #[test_log::test(tokio::test(flavor = "multi_thread"))] async fn preview1_remove_nonempty_directory() { @@ -249,3 +237,7 @@ async fn preview1_unicode_output() { async fn preview1_file_write() { run(PREVIEW1_FILE_WRITE, true).await.unwrap() } +#[test_log::test(tokio::test(flavor = "multi_thread"))] +async fn preview1_path_open_lots() { + run(PREVIEW1_PATH_OPEN_LOTS, true).await.unwrap() +} diff --git a/crates/wasi/tests/all/sync.rs b/crates/wasi/tests/all/sync.rs index 09094d1660d2..c12454643721 100644 --- a/crates/wasi/tests/all/sync.rs +++ b/crates/wasi/tests/all/sync.rs @@ -25,8 +25,7 @@ foreach_preview1!(assert_test_exists); foreach_preview2!(assert_test_exists); // Below here is mechanical: there should be one test for every binary in -// wasi-tests. The only differences should be should_panic annotations for -// tests which fail. +// wasi-tests. #[test_log::test] fn preview1_big_random_buf() { run(PREVIEW1_BIG_RANDOM_BUF_COMPONENT, false).unwrap() @@ -96,7 +95,6 @@ fn preview1_file_unbuffered_write() { run(PREVIEW1_FILE_UNBUFFERED_WRITE_COMPONENT, false).unwrap() } #[test_log::test] -#[cfg_attr(windows, should_panic)] fn preview1_interesting_paths() { run(PREVIEW1_INTERESTING_PATHS_COMPONENT, false).unwrap() } @@ -149,11 +147,6 @@ fn preview1_path_rename_dir_trailing_slashes() { run(PREVIEW1_PATH_RENAME_DIR_TRAILING_SLASHES_COMPONENT, false).unwrap() } #[test_log::test] -#[should_panic] -fn preview1_path_rename_file_trailing_slashes() { - run(PREVIEW1_PATH_RENAME_FILE_TRAILING_SLASHES_COMPONENT, false).unwrap() -} -#[test_log::test] fn preview1_path_rename() { run(PREVIEW1_PATH_RENAME_COMPONENT, false).unwrap() } @@ -175,9 +168,8 @@ fn preview1_readlink() { run(PREVIEW1_READLINK_COMPONENT, false).unwrap() } #[test_log::test] -#[should_panic] -fn preview1_remove_directory_trailing_slashes() { - run(PREVIEW1_REMOVE_DIRECTORY_TRAILING_SLASHES_COMPONENT, false).unwrap() +fn preview1_remove_directory() { + run(PREVIEW1_REMOVE_DIRECTORY_COMPONENT, false).unwrap() } #[test_log::test] fn preview1_remove_nonempty_directory() { @@ -236,6 +228,10 @@ fn preview1_unicode_output() { fn preview1_file_write() { run(PREVIEW1_FILE_WRITE_COMPONENT, false).unwrap() } +#[test_log::test] +fn preview1_path_open_lots() { + run(PREVIEW1_PATH_OPEN_LOTS_COMPONENT, false).unwrap() +} #[test_log::test] fn preview2_sleep() { @@ -298,6 +294,10 @@ fn preview2_stream_pollable_traps() { let e = run(PREVIEW2_STREAM_POLLABLE_TRAPS_COMPONENT, false).unwrap_err(); assert_eq!( format!("{}", e.source().expect("trap source")), - "entry still has children" + "resource has children" ) } +#[test_log::test] +fn preview2_adapter_badfd() { + run(PREVIEW2_ADAPTER_BADFD_COMPONENT, false).unwrap() +} diff --git a/crates/wasi/tests/process_stdin.rs b/crates/wasi/tests/process_stdin.rs new file mode 100644 index 000000000000..5835335f3b69 --- /dev/null +++ b/crates/wasi/tests/process_stdin.rs @@ -0,0 +1,165 @@ +use std::io::{BufRead, Write}; +use std::process::Command; +use wasmtime_wasi::preview2::{HostInputStream, Subscribe}; + +const VAR_NAME: &str = "__CHILD_PROCESS"; + +fn main() { + if cfg!(miri) { + return; + } + // Skip this tests if it looks like we're in a cross-compiled situation and + // we're emulating this test for a different platform. In that scenario + // emulators (like QEMU) tend to not report signals the same way and such. + if std::env::vars() + .filter(|(k, _v)| k.starts_with("CARGO_TARGET") && k.ends_with("RUNNER")) + .count() + > 0 + { + return; + } + + match std::env::var(VAR_NAME) { + Ok(_) => child_process(), + Err(_) => parent_process(), + } + + fn child_process() { + let mut result_write = std::io::stderr(); + let mut child_running = true; + while child_running { + tokio::runtime::Builder::new_multi_thread() + .enable_all() + .build() + .unwrap() + .block_on(async { + 'task: loop { + println!("child: creating stdin"); + let mut stdin = wasmtime_wasi::preview2::stdin(); + + println!("child: checking that stdin is not ready"); + assert!( + tokio::time::timeout( + std::time::Duration::from_millis(100), + stdin.ready() + ) + .await + .is_err(), + "stdin available too soon" + ); + + writeln!(&mut result_write, "start").unwrap(); + + println!("child: started"); + + let mut buffer = String::new(); + loop { + println!("child: waiting for stdin to be ready"); + stdin.ready().await; + + println!("child: reading input"); + // We can't effectively test for the case where stdin was closed, so panic if it is... + let bytes = stdin.read(1024).unwrap(); + + println!("child got: {:?}", bytes); + + buffer.push_str(std::str::from_utf8(bytes.as_ref()).unwrap()); + if let Some((line, rest)) = buffer.split_once('\n') { + if line == "all done" { + writeln!(&mut result_write, "done").unwrap(); + println!("child: exiting..."); + child_running = false; + break 'task; + } else if line == "restart_runtime" { + writeln!(&mut result_write, "restarting").unwrap(); + println!("child: restarting runtime..."); + break 'task; + } else if line == "restart_task" { + writeln!(&mut result_write, "restarting").unwrap(); + println!("child: restarting task..."); + continue 'task; + } else { + writeln!(&mut result_write, "{}", line).unwrap(); + } + + buffer = rest.to_owned(); + } + } + } + }); + println!("child: runtime exited"); + } + println!("child: exiting"); + } +} + +fn parent_process() { + let me = std::env::current_exe().unwrap(); + let mut cmd = Command::new(me); + cmd.env(VAR_NAME, "1"); + cmd.stdin(std::process::Stdio::piped()); + + if std::env::args().any(|arg| arg == "--nocapture") { + cmd.stdout(std::process::Stdio::inherit()); + } else { + cmd.stdout(std::process::Stdio::null()); + } + + cmd.stderr(std::process::Stdio::piped()); + let mut child = cmd.spawn().unwrap(); + + let mut stdin_write = child.stdin.take().unwrap(); + let mut result_read = std::io::BufReader::new(child.stderr.take().unwrap()); + + let mut line = String::new(); + result_read.read_line(&mut line).unwrap(); + assert_eq!(line, "start\n"); + + for i in 0..5 { + let message = format!("some bytes {}\n", i); + stdin_write.write_all(message.as_bytes()).unwrap(); + line.clear(); + result_read.read_line(&mut line).unwrap(); + assert_eq!(line, message); + } + + writeln!(&mut stdin_write, "restart_task").unwrap(); + line.clear(); + result_read.read_line(&mut line).unwrap(); + assert_eq!(line, "restarting\n"); + line.clear(); + + result_read.read_line(&mut line).unwrap(); + assert_eq!(line, "start\n"); + + for i in 0..10 { + let message = format!("more bytes {}\n", i); + stdin_write.write_all(message.as_bytes()).unwrap(); + line.clear(); + result_read.read_line(&mut line).unwrap(); + assert_eq!(line, message); + } + + writeln!(&mut stdin_write, "restart_runtime").unwrap(); + line.clear(); + result_read.read_line(&mut line).unwrap(); + assert_eq!(line, "restarting\n"); + line.clear(); + + result_read.read_line(&mut line).unwrap(); + assert_eq!(line, "start\n"); + + for i in 0..17 { + let message = format!("even more bytes {}\n", i); + stdin_write.write_all(message.as_bytes()).unwrap(); + line.clear(); + result_read.read_line(&mut line).unwrap(); + assert_eq!(line, message); + } + + writeln!(&mut stdin_write, "all done").unwrap(); + + line.clear(); + result_read.read_line(&mut line).unwrap(); + assert_eq!(line, "done\n"); +} diff --git a/crates/wasi/wit/command-extended.wit b/crates/wasi/wit/command-extended.wit index 92c7be0db02b..4bff99e65a19 100644 --- a/crates/wasi/wit/command-extended.wit +++ b/crates/wasi/wit/command-extended.wit @@ -1,6 +1,6 @@ // All of the same imports and exports available in the wasi:cli/command world // with addition of HTTP proxy related imports: world command-extended { - include wasi:cli/command@0.2.0-rc-2023-11-10; - import wasi:http/outgoing-handler@0.2.0-rc-2023-11-10; + include wasi:cli/command@0.2.0; + import wasi:http/outgoing-handler@0.2.0; } diff --git a/crates/wasi/wit/deps/cli/command.wit b/crates/wasi/wit/deps/cli/command.wit index 74811d3272d6..d8005bd38819 100644 --- a/crates/wasi/wit/deps/cli/command.wit +++ b/crates/wasi/wit/deps/cli/command.wit @@ -1,7 +1,7 @@ -package wasi:cli@0.2.0-rc-2023-11-10; +package wasi:cli@0.2.0; world command { - include reactor; + include imports; export run; } diff --git a/crates/wasi/wit/deps/cli/imports.wit b/crates/wasi/wit/deps/cli/imports.wit new file mode 100644 index 000000000000..083b84a036d7 --- /dev/null +++ b/crates/wasi/wit/deps/cli/imports.wit @@ -0,0 +1,20 @@ +package wasi:cli@0.2.0; + +world imports { + include wasi:clocks/imports@0.2.0; + include wasi:filesystem/imports@0.2.0; + include wasi:sockets/imports@0.2.0; + include wasi:random/imports@0.2.0; + include wasi:io/imports@0.2.0; + + import environment; + import exit; + import stdin; + import stdout; + import stderr; + import terminal-input; + import terminal-output; + import terminal-stdin; + import terminal-stdout; + import terminal-stderr; +} diff --git a/crates/wasi/wit/deps/cli/reactor.wit b/crates/wasi/wit/deps/cli/reactor.wit deleted file mode 100644 index eafa2fd49950..000000000000 --- a/crates/wasi/wit/deps/cli/reactor.wit +++ /dev/null @@ -1,31 +0,0 @@ -package wasi:cli@0.2.0-rc-2023-11-10; - -world reactor { - import wasi:clocks/wall-clock@0.2.0-rc-2023-11-10; - import wasi:clocks/monotonic-clock@0.2.0-rc-2023-11-10; - import wasi:filesystem/types@0.2.0-rc-2023-11-10; - import wasi:filesystem/preopens@0.2.0-rc-2023-11-10; - import wasi:sockets/instance-network@0.2.0-rc-2023-11-10; - import wasi:sockets/ip-name-lookup@0.2.0-rc-2023-11-10; - import wasi:sockets/network@0.2.0-rc-2023-11-10; - import wasi:sockets/tcp-create-socket@0.2.0-rc-2023-11-10; - import wasi:sockets/tcp@0.2.0-rc-2023-11-10; - import wasi:sockets/udp-create-socket@0.2.0-rc-2023-11-10; - import wasi:sockets/udp@0.2.0-rc-2023-11-10; - import wasi:random/random@0.2.0-rc-2023-11-10; - import wasi:random/insecure@0.2.0-rc-2023-11-10; - import wasi:random/insecure-seed@0.2.0-rc-2023-11-10; - import wasi:io/poll@0.2.0-rc-2023-11-10; - import wasi:io/streams@0.2.0-rc-2023-11-10; - - import environment; - import exit; - import stdin; - import stdout; - import stderr; - import terminal-input; - import terminal-output; - import terminal-stdin; - import terminal-stdout; - import terminal-stderr; -} diff --git a/crates/wasi/wit/deps/cli/stdio.wit b/crates/wasi/wit/deps/cli/stdio.wit index 1b653b6e2d02..31ef35b5a760 100644 --- a/crates/wasi/wit/deps/cli/stdio.wit +++ b/crates/wasi/wit/deps/cli/stdio.wit @@ -1,17 +1,17 @@ interface stdin { - use wasi:io/streams@0.2.0-rc-2023-11-10.{input-stream}; + use wasi:io/streams@0.2.0.{input-stream}; get-stdin: func() -> input-stream; } interface stdout { - use wasi:io/streams@0.2.0-rc-2023-11-10.{output-stream}; + use wasi:io/streams@0.2.0.{output-stream}; get-stdout: func() -> output-stream; } interface stderr { - use wasi:io/streams@0.2.0-rc-2023-11-10.{output-stream}; + use wasi:io/streams@0.2.0.{output-stream}; get-stderr: func() -> output-stream; } diff --git a/crates/wasi/wit/deps/cli/terminal.wit b/crates/wasi/wit/deps/cli/terminal.wit index 47495769b31f..38c724efc840 100644 --- a/crates/wasi/wit/deps/cli/terminal.wit +++ b/crates/wasi/wit/deps/cli/terminal.wit @@ -1,19 +1,21 @@ +/// Terminal input. +/// +/// In the future, this may include functions for disabling echoing, +/// disabling input buffering so that keyboard events are sent through +/// immediately, querying supported features, and so on. interface terminal-input { /// The input side of a terminal. resource terminal-input; - - // In the future, this may include functions for disabling echoing, - // disabling input buffering so that keyboard events are sent through - // immediately, querying supported features, and so on. } +/// Terminal output. +/// +/// In the future, this may include functions for querying the terminal +/// size, being notified of terminal size changes, querying supported +/// features, and so on. interface terminal-output { /// The output side of a terminal. resource terminal-output; - - // In the future, this may include functions for querying the terminal - // size, being notified of terminal size changes, querying supported - // features, and so on. } /// An interface providing an optional `terminal-input` for stdin as a diff --git a/crates/wasi/wit/deps/clocks/monotonic-clock.wit b/crates/wasi/wit/deps/clocks/monotonic-clock.wit index 09ef32c36378..4e4dc3a19967 100644 --- a/crates/wasi/wit/deps/clocks/monotonic-clock.wit +++ b/crates/wasi/wit/deps/clocks/monotonic-clock.wit @@ -1,4 +1,4 @@ -package wasi:clocks@0.2.0-rc-2023-11-10; +package wasi:clocks@0.2.0; /// WASI Monotonic Clock is a clock API intended to let users measure elapsed /// time. /// @@ -10,7 +10,7 @@ package wasi:clocks@0.2.0-rc-2023-11-10; /// /// It is intended for measuring elapsed time. interface monotonic-clock { - use wasi:io/poll@0.2.0-rc-2023-11-10.{pollable}; + use wasi:io/poll@0.2.0.{pollable}; /// An instant in time, in nanoseconds. An instant is relative to an /// unspecified initial value, and can only be compared to instances from diff --git a/crates/wasi/wit/deps/clocks/wall-clock.wit b/crates/wasi/wit/deps/clocks/wall-clock.wit index 8abb9a0c0e83..440ca0f3364f 100644 --- a/crates/wasi/wit/deps/clocks/wall-clock.wit +++ b/crates/wasi/wit/deps/clocks/wall-clock.wit @@ -1,4 +1,4 @@ -package wasi:clocks@0.2.0-rc-2023-11-10; +package wasi:clocks@0.2.0; /// WASI Wall Clock is a clock API intended to let users query the current /// time. The name "wall" makes an analogy to a "clock on the wall", which /// is not necessarily monotonic as it may be reset. diff --git a/crates/wasi/wit/deps/clocks/world.wit b/crates/wasi/wit/deps/clocks/world.wit index 8fa080f0e2eb..c0224572a55b 100644 --- a/crates/wasi/wit/deps/clocks/world.wit +++ b/crates/wasi/wit/deps/clocks/world.wit @@ -1,4 +1,4 @@ -package wasi:clocks@0.2.0-rc-2023-11-10; +package wasi:clocks@0.2.0; world imports { import monotonic-clock; diff --git a/crates/wasi/wit/deps/filesystem/preopens.wit b/crates/wasi/wit/deps/filesystem/preopens.wit index 95ec67843474..da801f6d604e 100644 --- a/crates/wasi/wit/deps/filesystem/preopens.wit +++ b/crates/wasi/wit/deps/filesystem/preopens.wit @@ -1,4 +1,4 @@ -package wasi:filesystem@0.2.0-rc-2023-11-10; +package wasi:filesystem@0.2.0; interface preopens { use types.{descriptor}; diff --git a/crates/wasi/wit/deps/filesystem/types.wit b/crates/wasi/wit/deps/filesystem/types.wit index 059722ab8627..11108fcda230 100644 --- a/crates/wasi/wit/deps/filesystem/types.wit +++ b/crates/wasi/wit/deps/filesystem/types.wit @@ -1,4 +1,4 @@ -package wasi:filesystem@0.2.0-rc-2023-11-10; +package wasi:filesystem@0.2.0; /// WASI filesystem is a filesystem API primarily intended to let users run WASI /// programs that access their files on their existing filesystems, without /// significant overhead. @@ -24,8 +24,8 @@ package wasi:filesystem@0.2.0-rc-2023-11-10; /// /// [WASI filesystem path resolution]: https://github.com/WebAssembly/wasi-filesystem/blob/main/path-resolution.md interface types { - use wasi:io/streams@0.2.0-rc-2023-11-10.{input-stream, output-stream, error}; - use wasi:clocks/wall-clock@0.2.0-rc-2023-11-10.{datetime}; + use wasi:io/streams@0.2.0.{input-stream, output-stream, error}; + use wasi:clocks/wall-clock@0.2.0.{datetime}; /// File size or length of a region within a file. type filesize = u64; diff --git a/crates/wasi/wit/deps/filesystem/world.wit b/crates/wasi/wit/deps/filesystem/world.wit index 285e0bae9eb3..663f57920d5d 100644 --- a/crates/wasi/wit/deps/filesystem/world.wit +++ b/crates/wasi/wit/deps/filesystem/world.wit @@ -1,4 +1,4 @@ -package wasi:filesystem@0.2.0-rc-2023-11-10; +package wasi:filesystem@0.2.0; world imports { import types; diff --git a/crates/wasi/wit/deps/http/proxy.wit b/crates/wasi/wit/deps/http/proxy.wit index 453f5905119c..687c24d23332 100644 --- a/crates/wasi/wit/deps/http/proxy.wit +++ b/crates/wasi/wit/deps/http/proxy.wit @@ -1,4 +1,4 @@ -package wasi:http@0.2.0-rc-2023-11-10; +package wasi:http@0.2.0; /// The `wasi:http/proxy` world captures a widely-implementable intersection of /// hosts that includes HTTP forward and reverse proxies. Components targeting @@ -6,20 +6,19 @@ package wasi:http@0.2.0-rc-2023-11-10; /// outgoing HTTP requests. world proxy { /// HTTP proxies have access to time and randomness. - import wasi:clocks/wall-clock@0.2.0-rc-2023-11-10; - import wasi:clocks/monotonic-clock@0.2.0-rc-2023-11-10; - import wasi:random/random@0.2.0-rc-2023-11-10; + include wasi:clocks/imports@0.2.0; + import wasi:random/random@0.2.0; /// Proxies have standard output and error streams which are expected to /// terminate in a developer-facing console provided by the host. - import wasi:cli/stdout@0.2.0-rc-2023-11-10; - import wasi:cli/stderr@0.2.0-rc-2023-11-10; + import wasi:cli/stdout@0.2.0; + import wasi:cli/stderr@0.2.0; /// TODO: this is a temporary workaround until component tooling is able to /// gracefully handle the absence of stdin. Hosts must return an eof stream /// for this import, which is what wasi-libc + tooling will do automatically /// when this import is properly removed. - import wasi:cli/stdin@0.2.0-rc-2023-11-10; + import wasi:cli/stdin@0.2.0; /// This is the default handler to use when user code simply wants to make an /// HTTP request (e.g., via `fetch()`). diff --git a/crates/wasi/wit/deps/http/types.wit b/crates/wasi/wit/deps/http/types.wit index 1dd4214cd4a1..755ac6a6bc96 100644 --- a/crates/wasi/wit/deps/http/types.wit +++ b/crates/wasi/wit/deps/http/types.wit @@ -2,10 +2,10 @@ /// HTTP Requests and Responses, both incoming and outgoing, as well as /// their headers, trailers, and bodies. interface types { - use wasi:clocks/monotonic-clock@0.2.0-rc-2023-11-10.{duration}; - use wasi:io/streams@0.2.0-rc-2023-11-10.{input-stream, output-stream}; - use wasi:io/error@0.2.0-rc-2023-11-10.{error as io-error}; - use wasi:io/poll@0.2.0-rc-2023-11-10.{pollable}; + use wasi:clocks/monotonic-clock@0.2.0.{duration}; + use wasi:io/streams@0.2.0.{input-stream, output-stream}; + use wasi:io/error@0.2.0.{error as io-error}; + use wasi:io/poll@0.2.0.{pollable}; /// This type corresponds to HTTP standard Methods. variant method { @@ -169,9 +169,16 @@ interface types { entries: list> ) -> result; - /// Get all of the values corresponding to a key. + /// Get all of the values corresponding to a key. If the key is not present + /// in this `fields`, an empty list is returned. However, if the key is + /// present but empty, this is represented by a list with one or more + /// empty field-values present. get: func(name: field-key) -> list; + /// Returns `true` when the key is present in this `fields`. If the key is + /// syntactically invalid, `false` is returned. + has: func(name: field-key) -> bool; + /// Set all of the values for a key. Clears any existing values for that /// key, if they have been set. /// @@ -191,7 +198,7 @@ interface types { append: func(name: field-key, value: field-value) -> result<_, header-error>; /// Retrieve the full set of keys and values in the Fields. Like the - /// constructor, the list represents each key-value pair. + /// constructor, the list represents each key-value pair. /// /// The outer list represents each key-value pair in the Fields. Keys /// which have multiple values are represented by multiple entries in this @@ -308,9 +315,9 @@ interface types { headers: func() -> headers; } - /// Parameters for making an HTTP Request. Each of these parameters is an - /// optional timeout, with the unit in milliseconds, applicable to the - /// transport layer of the HTTP protocol. + /// Parameters for making an HTTP Request. Each of these parameters is + /// currently an optional timeout applicable to the transport layer of the + /// HTTP protocol. /// /// These timeouts are separate from any the user may use to bound a /// blocking call to `wasi:io/poll.poll`. @@ -319,27 +326,27 @@ interface types { constructor(); /// The timeout for the initial connect to the HTTP Server. - connect-timeout-ms: func() -> option; + connect-timeout: func() -> option; /// Set the timeout for the initial connect to the HTTP Server. An error /// return value indicates that this timeout is not supported. - set-connect-timeout-ms: func(ms: option) -> result; + set-connect-timeout: func(duration: option) -> result; /// The timeout for receiving the first byte of the Response body. - first-byte-timeout-ms: func() -> option; + first-byte-timeout: func() -> option; /// Set the timeout for receiving the first byte of the Response body. An /// error return value indicates that this timeout is not supported. - set-first-byte-timeout-ms: func(ms: option) -> result; + set-first-byte-timeout: func(duration: option) -> result; /// The timeout for receiving subsequent chunks of bytes in the Response /// body stream. - between-bytes-timeout-ms: func() -> option; + between-bytes-timeout: func() -> option; /// Set the timeout for receiving subsequent chunks of bytes in the Response /// body stream. An error return value indicates that this timeout is not /// supported. - set-between-bytes-timeout-ms: func(ms: option) -> result; + set-between-bytes-timeout: func(duration: option) -> result; } /// Represents the ability to send an HTTP Response. @@ -437,16 +444,20 @@ interface types { /// The outer `option` represents future readiness. Users can wait on this /// `option` to become `some` using the `subscribe` method. /// - /// The `result` represents that either the HTTP Request or Response body, - /// as well as any trailers, were received successfully, or that an error - /// occured receiving them. The optional `trailers` indicates whether or not - /// trailers were present in the body. + /// The outer `result` is used to retrieve the trailers or error at most + /// once. It will be success on the first call in which the outer option + /// is `some`, and error on subsequent calls. + /// + /// The inner `result` represents that either the HTTP Request or Response + /// body, as well as any trailers, were received successfully, or that an + /// error occured receiving them. The optional `trailers` indicates whether + /// or not trailers were present in the body. /// /// When some `trailers` are returned by this method, the `trailers` /// resource is immutable, and a child. Use of the `set`, `append`, or /// `delete` methods will return an error, and the resource must be /// dropped before the parent `future-trailers` is dropped. - get: func() -> option, error-code>>; + get: func() -> option, error-code>>>; } /// Represents an outgoing HTTP Response. diff --git a/crates/wasi/wit/deps/io/error.wit b/crates/wasi/wit/deps/io/error.wit index 31918acbb46d..22e5b64894b8 100644 --- a/crates/wasi/wit/deps/io/error.wit +++ b/crates/wasi/wit/deps/io/error.wit @@ -1,4 +1,4 @@ -package wasi:io@0.2.0-rc-2023-11-10; +package wasi:io@0.2.0; interface error { diff --git a/crates/wasi/wit/deps/io/poll.wit b/crates/wasi/wit/deps/io/poll.wit index bddde3c1951f..ddc67f8b7ace 100644 --- a/crates/wasi/wit/deps/io/poll.wit +++ b/crates/wasi/wit/deps/io/poll.wit @@ -1,9 +1,9 @@ -package wasi:io@0.2.0-rc-2023-11-10; +package wasi:io@0.2.0; /// A poll API intended to let users wait for I/O events on multiple handles /// at once. interface poll { - /// `pollable` epresents a single I/O event which may be ready, or not. + /// `pollable` represents a single I/O event which may be ready, or not. resource pollable { /// Return the readiness of a pollable. This function never blocks. diff --git a/crates/wasi/wit/deps/io/streams.wit b/crates/wasi/wit/deps/io/streams.wit index e7e1b689a5e4..6d2f871e3b6f 100644 --- a/crates/wasi/wit/deps/io/streams.wit +++ b/crates/wasi/wit/deps/io/streams.wit @@ -1,4 +1,4 @@ -package wasi:io@0.2.0-rc-2023-11-10; +package wasi:io@0.2.0; /// WASI I/O is an I/O abstraction API which is currently focused on providing /// stream types. @@ -32,6 +32,11 @@ interface streams { resource input-stream { /// Perform a non-blocking read from the stream. /// + /// When the source of a `read` is binary data, the bytes from the source + /// are returned verbatim. When the source of a `read` is known to the + /// implementation to be text, bytes containing the UTF-8 encoding of the + /// text are returned. + /// /// This function returns a list of bytes containing the read data, /// when successful. The returned list will contain up to `len` bytes; /// it may return fewer than requested, but not more. The list is @@ -111,6 +116,12 @@ interface streams { /// Perform a write. This function never blocks. /// + /// When the destination of a `write` is binary data, the bytes from + /// `contents` are written verbatim. When the destination of a `write` is + /// known to the implementation to be text, the bytes of `contents` are + /// transcoded from UTF-8 into the encoding of the destination and then + /// written. + /// /// Precondition: check-write gave permit of Ok(n) and contents has a /// length of less than or equal to n. Otherwise, this function will trap. /// @@ -131,7 +142,7 @@ interface streams { /// let pollable = this.subscribe(); /// while !contents.is_empty() { /// // Wait for the stream to become writable - /// poll-one(pollable); + /// pollable.block(); /// let Ok(n) = this.check-write(); // eliding error handling /// let len = min(n, contents.len()); /// let (chunk, rest) = contents.split_at(len); @@ -140,7 +151,7 @@ interface streams { /// } /// this.flush(); /// // Wait for completion of `flush` - /// poll-one(pollable); + /// pollable.block(); /// // Check for any errors that arose during `flush` /// let _ = this.check-write(); // eliding error handling /// ``` @@ -178,7 +189,7 @@ interface streams { /// Write zeroes to a stream. /// - /// this should be used precisely like `write` with the exact same + /// This should be used precisely like `write` with the exact same /// preconditions (must use check-write first), but instead of /// passing a list of bytes, you simply pass the number of zero-bytes /// that should be written. @@ -199,7 +210,7 @@ interface streams { /// let pollable = this.subscribe(); /// while num_zeroes != 0 { /// // Wait for the stream to become writable - /// poll-one(pollable); + /// pollable.block(); /// let Ok(n) = this.check-write(); // eliding error handling /// let len = min(n, num_zeroes); /// this.write-zeroes(len); // eliding error handling @@ -207,7 +218,7 @@ interface streams { /// } /// this.flush(); /// // Wait for completion of `flush` - /// poll-one(pollable); + /// pollable.block(); /// // Check for any errors that arose during `flush` /// let _ = this.check-write(); // eliding error handling /// ``` diff --git a/crates/wasi/wit/deps/io/world.wit b/crates/wasi/wit/deps/io/world.wit index 8243da2ee9a4..5f0b43fe50d1 100644 --- a/crates/wasi/wit/deps/io/world.wit +++ b/crates/wasi/wit/deps/io/world.wit @@ -1,4 +1,4 @@ -package wasi:io@0.2.0-rc-2023-11-10; +package wasi:io@0.2.0; world imports { import streams; diff --git a/crates/wasi/wit/deps/random/insecure-seed.wit b/crates/wasi/wit/deps/random/insecure-seed.wit index f76e87dadce2..47210ac6bdab 100644 --- a/crates/wasi/wit/deps/random/insecure-seed.wit +++ b/crates/wasi/wit/deps/random/insecure-seed.wit @@ -1,4 +1,4 @@ -package wasi:random@0.2.0-rc-2023-11-10; +package wasi:random@0.2.0; /// The insecure-seed interface for seeding hash-map DoS resistance. /// /// It is intended to be portable at least between Unix-family platforms and diff --git a/crates/wasi/wit/deps/random/insecure.wit b/crates/wasi/wit/deps/random/insecure.wit index ec7b9973769f..c58f4ee8522a 100644 --- a/crates/wasi/wit/deps/random/insecure.wit +++ b/crates/wasi/wit/deps/random/insecure.wit @@ -1,4 +1,4 @@ -package wasi:random@0.2.0-rc-2023-11-10; +package wasi:random@0.2.0; /// The insecure interface for insecure pseudo-random numbers. /// /// It is intended to be portable at least between Unix-family platforms and diff --git a/crates/wasi/wit/deps/random/random.wit b/crates/wasi/wit/deps/random/random.wit index 7a7dfa27a994..0c017f09340e 100644 --- a/crates/wasi/wit/deps/random/random.wit +++ b/crates/wasi/wit/deps/random/random.wit @@ -1,4 +1,4 @@ -package wasi:random@0.2.0-rc-2023-11-10; +package wasi:random@0.2.0; /// WASI Random is a random data API. /// /// It is intended to be portable at least between Unix-family platforms and diff --git a/crates/wasi/wit/deps/random/world.wit b/crates/wasi/wit/deps/random/world.wit index 49e5743b4be9..3da34914a4a7 100644 --- a/crates/wasi/wit/deps/random/world.wit +++ b/crates/wasi/wit/deps/random/world.wit @@ -1,4 +1,4 @@ -package wasi:random@0.2.0-rc-2023-11-10; +package wasi:random@0.2.0; world imports { import random; diff --git a/crates/wasi/wit/deps/sockets/ip-name-lookup.wit b/crates/wasi/wit/deps/sockets/ip-name-lookup.wit index 931ccf7e05a9..8e639ec59691 100644 --- a/crates/wasi/wit/deps/sockets/ip-name-lookup.wit +++ b/crates/wasi/wit/deps/sockets/ip-name-lookup.wit @@ -1,6 +1,6 @@ interface ip-name-lookup { - use wasi:io/poll@0.2.0-rc-2023-11-10.{pollable}; + use wasi:io/poll@0.2.0.{pollable}; use network.{network, error-code, ip-address}; diff --git a/crates/wasi/wit/deps/sockets/network.wit b/crates/wasi/wit/deps/sockets/network.wit index 6bb07cd6faa7..9cadf0650a49 100644 --- a/crates/wasi/wit/deps/sockets/network.wit +++ b/crates/wasi/wit/deps/sockets/network.wit @@ -18,8 +18,6 @@ interface network { /// /// See each individual API for what the POSIX equivalents are. They sometimes differ per API. enum error-code { - // ### GENERAL ERRORS ### - /// Unknown error unknown, @@ -64,9 +62,6 @@ interface network { would-block, - - // ### TCP & UDP SOCKET ERRORS ### - /// The operation is not valid in the socket's current state. invalid-state, @@ -83,24 +78,21 @@ interface network { remote-unreachable, - // ### TCP SOCKET ERRORS ### - - /// The connection was forcefully rejected + /// The TCP connection was forcefully rejected connection-refused, - /// The connection was reset. + /// The TCP connection was reset. connection-reset, - /// A connection was aborted. + /// A TCP connection was aborted. connection-aborted, - // ### UDP SOCKET ERRORS ### + /// The size of a datagram sent to a UDP socket exceeded the maximum + /// supported size. datagram-too-large, - // ### NAME LOOKUP ERRORS ### - /// Name does not exist or has no suitable associated IP addresses. name-unresolvable, @@ -128,15 +120,21 @@ interface network { } record ipv4-socket-address { - port: u16, // sin_port - address: ipv4-address, // sin_addr + /// sin_port + port: u16, + /// sin_addr + address: ipv4-address, } record ipv6-socket-address { - port: u16, // sin6_port - flow-info: u32, // sin6_flowinfo - address: ipv6-address, // sin6_addr - scope-id: u32, // sin6_scope_id + /// sin6_port + port: u16, + /// sin6_flowinfo + flow-info: u32, + /// sin6_addr + address: ipv6-address, + /// sin6_scope_id + scope-id: u32, } variant ip-socket-address { diff --git a/crates/wasi/wit/deps/sockets/tcp-create-socket.wit b/crates/wasi/wit/deps/sockets/tcp-create-socket.wit index 768a07c85021..c7ddf1f228ef 100644 --- a/crates/wasi/wit/deps/sockets/tcp-create-socket.wit +++ b/crates/wasi/wit/deps/sockets/tcp-create-socket.wit @@ -6,9 +6,10 @@ interface tcp-create-socket { /// Create a new TCP socket. /// /// Similar to `socket(AF_INET or AF_INET6, SOCK_STREAM, IPPROTO_TCP)` in POSIX. + /// On IPv6 sockets, IPV6_V6ONLY is enabled by default and can't be configured otherwise. /// /// This function does not require a network capability handle. This is considered to be safe because - /// at time of creation, the socket is not bound to any `network` yet. Up to the moment `bind`/`listen`/`connect` + /// at time of creation, the socket is not bound to any `network` yet. Up to the moment `bind`/`connect` /// is called, the socket is effectively an in-memory configuration object, unable to communicate with the outside world. /// /// All sockets are non-blocking. Use the wasi-poll interface to block on asynchronous operations. diff --git a/crates/wasi/wit/deps/sockets/tcp.wit b/crates/wasi/wit/deps/sockets/tcp.wit index b01b65e6c4b5..5902b9ee0519 100644 --- a/crates/wasi/wit/deps/sockets/tcp.wit +++ b/crates/wasi/wit/deps/sockets/tcp.wit @@ -1,8 +1,8 @@ interface tcp { - use wasi:io/streams@0.2.0-rc-2023-11-10.{input-stream, output-stream}; - use wasi:io/poll@0.2.0-rc-2023-11-10.{pollable}; - use wasi:clocks/monotonic-clock@0.2.0-rc-2023-11-10.{duration}; + use wasi:io/streams@0.2.0.{input-stream, output-stream}; + use wasi:io/poll@0.2.0.{pollable}; + use wasi:clocks/monotonic-clock@0.2.0.{duration}; use network.{network, error-code, ip-socket-address, ip-address-family}; enum shutdown-type { @@ -15,9 +15,28 @@ interface tcp { /// Similar to `SHUT_RDWR` in POSIX. both, } - - - /// A TCP socket handle. + + /// A TCP socket resource. + /// + /// The socket can be in one of the following states: + /// - `unbound` + /// - `bind-in-progress` + /// - `bound` (See note below) + /// - `listen-in-progress` + /// - `listening` + /// - `connect-in-progress` + /// - `connected` + /// - `closed` + /// See + /// for a more information. + /// + /// Note: Except where explicitly mentioned, whenever this documentation uses + /// the term "bound" without backticks it actually means: in the `bound` state *or higher*. + /// (i.e. `bound`, `listen-in-progress`, `listening`, `connect-in-progress` or `connected`) + /// + /// In addition to the general error codes documented on the + /// `network::error-code` type, TCP socket methods may always return + /// `error(invalid-state)` when in the `closed` state. resource tcp-socket { /// Bind the socket to a specific network on the provided IP address and port. /// @@ -25,23 +44,32 @@ interface tcp { /// network interface(s) to bind to. /// If the TCP/UDP port is zero, the socket will be bound to a random free port. /// - /// When a socket is not explicitly bound, the first invocation to a listen or connect operation will - /// implicitly bind the socket. - /// - /// Unlike in POSIX, this function is async. This enables interactive WASI hosts to inject permission prompts. + /// Bind can be attempted multiple times on the same socket, even with + /// different arguments on each iteration. But never concurrently and + /// only as long as the previous bind failed. Once a bind succeeds, the + /// binding can't be changed anymore. /// - /// # Typical `start` errors + /// # Typical errors /// - `invalid-argument`: The `local-address` has the wrong address family. (EAFNOSUPPORT, EFAULT on Windows) /// - `invalid-argument`: `local-address` is not a unicast address. (EINVAL) - /// - `invalid-argument`: `local-address` is an IPv4-mapped IPv6 address, but the socket has `ipv6-only` enabled. (EINVAL) + /// - `invalid-argument`: `local-address` is an IPv4-mapped IPv6 address. (EINVAL) /// - `invalid-state`: The socket is already bound. (EINVAL) - /// - /// # Typical `finish` errors /// - `address-in-use`: No ephemeral ports available. (EADDRINUSE, ENOBUFS on Windows) /// - `address-in-use`: Address is already in use. (EADDRINUSE) /// - `address-not-bindable`: `local-address` is not an address that the `network` can bind to. (EADDRNOTAVAIL) /// - `not-in-progress`: A `bind` operation is not in progress. /// - `would-block`: Can't finish the operation, it is still in progress. (EWOULDBLOCK, EAGAIN) + /// + /// # Implementors note + /// When binding to a non-zero port, this bind operation shouldn't be affected by the TIME_WAIT + /// state of a recently closed socket on the same local address. In practice this means that the SO_REUSEADDR + /// socket option should be set implicitly on all platforms, except on Windows where this is the default behavior + /// and SO_REUSEADDR performs something different entirely. + /// + /// Unlike in POSIX, in WASI the bind operation is async. This enables + /// interactive WASI hosts to inject permission prompts. Runtimes that + /// don't want to make use of this ability can simply call the native + /// `bind` as part of either `start-bind` or `finish-bind`. /// /// # References /// - @@ -54,39 +82,40 @@ interface tcp { /// Connect to a remote endpoint. /// /// On success: - /// - the socket is transitioned into the Connection state + /// - the socket is transitioned into the `connection` state. /// - a pair of streams is returned that can be used to read & write to the connection /// - /// POSIX mentions: - /// > If connect() fails, the state of the socket is unspecified. Conforming applications should - /// > close the file descriptor and create a new socket before attempting to reconnect. + /// After a failed connection attempt, the socket will be in the `closed` + /// state and the only valid action left is to `drop` the socket. A single + /// socket can not be used to connect more than once. /// - /// WASI prescribes the following behavior: - /// - If `connect` fails because an input/state validation error, the socket should remain usable. - /// - If a connection was actually attempted but failed, the socket should become unusable for further network communication. - /// Besides `drop`, any method after such a failure may return an error. - /// - /// # Typical `start` errors + /// # Typical errors /// - `invalid-argument`: The `remote-address` has the wrong address family. (EAFNOSUPPORT) /// - `invalid-argument`: `remote-address` is not a unicast address. (EINVAL, ENETUNREACH on Linux, EAFNOSUPPORT on MacOS) - /// - `invalid-argument`: `remote-address` is an IPv4-mapped IPv6 address, but the socket has `ipv6-only` enabled. (EINVAL, EADDRNOTAVAIL on Illumos) - /// - `invalid-argument`: `remote-address` is a non-IPv4-mapped IPv6 address, but the socket was bound to a specific IPv4-mapped IPv6 address. (or vice versa) + /// - `invalid-argument`: `remote-address` is an IPv4-mapped IPv6 address. (EINVAL, EADDRNOTAVAIL on Illumos) /// - `invalid-argument`: The IP address in `remote-address` is set to INADDR_ANY (`0.0.0.0` / `::`). (EADDRNOTAVAIL on Windows) /// - `invalid-argument`: The port in `remote-address` is set to 0. (EADDRNOTAVAIL on Windows) /// - `invalid-argument`: The socket is already attached to a different network. The `network` passed to `connect` must be identical to the one passed to `bind`. - /// - `invalid-state`: The socket is already in the Connection state. (EISCONN) - /// - `invalid-state`: The socket is already in the Listener state. (EOPNOTSUPP, EINVAL on Windows) - /// - /// # Typical `finish` errors + /// - `invalid-state`: The socket is already in the `connected` state. (EISCONN) + /// - `invalid-state`: The socket is already in the `listening` state. (EOPNOTSUPP, EINVAL on Windows) /// - `timeout`: Connection timed out. (ETIMEDOUT) /// - `connection-refused`: The connection was forcefully rejected. (ECONNREFUSED) /// - `connection-reset`: The connection was reset. (ECONNRESET) /// - `connection-aborted`: The connection was aborted. (ECONNABORTED) /// - `remote-unreachable`: The remote address is not reachable. (EHOSTUNREACH, EHOSTDOWN, ENETUNREACH, ENETDOWN, ENONET) /// - `address-in-use`: Tried to perform an implicit bind, but there were no ephemeral ports available. (EADDRINUSE, EADDRNOTAVAIL on Linux, EAGAIN on BSD) - /// - `not-in-progress`: A `connect` operation is not in progress. + /// - `not-in-progress`: A connect operation is not in progress. /// - `would-block`: Can't finish the operation, it is still in progress. (EWOULDBLOCK, EAGAIN) /// + /// # Implementors note + /// The POSIX equivalent of `start-connect` is the regular `connect` syscall. + /// Because all WASI sockets are non-blocking this is expected to return + /// EINPROGRESS, which should be translated to `ok()` in WASI. + /// + /// The POSIX equivalent of `finish-connect` is a `poll` for event `POLLOUT` + /// with a timeout of 0 on the socket descriptor. Followed by a check for + /// the `SO_ERROR` socket option, in case the poll signaled readiness. + /// /// # References /// - /// - @@ -97,22 +126,24 @@ interface tcp { /// Start listening for new connections. /// - /// Transitions the socket into the Listener state. + /// Transitions the socket into the `listening` state. /// - /// Unlike POSIX: - /// - this function is async. This enables interactive WASI hosts to inject permission prompts. - /// - the socket must already be explicitly bound. + /// Unlike POSIX, the socket must already be explicitly bound. /// - /// # Typical `start` errors + /// # Typical errors /// - `invalid-state`: The socket is not bound to any local address. (EDESTADDRREQ) - /// - `invalid-state`: The socket is already in the Connection state. (EISCONN, EINVAL on BSD) - /// - `invalid-state`: The socket is already in the Listener state. - /// - /// # Typical `finish` errors + /// - `invalid-state`: The socket is already in the `connected` state. (EISCONN, EINVAL on BSD) + /// - `invalid-state`: The socket is already in the `listening` state. /// - `address-in-use`: Tried to perform an implicit bind, but there were no ephemeral ports available. (EADDRINUSE) - /// - `not-in-progress`: A `listen` operation is not in progress. + /// - `not-in-progress`: A listen operation is not in progress. /// - `would-block`: Can't finish the operation, it is still in progress. (EWOULDBLOCK, EAGAIN) /// + /// # Implementors note + /// Unlike in POSIX, in WASI the listen operation is async. This enables + /// interactive WASI hosts to inject permission prompts. Runtimes that + /// don't want to make use of this ability can simply call the native + /// `listen` as part of either `start-listen` or `finish-listen`. + /// /// # References /// - /// - @@ -123,9 +154,8 @@ interface tcp { /// Accept a new client socket. /// - /// The returned socket is bound and in the Connection state. The following properties are inherited from the listener socket: + /// The returned socket is bound and in the `connected` state. The following properties are inherited from the listener socket: /// - `address-family` - /// - `ipv6-only` /// - `keep-alive-enabled` /// - `keep-alive-idle-time` /// - `keep-alive-interval` @@ -138,7 +168,7 @@ interface tcp { /// a pair of streams that can be used to read & write to the connection. /// /// # Typical errors - /// - `invalid-state`: Socket is not in the Listener state. (EINVAL) + /// - `invalid-state`: Socket is not in the `listening` state. (EINVAL) /// - `would-block`: No pending connections at the moment. (EWOULDBLOCK, EAGAIN) /// - `connection-aborted`: An incoming connection was pending, but was terminated by the client before this listener could accept it. (ECONNABORTED) /// - `new-socket-limit`: The new socket resource could not be created because of a system limit. (EMFILE, ENFILE) @@ -180,7 +210,7 @@ interface tcp { /// - remote-address: func() -> result; - /// Whether the socket is listening for new connections. + /// Whether the socket is in the `listening` state. /// /// Equivalent to the SO_ACCEPTCONN socket option. is-listening: func() -> bool; @@ -190,17 +220,6 @@ interface tcp { /// Equivalent to the SO_DOMAIN socket option. address-family: func() -> ip-address-family; - /// Whether IPv4 compatibility (dual-stack) mode is disabled or not. - /// - /// Equivalent to the IPV6_V6ONLY socket option. - /// - /// # Typical errors - /// - `invalid-state`: (set) The socket is already bound. - /// - `not-supported`: (get/set) `this` socket is an IPv4 socket. - /// - `not-supported`: (set) Host does not support dual-stack sockets. (Implementations are not required to.) - ipv6-only: func() -> result; - set-ipv6-only: func(value: bool) -> result<_, error-code>; - /// Hints the desired listen queue size. Implementations are free to ignore this. /// /// If the provided value is 0, an `invalid-argument` error is returned. @@ -209,7 +228,7 @@ interface tcp { /// # Typical errors /// - `not-supported`: (set) The platform does not support changing the backlog size after the initial listen. /// - `invalid-argument`: (set) The provided value was 0. - /// - `invalid-state`: (set) The socket is already in the Connection state. + /// - `invalid-state`: (set) The socket is in the `connect-in-progress` or `connected` state. set-listen-backlog-size: func(value: u64) -> result<_, error-code>; /// Enables or disables keepalive. @@ -269,8 +288,6 @@ interface tcp { /// /// # Typical errors /// - `invalid-argument`: (set) The TTL value must be 1 or higher. - /// - `invalid-state`: (set) The socket is already in the Connection state. - /// - `invalid-state`: (set) The socket is already in the Listener state. hop-limit: func() -> result; set-hop-limit: func(value: u8) -> result<_, error-code>; @@ -284,14 +301,25 @@ interface tcp { /// /// # Typical errors /// - `invalid-argument`: (set) The provided value was 0. - /// - `invalid-state`: (set) The socket is already in the Connection state. - /// - `invalid-state`: (set) The socket is already in the Listener state. receive-buffer-size: func() -> result; set-receive-buffer-size: func(value: u64) -> result<_, error-code>; send-buffer-size: func() -> result; set-send-buffer-size: func(value: u64) -> result<_, error-code>; - /// Create a `pollable` which will resolve once the socket is ready for I/O. + /// Create a `pollable` which can be used to poll for, or block on, + /// completion of any of the asynchronous operations of this socket. + /// + /// When `finish-bind`, `finish-listen`, `finish-connect` or `accept` + /// return `error(would-block)`, this pollable can be used to wait for + /// their success or failure, after which the method can be retried. + /// + /// The pollable is not limited to the async operation that happens to be + /// in progress at the time of calling `subscribe` (if any). Theoretically, + /// `subscribe` only has to be called once per socket and can then be + /// (re)used for the remainder of the socket's lifetime. + /// + /// See + /// for a more information. /// /// Note: this function is here for WASI Preview2 only. /// It's planned to be removed when `future` is natively supported in Preview3. @@ -299,17 +327,21 @@ interface tcp { /// Initiate a graceful shutdown. /// - /// - receive: the socket is not expecting to receive any more data from the peer. All subsequent read - /// operations on the `input-stream` associated with this socket will return an End Of Stream indication. - /// Any data still in the receive queue at time of calling `shutdown` will be discarded. - /// - send: the socket is not expecting to send any more data to the peer. All subsequent write - /// operations on the `output-stream` associated with this socket will return an error. - /// - both: same effect as receive & send combined. + /// - `receive`: The socket is not expecting to receive any data from + /// the peer. The `input-stream` associated with this socket will be + /// closed. Any data still in the receive queue at time of calling + /// this method will be discarded. + /// - `send`: The socket has no more data to send to the peer. The `output-stream` + /// associated with this socket will be closed and a FIN packet will be sent. + /// - `both`: Same effect as `receive` & `send` combined. + /// + /// This function is idempotent. Shutting a down a direction more than once + /// has no effect and returns `ok`. /// /// The shutdown function does not close (drop) the socket. /// /// # Typical errors - /// - `invalid-state`: The socket is not in the Connection state. (ENOTCONN) + /// - `invalid-state`: The socket is not in the `connected` state. (ENOTCONN) /// /// # References /// - diff --git a/crates/wasi/wit/deps/sockets/udp-create-socket.wit b/crates/wasi/wit/deps/sockets/udp-create-socket.wit index cc58234d8455..0482d1fe7350 100644 --- a/crates/wasi/wit/deps/sockets/udp-create-socket.wit +++ b/crates/wasi/wit/deps/sockets/udp-create-socket.wit @@ -6,6 +6,7 @@ interface udp-create-socket { /// Create a new UDP socket. /// /// Similar to `socket(AF_INET or AF_INET6, SOCK_DGRAM, IPPROTO_UDP)` in POSIX. + /// On IPv6 sockets, IPV6_V6ONLY is enabled by default and can't be configured otherwise. /// /// This function does not require a network capability handle. This is considered to be safe because /// at time of creation, the socket is not bound to any `network` yet. Up to the moment `bind` is called, diff --git a/crates/wasi/wit/deps/sockets/udp.wit b/crates/wasi/wit/deps/sockets/udp.wit index c8dafadfcb21..d987a0a90801 100644 --- a/crates/wasi/wit/deps/sockets/udp.wit +++ b/crates/wasi/wit/deps/sockets/udp.wit @@ -1,6 +1,6 @@ interface udp { - use wasi:io/poll@0.2.0-rc-2023-11-10.{pollable}; + use wasi:io/poll@0.2.0.{pollable}; use network.{network, error-code, ip-socket-address, ip-address-family}; /// A received datagram. @@ -43,19 +43,21 @@ interface udp { /// network interface(s) to bind to. /// If the port is zero, the socket will be bound to a random free port. /// - /// Unlike in POSIX, this function is async. This enables interactive WASI hosts to inject permission prompts. - /// - /// # Typical `start` errors + /// # Typical errors /// - `invalid-argument`: The `local-address` has the wrong address family. (EAFNOSUPPORT, EFAULT on Windows) /// - `invalid-state`: The socket is already bound. (EINVAL) - /// - /// # Typical `finish` errors /// - `address-in-use`: No ephemeral ports available. (EADDRINUSE, ENOBUFS on Windows) /// - `address-in-use`: Address is already in use. (EADDRINUSE) /// - `address-not-bindable`: `local-address` is not an address that the `network` can bind to. (EADDRNOTAVAIL) /// - `not-in-progress`: A `bind` operation is not in progress. /// - `would-block`: Can't finish the operation, it is still in progress. (EWOULDBLOCK, EAGAIN) /// + /// # Implementors note + /// Unlike in POSIX, in WASI the bind operation is async. This enables + /// interactive WASI hosts to inject permission prompts. Runtimes that + /// don't want to make use of this ability can simply call the native + /// `bind` as part of either `start-bind` or `finish-bind`. + /// /// # References /// - /// - @@ -92,7 +94,6 @@ interface udp { /// /// # Typical errors /// - `invalid-argument`: The `remote-address` has the wrong address family. (EAFNOSUPPORT) - /// - `invalid-argument`: `remote-address` is a non-IPv4-mapped IPv6 address, but the socket was bound to a specific IPv4-mapped IPv6 address. (or vice versa) /// - `invalid-argument`: The IP address in `remote-address` is set to INADDR_ANY (`0.0.0.0` / `::`). (EDESTADDRREQ, EADDRNOTAVAIL) /// - `invalid-argument`: The port in `remote-address` is set to 0. (EDESTADDRREQ, EADDRNOTAVAIL) /// - `invalid-state`: The socket is not bound. @@ -142,17 +143,6 @@ interface udp { /// Equivalent to the SO_DOMAIN socket option. address-family: func() -> ip-address-family; - /// Whether IPv4 compatibility (dual-stack) mode is disabled or not. - /// - /// Equivalent to the IPV6_V6ONLY socket option. - /// - /// # Typical errors - /// - `not-supported`: (get/set) `this` socket is an IPv4 socket. - /// - `invalid-state`: (set) The socket is already bound. - /// - `not-supported`: (set) Host does not support dual-stack sockets. (Implementations are not required to.) - ipv6-only: func() -> result; - set-ipv6-only: func(value: bool) -> result<_, error-code>; - /// Equivalent to the IP_TTL & IPV6_UNICAST_HOPS socket options. /// /// If the provided value is 0, an `invalid-argument` error is returned. @@ -248,7 +238,6 @@ interface udp { /// /// # Typical errors /// - `invalid-argument`: The `remote-address` has the wrong address family. (EAFNOSUPPORT) - /// - `invalid-argument`: `remote-address` is a non-IPv4-mapped IPv6 address, but the socket was bound to a specific IPv4-mapped IPv6 address. (or vice versa) /// - `invalid-argument`: The IP address in `remote-address` is set to INADDR_ANY (`0.0.0.0` / `::`). (EDESTADDRREQ, EADDRNOTAVAIL) /// - `invalid-argument`: The port in `remote-address` is set to 0. (EDESTADDRREQ, EADDRNOTAVAIL) /// - `invalid-argument`: The socket is in "connected" mode and `remote-address` is `some` value that does not match the address passed to `stream`. (EISCONN) diff --git a/crates/wasi/wit/deps/sockets/world.wit b/crates/wasi/wit/deps/sockets/world.wit index 49ad8d3d9fde..f8bb92ae0457 100644 --- a/crates/wasi/wit/deps/sockets/world.wit +++ b/crates/wasi/wit/deps/sockets/world.wit @@ -1,4 +1,4 @@ -package wasi:sockets@0.2.0-rc-2023-11-10; +package wasi:sockets@0.2.0; world imports { import instance-network; diff --git a/crates/wasi/wit/test.wit b/crates/wasi/wit/test.wit index 68dfaeaf378b..f590391035c4 100644 --- a/crates/wasi/wit/test.wit +++ b/crates/wasi/wit/test.wit @@ -2,21 +2,21 @@ package wasmtime:wasi; // only used as part of `test-programs` world test-reactor { - include wasi:cli/reactor@0.2.0-rc-2023-11-10; + include wasi:cli/imports@0.2.0; export add-strings: func(s: list) -> u32; export get-strings: func() -> list; - use wasi:io/streams@0.2.0-rc-2023-11-10.{output-stream}; + use wasi:io/streams@0.2.0.{output-stream}; export write-strings-to: func(o: output-stream) -> result; - use wasi:filesystem/types@0.2.0-rc-2023-11-10.{descriptor-stat}; + use wasi:filesystem/types@0.2.0.{descriptor-stat}; export pass-an-imported-record: func(d: descriptor-stat) -> string; } world test-command { - include wasi:cli/reactor@0.2.0-rc-2023-11-10; - import wasi:http/types@0.2.0-rc-2023-11-10; - import wasi:http/outgoing-handler@0.2.0-rc-2023-11-10; + include wasi:cli/imports@0.2.0; + import wasi:http/types@0.2.0; + import wasi:http/outgoing-handler@0.2.0; } diff --git a/crates/wasi/witx/preview0/typenames.witx b/crates/wasi/witx/preview0/typenames.witx new file mode 100644 index 000000000000..f4ba7880242a --- /dev/null +++ b/crates/wasi/witx/preview0/typenames.witx @@ -0,0 +1,746 @@ +;; Type names used by low-level WASI interfaces. +;; +;; Some content here is derived from [CloudABI](https://github.com/NuxiNL/cloudabi). +;; +;; This is a `witx` file. See [here](https://github.com/WebAssembly/WASI/tree/main/docs/witx.md) +;; for an explanation of what that means. + +(typename $size u32) + +;;; Non-negative file size or length of a region within a file. +(typename $filesize u64) + +;;; Timestamp in nanoseconds. +(typename $timestamp u64) + +;;; Identifiers for clocks. +(typename $clockid + (enum (@witx tag u32) + ;;; The clock measuring real time. Time value zero corresponds with + ;;; 1970-01-01T00:00:00Z. + $realtime + ;;; The store-wide monotonic clock, which is defined as a clock measuring + ;;; real time, whose value cannot be adjusted and which cannot have negative + ;;; clock jumps. The epoch of this clock is undefined. The absolute time + ;;; value of this clock therefore has no meaning. + $monotonic + ;;; The CPU-time clock associated with the current process. + $process_cputime_id + ;;; The CPU-time clock associated with the current thread. + $thread_cputime_id + ) +) + +;;; Error codes returned by functions. +;;; Not all of these error codes are returned by the functions provided by this +;;; API; some are used in higher-level library layers, and others are provided +;;; merely for alignment with POSIX. +(typename $errno + (enum (@witx tag u16) + ;;; No error occurred. System call completed successfully. + $success + ;;; Argument list too long. + $2big + ;;; Permission denied. + $acces + ;;; Address in use. + $addrinuse + ;;; Address not available. + $addrnotavail + ;;; Address family not supported. + $afnosupport + ;;; Resource unavailable, or operation would block. + $again + ;;; Connection already in progress. + $already + ;;; Bad file descriptor. + $badf + ;;; Bad message. + $badmsg + ;;; Device or resource busy. + $busy + ;;; Operation canceled. + $canceled + ;;; No child processes. + $child + ;;; Connection aborted. + $connaborted + ;;; Connection refused. + $connrefused + ;;; Connection reset. + $connreset + ;;; Resource deadlock would occur. + $deadlk + ;;; Destination address required. + $destaddrreq + ;;; Mathematics argument out of domain of function. + $dom + ;;; Reserved. + $dquot + ;;; File exists. + $exist + ;;; Bad address. + $fault + ;;; File too large. + $fbig + ;;; Host is unreachable. + $hostunreach + ;;; Identifier removed. + $idrm + ;;; Illegal byte sequence. + $ilseq + ;;; Operation in progress. + $inprogress + ;;; Interrupted function. + $intr + ;;; Invalid argument. + $inval + ;;; I/O error. + $io + ;;; Socket is connected. + $isconn + ;;; Is a directory. + $isdir + ;;; Too many levels of symbolic links. + $loop + ;;; File descriptor value too large. + $mfile + ;;; Too many links. + $mlink + ;;; Message too large. + $msgsize + ;;; Reserved. + $multihop + ;;; Filename too long. + $nametoolong + ;;; Network is down. + $netdown + ;;; Connection aborted by network. + $netreset + ;;; Network unreachable. + $netunreach + ;;; Too many files open in system. + $nfile + ;;; No buffer space available. + $nobufs + ;;; No such device. + $nodev + ;;; No such file or directory. + $noent + ;;; Executable file format error. + $noexec + ;;; No locks available. + $nolck + ;;; Reserved. + $nolink + ;;; Not enough space. + $nomem + ;;; No message of the desired type. + $nomsg + ;;; Protocol not available. + $noprotoopt + ;;; No space left on device. + $nospc + ;;; Function not supported. + $nosys + ;;; The socket is not connected. + $notconn + ;;; Not a directory or a symbolic link to a directory. + $notdir + ;;; Directory not empty. + $notempty + ;;; State not recoverable. + $notrecoverable + ;;; Not a socket. + $notsock + ;;; Not supported, or operation not supported on socket. + $notsup + ;;; Inappropriate I/O control operation. + $notty + ;;; No such device or address. + $nxio + ;;; Value too large to be stored in data type. + $overflow + ;;; Previous owner died. + $ownerdead + ;;; Operation not permitted. + $perm + ;;; Broken pipe. + $pipe + ;;; Protocol error. + $proto + ;;; Protocol not supported. + $protonosupport + ;;; Protocol wrong type for socket. + $prototype + ;;; Result too large. + $range + ;;; Read-only file system. + $rofs + ;;; Invalid seek. + $spipe + ;;; No such process. + $srch + ;;; Reserved. + $stale + ;;; Connection timed out. + $timedout + ;;; Text file busy. + $txtbsy + ;;; Cross-device link. + $xdev + ;;; Extension: Capabilities insufficient. + $notcapable + ) +) + +;;; File descriptor rights, determining which actions may be performed. +(typename $rights + (flags (@witx repr u64) + ;;; The right to invoke `fd_datasync`. + ;; + ;;; If `rights::path_open` is set, includes the right to invoke + ;;; `path_open` with `fdflags::dsync`. + $fd_datasync + ;;; The right to invoke `fd_read` and `sock_recv`. + ;; + ;;; If `rights::fd_seek` is set, includes the right to invoke `fd_pread`. + $fd_read + ;;; The right to invoke `fd_seek`. This flag implies `rights::fd_tell`. + $fd_seek + ;;; The right to invoke `fd_fdstat_set_flags`. + $fd_fdstat_set_flags + ;;; The right to invoke `fd_sync`. + ;; + ;;; If `rights::path_open` is set, includes the right to invoke + ;;; `path_open` with `fdflags::rsync` and `fdflags::dsync`. + $fd_sync + ;;; The right to invoke `fd_seek` in such a way that the file offset + ;;; remains unaltered (i.e., `whence::cur` with offset zero), or to + ;;; invoke `fd_tell`. + $fd_tell + ;;; The right to invoke `fd_write` and `sock_send`. + ;;; If `rights::fd_seek` is set, includes the right to invoke `fd_pwrite`. + $fd_write + ;;; The right to invoke `fd_advise`. + $fd_advise + ;;; The right to invoke `fd_allocate`. + $fd_allocate + ;;; The right to invoke `path_create_directory`. + $path_create_directory + ;;; If `rights::path_open` is set, the right to invoke `path_open` with `oflags::creat`. + $path_create_file + ;;; The right to invoke `path_link` with the file descriptor as the + ;;; source directory. + $path_link_source + ;;; The right to invoke `path_link` with the file descriptor as the + ;;; target directory. + $path_link_target + ;;; The right to invoke `path_open`. + $path_open + ;;; The right to invoke `fd_readdir`. + $fd_readdir + ;;; The right to invoke `path_readlink`. + $path_readlink + ;;; The right to invoke `path_rename` with the file descriptor as the source directory. + $path_rename_source + ;;; The right to invoke `path_rename` with the file descriptor as the target directory. + $path_rename_target + ;;; The right to invoke `path_filestat_get`. + $path_filestat_get + ;;; The right to change a file's size (there is no `path_filestat_set_size`). + ;;; If `rights::path_open` is set, includes the right to invoke `path_open` with `oflags::trunc`. + $path_filestat_set_size + ;;; The right to invoke `path_filestat_set_times`. + $path_filestat_set_times + ;;; The right to invoke `fd_filestat_get`. + $fd_filestat_get + ;;; The right to invoke `fd_filestat_set_size`. + $fd_filestat_set_size + ;;; The right to invoke `fd_filestat_set_times`. + $fd_filestat_set_times + ;;; The right to invoke `path_symlink`. + $path_symlink + ;;; The right to invoke `path_remove_directory`. + $path_remove_directory + ;;; The right to invoke `path_unlink_file`. + $path_unlink_file + ;;; If `rights::fd_read` is set, includes the right to invoke `poll_oneoff` to subscribe to `eventtype::fd_read`. + ;;; If `rights::fd_write` is set, includes the right to invoke `poll_oneoff` to subscribe to `eventtype::fd_write`. + $poll_fd_readwrite + ;;; The right to invoke `sock_shutdown`. + $sock_shutdown + ) +) + +;;; A file descriptor handle. +(typename $fd (handle)) + +;;; A region of memory for scatter/gather reads. +(typename $iovec + (record + ;;; The address of the buffer to be filled. + (field $buf (@witx pointer u8)) + ;;; The length of the buffer to be filled. + (field $buf_len $size) + ) +) + +;;; A region of memory for scatter/gather writes. +(typename $ciovec + (record + ;;; The address of the buffer to be written. + (field $buf (@witx const_pointer u8)) + ;;; The length of the buffer to be written. + (field $buf_len $size) + ) +) + +(typename $iovec_array (list $iovec)) +(typename $ciovec_array (list $ciovec)) + +;;; Relative offset within a file. +(typename $filedelta s64) + +;;; The position relative to which to set the offset of the file descriptor. +(typename $whence + (enum (@witx tag u8) + ;;; Seek relative to current position. + $cur + ;;; Seek relative to end-of-file. + $end + ;;; Seek relative to start-of-file. + $set + ) +) + +;;; A reference to the offset of a directory entry. +(typename $dircookie u64) + +;;; The type for the `dirent::d_namlen` field of `dirent` struct. +(typename $dirnamlen u32) + +;;; File serial number that is unique within its file system. +(typename $inode u64) + +;;; The type of a file descriptor or file. +(typename $filetype + (enum (@witx tag u8) + ;;; The type of the file descriptor or file is unknown or is different from any of the other types specified. + $unknown + ;;; The file descriptor or file refers to a block device inode. + $block_device + ;;; The file descriptor or file refers to a character device inode. + $character_device + ;;; The file descriptor or file refers to a directory inode. + $directory + ;;; The file descriptor or file refers to a regular file inode. + $regular_file + ;;; The file descriptor or file refers to a datagram socket. + $socket_dgram + ;;; The file descriptor or file refers to a byte-stream socket. + $socket_stream + ;;; The file refers to a symbolic link inode. + $symbolic_link + ) +) + +;;; A directory entry. +(typename $dirent + (record + ;;; The offset of the next directory entry stored in this directory. + (field $d_next $dircookie) + ;;; The serial number of the file referred to by this directory entry. + (field $d_ino $inode) + ;;; The length of the name of the directory entry. + (field $d_namlen $dirnamlen) + ;;; The type of the file referred to by this directory entry. + (field $d_type $filetype) + ) +) + +;;; File or memory access pattern advisory information. +(typename $advice + (enum (@witx tag u8) + ;;; The application has no advice to give on its behavior with respect to the specified data. + $normal + ;;; The application expects to access the specified data sequentially from lower offsets to higher offsets. + $sequential + ;;; The application expects to access the specified data in a random order. + $random + ;;; The application expects to access the specified data in the near future. + $willneed + ;;; The application expects that it will not access the specified data in the near future. + $dontneed + ;;; The application expects to access the specified data once and then not reuse it thereafter. + $noreuse + ) +) + +;;; File descriptor flags. +(typename $fdflags + (flags (@witx repr u16) + ;;; Append mode: Data written to the file is always appended to the file's end. + $append + ;;; Write according to synchronized I/O data integrity completion. Only the data stored in the file is synchronized. + $dsync + ;;; Non-blocking mode. + $nonblock + ;;; Synchronized read I/O operations. + $rsync + ;;; Write according to synchronized I/O file integrity completion. In + ;;; addition to synchronizing the data stored in the file, the implementation + ;;; may also synchronously update the file's metadata. + $sync + ) +) + +;;; File descriptor attributes. +(typename $fdstat + (record + ;;; File type. + (field $fs_filetype $filetype) + ;;; File descriptor flags. + (field $fs_flags $fdflags) + ;;; Rights that apply to this file descriptor. + (field $fs_rights_base $rights) + ;;; Maximum set of rights that may be installed on new file descriptors that + ;;; are created through this file descriptor, e.g., through `path_open`. + (field $fs_rights_inheriting $rights) + ) +) + +;;; Identifier for a device containing a file system. Can be used in combination +;;; with `inode` to uniquely identify a file or directory in the filesystem. +(typename $device u64) + +;;; Which file time attributes to adjust. +(typename $fstflags + (flags (@witx repr u16) + ;;; Adjust the last data access timestamp to the value stored in `filestat::atim`. + $atim + ;;; Adjust the last data access timestamp to the time of clock `clockid::realtime`. + $atim_now + ;;; Adjust the last data modification timestamp to the value stored in `filestat::mtim`. + $mtim + ;;; Adjust the last data modification timestamp to the time of clock `clockid::realtime`. + $mtim_now + ) +) + +;;; Flags determining the method of how paths are resolved. +(typename $lookupflags + (flags (@witx repr u32) + ;;; As long as the resolved path corresponds to a symbolic link, it is expanded. + $symlink_follow + ) +) + +;;; Open flags used by `path_open`. +(typename $oflags + (flags (@witx repr u16) + ;;; Create file if it does not exist. + $creat + ;;; Fail if not a directory. + $directory + ;;; Fail if file already exists. + $excl + ;;; Truncate file to size 0. + $trunc + ) +) + +;;; Number of hard links to an inode. +(typename $linkcount u32) + +;;; File attributes. +(typename $filestat + (record + ;;; Device ID of device containing the file. + (field $dev $device) + ;;; File serial number. + (field $ino $inode) + ;;; File type. + (field $filetype $filetype) + ;;; Number of hard links to the file. + (field $nlink $linkcount) + ;;; For regular files, the file size in bytes. For symbolic links, the length in bytes of the pathname contained in the symbolic link. + (field $size $filesize) + ;;; Last data access timestamp. + (field $atim $timestamp) + ;;; Last data modification timestamp. + (field $mtim $timestamp) + ;;; Last file status change timestamp. + (field $ctim $timestamp) + ) +) + +;;; User-provided value that may be attached to objects that is retained when +;;; extracted from the implementation. +(typename $userdata u64) + +;;; Type of a subscription to an event or its occurrence. +(typename $eventtype + (enum (@witx tag u8) + ;;; The time value of clock `subscription_clock::id` has + ;;; reached timestamp `subscription_clock::timeout`. + $clock + ;;; File descriptor `subscription_fd_readwrite::file_descriptor` has data + ;;; available for reading. This event always triggers for regular files. + $fd_read + ;;; File descriptor `subscription_fd_readwrite::file_descriptor` has capacity + ;;; available for writing. This event always triggers for regular files. + $fd_write + ) +) + +;;; The state of the file descriptor subscribed to with +;;; `eventtype::fd_read` or `eventtype::fd_write`. +(typename $eventrwflags + (flags (@witx repr u16) + ;;; The peer of this socket has closed or disconnected. + $fd_readwrite_hangup + ) +) + +;;; The contents of an `event` for the `eventtype::fd_read` and +;;; `eventtype::fd_write` variants +(typename $event_fd_readwrite + (record + ;;; The number of bytes available for reading or writing. + (field $nbytes $filesize) + ;;; The state of the file descriptor. + (field $flags $eventrwflags) + ) +) + +;;; An event that occurred. +(typename $event + (record + ;;; User-provided value that got attached to `subscription::userdata`. + (field $userdata $userdata) + ;;; If non-zero, an error that occurred while processing the subscription request. + (field $error $errno) + ;;; The type of event that occured + (field $type $eventtype) + ;;; The contents of the event, if it is an `eventtype::fd_read` or + ;;; `eventtype::fd_write`. `eventtype::clock` events ignore this field. + (field $fd_readwrite $event_fd_readwrite) + ) +) + +;;; Flags determining how to interpret the timestamp provided in +;;; `subscription_clock::timeout`. +(typename $subclockflags + (flags (@witx repr u16) + ;;; If set, treat the timestamp provided in + ;;; `subscription_clock::timeout` as an absolute timestamp of clock + ;;; `subscription_clock::id`. If clear, treat the timestamp + ;;; provided in `subscription_clock::timeout` relative to the + ;;; current time value of clock `subscription_clock::id`. + $subscription_clock_abstime + ) +) + +;;; The contents of a `subscription` when type is `eventtype::clock`. +(typename $subscription_clock + (record + ;;; The user-defined unique identifier of the clock. + (field $identifier $userdata) + ;;; The clock against which to compare the timestamp. + (field $id $clockid) + ;;; The absolute or relative timestamp. + (field $timeout $timestamp) + ;;; The amount of time that the implementation may wait additionally + ;;; to coalesce with other events. + (field $precision $timestamp) + ;;; Flags specifying whether the timeout is absolute or relative + (field $flags $subclockflags) + ) +) + +;;; The contents of a `subscription` when the variant is +;;; `eventtype::fd_read` or `eventtype::fd_write`. +(typename $subscription_fd_readwrite + (record + ;;; The file descriptor on which to wait for it to become ready for reading or writing. + (field $file_descriptor $fd) + ) +) + +;;; The contents of a `subscription`. +(typename $subscription_u + (union (@witx tag $eventtype) + $subscription_clock + $subscription_fd_readwrite + $subscription_fd_readwrite + ) +) + +;;; Subscription to an event. +(typename $subscription + (record + ;;; User-provided value that is attached to the subscription in the + ;;; implementation and returned through `event::userdata`. + (field $userdata $userdata) + ;;; The type of the event to which to subscribe. + (field $u $subscription_u) + ) +) + +;;; Exit code generated by a process when exiting. +(typename $exitcode u32) + +;;; Signal condition. +(typename $signal + (enum (@witx tag u8) + ;;; No signal. Note that POSIX has special semantics for `kill(pid, 0)`, + ;;; so this value is reserved. + $none + ;;; Hangup. + ;;; Action: Terminates the process. + $hup + ;;; Terminate interrupt signal. + ;;; Action: Terminates the process. + $int + ;;; Terminal quit signal. + ;;; Action: Terminates the process. + $quit + ;;; Illegal instruction. + ;;; Action: Terminates the process. + $ill + ;;; Trace/breakpoint trap. + ;;; Action: Terminates the process. + $trap + ;;; Process abort signal. + ;;; Action: Terminates the process. + $abrt + ;;; Access to an undefined portion of a memory object. + ;;; Action: Terminates the process. + $bus + ;;; Erroneous arithmetic operation. + ;;; Action: Terminates the process. + $fpe + ;;; Kill. + ;;; Action: Terminates the process. + $kill + ;;; User-defined signal 1. + ;;; Action: Terminates the process. + $usr1 + ;;; Invalid memory reference. + ;;; Action: Terminates the process. + $segv + ;;; User-defined signal 2. + ;;; Action: Terminates the process. + $usr2 + ;;; Write on a pipe with no one to read it. + ;;; Action: Ignored. + $pipe + ;;; Alarm clock. + ;;; Action: Terminates the process. + $alrm + ;;; Termination signal. + ;;; Action: Terminates the process. + $term + ;;; Child process terminated, stopped, or continued. + ;;; Action: Ignored. + $chld + ;;; Continue executing, if stopped. + ;;; Action: Continues executing, if stopped. + $cont + ;;; Stop executing. + ;;; Action: Stops executing. + $stop + ;;; Terminal stop signal. + ;;; Action: Stops executing. + $tstp + ;;; Background process attempting read. + ;;; Action: Stops executing. + $ttin + ;;; Background process attempting write. + ;;; Action: Stops executing. + $ttou + ;;; High bandwidth data is available at a socket. + ;;; Action: Ignored. + $urg + ;;; CPU time limit exceeded. + ;;; Action: Terminates the process. + $xcpu + ;;; File size limit exceeded. + ;;; Action: Terminates the process. + $xfsz + ;;; Virtual timer expired. + ;;; Action: Terminates the process. + $vtalrm + ;;; Profiling timer expired. + ;;; Action: Terminates the process. + $prof + ;;; Window changed. + ;;; Action: Ignored. + $winch + ;;; I/O possible. + ;;; Action: Terminates the process. + $poll + ;;; Power failure. + ;;; Action: Terminates the process. + $pwr + ;;; Bad system call. + ;;; Action: Terminates the process. + $sys + ) +) + +;;; Flags provided to `sock_recv`. +(typename $riflags + (flags (@witx repr u16) + ;;; Returns the message without removing it from the socket's receive queue. + $recv_peek + ;;; On byte-stream sockets, block until the full amount of data can be returned. + $recv_waitall + ) +) + +;;; Flags returned by `sock_recv`. +(typename $roflags + (flags (@witx repr u16) + ;;; Returned by `sock_recv`: Message data has been truncated. + $recv_data_truncated + ) +) + +;;; Flags provided to `sock_send`. As there are currently no flags +;;; defined, it must be set to zero. +(typename $siflags u16) + +;;; Which channels on a socket to shut down. +(typename $sdflags + (flags (@witx repr u8) + ;;; Disables further receive operations. + $rd + ;;; Disables further send operations. + $wr + ) +) + +;;; Identifiers for preopened capabilities. +(typename $preopentype + (enum (@witx tag u8) + ;;; A pre-opened directory. + $dir + ) +) + +;;; The contents of a $prestat when type is `preopentype::dir`. +(typename $prestat_dir + (record + ;;; The length of the directory name for use with `fd_prestat_dir_name`. + (field $pr_name_len $size) + ) +) + +;;; Information about a pre-opened capability. +(typename $prestat + (union (@witx tag $preopentype) + $prestat_dir + ) +) diff --git a/crates/wasi/witx/preview0/wasi_unstable.witx b/crates/wasi/witx/preview0/wasi_unstable.witx new file mode 100644 index 000000000000..dbece2641c49 --- /dev/null +++ b/crates/wasi/witx/preview0/wasi_unstable.witx @@ -0,0 +1,513 @@ +;; WASI Preview. This is an evolution of the API that WASI initially +;; launched with. +;; +;; Some content here is derived from [CloudABI](https://github.com/NuxiNL/cloudabi). +;; +;; This is a `witx` file. See [here](https://github.com/WebAssembly/WASI/tree/master/docs/witx.md) +;; for an explanation of what that means. + +(use "typenames.witx") + +;;; This API predated the convention of naming modules with a `wasi_unstable_` +;;; prefix and a version number. It is preserved here for compatibility, but +;;; we shouldn't follow this pattern in new APIs. +(module $wasi_unstable + ;;; Linear memory to be accessed by WASI functions that need it. + (import "memory" (memory)) + + ;;; Read command-line argument data. + ;;; The size of the array should match that returned by `args_sizes_get`. + ;;; Each argument is expected to be `\0` terminated. + (@interface func (export "args_get") + (param $argv (@witx pointer (@witx pointer u8))) + (param $argv_buf (@witx pointer u8)) + (result $error (expected (error $errno))) + ) + ;;; Return command-line argument data sizes. + (@interface func (export "args_sizes_get") + ;;; Returns the number of arguments and the size of the argument string + ;;; data, or an error. + (result $error (expected (tuple $size $size) (error $errno))) + ) + + ;;; Read environment variable data. + ;;; The sizes of the buffers should match that returned by `environ_sizes_get`. + ;;; Key/value pairs are expected to be joined with `=`s, and terminated with `\0`s. + (@interface func (export "environ_get") + (param $environ (@witx pointer (@witx pointer u8))) + (param $environ_buf (@witx pointer u8)) + (result $error (expected (error $errno))) + ) + ;;; Return environment variable data sizes. + (@interface func (export "environ_sizes_get") + ;;; Returns the number of environment variable arguments and the size of the + ;;; environment variable data. + (result $error (expected (tuple $size $size) (error $errno))) + ) + + ;;; Return the resolution of a clock. + ;;; Implementations are required to provide a non-zero value for supported clocks. For unsupported clocks, return + ;;; `errno::inval`. + ;;; Note: This is similar to `clock_getres` in POSIX. + (@interface func (export "clock_res_get") + ;;; The clock for which to return the resolution. + (param $id $clockid) + ;;; The resolution of the clock, or an error if one happened. + (result $error (expected $timestamp (error $errno))) + ) + ;;; Return the time value of a clock. + ;;; Note: This is similar to `clock_gettime` in POSIX. + (@interface func (export "clock_time_get") + ;;; The clock for which to return the time. + (param $id $clockid) + ;;; The maximum lag (exclusive) that the returned time value may have, compared to its actual value. + (param $precision $timestamp) + ;;; The time value of the clock. + (result $error (expected $timestamp (error $errno))) + ) + + ;;; Provide file advisory information on a file descriptor. + ;;; Note: This is similar to `posix_fadvise` in POSIX. + (@interface func (export "fd_advise") + (param $fd $fd) + ;;; The offset within the file to which the advisory applies. + (param $offset $filesize) + ;;; The length of the region to which the advisory applies. + (param $len $filesize) + ;;; The advice. + (param $advice $advice) + (result $error (expected (error $errno))) + ) + + ;;; Force the allocation of space in a file. + ;;; Note: This is similar to `posix_fallocate` in POSIX. + (@interface func (export "fd_allocate") + (param $fd $fd) + ;;; The offset at which to start the allocation. + (param $offset $filesize) + ;;; The length of the area that is allocated. + (param $len $filesize) + (result $error (expected (error $errno))) + ) + + ;;; Close a file descriptor. + ;;; Note: This is similar to `close` in POSIX. + (@interface func (export "fd_close") + (param $fd $fd) + (result $error (expected (error $errno))) + ) + + ;;; Synchronize the data of a file to disk. + ;;; Note: This is similar to `fdatasync` in POSIX. + (@interface func (export "fd_datasync") + (param $fd $fd) + (result $error (expected (error $errno))) + ) + + ;;; Get the attributes of a file descriptor. + ;;; Note: This returns similar flags to `fsync(fd, F_GETFL)` in POSIX, as well as additional fields. + (@interface func (export "fd_fdstat_get") + (param $fd $fd) + ;;; The buffer where the file descriptor's attributes are stored. + (result $error (expected $fdstat (error $errno))) + ) + + ;;; Adjust the flags associated with a file descriptor. + ;;; Note: This is similar to `fcntl(fd, F_SETFL, flags)` in POSIX. + (@interface func (export "fd_fdstat_set_flags") + (param $fd $fd) + ;;; The desired values of the file descriptor flags. + (param $flags $fdflags) + (result $error (expected (error $errno))) + ) + + ;;; Adjust the rights associated with a file descriptor. + ;;; This can only be used to remove rights, and returns `errno::notcapable` if called in a way that would attempt to add rights + (@interface func (export "fd_fdstat_set_rights") + (param $fd $fd) + ;;; The desired rights of the file descriptor. + (param $fs_rights_base $rights) + (param $fs_rights_inheriting $rights) + (result $error (expected (error $errno))) + ) + + ;;; Return the attributes of an open file. + (@interface func (export "fd_filestat_get") + (param $fd $fd) + ;;; The buffer where the file's attributes are stored. + (result $error (expected $filestat (error $errno))) + ) + + ;;; Adjust the size of an open file. If this increases the file's size, the extra bytes are filled with zeros. + ;;; Note: This is similar to `ftruncate` in POSIX. + (@interface func (export "fd_filestat_set_size") + (param $fd $fd) + ;;; The desired file size. + (param $size $filesize) + (result $error (expected (error $errno))) + ) + + ;;; Adjust the timestamps of an open file or directory. + ;;; Note: This is similar to `futimens` in POSIX. + (@interface func (export "fd_filestat_set_times") + (param $fd $fd) + ;;; The desired values of the data access timestamp. + (param $atim $timestamp) + ;;; The desired values of the data modification timestamp. + (param $mtim $timestamp) + ;;; A bitmask indicating which timestamps to adjust. + (param $fst_flags $fstflags) + (result $error (expected (error $errno))) + ) + + ;;; Read from a file descriptor, without using and updating the file descriptor's offset. + ;;; Note: This is similar to `preadv` in POSIX. + (@interface func (export "fd_pread") + (param $fd $fd) + ;;; List of scatter/gather vectors in which to store data. + (param $iovs $iovec_array) + ;;; The offset within the file at which to read. + (param $offset $filesize) + ;;; The number of bytes read. + (result $error (expected $size (error $errno))) + ) + + ;;; Return a description of the given preopened file descriptor. + (@interface func (export "fd_prestat_get") + (param $fd $fd) + ;;; The buffer where the description is stored. + (result $error (expected $prestat (error $errno))) + ) + + ;;; Return a description of the given preopened file descriptor. + (@interface func (export "fd_prestat_dir_name") + (param $fd $fd) + ;;; A buffer into which to write the preopened directory name. + (param $path (@witx pointer u8)) + (param $path_len $size) + (result $error (expected (error $errno))) + ) + + ;;; Write to a file descriptor, without using and updating the file descriptor's offset. + ;;; Note: This is similar to `pwritev` in POSIX. + (@interface func (export "fd_pwrite") + (param $fd $fd) + ;;; List of scatter/gather vectors from which to retrieve data. + (param $iovs $ciovec_array) + ;;; The offset within the file at which to write. + (param $offset $filesize) + ;;; The number of bytes written. + (result $error (expected $size (error $errno))) + ) + + ;;; Read from a file descriptor. + ;;; Note: This is similar to `readv` in POSIX. + (@interface func (export "fd_read") + (param $fd $fd) + ;;; List of scatter/gather vectors to which to store data. + (param $iovs $iovec_array) + ;;; The number of bytes read. + (result $error (expected $size (error $errno))) + ) + + ;;; Read directory entries from a directory. + ;;; When successful, the contents of the output buffer consist of a sequence of + ;;; directory entries. Each directory entry consists of a `dirent` object, + ;;; followed by `dirent::d_namlen` bytes holding the name of the directory + ;;; entry. + ;; + ;;; This function fills the output buffer as much as possible, potentially + ;;; truncating the last directory entry. This allows the caller to grow its + ;;; read buffer size in case it's too small to fit a single large directory + ;;; entry, or skip the oversized directory entry. + (@interface func (export "fd_readdir") + (param $fd $fd) + ;;; The buffer where directory entries are stored + (param $buf (@witx pointer u8)) + (param $buf_len $size) + ;;; The location within the directory to start reading + (param $cookie $dircookie) + ;;; The number of bytes stored in the read buffer. If less than the size of the read buffer, the end of the directory has been reached. + (result $error (expected $size (error $errno))) + ) + + ;;; Atomically replace a file descriptor by renumbering another file descriptor. + ;; + ;;; Due to the strong focus on thread safety, this environment does not provide + ;;; a mechanism to duplicate or renumber a file descriptor to an arbitrary + ;;; number, like `dup2()`. This would be prone to race conditions, as an actual + ;;; file descriptor with the same number could be allocated by a different + ;;; thread at the same time. + ;; + ;;; This function provides a way to atomically renumber file descriptors, which + ;;; would disappear if `dup2()` were to be removed entirely. + (@interface func (export "fd_renumber") + (param $fd $fd) + ;;; The file descriptor to overwrite. + (param $to $fd) + (result $error (expected (error $errno))) + ) + + ;;; Move the offset of a file descriptor. + ;;; Note: This is similar to `lseek` in POSIX. + (@interface func (export "fd_seek") + (param $fd $fd) + ;;; The number of bytes to move. + (param $offset $filedelta) + ;;; The base from which the offset is relative. + (param $whence $whence) + ;;; The new offset of the file descriptor, relative to the start of the file. + (result $error (expected $filesize (error $errno))) + ) + + ;;; Synchronize the data and metadata of a file to disk. + ;;; Note: This is similar to `fsync` in POSIX. + (@interface func (export "fd_sync") + (param $fd $fd) + (result $error (expected (error $errno))) + ) + + ;;; Return the current offset of a file descriptor. + ;;; Note: This is similar to `lseek(fd, 0, SEEK_CUR)` in POSIX. + (@interface func (export "fd_tell") + (param $fd $fd) + ;;; The current offset of the file descriptor, relative to the start of the file. + (result $error (expected $filesize (error $errno))) + ) + + ;;; Write to a file descriptor. + ;;; Note: This is similar to `writev` in POSIX. + (@interface func (export "fd_write") + (param $fd $fd) + ;;; List of scatter/gather vectors from which to retrieve data. + (param $iovs $ciovec_array) + (result $error (expected $size (error $errno))) + ) + + ;;; Create a directory. + ;;; Note: This is similar to `mkdirat` in POSIX. + (@interface func (export "path_create_directory") + (param $fd $fd) + ;;; The path at which to create the directory. + (param $path string) + (result $error (expected (error $errno))) + ) + + ;;; Return the attributes of a file or directory. + ;;; Note: This is similar to `stat` in POSIX. + (@interface func (export "path_filestat_get") + (param $fd $fd) + ;;; Flags determining the method of how the path is resolved. + (param $flags $lookupflags) + ;;; The path of the file or directory to inspect. + (param $path string) + ;;; The buffer where the file's attributes are stored. + (result $error (expected $filestat (error $errno))) + ) + + ;;; Adjust the timestamps of a file or directory. + ;;; Note: This is similar to `utimensat` in POSIX. + (@interface func (export "path_filestat_set_times") + (param $fd $fd) + ;;; Flags determining the method of how the path is resolved. + (param $flags $lookupflags) + ;;; The path of the file or directory to operate on. + (param $path string) + ;;; The desired values of the data access timestamp. + (param $atim $timestamp) + ;;; The desired values of the data modification timestamp. + (param $mtim $timestamp) + ;;; A bitmask indicating which timestamps to adjust. + (param $fst_flags $fstflags) + (result $error (expected (error $errno))) + ) + + ;;; Create a hard link. + ;;; Note: This is similar to `linkat` in POSIX. + (@interface func (export "path_link") + (param $old_fd $fd) + ;;; Flags determining the method of how the path is resolved. + (param $old_flags $lookupflags) + ;;; The source path from which to link. + (param $old_path string) + ;;; The working directory at which the resolution of the new path starts. + (param $new_fd $fd) + ;;; The destination path at which to create the hard link. + (param $new_path string) + (result $error (expected (error $errno))) + ) + + ;;; Open a file or directory. + ;; + ;;; The returned file descriptor is not guaranteed to be the lowest-numbered + ;;; file descriptor not currently open; it is randomized to prevent + ;;; applications from depending on making assumptions about indexes, since this + ;;; is error-prone in multi-threaded contexts. The returned file descriptor is + ;;; guaranteed to be less than 2**31. + ;; + ;;; Note: This is similar to `openat` in POSIX. + (@interface func (export "path_open") + (param $fd $fd) + ;;; Flags determining the method of how the path is resolved. + (param $dirflags $lookupflags) + ;;; The relative path of the file or directory to open, relative to the + ;;; `path_open::fd` directory. + (param $path string) + ;;; The method by which to open the file. + (param $oflags $oflags) + ;;; The initial rights of the newly created file descriptor. The + ;;; implementation is allowed to return a file descriptor with fewer rights + ;;; than specified, if and only if those rights do not apply to the type of + ;;; file being opened. + ;; + ;;; The *base* rights are rights that will apply to operations using the file + ;;; descriptor itself, while the *inheriting* rights are rights that apply to + ;;; file descriptors derived from it. + (param $fs_rights_base $rights) + (param $fs_rights_inheriting $rights) + (param $fdflags $fdflags) + ;;; The file descriptor of the file that has been opened. + (result $error (expected $fd (error $errno))) + ) + + ;;; Read the contents of a symbolic link. + ;;; Note: This is similar to `readlinkat` in POSIX. + (@interface func (export "path_readlink") + (param $fd $fd) + ;;; The path of the symbolic link from which to read. + (param $path string) + ;;; The buffer to which to write the contents of the symbolic link. + (param $buf (@witx pointer u8)) + (param $buf_len $size) + ;;; The number of bytes placed in the buffer. + (result $error (expected $size (error $errno))) + ) + + ;;; Remove a directory. + ;;; Return `errno::notempty` if the directory is not empty. + ;;; Note: This is similar to `unlinkat(fd, path, AT_REMOVEDIR)` in POSIX. + (@interface func (export "path_remove_directory") + (param $fd $fd) + ;;; The path to a directory to remove. + (param $path string) + (result $error (expected (error $errno))) + ) + + ;;; Rename a file or directory. + ;;; Note: This is similar to `renameat` in POSIX. + (@interface func (export "path_rename") + (param $fd $fd) + ;;; The source path of the file or directory to rename. + (param $old_path string) + ;;; The working directory at which the resolution of the new path starts. + (param $new_fd $fd) + ;;; The destination path to which to rename the file or directory. + (param $new_path string) + (result $error (expected (error $errno))) + ) + + ;;; Create a symbolic link. + ;;; Note: This is similar to `symlinkat` in POSIX. + (@interface func (export "path_symlink") + ;;; The contents of the symbolic link. + (param $old_path string) + (param $fd $fd) + ;;; The destination path at which to create the symbolic link. + (param $new_path string) + (result $error (expected (error $errno))) + ) + + + ;;; Unlink a file. + ;;; Return `errno::isdir` if the path refers to a directory. + ;;; Note: This is similar to `unlinkat(fd, path, 0)` in POSIX. + (@interface func (export "path_unlink_file") + (param $fd $fd) + ;;; The path to a file to unlink. + (param $path string) + (result $error (expected (error $errno))) + ) + + ;;; Concurrently poll for the occurrence of a set of events. + (@interface func (export "poll_oneoff") + ;;; The events to which to subscribe. + (param $in (@witx const_pointer $subscription)) + ;;; The events that have occurred. + (param $out (@witx pointer $event)) + ;;; Both the number of subscriptions and events. + (param $nsubscriptions $size) + ;;; The number of events stored. + (result $error (expected $size (error $errno))) + ) + + ;;; Terminate the process normally. An exit code of 0 indicates successful + ;;; termination of the program. The meanings of other values is dependent on + ;;; the environment. + (@interface func (export "proc_exit") + ;;; The exit code returned by the process. + (param $rval $exitcode) + (@witx noreturn) + ) + + ;;; Send a signal to the process of the calling thread. + ;;; Note: This is similar to `raise` in POSIX. + (@interface func (export "proc_raise") + ;;; The signal condition to trigger. + (param $sig $signal) + (result $error (expected (error $errno))) + ) + + ;;; Temporarily yield execution of the calling thread. + ;;; Note: This is similar to `sched_yield` in POSIX. + (@interface func (export "sched_yield") + (result $error (expected (error $errno))) + ) + + ;;; Write high-quality random data into a buffer. + ;;; This function blocks when the implementation is unable to immediately + ;;; provide sufficient high-quality random data. + ;;; This function may execute slowly, so when large mounts of random data are + ;;; required, it's advisable to use this function to seed a pseudo-random + ;;; number generator, rather than to provide the random data directly. + (@interface func (export "random_get") + ;;; The buffer to fill with random data. + (param $buf (@witx pointer u8)) + (param $buf_len $size) + (result $error (expected (error $errno))) + ) + + ;;; Receive a message from a socket. + ;;; Note: This is similar to `recv` in POSIX, though it also supports reading + ;;; the data into multiple buffers in the manner of `readv`. + (@interface func (export "sock_recv") + (param $fd $fd) + ;;; List of scatter/gather vectors to which to store data. + (param $ri_data $iovec_array) + ;;; Message flags. + (param $ri_flags $riflags) + ;;; Number of bytes stored in ri_data and message flags. + (result $error (expected (tuple $size $roflags) (error $errno))) + ) + + ;;; Send a message on a socket. + ;;; Note: This is similar to `send` in POSIX, though it also supports writing + ;;; the data from multiple buffers in the manner of `writev`. + (@interface func (export "sock_send") + (param $fd $fd) + ;;; List of scatter/gather vectors to which to retrieve data + (param $si_data $ciovec_array) + ;;; Message flags. + (param $si_flags $siflags) + ;;; Number of bytes transmitted. + (result $error (expected $size (error $errno))) + ) + + ;;; Shut down socket send and receive channels. + ;;; Note: This is similar to `shutdown` in POSIX. + (@interface func (export "sock_shutdown") + (param $fd $fd) + ;;; Which channels on the socket to shut down. + (param $how $sdflags) + (result $error (expected (error $errno))) + ) +) diff --git a/crates/wasi/witx/typenames.witx b/crates/wasi/witx/preview1/typenames.witx similarity index 100% rename from crates/wasi/witx/typenames.witx rename to crates/wasi/witx/preview1/typenames.witx diff --git a/crates/wasi/witx/wasi_snapshot_preview1.witx b/crates/wasi/witx/preview1/wasi_snapshot_preview1.witx similarity index 100% rename from crates/wasi/witx/wasi_snapshot_preview1.witx rename to crates/wasi/witx/preview1/wasi_snapshot_preview1.witx diff --git a/crates/wasmtime/Cargo.toml b/crates/wasmtime/Cargo.toml index dd4a10e69c73..7dae1fbfaf49 100644 --- a/crates/wasmtime/Cargo.toml +++ b/crates/wasmtime/Cargo.toml @@ -10,17 +10,22 @@ readme = "README.md" edition.workspace = true rust-version.workspace = true +[lints] +workspace = true + [package.metadata.docs.rs] -rustdoc-args = ["--cfg", "nightlydoc"] # Docs.rs will use the `component-model` feature for documentation; # so this feature also passed in to the `cargo doc` invocation in CI. # See .github/workflows/main.yml features = ["component-model"] [dependencies] -wasmtime-runtime = { workspace = true } +wasmtime-runtime = { workspace = true, optional = true } wasmtime-environ = { workspace = true } -wasmtime-jit = { workspace = true } +wasmtime-jit-debug = { workspace = true, features = [ + "perf_jitdump", +], optional = true } +wasmtime-jit-icache-coherence = { workspace = true, optional = true } wasmtime-cache = { workspace = true, optional = true } wasmtime-fiber = { workspace = true, optional = true } wasmtime-cranelift = { workspace = true, optional = true } @@ -48,20 +53,24 @@ async-trait = { workspace = true, optional = true } encoding_rs = { version = "0.8.31", optional = true } bumpalo = "3.11.0" fxprof-processed-profile = { version = "0.6.0", optional = true } +gimli = { workspace = true } +# Support address-to-file/line information in traps when wasm files have DWARF +# debugging information. +addr2line = { version = "0.21.0", default-features = false, optional = true } [target.'cfg(target_os = "windows")'.dependencies.windows-sys] workspace = true -features = [ - "Win32_System_Diagnostics_Debug", -] +features = ["Win32_System_Diagnostics_Debug"] + +[target.'cfg(all(target_arch = "x86_64", not(target_os = "android")))'.dependencies] +ittapi = { version = "0.4.0", optional = true } -[target.'cfg(target_arch = "s390x")'.dependencies] -psm = "0.1.11" +[target.'cfg(target_os = "linux")'.dependencies] +rustix = { workspace = true, features = ['thread'] } [dev-dependencies] tempfile = "3.0" -wasmtime-wasi = { path = "../wasi", default-features = true } -wasi-cap-std-sync = { path = "../wasi-common/cap-std-sync" } +wasi-common = { path = "../wasi-common", default-features = true } # ============================================================================= # @@ -85,6 +94,8 @@ default = [ 'addr2line', 'coredump', 'debug-builtins', + 'runtime', + 'component-model', ] # An on-by-default feature enabling runtime compilation of WebAssembly modules @@ -102,7 +113,11 @@ winch = ["dep:wasmtime-winch"] incremental-cache = ["wasmtime-cranelift?/incremental-cache"] # Enables support for profiling guest modules. -profiling = ["wasmtime-jit/profiling", "dep:fxprof-processed-profile"] +profiling = [ + "dep:fxprof-processed-profile", + "dep:wasmtime-jit-debug", + "dep:ittapi", +] # Enables parallel compilation of WebAssembly code. parallel-compilation = ["dep:rayon"] @@ -117,18 +132,16 @@ async = [ "wasmtime-runtime/async", "dep:async-trait", "wasmtime-component-macro?/async", + "runtime", ] # Enables support for the pooling instance allocation strategy -pooling-allocator = ["wasmtime-runtime/pooling-allocator"] +pooling-allocator = ["runtime", "wasmtime-runtime/pooling-allocator"] # Enables support for all architectures in Cranelift, allowing # cross-compilation using the `wasmtime` crate's API, notably the # `Engine::precompile_module` function. -all-arch = [ - "wasmtime-cranelift?/all-arch", - "wasmtime-winch?/all-arch", -] +all-arch = ["wasmtime-cranelift?/all-arch", "wasmtime-winch?/all-arch"] # Enables in-progress support for the component model. Note that this feature is # in-progress, buggy, and incomplete. This is primarily here for internal @@ -137,25 +150,24 @@ component-model = [ "wasmtime-environ/component-model", "wasmtime-cranelift?/component-model", "wasmtime-winch?/component-model", - "wasmtime-runtime/component-model", + "wasmtime-runtime?/component-model", "dep:wasmtime-component-macro", "dep:wasmtime-component-util", "dep:encoding_rs", ] -wmemcheck = ["wasmtime-runtime/wmemcheck", "wasmtime-cranelift?/wmemcheck"] +wmemcheck = ["wasmtime-runtime?/wmemcheck", "wasmtime-cranelift?/wmemcheck"] # Enables support for demangling WebAssembly function names at runtime in # errors such as backtraces. -demangle = ["wasmtime-jit/demangle"] +demangle = ["wasmtime-environ/demangle"] # Enable support for generating core dumps on traps. -coredump = ["dep:wasm-encoder"] - -# Support address-to-file/line information in traps when wasm files have DWARF -# debugging information. -addr2line = ["wasmtime-jit/addr2line"] +coredump = ["dep:wasm-encoder", "runtime"] # Export some symbols from the final binary to assist in debugging # Cranelift-generated code with native debuggers like GDB and LLDB. -debug-builtins = ["wasmtime-runtime/debug-builtins"] +debug-builtins = ["wasmtime-runtime?/debug-builtins"] + +# Enable support for executing compiled Wasm modules. +runtime = ["dep:wasmtime-runtime", "dep:wasmtime-jit-icache-coherence"] diff --git a/crates/wasmtime/src/compiler.rs b/crates/wasmtime/src/compile.rs similarity index 77% rename from crates/wasmtime/src/compiler.rs rename to crates/wasmtime/src/compile.rs index 5022ef9dac0c..b8811619d355 100644 --- a/crates/wasmtime/src/compiler.rs +++ b/crates/wasmtime/src/compile.rs @@ -23,14 +23,164 @@ //! `Artifacts` into the ELF file. use crate::Engine; -use anyhow::Result; -use std::collections::{btree_map, BTreeMap, BTreeSet}; -use std::{any::Any, collections::HashMap}; +use anyhow::{Context, Result}; +use std::{ + any::Any, + collections::{btree_map, BTreeMap, BTreeSet, HashMap}, + mem, +}; +#[cfg(feature = "component-model")] +use wasmtime_environ::component::Translator; use wasmtime_environ::{ - Compiler, DefinedFuncIndex, FuncIndex, FunctionBodyData, ModuleTranslation, ModuleType, - ModuleTypes, PrimaryMap, SignatureIndex, StaticModuleIndex, WasmFunctionInfo, + CompiledFunctionInfo, CompiledModuleInfo, Compiler, DefinedFuncIndex, FinishedObject, + FuncIndex, FunctionBodyData, ModuleEnvironment, ModuleInternedTypeIndex, ModuleTranslation, + ModuleType, ModuleTypes, ModuleTypesBuilder, ObjectKind, PrimaryMap, StaticModuleIndex, + WasmFunctionInfo, }; -use wasmtime_jit::{CompiledFunctionInfo, CompiledModuleInfo}; + +/// Converts an input binary-encoded WebAssembly module to compilation +/// artifacts and type information. +/// +/// This is where compilation actually happens of WebAssembly modules and +/// translation/parsing/validation of the binary input occurs. The binary +/// artifact represented in the `MmapVec` returned here is an in-memory ELF +/// file in an owned area of virtual linear memory where permissions (such +/// as the executable bit) can be applied. +/// +/// Additionally compilation returns an `Option` here which is always +/// `Some`, notably compiled metadata about the module in addition to the +/// type information found within. +pub(crate) fn build_artifacts( + engine: &Engine, + wasm: &[u8], +) -> Result<(T, Option<(CompiledModuleInfo, ModuleTypes)>)> { + let tunables = engine.tunables(); + + // First a `ModuleEnvironment` is created which records type information + // about the wasm module. This is where the WebAssembly is parsed and + // validated. Afterwards `types` will have all the type information for + // this module. + let mut validator = wasmparser::Validator::new_with_features(engine.config().features.clone()); + let parser = wasmparser::Parser::new(0); + let mut types = Default::default(); + let mut translation = ModuleEnvironment::new(tunables, &mut validator, &mut types) + .translate(parser, wasm) + .context("failed to parse WebAssembly module")?; + let functions = mem::take(&mut translation.function_body_inputs); + + let compile_inputs = CompileInputs::for_module(&types, &translation, functions); + let unlinked_compile_outputs = compile_inputs.compile(engine)?; + let types = types.finish(); + let (compiled_funcs, function_indices) = unlinked_compile_outputs.pre_link(); + + // Emplace all compiled functions into the object file with any other + // sections associated with code as well. + let mut object = engine.compiler().object(ObjectKind::Module)?; + // Insert `Engine` and type-level information into the compiled + // artifact so if this module is deserialized later it contains all + // information necessary. + // + // Note that `append_compiler_info` and `append_types` here in theory + // can both be skipped if this module will never get serialized. + // They're only used during deserialization and not during runtime for + // the module itself. Currently there's no need for that, however, so + // it's left as an exercise for later. + engine.append_compiler_info(&mut object); + engine.append_bti(&mut object); + + let (mut object, compilation_artifacts) = function_indices.link_and_append_code( + object, + engine, + compiled_funcs, + std::iter::once(translation).collect(), + )?; + + let info = compilation_artifacts.unwrap_as_module_info(); + object.serialize_info(&(&info, &types)); + let result = T::finish_object(object)?; + + Ok((result, Some((info, types)))) +} + +/// Performs the compilation phase for a component, translating and +/// validating the provided wasm binary to machine code. +/// +/// This method will compile all nested core wasm binaries in addition to +/// any necessary extra functions required for operation with components. +/// The output artifact here is the serialized object file contained within +/// an owned mmap along with metadata about the compilation itself. +#[cfg(feature = "component-model")] +pub(crate) fn build_component_artifacts( + engine: &Engine, + binary: &[u8], +) -> Result<(T, wasmtime_environ::component::ComponentArtifacts)> { + use wasmtime_environ::component::{CompiledComponentInfo, ComponentArtifacts}; + use wasmtime_environ::ScopeVec; + + let tunables = engine.tunables(); + let compiler = engine.compiler(); + + let scope = ScopeVec::new(); + let mut validator = wasmparser::Validator::new_with_features(engine.config().features.clone()); + let mut types = Default::default(); + let (component, mut module_translations) = + Translator::new(tunables, &mut validator, &mut types, &scope) + .translate(binary) + .context("failed to parse WebAssembly module")?; + + let compile_inputs = CompileInputs::for_component( + &types, + &component, + module_translations.iter_mut().map(|(i, translation)| { + let functions = mem::take(&mut translation.function_body_inputs); + (i, &*translation, functions) + }), + ); + let unlinked_compile_outputs = compile_inputs.compile(&engine)?; + + let (compiled_funcs, function_indices) = unlinked_compile_outputs.pre_link(); + + let mut object = compiler.object(ObjectKind::Component)?; + engine.append_compiler_info(&mut object); + engine.append_bti(&mut object); + + let (mut object, compilation_artifacts) = function_indices.link_and_append_code( + object, + engine, + compiled_funcs, + module_translations, + )?; + let (types, ty) = types.finish( + &compilation_artifacts.modules, + component + .component + .import_types + .iter() + .map(|(_, (name, ty))| (name.clone(), *ty)), + component + .component + .exports + .iter() + .map(|(name, ty)| (name.clone(), ty)), + ); + + let info = CompiledComponentInfo { + component: component.component, + trampolines: compilation_artifacts.trampolines, + resource_drop_wasm_to_native_trampoline: compilation_artifacts + .resource_drop_wasm_to_native_trampoline, + }; + let artifacts = ComponentArtifacts { + info, + ty, + types, + static_modules: compilation_artifacts.modules, + }; + object.serialize_info(&artifacts); + + let result = T::finish_object(object)?; + Ok((result, artifacts)) +} type CompileInput<'a> = Box Result + Send + 'a>; @@ -39,8 +189,11 @@ type CompileInput<'a> = Box Result + /// Two `u32`s to align with `cranelift_codegen::ir::UserExternalName`. #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] struct CompileKey { - // [ kind:i4 module:i28 ] + // The namespace field is bitpacked like: + // + // [ kind:i3 module:i29 ] namespace: u32, + index: u32, } @@ -93,7 +246,7 @@ impl CompileKey { } } - fn wasm_to_native_trampoline(index: SignatureIndex) -> Self { + fn wasm_to_native_trampoline(index: ModuleInternedTypeIndex) -> Self { Self { namespace: Self::WASM_TO_NATIVE_TRAMPOLINE_KIND, index: index.as_u32(), @@ -162,7 +315,7 @@ struct CompileOutput { /// The collection of things we need to compile for a Wasm module or component. #[derive(Default)] -pub struct CompileInputs<'a> { +struct CompileInputs<'a> { inputs: Vec>, } @@ -172,8 +325,8 @@ impl<'a> CompileInputs<'a> { } /// Create the `CompileInputs` for a core Wasm module. - pub fn for_module( - types: &'a ModuleTypes, + fn for_module( + types: &'a ModuleTypesBuilder, translation: &'a ModuleTranslation<'a>, functions: PrimaryMap>, ) -> Self { @@ -187,8 +340,8 @@ impl<'a> CompileInputs<'a> { /// Create a `CompileInputs` for a component. #[cfg(feature = "component-model")] - pub fn for_component( - types: &'a wasmtime_environ::component::ComponentTypes, + fn for_component( + types: &'a wasmtime_environ::component::ComponentTypesBuilder, component: &'a wasmtime_environ::component::ComponentTranslation, module_translations: impl IntoIterator< Item = ( @@ -200,7 +353,7 @@ impl<'a> CompileInputs<'a> { ) -> Self { let mut ret = CompileInputs::default(); - ret.collect_inputs_in_translations(types.module_types(), module_translations); + ret.collect_inputs_in_translations(types.module_types_builder(), module_translations); for (idx, trampoline) in component.trampolines.iter() { ret.push_input(move |compiler| { @@ -241,7 +394,7 @@ impl<'a> CompileInputs<'a> { fn collect_inputs_in_translations( &mut self, - types: &'a ModuleTypes, + types: &'a ModuleTypesBuilder, translations: impl IntoIterator< Item = ( StaticModuleIndex, @@ -336,7 +489,7 @@ impl<'a> CompileInputs<'a> { /// Compile these `CompileInput`s (maybe in parallel) and return the /// resulting `UnlinkedCompileOutput`s. - pub fn compile(self, engine: &Engine) -> Result { + fn compile(self, engine: &Engine) -> Result { let compiler = engine.compiler(); // Compile each individual input in parallel. @@ -367,7 +520,7 @@ impl<'a> CompileInputs<'a> { } #[derive(Default)] -pub struct UnlinkedCompileOutputs { +struct UnlinkedCompileOutputs { // A map from kind to `CompileOutput`. outputs: BTreeMap>, } @@ -375,7 +528,7 @@ pub struct UnlinkedCompileOutputs { impl UnlinkedCompileOutputs { /// Flatten all our functions into a single list and remember each of their /// indices within it. - pub fn pre_link(self) -> (Vec<(String, Box)>, FunctionIndices) { + fn pre_link(self) -> (Vec<(String, Box)>, FunctionIndices) { // The order the functions end up within `compiled_funcs` is the order // that they will be laid out in the ELF file, so try and group hot and // cold functions together as best we can. However, because we bucket by @@ -429,7 +582,7 @@ impl UnlinkedCompileOutputs { } #[derive(Default)] -pub struct FunctionIndices { +struct FunctionIndices { // A reverse map from an index in `compiled_funcs` to the // `StaticModuleIndex` for that function. compiled_func_index_to_module: HashMap, @@ -444,20 +597,20 @@ pub struct FunctionIndices { impl FunctionIndices { /// Link the compiled functions together, resolving relocations, and append /// them to the given ELF file. - pub fn link_and_append_code<'a>( + fn link_and_append_code<'a>( mut self, mut obj: object::write::Object<'static>, engine: &'a Engine, compiled_funcs: Vec<(String, Box)>, translations: PrimaryMap>, - ) -> Result<(wasmtime_jit::ObjectBuilder<'a>, Artifacts)> { + ) -> Result<(wasmtime_environ::ObjectBuilder<'a>, Artifacts)> { // Append all the functions to the ELF file. // // The result is a vector parallel to `compiled_funcs` where // `symbol_ids_and_locs[i]` is the symbol ID and function location of // `compiled_funcs[i]`. let compiler = engine.compiler(); - let tunables = &engine.config().tunables; + let tunables = engine.tunables(); let symbol_ids_and_locs = compiler.append_code( &mut obj, &compiled_funcs, @@ -510,7 +663,7 @@ impl FunctionIndices { } } - let mut obj = wasmtime_jit::ObjectBuilder::new(obj, tunables); + let mut obj = wasmtime_environ::ObjectBuilder::new(obj, tunables); let mut artifacts = Artifacts::default(); // Finally, build our binary artifacts that map things like `FuncIndex` @@ -597,12 +750,12 @@ impl FunctionIndices { )) .map(|x| symbol_ids_and_locs[x.unwrap_function()].1); - CompiledFunctionInfo::new( + CompiledFunctionInfo { wasm_func_info, wasm_func_loc, array_to_wasm_trampoline, native_to_wasm_trampoline, - ) + } }) .collect(); @@ -659,21 +812,21 @@ impl FunctionIndices { /// The artifacts necessary for finding and calling Wasm functions at runtime, /// to be serialized into an ELF file. #[derive(Default)] -pub struct Artifacts { - pub modules: PrimaryMap, +struct Artifacts { + modules: PrimaryMap, #[cfg(feature = "component-model")] - pub trampolines: PrimaryMap< + trampolines: PrimaryMap< wasmtime_environ::component::TrampolineIndex, wasmtime_environ::component::AllCallFunc, >, #[cfg(feature = "component-model")] - pub resource_drop_wasm_to_native_trampoline: Option, + resource_drop_wasm_to_native_trampoline: Option, } impl Artifacts { /// Assuming this compilation was for a single core Wasm module, get the /// resulting `CompiledModuleInfo`. - pub fn unwrap_as_module_info(self) -> CompiledModuleInfo { + fn unwrap_as_module_info(self) -> CompiledModuleInfo { assert_eq!(self.modules.len(), 1); #[cfg(feature = "component-model")] assert!(self.trampolines.is_empty()); diff --git a/crates/wasmtime/src/component/mod.rs b/crates/wasmtime/src/component/mod.rs deleted file mode 100644 index e2028a2bebb5..000000000000 --- a/crates/wasmtime/src/component/mod.rs +++ /dev/null @@ -1,349 +0,0 @@ -//! In-progress implementation of the WebAssembly component model -//! -//! This module is a work-in-progress and currently represents an incomplete and -//! probably buggy implementation of the component model. - -#![cfg_attr(nightlydoc, doc(cfg(feature = "component-model")))] - -mod component; -mod func; -mod instance; -mod linker; -mod matching; -mod resources; -mod storage; -mod store; -pub mod types; -mod values; -pub use self::component::Component; -pub use self::func::{ - ComponentNamedList, ComponentType, Func, Lift, Lower, TypedFunc, WasmList, WasmStr, -}; -pub use self::instance::{ExportInstance, Exports, Instance, InstancePre}; -pub use self::linker::{Linker, LinkerInstance}; -pub use self::resources::{Resource, ResourceAny}; -pub use self::types::{ResourceType, Type}; -pub use self::values::{Enum, Flags, List, OptionVal, Record, ResultVal, Tuple, Val, Variant}; -pub use wasmtime_component_macro::{flags, ComponentType, Lift, Lower}; - -// These items are expected to be used by an eventual -// `#[derive(ComponentType)]`, they are not part of Wasmtime's API stability -// guarantees -#[doc(hidden)] -pub mod __internal { - pub use super::func::{ - bad_type_info, format_flags, lower_payload, typecheck_enum, typecheck_flags, - typecheck_record, typecheck_variant, ComponentVariant, LiftContext, LowerContext, - MaybeUninitExt, Options, - }; - pub use super::matching::InstanceType; - pub use crate::map_maybe_uninit; - pub use crate::store::StoreOpaque; - pub use anyhow; - #[cfg(feature = "async")] - pub use async_trait::async_trait; - pub use wasmtime_environ; - pub use wasmtime_environ::component::{CanonicalAbiInfo, ComponentTypes, InterfaceType}; -} - -pub(crate) use self::store::ComponentStoreData; - -/// Generate bindings for a WIT package. -/// -/// This macro ingests a [WIT package] and will generate all the necessary -/// bindings for instantiating and invoking a particular `world` in the -/// package. A `world` in a WIT package is a description of imports and exports -/// for a component. This provides a higher-level representation of working with -/// a component than the raw [`Instance`] type which must be manually-type-check -/// and manually have its imports provided via the [`Linker`] type. -/// -/// The most basic usage of this macro is: -/// -/// ```rust,ignore -/// wasmtime::component::bindgen!("my-component"); -/// ``` -/// -/// This will parse your projects WIT package in a `wit` directory adjacent to -/// your crate's `Cargo.toml`. All of the `*.wit` files in that directory are -/// parsed and then the `default world` will be looked up within -/// `my-component.wit`. This world is then used as the basis for generating -/// bindings. -/// -/// For example if your project contained: -/// -/// ```text,ignore -/// // wit/my-component.wit -/// -/// package my:project; -/// -/// world hello-world { -/// import name: func() -> string; -/// export greet: func(); -/// } -/// ``` -/// -/// Then you can interact with the generated bindings like so: -/// -/// ```rust,ignore -/// use wasmtime::component::*; -/// use wasmtime::{Config, Engine, Store}; -/// -/// bindgen!(); -/// -/// struct MyState { -/// name: String, -/// } -/// -/// // Imports into the world, like the `name` import for this world, are satisfied -/// // through traits. -/// impl HelloWorldImports for MyState { -/// // Note the `Result` return value here where `Ok` is returned back to -/// // the component and `Err` will raise a trap. -/// fn name(&mut self) -> wasmtime::Result { -/// Ok(self.name.clone()) -/// } -/// } -/// -/// fn main() -> wasmtime::Result<()> { -/// // Configure an `Engine` and compile the `Component` that is being run for -/// // the application. -/// let mut config = Config::new(); -/// config.wasm_component_model(true); -/// let engine = Engine::new(&config)?; -/// let component = Component::from_file(&engine, "./your-component.wasm")?; -/// -/// // Instantiation of bindings always happens through a `Linker`. -/// // Configuration of the linker is done through a generated `add_to_linker` -/// // method on the bindings structure. -/// // -/// // Note that the closure provided here is a projection from `T` in -/// // `Store` to `&mut U` where `U` implements the `HelloWorldImports` -/// // trait. In this case the `T`, `MyState`, is stored directly in the -/// // structure so no projection is necessary here. -/// let mut linker = Linker::new(&engine); -/// HelloWorld::add_to_linker(&mut linker, |state: &mut MyState| state)?; -/// -/// // As with the core wasm API of Wasmtime instantiation occurs within a -/// // `Store`. The bindings structure contains an `instantiate` method which -/// // takes the store, component, and linker. This returns the `bindings` -/// // structure which is an instance of `HelloWorld` and supports typed access -/// // to the exports of the component. -/// let mut store = Store::new( -/// &engine, -/// MyState { -/// name: "me".to_string(), -/// }, -/// ); -/// let (bindings, _) = HelloWorld::instantiate(&mut store, &component, &linker)?; -/// -/// // Here our `greet` function doesn't take any parameters for the component, -/// // but in the Wasmtime embedding API the first argument is always a `Store`. -/// bindings.call_greet(&mut store)?; -/// Ok(()) -/// } -/// ``` -/// -/// The function signatures within generated traits and on generated exports -/// match the component-model signatures as specified in the WIT `world` item. -/// Note that WIT also has support for importing and exports interfaces within -/// worlds, which can be bound here as well: -/// -/// For example this WIT input -/// -/// ```text,ignore -/// // wit/my-component.wit -/// -/// package my:project; -/// -/// interface host { -/// gen-random-integer: func() -> u32; -/// sha256: func(bytes: list) -> string; -/// } -/// -/// default world hello-world { -/// import host; -/// -/// export demo: interface { -/// run: func(); -/// } -/// } -/// ``` -/// -/// Then you can interact with the generated bindings like so: -/// -/// ```rust,ignore -/// use wasmtime::component::*; -/// use wasmtime::{Config, Engine, Store}; -/// use my::project::host::Host; -/// -/// bindgen!(); -/// -/// struct MyState { -/// // ... -/// } -/// -/// // Note that the trait here is per-interface and within a submodule now. -/// impl Host for MyState { -/// fn gen_random_integer(&mut self) -> wasmtime::Result { -/// Ok(rand::thread_rng().gen()) -/// } -/// -/// fn sha256(&mut self, bytes: Vec) -> wasmtime::Result { -/// // ... -/// } -/// } -/// -/// fn main() -> wasmtime::Result<()> { -/// let mut config = Config::new(); -/// config.wasm_component_model(true); -/// let engine = Engine::new(&config)?; -/// let component = Component::from_file(&engine, "./your-component.wasm")?; -/// -/// let mut linker = Linker::new(&engine); -/// HelloWorld::add_to_linker(&mut linker, |state: &mut MyState| state)?; -/// -/// let mut store = Store::new( -/// &engine, -/// MyState { /* ... */ }, -/// ); -/// let (bindings, _) = HelloWorld::instantiate(&mut store, &component, &linker)?; -/// -/// // Note that the `demo` method returns a `&Demo` through which we can -/// // run the methods on that interface. -/// bindings.demo().call_run(&mut store)?; -/// Ok(()) -/// } -/// ``` -/// -/// The generated bindings can additionally be explored more fully with `cargo -/// doc` to see what types and traits and such are generated. -/// -/// # Syntax -/// -/// This procedural macro accepts a few different syntaxes. The primary purpose -/// of this macro is to locate a WIT package, parse it, and then extract a -/// `world` from the parsed package. There are then codegen-specific options to -/// the bindings themselves which can additionally be specified. -/// -/// Basic usage of this macro looks like: -/// -/// ```rust,ignore -/// // Parse the `wit/` folder adjacent to this crate's `Cargo.toml` and look -/// // for a `default world` in its documents. There must be exactly one -/// // `default world` for this to succeed. -/// bindgen!(); -/// -/// // Parse the `wit/` folder adjacent to this crate's `Cargo.toml` and look -/// // for the world `foo` contained in it. -/// bindgen!("foo"); -/// -/// // Parse the folder `other/wit/folder` adjacent to `Cargo.toml`. -/// bindgen!(in "other/wit/folder"); -/// bindgen!("foo" in "other/wit/folder"); -/// -/// // Parse the file `foo.wit` as a single-file WIT package with no -/// // dependencies. -/// bindgen!("foo" in "foo.wit"); -/// ``` -/// -/// A more configured version of invoking this macro looks like: -/// -/// ```rust,ignore -/// bindgen!({ -/// world: "foo", // not needed if `path` has one `world` -/// -/// // same as in `bindgen!(in "other/wit/folder") -/// path: "other/wit/folder", -/// -/// // Instead of `path` the WIT document can be provided inline if -/// // desired. -/// inline: " -/// package my:inline; -/// -/// world foo { -/// // ... -/// } -/// ", -/// -/// // Add calls to `tracing::span!` before each import or export is called -/// // to log arguments and return values. -/// // -/// // This option defaults to `false`. -/// tracing: true, -/// -/// // Imports will be async functions through #[async_trait] and exports -/// // are also invoked as async functions. Requires `Config::async_support` -/// // to be `true`. -/// // -/// // Note that this is only async for the host as the guest will still -/// // appear as if it's invoking blocking functions. -/// // -/// // This option defaults to `false`. -/// async: true, -/// -/// // Alternative mode of async configuration where this still implies -/// // async instantiation happens, for example, but more control is -/// // provided over which imports are async and which aren't. -/// // -/// // Note that in this mode all exports are still async. -/// async: { -/// // All imports are async except for functions with these names -/// except_imports: ["foo", "bar"], -/// -/// // All imports are synchronous except for functions with these names -/// // -/// // Note that this key cannot be specified with `except_imports`, -/// // only one or the other is accepted. -/// only_imports: ["foo", "bar"], -/// }, -/// -/// // This can be used to translate WIT return values of the form -/// // `result` into `Result` in Rust. -/// // Users must define `RustErrorType` and the `Host` trait for the -/// // interface which defines `error-type` will have a method -/// // called `convert_error_type` which converts `RustErrorType` -/// // into `wasmtime::Result`. This conversion can either -/// // return the raw WIT error (`ErrorType` here) or a trap. -/// // -/// // By default this option is not specified. -/// trappable_error_type: { -/// "wasi:io/streams/stream-error" => RustErrorType, -/// }, -/// -/// // All generated bindgen types are "owned" meaning types like `String` -/// // are used instead of `&str`, for example. This is the default and -/// // ensures that the same type used in both imports and exports uses the -/// // same generated type. -/// ownership: Owning, -/// -/// // Alternative to `Owning` above where borrowed types attempt to be used -/// // instead. The `duplicate_if_necessary` configures whether duplicate -/// // Rust types will be generated for the same WIT type if necessary, for -/// // example when a type is used both as an import and an export. -/// ownership: Borrowing { -/// duplicate_if_necessary: true -/// }, -/// -/// // Restrict the code generated to what's needed for the interface -/// // imports in the inlined WIT document fragment. -/// interfaces: " -/// import wasi:cli/command; -/// ", -/// -/// // Remap imported interfaces or resources to types defined in Rust -/// // elsewhere. Using this option will prevent any code from being -/// // generated for interfaces mentioned here. Resources named here will -/// // not have a type generated to represent the resource. -/// // -/// // Interfaces mapped with this option should be previously generated -/// // with an invocation of this macro. Resources need to be mapped to a -/// // Rust type name. -/// with: { -/// "wasi:random/random": some::other::wasi::random::random, -/// "wasi:filesystem/types/descriptor": MyDescriptorType, -/// }, -/// }); -/// ``` -/// -/// [WIT package]: https://github.com/WebAssembly/component-model/blob/main/design/mvp/WIT.md -pub use wasmtime_component_macro::bindgen; diff --git a/crates/wasmtime/src/config.rs b/crates/wasmtime/src/config.rs index cc42af4e3151..5f0275ad6c89 100644 --- a/crates/wasmtime/src/config.rs +++ b/crates/wasmtime/src/config.rs @@ -1,5 +1,3 @@ -use crate::memory::MemoryCreator; -use crate::trampoline::MemoryCreatorProxy; use anyhow::{bail, ensure, Result}; use serde_derive::{Deserialize, Serialize}; use std::collections::{HashMap, HashSet}; @@ -8,13 +6,20 @@ use std::fmt; use std::path::Path; use std::str::FromStr; use std::sync::Arc; -use target_lexicon::Architecture; +use target_lexicon::{Architecture, PointerWidth}; use wasmparser::WasmFeatures; #[cfg(feature = "cache")] use wasmtime_cache::CacheConfig; use wasmtime_environ::Tunables; -use wasmtime_jit::profiling::{self, ProfilingAgent}; -use wasmtime_runtime::{mpk, InstanceAllocator, OnDemandInstanceAllocator, RuntimeMemoryCreator}; + +#[cfg(feature = "runtime")] +use crate::memory::MemoryCreator; +#[cfg(feature = "runtime")] +use crate::profiling_agent::{self, ProfilingAgent}; +#[cfg(feature = "runtime")] +use crate::trampoline::MemoryCreatorProxy; +#[cfg(feature = "runtime")] +use wasmtime_runtime::{InstanceAllocator, OnDemandInstanceAllocator, RuntimeMemoryCreator}; #[cfg(feature = "async")] use crate::stack::{StackCreator, StackCreatorProxy}; @@ -22,6 +27,9 @@ use crate::stack::{StackCreator, StackCreatorProxy}; use wasmtime_fiber::RuntimeFiberStackCreator; pub use wasmtime_environ::CacheStore; +#[cfg(feature = "pooling-allocator")] +use wasmtime_runtime::mpk; +#[cfg(feature = "pooling-allocator")] pub use wasmtime_runtime::MpkEnabled; /// Represents the module instance allocation strategy to use. @@ -97,10 +105,11 @@ pub struct Config { #[cfg(any(feature = "cranelift", feature = "winch"))] compiler_config: CompilerConfig, profiling_strategy: ProfilingStrategy, + tunables: ConfigTunables, - pub(crate) tunables: Tunables, #[cfg(feature = "cache")] pub(crate) cache_config: CacheConfig, + #[cfg(feature = "runtime")] pub(crate) mem_creator: Option>, pub(crate) allocation_strategy: InstanceAllocationStrategy, pub(crate) max_wasm_stack: usize, @@ -123,6 +132,24 @@ pub struct Config { pub(crate) macos_use_mach_ports: bool, } +#[derive(Default, Clone)] +struct ConfigTunables { + static_memory_bound: Option, + static_memory_offset_guard_size: Option, + dynamic_memory_offset_guard_size: Option, + dynamic_memory_growth_reserve: Option, + generate_native_debuginfo: Option, + parse_wasm_debuginfo: Option, + consume_fuel: Option, + epoch_interruption: Option, + static_memory_bound_is_maximum: Option, + guard_before_linear_memory: Option, + generate_address_map: Option, + debug_adapter_modules: Option, + relaxed_simd_deterministic: Option, + tail_callable: Option, +} + /// User-provided configuration for the compiler. #[cfg(any(feature = "cranelift", feature = "winch"))] #[derive(Debug, Clone)] @@ -183,12 +210,13 @@ impl Config { /// specified. pub fn new() -> Self { let mut ret = Self { - tunables: Tunables::default(), + tunables: ConfigTunables::default(), #[cfg(any(feature = "cranelift", feature = "winch"))] compiler_config: CompilerConfig::default(), #[cfg(feature = "cache")] cache_config: CacheConfig::new_cache_disabled(), profiling_strategy: ProfilingStrategy::None, + #[cfg(feature = "runtime")] mem_creator: None, allocation_strategy: InstanceAllocationStrategy::OnDemand, // 512k of stack -- note that this is chosen currently to not be too @@ -228,6 +256,8 @@ impl Config { ret.wasm_multi_value(true); ret.wasm_bulk_memory(true); ret.wasm_simd(true); + #[cfg(feature = "component-model")] + ret.wasm_component_model(true); ret.wasm_backtrace_details(WasmBacktraceDetails::Environment); // This is on-by-default in `wasmparser` since it's a stage 4+ proposal @@ -250,7 +280,7 @@ impl Config { /// /// This method will error if the given target triple is not supported. #[cfg(any(feature = "cranelift", feature = "winch"))] - #[cfg_attr(nightlydoc, doc(cfg(any(feature = "cranelift", feature = "winch"))))] + #[cfg_attr(docsrs, doc(cfg(any(feature = "cranelift", feature = "winch"))))] pub fn target(&mut self, target: &str) -> Result<&mut Self> { self.compiler_config.target = Some(target_lexicon::Triple::from_str(target).map_err(|e| anyhow::anyhow!(e))?); @@ -361,7 +391,7 @@ impl Config { /// it. If Wasmtime doesn't support exactly what you'd like just yet, please /// feel free to open an issue! #[cfg(feature = "async")] - #[cfg_attr(nightlydoc, doc(cfg(feature = "async")))] + #[cfg_attr(docsrs, doc(cfg(feature = "async")))] pub fn async_support(&mut self, enable: bool) -> &mut Self { self.async_support = enable; self @@ -370,9 +400,13 @@ impl Config { /// Configures whether DWARF debug information will be emitted during /// compilation. /// + /// Note that the `debug-builtins` compile-time Cargo feature must also be + /// enabled for native debuggers such as GDB or LLDB to be able to debug + /// guest WebAssembly programs. + /// /// By default this option is `false`. pub fn debug_info(&mut self, enable: bool) -> &mut Self { - self.tunables.generate_native_debuginfo = enable; + self.tunables.generate_native_debuginfo = Some(enable); self } @@ -419,13 +453,13 @@ impl Config { pub fn wasm_backtrace_details(&mut self, enable: WasmBacktraceDetails) -> &mut Self { self.wasm_backtrace_details_env_used = false; self.tunables.parse_wasm_debuginfo = match enable { - WasmBacktraceDetails::Enable => true, - WasmBacktraceDetails::Disable => false, + WasmBacktraceDetails::Enable => Some(true), + WasmBacktraceDetails::Disable => Some(false), WasmBacktraceDetails::Environment => { self.wasm_backtrace_details_env_used = true; std::env::var("WASMTIME_BACKTRACE_DETAILS") - .map(|s| s == "1") - .unwrap_or(false) + .map(|s| Some(s == "1")) + .unwrap_or(Some(false)) } }; self @@ -468,7 +502,7 @@ impl Config { /// /// [`Store`]: crate::Store pub fn consume_fuel(&mut self, enable: bool) -> &mut Self { - self.tunables.consume_fuel = enable; + self.tunables.consume_fuel = Some(enable); self } @@ -562,7 +596,7 @@ impl Config { /// - [`Store::epoch_deadline_callback`](crate::Store::epoch_deadline_callback) /// - [`Store::epoch_deadline_async_yield_and_update`](crate::Store::epoch_deadline_async_yield_and_update) pub fn epoch_interruption(&mut self, enable: bool) -> &mut Self { - self.tunables.epoch_interruption = enable; + self.tunables.epoch_interruption = Some(enable); self } @@ -634,7 +668,7 @@ impl Config { /// The `Engine::new` method will fail if the value for this option is /// smaller than the [`Config::max_wasm_stack`] option. #[cfg(feature = "async")] - #[cfg_attr(nightlydoc, doc(cfg(feature = "async")))] + #[cfg_attr(docsrs, doc(cfg(feature = "async")))] pub fn async_stack_size(&mut self, size: usize) -> &mut Self { self.async_stack_size = size; self @@ -653,7 +687,7 @@ impl Config { /// [WebAssembly tail calls proposal]: https://github.com/WebAssembly/tail-call pub fn wasm_tail_call(&mut self, enable: bool) -> &mut Self { self.features.tail_call = enable; - self.tunables.tail_callable = enable; + self.tunables.tail_callable = Some(enable); self } @@ -780,7 +814,7 @@ impl Config { /// /// [proposal]: https://github.com/webassembly/relaxed-simd pub fn relaxed_simd_deterministic(&mut self, enable: bool) -> &mut Self { - self.tunables.relaxed_simd_deterministic = enable; + self.tunables.relaxed_simd_deterministic = Some(enable); self } @@ -872,7 +906,7 @@ impl Config { /// /// The default value for this is `Strategy::Auto`. #[cfg(any(feature = "cranelift", feature = "winch"))] - #[cfg_attr(nightlydoc, doc(cfg(any(feature = "cranelift", feature = "winch"))))] + #[cfg_attr(docsrs, doc(cfg(any(feature = "cranelift", feature = "winch"))))] pub fn strategy(&mut self, strategy: Strategy) -> &mut Self { self.compiler_config.strategy = strategy; self @@ -906,7 +940,7 @@ impl Config { /// /// The default value for this is `false` #[cfg(any(feature = "cranelift", feature = "winch"))] - #[cfg_attr(nightlydoc, doc(cfg(any(feature = "cranelift", feature = "winch"))))] + #[cfg_attr(docsrs, doc(cfg(any(feature = "cranelift", feature = "winch"))))] pub fn cranelift_debug_verifier(&mut self, enable: bool) -> &mut Self { let val = if enable { "true" } else { "false" }; self.compiler_config @@ -923,7 +957,7 @@ impl Config { /// /// The default value for this is `OptLevel::None`. #[cfg(any(feature = "cranelift", feature = "winch"))] - #[cfg_attr(nightlydoc, doc(cfg(any(feature = "cranelift", feature = "winch"))))] + #[cfg_attr(docsrs, doc(cfg(any(feature = "cranelift", feature = "winch"))))] pub fn cranelift_opt_level(&mut self, level: OptLevel) -> &mut Self { let val = match level { OptLevel::None => "none", @@ -945,7 +979,7 @@ impl Config { /// /// The default value for this is `false` #[cfg(any(feature = "cranelift", feature = "winch"))] - #[cfg_attr(nightlydoc, doc(cfg(any(feature = "cranelift", feature = "winch"))))] + #[cfg_attr(docsrs, doc(cfg(any(feature = "cranelift", feature = "winch"))))] pub fn cranelift_nan_canonicalization(&mut self, enable: bool) -> &mut Self { let val = if enable { "true" } else { "false" }; self.compiler_config @@ -968,7 +1002,7 @@ impl Config { /// over a trail of "breadcrumbs" or facts at each intermediate /// value. Thus, it is appropriate to enable in production. #[cfg(any(feature = "cranelift", feature = "winch"))] - #[cfg_attr(nightlydoc, doc(cfg(any(feature = "cranelift", feature = "winch"))))] + #[cfg_attr(docsrs, doc(cfg(any(feature = "cranelift", feature = "winch"))))] pub fn cranelift_pcc(&mut self, enable: bool) -> &mut Self { let val = if enable { "true" } else { "false" }; self.compiler_config @@ -994,7 +1028,7 @@ impl Config { /// cause `Engine::new` fail if the flag's name does not exist, or the value is not appropriate /// for the flag type. #[cfg(any(feature = "cranelift", feature = "winch"))] - #[cfg_attr(nightlydoc, doc(cfg(any(feature = "cranelift", feature = "winch"))))] + #[cfg_attr(docsrs, doc(cfg(any(feature = "cranelift", feature = "winch"))))] pub unsafe fn cranelift_flag_enable(&mut self, flag: &str) -> &mut Self { self.compiler_config.flags.insert(flag.to_string()); self @@ -1020,7 +1054,7 @@ impl Config { /// For example, feature `wasm_backtrace` will set `unwind_info` to `true`, but if it's /// manually set to false then it will fail. #[cfg(any(feature = "cranelift", feature = "winch"))] - #[cfg_attr(nightlydoc, doc(cfg(any(feature = "cranelift", feature = "winch"))))] + #[cfg_attr(docsrs, doc(cfg(any(feature = "cranelift", feature = "winch"))))] pub unsafe fn cranelift_flag_set(&mut self, name: &str, value: &str) -> &mut Self { self.compiler_config .settings @@ -1047,7 +1081,7 @@ impl Config { /// /// [docs]: https://bytecodealliance.github.io/wasmtime/cli-cache.html #[cfg(feature = "cache")] - #[cfg_attr(nightlydoc, doc(cfg(feature = "cache")))] + #[cfg_attr(docsrs, doc(cfg(feature = "cache")))] pub fn cache_config_load(&mut self, path: impl AsRef) -> Result<&mut Self> { self.cache_config = CacheConfig::from_file(Some(path.as_ref()))?; Ok(self) @@ -1064,7 +1098,7 @@ impl Config { /// This method is only available when the `cache` feature of this crate is /// enabled. #[cfg(feature = "cache")] - #[cfg_attr(nightlydoc, doc(cfg(feature = "cache")))] + #[cfg_attr(docsrs, doc(cfg(feature = "cache")))] pub fn disable_cache(&mut self) -> &mut Self { self.cache_config = CacheConfig::new_cache_disabled(); self @@ -1092,7 +1126,7 @@ impl Config { /// /// [docs]: https://bytecodealliance.github.io/wasmtime/cli-cache.html #[cfg(feature = "cache")] - #[cfg_attr(nightlydoc, doc(cfg(feature = "cache")))] + #[cfg_attr(docsrs, doc(cfg(feature = "cache")))] pub fn cache_config_load_default(&mut self) -> Result<&mut Self> { self.cache_config = CacheConfig::from_file(None)?; Ok(self) @@ -1102,6 +1136,7 @@ impl Config { /// /// Custom memory creators are used when creating host `Memory` objects or when /// creating instance linear memories for the on-demand instance allocation strategy. + #[cfg(feature = "runtime")] pub fn with_host_memory(&mut self, mem_creator: Arc) -> &mut Self { self.mem_creator = Some(Arc::new(MemoryCreatorProxy(mem_creator))); self @@ -1112,7 +1147,7 @@ impl Config { /// Custom memory creators are used when creating creating async instance stacks for /// the on-demand instance allocation strategy. #[cfg(feature = "async")] - #[cfg_attr(nightlydoc, doc(cfg(feature = "async")))] + #[cfg_attr(docsrs, doc(cfg(feature = "async")))] pub fn with_host_stack(&mut self, stack_creator: Arc) -> &mut Self { self.stack_creator = Some(Arc::new(StackCreatorProxy(stack_creator))); self @@ -1224,7 +1259,7 @@ impl Config { /// `PoolingAllocatorConfig::memory_protection_keys` for details. pub fn static_memory_maximum_size(&mut self, max_size: u64) -> &mut Self { let max_pages = max_size / u64::from(wasmtime_environ::WASM_PAGE_SIZE); - self.tunables.static_memory_bound = max_pages; + self.tunables.static_memory_bound = Some(max_pages); self } @@ -1240,7 +1275,7 @@ impl Config { /// For the difference between static and dynamic memories, see the /// [`Config::static_memory_maximum_size`]. pub fn static_memory_forced(&mut self, force: bool) -> &mut Self { - self.tunables.static_memory_bound_is_maximum = force; + self.tunables.static_memory_bound_is_maximum = Some(force); self } @@ -1296,7 +1331,7 @@ impl Config { /// than the value configured for [`Config::dynamic_memory_guard_size`]. pub fn static_memory_guard_size(&mut self, guard_size: u64) -> &mut Self { let guard_size = round_up_to_pages(guard_size); - self.tunables.static_memory_offset_guard_size = guard_size; + self.tunables.static_memory_offset_guard_size = Some(guard_size); self } @@ -1329,7 +1364,7 @@ impl Config { /// than the value configured for [`Config::static_memory_guard_size`]. pub fn dynamic_memory_guard_size(&mut self, guard_size: u64) -> &mut Self { let guard_size = round_up_to_pages(guard_size); - self.tunables.dynamic_memory_offset_guard_size = guard_size; + self.tunables.dynamic_memory_offset_guard_size = Some(guard_size); self } @@ -1368,7 +1403,7 @@ impl Config { /// For 64-bit platforms this defaults to 2GB, and for 32-bit platforms this /// defaults to 1MB. pub fn dynamic_memory_reserved_for_growth(&mut self, reserved: u64) -> &mut Self { - self.tunables.dynamic_memory_growth_reserve = round_up_to_pages(reserved); + self.tunables.dynamic_memory_growth_reserve = Some(round_up_to_pages(reserved)); self } @@ -1393,7 +1428,7 @@ impl Config { /// /// This value defaults to `true`. pub fn guard_before_linear_memory(&mut self, guard: bool) -> &mut Self { - self.tunables.guard_before_linear_memory = guard; + self.tunables.guard_before_linear_memory = Some(guard); self } @@ -1424,7 +1459,7 @@ impl Config { /// /// By default parallel compilation is enabled. #[cfg(feature = "parallel-compilation")] - #[cfg_attr(nightlydoc, doc(cfg(feature = "parallel-compilation")))] + #[cfg_attr(docsrs, doc(cfg(feature = "parallel-compilation")))] pub fn parallel_compilation(&mut self, parallel: bool) -> &mut Self { self.parallel_compilation = parallel; self @@ -1440,7 +1475,7 @@ impl Config { /// numbers if so configured as well (and the original wasm module has DWARF /// debugging information present). pub fn generate_address_map(&mut self, generate: bool) -> &mut Self { - self.tunables.generate_address_map = generate; + self.tunables.generate_address_map = Some(generate); self } @@ -1518,7 +1553,7 @@ impl Config { /// /// This option is disabled by default. #[cfg(feature = "coredump")] - #[cfg_attr(nightlydoc, doc(cfg(feature = "coredump")))] + #[cfg_attr(docsrs, doc(cfg(feature = "coredump")))] pub fn coredump_on_trap(&mut self, enable: bool) -> &mut Self { self.coredump_on_trap = enable; self @@ -1574,7 +1609,7 @@ impl Config { self } - pub(crate) fn validate(&self) -> Result<()> { + pub(crate) fn validate(&self) -> Result { if self.features.reference_types && !self.features.bulk_memory { bail!("feature 'reference_types' requires 'bulk_memory' to be enabled"); } @@ -1588,26 +1623,73 @@ impl Config { if self.max_wasm_stack == 0 { bail!("max_wasm_stack size cannot be zero"); } - if self.tunables.static_memory_offset_guard_size - < self.tunables.dynamic_memory_offset_guard_size - { - bail!("static memory guard size cannot be smaller than dynamic memory guard size"); - } #[cfg(not(feature = "wmemcheck"))] if self.wmemcheck { bail!("wmemcheck (memory checker) was requested but is not enabled in this build"); } - Ok(()) + #[cfg(not(any(feature = "cranelift", feature = "winch")))] + let mut tunables = Tunables::default_host(); + #[cfg(any(feature = "cranelift", feature = "winch"))] + let mut tunables = match &self.compiler_config.target.as_ref() { + Some(target) => match target.pointer_width() { + Ok(PointerWidth::U32) => Tunables::default_u32(), + Ok(PointerWidth::U64) => Tunables::default_u64(), + _ => bail!("unknown pointer width"), + }, + None => Tunables::default_host(), + }; + + macro_rules! set_fields { + ($($field:ident)*) => ( + let ConfigTunables { + $($field,)* + } = &self.tunables; + + $( + if let Some(e) = $field { + tunables.$field = *e; + } + )* + ) + } + + set_fields! { + static_memory_bound + static_memory_offset_guard_size + dynamic_memory_offset_guard_size + dynamic_memory_growth_reserve + generate_native_debuginfo + parse_wasm_debuginfo + consume_fuel + epoch_interruption + static_memory_bound_is_maximum + guard_before_linear_memory + generate_address_map + debug_adapter_modules + relaxed_simd_deterministic + tail_callable + } + + if tunables.static_memory_offset_guard_size < tunables.dynamic_memory_offset_guard_size { + bail!("static memory guard size cannot be smaller than dynamic memory guard size"); + } + Ok(tunables) } - pub(crate) fn build_allocator(&self) -> Result> { + #[cfg(feature = "runtime")] + pub(crate) fn build_allocator( + &self, + tunables: &Tunables, + ) -> Result> { #[cfg(feature = "async")] let stack_size = self.async_stack_size; #[cfg(not(feature = "async"))] let stack_size = 0; + let _ = tunables; + match &self.allocation_strategy { InstanceAllocationStrategy::OnDemand => { #[allow(unused_mut)] @@ -1626,43 +1708,44 @@ impl Config { let mut config = config.config; config.stack_size = stack_size; Ok(Box::new(wasmtime_runtime::PoolingInstanceAllocator::new( - &config, - &self.tunables, + &config, tunables, )?)) } } } + #[cfg(feature = "runtime")] pub(crate) fn build_profiler(&self) -> Result> { Ok(match self.profiling_strategy { - ProfilingStrategy::PerfMap => profiling::new_perfmap()?, - ProfilingStrategy::JitDump => profiling::new_jitdump()?, - ProfilingStrategy::VTune => profiling::new_vtune()?, - ProfilingStrategy::None => profiling::new_null(), + ProfilingStrategy::PerfMap => profiling_agent::new_perfmap()?, + ProfilingStrategy::JitDump => profiling_agent::new_jitdump()?, + ProfilingStrategy::VTune => profiling_agent::new_vtune()?, + ProfilingStrategy::None => profiling_agent::new_null(), }) } #[cfg(any(feature = "cranelift", feature = "winch"))] - pub(crate) fn build_compiler(mut self) -> Result<(Self, Box)> { + pub(crate) fn build_compiler( + mut self, + tunables: &Tunables, + ) -> Result<(Self, Box)> { + let target = self.compiler_config.target.clone(); + let mut compiler = match self.compiler_config.strategy { #[cfg(feature = "cranelift")] - Strategy::Auto => wasmtime_cranelift::builder(), + Strategy::Auto => wasmtime_cranelift::builder(target)?, #[cfg(all(feature = "winch", not(feature = "cranelift")))] - Strategy::Auto => wasmtime_winch::builder(), + Strategy::Auto => wasmtime_winch::builder(target)?, #[cfg(feature = "cranelift")] - Strategy::Cranelift => wasmtime_cranelift::builder(), + Strategy::Cranelift => wasmtime_cranelift::builder(target)?, #[cfg(not(feature = "cranelift"))] Strategy::Cranelift => bail!("cranelift support not compiled in"), #[cfg(feature = "winch")] - Strategy::Winch => wasmtime_winch::builder(), + Strategy::Winch => wasmtime_winch::builder(target)?, #[cfg(not(feature = "winch"))] Strategy::Winch => bail!("winch support not compiled in"), }; - if let Some(target) = &self.compiler_config.target { - compiler.target(target.clone())?; - } - if let Some(path) = &self.compiler_config.clif_dir { compiler.clif_dir(path)?; } @@ -1752,7 +1835,7 @@ impl Config { compiler.enable_incremental_compilation(cache_store.clone())?; } - compiler.set_tunables(self.tunables.clone())?; + compiler.set_tunables(tunables.clone())?; compiler.wmemcheck(self.compiler_config.wmemcheck); Ok((self, compiler.build()?)) @@ -1763,7 +1846,7 @@ impl Config { /// then are necessary. #[cfg(feature = "component-model")] pub fn debug_adapter_modules(&mut self, debug: bool) -> &mut Self { - self.tunables.debug_adapter_modules = debug; + self.tunables.debug_adapter_modules = Some(debug); self } @@ -1807,6 +1890,15 @@ impl Config { } } +/// If building without the runtime feature we can't determine the page size of +/// the platform where the execution will happen so just keep the original +/// values. +#[cfg(not(feature = "runtime"))] +fn round_up_to_pages(val: u64) -> u64 { + val +} + +#[cfg(feature = "runtime")] fn round_up_to_pages(val: u64) -> u64 { let page_size = wasmtime_runtime::page_size() as u64; debug_assert!(page_size.is_power_of_two()); @@ -1825,7 +1917,6 @@ impl fmt::Debug for Config { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { let mut f = f.debug_struct("Config"); f.field("debug_info", &self.tunables.generate_native_debuginfo) - .field("parse_wasm_debuginfo", &self.tunables.parse_wasm_debuginfo) .field("wasm_threads", &self.features.threads) .field("wasm_reference_types", &self.features.reference_types) .field( @@ -1836,28 +1927,30 @@ impl fmt::Debug for Config { .field("wasm_simd", &self.features.simd) .field("wasm_relaxed_simd", &self.features.relaxed_simd) .field("wasm_multi_value", &self.features.multi_value) - .field( - "static_memory_maximum_size", - &(u64::from(self.tunables.static_memory_bound) - * u64::from(wasmtime_environ::WASM_PAGE_SIZE)), - ) - .field( - "static_memory_guard_size", - &self.tunables.static_memory_offset_guard_size, - ) - .field( - "dynamic_memory_guard_size", - &self.tunables.dynamic_memory_offset_guard_size, - ) - .field( - "guard_before_linear_memory", - &self.tunables.guard_before_linear_memory, - ) .field("parallel_compilation", &self.parallel_compilation); #[cfg(any(feature = "cranelift", feature = "winch"))] { f.field("compiler_config", &self.compiler_config); } + + if let Some(enable) = self.tunables.parse_wasm_debuginfo { + f.field("parse_wasm_debuginfo", &enable); + } + if let Some(size) = self.tunables.static_memory_bound { + f.field( + "static_memory_maximum_size", + &(u64::from(size) * u64::from(wasmtime_environ::WASM_PAGE_SIZE)), + ); + } + if let Some(size) = self.tunables.static_memory_offset_guard_size { + f.field("static_memory_guard_size", &size); + } + if let Some(size) = self.tunables.dynamic_memory_offset_guard_size { + f.field("dynamic_memory_guard_size", &size); + } + if let Some(enable) = self.tunables.guard_before_linear_memory { + f.field("guard_before_linear_memory", &enable); + } f.finish() } } @@ -2024,7 +2117,7 @@ impl PoolingAllocationConfig { /// /// [`call_async`]: crate::TypedFunc::call_async #[cfg(feature = "async")] - #[cfg_attr(nightlydoc, doc(cfg(feature = "async")))] + #[cfg_attr(docsrs, doc(cfg(feature = "async")))] pub fn async_stack_zeroing(&mut self, enable: bool) -> &mut Self { self.config.async_stack_zeroing = enable; self @@ -2042,7 +2135,7 @@ impl PoolingAllocationConfig { /// Note that when using this option the memory with async stacks will /// never be decommitted. #[cfg(feature = "async")] - #[cfg_attr(nightlydoc, doc(cfg(feature = "async")))] + #[cfg_attr(docsrs, doc(cfg(feature = "async")))] pub fn async_stack_keep_resident(&mut self, size: usize) -> &mut Self { let size = round_up_to_pages(size as u64) as usize; self.config.async_stack_keep_resident = size; @@ -2409,7 +2502,7 @@ impl PoolingAllocationConfig { /// same method that [`MpkEnabled::Auto`] does. See /// [`PoolingAllocationConfig::memory_protection_keys`] for more /// information. - pub fn are_memory_protection_keys_available(&self) -> bool { + pub fn are_memory_protection_keys_available() -> bool { mpk::is_supported() } } diff --git a/crates/wasmtime/src/engine.rs b/crates/wasmtime/src/engine.rs index 88ccb3e4c549..07140b9926f8 100644 --- a/crates/wasmtime/src/engine.rs +++ b/crates/wasmtime/src/engine.rs @@ -1,20 +1,15 @@ -use crate::signatures::SignatureRegistry; +#[cfg(feature = "runtime")] +use crate::runtime::type_registry::TypeRegistry; use crate::Config; use anyhow::{Context, Result}; use object::write::{Object, StandardSegment}; use object::SectionKind; use once_cell::sync::OnceCell; -#[cfg(feature = "parallel-compilation")] -use rayon::prelude::*; use std::path::Path; use std::sync::atomic::{AtomicU64, Ordering}; use std::sync::Arc; -#[cfg(feature = "cache")] -use wasmtime_cache::CacheConfig; use wasmtime_environ::obj; -use wasmtime_environ::{FlagValue, ObjectKind}; -use wasmtime_jit::{profiling::ProfilingAgent, CodeMemory}; -use wasmtime_runtime::{CompiledModuleIdAllocator, InstanceAllocator, MmapVec}; +use wasmtime_environ::{FlagValue, ObjectKind, Tunables}; mod serialization; @@ -47,19 +42,31 @@ pub struct Engine { struct EngineInner { config: Config, + tunables: Tunables, #[cfg(any(feature = "cranelift", feature = "winch"))] compiler: Box, - allocator: Box, - profiler: Box, - signatures: SignatureRegistry, + #[cfg(feature = "runtime")] + allocator: Box, + #[cfg(feature = "runtime")] + profiler: Box, + #[cfg(feature = "runtime")] + signatures: TypeRegistry, + #[cfg(feature = "runtime")] epoch: AtomicU64, - unique_id_allocator: CompiledModuleIdAllocator, + #[cfg(feature = "runtime")] + unique_id_allocator: wasmtime_runtime::CompiledModuleIdAllocator, - // One-time check of whether the compiler's settings, if present, are - // compatible with the native host. + /// One-time check of whether the compiler's settings, if present, are + /// compatible with the native host. compatible_with_native_host: OnceCell>, } +impl Default for Engine { + fn default() -> Engine { + Engine::new(&Config::default()).unwrap() + } +} + impl Engine { /// Creates a new [`Engine`] with the specified compilation and /// configuration settings. @@ -74,183 +81,52 @@ impl Engine { /// to `true`, but explicitly disable these two compiler settings /// will cause errors. pub fn new(config: &Config) -> Result { - // Ensure that wasmtime_runtime's signal handlers are configured. This - // is the per-program initialization required for handling traps, such - // as configuring signals, vectored exception handlers, etc. - wasmtime_runtime::init_traps(crate::module::is_wasm_trap_pc, config.macos_use_mach_ports); - #[cfg(feature = "debug-builtins")] - wasmtime_runtime::debug_builtins::ensure_exported(); - - let registry = SignatureRegistry::new(); + #[cfg(feature = "runtime")] + { + // Ensure that wasmtime_runtime's signal handlers are configured. This + // is the per-program initialization required for handling traps, such + // as configuring signals, vectored exception handlers, etc. + wasmtime_runtime::init_traps( + crate::module::is_wasm_trap_pc, + config.macos_use_mach_ports, + ); + #[cfg(feature = "debug-builtins")] + wasmtime_runtime::debug_builtins::ensure_exported(); + } + let config = config.clone(); - config.validate()?; + let tunables = config.validate()?; #[cfg(any(feature = "cranelift", feature = "winch"))] - let (config, compiler) = config.build_compiler()?; - - let allocator = config.build_allocator()?; - let profiler = config.build_profiler()?; + let (config, compiler) = config.build_compiler(&tunables)?; Ok(Engine { inner: Arc::new(EngineInner { #[cfg(any(feature = "cranelift", feature = "winch"))] compiler, - config, - allocator, - profiler, - signatures: registry, + #[cfg(feature = "runtime")] + allocator: config.build_allocator(&tunables)?, + #[cfg(feature = "runtime")] + profiler: config.build_profiler()?, + #[cfg(feature = "runtime")] + signatures: TypeRegistry::new(), + #[cfg(feature = "runtime")] epoch: AtomicU64::new(0), - unique_id_allocator: CompiledModuleIdAllocator::new(), + #[cfg(feature = "runtime")] + unique_id_allocator: wasmtime_runtime::CompiledModuleIdAllocator::new(), compatible_with_native_host: OnceCell::new(), + config, + tunables, }), }) } - /// Eagerly initialize thread-local functionality shared by all [`Engine`]s. - /// - /// Wasmtime's implementation on some platforms may involve per-thread - /// setup that needs to happen whenever WebAssembly is invoked. This setup - /// can take on the order of a few hundred microseconds, whereas the - /// overhead of calling WebAssembly is otherwise on the order of a few - /// nanoseconds. This setup cost is paid once per-OS-thread. If your - /// application is sensitive to the latencies of WebAssembly function - /// calls, even those that happen first on a thread, then this function - /// can be used to improve the consistency of each call into WebAssembly - /// by explicitly frontloading the cost of the one-time setup per-thread. - /// - /// Note that this function is not required to be called in any embedding. - /// Wasmtime will automatically initialize thread-local-state as necessary - /// on calls into WebAssembly. This is provided for use cases where the - /// latency of WebAssembly calls are extra-important, which is not - /// necessarily true of all embeddings. - pub fn tls_eager_initialize() { - wasmtime_runtime::tls_eager_initialize(); - } - /// Returns the configuration settings that this engine is using. #[inline] pub fn config(&self) -> &Config { &self.inner.config } - #[cfg(any(feature = "cranelift", feature = "winch"))] - pub(crate) fn compiler(&self) -> &dyn wasmtime_environ::Compiler { - &*self.inner.compiler - } - - pub(crate) fn allocator(&self) -> &dyn InstanceAllocator { - self.inner.allocator.as_ref() - } - - pub(crate) fn profiler(&self) -> &dyn ProfilingAgent { - self.inner.profiler.as_ref() - } - - #[cfg(feature = "cache")] - pub(crate) fn cache_config(&self) -> &CacheConfig { - &self.config().cache_config - } - - /// Returns whether the engine `a` and `b` refer to the same configuration. - pub fn same(a: &Engine, b: &Engine) -> bool { - Arc::ptr_eq(&a.inner, &b.inner) - } - - pub(crate) fn signatures(&self) -> &SignatureRegistry { - &self.inner.signatures - } - - pub(crate) fn epoch_counter(&self) -> &AtomicU64 { - &self.inner.epoch - } - - pub(crate) fn current_epoch(&self) -> u64 { - self.epoch_counter().load(Ordering::Relaxed) - } - - /// Increments the epoch. - /// - /// When using epoch-based interruption, currently-executing Wasm - /// code within this engine will trap or yield "soon" when the - /// epoch deadline is reached or exceeded. (The configuration, and - /// the deadline, are set on the `Store`.) The intent of the - /// design is for this method to be called by the embedder at some - /// regular cadence, for example by a thread that wakes up at some - /// interval, or by a signal handler. - /// - /// See [`Config::epoch_interruption`](crate::Config::epoch_interruption) - /// for an introduction to epoch-based interruption and pointers - /// to the other relevant methods. - /// - /// ## Signal Safety - /// - /// This method is signal-safe: it does not make any syscalls, and - /// performs only an atomic increment to the epoch value in - /// memory. - pub fn increment_epoch(&self) { - self.inner.epoch.fetch_add(1, Ordering::Relaxed); - } - - pub(crate) fn unique_id_allocator(&self) -> &CompiledModuleIdAllocator { - &self.inner.unique_id_allocator - } - - /// Ahead-of-time (AOT) compiles a WebAssembly module. - /// - /// The `bytes` provided must be in one of two formats: - /// - /// * A [binary-encoded][binary] WebAssembly module. This is always supported. - /// * A [text-encoded][text] instance of the WebAssembly text format. - /// This is only supported when the `wat` feature of this crate is enabled. - /// If this is supplied then the text format will be parsed before validation. - /// Note that the `wat` feature is enabled by default. - /// - /// This method may be used to compile a module for use with a different target - /// host. The output of this method may be used with - /// [`Module::deserialize`](crate::Module::deserialize) on hosts compatible - /// with the [`Config`] associated with this [`Engine`]. - /// - /// The output of this method is safe to send to another host machine for later - /// execution. As the output is already a compiled module, translation and code - /// generation will be skipped and this will improve the performance of constructing - /// a [`Module`](crate::Module) from the output of this method. - /// - /// [binary]: https://webassembly.github.io/spec/core/binary/index.html - /// [text]: https://webassembly.github.io/spec/core/text/index.html - #[cfg(any(feature = "cranelift", feature = "winch"))] - #[cfg_attr(nightlydoc, doc(cfg(any(feature = "cranelift", feature = "winch"))))] - pub fn precompile_module(&self, bytes: &[u8]) -> Result> { - #[cfg(feature = "wat")] - let bytes = wat::parse_bytes(&bytes)?; - let (mmap, _) = crate::Module::build_artifacts(self, &bytes)?; - Ok(mmap.to_vec()) - } - - /// Same as [`Engine::precompile_module`] except for a - /// [`Component`](crate::component::Component) - #[cfg(any(feature = "cranelift", feature = "winch"))] - #[cfg_attr(nightlydoc, doc(cfg(any(feature = "cranelift", feature = "winch"))))] - #[cfg(feature = "component-model")] - #[cfg_attr(nightlydoc, doc(cfg(feature = "component-model")))] - pub fn precompile_component(&self, bytes: &[u8]) -> Result> { - #[cfg(feature = "wat")] - let bytes = wat::parse_bytes(&bytes)?; - let (mmap, _) = crate::component::Component::build_artifacts(self, &bytes)?; - Ok(mmap.to_vec()) - } - - /// Returns a [`std::hash::Hash`] that can be used to check precompiled WebAssembly compatibility. - /// - /// The outputs of [`Engine::precompile_module`] and [`Engine::precompile_component`] - /// are compatible with a different [`Engine`] instance only if the two engines use - /// compatible [`Config`]s. If this Hash matches between two [`Engine`]s then binaries - /// from one are guaranteed to deserialize in the other. - #[cfg(any(feature = "cranelift", feature = "winch"))] - #[cfg_attr(nightlydoc, doc(cfg(feature = "cranelift")))] // see build.rs - pub fn precompile_compatibility_hash(&self) -> impl std::hash::Hash + '_ { - crate::module::HashedEngineCompileEnv(self) - } - pub(crate) fn run_maybe_parallel< A: Send, B: Send, @@ -263,10 +139,13 @@ impl Engine { ) -> Result, E> { if self.config().parallel_compilation { #[cfg(feature = "parallel-compilation")] - return input - .into_par_iter() - .map(|a| f(a)) - .collect::, E>>(); + { + use rayon::prelude::*; + return input + .into_par_iter() + .map(|a| f(a)) + .collect::, E>>(); + } } // In case the parallel-compilation feature is disabled or the parallel_compilation config @@ -277,23 +156,45 @@ impl Engine { .collect::, E>>() } - /// Executes `f1` and `f2` in parallel if parallel compilation is enabled at - /// both runtime and compile time, otherwise runs them synchronously. - #[allow(dead_code)] // only used for the component-model feature right now - pub(crate) fn join_maybe_parallel( - &self, - f1: impl FnOnce() -> T + Send, - f2: impl FnOnce() -> U + Send, - ) -> (T, U) - where - T: Send, - U: Send, - { - if self.config().parallel_compilation { - #[cfg(feature = "parallel-compilation")] - return rayon::join(f1, f2); + /// Take a weak reference to this engine. + pub fn weak(&self) -> EngineWeak { + EngineWeak { + inner: Arc::downgrade(&self.inner), } - (f1(), f2()) + } + + pub(crate) fn tunables(&self) -> &Tunables { + &self.inner.tunables + } + + /// Returns whether the engine `a` and `b` refer to the same configuration. + pub fn same(a: &Engine, b: &Engine) -> bool { + Arc::ptr_eq(&a.inner, &b.inner) + } + + /// Detects whether the bytes provided are a precompiled object produced by + /// Wasmtime. + /// + /// This function will inspect the header of `bytes` to determine if it + /// looks like a precompiled core wasm module or a precompiled component. + /// This does not validate the full structure or guarantee that + /// deserialization will succeed, instead it helps higher-levels of the + /// stack make a decision about what to do next when presented with the + /// `bytes` as an input module. + /// + /// If the `bytes` looks like a precompiled object previously produced by + /// [`Module::serialize`](crate::Module::serialize), + /// [`Component::serialize`](crate::component::Component::serialize), + /// [`Engine::precompile_module`], or [`Engine::precompile_component`], then + /// this will return `Some(...)` indicating so. Otherwise `None` is + /// returned. + pub fn detect_precompiled(&self, bytes: &[u8]) -> Option { + serialization::detect_precompiled_bytes(bytes) + } + + /// Like [`Engine::detect_precompiled`], but performs the detection on a file. + pub fn detect_precompiled_file(&self, path: impl AsRef) -> Result> { + serialization::detect_precompiled_file(path) } /// Returns the target triple which this engine is compiling code for @@ -577,13 +478,65 @@ impl Engine { flag )) } +} - #[cfg(any(feature = "cranelift", feature = "winch"))] +#[cfg(any(feature = "cranelift", feature = "winch"))] +#[cfg_attr(docsrs, doc(cfg(any(feature = "cranelift", feature = "winch"))))] +impl Engine { + pub(crate) fn compiler(&self) -> &dyn wasmtime_environ::Compiler { + &*self.inner.compiler + } + + /// Ahead-of-time (AOT) compiles a WebAssembly module. + /// + /// The `bytes` provided must be in one of two formats: + /// + /// * A [binary-encoded][binary] WebAssembly module. This is always supported. + /// * A [text-encoded][text] instance of the WebAssembly text format. + /// This is only supported when the `wat` feature of this crate is enabled. + /// If this is supplied then the text format will be parsed before validation. + /// Note that the `wat` feature is enabled by default. + /// + /// This method may be used to compile a module for use with a different target + /// host. The output of this method may be used with + /// [`Module::deserialize`](crate::Module::deserialize) on hosts compatible + /// with the [`Config`](crate::Config) associated with this [`Engine`]. + /// + /// The output of this method is safe to send to another host machine for later + /// execution. As the output is already a compiled module, translation and code + /// generation will be skipped and this will improve the performance of constructing + /// a [`Module`](crate::Module) from the output of this method. + /// + /// [binary]: https://webassembly.github.io/spec/core/binary/index.html + /// [text]: https://webassembly.github.io/spec/core/text/index.html + pub fn precompile_module(&self, bytes: &[u8]) -> Result> { + #[cfg(feature = "wat")] + let bytes = wat::parse_bytes(&bytes)?; + let (v, _) = crate::compile::build_artifacts::>(self, &bytes)?; + Ok(v) + } + + /// Same as [`Engine::precompile_module`] except for a + /// [`Component`](crate::component::Component) + #[cfg(feature = "component-model")] + #[cfg_attr(docsrs, doc(cfg(feature = "component-model")))] + pub fn precompile_component(&self, bytes: &[u8]) -> Result> { + #[cfg(feature = "wat")] + let bytes = wat::parse_bytes(&bytes)?; + let (v, _) = crate::compile::build_component_artifacts::>(self, &bytes)?; + Ok(v) + } + + /// Produces a blob of bytes by serializing the `engine`'s configuration data to + /// be checked, perhaps in a different process, with the `check_compatible` + /// method below. + /// + /// The blob of bytes is inserted into the object file specified to become part + /// of the final compiled artifact. pub(crate) fn append_compiler_info(&self, obj: &mut Object<'_>) { - serialization::append_compiler_info(self, obj); + serialization::append_compiler_info(self, obj, &serialization::Metadata::new(&self)) } - #[cfg(any(feature = "cranelift", feature = "winch"))] pub(crate) fn append_bti(&self, obj: &mut Object<'_>) { let section = obj.add_section( obj.segment_name(StandardSegment::Data).to_vec(), @@ -597,6 +550,129 @@ impl Engine { }; obj.append_section_data(section, &[contents], 1); } +} + +/// Return value from the [`Engine::detect_precompiled`] API. +#[derive(PartialEq, Eq, Copy, Clone, Debug)] +pub enum Precompiled { + /// The input bytes look like a precompiled core wasm module. + Module, + /// The input bytes look like a precompiled wasm component. + Component, +} + +#[cfg(feature = "runtime")] +#[cfg_attr(docsrs, doc(cfg(feature = "runtime")))] +impl Engine { + /// Eagerly initialize thread-local functionality shared by all [`Engine`]s. + /// + /// Wasmtime's implementation on some platforms may involve per-thread + /// setup that needs to happen whenever WebAssembly is invoked. This setup + /// can take on the order of a few hundred microseconds, whereas the + /// overhead of calling WebAssembly is otherwise on the order of a few + /// nanoseconds. This setup cost is paid once per-OS-thread. If your + /// application is sensitive to the latencies of WebAssembly function + /// calls, even those that happen first on a thread, then this function + /// can be used to improve the consistency of each call into WebAssembly + /// by explicitly frontloading the cost of the one-time setup per-thread. + /// + /// Note that this function is not required to be called in any embedding. + /// Wasmtime will automatically initialize thread-local-state as necessary + /// on calls into WebAssembly. This is provided for use cases where the + /// latency of WebAssembly calls are extra-important, which is not + /// necessarily true of all embeddings. + pub fn tls_eager_initialize() { + wasmtime_runtime::tls_eager_initialize(); + } + + pub(crate) fn allocator(&self) -> &dyn wasmtime_runtime::InstanceAllocator { + self.inner.allocator.as_ref() + } + + pub(crate) fn profiler(&self) -> &dyn crate::profiling_agent::ProfilingAgent { + self.inner.profiler.as_ref() + } + + #[cfg(feature = "cache")] + pub(crate) fn cache_config(&self) -> &wasmtime_cache::CacheConfig { + &self.config().cache_config + } + + pub(crate) fn signatures(&self) -> &TypeRegistry { + &self.inner.signatures + } + + pub(crate) fn epoch_counter(&self) -> &AtomicU64 { + &self.inner.epoch + } + + pub(crate) fn current_epoch(&self) -> u64 { + self.epoch_counter().load(Ordering::Relaxed) + } + + /// Increments the epoch. + /// + /// When using epoch-based interruption, currently-executing Wasm + /// code within this engine will trap or yield "soon" when the + /// epoch deadline is reached or exceeded. (The configuration, and + /// the deadline, are set on the `Store`.) The intent of the + /// design is for this method to be called by the embedder at some + /// regular cadence, for example by a thread that wakes up at some + /// interval, or by a signal handler. + /// + /// See [`Config::epoch_interruption`](crate::Config::epoch_interruption) + /// for an introduction to epoch-based interruption and pointers + /// to the other relevant methods. + /// + /// When performing `increment_epoch` in a separate thread, consider using + /// [`Engine::weak`] to hold an [`EngineWeak`](crate::EngineWeak) and + /// performing [`EngineWeak::upgrade`](crate::EngineWeak::upgrade) on each + /// tick, so that the epoch ticking thread does not keep an [`Engine`] alive + /// longer than any of its consumers. + /// + /// ## Signal Safety + /// + /// This method is signal-safe: it does not make any syscalls, and + /// performs only an atomic increment to the epoch value in + /// memory. + pub fn increment_epoch(&self) { + self.inner.epoch.fetch_add(1, Ordering::Relaxed); + } + + pub(crate) fn unique_id_allocator(&self) -> &wasmtime_runtime::CompiledModuleIdAllocator { + &self.inner.unique_id_allocator + } + + /// Returns a [`std::hash::Hash`] that can be used to check precompiled WebAssembly compatibility. + /// + /// The outputs of [`Engine::precompile_module`] and [`Engine::precompile_component`] + /// are compatible with a different [`Engine`] instance only if the two engines use + /// compatible [`Config`]s. If this Hash matches between two [`Engine`]s then binaries + /// from one are guaranteed to deserialize in the other. + #[cfg(any(feature = "cranelift", feature = "winch"))] + #[cfg_attr(docsrs, doc(cfg(feature = "cranelift")))] // see build.rs + pub fn precompile_compatibility_hash(&self) -> impl std::hash::Hash + '_ { + crate::module::HashedEngineCompileEnv(self) + } + + /// Executes `f1` and `f2` in parallel if parallel compilation is enabled at + /// both runtime and compile time, otherwise runs them synchronously. + #[allow(dead_code)] // only used for the component-model feature right now + pub(crate) fn join_maybe_parallel( + &self, + f1: impl FnOnce() -> T + Send, + f2: impl FnOnce() -> U + Send, + ) -> (T, U) + where + T: Send, + U: Send, + { + if self.config().parallel_compilation { + #[cfg(feature = "parallel-compilation")] + return rayon::join(f1, f2); + } + (f1(), f2()) + } /// Loads a `CodeMemory` from the specified in-memory slice, copying it to a /// uniquely owned mmap. @@ -607,8 +683,8 @@ impl Engine { &self, bytes: &[u8], expected: ObjectKind, - ) -> Result> { - self.load_code(MmapVec::from_slice(bytes)?, expected) + ) -> Result> { + self.load_code(wasmtime_runtime::MmapVec::from_slice(bytes)?, expected) } /// Like `load_code_bytes`, but creates a mmap from a file on disk. @@ -616,177 +692,37 @@ impl Engine { &self, path: &Path, expected: ObjectKind, - ) -> Result> { + ) -> Result> { self.load_code( - MmapVec::from_file(path).with_context(|| { + wasmtime_runtime::MmapVec::from_file(path).with_context(|| { format!("failed to create file mapping for: {}", path.display()) })?, expected, ) } - pub(crate) fn load_code(&self, mmap: MmapVec, expected: ObjectKind) -> Result> { + pub(crate) fn load_code( + &self, + mmap: wasmtime_runtime::MmapVec, + expected: ObjectKind, + ) -> Result> { serialization::check_compatible(self, &mmap, expected)?; - let mut code = CodeMemory::new(mmap)?; + let mut code = crate::CodeMemory::new(mmap)?; code.publish()?; Ok(Arc::new(code)) } - - /// Detects whether the bytes provided are a precompiled object produced by - /// Wasmtime. - /// - /// This function will inspect the header of `bytes` to determine if it - /// looks like a precompiled core wasm module or a precompiled component. - /// This does not validate the full structure or guarantee that - /// deserialization will succeed, instead it helps higher-levels of the - /// stack make a decision about what to do next when presented with the - /// `bytes` as an input module. - /// - /// If the `bytes` looks like a precompiled object previously produced by - /// [`Module::serialize`](crate::Module::serialize), - /// [`Component::serialize`](crate::component::Component::serialize), - /// [`Engine::precompile_module`], or [`Engine::precompile_component`], then - /// this will return `Some(...)` indicating so. Otherwise `None` is - /// returned. - pub fn detect_precompiled(&self, bytes: &[u8]) -> Option { - serialization::detect_precompiled_bytes(bytes) - } - - /// Like [`Engine::detect_precompiled`], but performs the detection on a file. - pub fn detect_precompiled_file(&self, path: impl AsRef) -> Result> { - serialization::detect_precompiled_file(path) - } -} - -impl Default for Engine { - fn default() -> Engine { - Engine::new(&Config::default()).unwrap() - } } -/// Return value from the [`Engine::detect_precompiled`] API. -#[derive(PartialEq, Eq, Copy, Clone, Debug)] -pub enum Precompiled { - /// The input bytes look like a precompiled core wasm module. - Module, - /// The input bytes look like a precompiled wasm component. - Component, +/// A weak reference to an [`Engine`]. +#[derive(Clone)] +pub struct EngineWeak { + inner: std::sync::Weak, } -#[cfg(test)] -mod tests { - use std::{ - collections::hash_map::DefaultHasher, - hash::{Hash, Hasher}, - }; - - use crate::{Config, Engine, Module, ModuleVersionStrategy, OptLevel}; - - use anyhow::Result; - use tempfile::TempDir; - - #[test] - #[cfg_attr(miri, ignore)] - fn cache_accounts_for_opt_level() -> Result<()> { - let td = TempDir::new()?; - let config_path = td.path().join("config.toml"); - std::fs::write( - &config_path, - &format!( - " - [cache] - enabled = true - directory = '{}' - ", - td.path().join("cache").display() - ), - )?; - let mut cfg = Config::new(); - cfg.cranelift_opt_level(OptLevel::None) - .cache_config_load(&config_path)?; - let engine = Engine::new(&cfg)?; - Module::new(&engine, "(module (func))")?; - assert_eq!(engine.config().cache_config.cache_hits(), 0); - assert_eq!(engine.config().cache_config.cache_misses(), 1); - Module::new(&engine, "(module (func))")?; - assert_eq!(engine.config().cache_config.cache_hits(), 1); - assert_eq!(engine.config().cache_config.cache_misses(), 1); - - let mut cfg = Config::new(); - cfg.cranelift_opt_level(OptLevel::Speed) - .cache_config_load(&config_path)?; - let engine = Engine::new(&cfg)?; - Module::new(&engine, "(module (func))")?; - assert_eq!(engine.config().cache_config.cache_hits(), 0); - assert_eq!(engine.config().cache_config.cache_misses(), 1); - Module::new(&engine, "(module (func))")?; - assert_eq!(engine.config().cache_config.cache_hits(), 1); - assert_eq!(engine.config().cache_config.cache_misses(), 1); - - let mut cfg = Config::new(); - cfg.cranelift_opt_level(OptLevel::SpeedAndSize) - .cache_config_load(&config_path)?; - let engine = Engine::new(&cfg)?; - Module::new(&engine, "(module (func))")?; - assert_eq!(engine.config().cache_config.cache_hits(), 0); - assert_eq!(engine.config().cache_config.cache_misses(), 1); - Module::new(&engine, "(module (func))")?; - assert_eq!(engine.config().cache_config.cache_hits(), 1); - assert_eq!(engine.config().cache_config.cache_misses(), 1); - - let mut cfg = Config::new(); - cfg.debug_info(true).cache_config_load(&config_path)?; - let engine = Engine::new(&cfg)?; - Module::new(&engine, "(module (func))")?; - assert_eq!(engine.config().cache_config.cache_hits(), 0); - assert_eq!(engine.config().cache_config.cache_misses(), 1); - Module::new(&engine, "(module (func))")?; - assert_eq!(engine.config().cache_config.cache_hits(), 1); - assert_eq!(engine.config().cache_config.cache_misses(), 1); - - Ok(()) - } - - #[test] - fn precompile_compatibility_key_accounts_for_opt_level() { - fn hash_for_config(cfg: &Config) -> u64 { - let engine = Engine::new(cfg).expect("Config should be valid"); - let mut hasher = DefaultHasher::new(); - engine.precompile_compatibility_hash().hash(&mut hasher); - hasher.finish() - } - let mut cfg = Config::new(); - cfg.cranelift_opt_level(OptLevel::None); - let opt_none_hash = hash_for_config(&cfg); - cfg.cranelift_opt_level(OptLevel::Speed); - let opt_speed_hash = hash_for_config(&cfg); - assert_ne!(opt_none_hash, opt_speed_hash) - } - - #[test] - fn precompile_compatibility_key_accounts_for_module_version_strategy() -> Result<()> { - fn hash_for_config(cfg: &Config) -> u64 { - let engine = Engine::new(cfg).expect("Config should be valid"); - let mut hasher = DefaultHasher::new(); - engine.precompile_compatibility_hash().hash(&mut hasher); - hasher.finish() - } - let mut cfg_custom_version = Config::new(); - cfg_custom_version.module_version(ModuleVersionStrategy::Custom("1.0.1111".to_string()))?; - let custom_version_hash = hash_for_config(&cfg_custom_version); - - let mut cfg_default_version = Config::new(); - cfg_default_version.module_version(ModuleVersionStrategy::WasmtimeVersion)?; - let default_version_hash = hash_for_config(&cfg_default_version); - - let mut cfg_none_version = Config::new(); - cfg_none_version.module_version(ModuleVersionStrategy::None)?; - let none_version_hash = hash_for_config(&cfg_none_version); - - assert_ne!(custom_version_hash, default_version_hash); - assert_ne!(custom_version_hash, none_version_hash); - assert_ne!(default_version_hash, none_version_hash); - - Ok(()) +impl EngineWeak { + /// Upgrade this weak reference into an [`Engine`]. Returns `None` if + /// strong references (the [`Engine`] type itself) no longer exist. + pub fn upgrade(&self) -> Option { + std::sync::Weak::upgrade(&self.inner).map(|inner| Engine { inner }) } } diff --git a/crates/wasmtime/src/engine/serialization.rs b/crates/wasmtime/src/engine/serialization.rs index d6d0f4291ffb..f4063bd6e547 100644 --- a/crates/wasmtime/src/engine/serialization.rs +++ b/crates/wasmtime/src/engine/serialization.rs @@ -29,41 +29,9 @@ use serde_derive::{Deserialize, Serialize}; use std::str::FromStr; use wasmtime_environ::obj; use wasmtime_environ::{FlagValue, ObjectKind, Tunables}; -use wasmtime_runtime::MmapVec; const VERSION: u8 = 0; -/// Produces a blob of bytes by serializing the `engine`'s configuration data to -/// be checked, perhaps in a different process, with the `check_compatible` -/// method below. -/// -/// The blob of bytes is inserted into the object file specified to become part -/// of the final compiled artifact. -#[cfg(any(feature = "cranelift", feature = "winch"))] -pub fn append_compiler_info(engine: &Engine, obj: &mut Object<'_>) { - let section = obj.add_section( - obj.segment_name(StandardSegment::Data).to_vec(), - obj::ELF_WASM_ENGINE.as_bytes().to_vec(), - SectionKind::ReadOnlyData, - ); - let mut data = Vec::new(); - data.push(VERSION); - let version = match &engine.config().module_version { - ModuleVersionStrategy::WasmtimeVersion => env!("CARGO_PKG_VERSION"), - ModuleVersionStrategy::Custom(c) => c, - ModuleVersionStrategy::None => "", - }; - // This precondition is checked in Config::module_version: - assert!( - version.len() < 256, - "package version must be less than 256 bytes" - ); - data.push(version.len() as u8); - data.extend_from_slice(version.as_bytes()); - bincode::serialize_into(&mut data, &Metadata::new(engine)).unwrap(); - obj.set_section_data(section, data, 1); -} - /// Verifies that the serialized engine in `mmap` is compatible with the /// `engine` provided. /// @@ -72,7 +40,7 @@ pub fn append_compiler_info(engine: &Engine, obj: &mut Object<'_>) { /// provided here, notably compatible wasm features are enabled, compatible /// compiler options, etc. If a mismatch is found and the compilation metadata /// specified is incompatible then an error is returned. -pub fn check_compatible(engine: &Engine, mmap: &MmapVec, expected: ObjectKind) -> Result<()> { +pub fn check_compatible(engine: &Engine, mmap: &[u8], expected: ObjectKind) -> Result<()> { // Parse the input `mmap` as an ELF file and see if the header matches the // Wasmtime-generated header. This includes a Wasmtime-specific `os_abi` and // the `e_flags` field should indicate whether `expected` matches or not. @@ -86,7 +54,7 @@ pub fn check_compatible(engine: &Engine, mmap: &MmapVec, expected: ObjectKind) - // structured well enough to make this easy and additionally it's not really // a perf issue right now so doing that is left for another day's // refactoring. - let obj = File::parse(&mmap[..]).context("failed to parse precompiled artifact as an ELF")?; + let obj = File::parse(mmap).context("failed to parse precompiled artifact as an ELF")?; let expected_e_flags = match expected { ObjectKind::Module => obj::EF_WASMTIME_MODULE, ObjectKind::Component => obj::EF_WASMTIME_COMPONENT, @@ -144,6 +112,30 @@ pub fn check_compatible(engine: &Engine, mmap: &MmapVec, expected: ObjectKind) - bincode::deserialize::>(data)?.check_compatible(engine) } +pub fn append_compiler_info(engine: &Engine, obj: &mut Object<'_>, metadata: &Metadata<'_>) { + let section = obj.add_section( + obj.segment_name(StandardSegment::Data).to_vec(), + obj::ELF_WASM_ENGINE.as_bytes().to_vec(), + SectionKind::ReadOnlyData, + ); + let mut data = Vec::new(); + data.push(VERSION); + let version = match &engine.config().module_version { + ModuleVersionStrategy::WasmtimeVersion => env!("CARGO_PKG_VERSION"), + ModuleVersionStrategy::Custom(c) => c, + ModuleVersionStrategy::None => "", + }; + // This precondition is checked in Config::module_version: + assert!( + version.len() < 256, + "package version must be less than 256 bytes" + ); + data.push(version.len() as u8); + data.extend_from_slice(version.as_bytes()); + bincode::serialize_into(&mut data, metadata).unwrap(); + obj.set_section_data(section, data, 1); +} + fn detect_precompiled<'data, R: object::ReadRef<'data>>( obj: File<'data, R>, ) -> Option { @@ -173,7 +165,7 @@ pub fn detect_precompiled_file(path: impl AsRef) -> Result { +pub struct Metadata<'a> { target: String, #[serde(borrow)] shared_flags: Vec<(&'a str, FlagValue<'a>)>, @@ -203,7 +195,7 @@ struct WasmFeatures { impl Metadata<'_> { #[cfg(any(feature = "cranelift", feature = "winch"))] - fn new(engine: &Engine) -> Metadata<'static> { + pub fn new(engine: &Engine) -> Metadata<'static> { let wasmparser::WasmFeatures { reference_types, multi_value, @@ -221,6 +213,7 @@ impl Metadata<'_> { function_references, gc, component_model_values, + component_model_nested_names, // Always on; we don't currently have knobs for these. mutable_global: _, @@ -232,12 +225,13 @@ impl Metadata<'_> { assert!(!memory_control); assert!(!gc); assert!(!component_model_values); + assert!(!component_model_nested_names); Metadata { target: engine.compiler().triple().to_string(), shared_flags: engine.compiler().flags(), isa_flags: engine.compiler().isa_flags(), - tunables: engine.config().tunables.clone(), + tunables: engine.tunables().clone(), features: WasmFeatures { reference_types, multi_value, @@ -260,7 +254,7 @@ impl Metadata<'_> { self.check_triple(engine)?; self.check_shared_flags(engine)?; self.check_isa_flags(engine)?; - self.check_tunables(&engine.config().tunables)?; + self.check_tunables(&engine.tunables())?; self.check_features(&engine.config().features)?; Ok(()) } @@ -489,7 +483,16 @@ impl Metadata<'_> { #[cfg(test)] mod test { use super::*; - use crate::Config; + + use crate::{Config, Engine, Module, ModuleVersionStrategy, OptLevel}; + + use anyhow::Result; + use tempfile::TempDir; + + use std::{ + collections::hash_map::DefaultHasher, + hash::{Hash, Hasher}, + }; #[test] fn test_architecture_mismatch() -> Result<()> { @@ -654,4 +657,122 @@ Caused by: Ok(()) } + + #[test] + fn engine_weak_upgrades() { + let engine = Engine::default(); + let weak = engine.weak(); + weak.upgrade() + .expect("engine is still alive, so weak reference can upgrade"); + drop(engine); + assert!( + weak.upgrade().is_none(), + "engine was dropped, so weak reference cannot upgrade" + ); + } + + #[test] + #[cfg_attr(miri, ignore)] + fn cache_accounts_for_opt_level() -> Result<()> { + let td = TempDir::new()?; + let config_path = td.path().join("config.toml"); + std::fs::write( + &config_path, + &format!( + " + [cache] + enabled = true + directory = '{}' + ", + td.path().join("cache").display() + ), + )?; + let mut cfg = Config::new(); + cfg.cranelift_opt_level(OptLevel::None) + .cache_config_load(&config_path)?; + let engine = Engine::new(&cfg)?; + Module::new(&engine, "(module (func))")?; + assert_eq!(engine.config().cache_config.cache_hits(), 0); + assert_eq!(engine.config().cache_config.cache_misses(), 1); + Module::new(&engine, "(module (func))")?; + assert_eq!(engine.config().cache_config.cache_hits(), 1); + assert_eq!(engine.config().cache_config.cache_misses(), 1); + + let mut cfg = Config::new(); + cfg.cranelift_opt_level(OptLevel::Speed) + .cache_config_load(&config_path)?; + let engine = Engine::new(&cfg)?; + Module::new(&engine, "(module (func))")?; + assert_eq!(engine.config().cache_config.cache_hits(), 0); + assert_eq!(engine.config().cache_config.cache_misses(), 1); + Module::new(&engine, "(module (func))")?; + assert_eq!(engine.config().cache_config.cache_hits(), 1); + assert_eq!(engine.config().cache_config.cache_misses(), 1); + + let mut cfg = Config::new(); + cfg.cranelift_opt_level(OptLevel::SpeedAndSize) + .cache_config_load(&config_path)?; + let engine = Engine::new(&cfg)?; + Module::new(&engine, "(module (func))")?; + assert_eq!(engine.config().cache_config.cache_hits(), 0); + assert_eq!(engine.config().cache_config.cache_misses(), 1); + Module::new(&engine, "(module (func))")?; + assert_eq!(engine.config().cache_config.cache_hits(), 1); + assert_eq!(engine.config().cache_config.cache_misses(), 1); + + let mut cfg = Config::new(); + cfg.debug_info(true).cache_config_load(&config_path)?; + let engine = Engine::new(&cfg)?; + Module::new(&engine, "(module (func))")?; + assert_eq!(engine.config().cache_config.cache_hits(), 0); + assert_eq!(engine.config().cache_config.cache_misses(), 1); + Module::new(&engine, "(module (func))")?; + assert_eq!(engine.config().cache_config.cache_hits(), 1); + assert_eq!(engine.config().cache_config.cache_misses(), 1); + + Ok(()) + } + + #[test] + fn precompile_compatibility_key_accounts_for_opt_level() { + fn hash_for_config(cfg: &Config) -> u64 { + let engine = Engine::new(cfg).expect("Config should be valid"); + let mut hasher = DefaultHasher::new(); + engine.precompile_compatibility_hash().hash(&mut hasher); + hasher.finish() + } + let mut cfg = Config::new(); + cfg.cranelift_opt_level(OptLevel::None); + let opt_none_hash = hash_for_config(&cfg); + cfg.cranelift_opt_level(OptLevel::Speed); + let opt_speed_hash = hash_for_config(&cfg); + assert_ne!(opt_none_hash, opt_speed_hash) + } + + #[test] + fn precompile_compatibility_key_accounts_for_module_version_strategy() -> Result<()> { + fn hash_for_config(cfg: &Config) -> u64 { + let engine = Engine::new(cfg).expect("Config should be valid"); + let mut hasher = DefaultHasher::new(); + engine.precompile_compatibility_hash().hash(&mut hasher); + hasher.finish() + } + let mut cfg_custom_version = Config::new(); + cfg_custom_version.module_version(ModuleVersionStrategy::Custom("1.0.1111".to_string()))?; + let custom_version_hash = hash_for_config(&cfg_custom_version); + + let mut cfg_default_version = Config::new(); + cfg_default_version.module_version(ModuleVersionStrategy::WasmtimeVersion)?; + let default_version_hash = hash_for_config(&cfg_default_version); + + let mut cfg_none_version = Config::new(); + cfg_none_version.module_version(ModuleVersionStrategy::None)?; + let none_version_hash = hash_for_config(&cfg_none_version); + + assert_ne!(custom_version_hash, default_version_hash); + assert_ne!(custom_version_hash, none_version_hash); + assert_ne!(default_version_hash, none_version_hash); + + Ok(()) + } } diff --git a/crates/wasmtime/src/lib.rs b/crates/wasmtime/src/lib.rs index 712d627a5561..da007574f517 100644 --- a/crates/wasmtime/src/lib.rs +++ b/crates/wasmtime/src/lib.rs @@ -1,37 +1,52 @@ -//! Wasmtime's embedding API -//! -//! Wasmtime is a WebAssembly engine for JIT-complied or ahead-of-time compiled -//! WebAssembly modules. More information about the Wasmtime project as a whole -//! can be found [in the documentation book](https://docs.wasmtime.dev) whereas -//! this documentation mostly focuses on the API reference of the `wasmtime` -//! crate itself. -//! -//! This crate contains an API used to interact with WebAssembly modules. For -//! example you can compile modules, instantiate them, call them, etc. As an -//! embedder of WebAssembly you can also provide WebAssembly modules -//! functionality from the host by creating host-defined functions, memories, -//! globals, etc, which can do things that WebAssembly cannot (such as print to -//! the screen). -//! -//! The `wasmtime` crate has similar concepts to the -//! the [JS WebAssembly -//! API](https://developer.mozilla.org/en-US/docs/WebAssembly) as well as the -//! [proposed C API](https://github.com/webassembly/wasm-c-api), but the Rust -//! API is designed for efficiency, ergonomics, and expressivity in Rust. As -//! with all other Rust code you're guaranteed that programs will be safe (not -//! have undefined behavior or segfault) so long as you don't use `unsafe` in -//! your own program. With `wasmtime` you can easily and conveniently embed a -//! WebAssembly runtime with confidence that the WebAssembly is safely -//! sandboxed. -//! -//! An example of using Wasmtime looks like: +//! # Wasmtime's embedding API +//! +//! Wasmtime is a WebAssembly engine for JIT-compiled or ahead-of-time compiled +//! WebAssembly modules and components. More information about the Wasmtime +//! project as a whole can be found [in the documentation +//! book](https://docs.wasmtime.dev) whereas this documentation mostly focuses +//! on the API reference of the `wasmtime` crate itself. +//! +//! This crate contains an API used to interact with [WebAssembly modules] or +//! [WebAssembly components]. For example you can compile WebAssembly, create +//! instances, call functions, etc. As an embedder of WebAssembly you can also +//! provide guests functionality from the host by creating host-defined +//! functions, memories, globals, etc, which can do things that WebAssembly +//! cannot (such as print to the screen). +//! +//! [WebAssembly modules]: https://webassembly.github.io/spec +//! [WebAssembly components]: https://component-model.bytecodealliance.org +//! +//! The `wasmtime` crate is designed to be safe, efficient, and ergonomic. +//! This enables executing WebAssembly without the embedder needing to use +//! `unsafe` code, meaning that you're guaranteed there is no undefined behavior +//! or segfaults in either the WebAssembly guest or the host itself. +//! +//! The `wasmtime` crate can roughly be thought of as being split into two +//! halves: +//! +//! * One half of the crate is similar to the [JS WebAssembly +//! API](https://developer.mozilla.org/en-US/docs/WebAssembly) as well as the +//! [proposed C API](https://github.com/webassembly/wasm-c-api) and is +//! intended for working with [WebAssembly modules]. This API resides in the +//! root of the `wasmtime` crate's namespace, for example +//! [`wasmtime::Module`](`Module`). +//! +//! * The second half of the crate is for use with the [WebAssembly Component +//! Model]. The implementation of the component model is present in +//! [`wasmtime::component`](`component`) and roughly mirrors the structure for +//! core WebAssembly, for example [`component::Func`] mirrors [`Func`]. +//! +//! [WebAssembly Component Model]: https://component-model.bytecodealliance.org +//! +//! An example of using Wasmtime to run a core WebAssembly module looks like: //! //! ``` //! use wasmtime::*; //! //! fn main() -> wasmtime::Result<()> { -//! // Modules can be compiled through either the text or binary format //! let engine = Engine::default(); +//! +//! // Modules can be compiled through either the text or binary format //! let wat = r#" //! (module //! (import "host" "host_func" (func $host_hello (param i32))) @@ -43,19 +58,23 @@ //! "#; //! let module = Module::new(&engine, wat)?; //! +//! // Host functionality can be arbitrary Rust functions and is provided +//! // to guests through a `Linker`. +//! let mut linker = Linker::new(&engine); +//! linker.func_wrap("host", "host_func", |caller: Caller<'_, u32>, param: i32| { +//! println!("Got {} from WebAssembly", param); +//! println!("my host state is: {}", caller.data()); +//! })?; +//! //! // All wasm objects operate within the context of a "store". Each //! // `Store` has a type parameter to store host-specific data, which in //! // this case we're using `4` for. -//! let mut store = Store::new(&engine, 4); -//! let host_func = Func::wrap(&mut store, |caller: Caller<'_, u32>, param: i32| { -//! println!("Got {} from WebAssembly", param); -//! println!("my host state is: {}", caller.data()); -//! }); +//! let mut store: Store = Store::new(&engine, 4); //! //! // Instantiation of a module requires specifying its imports and then //! // afterwards we can fetch exports by name, as well as asserting the //! // type signature of the function with `get_typed_func`. -//! let instance = Instance::new(&mut store, &module, &[host_func.into()])?; +//! let instance = linker.instantiate(&mut store, &module)?; //! let hello = instance.get_typed_func::<(), ()>(&mut store, "hello")?; //! //! // And finally we can call the wasm! @@ -70,19 +89,13 @@ //! There are a number of core types and concepts that are important to be aware //! of when using the `wasmtime` crate: //! -//! * [`Engine`] - a global compilation environment for WebAssembly. An -//! [`Engine`] is an object that can be shared concurrently across threads and -//! is created with a [`Config`] to tweak various settings. Compilation of any -//! WebAssembly requires first configuring and creating an [`Engine`]. -//! -//! * [`Module`] - a compiled WebAssembly module. This structure represents -//! in-memory JIT code which is ready to execute after being instantiated. -//! It's often important to cache instances of a [`Module`] because creation -//! (compilation) can be expensive. Note that [`Module`] is safe to share -//! across threads, and can be created from a WebAssembly binary and an -//! [`Engine`] with [`Module::new`]. Caching can either happen with -//! [`Engine::precompile_module`] or [`Module::serialize`], feeding those -//! bytes back into [`Module::deserialize`]. +//! * [`Engine`] - a global compilation and runtime environment for WebAssembly. +//! An [`Engine`] is an object that can be shared concurrently across threads +//! and is created with a [`Config`] with many knobs for configuring +//! behavior. Compiling or executing any WebAssembly requires first +//! configuring and creating an [`Engine`]. All [`Module`]s and +//! [`Component`](component::Component)s belong to an [`Engine`], and +//! typically there's one [`Engine`] per process. //! //! * [`Store`] - container for all information related to WebAssembly objects //! such as functions, instances, memories, etc. A [`Store`][`Store`] @@ -92,19 +105,48 @@ //! required for all WebAssembly operations, such as calling a wasm function. //! The [`Store`] is passed in as a "context" to methods like [`Func::call`]. //! Dropping a [`Store`] will deallocate all memory associated with -//! WebAssembly objects within the [`Store`]. -//! -//! * [`Instance`] - an instantiated WebAssembly module. An instance is where -//! you can actually acquire a [`Func`] from, for example, to call. -//! -//! * [`Func`] - a WebAssembly (or host) function. This can be acquired as the -//! export of an [`Instance`] to call WebAssembly functions, or it can be -//! created via functions like [`Func::wrap`] to wrap host-defined -//! functionality and give it to WebAssembly. -//! -//! * [`Table`], [`Global`], [`Memory`] - other WebAssembly objects which can -//! either be defined on the host or in wasm itself (via instances). These all -//! have various ways of being interacted with like [`Func`]. +//! WebAssembly objects within the [`Store`]. A [`Store`] is cheap to create +//! and destroy and does not GC objects such as unused instances internally, +//! so it's intended to be short-lived (or no longer than the instances it +//! contains). +//! +//! * [`Linker`] (or [`component::Linker`]) - host functions are defined within +//! a linker to provide them a string-based name which can be looked up when +//! instantiating a WebAssembly module or component. Linkers are traditionally +//! populated at startup and then reused for all future instantiations of all +//! instances, assuming the set of host functions does not change over time. +//! Host functions are `Fn(..) + Send + Sync` and typically do not close over +//! mutable state. Instead it's recommended to store mutable state in the `T` +//! of [`Store`] which is accessed through [`Caller<'_, +//! T>`](crate::Caller) provided to host functions. +//! +//! * [`Module`] (or [`Component`](component::Component)) - a compiled +//! WebAssembly module or component. These structures contain compiled +//! executable code from a WebAssembly binary which is ready to execute after +//! being instantiated. These are expensive to create as they require +//! compilation of the input WebAssembly. Modules and components are safe to +//! share across threads, however. Modules and components can additionally be +//! [serialized into a list of bytes](crate::Module::serialize) to later be +//! [deserialized](crate::Module::deserialize) quickly. This enables JIT-style +//! compilation through constructors such as [`Module::new`] and AOT-style +//! compilation by having the compilation process use [`Module::serialize`] +//! and the execution process use [`Module::deserialize`]. +//! +//! * [`Instance`] (or [`component::Instance`]) - an instantiated WebAssembly +//! module or component. An instance is where you can actually acquire a +//! [`Func`] (or [`component::Func`]) from, for example, to call. +//! +//! * [`Func`] (or [`component::Func`]) - a WebAssembly function. This can be +//! acquired as the export of an [`Instance`] to call WebAssembly functions, +//! or it can be created via functions like [`Func::wrap`] to wrap +//! host-defined functionality and give it to WebAssembly. Functions also have +//! typed views as [`TypedFunc`] or [`component::TypedFunc`] for a more +//! efficient calling convention. +//! +//! * [`Table`], [`Global`], [`Memory`], [`component::Resource`] - other +//! WebAssembly objects which can either be defined on the host or in wasm +//! itself (via instances). These all have various ways of being interacted +//! with like [`Func`]. //! //! All "store-connected" types such as [`Func`], [`Memory`], etc, require the //! store to be passed in as a context to each method. Methods in wasmtime @@ -124,90 +166,6 @@ //! [`Func`] point within the [`Store`] and require the [`Store`] to be provided //! to actually access the internals of the WebAssembly function, for instance. //! -//! ## Linking -//! -//! WebAssembly modules almost always require functionality from the host to -//! perform I/O-like tasks. They might refer to quite a few pieces of host -//! functionality, WASI, or maybe even a number of other wasm modules. To assist -//! with managing this a [`Linker`] type is provided to instantiate modules. -//! -//! A [`Linker`] performs name-based resolution of the imports of a WebAssembly -//! module so the [`Linker::instantiate`] method does not take an `imports` -//! argument like [`Instance::new`] does. Methods like [`Linker::define`] or -//! [`Linker::func_wrap`] can be used to define names within a [`Linker`] to -//! later be used for instantiation. -//! -//! For example we can reimplement the above example with a `Linker`: -//! -//! ``` -//! use wasmtime::*; -//! -//! fn main() -> wasmtime::Result<()> { -//! let engine = Engine::default(); -//! let wat = r#" -//! (module -//! (import "host" "host_func" (func $host_hello (param i32))) -//! -//! (func (export "hello") -//! i32.const 3 -//! call $host_hello) -//! ) -//! "#; -//! let module = Module::new(&engine, wat)?; -//! -//! // Create a `Linker` and define our host function in it: -//! let mut linker = Linker::new(&engine); -//! linker.func_wrap("host", "host_func", |caller: Caller<'_, u32>, param: i32| { -//! println!("Got {} from WebAssembly", param); -//! println!("my host state is: {}", caller.data()); -//! })?; -//! -//! // Use the `linker` to instantiate the module, which will automatically -//! // resolve the imports of the module using name-based resolution. -//! let mut store = Store::new(&engine, 0); -//! let instance = linker.instantiate(&mut store, &module)?; -//! let hello = instance.get_typed_func::<(), ()>(&mut store, "hello")?; -//! hello.call(&mut store, ())?; -//! -//! Ok(()) -//! } -//! ``` -//! -//! The [`Linker`] type also transparently handles Commands and Reactors -//! as defined by WASI. -//! -//! ## Example Architecture -//! -//! To better understand how Wasmtime types interact with each other let's walk -//! through, at a high-level, an example of how you might use WebAssembly. In -//! our use case let's say we have a web server where we'd like to run some -//! custom WebAssembly on each request. To ensure requests are entirely isolated -//! from each other, though, we'll be creating a new [`Store`] for each -//! request. -//! -//! When the server starts, we'll start off by creating an [`Engine`] (and maybe -//! tweaking [`Config`] settings if necessary). This [`Engine`] will be the only -//! engine for the lifetime of the server itself. Next, we can compile our -//! WebAssembly. You'd create a [`Module`] through the [`Module::new`] API. -//! This will generate JIT code and perform expensive compilation tasks -//! up-front. Finally the last step of initialization would be to create a -//! [`Linker`] which will later be used to instantiate modules, adding -//! functionality like WASI to the linker too. -//! -//! After that setup, the server starts up as usual and is ready to receive -//! requests. Upon receiving a request you'd then create a [`Store`] with -//! [`Store::new`] referring to the original [`Engine`]. Using your [`Module`] -//! and [`Linker`] from before you'd then call [`Linker::instantiate`] to -//! instantiate our module for the request. Both of these operations are -//! designed to be as cheap as possible. -//! -//! With an [`Instance`] you can then invoke various exports and interact with -//! the WebAssembly module. Once the request is finished, the [`Store`] -//! is dropped and everything will be deallocated. Note that if the same -//! [`Store`] were used for every request then that would have all requests -//! sharing resources and nothing would ever get deallocated, causing memory -//! usage to baloon and would achive less isolation between requests. -//! //! ## WASI //! //! The `wasmtime` crate does not natively provide support for WASI, but you can @@ -218,32 +176,22 @@ //! //! [`wasmtime-wasi`]: https://crates.io/crates/wasmtime-wasi //! -//! ## Cross-store usage of items -//! -//! In `wasmtime` wasm items such as [`Global`] and [`Memory`] "belong" to a -//! [`Store`]. The store they belong to is the one they were created with -//! (passed in as a parameter) or instantiated with. This store is the only -//! store that can be used to interact with wasm items after they're created. -//! -//! The `wasmtime` crate will panic if the [`Store`] argument passed in to these -//! operations is incorrect. In other words it's considered a programmer error -//! rather than a recoverable error for the wrong [`Store`] to be used when -//! calling APIs. -//! //! ## Crate Features //! //! The `wasmtime` crate comes with a number of compile-time features that can //! be used to customize what features it supports. Some of these features are //! just internal details, but some affect the public API of the `wasmtime` -//! crate. Be sure to check the API you're using to see if any crate features -//! are enabled. +//! crate. Wasmtime APIs gated behind a Cargo feature should be indicated as +//! such in the documentation. +//! +//! * `runtime` - Enabled by default, this feature enables executing +//! WebAssembly modules and components. If a compiler is not available (such +//! as `cranelift`) then [`Module::deserialize`] must be used, for example, to +//! provide an ahead-of-time compiled artifact to execute WebAssembly. //! //! * `cranelift` - Enabled by default, this features enables using Cranelift at //! runtime to compile a WebAssembly module to native code. This feature is -//! required to process and compile new WebAssembly modules. If this feature -//! is disabled then the only way to create a [`Module`] is to use the -//! [`Module::deserialize`] function with a precompiled artifact (typically -//! compiled with the same version of Wasmtime, just somewhere else). +//! required to process and compile new WebAssembly modules and components. //! //! * `cache` - Enabled by default, this feature adds support for wasmtime to //! perform internal caching of modules in a global location. This must still @@ -251,42 +199,31 @@ //! [`Config::cache_config_load_default`]. //! //! * `wat` - Enabled by default, this feature adds support for accepting the -//! text format of WebAssembly in [`Module::new`]. The text format will be +//! text format of WebAssembly in [`Module::new`] and +//! [`Component::new`](component::Component::new). The text format will be //! automatically recognized and translated to binary when compiling a //! module. //! //! * `parallel-compilation` - Enabled by default, this feature enables support -//! for compiling functions of a module in parallel with `rayon`. +//! for compiling functions in parallel with `rayon`. //! //! * `async` - Enabled by default, this feature enables APIs and runtime //! support for defining asynchronous host functions and calling WebAssembly -//! asynchronously. -//! -//! * `jitdump` - Enabled by default, this feature compiles in support for the -//! jitdump runtime profiling format. The profiler can be selected with -//! [`Config::profiler`]. +//! asynchronously. For more information see [`Config::async_support`]. //! -//! * `vtune` - Enabled by default, this feature compiles in support for VTune -//! profiling of JIT code. +//! * `profiling` - Enabled by default, this feature compiles in support for +//! profiling guest code via a number of possible strategies. See +//! [`Config::profiler`] for more information. //! //! * `all-arch` - Not enabled by default. This feature compiles in support for //! all architectures for both the JIT compiler and the `wasmtime compile` CLI -//! command. +//! command. This can be combined with [`Config::target`] to precompile +//! modules for a different platform than the host. //! //! * `pooling-allocator` - Enabled by default, this feature adds support for -//! the pooling allocation strategy enabled via -//! [`Config::allocation_strategy`]. The pooling allocator can enable more -//! efficient reuse of resources for high-concurrency and -//! high-instantiation-count scenarios. -//! -//! * `memory-init-cow` - Enabled by default, this feature builds in support -//! for, on supported platforms, initializing wasm linear memories with -//! copy-on-write heap mappings. This makes instantiation much faster by -//! `mmap`-ing the initial memory image into place instead of copying memory -//! into place, allowing sharing pages that end up only getting read. Note -//! that this is simply compile-time support and this must also be enabled at -//! run-time via [`Config::memory_init_cow`] (which is also enabled by -//! default). +//! [`PoolingAllocationConfig`] to pass to [`Config::allocation_strategy`]. +//! The pooling allocator can enable efficient reuse of resources for +//! high-concurrency and high-instantiation-count scenarios. //! //! * `demangle` - Enabled by default, this will affect how backtraces are //! printed and whether symbol names from WebAssembly are attempted to be @@ -300,103 +237,24 @@ //! will attempt to parse DWARF debug information and convert WebAssembly //! addresses to source filenames and line numbers. //! +//! * `debug-builtins` - Enabled by default, this feature includes some built-in +//! debugging utilities and symbols for native debuggers such as GDB and LLDB +//! to attach to the process Wasmtime is used within. The intrinsics provided +//! will enable debugging guest code compiled to WebAssembly. This must also +//! be enabled via [`Config::debug_info`] as well for guests. +//! +//! * `component-model` - Enabled by default, this enables support for the +//! [`wasmtime::component`](component) API for working with components. +//! //! More crate features can be found in the [manifest] of Wasmtime itself for //! seeing what can be enabled and disabled. //! //! [manifest]: https://github.com/bytecodealliance/wasmtime/blob/main/crates/wasmtime/Cargo.toml -//! -//! ## Examples -//! -//! In addition to the examples below be sure to check out the [online embedding -//! documentation][rustdocs] as well as the [online list of examples][examples] -//! -//! [rustdocs]: https://bytecodealliance.github.io/wasmtime/lang-rust.html -//! [examples]: https://bytecodealliance.github.io/wasmtime/examples-rust-embed.html -//! -//! An example of using WASI looks like: -//! -//! ```no_run -//! # use wasmtime::*; -//! use wasmtime_wasi::sync::WasiCtxBuilder; -//! -//! # fn main() -> wasmtime::Result<()> { -//! // Compile our module and create a `Linker` which has WASI functions defined -//! // within it. -//! let engine = Engine::default(); -//! let module = Module::from_file(&engine, "foo.wasm")?; -//! let mut linker = Linker::new(&engine); -//! wasmtime_wasi::add_to_linker(&mut linker, |cx| cx)?; -//! -//! // Configure and create a `WasiCtx`, which WASI functions need access to -//! // through the host state of the store (which in this case is the host state -//! // of the store) -//! let wasi_ctx = WasiCtxBuilder::new().inherit_stdio().build(); -//! let mut store = Store::new(&engine, wasi_ctx); -//! -//! // Instantiate our module with the imports we've created, and run it. -//! let instance = linker.instantiate(&mut store, &module)?; -//! // ... -//! -//! # Ok(()) -//! # } -//! ``` -//! -//! An example of reading a string from a wasm module: -//! -//! ``` -//! use std::str; -//! -//! # use wasmtime::*; -//! # fn main() -> wasmtime::Result<()> { -//! let mut store = Store::default(); -//! let log_str = Func::wrap(&mut store, |mut caller: Caller<'_, ()>, ptr: i32, len: i32| { -//! // Use our `caller` context to learn about the memory export of the -//! // module which called this host function. -//! let mem = match caller.get_export("memory") { -//! Some(Extern::Memory(mem)) => mem, -//! _ => anyhow::bail!("failed to find host memory"), -//! }; -//! -//! // Use the `ptr` and `len` values to get a subslice of the wasm-memory -//! // which we'll attempt to interpret as utf-8. -//! let data = mem.data(&caller) -//! .get(ptr as u32 as usize..) -//! .and_then(|arr| arr.get(..len as u32 as usize)); -//! let string = match data { -//! Some(data) => match str::from_utf8(data) { -//! Ok(s) => s, -//! Err(_) => anyhow::bail!("invalid utf-8"), -//! }, -//! None => anyhow::bail!("pointer/length out of bounds"), -//! }; -//! assert_eq!(string, "Hello, world!"); -//! println!("{}", string); -//! Ok(()) -//! }); -//! let module = Module::new( -//! store.engine(), -//! r#" -//! (module -//! (import "" "" (func $log_str (param i32 i32))) -//! (func (export "foo") -//! i32.const 4 ;; ptr -//! i32.const 13 ;; len -//! call $log_str) -//! (memory (export "memory") 1) -//! (data (i32.const 4) "Hello, world!")) -//! "#, -//! )?; -//! let instance = Instance::new(&mut store, &module, &[log_str.into()])?; -//! let foo = instance.get_typed_func::<(), ()>(&mut store, "foo")?; -//! foo.call(&mut store, ())?; -//! # Ok(()) -//! # } -//! ``` #![deny(missing_docs)] #![doc(test(attr(deny(warnings))))] #![doc(test(attr(allow(dead_code, unused_variables, unused_mut))))] -#![cfg_attr(nightlydoc, feature(doc_cfg))] +#![cfg_attr(docsrs, feature(doc_cfg))] #![cfg_attr(not(feature = "default"), allow(dead_code, unused_imports))] // Allow broken links when the default features is disabled because most of our // documentation is written for the "one build" of the `main` branch which has @@ -404,115 +262,32 @@ // and will prevent the doc build from failing. #![cfg_attr(feature = "default", deny(rustdoc::broken_intra_doc_links))] -#[macro_use] -mod func; +#[cfg(feature = "runtime")] +mod runtime; +#[cfg(feature = "runtime")] +pub use runtime::*; #[cfg(any(feature = "cranelift", feature = "winch"))] -mod compiler; +mod compile; -mod code; mod config; mod engine; -mod externals; -mod instance; -mod limits; -mod linker; -mod memory; -mod module; -#[cfg(feature = "profiling")] -mod profiling; -mod r#ref; -mod resources; -mod signatures; -mod store; -mod trampoline; -mod trap; -mod types; -mod v128; -mod values; - -#[cfg(feature = "async")] -mod stack; +mod profiling_agent; pub use crate::config::*; pub use crate::engine::*; -pub use crate::externals::*; -pub use crate::func::*; -pub use crate::instance::{Instance, InstancePre}; -pub use crate::limits::*; -pub use crate::linker::*; -pub use crate::memory::*; -pub use crate::module::Module; -#[cfg(feature = "profiling")] -pub use crate::profiling::GuestProfiler; -pub use crate::r#ref::ExternRef; -pub use crate::resources::*; -#[cfg(feature = "async")] -pub use crate::store::CallHookHandler; -pub use crate::store::{ - AsContext, AsContextMut, CallHook, Store, StoreContext, StoreContextMut, UpdateDeadline, -}; -pub use crate::trap::*; -pub use crate::types::*; -pub use crate::v128::V128; -pub use crate::values::*; - -#[cfg(feature = "async")] -pub use crate::stack::*; - -#[cfg(feature = "coredump")] -mod coredump; -#[cfg(feature = "coredump")] -pub use crate::coredump::*; /// A convenience wrapper for `Result`. /// /// This type can be used to interact with `wasmtimes`'s extensive use /// of `anyhow::Error` while still not directly depending on `anyhow`. /// This type alias is identical to `anyhow::Result`. +#[doc(no_inline)] pub use anyhow::{Error, Result}; -#[cfg(feature = "component-model")] -pub mod component; - -cfg_if::cfg_if! { - if #[cfg(unix)] { - pub mod unix; - } else if #[cfg(windows)] { - pub mod windows; - } else { - // ... unknown os! - } -} - -fn _assert_send_sync() { - fn _assert() {} - fn _assert_send(_t: T) {} - _assert::(); - _assert::(); - _assert::<(Func, TypedFunc<(), ()>, Global, Table, Memory)>(); - _assert::(); - _assert::(); - _assert::>(); - _assert::>(); - _assert::>(); - _assert::>(); - _assert::>(); - _assert::>(); - _assert::(); - _assert::>(); - _assert::>(); +fn _assert_send_and_sync() {} - #[cfg(feature = "async")] - fn _call_async(s: &mut Store<()>, f: Func) { - _assert_send(f.call_async(&mut *s, &[], &mut [])) - } - #[cfg(feature = "async")] - fn _typed_call_async(s: &mut Store<()>, f: TypedFunc<(), ()>) { - _assert_send(f.call_async(&mut *s, ())) - } - #[cfg(feature = "async")] - fn _instantiate_async(s: &mut Store<()>, m: &Module) { - _assert_send(Instance::new_async(s, m, &[])) - } +fn _assertions_lib() { + _assert_send_and_sync::(); + _assert_send_and_sync::(); } diff --git a/crates/jit/src/profiling.rs b/crates/wasmtime/src/profiling_agent.rs similarity index 88% rename from crates/jit/src/profiling.rs rename to crates/wasmtime/src/profiling_agent.rs index bb05e55069e4..dece223d3e1a 100644 --- a/crates/jit/src/profiling.rs +++ b/crates/wasmtime/src/profiling_agent.rs @@ -1,7 +1,4 @@ -#![allow(missing_docs)] - -use crate::CodeMemory; -#[allow(unused_imports)] +#[allow(unused)] use anyhow::{bail, Result}; cfg_if::cfg_if! { @@ -10,7 +7,7 @@ cfg_if::cfg_if! { pub use jitdump::new as new_jitdump; } else { pub fn new_jitdump() -> Result> { - if cfg!(feature = "jitdump") { + if cfg!(feature = "profiling") { bail!("jitdump is not supported on this platform"); } else { bail!("jitdump support disabled at compile time"); @@ -38,7 +35,7 @@ cfg_if::cfg_if! { pub use vtune::new as new_vtune; } else { pub fn new_vtune() -> Result> { - if cfg!(feature = "vtune") { + if cfg!(feature = "profiling") { bail!("VTune is not supported on this platform."); } else { bail!("VTune support disabled at compile time."); @@ -51,10 +48,10 @@ cfg_if::cfg_if! { pub trait ProfilingAgent: Send + Sync + 'static { fn register_function(&self, name: &str, addr: *const u8, size: usize); - fn register_module(&self, code: &CodeMemory, custom_name: &dyn Fn(usize) -> Option) { + fn register_module(&self, code: &[u8], custom_name: &dyn Fn(usize) -> Option) { use object::{File, Object as _, ObjectSection, ObjectSymbol, SectionKind, SymbolKind}; - let image = match File::parse(&code.mmap()[..]) { + let image = match File::parse(code) { Ok(image) => image, Err(_) => return, }; @@ -104,5 +101,5 @@ struct NullProfilerAgent; impl ProfilingAgent for NullProfilerAgent { fn register_function(&self, _name: &str, _addr: *const u8, _size: usize) {} - fn register_module(&self, _code: &CodeMemory, _custom_name: &dyn Fn(usize) -> Option) {} + fn register_module(&self, _code: &[u8], _custom_name: &dyn Fn(usize) -> Option) {} } diff --git a/crates/jit/src/profiling/jitdump.rs b/crates/wasmtime/src/profiling_agent/jitdump.rs similarity index 98% rename from crates/jit/src/profiling/jitdump.rs rename to crates/wasmtime/src/profiling_agent/jitdump.rs index f91191761993..ee886066821c 100644 --- a/crates/jit/src/profiling/jitdump.rs +++ b/crates/wasmtime/src/profiling_agent/jitdump.rs @@ -11,7 +11,7 @@ //! sudo perf report -i perf.jit.data -F+period,srcline //! Note: For descriptive results, the WASM file being executed should contain dwarf debug data -use crate::profiling::ProfilingAgent; +use crate::profiling_agent::ProfilingAgent; use anyhow::Result; use std::process; use std::sync::Mutex; diff --git a/crates/jit/src/profiling/perfmap.rs b/crates/wasmtime/src/profiling_agent/perfmap.rs similarity index 97% rename from crates/jit/src/profiling/perfmap.rs rename to crates/wasmtime/src/profiling_agent/perfmap.rs index 3b9e0134de51..25e1c6d2359f 100644 --- a/crates/jit/src/profiling/perfmap.rs +++ b/crates/wasmtime/src/profiling_agent/perfmap.rs @@ -1,4 +1,4 @@ -use crate::profiling::ProfilingAgent; +use crate::profiling_agent::ProfilingAgent; use anyhow::Result; use std::io::{self, BufWriter, Write}; use std::process; diff --git a/crates/jit/src/profiling/vtune.rs b/crates/wasmtime/src/profiling_agent/vtune.rs similarity index 98% rename from crates/jit/src/profiling/vtune.rs rename to crates/wasmtime/src/profiling_agent/vtune.rs index ca8bd1f1c1e2..4c7fd3fbb68d 100644 --- a/crates/jit/src/profiling/vtune.rs +++ b/crates/wasmtime/src/profiling_agent/vtune.rs @@ -12,7 +12,7 @@ //! installed](https://www.intel.com/content/www/us/en/developer/tools/oneapi/vtune-profiler.html#standalone) //! for this to work. -use crate::profiling::ProfilingAgent; +use crate::profiling_agent::ProfilingAgent; use anyhow::Result; use ittapi::jit::MethodLoadBuilder; use std::sync::Mutex; diff --git a/crates/wasmtime/src/runtime.rs b/crates/wasmtime/src/runtime.rs new file mode 100644 index 000000000000..aeab6ca5146e --- /dev/null +++ b/crates/wasmtime/src/runtime.rs @@ -0,0 +1,109 @@ +#![cfg_attr(docsrs, doc(cfg(feature = "runtime")))] + +#[macro_use] +pub(crate) mod func; + +pub(crate) mod code; +pub(crate) mod code_memory; +pub(crate) mod debug; +pub(crate) mod externals; +pub(crate) mod instance; +pub(crate) mod instantiate; +pub(crate) mod limits; +pub(crate) mod linker; +pub(crate) mod memory; +pub(crate) mod module; +pub(crate) mod profiling; +pub(crate) mod r#ref; +pub(crate) mod resources; +pub(crate) mod store; +pub(crate) mod trampoline; +pub(crate) mod trap; +pub(crate) mod type_registry; +pub(crate) mod types; +pub(crate) mod v128; +pub(crate) mod values; + +#[cfg(feature = "component-model")] +pub mod component; + +#[cfg(feature = "async")] +pub(crate) mod stack; + +#[cfg(feature = "coredump")] +mod coredump; + +cfg_if::cfg_if! { + if #[cfg(miri)] { + // no extensions on miri + } else if #[cfg(unix)] { + pub mod unix; + } else if #[cfg(windows)] { + pub mod windows; + } else { + // ... unknown os! + } +} + +pub use code_memory::CodeMemory; +pub use externals::*; +pub use func::*; +pub use instance::{Instance, InstancePre}; +pub use instantiate::CompiledModule; +pub use limits::*; +pub use linker::*; +pub use memory::*; +pub use module::{Module, ModuleExport}; +pub use r#ref::ExternRef; +pub use resources::*; +#[cfg(feature = "async")] +pub use store::CallHookHandler; +pub use store::{ + AsContext, AsContextMut, CallHook, Store, StoreContext, StoreContextMut, UpdateDeadline, +}; +pub use trap::*; +pub use types::*; +pub use v128::V128; +pub use values::*; + +#[cfg(feature = "profiling")] +pub use profiling::GuestProfiler; + +#[cfg(feature = "async")] +pub use stack::*; + +#[cfg(feature = "coredump")] +pub use coredump::*; + +fn _assertions_runtime() { + use crate::_assert_send_and_sync; + + #[cfg(feature = "async")] + fn _assert_send(_t: T) {} + + _assert_send_and_sync::>(); + _assert_send_and_sync::(); + _assert_send_and_sync::<(Func, TypedFunc<(), ()>, Global, Table, Memory)>(); + _assert_send_and_sync::(); + _assert_send_and_sync::>(); + _assert_send_and_sync::>(); + _assert_send_and_sync::>(); + _assert_send_and_sync::>(); + _assert_send_and_sync::(); + _assert_send_and_sync::>(); + _assert_send_and_sync::>(); + _assert_send_and_sync::>(); + + #[cfg(feature = "async")] + fn _call_async(s: &mut Store<()>, f: Func) { + _assert_send(f.call_async(&mut *s, &[], &mut [])) + } + #[cfg(feature = "async")] + fn _typed_call_async(s: &mut Store<()>, f: TypedFunc<(), ()>) { + _assert_send(f.call_async(&mut *s, ())) + } + #[cfg(feature = "async")] + fn _instantiate_async(s: &mut Store<()>, m: &Module) { + _assert_send(Instance::new_async(s, m, &[])) + } +} diff --git a/crates/wasmtime/src/code.rs b/crates/wasmtime/src/runtime/code.rs similarity index 91% rename from crates/wasmtime/src/code.rs rename to crates/wasmtime/src/runtime/code.rs index a0d1037e705d..3aefe725e05a 100644 --- a/crates/wasmtime/src/code.rs +++ b/crates/wasmtime/src/runtime/code.rs @@ -1,9 +1,8 @@ -use crate::signatures::SignatureCollection; +use crate::{code_memory::CodeMemory, type_registry::TypeCollection}; use std::sync::Arc; #[cfg(feature = "component-model")] use wasmtime_environ::component::ComponentTypes; use wasmtime_environ::ModuleTypes; -use wasmtime_jit::CodeMemory; /// Metadata in Wasmtime about a loaded compiled artifact in memory which is /// ready to execute. @@ -27,7 +26,7 @@ pub struct CodeObject { /// Note that this type has a significant destructor which unregisters /// signatures within the `Engine` it was originally tied to, and this ends /// up corresponding to the liftime of a `Component` or `Module`. - signatures: SignatureCollection, + signatures: TypeCollection, /// Type information for the loaded object. /// @@ -37,7 +36,7 @@ pub struct CodeObject { } impl CodeObject { - pub fn new(mmap: Arc, signatures: SignatureCollection, types: Types) -> CodeObject { + pub fn new(mmap: Arc, signatures: TypeCollection, types: Types) -> CodeObject { // The corresopnding unregister for this is below in `Drop for // CodeObject`. crate::module::register_code(&mmap); @@ -62,7 +61,7 @@ impl CodeObject { self.types.module_types() } - pub fn signatures(&self) -> &SignatureCollection { + pub fn signatures(&self) -> &TypeCollection { &self.signatures } } diff --git a/crates/jit/src/code_memory.rs b/crates/wasmtime/src/runtime/code_memory.rs similarity index 95% rename from crates/jit/src/code_memory.rs rename to crates/wasmtime/src/runtime/code_memory.rs index 517b5d1b9768..983a0c5be5bd 100644 --- a/crates/jit/src/code_memory.rs +++ b/crates/wasmtime/src/runtime/code_memory.rs @@ -1,7 +1,5 @@ //! Memory management for executable code. -use crate::subslice_range; -use crate::unwind::UnwindRegistration; use anyhow::{anyhow, bail, Context, Result}; use object::read::{File, Object, ObjectSection}; use object::ObjectSymbol; @@ -9,8 +7,7 @@ use std::mem::ManuallyDrop; use std::ops::Range; use wasmtime_environ::obj; use wasmtime_jit_icache_coherence as icache_coherence; -use wasmtime_runtime::libcalls; -use wasmtime_runtime::MmapVec; +use wasmtime_runtime::{libcalls, MmapVec, UnwindRegistration}; /// Management of executable memory within a `MmapVec` /// @@ -319,3 +316,20 @@ impl CodeMemory { Ok(()) } } + +/// Returns the range of `inner` within `outer`, such that `outer[range]` is the +/// same as `inner`. +/// +/// This method requires that `inner` is a sub-slice of `outer`, and if that +/// isn't true then this method will panic. +fn subslice_range(inner: &[u8], outer: &[u8]) -> Range { + if inner.len() == 0 { + return 0..0; + } + + assert!(outer.as_ptr() <= inner.as_ptr()); + assert!((&inner[inner.len() - 1] as *const _) <= (&outer[outer.len() - 1] as *const _)); + + let start = inner.as_ptr() as usize - outer.as_ptr() as usize; + start..start + inner.len() +} diff --git a/crates/wasmtime/src/component/component.rs b/crates/wasmtime/src/runtime/component/component.rs similarity index 64% rename from crates/wasmtime/src/component/component.rs rename to crates/wasmtime/src/runtime/component/component.rs index a57165ed441d..326dafcd3b83 100644 --- a/crates/wasmtime/src/component/component.rs +++ b/crates/wasmtime/src/runtime/component/component.rs @@ -1,34 +1,64 @@ -use crate::code::CodeObject; -use crate::signatures::SignatureCollection; -use crate::{Engine, Module, ResourcesRequired}; +use crate::{ + code::CodeObject, code_memory::CodeMemory, instantiate::MmapVecWrapper, + type_registry::TypeCollection, Engine, Module, ResourcesRequired, +}; use anyhow::{bail, Context, Result}; -use serde_derive::{Deserialize, Serialize}; use std::fs; use std::mem; use std::path::Path; use std::ptr::NonNull; use std::sync::Arc; use wasmtime_environ::component::{ - AllCallFunc, ComponentTypes, GlobalInitializer, InstantiateModule, StaticModuleIndex, - TrampolineIndex, Translator, VMComponentOffsets, + AllCallFunc, CompiledComponentInfo, ComponentArtifacts, ComponentTypes, GlobalInitializer, + InstantiateModule, StaticModuleIndex, TrampolineIndex, TypeComponentIndex, VMComponentOffsets, }; -use wasmtime_environ::{FunctionLoc, HostPtr, ObjectKind, PrimaryMap, ScopeVec}; -use wasmtime_jit::{CodeMemory, CompiledModuleInfo}; + +use wasmtime_environ::{FunctionLoc, HostPtr, ObjectKind, PrimaryMap}; use wasmtime_runtime::component::ComponentRuntimeInfo; use wasmtime_runtime::{ - MmapVec, VMArrayCallFunction, VMFuncRef, VMFunctionBody, VMNativeCallFunction, - VMWasmCallFunction, + VMArrayCallFunction, VMFuncRef, VMFunctionBody, VMNativeCallFunction, VMWasmCallFunction, }; /// A compiled WebAssembly Component. -// -// FIXME: need to write more docs here. +/// +/// This structure represents a compiled component that is ready to be +/// instantiated. This owns a region of virtual memory which contains executable +/// code compiled from a WebAssembly binary originally. This is the analog of +/// [`Module`](crate::Module) in the component embedding API. +/// +/// A [`Component`] can be turned into an +/// [`Instance`](crate::component::Instance) through a +/// [`Linker`](crate::component::Linker). [`Component`]s are safe to share +/// across threads. The compilation model of a component is the same as that of +/// [a module](crate::Module) which is to say: +/// +/// * Compilation happens synchronously during [`Component::new`]. +/// * The result of compilation can be saved into storage with +/// [`Component::serialize`]. +/// * A previously compiled artifact can be parsed with +/// [`Component::deserialize`]. +/// * No compilation happens at runtime for a component — everything is done +/// by the time [`Component::new`] returns. +/// +/// ## Components and `Clone` +/// +/// Using `clone` on a `Component` is a cheap operation. It will not create an +/// entirely new component, but rather just a new reference to the existing +/// component. In other words it's a shallow copy, not a deep copy. +/// +/// ## Examples +/// +/// For example usage see the documentation of [`Module`](crate::Module) as +/// [`Component`] has the same high-level API. #[derive(Clone)] pub struct Component { inner: Arc, } struct ComponentInner { + /// Component type index + ty: TypeComponentIndex, + /// Core wasm modules that the component defined internally, indexed by the /// compile-time-assigned `ModuleUpvarIndex`. static_modules: PrimaryMap, @@ -44,49 +74,73 @@ struct ComponentInner { info: CompiledComponentInfo, } -#[derive(Serialize, Deserialize)] -struct CompiledComponentInfo { - /// Type information calculated during translation about this component. - component: wasmtime_environ::component::Component, - - /// Where lowered function trampolines are located within the `text` - /// section of `code_memory`. - /// - /// These are the - /// - /// 1. Wasm-call, - /// 2. array-call, and - /// 3. native-call - /// - /// function pointers that end up in a `VMFuncRef` for each - /// lowering. - trampolines: PrimaryMap>, - - /// The location of the wasm-to-native trampoline for the `resource.drop` - /// intrinsic. - resource_drop_wasm_to_native_trampoline: Option, -} - pub(crate) struct AllCallFuncPointers { pub wasm_call: NonNull, pub array_call: VMArrayCallFunction, pub native_call: NonNull, } -#[derive(Serialize, Deserialize)] -pub(crate) struct ComponentArtifacts { - info: CompiledComponentInfo, - types: ComponentTypes, - static_modules: PrimaryMap, -} - impl Component { - /// Compiles a new WebAssembly component from the in-memory wasm image + /// Compiles a new WebAssembly component from the in-memory list of bytes /// provided. - // - // FIXME: need to write more docs here. + /// + /// The `bytes` provided can either be the binary or text format of a + /// [WebAssembly component]. Note that the text format requires the `wat` + /// feature of this crate to be enabled. This API does not support + /// streaming compilation. + /// + /// This function will synchronously validate the entire component, + /// including all core modules, and then compile all components, modules, + /// etc., found within the provided bytes. + /// + /// [WebAssembly component]: https://github.com/WebAssembly/component-model/blob/main/design/mvp/Binary.md + /// + /// # Errors + /// + /// This function may fail and return an error. Errors may include + /// situations such as: + /// + /// * The binary provided could not be decoded because it's not a valid + /// WebAssembly binary + /// * The WebAssembly binary may not validate (e.g. contains type errors) + /// * Implementation-specific limits were exceeded with a valid binary (for + /// example too many locals) + /// * The wasm binary may use features that are not enabled in the + /// configuration of `engine` + /// * If the `wat` feature is enabled and the input is text, then it may be + /// rejected if it fails to parse. + /// + /// The error returned should contain full information about why compilation + /// failed. + /// + /// # Examples + /// + /// The `new` function can be invoked with a in-memory array of bytes: + /// + /// ```no_run + /// # use wasmtime::*; + /// # use wasmtime::component::Component; + /// # fn main() -> anyhow::Result<()> { + /// # let engine = Engine::default(); + /// # let wasm_bytes: Vec = Vec::new(); + /// let component = Component::new(&engine, &wasm_bytes)?; + /// # Ok(()) + /// # } + /// ``` + /// + /// Or you can also pass in a string to be parsed as the wasm text + /// format: + /// + /// ``` + /// # use wasmtime::*; + /// # use wasmtime::component::Component; + /// # fn main() -> anyhow::Result<()> { + /// # let engine = Engine::default(); + /// let component = Component::new(&engine, "(component (core module))")?; + /// # Ok(()) + /// # } #[cfg(any(feature = "cranelift", feature = "winch"))] - #[cfg_attr(nightlydoc, doc(cfg(any(feature = "cranelift", feature = "winch"))))] + #[cfg_attr(docsrs, doc(cfg(any(feature = "cranelift", feature = "winch"))))] pub fn new(engine: &Engine, bytes: impl AsRef<[u8]>) -> Result { let bytes = bytes.as_ref(); #[cfg(feature = "wat")] @@ -94,12 +148,13 @@ impl Component { Component::from_binary(engine, &bytes) } - /// Compiles a new WebAssembly component from a wasm file on disk pointed to - /// by `file`. - // - // FIXME: need to write more docs here. + /// Compiles a new WebAssembly component from a wasm file on disk pointed + /// to by `file`. + /// + /// This is a convenience function for reading the contents of `file` on + /// disk and then calling [`Component::new`]. #[cfg(any(feature = "cranelift", feature = "winch"))] - #[cfg_attr(nightlydoc, doc(cfg(any(feature = "cranelift", feature = "winch"))))] + #[cfg_attr(docsrs, doc(cfg(any(feature = "cranelift", feature = "winch"))))] pub fn from_file(engine: &Engine, file: impl AsRef) -> Result { match Self::new( engine, @@ -122,29 +177,81 @@ impl Component { /// Compiles a new WebAssembly component from the in-memory wasm image /// provided. - // - // FIXME: need to write more docs here. + /// + /// This function is the same as [`Component::new`] except that it does not + /// accept the text format of WebAssembly. Even if the `wat` feature + /// is enabled an error will be returned here if `binary` is the text + /// format. + /// + /// For more information on semantics and errors see [`Component::new`]. #[cfg(any(feature = "cranelift", feature = "winch"))] - #[cfg_attr(nightlydoc, doc(cfg(any(feature = "cranelift", feature = "winch"))))] + #[cfg_attr(docsrs, doc(cfg(any(feature = "cranelift", feature = "winch"))))] pub fn from_binary(engine: &Engine, binary: &[u8]) -> Result { + use crate::compile::build_component_artifacts; + use crate::module::HashedEngineCompileEnv; + use wasmtime_runtime::MmapVec; + engine .check_compatible_with_native_host() .context("compilation settings are not compatible with the native host")?; - let (mmap, artifacts) = Component::build_artifacts(engine, binary)?; - let mut code_memory = CodeMemory::new(mmap)?; - code_memory.publish()?; - Component::from_parts(engine, Arc::new(code_memory), Some(artifacts)) + cfg_if::cfg_if! { + if #[cfg(feature = "cache")] { + let state = (HashedEngineCompileEnv(engine), binary); + let (code, artifacts) = wasmtime_cache::ModuleCacheEntry::new( + "wasmtime", + engine.cache_config(), + ) + .get_data_raw( + &state, + + // Cache miss, compute the actual artifacts + |(engine, wasm)| -> Result<_> { + let (mmap, artifacts) = build_component_artifacts::(engine.0, wasm)?; + let code = publish_mmap(mmap.0)?; + Ok((code, Some(artifacts))) + }, + + // Implementation of how to serialize artifacts + |(_engine, _wasm), (code, _info_and_types)| { + Some(code.mmap().to_vec()) + }, + + // Cache hit, deserialize the provided artifacts + |(engine, _wasm), serialized_bytes| { + let code = engine.0.load_code_bytes(&serialized_bytes, ObjectKind::Component).ok()?; + Some((code, None)) + }, + )?; + } else { + let (mmap, artifacts) = build_component_artifacts::(engine, binary)?; + let artifacts = Some(artifacts); + let code = publish_mmap(mmap.0)?; + } + }; + + return Component::from_parts(engine, code, artifacts); + + fn publish_mmap(mmap: MmapVec) -> Result> { + let mut code = CodeMemory::new(mmap)?; + code.publish()?; + Ok(Arc::new(code)) + } } /// Same as [`Module::deserialize`], but for components. /// - /// Note that the file referenced here must contain contents previously + /// Note that the bytes referenced here must contain contents previously /// produced by [`Engine::precompile_component`] or /// [`Component::serialize`]. /// /// For more information see the [`Module::deserialize`] method. /// + /// # Unsafety + /// + /// The unsafety of this method is the same as that of the + /// [`Module::deserialize`] method. + /// /// [`Module::deserialize`]: crate::Module::deserialize pub unsafe fn deserialize(engine: &Engine, bytes: impl AsRef<[u8]>) -> Result { let code = engine.load_code_bytes(bytes.as_ref(), ObjectKind::Component)?; @@ -153,8 +260,16 @@ impl Component { /// Same as [`Module::deserialize_file`], but for components. /// - /// For more information see the [`Component::deserialize`] and - /// [`Module::deserialize_file`] methods. + /// Note that the file referenced here must contain contents previously + /// produced by [`Engine::precompile_component`] or + /// [`Component::serialize`]. + /// + /// For more information see the [`Module::deserialize_file`] method. + /// + /// # Unsafety + /// + /// The unsafety of this method is the same as that of the + /// [`Module::deserialize_file`] method. /// /// [`Module::deserialize_file`]: crate::Module::deserialize_file pub unsafe fn deserialize_file(engine: &Engine, path: impl AsRef) -> Result { @@ -162,72 +277,6 @@ impl Component { Component::from_parts(engine, code, None) } - /// Performs the compilation phase for a component, translating and - /// validating the provided wasm binary to machine code. - /// - /// This method will compile all nested core wasm binaries in addition to - /// any necessary extra functions required for operation with components. - /// The output artifact here is the serialized object file contained within - /// an owned mmap along with metadata about the compilation itself. - #[cfg(any(feature = "cranelift", feature = "winch"))] - pub(crate) fn build_artifacts( - engine: &Engine, - binary: &[u8], - ) -> Result<(MmapVec, ComponentArtifacts)> { - use crate::compiler::CompileInputs; - - let tunables = &engine.config().tunables; - let compiler = engine.compiler(); - - let scope = ScopeVec::new(); - let mut validator = - wasmparser::Validator::new_with_features(engine.config().features.clone()); - let mut types = Default::default(); - let (component, mut module_translations) = - Translator::new(tunables, &mut validator, &mut types, &scope) - .translate(binary) - .context("failed to parse WebAssembly module")?; - let types = types.finish(); - - let compile_inputs = CompileInputs::for_component( - &types, - &component, - module_translations.iter_mut().map(|(i, translation)| { - let functions = mem::take(&mut translation.function_body_inputs); - (i, &*translation, functions) - }), - ); - let unlinked_compile_outputs = compile_inputs.compile(&engine)?; - let (compiled_funcs, function_indices) = unlinked_compile_outputs.pre_link(); - - let mut object = compiler.object(ObjectKind::Component)?; - engine.append_compiler_info(&mut object); - engine.append_bti(&mut object); - - let (mut object, compilation_artifacts) = function_indices.link_and_append_code( - object, - engine, - compiled_funcs, - module_translations, - )?; - - let info = CompiledComponentInfo { - component: component.component, - trampolines: compilation_artifacts.trampolines, - resource_drop_wasm_to_native_trampoline: compilation_artifacts - .resource_drop_wasm_to_native_trampoline, - }; - let artifacts = ComponentArtifacts { - info, - types, - static_modules: compilation_artifacts.modules, - }; - object.serialize_info(&artifacts); - - let mmap = object.finish()?; - Ok((mmap, artifacts)) - } - /// Final assembly step for a component from its in-memory representation. /// /// If the `artifacts` are specified as `None` here then they will be @@ -238,6 +287,7 @@ impl Component { artifacts: Option, ) -> Result { let ComponentArtifacts { + ty, info, types, static_modules, @@ -257,8 +307,7 @@ impl Component { // Create a signature registration with the `Engine` for all trampolines // and core wasm types found within this component, both for the // component and for all included core wasm modules. - let signatures = - SignatureCollection::new_for_module(engine.signatures(), types.module_types()); + let signatures = TypeCollection::new_for_module(engine, types.module_types()); // Assemble the `CodeObject` artifact which is shared by all core wasm // modules as well as the final component. @@ -275,6 +324,7 @@ impl Component { Ok(Component { inner: Arc::new(ComponentInner { + ty, static_modules, code, info, @@ -282,6 +332,10 @@ impl Component { }) } + pub(crate) fn ty(&self) -> TypeComponentIndex { + self.inner.ty + } + pub(crate) fn env_component(&self) -> &wasmtime_environ::component::Component { &self.inner.info.component } @@ -295,7 +349,7 @@ impl Component { self.inner.component_types() } - pub(crate) fn signatures(&self) -> &SignatureCollection { + pub(crate) fn signatures(&self) -> &TypeCollection { self.inner.code.signatures() } diff --git a/crates/wasmtime/src/component/func.rs b/crates/wasmtime/src/runtime/component/func.rs similarity index 90% rename from crates/wasmtime/src/component/func.rs rename to crates/wasmtime/src/runtime/component/func.rs index 0b69aff34d8c..2458a132cceb 100644 --- a/crates/wasmtime/src/component/func.rs +++ b/crates/wasmtime/src/runtime/component/func.rs @@ -85,9 +85,13 @@ union ParamsAndResults { ret: Return, } -/// A WebAssembly component function. -// -// FIXME: write more docs here +/// A WebAssembly component function which can be called. +/// +/// This type is the dual of [`wasmtime::Func`](crate::Func) for component +/// functions. An instance of [`Func`] represents a component function from a +/// component [`Instance`](crate::component::Instance). Like with +/// [`wasmtime::Func`](crate::Func) it's possible to call functions either +/// synchronously or asynchronously and either typed or untyped. #[derive(Copy, Clone, Debug)] pub struct Func(Stored); @@ -150,8 +154,8 @@ impl Func { /// The `Params` type parameter here is a tuple of the parameters to the /// function. A function which takes no arguments should use `()`, a /// function with one argument should use `(T,)`, etc. Note that all - /// `Params` must also implement the [`Lower`] trait since they're going tin - /// to wasm. + /// `Params` must also implement the [`Lower`] trait since they're going + /// into wasm. /// /// The `Return` type parameter is the return value of this function. A /// return value of `()` means that there's no return (similar to a Rust @@ -164,6 +168,9 @@ impl Func { /// primitives, floats, `Option`, `Result`, strings, `Vec`, and /// more. As parameters you'll be passing native Rust types. /// + /// See the documentation for [`ComponentType`] for more information about + /// supported types. + /// /// # Errors /// /// If the function does not actually take `Params` as its parameters or @@ -284,15 +291,39 @@ impl Func { /// Invokes this function with the `params` given and returns the result. /// - /// The `params` here must match the type signature of this `Func`, or this will return an error. If a trap - /// occurs while executing this function, then an error will also be returned. - // TODO: say more -- most of the docs for `TypedFunc::call` apply here, too - // - // # Panics - // - // Panics if this is called on a function in an asyncronous store. This only works - // with functions defined within a synchronous store. Also panics if `store` - // does not own this function. + /// The `params` provided must match the parameters that this function takes + /// in terms of their types and the number of parameters. Results will be + /// written to the `results` slice provided if the call completes + /// successfully. The initial types of the values in `results` are ignored + /// and values are overwritten to write the result. It's required that the + /// size of `results` exactly matches the number of results that this + /// function produces. + /// + /// Note that after a function is invoked the embedder needs to invoke + /// [`Func::post_return`] to execute any final cleanup required by the + /// guest. This function call is required to either call the function again + /// or to call another function. + /// + /// For more detailed information see the documentation of + /// [`TypedFunc::call`]. + /// + /// # Errors + /// + /// Returns an error in situations including but not limited to: + /// + /// * `params` is not the right size or if the values have the wrong type + /// * `results` is not the right size + /// * A trap occurs while executing the function + /// * The function calls a host function which returns an error + /// + /// See [`TypedFunc::call`] for more information in addition to + /// [`wasmtime::Func::call`](crate::Func::call). + /// + /// # Panics + /// + /// Panics if this is called on a function in an asyncronous store. This + /// only works with functions defined within a synchronous store. Also + /// panics if `store` does not own this function. pub fn call( &self, mut store: impl AsContextMut, @@ -309,13 +340,16 @@ impl Func { /// Exactly like [`Self::call`] except for use on async stores. /// + /// Note that after this [`Func::post_return_async`] will be used instead of + /// the synchronous version at [`Func::post_return`]. + /// /// # Panics /// - /// Panics if this is called on a function in a synchronous store. This only works - /// with functions defined within an asynchronous store. Also panics if `store` - /// does not own this function. + /// Panics if this is called on a function in a synchronous store. This + /// only works with functions defined within an asynchronous store. Also + /// panics if `store` does not own this function. #[cfg(feature = "async")] - #[cfg_attr(nightlydoc, doc(cfg(feature = "async")))] + #[cfg_attr(docsrs, doc(cfg(feature = "async")))] pub async fn call_async( &self, mut store: impl AsContextMut, @@ -362,7 +396,8 @@ impl Func { } for (param, ty) in params.iter().zip(param_tys.iter()) { - ty.check(param).context("type mismatch with parameters")?; + ty.is_supertype_of(param) + .context("type mismatch with parameters")?; } self.call_raw( @@ -538,11 +573,9 @@ impl Func { /// Invokes the `post-return` canonical ABI option, if specified, after a /// [`Func::call`] has finished. /// - /// For some more information on when to use this function see the - /// documentation for post-return in the [`Func::call`] method. - /// Otherwise though this function is a required method call after a - /// [`Func::call`] completes successfully. After the embedder has - /// finished processing the return value then this function must be invoked. + /// This function is a required method call after a [`Func::call`] completes + /// successfully. After the embedder has finished processing the return + /// value then this function must be invoked. /// /// # Errors /// @@ -581,7 +614,7 @@ impl Func { /// Panics if this is called on a function in a synchronous store. This /// only works with functions defined within an asynchronous store. #[cfg(feature = "async")] - #[cfg_attr(nightlydoc, doc(cfg(feature = "async")))] + #[cfg_attr(docsrs, doc(cfg(feature = "async")))] pub async fn post_return_async( &self, mut store: impl AsContextMut, @@ -597,7 +630,6 @@ impl Func { store.on_fiber(|store| self.post_return_impl(store)).await? } - #[inline] fn post_return_impl(&self, mut store: impl AsContextMut) -> Result<()> { let mut store = store.as_context_mut(); let data = &mut store.0[self.0]; @@ -660,7 +692,7 @@ impl Func { // of the component. flags.set_may_enter(true); - let (calls, host_table) = store.0.component_calls_and_host_table(); + let (calls, host_table, _) = store.0.component_resource_state(); ResourceTables { calls, host_table: Some(host_table), diff --git a/crates/wasmtime/src/component/func/host.rs b/crates/wasmtime/src/runtime/component/func/host.rs similarity index 99% rename from crates/wasmtime/src/component/func/host.rs rename to crates/wasmtime/src/runtime/component/func/host.rs index a048275b9090..c00f38c833bd 100644 --- a/crates/wasmtime/src/component/func/host.rs +++ b/crates/wasmtime/src/runtime/component/func/host.rs @@ -385,7 +385,7 @@ where let mut cx = LowerContext::new(store, &options, types, instance); let instance = cx.instance_type(); for (val, ty) in result_vals.iter().zip(result_tys.types.iter()) { - Type::from(ty, &instance).check(val)?; + Type::from(ty, &instance).is_supertype_of(val)?; } if let Some(cnt) = result_tys.abi.flat_count(MAX_FLAT_RESULTS) { let mut dst = storage[..cnt].iter_mut(); diff --git a/crates/wasmtime/src/component/func/options.rs b/crates/wasmtime/src/runtime/component/func/options.rs similarity index 86% rename from crates/wasmtime/src/component/func/options.rs rename to crates/wasmtime/src/runtime/component/func/options.rs index 6cb038f4f692..dc5c574a7eda 100644 --- a/crates/wasmtime/src/component/func/options.rs +++ b/crates/wasmtime/src/runtime/component/func/options.rs @@ -1,4 +1,5 @@ use crate::component::matching::InstanceType; +use crate::component::resources::{HostResourceData, HostResourceIndex, HostResourceTables}; use crate::component::ResourceType; use crate::store::{StoreId, StoreOpaque}; use crate::StoreContextMut; @@ -278,7 +279,7 @@ impl<'a, T> LowerContext<'a, T> { /// /// The `ty` provided is which table to put this into. pub fn guest_resource_lower_own(&mut self, ty: TypeResourceTableIndex, rep: u32) -> u32 { - self.resource_tables().resource_lower_own(Some(ty), rep) + self.resource_tables().guest_resource_lower_own(rep, ty) } /// Lowers a `borrow` resource into the guest, converting the `rep` to a @@ -298,19 +299,19 @@ impl<'a, T> LowerContext<'a, T> { if unsafe { (*self.instance).resource_owned_by_own_instance(ty) } { return rep; } - self.resource_tables().resource_lower_borrow(Some(ty), rep) + self.resource_tables().guest_resource_lower_borrow(rep, ty) } /// Lifts a host-owned `own` resource at the `idx` specified into the /// representation of that resource. - pub fn host_resource_lift_own(&mut self, idx: u32) -> Result { - self.resource_tables().resource_lift_own(None, idx) + pub fn host_resource_lift_own(&mut self, idx: HostResourceIndex) -> Result { + self.resource_tables().host_resource_lift_own(idx) } /// Lifts a host-owned `borrow` resource at the `idx` specified into the /// representation of that resource. - pub fn host_resource_lift_borrow(&mut self, idx: u32) -> Result { - self.resource_tables().resource_lift_borrow(None, idx) + pub fn host_resource_lift_borrow(&mut self, idx: HostResourceIndex) -> Result { + self.resource_tables().host_resource_lift_borrow(idx) } /// Lowers a resource into the host-owned table, returning the index it was @@ -318,8 +319,8 @@ impl<'a, T> LowerContext<'a, T> { /// /// Note that this is a special case for `Resource`. Most of the time a /// host value shouldn't be lowered with a lowering context. - pub fn host_resource_lower_own(&mut self, rep: u32) -> u32 { - self.resource_tables().resource_lower_own(None, rep) + pub fn host_resource_lower_own(&mut self, rep: u32) -> HostResourceIndex { + self.resource_tables().host_resource_lower_own(rep) } /// Returns the underlying resource type for the `ty` table specified. @@ -335,26 +336,27 @@ impl<'a, T> LowerContext<'a, T> { InstanceType::new(unsafe { &*self.instance }) } - fn resource_tables(&mut self) -> ResourceTables<'_> { - let (calls, host_table) = self.store.0.component_calls_and_host_table(); - ResourceTables { - host_table: Some(host_table), - calls, - // Note that the unsafety here should be valid given the contract of - // `LowerContext::new`. - tables: Some(unsafe { (*self.instance).component_resource_tables() }), - } + fn resource_tables(&mut self) -> HostResourceTables<'_> { + let (calls, host_table, host_resource_data) = self.store.0.component_resource_state(); + HostResourceTables::from_parts( + ResourceTables { + host_table: Some(host_table), + calls, + // Note that the unsafety here should be valid given the contract of + // `LowerContext::new`. + tables: Some(unsafe { (*self.instance).component_resource_tables() }), + }, + host_resource_data, + ) } - /// Begins a call into the component instance, starting recording of - /// metadata related to resource borrowing. + /// See [`HostResourceTables::enter_call`]. #[inline] pub fn enter_call(&mut self) { self.resource_tables().enter_call() } - /// Completes a call into the component instance, validating that it's ok to - /// complete by ensuring the are no remaining active borrows. + /// See [`HostResourceTables::exit_call`]. #[inline] pub fn exit_call(&mut self) -> Result<()> { self.resource_tables().exit_call() @@ -379,6 +381,7 @@ pub struct LiftContext<'a> { instance: *mut ComponentInstance, host_table: &'a mut ResourceTable, + host_resource_data: &'a mut HostResourceData, calls: &'a mut CallContexts, } @@ -404,8 +407,8 @@ impl<'a> LiftContext<'a> { // so it's hacked around a bit. This unsafe pointer cast could be fixed // with more methods in more places, but it doesn't seem worth doing it // at this time. - let (calls, host_table) = - (&mut *(store as *mut StoreOpaque)).component_calls_and_host_table(); + let (calls, host_table, host_resource_data) = + (&mut *(store as *mut StoreOpaque)).component_resource_state(); let memory = options.memory.map(|_| options.memory(store)); LiftContext { @@ -415,6 +418,7 @@ impl<'a> LiftContext<'a> { instance, calls, host_table, + host_resource_data, } } @@ -450,7 +454,7 @@ impl<'a> LiftContext<'a> { ty: TypeResourceTableIndex, idx: u32, ) -> Result<(u32, Option>, Option)> { - let idx = self.resource_tables().resource_lift_own(Some(ty), idx)?; + let idx = self.resource_tables().guest_resource_lift_own(idx, ty)?; // Note that the unsafety here should be valid given the contract of // `LiftContext::new`. let (dtor, flags) = unsafe { (*self.instance).dtor_and_flags(ty) }; @@ -463,19 +467,19 @@ impl<'a> LiftContext<'a> { ty: TypeResourceTableIndex, idx: u32, ) -> Result { - self.resource_tables().resource_lift_borrow(Some(ty), idx) + self.resource_tables().guest_resource_lift_borrow(idx, ty) } /// Lowers a resource into the host-owned table, returning the index it was /// inserted at. - pub fn host_resource_lower_own(&mut self, rep: u32) -> u32 { - self.resource_tables().resource_lower_own(None, rep) + pub fn host_resource_lower_own(&mut self, rep: u32) -> HostResourceIndex { + self.resource_tables().host_resource_lower_own(rep) } /// Lowers a resource into the host-owned table, returning the index it was /// inserted at. - pub fn host_resource_lower_borrow(&mut self, rep: u32) -> u32 { - self.resource_tables().resource_lower_borrow(None, rep) + pub fn host_resource_lower_borrow(&mut self, rep: u32) -> HostResourceIndex { + self.resource_tables().host_resource_lower_borrow(rep) } /// Returns the underlying type of the resource table specified by `ty`. @@ -491,23 +495,26 @@ impl<'a> LiftContext<'a> { InstanceType::new(unsafe { &*self.instance }) } - fn resource_tables(&mut self) -> ResourceTables<'_> { - ResourceTables { - host_table: Some(self.host_table), - calls: self.calls, - // Note that the unsafety here should be valid given the contract of - // `LiftContext::new`. - tables: Some(unsafe { (*self.instance).component_resource_tables() }), - } + fn resource_tables(&mut self) -> HostResourceTables<'_> { + HostResourceTables::from_parts( + ResourceTables { + host_table: Some(self.host_table), + calls: self.calls, + // Note that the unsafety here should be valid given the contract of + // `LiftContext::new`. + tables: Some(unsafe { (*self.instance).component_resource_tables() }), + }, + self.host_resource_data, + ) } - /// Same as `LowerContext::enter_call` + /// See [`HostResourceTables::enter_call`]. #[inline] pub fn enter_call(&mut self) { self.resource_tables().enter_call() } - /// Same as `LiftContext::enter_call` + /// See [`HostResourceTables::exit_call`]. #[inline] pub fn exit_call(&mut self) -> Result<()> { self.resource_tables().exit_call() diff --git a/crates/wasmtime/src/component/func/typed.rs b/crates/wasmtime/src/runtime/component/func/typed.rs similarity index 94% rename from crates/wasmtime/src/component/func/typed.rs rename to crates/wasmtime/src/runtime/component/func/typed.rs index 1b43cec321d7..60bbcaeb4e79 100644 --- a/crates/wasmtime/src/component/func/typed.rs +++ b/crates/wasmtime/src/runtime/component/func/typed.rs @@ -29,6 +29,8 @@ use wasmtime_runtime::SendSyncPtr; /// and usage will panic if used with the wrong store. /// /// This type is primarily created with the [`Func::typed`] API. +/// +/// See [`ComponentType`] for more information about supported types. pub struct TypedFunc { func: Func, @@ -168,7 +170,7 @@ where /// only works with functions defined within an asynchronous store. Also /// panics if `store` does not own this function. #[cfg(feature = "async")] - #[cfg_attr(nightlydoc, doc(cfg(feature = "async")))] + #[cfg_attr(docsrs, doc(cfg(feature = "async")))] pub async fn call_async( &self, mut store: impl AsContextMut, @@ -334,7 +336,7 @@ where /// See [`Func::post_return_async`] #[cfg(feature = "async")] - #[cfg_attr(nightlydoc, doc(cfg(feature = "async")))] + #[cfg_attr(docsrs, doc(cfg(feature = "async")))] pub async fn post_return_async( &self, store: impl AsContextMut, @@ -365,11 +367,47 @@ pub unsafe trait ComponentNamedList: ComponentType {} /// with the canonical ABI. /// /// This trait is implemented for Rust types which can be communicated to -/// components. This is implemented for Rust types which correspond to -/// interface types in the component model of WebAssembly. The [`Func::typed`] -/// and [`TypedFunc`] Rust items are the main consumers of this trait. +/// components. The [`Func::typed`] and [`TypedFunc`] Rust items are the main +/// consumers of this trait. +/// +/// Supported Rust types include: +/// +/// | Component Model Type | Rust Type | +/// |-----------------------------------|--------------------------------------| +/// | `{s,u}{8,16,32,64}` | `{i,u}{8,16,32,64}` | +/// | `f{32,64}` | `f{32,64}` | +/// | `bool` | `bool` | +/// | `char` | `char` | +/// | `tuple` | `(A, B)` | +/// | `option` | `Option` | +/// | `result` | `Result<(), ()>` | +/// | `result` | `Result` | +/// | `result<_, E>` | `Result<(), E>` | +/// | `result` | `Result` | +/// | `string` | `String`, `&str`, or [`WasmStr`] | +/// | `list` | `Vec`, `&[T]`, or [`WasmList`] | +/// | `own`, `borrow` | [`Resource`] or [`ResourceAny`] | +/// | `record` | [`#[derive(ComponentType)]`][d-cm] | +/// | `variant` | [`#[derive(ComponentType)]`][d-cm] | +/// | `enum` | [`#[derive(ComponentType)]`][d-cm] | +/// | `flags` | [`flags!`][f-m] | /// -/// For more information on this trait see the examples in [`Func::typed`]. +/// [`Resource`]: crate::component::Resource +/// [`ResourceAny`]: crate::component::ResourceAny +/// [d-cm]: macro@crate::component::ComponentType +/// [f-m]: crate::component::flags +/// +/// Rust standard library pointers such as `&T`, `Box`, `Rc`, and `Arc` +/// additionally represent whatever type `T` represents in the component model. +/// Note that types such as `record`, `variant`, `enum`, and `flags` are +/// generated by the embedder at compile time. These macros derive +/// implementation of this trait for custom types to map to custom types in the +/// component model. Note that for `record`, `variant`, `enum`, and `flags` +/// those types are often generated by the +/// [`bindgen!`](crate::component::bindgen) macro from WIT definitions. +/// +/// Types that implement [`ComponentType`] are used for `Params` and `Return` +/// in [`TypedFunc`] and [`Func::typed`]. /// /// The contents of this trait are hidden as it's intended to be an /// implementation detail of Wasmtime. The contents of this trait are not @@ -454,9 +492,18 @@ pub unsafe trait ComponentVariant: ComponentType { /// either as parameters of component exports or returns of component imports. /// This trait represents the ability to convert from the native host /// representation to the canonical ABI. -// -// TODO: #[derive(Lower)] -// TODO: more docs here +/// +/// Built-in types to Rust such as `Option` implement this trait as +/// appropriate. For a mapping of component model to Rust types see +/// [`ComponentType`]. +/// +/// For user-defined types, for example `record` types mapped to Rust `struct`s, +/// this crate additionally has +/// [`#[derive(Lower)]`](macro@crate::component::Lower). +/// +/// Note that like [`ComponentType`] the definition of this trait is intended to +/// be an internal implementation detail of Wasmtime at this time. It's +/// recommended to use the `#[derive(Lower)]` implementation instead. pub unsafe trait Lower: ComponentType { /// Performs the "lower" function in the canonical ABI. /// @@ -535,9 +582,21 @@ pub unsafe trait Lower: ComponentType { } /// Host types which can be created from the canonical ABI. -// -// TODO: #[derive(Lower)] -// TODO: more docs here +/// +/// This is the mirror of the [`Lower`] trait where it represents the capability +/// of acquiring items from WebAssembly and passing them to the host. +/// +/// Built-in types to Rust such as `Option` implement this trait as +/// appropriate. For a mapping of component model to Rust types see +/// [`ComponentType`]. +/// +/// For user-defined types, for example `record` types mapped to Rust `struct`s, +/// this crate additionally has +/// [`#[derive(Lift)]`](macro@crate::component::Lift). +/// +/// Note that like [`ComponentType`] the definition of this trait is intended to +/// be an internal implementation detail of Wasmtime at this time. It's +/// recommended to use the `#[derive(Lift)]` implementation instead. pub unsafe trait Lift: Sized + ComponentType { /// Performs the "lift" operation in the canonical ABI. /// @@ -715,6 +774,7 @@ macro_rules! integers { unsafe impl Lower for $primitive { #[inline] + #[allow(trivial_numeric_casts)] fn lower( &self, _cx: &mut LowerContext<'_, T>, @@ -779,6 +839,7 @@ macro_rules! integers { unsafe impl Lift for $primitive { #[inline] + #[allow(trivial_numeric_casts)] fn lift(_cx: &mut LiftContext<'_>, ty: InterfaceType, src: &Self::Lower) -> Result { debug_assert!(matches!(ty, InterfaceType::$ty)); Ok(src.$get() as $primitive) @@ -1176,6 +1237,23 @@ fn lower_string(cx: &mut LowerContext<'_, T>, string: &str) -> Result<(usize, /// Representation of a string located in linear memory in a WebAssembly /// instance. /// +/// This type can be used in place of `String` and `str` for string-taking APIs +/// in some situations. The purpose of this type is to represent a range of +/// validated bytes within a component but does not actually copy the bytes. The +/// primary method, [`WasmStr::to_str`], attempts to return a reference to the +/// string directly located in the component's memory, avoiding a copy into the +/// host if possible. +/// +/// The downside of this type, however, is that accessing a string requires a +/// [`Store`](crate::Store) pointer (via [`StoreContext`]). Bindings generated +/// by [`bindgen!`](crate::component::bindgen), for example, do not have access +/// to [`StoreContext`] and thus can't use this type. +/// +/// This is intended for more advanced use cases such as defining functions +/// directly in a [`Linker`](crate::component::Linker). It's expected that in +/// the future [`bindgen!`](crate::component::bindgen) will also have a way to +/// use this type. +/// /// This type is used with [`TypedFunc`], for example, when WebAssembly returns /// a string. This type cannot be used to give a string to WebAssembly, instead /// `&str` should be used for that (since it's coming from the host). @@ -1183,8 +1261,9 @@ fn lower_string(cx: &mut LowerContext<'_, T>, string: &str) -> Result<(usize, /// Note that this type represents an in-bounds string in linear memory, but it /// does not represent a valid string (e.g. valid utf-8). Validation happens /// when [`WasmStr::to_str`] is called. -// -// TODO: should probably expand this with examples +/// +/// Also note that this type does not implement [`Lower`], it only implements +/// [`Lift`]. pub struct WasmStr { ptr: usize, len: usize, @@ -1412,6 +1491,11 @@ where /// Representation of a list of values that are owned by a WebAssembly instance. /// +/// For some more commentary about the rationale for this type see the +/// documentation of [`WasmStr`]. In summary this type can avoid a copy when +/// passing data to the host in some situations but is additionally more +/// cumbersome to use by requiring a [`Store`](crate::Store) to be provided. +/// /// This type is used whenever a `(list T)` is returned from a [`TypedFunc`], /// for example. This type represents a list of values that are stored in linear /// memory which are waiting to be read. @@ -1419,6 +1503,8 @@ where /// Note that this type represents only a valid range of bytes for the list /// itself, it does not represent validity of the elements themselves and that's /// performed when they're iterated. +/// +/// Note that this type does not implement the [`Lower`] trait, only [`Lift`]. pub struct WasmList { ptr: usize, len: usize, diff --git a/crates/wasmtime/src/component/instance.rs b/crates/wasmtime/src/runtime/component/instance.rs similarity index 93% rename from crates/wasmtime/src/component/instance.rs rename to crates/wasmtime/src/runtime/component/instance.rs index b81afef82272..1284c155624b 100644 --- a/crates/wasmtime/src/component/instance.rs +++ b/crates/wasmtime/src/runtime/component/instance.rs @@ -1,6 +1,8 @@ use crate::component::func::HostFunc; use crate::component::matching::InstanceType; -use crate::component::{Component, ComponentNamedList, Func, Lift, Lower, ResourceType, TypedFunc}; +use crate::component::{ + Component, ComponentNamedList, Func, Lift, Lower, ResourceImportIndex, ResourceType, TypedFunc, +}; use crate::instance::OwnedImports; use crate::linker::DefinitionType; use crate::store::{StoreOpaque, Stored}; @@ -11,17 +13,24 @@ use std::marker; use std::ptr::NonNull; use std::sync::Arc; use wasmtime_environ::component::*; -use wasmtime_environ::{EntityIndex, EntityType, Global, PrimaryMap, WasmType}; +use wasmtime_environ::{EntityIndex, EntityType, Global, PrimaryMap, WasmValType}; use wasmtime_runtime::component::{ComponentInstance, OwnedComponentInstance}; use wasmtime_runtime::VMFuncRef; /// An instantiated component. /// -/// This is similar to [`crate::Instance`] except that it represents an -/// instantiated component instead of an instantiated module. Otherwise though -/// the two behave similarly. -// -// FIXME: need to write more docs here. +/// This type represents an instantiated [`Component`](super::Component). +/// Instances have exports which can be accessed through functions such as +/// [`Instance::get_func`] or [`Instance::exports`]. Instances are owned by a +/// [`Store`](crate::Store) and all methods require a handle to the store. +/// +/// Component instances are created through +/// [`Linker::instantiate`](super::Linker::instantiate) and its family of +/// methods. +/// +/// This type is similar to the core wasm version +/// [`wasmtime::Instance`](crate::Instance) except that it represents an +/// instantiated component instead of an instantiated module. #[derive(Copy, Clone)] pub struct Instance(pub(crate) Stored>>); @@ -158,7 +167,7 @@ impl InstanceData { wasmtime_runtime::Export::Global(wasmtime_runtime::ExportGlobal { definition: self.state.instance_flags(*idx).as_raw(), global: Global { - wasm_ty: WasmType::I32, + wasm_ty: WasmValType::I32, mutability: true, }, }) @@ -314,7 +323,7 @@ impl<'a> Instantiator<'a> { let signature = self .component .signatures() - .shared_signature(*sig) + .shared_type(*sig) .expect("found unregistered signature"); self.data.state.set_trampoline( idx, @@ -493,7 +502,7 @@ impl<'a> Instantiator<'a> { if let wasmtime_runtime::Export::Function(f) = &export { let expected = expected.unwrap_func(); let actual = unsafe { f.func_ref.as_ref().type_index }; - assert_eq!(module.signatures().shared_signature(expected), Some(actual)); + assert_eq!(module.signatures().shared_type(expected), Some(actual)); return; } @@ -520,6 +529,7 @@ impl<'a> Instantiator<'a> { pub struct InstancePre { component: Component, imports: Arc>, + resource_imports: Arc>>, _marker: marker::PhantomData T>, } @@ -529,6 +539,7 @@ impl Clone for InstancePre { Self { component: self.component.clone(), imports: self.imports.clone(), + resource_imports: self.resource_imports.clone(), _marker: self._marker, } } @@ -544,14 +555,28 @@ impl InstancePre { pub(crate) unsafe fn new_unchecked( component: Component, imports: PrimaryMap, + resource_imports: PrimaryMap>, ) -> InstancePre { InstancePre { component, imports: Arc::new(imports), + resource_imports: Arc::new(resource_imports), _marker: marker::PhantomData, } } + pub(crate) fn resource_import_index( + &self, + path: ResourceImportIndex, + ) -> Option { + *self.resource_imports.get(path)? + } + + pub(crate) fn resource_import(&self, path: ResourceImportIndex) -> Option<&RuntimeImport> { + let idx = self.resource_import_index(path)?; + self.imports.get(idx) + } + /// Returns the underlying component that will be instantiated. pub fn component(&self) -> &Component { &self.component @@ -573,7 +598,7 @@ impl InstancePre { // // TODO: needs more docs #[cfg(feature = "async")] - #[cfg_attr(nightlydoc, doc(cfg(feature = "async")))] + #[cfg_attr(docsrs, doc(cfg(feature = "async")))] pub async fn instantiate_async( &self, mut store: impl AsContextMut, @@ -696,8 +721,8 @@ impl<'a, 'store> ExportInstance<'a, 'store> { options, )), Export::ModuleStatic(_) - | Export::ModuleImport(_) - | Export::Instance(_) + | Export::ModuleImport { .. } + | Export::Instance { .. } | Export::Type(_) => None, } } @@ -720,7 +745,7 @@ impl<'a, 'store> ExportInstance<'a, 'store> { pub fn module(&mut self, name: &str) -> Option<&'a Module> { match self.exports.get(name)? { Export::ModuleStatic(idx) => Some(&self.data.component.static_module(*idx)), - Export::ModuleImport(idx) => Some(match &self.data.imports[*idx] { + Export::ModuleImport { import, .. } => Some(match &self.data.imports[*import] { RuntimeImport::Module(m) => m, _ => unreachable!(), }), @@ -735,8 +760,8 @@ impl<'a, 'store> ExportInstance<'a, 'store> { Export::Type(_) | Export::LiftedFunction { .. } | Export::ModuleStatic(_) - | Export::ModuleImport(_) - | Export::Instance(_) => None, + | Export::ModuleImport { .. } + | Export::Instance { .. } => None, } } @@ -756,7 +781,7 @@ impl<'a, 'store> ExportInstance<'a, 'store> { self.exports.iter().filter_map(|(name, export)| { let module = match *export { Export::ModuleStatic(idx) => self.data.component.static_module(idx), - Export::ModuleImport(idx) => match &self.data.imports[idx] { + Export::ModuleImport { import, .. } => match &self.data.imports[import] { RuntimeImport::Module(m) => m, _ => unreachable!(), }, @@ -785,7 +810,7 @@ impl<'a, 'store> ExportInstance<'a, 'store> { /// return value with the same lifetimes. pub fn into_instance(self, name: &str) -> Option> { match self.exports.get(name)? { - Export::Instance(exports) => Some(ExportInstance { + Export::Instance { exports, .. } => Some(ExportInstance { exports, instance: self.instance, data: self.data, diff --git a/crates/wasmtime/src/component/linker.rs b/crates/wasmtime/src/runtime/component/linker.rs similarity index 85% rename from crates/wasmtime/src/component/linker.rs rename to crates/wasmtime/src/runtime/component/linker.rs index 5e490fa9ae99..c994adc2e9d1 100644 --- a/crates/wasmtime/src/component/linker.rs +++ b/crates/wasmtime/src/runtime/component/linker.rs @@ -1,6 +1,7 @@ use crate::component::func::HostFunc; use crate::component::instance::RuntimeImport; -use crate::component::matching::TypeChecker; +use crate::component::matching::{InstanceType, TypeChecker}; +use crate::component::types; use crate::component::{ Component, ComponentNamedList, Instance, InstancePre, Lift, Lower, ResourceType, Val, }; @@ -14,7 +15,7 @@ use std::ops::Deref; use std::pin::Pin; use std::sync::Arc; use wasmtime_environ::component::TypeDef; -use wasmtime_environ::PrimaryMap; +use wasmtime_environ::{EntityRef, PrimaryMap}; /// A type used to instantiate [`Component`]s. /// @@ -27,6 +28,7 @@ pub struct Linker { strings: Strings, map: NameMap, path: Vec, + resource_imports: usize, allow_shadowing: bool, _marker: marker::PhantomData T>, } @@ -38,6 +40,7 @@ impl Clone for Linker { strings: self.strings.clone(), map: self.map.clone(), path: self.path.clone(), + resource_imports: self.resource_imports.clone(), allow_shadowing: self.allow_shadowing, _marker: self._marker, } @@ -61,10 +64,50 @@ pub struct LinkerInstance<'a, T> { path_len: usize, strings: &'a mut Strings, map: &'a mut NameMap, + resource_imports: &'a mut usize, allow_shadowing: bool, _marker: marker::PhantomData T>, } +/// Index correlating a resource definition to the import path. +/// This is assigned by [`Linker::resource`] and may be used to associate it to +/// [`RuntimeImportIndex`](wasmtime_environ::component::RuntimeImportIndex) +/// at a later stage +/// +/// [`Linker::resource`]: crate::component::LinkerInstance::resource +#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)] +pub struct ResourceImportIndex(usize); + +impl EntityRef for ResourceImportIndex { + fn new(idx: usize) -> Self { + Self(idx) + } + + fn index(self) -> usize { + self.0 + } +} + +impl Deref for ResourceImportIndex { + type Target = usize; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl From for ResourceImportIndex { + fn from(idx: usize) -> Self { + Self(idx) + } +} + +impl From for usize { + fn from(idx: ResourceImportIndex) -> Self { + idx.0 + } +} + pub(crate) type NameMap = HashMap; #[derive(Clone)] @@ -72,7 +115,11 @@ pub(crate) enum Definition { Instance(NameMap), Func(Arc), Module(Module), - Resource(ResourceType, Arc), + Resource( + ResourceImportIndex, + ResourceType, + Arc, + ), } impl Linker { @@ -85,6 +132,7 @@ impl Linker { map: NameMap::default(), allow_shadowing: false, path: Vec::new(), + resource_imports: 0, _marker: marker::PhantomData, } } @@ -112,6 +160,7 @@ impl Linker { path_len: 0, strings: &mut self.strings, map: &mut self.map, + resource_imports: &mut self.resource_imports, allow_shadowing: self.allow_shadowing, _marker: self._marker, } @@ -126,25 +175,7 @@ impl Linker { self.root().into_instance(name) } - /// Performs a "pre-instantiation" to resolve the imports of the - /// [`Component`] specified with the items defined within this linker. - /// - /// This method will perform as much work as possible short of actually - /// instantiating an instance. Internally this will use the names defined - /// within this linker to satisfy the imports of the [`Component`] provided. - /// Additionally this will perform type-checks against the component's - /// imports against all items defined within this linker. - /// - /// Note that unlike internally in components where subtyping at the - /// interface-types layer is supported this is not supported here. Items - /// defined in this linker must match the component's imports precisely. - /// - /// # Errors - /// - /// Returns an error if this linker doesn't define a name that the - /// `component` imports or if a name defined doesn't match the type of the - /// item imported by the `component` provided. - pub fn instantiate_pre(&self, component: &Component) -> Result> { + fn typecheck<'a>(&'a self, component: &'a Component) -> Result> { let mut cx = TypeChecker { component: component.env_component(), types: component.types(), @@ -164,12 +195,50 @@ impl Linker { cx.definition(ty, import) .with_context(|| format!("import `{name}` has the wrong type"))?; } + Ok(cx) + } + + /// Returns the [`types::Component`] corresponding to `component` with resource + /// types imported by it replaced using imports present in [`Self`]. + pub fn substituted_component_type(&self, component: &Component) -> Result { + let cx = self.typecheck(&component)?; + Ok(types::Component::from( + component.ty(), + &InstanceType { + types: cx.types, + resources: &cx.imported_resources, + }, + )) + } + + /// Performs a "pre-instantiation" to resolve the imports of the + /// [`Component`] specified with the items defined within this linker. + /// + /// This method will perform as much work as possible short of actually + /// instantiating an instance. Internally this will use the names defined + /// within this linker to satisfy the imports of the [`Component`] provided. + /// Additionally this will perform type-checks against the component's + /// imports against all items defined within this linker. + /// + /// Note that unlike internally in components where subtyping at the + /// interface-types layer is supported this is not supported here. Items + /// defined in this linker must match the component's imports precisely. + /// + /// # Errors + /// + /// Returns an error if this linker doesn't define a name that the + /// `component` imports or if a name defined doesn't match the type of the + /// item imported by the `component` provided. + pub fn instantiate_pre(&self, component: &Component) -> Result> { + self.typecheck(&component)?; // Now that all imports are known to be defined and satisfied by this // linker a list of "flat" import items (aka no instances) is created // using the import map within the component created at // component-compile-time. + let env_component = component.env_component(); let mut imports = PrimaryMap::with_capacity(env_component.imports.len()); + let mut resource_imports = PrimaryMap::from(vec![None; self.resource_imports]); for (idx, (import, names)) in env_component.imports.iter() { let (root, _) = &env_component.import_types[*import]; let root = self.strings.lookup(root).unwrap(); @@ -188,11 +257,14 @@ impl Linker { let import = match cur { Definition::Module(m) => RuntimeImport::Module(m.clone()), Definition::Func(f) => RuntimeImport::Func(f.clone()), - Definition::Resource(t, dtor) => RuntimeImport::Resource { - ty: t.clone(), - _dtor: dtor.clone(), - dtor_funcref: component.resource_drop_func_ref(dtor), - }, + Definition::Resource(res_idx, t, dtor) => { + resource_imports[*res_idx] = Some(idx); + RuntimeImport::Resource { + ty: t.clone(), + _dtor: dtor.clone(), + dtor_funcref: component.resource_drop_func_ref(dtor), + } + } // This is guaranteed by the compilation process that "leaf" // runtime imports are never instances. @@ -201,7 +273,7 @@ impl Linker { let i = imports.push(import); assert_eq!(i, idx); } - Ok(unsafe { InstancePre::new_unchecked(component.clone(), imports) }) + Ok(unsafe { InstancePre::new_unchecked(component.clone(), imports, resource_imports) }) } /// Instantiates the [`Component`] provided into the `store` specified. @@ -239,7 +311,7 @@ impl Linker { /// can return an error if something goes wrong during instantiation such as /// a runtime trap or a runtime limit being exceeded. #[cfg(feature = "async")] - #[cfg_attr(nightlydoc, doc(cfg(feature = "async")))] + #[cfg_attr(docsrs, doc(cfg(feature = "async")))] pub async fn instantiate_async( &self, store: impl AsContextMut, @@ -266,6 +338,7 @@ impl LinkerInstance<'_, T> { path_len: self.path_len, strings: self.strings, map: self.map, + resource_imports: self.resource_imports, allow_shadowing: self.allow_shadowing, _marker: self._marker, } @@ -304,7 +377,7 @@ impl LinkerInstance<'_, T> { /// This is exactly like [`Self::func_wrap`] except it takes an async /// host function. #[cfg(feature = "async")] - #[cfg_attr(nightlydoc, doc(cfg(feature = "async")))] + #[cfg_attr(docsrs, doc(cfg(feature = "async")))] pub fn func_wrap_async(&mut self, name: &str, f: F) -> Result<()> where F: for<'a> Fn( @@ -383,7 +456,7 @@ impl LinkerInstance<'_, T> { /// This is exactly like [`Self::func_new`] except it takes an async /// host function. #[cfg(feature = "async")] - #[cfg_attr(nightlydoc, doc(cfg(feature = "async")))] + #[cfg_attr(docsrs, doc(cfg(feature = "async")))] pub fn func_new_async(&mut self, component: &Component, name: &str, f: F) -> Result<()> where F: for<'a> Fn( @@ -417,12 +490,9 @@ impl LinkerInstance<'_, T> { self.insert(name, Definition::Module(module.clone())) } - /// Defines a new host [`ResourceType`] in this linker. + /// Defines a new resource of a given [`ResourceType`] in this linker. /// - /// This function is used to specify resources defined in the host. The `U` - /// type parameter here is the type parameter to [`Resource`]. This means - /// that component types using this resource type will be visible in - /// Wasmtime as [`Resource`]. + /// This function is used to specify resources defined in the host. /// /// The `name` argument is the name to define the resource within this /// linker. @@ -442,17 +512,24 @@ impl LinkerInstance<'_, T> { /// The provided `dtor` closure returns an error if something goes wrong /// when a guest calls the `dtor` to drop a `Resource` such as /// a runtime trap or a runtime limit being exceeded. - pub fn resource( + pub fn resource( &mut self, name: &str, + ty: ResourceType, dtor: impl Fn(StoreContextMut<'_, T>, u32) -> Result<()> + Send + Sync + 'static, - ) -> Result<()> { + ) -> Result { let name = self.strings.intern(name); let dtor = Arc::new(crate::func::HostFunc::wrap( &self.engine, move |mut cx: crate::Caller<'_, T>, param: u32| dtor(cx.as_context_mut(), param), )); - self.insert(name, Definition::Resource(ResourceType::host::(), dtor)) + let idx = ResourceImportIndex::new(*self.resource_imports); + *self.resource_imports = self + .resource_imports + .checked_add(1) + .context("resource import count would overflow")?; + self.insert(name, Definition::Resource(idx, ty, dtor))?; + Ok(idx) } /// Defines a nested instance within this instance. diff --git a/crates/wasmtime/src/component/matching.rs b/crates/wasmtime/src/runtime/component/matching.rs similarity index 99% rename from crates/wasmtime/src/component/matching.rs rename to crates/wasmtime/src/runtime/component/matching.rs index c68a4995d4b4..050fbe0d015f 100644 --- a/crates/wasmtime/src/component/matching.rs +++ b/crates/wasmtime/src/runtime/component/matching.rs @@ -53,7 +53,7 @@ impl TypeChecker<'_> { TypeDef::Resource(i) => { let i = self.types[i].ty; let actual = match actual { - Some(Definition::Resource(actual, _dtor)) => actual, + Some(Definition::Resource(_idx, actual, _dtor)) => actual, // If a resource is imported yet nothing was supplied then // that's only successful if the resource has itself diff --git a/crates/wasmtime/src/runtime/component/mod.rs b/crates/wasmtime/src/runtime/component/mod.rs new file mode 100644 index 000000000000..f3e40cb8e05d --- /dev/null +++ b/crates/wasmtime/src/runtime/component/mod.rs @@ -0,0 +1,678 @@ +//! # Embedding API for the Component Model +//! +//! This module contains the embedding API for the [Component Model] in +//! Wasmtime. This module requires the `component-model` feature to be enabled, +//! which is enabled by default. The embedding API here is mirrored after the +//! core wasm embedding API at the crate root and is intended to have the same +//! look-and-feel while handling concepts of the component model. +//! +//! [Component Model]: https://component-model.bytecodealliance.org +//! +//! The component model is a broad topic which can't be explained here fully, so +//! it's recommended to read over individual items' documentation to see more +//! about the capabilities of the embedding API. At a high-level, however, +//! perhaps the most interesting items in this module are: +//! +//! * [`Component`] - a compiled component ready to be instantiated. Similar to +//! a [`Module`](crate::Module) for core wasm. +//! +//! * [`Linker`] - a component-style location for defining host functions. This +//! is not the same as [`wasmtime::Linker`](crate::Linker) for core wasm +//! modules. +//! +//! * [`bindgen!`] - a macro to generate Rust bindings for a [WIT] [world]. This +//! maps all WIT types into Rust automatically and generates traits for +//! embedders to implement. +//! +//! [WIT]: https://component-model.bytecodealliance.org/design/wit.html +//! [world]: https://component-model.bytecodealliance.org/design/worlds.html +//! +//! Embedders of the component model will typically start by defining their API +//! in [WIT]. This describes what will be available to guests and what needs to +//! be provided to the embedder by the guest. This [`world`][world] that was +//! created is then fed into [`bindgen!`] to generate types and traits for the +//! embedder to use. The embedder then implements these traits, adds +//! functionality via the generated `add_to_linker` method (see [`bindgen!`] for +//! more info), and then instantiates/executes a component. +//! +//! It's recommended to read over the [documentation for the Component +//! Model][Component Model] to get an overview about how to build components +//! from various languages. + +#![cfg_attr(docsrs, doc(cfg(feature = "component-model")))] + +mod component; +mod func; +mod instance; +mod linker; +mod matching; +mod resource_table; +mod resources; +mod storage; +mod store; +pub mod types; +mod values; +pub use self::component::Component; +pub use self::func::{ + ComponentNamedList, ComponentType, Func, Lift, Lower, TypedFunc, WasmList, WasmStr, +}; +pub use self::instance::{ExportInstance, Exports, Instance, InstancePre}; +pub use self::linker::{Linker, LinkerInstance, ResourceImportIndex}; +pub use self::resource_table::{ResourceTable, ResourceTableError}; +pub use self::resources::{Resource, ResourceAny}; +pub use self::types::{ResourceType, Type}; +pub use self::values::{Enum, Flags, List, OptionVal, Record, ResultVal, Tuple, Val, Variant}; + +pub(crate) use self::resources::HostResourceData; + +// These items are expected to be used by an eventual +// `#[derive(ComponentType)]`, they are not part of Wasmtime's API stability +// guarantees +#[doc(hidden)] +pub mod __internal { + pub use super::func::{ + bad_type_info, format_flags, lower_payload, typecheck_enum, typecheck_flags, + typecheck_record, typecheck_variant, ComponentVariant, LiftContext, LowerContext, + MaybeUninitExt, Options, + }; + pub use super::matching::InstanceType; + pub use crate::map_maybe_uninit; + pub use crate::store::StoreOpaque; + pub use anyhow; + #[cfg(feature = "async")] + pub use async_trait::async_trait; + pub use wasmtime_environ; + pub use wasmtime_environ::component::{CanonicalAbiInfo, ComponentTypes, InterfaceType}; +} + +pub(crate) use self::store::ComponentStoreData; + +/// Generate bindings for a [WIT world]. +/// +/// [WIT world]: https://component-model.bytecodealliance.org/design/worlds.html +/// [WIT package]: https://component-model.bytecodealliance.org/design/packages.html +/// +/// This macro ingests a [WIT world] and will generate all the necessary +/// bindings for instantiating components that ascribe to the `world`. This +/// provides a higher-level representation of working with a component than the +/// raw [`Instance`] type which must be manually-type-checked and manually have +/// its imports provided via the [`Linker`] type. +/// +/// The most basic usage of this macro is: +/// +/// ```rust,ignore +/// wasmtime::component::bindgen!(); +/// ``` +/// +/// This will parse your projects [WIT package] in a `wit` directory adjacent to +/// your crate's `Cargo.toml`. All of the `*.wit` files in that directory are +/// parsed and then the single `world` found will be used for bindings. +/// +/// For example if your project contained: +/// +/// ```text,ignore +/// // wit/my-component.wit +/// +/// package my:project; +/// +/// world hello-world { +/// import name: func() -> string; +/// export greet: func(); +/// } +/// ``` +/// +/// Then you can interact with the generated bindings like so: +/// +/// ```rust +/// use wasmtime::component::*; +/// use wasmtime::{Config, Engine, Store}; +/// +/// # const _: () = { macro_rules! bindgen { () => () } +/// bindgen!(); +/// # }; +/// # bindgen!({ +/// # inline: r#" +/// # package my:project; +/// # world hello-world { +/// # import name: func() -> string; +/// # export greet: func(); +/// # } +/// # "#, +/// # }); +/// +/// struct MyState { +/// name: String, +/// } +/// +/// // Imports into the world, like the `name` import for this world, are +/// // satisfied through traits. +/// impl HelloWorldImports for MyState { +/// // Note the `Result` return value here where `Ok` is returned back to +/// // the component and `Err` will raise a trap. +/// fn name(&mut self) -> wasmtime::Result { +/// Ok(self.name.clone()) +/// } +/// } +/// +/// fn main() -> wasmtime::Result<()> { +/// # if true { return Ok(()) } +/// // Configure an `Engine` and compile the `Component` that is being run for +/// // the application. +/// let mut config = Config::new(); +/// config.wasm_component_model(true); +/// let engine = Engine::new(&config)?; +/// let component = Component::from_file(&engine, "./your-component.wasm")?; +/// +/// // Instantiation of bindings always happens through a `Linker`. +/// // Configuration of the linker is done through a generated `add_to_linker` +/// // method on the bindings structure. +/// // +/// // Note that the closure provided here is a projection from `T` in +/// // `Store` to `&mut U` where `U` implements the `HelloWorldImports` +/// // trait. In this case the `T`, `MyState`, is stored directly in the +/// // structure so no projection is necessary here. +/// let mut linker = Linker::new(&engine); +/// HelloWorld::add_to_linker(&mut linker, |state: &mut MyState| state)?; +/// +/// // As with the core wasm API of Wasmtime instantiation occurs within a +/// // `Store`. The bindings structure contains an `instantiate` method which +/// // takes the store, component, and linker. This returns the `bindings` +/// // structure which is an instance of `HelloWorld` and supports typed access +/// // to the exports of the component. +/// let mut store = Store::new( +/// &engine, +/// MyState { +/// name: "me".to_string(), +/// }, +/// ); +/// let (bindings, _) = HelloWorld::instantiate(&mut store, &component, &linker)?; +/// +/// // Here our `greet` function doesn't take any parameters for the component, +/// // but in the Wasmtime embedding API the first argument is always a `Store`. +/// bindings.call_greet(&mut store)?; +/// Ok(()) +/// } +/// ``` +/// +/// The function signatures within generated traits and on generated exports +/// match the component-model signatures as specified in the WIT `world` item. +/// Note that WIT also has support for importing and exports interfaces within +/// worlds, which can be bound here as well: +/// +/// For example this WIT input +/// +/// ```text,ignore +/// // wit/my-component.wit +/// +/// package my:project; +/// +/// interface host { +/// gen-random-integer: func() -> u32; +/// sha256: func(bytes: list) -> string; +/// } +/// +/// world hello-world { +/// import host; +/// +/// export demo: interface { +/// run: func(); +/// } +/// } +/// ``` +/// +/// Then you can interact with the generated bindings like so: +/// +/// ```rust +/// use wasmtime::component::*; +/// use wasmtime::{Config, Engine, Store}; +/// use my::project::host::Host; +/// +/// # const _: () = { macro_rules! bindgen { () => () } +/// bindgen!(); +/// # }; +/// # bindgen!({ +/// # inline: r#" +/// # package my:project; +/// # +/// # interface host { +/// # gen-random-integer: func() -> u32; +/// # sha256: func(bytes: list) -> string; +/// # } +/// # +/// # world hello-world { +/// # import host; +/// # +/// # export demo: interface { +/// # run: func(); +/// # } +/// # } +/// # "#, +/// # }); +/// +/// struct MyState { +/// // ... +/// } +/// +/// // Note that the trait here is per-interface and within a submodule now. +/// impl Host for MyState { +/// fn gen_random_integer(&mut self) -> wasmtime::Result { +/// # panic!(); +/// # #[cfg(FALSE)] +/// Ok(rand::thread_rng().gen()) +/// } +/// +/// fn sha256(&mut self, bytes: Vec) -> wasmtime::Result { +/// // ... +/// # panic!() +/// } +/// } +/// +/// fn main() -> wasmtime::Result<()> { +/// # if true { return Ok(()) } +/// let mut config = Config::new(); +/// config.wasm_component_model(true); +/// let engine = Engine::new(&config)?; +/// let component = Component::from_file(&engine, "./your-component.wasm")?; +/// +/// let mut linker = Linker::new(&engine); +/// HelloWorld::add_to_linker(&mut linker, |state: &mut MyState| state)?; +/// +/// let mut store = Store::new( +/// &engine, +/// MyState { /* ... */ }, +/// ); +/// let (bindings, _) = HelloWorld::instantiate(&mut store, &component, &linker)?; +/// +/// // Note that the `demo` method returns a `&Demo` through which we can +/// // run the methods on that interface. +/// bindings.demo().call_run(&mut store)?; +/// Ok(()) +/// } +/// ``` +/// +/// The generated bindings can additionally be explored more fully with `cargo +/// doc` to see what types and traits and such are generated. +/// +/// # Syntax +/// +/// This procedural macro accepts a few different syntaxes. The primary purpose +/// of this macro is to locate a WIT package, parse it, and then extract a +/// `world` from the parsed package. There are then codegen-specific options to +/// the bindings themselves which can additionally be specified. +/// +/// Usage of this macro looks like: +/// +/// ```rust,ignore +/// // Parse the `wit/` folder adjacent to this crate's `Cargo.toml` and look +/// // for a single `world` in it. There must be exactly one for this to +/// // succeed. +/// bindgen!(); +/// +/// // Parse the `wit/` folder adjacent to this crate's `Cargo.toml` and look +/// // for the world `foo` contained in it. +/// bindgen!("foo"); +/// +/// // Parse the folder `other/wit/folder` adjacent to `Cargo.toml`. +/// bindgen!(in "other/wit/folder"); +/// bindgen!("foo" in "other/wit/folder"); +/// +/// // Parse the file `foo.wit` as a single-file WIT package with no +/// // dependencies. +/// bindgen!("foo" in "foo.wit"); +/// ``` +/// +/// A more configured version of invoking this macro looks like: +/// +/// ```rust,ignore +/// bindgen!({ +/// world: "foo", // not needed if `path` has one `world` +/// +/// // same as in `bindgen!(in "other/wit/folder") +/// path: "other/wit/folder", +/// +/// // Instead of `path` the WIT document can be provided inline if +/// // desired. +/// inline: " +/// package my:inline; +/// +/// world foo { +/// // ... +/// } +/// ", +/// +/// // Add calls to `tracing::span!` before each import or export is called +/// // to log arguments and return values. +/// // +/// // This option defaults to `false`. +/// tracing: true, +/// +/// // Imports will be async functions through #[async_trait] and exports +/// // are also invoked as async functions. Requires `Config::async_support` +/// // to be `true`. +/// // +/// // Note that this is only async for the host as the guest will still +/// // appear as if it's invoking blocking functions. +/// // +/// // This option defaults to `false`. +/// async: true, +/// +/// // Alternative mode of async configuration where this still implies +/// // async instantiation happens, for example, but more control is +/// // provided over which imports are async and which aren't. +/// // +/// // Note that in this mode all exports are still async. +/// async: { +/// // All imports are async except for functions with these names +/// except_imports: ["foo", "bar"], +/// +/// // All imports are synchronous except for functions with these names +/// // +/// // Note that this key cannot be specified with `except_imports`, +/// // only one or the other is accepted. +/// only_imports: ["foo", "bar"], +/// }, +/// +/// // This can be used to translate WIT return values of the form +/// // `result` into `Result` in Rust. +/// // Users must define `RustErrorType` and the `Host` trait for the +/// // interface which defines `error-type` will have a method +/// // called `convert_error_type` which converts `RustErrorType` +/// // into `wasmtime::Result`. This conversion can either +/// // return the raw WIT error (`ErrorType` here) or a trap. +/// // +/// // By default this option is not specified. +/// trappable_error_type: { +/// "wasi:io/streams/stream-error" => RustErrorType, +/// }, +/// +/// // All generated bindgen types are "owned" meaning types like `String` +/// // are used instead of `&str`, for example. This is the default and +/// // ensures that the same type used in both imports and exports uses the +/// // same generated type. +/// ownership: Owning, +/// +/// // Alternative to `Owning` above where borrowed types attempt to be used +/// // instead. The `duplicate_if_necessary` configures whether duplicate +/// // Rust types will be generated for the same WIT type if necessary, for +/// // example when a type is used both as an import and an export. +/// ownership: Borrowing { +/// duplicate_if_necessary: true +/// }, +/// +/// // Restrict the code generated to what's needed for the interface +/// // imports in the inlined WIT document fragment. +/// interfaces: " +/// import wasi:cli/command; +/// ", +/// +/// // Remap imported interfaces or resources to types defined in Rust +/// // elsewhere. Using this option will prevent any code from being +/// // generated for interfaces mentioned here. Resources named here will +/// // not have a type generated to represent the resource. +/// // +/// // Interfaces mapped with this option should be previously generated +/// // with an invocation of this macro. Resources need to be mapped to a +/// // Rust type name. +/// with: { +/// "wasi:random/random": some::other::wasi::random::random, +/// "wasi:filesystem/types/descriptor": MyDescriptorType, +/// }, +/// }); +/// ``` +pub use wasmtime_component_macro::bindgen; + +/// Derive macro to generate implementations of the [`ComponentType`] trait. +/// +/// This derive macro can be applied to `struct` and `enum` definitions and is +/// used to bind either a `record`, `enum`, or `variant` in the component model. +/// +/// Note you might be looking for [`bindgen!`] rather than this macro as that +/// will generate the entire type for you rather than just a trait +/// implementation. +/// +/// This macro supports a `#[component]` attribute which is used to customize +/// how the type is bound to the component model. A top-level `#[component]` +/// attribute is required to specify either `record`, `enum`, or `variant`. +/// +/// ## Records +/// +/// `record`s in the component model correspond to `struct`s in Rust. An example +/// is: +/// +/// ```rust +/// use wasmtime::component::ComponentType; +/// +/// #[derive(ComponentType)] +/// #[component(record)] +/// struct Color { +/// r: u8, +/// g: u8, +/// b: u8, +/// } +/// ``` +/// +/// which corresponds to the WIT type: +/// +/// ```wit +/// record color { +/// r: u8, +/// g: u8, +/// b: u8, +/// } +/// ``` +/// +/// Note that the name `Color` here does not need to match the name in WIT. +/// That's purely used as a name in Rust of what to refer to. The field names +/// must match that in WIT, however. Field names can be customized with the +/// `#[component]` attribute though. +/// +/// ```rust +/// use wasmtime::component::ComponentType; +/// +/// #[derive(ComponentType)] +/// #[component(record)] +/// struct VerboseColor { +/// #[component(name = "r")] +/// red: u8, +/// #[component(name = "g")] +/// green: u8, +/// #[component(name = "b")] +/// blue: u8, +/// } +/// ``` +/// +/// Also note that field ordering is significant at this time and must match +/// WIT. +/// +/// ## Variants +/// +/// `variant`s in the component model correspond to a subset of shapes of a Rust +/// `enum`. Variants in the component model have a single optional payload type +/// which means that not all Rust `enum`s correspond to component model +/// `variant`s. An example variant is: +/// +/// ```rust +/// use wasmtime::component::ComponentType; +/// +/// #[derive(ComponentType)] +/// #[component(variant)] +/// enum Filter { +/// #[component(name = "none")] +/// None, +/// #[component(name = "all")] +/// All, +/// #[component(name = "some")] +/// Some(Vec), +/// } +/// ``` +/// +/// which corresponds to the WIT type: +/// +/// ```wit +/// variant filter { +/// none, +/// all, +/// some(list), +/// } +/// ``` +/// +/// The `variant` style of derive allows an optional payload on Rust `enum` +/// variants but it must be a single unnamed field. Variants of the form `Foo(T, +/// U)` or `Foo { name: T }` are not supported at this time. +/// +/// Note that the order of variants in Rust must match the order of variants in +/// WIT. Additionally it's likely that `#[component(name = "...")]` is required +/// on all Rust `enum` variants because the name currently defaults to the Rust +/// name which is typically UpperCamelCase whereas WIT uses kebab-case. +/// +/// ## Enums +/// +/// `enum`s in the component model correspond to C-like `enum`s in Rust. Note +/// that a component model `enum` does not allow any payloads so the Rust `enum` +/// must additionally have no payloads. +/// +/// ```rust +/// use wasmtime::component::ComponentType; +/// +/// #[derive(ComponentType)] +/// #[component(enum)] +/// enum Setting { +/// #[component(name = "yes")] +/// Yes, +/// #[component(name = "no")] +/// No, +/// #[component(name = "auto")] +/// Auto, +/// } +/// ``` +/// +/// which corresponds to the WIT type: +/// +/// ```wit +/// enum setting { +/// yes, +/// no, +/// auto, +/// } +/// ``` +/// +/// Note that the order of variants in Rust must match the order of variants in +/// WIT. Additionally it's likely that `#[component(name = "...")]` is required +/// on all Rust `enum` variants because the name currently defaults to the Rust +/// name which is typically UpperCamelCase whereas WIT uses kebab-case. +pub use wasmtime_component_macro::ComponentType; + +/// A derive macro for generating implementations of the [`Lift`] trait. +/// +/// This macro will likely be applied in conjunction with the +/// [`#[derive(ComponentType)]`](macro@ComponentType) macro along the lines +/// of `#[derive(ComponentType, Lift)]`. This trait enables reading values from +/// WebAssembly. +/// +/// Note you might be looking for [`bindgen!`] rather than this macro as that +/// will generate the entire type for you rather than just a trait +/// implementation. +/// +/// At this time this derive macro has no configuration. +/// +/// ## Examples +/// +/// ```rust +/// use wasmtime::component::{ComponentType, Lift}; +/// +/// #[derive(ComponentType, Lift)] +/// #[component(record)] +/// struct Color { +/// r: u8, +/// g: u8, +/// b: u8, +/// } +/// ``` +pub use wasmtime_component_macro::Lift; + +/// A derive macro for generating implementations of the [`Lower`] trait. +/// +/// This macro will likely be applied in conjunction with the +/// [`#[derive(ComponentType)]`](macro@ComponentType) macro along the lines +/// of `#[derive(ComponentType, Lower)]`. This trait enables passing values to +/// WebAssembly. +/// +/// Note you might be looking for [`bindgen!`] rather than this macro as that +/// will generate the entire type for you rather than just a trait +/// implementation. +/// +/// At this time this derive macro has no configuration. +/// +/// ## Examples +/// +/// ```rust +/// use wasmtime::component::{ComponentType, Lower}; +/// +/// #[derive(ComponentType, Lower)] +/// #[component(record)] +/// struct Color { +/// r: u8, +/// g: u8, +/// b: u8, +/// } +/// ``` +pub use wasmtime_component_macro::Lower; + +/// A macro to generate a Rust type corresponding to WIT `flags` +/// +/// This macro generates a type that implements the [`ComponentType`], [`Lift`], +/// and [`Lower`] traits. The generated Rust type corresponds to the `flags` +/// type in WIT. +/// +/// Example usage of this looks like: +/// +/// ```rust +/// use wasmtime::component::flags; +/// +/// flags! { +/// Permissions { +/// #[component(name = "read")] +/// const READ; +/// #[component(name = "write")] +/// const WRITE; +/// #[component(name = "execute")] +/// const EXECUTE; +/// } +/// } +/// +/// fn validate_permissions(permissions: &mut Permissions) { +/// if permissions.contains(Permissions::EXECUTE | Permissions::WRITE) { +/// panic!("cannot enable both writable and executable at the same time"); +/// } +/// +/// if permissions.contains(Permissions::READ) { +/// panic!("permissions must at least contain read"); +/// } +/// } +/// ``` +/// +/// which corresponds to the WIT type: +/// +/// ```wit +/// flags permissions { +/// read, +/// write, +/// execute, +/// } +/// ``` +/// +/// This generates a structure which is similar to/inspired by the [`bitflags` +/// crate](https://crates.io/crates/bitflags). The `Permissions` structure +/// generated implements the [`PartialEq`], [`Eq`], [`Debug`], [`BitOr`], +/// [`BitOrAssign`], [`BitAnd`], [`BitAndAssign`], [`BitXor`], [`BitXorAssign`], +/// and [`Not`] traits - in addition to the Wasmtime-specific component ones +/// [`ComponentType`], [`Lift`], and [`Lower`]. +/// +/// [`BitOr`]: std::ops::BitOr +/// [`BitOrAssign`]: std::ops::BitOrAssign +/// [`BitAnd`]: std::ops::BitAnd +/// [`BitAndAssign`]: std::ops::BitAndAssign +/// [`BitXor`]: std::ops::BitXor +/// [`BitXorAssign`]: std::ops::BitXorAssign +/// [`Not`]: std::ops::Not +pub use wasmtime_component_macro::flags; diff --git a/crates/wasmtime/src/runtime/component/resource_table.rs b/crates/wasmtime/src/runtime/component/resource_table.rs new file mode 100644 index 000000000000..4b57ce792679 --- /dev/null +++ b/crates/wasmtime/src/runtime/component/resource_table.rs @@ -0,0 +1,350 @@ +use super::Resource; +use std::any::Any; +use std::collections::{BTreeSet, HashMap}; + +#[derive(Debug)] +/// Errors returned by operations on `ResourceTable` +pub enum ResourceTableError { + /// ResourceTable has no free keys + Full, + /// Resource not present in table + NotPresent, + /// Resource present in table, but with a different type + WrongType, + /// Resource cannot be deleted because child resources exist in the table. Consult wit docs for + /// the particular resource to see which methods may return child resources. + HasChildren, +} + +impl std::fmt::Display for ResourceTableError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::Full => write!(f, "resource table has no free keys"), + Self::NotPresent => write!(f, "resource not present"), + Self::WrongType => write!(f, "resource is of another type"), + Self::HasChildren => write!(f, "resource has children"), + } + } +} +impl std::error::Error for ResourceTableError {} + +/// The `ResourceTable` type maps a `Resource` to its `T`. +#[derive(Debug)] +pub struct ResourceTable { + entries: Vec, + free_head: Option, +} + +#[derive(Debug)] +enum Entry { + Free { next: Option }, + Occupied { entry: TableEntry }, +} + +impl Entry { + pub fn occupied(&self) -> Option<&TableEntry> { + match self { + Self::Occupied { entry } => Some(entry), + Self::Free { .. } => None, + } + } + + pub fn occupied_mut(&mut self) -> Option<&mut TableEntry> { + match self { + Self::Occupied { entry } => Some(entry), + Self::Free { .. } => None, + } + } +} + +/// This structure tracks parent and child relationships for a given table entry. +/// +/// Parents and children are referred to by table index. We maintain the +/// following invariants to prevent orphans and cycles: +/// * parent can only be assigned on creating the entry. +/// * parent, if some, must exist when creating the entry. +/// * whenever a child is created, its index is added to children. +/// * whenever a child is deleted, its index is removed from children. +/// * an entry with children may not be deleted. +#[derive(Debug)] +struct TableEntry { + /// The entry in the table, as a boxed dynamically-typed object + entry: Box, + /// The index of the parent of this entry, if it has one. + parent: Option, + /// The indicies of any children of this entry. + children: BTreeSet, +} + +impl TableEntry { + fn new(entry: Box, parent: Option) -> Self { + Self { + entry, + parent, + children: BTreeSet::new(), + } + } + fn add_child(&mut self, child: u32) { + debug_assert!(!self.children.contains(&child)); + self.children.insert(child); + } + fn remove_child(&mut self, child: u32) { + let was_removed = self.children.remove(&child); + debug_assert!(was_removed); + } +} + +impl ResourceTable { + /// Create an empty table + pub fn new() -> Self { + ResourceTable { + entries: Vec::new(), + free_head: None, + } + } + + /// Create an empty table with at least the specified capacity. + pub fn with_capacity(capacity: usize) -> Self { + ResourceTable { + entries: Vec::with_capacity(capacity), + free_head: None, + } + } + + /// Inserts a new value `T` into this table, returning a corresponding + /// `Resource` which can be used to refer to it after it was inserted. + pub fn push(&mut self, entry: T) -> Result, ResourceTableError> + where + T: Send + 'static, + { + let idx = self.push_(TableEntry::new(Box::new(entry), None))?; + Ok(Resource::new_own(idx)) + } + + /// Pop an index off of the free list, if it's not empty. + fn pop_free_list(&mut self) -> Option { + if let Some(ix) = self.free_head { + // Advance free_head to the next entry if one is available. + match &self.entries[ix] { + Entry::Free { next } => self.free_head = *next, + Entry::Occupied { .. } => unreachable!(), + } + Some(ix) + } else { + None + } + } + + /// Free an entry in the table, returning its [`TableEntry`]. Add the index to the free list. + fn free_entry(&mut self, ix: usize) -> TableEntry { + let entry = match std::mem::replace( + &mut self.entries[ix], + Entry::Free { + next: self.free_head, + }, + ) { + Entry::Occupied { entry } => entry, + Entry::Free { .. } => unreachable!(), + }; + + self.free_head = Some(ix); + + entry + } + + /// Push a new entry into the table, returning its handle. This will prefer to use free entries + /// if they exist, falling back on pushing new entries onto the end of the table. + fn push_(&mut self, e: TableEntry) -> Result { + if let Some(free) = self.pop_free_list() { + self.entries[free] = Entry::Occupied { entry: e }; + Ok(free as u32) + } else { + let ix = self + .entries + .len() + .try_into() + .map_err(|_| ResourceTableError::Full)?; + self.entries.push(Entry::Occupied { entry: e }); + Ok(ix) + } + } + + fn occupied(&self, key: u32) -> Result<&TableEntry, ResourceTableError> { + self.entries + .get(key as usize) + .and_then(Entry::occupied) + .ok_or(ResourceTableError::NotPresent) + } + + fn occupied_mut(&mut self, key: u32) -> Result<&mut TableEntry, ResourceTableError> { + self.entries + .get_mut(key as usize) + .and_then(Entry::occupied_mut) + .ok_or(ResourceTableError::NotPresent) + } + + /// Insert a resource at the next available index, and track that it has a + /// parent resource. + /// + /// The parent must exist to create a child. All children resources must + /// be destroyed before a parent can be destroyed - otherwise + /// [`ResourceTable::delete`] will fail with + /// [`ResourceTableError::HasChildren`]. + /// + /// Parent-child relationships are tracked inside the table to ensure that + /// a parent resource is not deleted while it has live children. This + /// allows child resources to hold "references" to a parent by table + /// index, to avoid needing e.g. an `Arc>` and the associated + /// locking overhead and design issues, such as child existence extending + /// lifetime of parent referent even after parent resource is destroyed, + /// possibility for deadlocks. + /// + /// Parent-child relationships may not be modified once created. There + /// is no way to observe these relationships through the [`ResourceTable`] + /// methods except for erroring on deletion, or the [`std::fmt::Debug`] + /// impl. + pub fn push_child( + &mut self, + entry: T, + parent: &Resource, + ) -> Result, ResourceTableError> + where + T: Send + 'static, + U: 'static, + { + let parent = parent.rep(); + self.occupied(parent)?; + let child = self.push_(TableEntry::new(Box::new(entry), Some(parent)))?; + self.occupied_mut(parent)?.add_child(child); + Ok(Resource::new_own(child)) + } + + /// Get an immutable reference to a resource of a given type at a given + /// index. + /// + /// Multiple shared references can be borrowed at any given time. + pub fn get(&self, key: &Resource) -> Result<&T, ResourceTableError> { + self.get_(key.rep())? + .downcast_ref() + .ok_or(ResourceTableError::WrongType) + } + + fn get_(&self, key: u32) -> Result<&dyn Any, ResourceTableError> { + let r = self.occupied(key)?; + Ok(&*r.entry) + } + + /// Get an mutable reference to a resource of a given type at a given + /// index. + pub fn get_mut( + &mut self, + key: &Resource, + ) -> Result<&mut T, ResourceTableError> { + self.get_any_mut(key.rep())? + .downcast_mut() + .ok_or(ResourceTableError::WrongType) + } + + /// Returns the raw `Any` at the `key` index provided. + pub fn get_any_mut(&mut self, key: u32) -> Result<&mut dyn Any, ResourceTableError> { + let r = self.occupied_mut(key)?; + Ok(&mut *r.entry) + } + + /// Same as `delete`, but typed + pub fn delete(&mut self, resource: Resource) -> Result + where + T: Any, + { + debug_assert!(resource.owned()); + let entry = self.delete_entry(resource.rep())?; + match entry.entry.downcast() { + Ok(t) => Ok(*t), + Err(_e) => Err(ResourceTableError::WrongType), + } + } + + fn delete_entry(&mut self, key: u32) -> Result { + if !self.occupied(key)?.children.is_empty() { + return Err(ResourceTableError::HasChildren); + } + let e = self.free_entry(key as usize); + if let Some(parent) = e.parent { + // Remove deleted resource from parent's child list. + // Parent must still be present because it cant be deleted while still having + // children: + self.occupied_mut(parent) + .expect("missing parent") + .remove_child(key); + } + Ok(e) + } + + /// Zip the values of the map with mutable references to table entries corresponding to each + /// key. As the keys in the [HashMap] are unique, this iterator can give mutable references + /// with the same lifetime as the mutable reference to the [ResourceTable]. + pub fn iter_entries<'a, T>( + &'a mut self, + map: HashMap, + ) -> impl Iterator, T)> { + map.into_iter().map(move |(k, v)| { + let item = self + .occupied_mut(k) + .map(|e| Box::as_mut(&mut e.entry)) + // Safety: extending the lifetime of the mutable reference. + .map(|item| unsafe { &mut *(item as *mut dyn Any) }); + (item, v) + }) + } + + /// Iterate over all children belonging to the provided parent + pub fn iter_children( + &self, + parent: &Resource, + ) -> Result, ResourceTableError> + where + T: 'static, + { + let parent_entry = self.occupied(parent.rep())?; + Ok(parent_entry.children.iter().map(|child_index| { + let child = self.occupied(*child_index).expect("missing child"); + child.entry.as_ref() + })) + } +} + +impl Default for ResourceTable { + fn default() -> Self { + ResourceTable::new() + } +} + +#[test] +pub fn test_free_list() { + let mut table = ResourceTable::new(); + + let x = table.push(()).unwrap(); + assert_eq!(x.rep(), 0); + + let y = table.push(()).unwrap(); + assert_eq!(y.rep(), 1); + + // Deleting x should put it on the free list, so the next entry should have the same rep. + table.delete(x).unwrap(); + let x = table.push(()).unwrap(); + assert_eq!(x.rep(), 0); + + // Deleting x and then y should yield indices 1 and then 0 for new entries. + table.delete(x).unwrap(); + table.delete(y).unwrap(); + + let y = table.push(()).unwrap(); + assert_eq!(y.rep(), 1); + + let x = table.push(()).unwrap(); + assert_eq!(x.rep(), 0); + + // As the free list is empty, this entry will have a new id. + let x = table.push(()).unwrap(); + assert_eq!(x.rep(), 2); +} diff --git a/crates/wasmtime/src/component/resources.rs b/crates/wasmtime/src/runtime/component/resources.rs similarity index 55% rename from crates/wasmtime/src/component/resources.rs rename to crates/wasmtime/src/runtime/component/resources.rs index 9ed13faf3208..b41b073dc39d 100644 --- a/crates/wasmtime/src/component/resources.rs +++ b/crates/wasmtime/src/runtime/component/resources.rs @@ -1,15 +1,19 @@ use crate::component::func::{bad_type_info, desc, LiftContext, LowerContext}; +use crate::component::instance::RuntimeImport; +use crate::component::linker::ResourceImportIndex; use crate::component::matching::InstanceType; -use crate::component::{ComponentType, Lift, Lower}; +use crate::component::{ComponentType, InstancePre, Lift, Lower}; use crate::store::{StoreId, StoreOpaque}; use crate::{AsContextMut, StoreContextMut, Trap}; -use anyhow::{bail, Result}; +use anyhow::{bail, ensure, Context, Result}; use std::any::TypeId; use std::fmt; use std::marker; use std::mem::MaybeUninit; -use std::sync::atomic::{AtomicU32, Ordering::Relaxed}; -use wasmtime_environ::component::{CanonicalAbiInfo, DefinedResourceIndex, InterfaceType}; +use std::sync::atomic::{AtomicU64, Ordering::Relaxed}; +use wasmtime_environ::component::{ + CanonicalAbiInfo, DefinedResourceIndex, InterfaceType, TypeResourceTableIndex, +}; use wasmtime_runtime::component::{ComponentInstance, InstanceFlags, ResourceTables}; use wasmtime_runtime::{SendSyncPtr, VMFuncRef, ValRaw}; @@ -199,49 +203,334 @@ pub struct Resource { /// Dear rust please consider `T` used even though it's not actually used. _marker: marker::PhantomData T>, - /// Internal dynamic state tracking for this resource. This can be one of - /// four different states: - /// - /// * `BORROW` / `u32::MAX` - this indicates that this is a borrowed - /// resource. The `rep` doesn't live in the host table and this `Resource` - /// instance is transiently available. It's the host's responsibility to - /// discard this resource when the borrow duration has finished. - /// - /// * `NOT_IN_TABLE` / `u32::MAX - 1` - this indicates that this is an owned - /// resource not present in any store's table. This resource is not lent - /// out. It can be passed as an `(own $t)` directly into a guest's table - /// or it can be passed as a borrow to a guest which will insert it into - /// a host store's table for dynamic borrow tracking. - /// - /// * `TAKEN` / `u32::MAX - 2` - while the `rep` is available the resource - /// has been dynamically moved into a guest and cannot be moved in again. - /// This is used for example to prevent the same resource from being - /// passed twice to a guest. - /// - /// * All other values - any other value indicates that the value is an - /// index into a store's table of host resources. It's guaranteed that the - /// table entry represents a host resource and the resource may have - /// borrow tracking associated with it. - /// - /// Note that this is an `AtomicU32` but it's not intended to actually be - /// used in conjunction with threads as generally a `Store` lives on one - /// thread at a time. The `AtomicU32` here is used to ensure that this type - /// is `Send + Sync` when captured as a reference to make async programming - /// more ergonomic. - state: AtomicU32, + state: AtomicResourceState, } -// See comments on `state` above for info about these values. -const BORROW: u32 = u32::MAX; -const NOT_IN_TABLE: u32 = u32::MAX - 1; -const TAKEN: u32 = u32::MAX - 2; +/// Internal dynamic state tracking for this resource. This can be one of +/// four different states: +/// +/// * `BORROW` / `u64::MAX` - this indicates that this is a borrowed +/// resource. The `rep` doesn't live in the host table and this `Resource` +/// instance is transiently available. It's the host's responsibility to +/// discard this resource when the borrow duration has finished. +/// +/// * `NOT_IN_TABLE` / `u64::MAX - 1` - this indicates that this is an owned +/// resource not present in any store's table. This resource is not lent +/// out. It can be passed as an `(own $t)` directly into a guest's table +/// or it can be passed as a borrow to a guest which will insert it into +/// a host store's table for dynamic borrow tracking. +/// +/// * `TAKEN` / `u64::MAX - 2` - while the `rep` is available the resource +/// has been dynamically moved into a guest and cannot be moved in again. +/// This is used for example to prevent the same resource from being +/// passed twice to a guest. +/// +/// * All other values - any other value indicates that the value is an +/// index into a store's table of host resources. It's guaranteed that the +/// table entry represents a host resource and the resource may have +/// borrow tracking associated with it. The low 32-bits of the value are +/// the table index and the upper 32-bits are the generation. +/// +/// Note that this is an `AtomicU64` but it's not intended to actually be +/// used in conjunction with threads as generally a `Store` lives on one +/// thread at a time. The `AtomicU64` here is used to ensure that this type +/// is `Send + Sync` when captured as a reference to make async programming +/// more ergonomic. +struct AtomicResourceState(AtomicU64); + +#[derive(Debug, PartialEq, Eq, Copy, Clone)] +enum ResourceState { + Borrow, + NotInTable, + Taken, + Index(HostResourceIndex), +} + +impl AtomicResourceState { + const BORROW: Self = Self(AtomicU64::new(ResourceState::BORROW)); + const NOT_IN_TABLE: Self = Self(AtomicU64::new(ResourceState::NOT_IN_TABLE)); + + fn get(&self) -> ResourceState { + ResourceState::decode(self.0.load(Relaxed)) + } + + fn swap(&self, state: ResourceState) -> ResourceState { + ResourceState::decode(self.0.swap(state.encode(), Relaxed)) + } +} + +impl ResourceState { + // See comments on `state` above for info about these values. + const BORROW: u64 = u64::MAX; + const NOT_IN_TABLE: u64 = u64::MAX - 1; + const TAKEN: u64 = u64::MAX - 2; + + fn decode(bits: u64) -> ResourceState { + match bits { + Self::BORROW => Self::Borrow, + Self::NOT_IN_TABLE => Self::NotInTable, + Self::TAKEN => Self::Taken, + other => Self::Index(HostResourceIndex(other)), + } + } + + fn encode(&self) -> u64 { + match self { + Self::Borrow => Self::BORROW, + Self::NotInTable => Self::NOT_IN_TABLE, + Self::Taken => Self::TAKEN, + Self::Index(index) => index.0, + } + } +} + +/// Metadata tracking the state of resources within a `Store`. +/// +/// This is a borrowed structure created from a `Store` piecemeal from below. +/// The `ResourceTables` type holds most of the raw information and this +/// structure tacks on a reference to `HostResourceData` to track generation +/// numbers of host indices. +pub struct HostResourceTables<'a> { + tables: ResourceTables<'a>, + host_resource_data: &'a mut HostResourceData, +} + +/// Metadata for host-owned resources owned within a `Store`. +/// +/// This metadata is used to prevent the ABA problem with indices handed out as +/// part of `Resource` and `ResourceAny`. Those structures are `Copy` meaning +/// that it's easy to reuse them, possibly accidentally. To prevent issues in +/// the host Wasmtime attaches both an index (within `ResourceTables`) as well +/// as a 32-bit generation counter onto each `HostResourceIndex` which the host +/// actually holds in `Resource` and `ResourceAny`. +/// +/// This structure holds a list which is a parallel list to the "list of reps" +/// that's stored within `ResourceTables` elsewhere in the `Store`. This +/// parallel list holds the last known generation of each element in the table. +/// The generation is then compared on access to make sure it's the same. +/// +/// Whenever a slot in the table is allocated the `cur_generation` field is +/// pushed at the corresponding index of `generation_of_table_slot`. Whenever +/// a field is accessed the current value of `generation_of_table_slot` is +/// checked against the generation of the index. Whenever a slot is deallocated +/// the generation is incremented. Put together this means that any access of a +/// deallocated slot should deterministically provide an error. +#[derive(Default)] +pub struct HostResourceData { + cur_generation: u32, + generation_of_table_slot: Vec, +} + +/// Host representation of an index into a table slot. +/// +/// This is morally (u32, u32) but is encoded as a 64-bit integer. The low +/// 32-bits are the table index and the upper 32-bits are the generation +/// counter. +#[derive(PartialEq, Eq, Debug, Copy, Clone)] +#[repr(transparent)] +pub struct HostResourceIndex(u64); + +impl HostResourceIndex { + fn new(idx: u32, gen: u32) -> HostResourceIndex { + HostResourceIndex(u64::from(idx) | (u64::from(gen) << 32)) + } + + fn index(&self) -> u32 { + u32::try_from(self.0 & 0xffffffff).unwrap() + } + + fn gen(&self) -> u32 { + u32::try_from(self.0 >> 32).unwrap() + } +} + +impl<'a> HostResourceTables<'a> { + pub fn new_host(store: &'a mut StoreOpaque) -> HostResourceTables<'_> { + let (calls, host_table, host_resource_data) = store.component_resource_state(); + HostResourceTables::from_parts( + ResourceTables { + host_table: Some(host_table), + calls, + tables: None, + }, + host_resource_data, + ) + } + + pub fn from_parts( + tables: ResourceTables<'a>, + host_resource_data: &'a mut HostResourceData, + ) -> Self { + HostResourceTables { + tables, + host_resource_data, + } + } + + /// Lifts an `own` resource that resides in the host's tables at the `idx` + /// specified into its `rep`. + /// + /// This method additionally takes an `expected` type which the resource is + /// expected to have. All host resources are stored into a single table so + /// this is used to perform a runtime check to ensure that the resource + /// still has the same type as when it was originally inserted. + /// + /// # Errors + /// + /// Returns an error if `idx` doesn't point to a valid owned resource, if + /// `idx` can't be lifted as an `own` (e.g. it has active borrows), or if + /// the resource at `idx` does not have the type `expected`. + pub fn host_resource_lift_own(&mut self, idx: HostResourceIndex) -> Result { + let idx = self.validate_host_index(idx, true)?; + self.tables.resource_lift_own(None, idx) + } + + /// See [`HostResourceTables::host_resource_lift_own`]. + pub fn host_resource_lift_borrow(&mut self, idx: HostResourceIndex) -> Result { + let idx = self.validate_host_index(idx, false)?; + self.tables.resource_lift_borrow(None, idx) + } + + /// Lowers an `own` resource to be owned by the host. + /// + /// This returns a new index into the host's set of resource tables which + /// will point to the `rep` specified as well as recording that it has the + /// `ty` specified. The returned index is suitable for conversion into + /// either [`Resource`] or [`ResourceAny`]. + pub fn host_resource_lower_own(&mut self, rep: u32) -> HostResourceIndex { + let idx = self.tables.resource_lower_own(None, rep); + self.new_host_index(idx) + } + + /// See [`HostResourceTables::host_resource_lower_own`]. + pub fn host_resource_lower_borrow(&mut self, rep: u32) -> HostResourceIndex { + let idx = self.tables.resource_lower_borrow(None, rep); + self.new_host_index(idx) + } + + /// Validates that `idx` is still valid for the host tables, notably + /// ensuring that the generation listed in `idx` is the same as the + /// last recorded generation of the slot itself. + /// + /// The `is_removal` option indicates whether or not this table access will + /// end up removing the element from the host table. In such a situation the + /// current generation number is incremented. + fn validate_host_index(&mut self, idx: HostResourceIndex, is_removal: bool) -> Result { + let actual = usize::try_from(idx.index()).ok().and_then(|i| { + self.host_resource_data + .generation_of_table_slot + .get(i) + .copied() + }); + + // If `idx` is out-of-bounds then skip returning an error. In such a + // situation the operation that this is guarding will return a more + // precise error, such as a lift operation. + if let Some(actual) = actual { + if actual != idx.gen() { + bail!("host-owned resource is being used with the wrong type"); + } + } + + // Bump the current generation of this is a removal to ensure any + // future item placed in this slot can't be pointed to by the `idx` + // provided above. + if is_removal { + self.host_resource_data.cur_generation += 1; + } + + Ok(idx.index()) + } + + /// Creates a new `HostResourceIndex` which will point to the raw table + /// slot provided by `idx`. + /// + /// This will register metadata necessary to track the current generation + /// in the returned `HostResourceIndex` as well. + fn new_host_index(&mut self, idx: u32) -> HostResourceIndex { + let list = &mut self.host_resource_data.generation_of_table_slot; + let gen = self.host_resource_data.cur_generation; + match list.get_mut(idx as usize) { + Some(slot) => *slot = gen, + None => { + assert_eq!(idx as usize, list.len()); + list.push(gen); + } + } + + HostResourceIndex::new(idx, gen) + } + + /// Drops a host-owned resource from host tables. + /// + /// This method will attempt to interpret `idx` as pointing to either a + /// `borrow` or `own` resource with the `expected` type specified. This + /// method will then return the underlying `rep` if it points to an `own` + /// resource which can then be further processed for destruction. + /// + /// # Errors + /// + /// Returns an error if `idx` doesn't point to a valid resource, points to + /// an `own` with active borrows, or if it doesn't have the type `expected` + /// in the host tables. + pub fn host_resource_drop(&mut self, idx: HostResourceIndex) -> Result> { + let idx = self.validate_host_index(idx, true)?; + self.tables.resource_drop(None, idx) + } + + /// Lowers an `own` resource into the guest, converting the `rep` specified + /// into a guest-local index. + /// + /// The `ty` provided is which table to put this into. + pub fn guest_resource_lower_own(&mut self, rep: u32, ty: TypeResourceTableIndex) -> u32 { + self.tables.resource_lower_own(Some(ty), rep) + } + + /// Lowers a `borrow` resource into the guest, converting the `rep` + /// specified into a guest-local index. + /// + /// The `ty` provided is which table to put this into. + /// + /// Note that this cannot be used in isolation because lowering a borrow + /// into a guest has a special case where `rep` is returned directly if `ty` + /// belongs to the component being lowered into. That property must be + /// handled by the caller of this function. + pub fn guest_resource_lower_borrow(&mut self, rep: u32, ty: TypeResourceTableIndex) -> u32 { + self.tables.resource_lower_borrow(Some(ty), rep) + } + + /// Lifts an `own` resource from the `idx` specified from the table `ty`. + /// + /// This will lookup the appropriate table in the guest and return the `rep` + /// corresponding to `idx` if it's valid. + pub fn guest_resource_lift_own(&mut self, idx: u32, ty: TypeResourceTableIndex) -> Result { + self.tables.resource_lift_own(Some(ty), idx) + } + + /// Lifts a `borrow` resource from the `idx` specified from the table `ty`. + /// + /// This will lookup the appropriate table in the guest and return the `rep` + /// corresponding to `idx` if it's valid. + pub fn guest_resource_lift_borrow( + &mut self, + idx: u32, + ty: TypeResourceTableIndex, + ) -> Result { + self.tables.resource_lift_borrow(Some(ty), idx) + } + + /// Begins a call into the component instance, starting recording of + /// metadata related to resource borrowing. + #[inline] + pub fn enter_call(&mut self) { + self.tables.enter_call() + } -fn host_resource_tables(store: &mut StoreOpaque) -> ResourceTables<'_> { - let (calls, host_table) = store.component_calls_and_host_table(); - ResourceTables { - calls, - host_table: Some(host_table), - tables: None, + /// Completes a call into the component instance, validating that it's ok to + /// complete by ensuring the are no remaining active borrows. + #[inline] + pub fn exit_call(&mut self) -> Result<()> { + self.tables.exit_call() } } @@ -255,7 +544,7 @@ where /// `(borrow $t)` or `(own $t)`. pub fn new_own(rep: u32) -> Resource { Resource { - state: AtomicU32::new(NOT_IN_TABLE), + state: AtomicResourceState::NOT_IN_TABLE, rep, _marker: marker::PhantomData, } @@ -270,7 +559,7 @@ where /// embedder. pub fn new_borrow(rep: u32) -> Resource { Resource { - state: AtomicU32::new(BORROW), + state: AtomicResourceState::BORROW, rep, _marker: marker::PhantomData, } @@ -288,19 +577,19 @@ where /// borrowed resources have an owner somewhere else on the stack so can only /// be accessed, not destroyed. pub fn owned(&self) -> bool { - match self.state.load(Relaxed) { - BORROW => false, - _ => true, + match self.state.get() { + ResourceState::Borrow => false, + ResourceState::Taken | ResourceState::NotInTable | ResourceState::Index(_) => true, } } fn lower_to_index(&self, cx: &mut LowerContext<'_, U>, ty: InterfaceType) -> Result { match ty { InterfaceType::Own(t) => { - let rep = match self.state.load(Relaxed) { + let rep = match self.state.get() { // If this is a borrow resource then this is a dynamic // error on behalf of the embedder. - BORROW => { + ResourceState::Borrow => { bail!("cannot lower a `borrow` resource into an `own`") } @@ -308,32 +597,32 @@ where // dynamically transferring ownership to wasm. Record that // it's no longer present and then pass through the // representation. - NOT_IN_TABLE => { - let prev = self.state.swap(TAKEN, Relaxed); - assert_eq!(prev, NOT_IN_TABLE); + ResourceState::NotInTable => { + let prev = self.state.swap(ResourceState::Taken); + assert_eq!(prev, ResourceState::NotInTable); self.rep } // This resource has already been moved into wasm so this is // a dynamic error on behalf of the embedder. - TAKEN => bail!("host resource already consumed"), + ResourceState::Taken => bail!("host resource already consumed"), // If this resource lives in a host table then try to take // it out of the table, which may fail, and on success we // can move the rep into the guest table. - idx => cx.host_resource_lift_own(idx)?, + ResourceState::Index(idx) => cx.host_resource_lift_own(idx)?, }; Ok(cx.guest_resource_lower_own(t, rep)) } InterfaceType::Borrow(t) => { - let rep = match self.state.load(Relaxed) { + let rep = match self.state.get() { // If this is already a borrowed resource, nothing else to // do and the rep is passed through. - BORROW => self.rep, + ResourceState::Borrow => self.rep, // If this resource is already gone, that's a dynamic error // for the embedder. - TAKEN => bail!("host resource already consumed"), + ResourceState::Taken => bail!("host resource already consumed"), // If this resource is not currently in a table then it // needs to move into a table to participate in state @@ -342,16 +631,16 @@ where // state. // // Afterwards this is the same as the `idx` case below. - NOT_IN_TABLE => { + ResourceState::NotInTable => { let idx = cx.host_resource_lower_own(self.rep); - let prev = self.state.swap(idx, Relaxed); - assert_eq!(prev, NOT_IN_TABLE); + let prev = self.state.swap(ResourceState::Index(idx)); + assert_eq!(prev, ResourceState::NotInTable); cx.host_resource_lift_borrow(idx)? } // If this resource lives in a table then it needs to come // out of the table with borrow-tracking employed. - idx => cx.host_resource_lift_borrow(idx)?, + ResourceState::Index(idx) => cx.host_resource_lift_borrow(idx)?, }; Ok(cx.guest_resource_lower_borrow(t, rep)) } @@ -371,7 +660,7 @@ where let (rep, dtor, flags) = cx.guest_resource_lift_own(t, index)?; assert!(dtor.is_some()); assert!(flags.is_none()); - (AtomicU32::new(NOT_IN_TABLE), rep) + (AtomicResourceState::NOT_IN_TABLE, rep) } // The borrow here is lifted from the guest, but note the lack of @@ -384,7 +673,7 @@ where InterfaceType::Borrow(t) => { debug_assert!(cx.resource_type(t) == ResourceType::host::()); let rep = cx.guest_resource_lift_borrow(t, index)?; - (AtomicU32::new(BORROW), rep) + (AtomicResourceState::BORROW, rep) } _ => bad_type_info(), }; @@ -394,6 +683,58 @@ where _marker: marker::PhantomData, }) } + + /// Attempts to convert a [`ResourceAny`] into [`Resource`]. + /// + /// This method will check that `resource` has type + /// `ResourceType::host::()` and then convert it into a typed version of + /// the resource. + /// + /// # Errors + /// + /// This function will return an error if `resource` does not have type + /// `ResourceType::host::()`. This function may also return an error if + /// `resource` is no longer valid, for example it was previously converted. + /// + /// # Panics + /// + /// This function will panic if `resource` does not belong to the `store` + /// specified. + pub fn try_from_resource_any( + resource: ResourceAny, + mut store: impl AsContextMut, + ) -> Result { + let store = store.as_context_mut(); + let store_id = store.0.id(); + let mut tables = HostResourceTables::new_host(store.0); + let ResourceAny { idx, ty, own_state } = resource; + ensure!(ty == ResourceType::host::(), "resource type mismatch"); + let (state, rep) = if let Some(OwnState { store, dtor, flags }) = own_state { + assert_eq!(store_id, store, "wrong store used to convert resource"); + assert!(dtor.is_some(), "destructor must be set"); + assert!(flags.is_none(), "flags must not be set"); + let rep = tables.host_resource_lift_own(idx)?; + (AtomicResourceState::NOT_IN_TABLE, rep) + } else { + let rep = tables.host_resource_lift_borrow(idx)?; + (AtomicResourceState::BORROW, rep) + }; + Ok(Resource { + state, + rep, + _marker: marker::PhantomData, + }) + } + + /// See [`ResourceAny::try_from_resource`] + pub fn try_into_resource_any( + self, + store: impl AsContextMut, + instance: &InstancePre, + idx: ResourceImportIndex, + ) -> Result { + ResourceAny::try_from_resource(self, store, instance, idx) + } } unsafe impl ComponentType for Resource { @@ -451,11 +792,11 @@ unsafe impl Lift for Resource { impl fmt::Debug for Resource { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - let state = match self.state.load(Relaxed) { - BORROW => "borrow", - NOT_IN_TABLE => "own (not in table)", - TAKEN => "taken", - _ => "own", + let state = match self.state.get() { + ResourceState::Borrow => "borrow", + ResourceState::NotInTable => "own (not in table)", + ResourceState::Taken => "taken", + ResourceState::Index(_) => "own", }; f.debug_struct("Resource") .field("rep", &self.rep) @@ -470,9 +811,11 @@ impl fmt::Debug for Resource { /// This type is similar to [`Resource`] except that it can be used to represent /// any resource, either host or guest. This type cannot be directly constructed /// and is only available if the guest returns it to the host (e.g. a function -/// returning a guest-defined resource). This type also does not carry a static -/// type parameter `T` for example and does not have as much information about -/// its type. This means that it's possible to get runtime type-errors when +/// returning a guest-defined resource) or by a conversion from [`Resource`] via +/// [`ResourceAny::try_from_resource`]. +/// This type also does not carry a static type parameter `T` for example and +/// does not have as much information about its type. +/// This means that it's possible to get runtime type-errors when /// using this type because it cannot statically prevent mismatching resource /// types. /// @@ -488,7 +831,7 @@ impl fmt::Debug for Resource { /// used. #[derive(Debug, PartialEq, Eq, Copy, Clone)] pub struct ResourceAny { - idx: u32, + idx: HostResourceIndex, ty: ResourceType, own_state: Option, } @@ -501,6 +844,75 @@ struct OwnState { } impl ResourceAny { + /// Attempts to convert an imported [`Resource`] into [`ResourceAny`]. + /// + /// * `resource` is the resource to convert. + /// * `store` is the store to place the returned resource into. + /// * `instance_pre` is the instance from where `idx` below was derived. + /// * `idx` is the [`ResourceImportIndex`] returned by [`Linker::resource`]. + /// + /// [`Linker::resource`]: crate::component::LinkerInstance::resource + /// + /// # Errors + /// + /// This method will return an error if `idx` isn't valid for + /// `instance_pre` or if `resource` is not of the correct type for the + /// `idx` import. + pub fn try_from_resource( + resource: Resource, + mut store: impl AsContextMut, + instance_pre: &InstancePre, + idx: ResourceImportIndex, + ) -> Result { + let Resource { rep, state, .. } = resource; + let store = store.as_context_mut(); + let import = instance_pre + .resource_import(idx) + .context("import not found")?; + let RuntimeImport::Resource { + ty, dtor_funcref, .. + } = import + else { + bail!("import is not a resource") + }; + ensure!(*ty == ResourceType::host::(), "resource type mismatch"); + + let mut tables = HostResourceTables::new_host(store.0); + let (idx, own_state) = match state.get() { + ResourceState::Borrow => (tables.host_resource_lower_borrow(rep), None), + ResourceState::NotInTable => { + let idx = tables.host_resource_lower_own(rep); + ( + idx, + Some(OwnState { + dtor: Some(dtor_funcref.into()), + flags: None, + store: store.0.id(), + }), + ) + } + ResourceState::Taken => bail!("host resource already consumed"), + ResourceState::Index(idx) => ( + idx, + Some(OwnState { + dtor: Some(dtor_funcref.into()), + flags: None, + store: store.0.id(), + }), + ), + }; + Ok(Self { + idx, + ty: *ty, + own_state, + }) + } + + /// See [`Resource::try_from_resource_any`] + pub fn try_into_resource(self, store: impl AsContextMut) -> Result> { + Resource::try_from_resource_any(self, store) + } + /// Returns the corresponding type associated with this resource, either a /// host-defined type or a guest-defined type. /// @@ -538,7 +950,7 @@ impl ResourceAny { /// Same as [`ResourceAny::resource_drop`] except for use with async stores /// to execute the destructor asynchronously. #[cfg(feature = "async")] - #[cfg_attr(nightlydoc, doc(cfg(feature = "async")))] + #[cfg_attr(docsrs, doc(cfg(feature = "async")))] pub async fn resource_drop_async(self, mut store: impl AsContextMut) -> Result<()> where T: Send, @@ -558,7 +970,7 @@ impl ResourceAny { // // This could fail if the index is invalid or if this is removing an // `Own` entry which is currently being borrowed. - let rep = host_resource_tables(store.0).resource_drop(None, self.idx)?; + let rep = HostResourceTables::new_host(store.0).host_resource_drop(self.idx)?; let (rep, state) = match (rep, &self.own_state) { (Some(rep), Some(state)) => (rep, state), @@ -610,14 +1022,14 @@ impl ResourceAny { match ty { InterfaceType::Own(t) => { if cx.resource_type(t) != self.ty { - bail!("mismatched resource types") + bail!("mismatched resource types"); } let rep = cx.host_resource_lift_own(self.idx)?; Ok(cx.guest_resource_lower_own(t, rep)) } InterfaceType::Borrow(t) => { if cx.resource_type(t) != self.ty { - bail!("mismatched resource types") + bail!("mismatched resource types"); } let rep = cx.host_resource_lift_borrow(self.idx)?; Ok(cx.guest_resource_lower_borrow(t, rep)) diff --git a/crates/wasmtime/src/component/storage.rs b/crates/wasmtime/src/runtime/component/storage.rs similarity index 100% rename from crates/wasmtime/src/component/storage.rs rename to crates/wasmtime/src/runtime/component/storage.rs diff --git a/crates/wasmtime/src/component/store.rs b/crates/wasmtime/src/runtime/component/store.rs similarity index 100% rename from crates/wasmtime/src/component/store.rs rename to crates/wasmtime/src/runtime/component/store.rs diff --git a/crates/wasmtime/src/component/types.rs b/crates/wasmtime/src/runtime/component/types.rs similarity index 78% rename from crates/wasmtime/src/component/types.rs rename to crates/wasmtime/src/runtime/component/types.rs index f751079fa037..dd29efbedad9 100644 --- a/crates/wasmtime/src/component/types.rs +++ b/crates/wasmtime/src/runtime/component/types.rs @@ -2,15 +2,17 @@ use crate::component::matching::InstanceType; use crate::component::values::{self, Val}; +use crate::{Engine, ExternType, FuncType}; use anyhow::{anyhow, Result}; use std::fmt; use std::mem; use std::ops::Deref; use std::sync::Arc; use wasmtime_environ::component::{ - CanonicalAbiInfo, ComponentTypes, InterfaceType, ResourceIndex, TypeEnumIndex, TypeFlagsIndex, - TypeListIndex, TypeOptionIndex, TypeRecordIndex, TypeResourceTableIndex, TypeResultIndex, - TypeTupleIndex, TypeVariantIndex, + CanonicalAbiInfo, ComponentTypes, InterfaceType, ResourceIndex, TypeComponentIndex, + TypeComponentInstanceIndex, TypeDef, TypeEnumIndex, TypeFlagsIndex, TypeFuncIndex, + TypeListIndex, TypeModuleIndex, TypeOptionIndex, TypeRecordIndex, TypeResourceTableIndex, + TypeResultIndex, TypeTupleIndex, TypeVariantIndex, }; use wasmtime_environ::PrimaryMap; @@ -273,6 +275,7 @@ impl List { } /// A field declaration belonging to a `record` +#[derive(Debug)] pub struct Field<'a> { /// The name of the field pub name: &'a str, @@ -675,9 +678,16 @@ impl Type { } } - pub(crate) fn check(&self, value: &Val) -> Result<()> { + /// Checks whether type of `value` is a subtype of `self`. + /// + /// # Errors + /// + /// Returns an error in case of a type mismatch + pub(crate) fn is_supertype_of(&self, value: &Val) -> Result<()> { let other = &value.ty(); - if self == other { + if self == other + || matches!((self, other), (Self::Borrow(s), Self::Own(other)) if s == other) + { Ok(()) } else if mem::discriminant(self) != mem::discriminant(other) { Err(anyhow!( @@ -750,3 +760,190 @@ impl Type { } } } + +/// Component function type +#[derive(Clone, Debug)] +pub struct ComponentFunc(Handle); + +impl ComponentFunc { + pub(crate) fn from(index: TypeFuncIndex, ty: &InstanceType<'_>) -> Self { + Self(Handle::new(index, ty)) + } + + /// Iterates over types of function parameters + pub fn params(&self) -> impl ExactSizeIterator + '_ { + let params = self.0.types[self.0.index].params; + self.0.types[params] + .types + .iter() + .map(|ty| Type::from(ty, &self.0.instance())) + } + + /// Iterates over types of function results + pub fn results(&self) -> impl ExactSizeIterator + '_ { + let results = self.0.types[self.0.index].results; + self.0.types[results] + .types + .iter() + .map(|ty| Type::from(ty, &self.0.instance())) + } +} + +/// Core module type +#[derive(Clone, Debug)] +pub struct Module(Handle); + +impl Module { + pub(crate) fn from(index: TypeModuleIndex, ty: &InstanceType<'_>) -> Self { + Self(Handle::new(index, ty)) + } + + /// Iterates over imports of the module + pub fn imports<'a>( + &'a self, + engine: &'a Engine, + ) -> impl ExactSizeIterator + 'a { + self.0.types[self.0.index] + .imports + .iter() + .map(|((namespace, name), ty)| { + ( + (namespace.as_str(), name.as_str()), + ExternType::from_wasmtime(engine, self.0.types.module_types(), ty), + ) + }) + } + + /// Iterates over exports of the module + pub fn exports<'a>( + &'a self, + engine: &'a Engine, + ) -> impl ExactSizeIterator + 'a { + self.0.types[self.0.index].exports.iter().map(|(name, ty)| { + ( + name.as_str(), + ExternType::from_wasmtime(engine, self.0.types.module_types(), ty), + ) + }) + } +} + +/// Component type +#[derive(Clone, Debug)] +pub struct Component(Handle); + +impl Component { + pub(crate) fn from(index: TypeComponentIndex, ty: &InstanceType<'_>) -> Self { + Self(Handle::new(index, ty)) + } + + /// Returns import associated with `name`, if such exists in the component + pub fn get_import(&self, engine: &Engine, name: &str) -> Option { + self.0.types[self.0.index] + .imports + .get(name) + .map(|ty| ComponentItem::from(engine, ty, &self.0.instance())) + } + + /// Iterates over imports of the component + pub fn imports<'a>( + &'a self, + engine: &'a Engine, + ) -> impl ExactSizeIterator + 'a { + self.0.types[self.0.index].imports.iter().map(|(name, ty)| { + ( + name.as_str(), + ComponentItem::from(engine, ty, &self.0.instance()), + ) + }) + } + + /// Returns export associated with `name`, if such exists in the component + pub fn get_export(&self, engine: &Engine, name: &str) -> Option { + self.0.types[self.0.index] + .exports + .get(name) + .map(|ty| ComponentItem::from(engine, ty, &self.0.instance())) + } + + /// Iterates over exports of the component + pub fn exports<'a>( + &'a self, + engine: &'a Engine, + ) -> impl ExactSizeIterator + 'a { + self.0.types[self.0.index].exports.iter().map(|(name, ty)| { + ( + name.as_str(), + ComponentItem::from(engine, ty, &self.0.instance()), + ) + }) + } +} + +/// Component instance type +#[derive(Clone, Debug)] +pub struct ComponentInstance(Handle); + +impl ComponentInstance { + pub(crate) fn from(index: TypeComponentInstanceIndex, ty: &InstanceType<'_>) -> Self { + Self(Handle::new(index, ty)) + } + + /// Returns export associated with `name`, if such exists in the component instance + pub fn get_export(&self, engine: &Engine, name: &str) -> Option { + self.0.types[self.0.index] + .exports + .get(name) + .map(|ty| ComponentItem::from(engine, ty, &self.0.instance())) + } + + /// Iterates over exports of the component instance + pub fn exports<'a>( + &'a self, + engine: &'a Engine, + ) -> impl ExactSizeIterator { + self.0.types[self.0.index].exports.iter().map(|(name, ty)| { + ( + name.as_str(), + ComponentItem::from(engine, ty, &self.0.instance()), + ) + }) + } +} + +/// Type of an item contained within the component +#[derive(Clone, Debug)] +pub enum ComponentItem { + /// Component function item + ComponentFunc(ComponentFunc), + /// Core function item + CoreFunc(FuncType), + /// Core module item + Module(Module), + /// Component item + Component(Component), + /// Component instance item + ComponentInstance(ComponentInstance), + /// Interface type item + Type(Type), + /// Resource item + Resource(ResourceType), +} + +impl ComponentItem { + pub(crate) fn from(engine: &Engine, def: &TypeDef, ty: &InstanceType<'_>) -> Self { + match def { + TypeDef::Component(idx) => Self::Component(Component::from(*idx, ty)), + TypeDef::ComponentInstance(idx) => { + Self::ComponentInstance(ComponentInstance::from(*idx, ty)) + } + TypeDef::ComponentFunc(idx) => Self::ComponentFunc(ComponentFunc::from(*idx, ty)), + TypeDef::Interface(iface_ty) => Self::Type(Type::from(iface_ty, ty)), + TypeDef::Module(idx) => Self::Module(Module::from(*idx, ty)), + TypeDef::CoreFunc(idx) => { + Self::CoreFunc(FuncType::from_wasm_func_type(engine, &ty.types[*idx])) + } + TypeDef::Resource(idx) => Self::Resource(ty.resources[ty.types[*idx].ty]), + } + } +} diff --git a/crates/wasmtime/src/component/values.rs b/crates/wasmtime/src/runtime/component/values.rs similarity index 87% rename from crates/wasmtime/src/component/values.rs rename to crates/wasmtime/src/runtime/component/values.rs index 332a0659a875..52d08d120b87 100644 --- a/crates/wasmtime/src/component/values.rs +++ b/crates/wasmtime/src/runtime/component/values.rs @@ -13,7 +13,14 @@ use wasmtime_environ::component::{ CanonicalAbiInfo, ComponentTypes, InterfaceType, TypeListIndex, VariantInfo, }; -/// Represents runtime list values +/// Dynamic representation of `list` in the component model. +/// +/// This structure is part of the dynamically-typed [`Val`] which represents +/// all possible values in the component model. This is often used in +/// conjunction with [`Func::call`](crate::component::Func::call). +/// +/// Note that `Vec` is also supported for component model lists when +/// using [`TypedFunc`](crate::component::TypedFunc). #[derive(PartialEq, Eq, Clone)] pub struct List { ty: types::List, @@ -21,12 +28,17 @@ pub struct List { } impl List { - /// Instantiate the specified type with the specified `values`. + /// Creates a new list with the specified type with the specified `values`. + /// + /// # Errors + /// + /// Returns an error if any value in `values` does not have the element + /// type of `ty` specified. pub fn new(ty: &types::List, values: Box<[Val]>) -> Result { let element_type = ty.ty(); for (index, value) in values.iter().enumerate() { element_type - .check(value) + .is_supertype_of(value) .with_context(|| format!("type mismatch for element {index} of list"))?; } @@ -60,7 +72,15 @@ impl fmt::Debug for List { } } -/// Represents runtime record values +/// Dynamic representation of `record` in the component model. +/// +/// This structure is part of the dynamically-typed [`Val`] which represents +/// all possible values in the component model. This is often used in +/// conjunction with [`Func::call`](crate::component::Func::call). +/// +/// Note that records can also be mapped to Rust `struct`s through the +/// [`#[derive(ComponentType)]`](macro@crate::component::ComponentType) macro +/// and using [`TypedFunc`](crate::component::TypedFunc). #[derive(PartialEq, Eq, Clone)] pub struct Record { ty: types::Record, @@ -68,7 +88,15 @@ pub struct Record { } impl Record { - /// Instantiate the specified type with the specified `values`. + /// Creates a new record with the specified `ty` and the `values` for fields. + /// + /// Note that the `values` specified for fields must list fields in the + /// same order that the `ty` lists them in. + /// + /// # Errors + /// + /// Returns an error if any of the `values` specified are in the wrong order + /// field-wise or have the wrong type relative to what's specified in `ty`. pub fn new<'a>( ty: &types::Record, values: impl IntoIterator, @@ -83,7 +111,7 @@ impl Record { if name == field.name { field .ty - .check(&value) + .is_supertype_of(&value) .with_context(|| format!("type mismatch for field {name} of record"))?; values.push(value); @@ -111,8 +139,9 @@ impl Record { &self.ty } - /// Gets the value of the specified field `name` from this record. - pub fn fields(&self) -> impl Iterator { + /// Returns the list of fields that this struct contains with their name + /// and value. + pub fn fields(&self) -> impl ExactSizeIterator { assert_eq!(self.values.len(), self.ty.fields().len()); self.ty .fields() @@ -131,7 +160,14 @@ impl fmt::Debug for Record { } } -/// Represents runtime tuple values +/// Dynamic representation of `tuple<...>` in the component model. +/// +/// This structure is part of the dynamically-typed [`Val`] which represents +/// all possible values in the component model. This is often used in +/// conjunction with [`Func::call`](crate::component::Func::call). +/// +/// Note that tuples are also mapped to Rust tuples when using +/// [`TypedFunc`](crate::component::TypedFunc). #[derive(PartialEq, Eq, Clone)] pub struct Tuple { ty: types::Tuple, @@ -139,7 +175,13 @@ pub struct Tuple { } impl Tuple { - /// Instantiate the specified type ith the specified `values`. + /// Creates a new tuple with the `ty` specified and `values` for each + /// entry. + /// + /// # Errors + /// + /// Returns an error if `values` does not match the `ty` specified, such as + /// if it has the wrong length or if any field has the wrong type. pub fn new(ty: &types::Tuple, values: Box<[Val]>) -> Result { if values.len() != ty.types().len() { bail!( @@ -150,7 +192,7 @@ impl Tuple { } for (index, (value, ty)) in values.iter().zip(ty.types()).enumerate() { - ty.check(value) + ty.is_supertype_of(value) .with_context(|| format!("type mismatch for field {index} of tuple"))?; } @@ -181,7 +223,15 @@ impl fmt::Debug for Tuple { } } -/// Represents runtime variant values +/// Dynamic representation of `variant` in the component model. +/// +/// This structure is part of the dynamically-typed [`Val`] which represents +/// all possible values in the component model. This is often used in +/// conjunction with [`Func::call`](crate::component::Func::call). +/// +/// Note that variants can also be mapped to Rust `enum`s through the +/// [`#[derive(ComponentType)]`](macro@crate::component::ComponentType) macro +/// and using [`TypedFunc`](crate::component::TypedFunc). #[derive(PartialEq, Eq, Clone)] pub struct Variant { ty: types::Variant, @@ -190,7 +240,18 @@ pub struct Variant { } impl Variant { - /// Instantiate the specified type with the specified case `name` and `value`. + /// Creates a new variant with the specified `ty` and the case `name` and + /// `value` provided. + /// + /// This will create a instance of a variant with the case `name` which has + /// the optional payload of `value`. + /// + /// # Errors + /// + /// Returns an error if `name` doesn't match any case of `ty` or if + /// `value` is of the wrong type. Note that `ty` must match the payload + /// type exactly, in that if the case for `name` doesn't have a type then + /// `value` must be `None`. pub fn new(ty: &types::Variant, name: &str, value: Option) -> Result { let (discriminant, case_type) = ty .cases() @@ -256,7 +317,7 @@ impl Variant { fn typecheck_payload(name: &str, case_type: Option<&Type>, value: Option<&Val>) -> Result<()> { match (case_type, value) { (Some(expected), Some(actual)) => expected - .check(&actual) + .is_supertype_of(&actual) .with_context(|| format!("type mismatch for case {name} of variant")), (None, None) => Ok(()), (Some(_), None) => bail!("expected a payload for case `{name}`"), @@ -272,7 +333,15 @@ impl fmt::Debug for Variant { } } -/// Represents runtime enum values +/// Dynamic representation of `enum` in the component model. +/// +/// This structure is part of the dynamically-typed [`Val`] which represents +/// all possible values in the component model. This is often used in +/// conjunction with [`Func::call`](crate::component::Func::call). +/// +/// Note that enums can also be mapped to Rust `enum`s through the +/// [`#[derive(ComponentType)]`](macro@crate::component::ComponentType) macro +/// and using [`TypedFunc`](crate::component::TypedFunc). #[derive(PartialEq, Eq, Clone)] pub struct Enum { ty: types::Enum, @@ -280,7 +349,12 @@ pub struct Enum { } impl Enum { - /// Instantiate the specified type with the specified case `name`. + /// Creates a new enum value with the `ty` specified selecting the + /// specified variant called `name`. + /// + /// # Errors + /// + /// Returns an error if `name` isn't listed within `ty`. pub fn new(ty: &types::Enum, name: &str) -> Result { let discriminant = u32::try_from( ty.names() @@ -328,7 +402,14 @@ impl fmt::Debug for Enum { } } -/// Represents runtime option values +/// Dynamic representation of `option` in the component model. +/// +/// This structure is part of the dynamically-typed [`Val`] which represents +/// all possible values in the component model. This is often used in +/// conjunction with [`Func::call`](crate::component::Func::call). +/// +/// Note that options are also mapped to Rust `Option` when using +/// [`TypedFunc`](crate::component::TypedFunc). #[derive(PartialEq, Eq, Clone)] pub struct OptionVal { ty: types::OptionType, @@ -337,11 +418,18 @@ pub struct OptionVal { } impl OptionVal { - /// Instantiate the specified type with the specified `value`. + /// Creates a new value with the `ty` specified holding the payload `value`. + /// + /// # Errors + /// + /// Returns an error if `value` is `Some` and the payload has the wrong + /// type for `ty`. pub fn new(ty: &types::OptionType, value: Option) -> Result { let value = value .map(|value| { - ty.ty().check(&value).context("type mismatch for option")?; + ty.ty() + .is_supertype_of(&value) + .context("type mismatch for option")?; Ok::<_, Error>(value) }) @@ -388,7 +476,14 @@ impl fmt::Debug for OptionVal { } } -/// Represents runtime result values +/// Dynamic representation of `result` in the component model. +/// +/// This structure is part of the dynamically-typed [`Val`] which represents +/// all possible values in the component model. This is often used in +/// conjunction with [`Func::call`](crate::component::Func::call). +/// +/// Note that tuples are also mapped to Rust's `Result` when using +/// [`TypedFunc`](crate::component::TypedFunc). #[derive(PartialEq, Eq, Clone)] pub struct ResultVal { ty: types::ResultType, @@ -397,7 +492,14 @@ pub struct ResultVal { } impl ResultVal { - /// Instantiate the specified type with the specified `value`. + /// Creates a new `Result` from the specified `ty` and `value`. + /// + /// Note that the `value` uses `Option` for payloads to map to the + /// optional payload value of the component model within each variant. + /// + /// # Errors + /// + /// Returns an error if the `value` payload has the wrong type for `ty`. pub fn new(ty: &types::ResultType, value: Result, Option>) -> Result { Ok(Self { ty: ty.clone(), @@ -457,7 +559,15 @@ impl fmt::Debug for ResultVal { } } -/// Represents runtime flag values +/// Dynamic representation of `flags` in the component model. +/// +/// This structure is part of the dynamically-typed [`Val`] which represents +/// all possible values in the component model. This is often used in +/// conjunction with [`Func::call`](crate::component::Func::call). +/// +/// Note that flags can also be mapped to Rust structures through the +/// [`flags!`](crate::component::flags) macro and using +/// [`TypedFunc`](crate::component::TypedFunc). #[derive(PartialEq, Eq, Clone)] pub struct Flags { ty: types::Flags, @@ -466,7 +576,13 @@ pub struct Flags { } impl Flags { - /// Instantiate the specified type with the specified flag `names`. + /// Creates a new set of flags with the `ty` specified and the `names` as + /// members of the flags. + /// + /// # Errors + /// + /// An error is returned if any of `names` aren't present within the `ty` + /// specified. pub fn new(ty: &types::Flags, names: &[&str]) -> Result { let map = ty .names() diff --git a/crates/wasmtime/src/coredump.rs b/crates/wasmtime/src/runtime/coredump.rs similarity index 100% rename from crates/wasmtime/src/coredump.rs rename to crates/wasmtime/src/runtime/coredump.rs diff --git a/crates/jit/src/debug.rs b/crates/wasmtime/src/runtime/debug.rs similarity index 99% rename from crates/jit/src/debug.rs rename to crates/wasmtime/src/runtime/debug.rs index 06a7ffa1ac2b..4480c1ee7087 100644 --- a/crates/jit/src/debug.rs +++ b/crates/wasmtime/src/runtime/debug.rs @@ -8,7 +8,7 @@ use object::{ }; use std::mem::size_of; -pub fn create_gdbjit_image( +pub(crate) fn create_gdbjit_image( mut bytes: Vec, code_region: (*const u8, usize), ) -> Result, Error> { diff --git a/crates/wasmtime/src/externals.rs b/crates/wasmtime/src/runtime/externals.rs similarity index 100% rename from crates/wasmtime/src/externals.rs rename to crates/wasmtime/src/runtime/externals.rs diff --git a/crates/wasmtime/src/externals/global.rs b/crates/wasmtime/src/runtime/externals/global.rs similarity index 100% rename from crates/wasmtime/src/externals/global.rs rename to crates/wasmtime/src/runtime/externals/global.rs diff --git a/crates/wasmtime/src/externals/table.rs b/crates/wasmtime/src/runtime/externals/table.rs similarity index 98% rename from crates/wasmtime/src/externals/table.rs rename to crates/wasmtime/src/runtime/externals/table.rs index cbd688207d5d..b741beefd845 100644 --- a/crates/wasmtime/src/externals/table.rs +++ b/crates/wasmtime/src/runtime/externals/table.rs @@ -73,7 +73,7 @@ impl Table { Table::_new(store.as_context_mut().0, ty, init) } - #[cfg_attr(nightlydoc, doc(cfg(feature = "async")))] + #[cfg_attr(docsrs, doc(cfg(feature = "async")))] /// Async variant of [`Table::new`]. You must use this variant with /// [`Store`](`crate::Store`)s which have a /// [`ResourceLimiterAsync`](`crate::ResourceLimiterAsync`). @@ -151,7 +151,7 @@ impl Table { unsafe { match (*table).get(index)? { runtime::TableElement::FuncRef(f) => { - let func = Func::from_caller_checked_func_ref(store, f); + let func = Func::from_vm_func_ref(store, f); Some(Val::FuncRef(func)) } runtime::TableElement::ExternRef(None) => Some(Val::ExternRef(None)), @@ -239,7 +239,7 @@ impl Table { } } - #[cfg_attr(nightlydoc, doc(cfg(feature = "async")))] + #[cfg_attr(docsrs, doc(cfg(feature = "async")))] /// Async variant of [`Table::grow`]. Required when using a /// [`ResourceLimiterAsync`](`crate::ResourceLimiterAsync`). /// diff --git a/crates/wasmtime/src/func.rs b/crates/wasmtime/src/runtime/func.rs similarity index 96% rename from crates/wasmtime/src/func.rs rename to crates/wasmtime/src/runtime/func.rs index 3a23d51d4da7..b404e5fb9ba6 100644 --- a/crates/wasmtime/src/func.rs +++ b/crates/wasmtime/src/runtime/func.rs @@ -1,4 +1,5 @@ use crate::store::{StoreData, StoreOpaque, Stored}; +use crate::type_registry::RegisteredType; use crate::{ AsContext, AsContextMut, CallHook, Engine, Extern, FuncType, Instance, Module, StoreContext, StoreContextMut, Val, ValRaw, ValType, @@ -13,21 +14,20 @@ use std::ptr::{self, NonNull}; use std::sync::Arc; use wasmtime_runtime::{ ExportFunction, SendSyncPtr, StoreBox, VMArrayCallHostFuncContext, VMContext, VMFuncRef, - VMFunctionImport, VMNativeCallHostFuncContext, VMOpaqueContext, VMSharedSignatureIndex, + VMFunctionImport, VMNativeCallHostFuncContext, VMOpaqueContext, VMSharedTypeIndex, }; /// A WebAssembly function which can be called. /// -/// This type can represent either an exported function from a WebAssembly -/// module or a host-defined function which can be used to satisfy an import of -/// a module. [`Func`] and can be used to both instantiate an [`Instance`] as -/// well as be extracted from an [`Instance`]. +/// This type typically represents an exported function from a WebAssembly +/// module instance. In this case a [`Func`] belongs to an [`Instance`] and is +/// loaded from there. A [`Func`] may also represent a host function as well in +/// some cases, too. /// -/// [`Instance`]: crate::Instance -/// -/// A [`Func`] "belongs" to the store that it was originally created within. -/// Operations on a [`Func`] only work with the store it belongs to, and if -/// another store is passed in by accident then methods will panic. +/// Functions can be called in a few different ways, either synchronous or async +/// and either typed or untyped (more on this below). Note that host functions +/// are normally inserted directly into a [`Linker`](crate::Linker) rather than +/// using this directly, but both options are available. /// /// # `Func` and `async` /// @@ -148,6 +148,7 @@ use wasmtime_runtime::{ /// // Here we need to define the type signature of our `Double` function and /// // then wrap it up in a `Func` /// let double_type = wasmtime::FuncType::new( +/// store.engine(), /// [wasmtime::ValType::I32].iter().cloned(), /// [wasmtime::ValType::I32].iter().cloned(), /// ); @@ -284,7 +285,7 @@ macro_rules! generate_wrap_async_func { /// This function will panic if called with a non-asynchronous store. #[allow(non_snake_case)] #[cfg(feature = "async")] - #[cfg_attr(nightlydoc, doc(cfg(feature = "async")))] + #[cfg_attr(docsrs, doc(cfg(feature = "async")))] pub fn []( store: impl AsContextMut, func: impl for<'a> Fn(Caller<'a, T>, $($args),*) -> Box + Send + 'a> + Send + Sync + 'static, @@ -356,7 +357,7 @@ impl Func { /// /// [`Trap`]: crate::Trap #[cfg(any(feature = "cranelift", feature = "winch"))] - #[cfg_attr(nightlydoc, doc(cfg(any(feature = "cranelift", feature = "winch"))))] + #[cfg_attr(docsrs, doc(cfg(any(feature = "cranelift", feature = "winch"))))] pub fn new( store: impl AsContextMut, ty: FuncType, @@ -394,7 +395,7 @@ impl Func { /// the `func` provided correctly interprets the argument types provided to /// it, or that the results it produces will be of the correct type. #[cfg(any(feature = "cranelift", feature = "winch"))] - #[cfg_attr(nightlydoc, doc(cfg(any(feature = "cranelift", feature = "winch"))))] + #[cfg_attr(docsrs, doc(cfg(any(feature = "cranelift", feature = "winch"))))] pub unsafe fn new_unchecked( mut store: impl AsContextMut, ty: FuncType, @@ -459,6 +460,7 @@ impl Func { /// // ... /// }); /// let get_row_count_type = wasmtime::FuncType::new( + /// &engine, /// None, /// Some(wasmtime::ValType::I32), /// ); @@ -474,7 +476,7 @@ impl Func { /// # } /// ``` #[cfg(all(feature = "async", feature = "cranelift"))] - #[cfg_attr(nightlydoc, doc(cfg(all(feature = "async", feature = "cranelift"))))] + #[cfg_attr(docsrs, doc(cfg(all(feature = "async", feature = "cranelift"))))] pub fn new_async(store: impl AsContextMut, ty: FuncType, func: F) -> Func where F: for<'a> Fn( @@ -505,12 +507,12 @@ impl Func { }) } - pub(crate) unsafe fn from_caller_checked_func_ref( + pub(crate) unsafe fn from_vm_func_ref( store: &mut StoreOpaque, raw: *mut VMFuncRef, ) -> Option { let func_ref = NonNull::new(raw)?; - debug_assert!(func_ref.as_ref().type_index != VMSharedSignatureIndex::default()); + debug_assert!(func_ref.as_ref().type_index != VMSharedTypeIndex::default()); let export = ExportFunction { func_ref }; Some(Func::from_wasmtime_function(export, store)) } @@ -768,13 +770,7 @@ impl Func { /// Note that this is a somewhat expensive method since it requires taking a /// lock as well as cloning a type. fn load_ty(&self, store: &StoreOpaque) -> FuncType { - FuncType::from_wasm_func_type( - store - .engine() - .signatures() - .lookup_type(self.sig_index(store.store_data())) - .expect("signature should be registered"), - ) + FuncType::from_shared_type_index(store.engine(), self.type_index(store.store_data())) } /// Gets a reference to the `FuncType` for this function. @@ -795,7 +791,7 @@ impl Func { (store.store_data()[self.0].ty.as_ref().unwrap(), store) } - pub(crate) fn sig_index(&self, data: &StoreData) -> VMSharedSignatureIndex { + pub(crate) fn type_index(&self, data: &StoreData) -> VMSharedTypeIndex { data[self.0].sig_index() } @@ -932,7 +928,7 @@ impl Func { /// caller must guarantee that `raw` is owned by the `store` provided and is /// valid within the `store`. pub unsafe fn from_raw(mut store: impl AsContextMut, raw: *mut c_void) -> Option { - Func::from_caller_checked_func_ref(store.as_context_mut().0, raw.cast()) + Func::from_vm_func_ref(store.as_context_mut().0, raw.cast()) } /// Extracts the raw value of this `Func`, which is owned by `store`. @@ -976,7 +972,7 @@ impl Func { /// only works with functions defined within an asynchronous store. Also /// panics if `store` does not own this function. #[cfg(feature = "async")] - #[cfg_attr(nightlydoc, doc(cfg(feature = "async")))] + #[cfg_attr(docsrs, doc(cfg(feature = "async")))] pub async fn call_async( &self, mut store: impl AsContextMut, @@ -1135,7 +1131,7 @@ impl Func { // trampoline. let _ = VMNativeCallHostFuncContext::from_opaque(f.as_ref().vmctx); - let sig = self.sig_index(store.store_data()); + let sig = self.type_index(store.store_data()); module.runtime_info().wasm_to_native_trampoline(sig).expect( "must have a wasm-to-native trampoline for this signature if the Wasm \ module is importing a function of this signature", @@ -1416,7 +1412,7 @@ fn enter_wasm(store: &mut StoreContextMut<'_, T>) -> Option { return None; } - let stack_pointer = stack_pointer(); + let stack_pointer = wasmtime_runtime::get_stack_pointer(); // Determine the stack pointer where, after which, any wasm code will // immediately trap. This is checked on the entry to all wasm functions. @@ -1443,43 +1439,6 @@ fn enter_wasm(store: &mut StoreContextMut<'_, T>) -> Option { Some(prev_stack) } -#[inline] -fn stack_pointer() -> usize { - let stack_pointer: usize; - cfg_if::cfg_if! { - if #[cfg(target_arch = "x86_64")] { - unsafe { - std::arch::asm!( - "mov {}, rsp", - out(reg) stack_pointer, - options(nostack,nomem), - ); - } - } else if #[cfg(target_arch = "aarch64")] { - unsafe { - std::arch::asm!( - "mov {}, sp", - out(reg) stack_pointer, - options(nostack,nomem), - ); - } - } else if #[cfg(target_arch = "riscv64")] { - unsafe { - std::arch::asm!( - "mv {}, sp", - out(reg) stack_pointer, - options(nostack,nomem), - ); - } - } else if #[cfg(target_arch = "s390x")] { - stack_pointer = psm::stack_pointer() as usize; - } else { - compile_error!("unsupported platform"); - } - } - stack_pointer -} - fn exit_wasm(store: &mut StoreContextMut<'_, T>, prev_stack: Option) { // If we don't have a previous stack pointer to restore, then there's no // cleanup we need to perform here. @@ -1526,7 +1485,7 @@ pub unsafe trait WasmRet { ) -> Result; #[doc(hidden)] - fn func_type(params: impl Iterator) -> FuncType; + fn func_type(engine: &Engine, params: impl Iterator) -> FuncType; #[doc(hidden)] unsafe fn wrap_trampoline(ptr: *mut ValRaw, f: impl FnOnce(Self::Retptr) -> Self::Abi); @@ -1558,8 +1517,8 @@ where Ok(::into_abi(self, store)) } - fn func_type(params: impl Iterator) -> FuncType { - FuncType::new(params, Some(::valtype())) + fn func_type(engine: &Engine, params: impl Iterator) -> FuncType { + FuncType::new(engine, params, Some(::valtype())) } unsafe fn wrap_trampoline(ptr: *mut ValRaw, f: impl FnOnce(Self::Retptr) -> Self::Abi) { @@ -1598,8 +1557,8 @@ where self.and_then(|val| val.into_abi_for_ret(store, retptr)) } - fn func_type(params: impl Iterator) -> FuncType { - T::func_type(params) + fn func_type(engine: &Engine, params: impl Iterator) -> FuncType { + T::func_type(engine, params) } unsafe fn wrap_trampoline(ptr: *mut ValRaw, f: impl FnOnce(Self::Retptr) -> Self::Abi) { @@ -1640,8 +1599,9 @@ macro_rules! impl_wasm_host_results { Ok(<($($t::Abi,)*) as HostAbi>::into_abi(abi, ptr)) } - fn func_type(params: impl Iterator) -> FuncType { + fn func_type(engine: &Engine, params: impl Iterator) -> FuncType { FuncType::new( + engine, params, IntoIterator::into_iter([$($t::valtype(),)*]), ) @@ -1931,6 +1891,17 @@ impl AsContextMut for Caller<'_, T> { } } +// State stored inside a `VMNativeCallHostFuncContext`. +struct HostFuncState { + // The actual host function. + func: F, + + // NB: We have to keep our `VMSharedTypeIndex` registered in the engine for + // as long as this function exists. + #[allow(dead_code)] + ty: RegisteredType, +} + macro_rules! impl_into_func { ($num:tt $($args:ident)*) => { // Implement for functions without a leading `&Caller` parameter, @@ -1999,8 +1970,9 @@ macro_rules! impl_into_func { // Double-check ourselves in debug mode, but we control // the `Any` here so an unsafe downcast should also // work. - debug_assert!(state.is::()); - let func = &*(state as *const _ as *const F); + debug_assert!(state.is::>()); + let state = &*(state as *const _ as *const HostFuncState); + let func = &state.func; let ret = { panic::catch_unwind(AssertUnwindSafe(|| { @@ -2083,11 +2055,11 @@ macro_rules! impl_into_func { } let ty = R::func_type( + engine, None::.into_iter() $(.chain(Some($args::valtype())))* ); - - let shared_signature_id = engine.signatures().register(ty.as_wasm_func_type()); + let type_index = ty.type_index(); let array_call = array_call_trampoline::; let native_call = NonNull::new(native_call_shim:: as *mut _).unwrap(); @@ -2098,10 +2070,13 @@ macro_rules! impl_into_func { native_call, array_call, wasm_call: None, - type_index: shared_signature_id, + type_index, vmctx: ptr::null_mut(), }, - Box::new(self), + Box::new(HostFuncState { + func: self, + ty: ty.into_registered_type(), + }), ) }; @@ -2272,7 +2247,7 @@ impl HostFunc { ); } - pub(crate) fn sig_index(&self) -> VMSharedSignatureIndex { + pub(crate) fn sig_index(&self) -> VMSharedTypeIndex { self.func_ref().type_index } @@ -2294,21 +2269,13 @@ impl HostFunc { } } -impl Drop for HostFunc { - fn drop(&mut self) { - unsafe { - self.engine.signatures().unregister(self.sig_index()); - } - } -} - impl FuncData { #[inline] fn export(&self) -> ExportFunction { self.kind.export() } - pub(crate) fn sig_index(&self) -> VMSharedSignatureIndex { + pub(crate) fn sig_index(&self) -> VMSharedTypeIndex { unsafe { self.export().func_ref.as_ref().type_index } } } diff --git a/crates/wasmtime/src/func/typed.rs b/crates/wasmtime/src/runtime/func/typed.rs similarity index 96% rename from crates/wasmtime/src/func/typed.rs rename to crates/wasmtime/src/runtime/func/typed.rs index f1188faad4aa..df03653333e6 100644 --- a/crates/wasmtime/src/func/typed.rs +++ b/crates/wasmtime/src/runtime/func/typed.rs @@ -6,7 +6,7 @@ use std::marker; use std::mem::{self, MaybeUninit}; use std::ptr::{self, NonNull}; use wasmtime_runtime::{ - VMContext, VMFuncRef, VMNativeCallFunction, VMOpaqueContext, VMSharedSignatureIndex, + VMContext, VMFuncRef, VMNativeCallFunction, VMOpaqueContext, VMSharedTypeIndex, }; /// A statically typed WebAssembly function. @@ -106,7 +106,7 @@ where /// /// [`Trap`]: crate::Trap #[cfg(feature = "async")] - #[cfg_attr(nightlydoc, doc(cfg(feature = "async")))] + #[cfg_attr(docsrs, doc(cfg(feature = "async")))] pub async fn call_async( &self, mut store: impl AsContextMut, @@ -189,14 +189,8 @@ where } /// Purely a debug-mode assertion, not actually used in release builds. - fn debug_typecheck(store: &StoreOpaque, func: VMSharedSignatureIndex) { - let ty = FuncType::from_wasm_func_type( - store - .engine() - .signatures() - .lookup_type(func) - .expect("signature should be registered"), - ); + fn debug_typecheck(store: &StoreOpaque, func: VMSharedTypeIndex) { + let ty = FuncType::from_shared_type_index(store.engine(), func); Params::typecheck(ty.params()).expect("params should match"); Results::typecheck(ty.results()).expect("results should match"); } @@ -239,7 +233,7 @@ pub unsafe trait WasmTy: Send { } macro_rules! integers { - ($($primitive:ident/$get_primitive:ident => $ty:ident in $raw:ident)*) => ($( + ($($primitive:ident/$get_primitive:ident => $ty:ident)*) => ($( unsafe impl WasmTy for $primitive { type Abi = $primitive; #[inline] @@ -275,10 +269,10 @@ macro_rules! integers { } integers! { - i32/get_i32 => I32 in i32 - i64/get_i64 => I64 in i64 - u32/get_u32 => I32 in i32 - u64/get_u64 => I64 in i64 + i32/get_i32 => I32 + i64/get_i64 => I64 + u32/get_u32 => I32 + u64/get_u64 => I64 } macro_rules! floats { @@ -447,7 +441,7 @@ unsafe impl WasmTy for Option { #[inline] unsafe fn from_abi(abi: Self::Abi, store: &mut StoreOpaque) -> Self { - Func::from_caller_checked_func_ref(store, abi) + Func::from_vm_func_ref(store, abi) } } diff --git a/crates/wasmtime/src/instance.rs b/crates/wasmtime/src/runtime/instance.rs similarity index 93% rename from crates/wasmtime/src/instance.rs rename to crates/wasmtime/src/runtime/instance.rs index af070727af1b..914dba8b0e81 100644 --- a/crates/wasmtime/src/instance.rs +++ b/crates/wasmtime/src/runtime/instance.rs @@ -2,14 +2,16 @@ use crate::linker::{Definition, DefinitionType}; use crate::store::{InstanceId, StoreOpaque, Stored}; use crate::types::matching; use crate::{ - AsContextMut, Engine, Export, Extern, Func, Global, Memory, Module, SharedMemory, StoreContext, - StoreContextMut, Table, TypedFunc, + AsContextMut, Engine, Export, Extern, Func, Global, Memory, Module, ModuleExport, SharedMemory, + StoreContext, StoreContextMut, Table, TypedFunc, }; use anyhow::{anyhow, bail, Context, Result}; use std::mem; use std::ptr::NonNull; use std::sync::Arc; -use wasmtime_environ::{EntityType, FuncIndex, GlobalIndex, MemoryIndex, PrimaryMap, TableIndex}; +use wasmtime_environ::{ + EntityIndex, EntityType, FuncIndex, GlobalIndex, MemoryIndex, PrimaryMap, TableIndex, +}; use wasmtime_runtime::{ Imports, InstanceAllocationRequest, StorePtr, VMContext, VMFuncRef, VMFunctionImport, VMGlobalImport, VMMemoryImport, VMNativeCallFunction, VMOpaqueContext, VMTableImport, @@ -142,7 +144,7 @@ impl Instance { /// This function will also panic, like [`Instance::new`], if any [`Extern`] /// specified does not belong to `store`. #[cfg(feature = "async")] - #[cfg_attr(nightlydoc, doc(cfg(feature = "async")))] + #[cfg_attr(docsrs, doc(cfg(feature = "async")))] pub async fn new_async( mut store: impl AsContextMut, module: &Module, @@ -395,8 +397,16 @@ impl Instance { let InstanceData { exports, id, .. } = &store[self.0]; if exports.iter().any(|e| e.is_none()) { let module = Arc::clone(store.instance(*id).module()); + let data = &store[self.0]; + let id = data.id; + for name in module.exports.keys() { - self._get_export(store, name); + let instance = store.instance(id); + if let Some((export_name_index, _, &entity)) = + instance.module().exports.get_full(name) + { + self._get_export(store, entity, export_name_index); + } } } @@ -427,26 +437,60 @@ impl Instance { /// instantiating a module faster, but also means this method requires a /// mutable context. pub fn get_export(&self, mut store: impl AsContextMut, name: &str) -> Option { - self._get_export(store.as_context_mut().0, name) + let store = store.as_context_mut().0; + let data = &store[self.0]; + let instance = store.instance(data.id); + let (export_name_index, _, &entity) = instance.module().exports.get_full(name)?; + self._get_export(store, entity, export_name_index) + } + + /// Looks up an exported [`Extern`] value by a [`ModuleExport`] value. + /// + /// This is similar to [`Instance::get_export`] but uses a [`ModuleExport`] value to avoid + /// string lookups where possible. [`ModuleExport`]s can be obtained by calling + /// [`Module::get_export_index`] on the [`Module`] that this instance was instantiated with. + /// + /// This method will search the module for an export with a matching entity index and return + /// the value, if found. + /// + /// Returns `None` if there was no export with a matching entity index. + /// # Panics + /// + /// Panics if `store` does not own this instance. + pub fn get_module_export( + &self, + mut store: impl AsContextMut, + export: &ModuleExport, + ) -> Option { + let store = store.as_context_mut().0; + + // Verify the `ModuleExport` matches the module used in this instance. + if self._module(store).id() != export.module { + return None; + } + + self._get_export(store, export.entity, export.export_name_index) } - fn _get_export(&self, store: &mut StoreOpaque, name: &str) -> Option { + fn _get_export( + &self, + store: &mut StoreOpaque, + entity: EntityIndex, + export_name_index: usize, + ) -> Option { // Instantiated instances will lazily fill in exports, so we process // all that lazy logic here. let data = &store[self.0]; - let instance = store.instance(data.id); - let (i, _, &index) = instance.module().exports.get_full(name)?; - if let Some(export) = &data.exports[i] { + if let Some(export) = &data.exports[export_name_index] { return Some(export.clone()); } - let id = data.id; - let instance = store.instance_mut(id); // reborrow the &mut Instancehandle + let instance = store.instance_mut(data.id); // Reborrow the &mut InstanceHandle let item = - unsafe { Extern::from_wasmtime_export(instance.get_export_by_index(index), store) }; + unsafe { Extern::from_wasmtime_export(instance.get_export_by_index(entity), store) }; let data = &mut store[self.0]; - data.exports[i] = Some(item.clone()); + data.exports[export_name_index] = Some(item.clone()); Some(item) } @@ -836,7 +880,7 @@ impl InstancePre { /// Panics if any import closed over by this [`InstancePre`] isn't owned by /// `store`, or if `store` does not have async support enabled. #[cfg(feature = "async")] - #[cfg_attr(nightlydoc, doc(cfg(feature = "async")))] + #[cfg_attr(docsrs, doc(cfg(feature = "async")))] pub async fn instantiate_async( &self, mut store: impl AsContextMut, diff --git a/crates/wasmtime/src/runtime/instantiate.rs b/crates/wasmtime/src/runtime/instantiate.rs new file mode 100644 index 000000000000..ee9d364076c9 --- /dev/null +++ b/crates/wasmtime/src/runtime/instantiate.rs @@ -0,0 +1,433 @@ +//! Define the `instantiate` function, which takes a byte array containing an +//! encoded wasm module and returns a live wasm instance. Also, define +//! `CompiledModule` to allow compiling and instantiating to be done as separate +//! steps. + +use crate::{code_memory::CodeMemory, profiling_agent::ProfilingAgent}; +use anyhow::{Error, Result}; +use object::write::WritableBuffer; +use std::convert::TryFrom; +use std::ops::Range; +use std::str; +use std::sync::Arc; +use wasmtime_environ::{ + CompiledFunctionInfo, CompiledModuleInfo, DefinedFuncIndex, FinishedObject, FuncIndex, + FunctionLoc, FunctionName, Metadata, Module, ModuleInternedTypeIndex, ObjectBuilder, + PrimaryMap, StackMapInformation, WasmFunctionInfo, +}; +use wasmtime_runtime::{CompiledModuleId, CompiledModuleIdAllocator, MmapVec}; + +/// A compiled wasm module, ready to be instantiated. +pub struct CompiledModule { + module: Arc, + funcs: PrimaryMap, + wasm_to_native_trampolines: Vec<(ModuleInternedTypeIndex, FunctionLoc)>, + meta: Metadata, + code_memory: Arc, + #[cfg(feature = "debug-builtins")] + dbg_jit_registration: Option, + /// A unique ID used to register this module with the engine. + unique_id: CompiledModuleId, + func_names: Vec, +} + +impl CompiledModule { + /// Creates `CompiledModule` directly from a precompiled artifact. + /// + /// The `code_memory` argument is expected to be the result of a previous + /// call to `ObjectBuilder::finish` above. This is an ELF image, at this + /// time, which contains all necessary information to create a + /// `CompiledModule` from a compilation. + /// + /// This method also takes `info`, an optionally-provided deserialization + /// of the artifacts' compilation metadata section. If this information is + /// not provided then the information will be + /// deserialized from the image of the compilation artifacts. Otherwise it + /// will be assumed to be what would otherwise happen if the section were + /// to be deserialized. + /// + /// The `profiler` argument here is used to inform JIT profiling runtimes + /// about new code that is loaded. + pub fn from_artifacts( + code_memory: Arc, + info: CompiledModuleInfo, + profiler: &dyn ProfilingAgent, + id_allocator: &CompiledModuleIdAllocator, + ) -> Result { + let mut ret = Self { + module: Arc::new(info.module), + funcs: info.funcs, + wasm_to_native_trampolines: info.wasm_to_native_trampolines, + #[cfg(feature = "debug-builtins")] + dbg_jit_registration: None, + code_memory, + meta: info.meta, + unique_id: id_allocator.alloc(), + func_names: info.func_names, + }; + ret.register_debug_and_profiling(profiler)?; + + Ok(ret) + } + + fn register_debug_and_profiling(&mut self, profiler: &dyn ProfilingAgent) -> Result<()> { + #[cfg(feature = "debug-builtins")] + if self.meta.native_debug_info_present { + use anyhow::Context; + + let text = self.text(); + let bytes = crate::debug::create_gdbjit_image( + self.mmap().to_vec(), + (text.as_ptr(), text.len()), + ) + .context("failed to create jit image for gdb")?; + let reg = wasmtime_runtime::GdbJitImageRegistration::register(bytes); + self.dbg_jit_registration = Some(reg); + } + profiler.register_module(&self.code_memory.mmap()[..], &|addr| { + let (idx, _) = self.func_by_text_offset(addr)?; + let idx = self.module.func_index(idx); + let name = self.func_name(idx)?; + let mut demangled = String::new(); + wasmtime_environ::demangle_function_name(&mut demangled, name).unwrap(); + Some(demangled) + }); + Ok(()) + } + + /// Get this module's unique ID. It is unique with respect to a + /// single allocator (which is ordinarily held on a Wasm engine). + pub fn unique_id(&self) -> CompiledModuleId { + self.unique_id + } + + /// Returns the underlying memory which contains the compiled module's + /// image. + pub fn mmap(&self) -> &MmapVec { + self.code_memory.mmap() + } + + /// Returns the underlying owned mmap of this compiled image. + pub fn code_memory(&self) -> &Arc { + &self.code_memory + } + + /// Returns the text section of the ELF image for this compiled module. + /// + /// This memory should have the read/execute permissions. + #[inline] + pub fn text(&self) -> &[u8] { + self.code_memory.text() + } + + /// Return a reference-counting pointer to a module. + pub fn module(&self) -> &Arc { + &self.module + } + + /// Looks up the `name` section name for the function index `idx`, if one + /// was specified in the original wasm module. + pub fn func_name(&self, idx: FuncIndex) -> Option<&str> { + // Find entry for `idx`, if present. + let i = self.func_names.binary_search_by_key(&idx, |n| n.idx).ok()?; + let name = &self.func_names[i]; + + // Here we `unwrap` the `from_utf8` but this can theoretically be a + // `from_utf8_unchecked` if we really wanted since this section is + // guaranteed to only have valid utf-8 data. Until it's a problem it's + // probably best to double-check this though. + let data = self.code_memory().func_name_data(); + Some(str::from_utf8(&data[name.offset as usize..][..name.len as usize]).unwrap()) + } + + /// Return a reference to a mutable module (if possible). + pub fn module_mut(&mut self) -> Option<&mut Module> { + Arc::get_mut(&mut self.module) + } + + /// Returns an iterator over all functions defined within this module with + /// their index and their body in memory. + #[inline] + pub fn finished_functions( + &self, + ) -> impl ExactSizeIterator + '_ { + self.funcs + .iter() + .map(move |(i, _)| (i, self.finished_function(i))) + } + + /// Returns the body of the function that `index` points to. + #[inline] + pub fn finished_function(&self, index: DefinedFuncIndex) -> &[u8] { + let loc = self.funcs[index].wasm_func_loc; + &self.text()[loc.start as usize..][..loc.length as usize] + } + + /// Get the array-to-Wasm trampoline for the function `index` points to. + /// + /// If the function `index` points to does not escape, then `None` is + /// returned. + /// + /// These trampolines are used for array callers (e.g. `Func::new`) + /// calling Wasm callees. + pub fn array_to_wasm_trampoline(&self, index: DefinedFuncIndex) -> Option<&[u8]> { + let loc = self.funcs[index].array_to_wasm_trampoline?; + Some(&self.text()[loc.start as usize..][..loc.length as usize]) + } + + /// Get the native-to-Wasm trampoline for the function `index` points to. + /// + /// If the function `index` points to does not escape, then `None` is + /// returned. + /// + /// These trampolines are used for native callers (e.g. `Func::wrap`) + /// calling Wasm callees. + #[inline] + pub fn native_to_wasm_trampoline(&self, index: DefinedFuncIndex) -> Option<&[u8]> { + let loc = self.funcs[index].native_to_wasm_trampoline?; + Some(&self.text()[loc.start as usize..][..loc.length as usize]) + } + + /// Get the Wasm-to-native trampoline for the given signature. + /// + /// These trampolines are used for filling in + /// `VMFuncRef::wasm_call` for `Func::wrap`-style host funcrefs + /// that don't have access to a compiler when created. + pub fn wasm_to_native_trampoline(&self, signature: ModuleInternedTypeIndex) -> &[u8] { + let idx = self + .wasm_to_native_trampolines + .binary_search_by_key(&signature, |entry| entry.0) + .expect("should have a Wasm-to-native trampline for all signatures"); + let (_, loc) = self.wasm_to_native_trampolines[idx]; + &self.text()[loc.start as usize..][..loc.length as usize] + } + + /// Returns the stack map information for all functions defined in this + /// module. + /// + /// The iterator returned iterates over the span of the compiled function in + /// memory with the stack maps associated with those bytes. + pub fn stack_maps(&self) -> impl Iterator { + self.finished_functions().map(|(_, f)| f).zip( + self.funcs + .values() + .map(|f| &f.wasm_func_info.stack_maps[..]), + ) + } + + /// Lookups a defined function by a program counter value. + /// + /// Returns the defined function index and the relative address of + /// `text_offset` within the function itself. + pub fn func_by_text_offset(&self, text_offset: usize) -> Option<(DefinedFuncIndex, u32)> { + let text_offset = u32::try_from(text_offset).unwrap(); + + let index = match self.funcs.binary_search_values_by_key(&text_offset, |e| { + debug_assert!(e.wasm_func_loc.length > 0); + // Return the inclusive "end" of the function + e.wasm_func_loc.start + e.wasm_func_loc.length - 1 + }) { + Ok(k) => { + // Exact match, pc is at the end of this function + k + } + Err(k) => { + // Not an exact match, k is where `pc` would be "inserted" + // Since we key based on the end, function `k` might contain `pc`, + // so we'll validate on the range check below + k + } + }; + + let CompiledFunctionInfo { wasm_func_loc, .. } = self.funcs.get(index)?; + let start = wasm_func_loc.start; + let end = wasm_func_loc.start + wasm_func_loc.length; + + if text_offset < start || end < text_offset { + return None; + } + + Some((index, text_offset - wasm_func_loc.start)) + } + + /// Gets the function location information for a given function index. + pub fn func_loc(&self, index: DefinedFuncIndex) -> &FunctionLoc { + &self + .funcs + .get(index) + .expect("defined function should be present") + .wasm_func_loc + } + + /// Gets the function information for a given function index. + pub fn wasm_func_info(&self, index: DefinedFuncIndex) -> &WasmFunctionInfo { + &self + .funcs + .get(index) + .expect("defined function should be present") + .wasm_func_info + } + + /// Creates a new symbolication context which can be used to further + /// symbolicate stack traces. + /// + /// Basically this makes a thing which parses debuginfo and can tell you + /// what filename and line number a wasm pc comes from. + #[cfg(feature = "addr2line")] + pub fn symbolize_context(&self) -> Result>> { + use anyhow::Context; + use gimli::EndianSlice; + if !self.meta.has_wasm_debuginfo { + return Ok(None); + } + let dwarf = gimli::Dwarf::load(|id| -> Result<_> { + // Lookup the `id` in the `dwarf` array prepared for this module + // during module serialization where it's sorted by the `id` key. If + // found this is a range within the general module's concatenated + // dwarf section which is extracted here, otherwise it's just an + // empty list to represent that it's not present. + let data = self + .meta + .dwarf + .binary_search_by_key(&(id as u8), |(id, _)| *id) + .map(|i| { + let (_, range) = &self.meta.dwarf[i]; + &self.code_memory().dwarf()[range.start as usize..range.end as usize] + }) + .unwrap_or(&[]); + Ok(EndianSlice::new(data, gimli::LittleEndian)) + })?; + let cx = addr2line::Context::from_dwarf(dwarf) + .context("failed to create addr2line dwarf mapping context")?; + Ok(Some(SymbolizeContext { + inner: cx, + code_section_offset: self.meta.code_section_offset, + })) + } + + /// Returns whether the original wasm module had unparsed debug information + /// based on the tunables configuration. + pub fn has_unparsed_debuginfo(&self) -> bool { + self.meta.has_unparsed_debuginfo + } + + /// Indicates whether this module came with n address map such that lookups + /// via `wasmtime_environ::lookup_file_pos` will succeed. + /// + /// If this function returns `false` then `lookup_file_pos` will always + /// return `None`. + pub fn has_address_map(&self) -> bool { + !self.code_memory.address_map_data().is_empty() + } + + /// Returns the bounds, in host memory, of where this module's compiled + /// image resides. + pub fn image_range(&self) -> Range { + let base = self.mmap().as_ptr() as usize; + let len = self.mmap().len(); + base..base + len + } +} + +#[cfg(feature = "addr2line")] +type Addr2LineContext<'a> = addr2line::Context>; + +/// A context which contains dwarf debug information to translate program +/// counters back to filenames and line numbers. +#[cfg(feature = "addr2line")] +pub struct SymbolizeContext<'a> { + inner: Addr2LineContext<'a>, + code_section_offset: u64, +} + +#[cfg(feature = "addr2line")] +impl<'a> SymbolizeContext<'a> { + /// Returns access to the [`addr2line::Context`] which can be used to query + /// frame information with. + pub fn addr2line(&self) -> &Addr2LineContext<'a> { + &self.inner + } + + /// Returns the offset of the code section in the original wasm file, used + /// to calculate lookup values into the DWARF. + pub fn code_section_offset(&self) -> u64 { + self.code_section_offset + } +} + +/// Write an object out to an [`MmapVec`] so that it can be marked executable +/// before running. +/// +/// The returned `MmapVec` will contain the serialized version of `obj` +/// and is sized appropriately to the exact size of the object serialized. +pub fn finish_object(obj: ObjectBuilder<'_>) -> Result { + Ok(::finish_object(obj)?.0) +} + +pub(crate) struct MmapVecWrapper(pub MmapVec); + +impl FinishedObject for MmapVecWrapper { + fn finish_object(obj: ObjectBuilder<'_>) -> Result { + let mut result = ObjectMmap::default(); + return match obj.finish(&mut result) { + Ok(()) => { + assert!(result.mmap.is_some(), "no reserve"); + let mmap = result.mmap.expect("reserve not called"); + assert_eq!(mmap.len(), result.len); + Ok(MmapVecWrapper(mmap)) + } + Err(e) => match result.err.take() { + Some(original) => Err(original.context(e)), + None => Err(e.into()), + }, + }; + + /// Helper struct to implement the `WritableBuffer` trait from the `object` + /// crate. + /// + /// This enables writing an object directly into an mmap'd memory so it's + /// immediately usable for execution after compilation. This implementation + /// relies on a call to `reserve` happening once up front with all the needed + /// data, and the mmap internally does not attempt to grow afterwards. + #[derive(Default)] + struct ObjectMmap { + mmap: Option, + len: usize, + err: Option, + } + + impl WritableBuffer for ObjectMmap { + fn len(&self) -> usize { + self.len + } + + fn reserve(&mut self, additional: usize) -> Result<(), ()> { + assert!(self.mmap.is_none(), "cannot reserve twice"); + self.mmap = match MmapVec::with_capacity(additional) { + Ok(mmap) => Some(mmap), + Err(e) => { + self.err = Some(e); + return Err(()); + } + }; + Ok(()) + } + + fn resize(&mut self, new_len: usize) { + // Resizing always appends 0 bytes and since new mmaps start out as 0 + // bytes we don't actually need to do anything as part of this other + // than update our own length. + if new_len <= self.len { + return; + } + self.len = new_len; + } + + fn write_bytes(&mut self, val: &[u8]) { + let mmap = self.mmap.as_mut().expect("write before reserve"); + mmap[self.len..][..val.len()].copy_from_slice(val); + self.len += val.len(); + } + } + } +} diff --git a/crates/wasmtime/src/limits.rs b/crates/wasmtime/src/runtime/limits.rs similarity index 100% rename from crates/wasmtime/src/limits.rs rename to crates/wasmtime/src/runtime/limits.rs diff --git a/crates/wasmtime/src/linker.rs b/crates/wasmtime/src/runtime/linker.rs similarity index 98% rename from crates/wasmtime/src/linker.rs rename to crates/wasmtime/src/runtime/linker.rs index 10affb2d9f23..f8d457855722 100644 --- a/crates/wasmtime/src/linker.rs +++ b/crates/wasmtime/src/runtime/linker.rs @@ -122,7 +122,7 @@ pub(crate) enum Definition { /// size of the table/memory. #[derive(Clone)] pub(crate) enum DefinitionType { - Func(wasmtime_runtime::VMSharedSignatureIndex), + Func(wasmtime_runtime::VMSharedTypeIndex), Global(wasmtime_environ::Global), // Note that tables and memories store not only the original type // information but additionally the current size of the table/memory, as @@ -140,7 +140,7 @@ macro_rules! generate_wrap_async_func { /// [`Func::wrapN_async`](crate::Func::wrap1_async). #[allow(non_snake_case)] #[cfg(feature = "async")] - #[cfg_attr(nightlydoc, doc(cfg(feature = "async")))] + #[cfg_attr(docsrs, doc(cfg(feature = "async")))] pub fn []<$($args,)* R>( &mut self, module: &str, @@ -275,7 +275,7 @@ impl Linker { /// # } /// ``` #[cfg(any(feature = "cranelift", feature = "winch"))] - #[cfg_attr(nightlydoc, doc(cfg(any(feature = "cranelift", feature = "winch"))))] + #[cfg_attr(docsrs, doc(cfg(any(feature = "cranelift", feature = "winch"))))] pub fn define_unknown_imports_as_traps(&mut self, module: &Module) -> anyhow::Result<()> { for import in module.imports() { if let Err(import_err) = self._get_by_import(&import) { @@ -311,7 +311,7 @@ impl Linker { /// # } /// ``` #[cfg(any(feature = "cranelift", feature = "winch"))] - #[cfg_attr(nightlydoc, doc(cfg(any(feature = "cranelift", feature = "winch"))))] + #[cfg_attr(docsrs, doc(cfg(any(feature = "cranelift", feature = "winch"))))] pub fn define_unknown_imports_as_default_values( &mut self, module: &Module, @@ -416,7 +416,7 @@ impl Linker { /// /// For more information see [`Linker::func_wrap`]. #[cfg(any(feature = "cranelift", feature = "winch"))] - #[cfg_attr(nightlydoc, doc(cfg(any(feature = "cranelift", feature = "winch"))))] + #[cfg_attr(docsrs, doc(cfg(any(feature = "cranelift", feature = "winch"))))] pub fn func_new( &mut self, module: &str, @@ -434,7 +434,7 @@ impl Linker { /// /// For more information see [`Linker::func_wrap`]. #[cfg(any(feature = "cranelift", feature = "winch"))] - #[cfg_attr(nightlydoc, doc(cfg(any(feature = "cranelift", feature = "winch"))))] + #[cfg_attr(docsrs, doc(cfg(any(feature = "cranelift", feature = "winch"))))] pub unsafe fn func_new_unchecked( &mut self, module: &str, @@ -452,7 +452,7 @@ impl Linker { /// /// For more information see [`Linker::func_wrap`]. #[cfg(all(feature = "async", feature = "cranelift"))] - #[cfg_attr(nightlydoc, doc(cfg(all(feature = "async", feature = "cranelift"))))] + #[cfg_attr(docsrs, doc(cfg(all(feature = "async", feature = "cranelift"))))] pub fn func_new_async( &mut self, module: &str, @@ -754,7 +754,7 @@ impl Linker { /// # } /// ``` #[cfg(any(feature = "cranelift", feature = "winch"))] - #[cfg_attr(nightlydoc, doc(cfg(any(feature = "cranelift", feature = "winch"))))] + #[cfg_attr(docsrs, doc(cfg(any(feature = "cranelift", feature = "winch"))))] pub fn module( &mut self, mut store: impl AsContextMut, @@ -825,7 +825,7 @@ impl Linker { /// /// This is the same as [`Linker::module`], except for async `Store`s. #[cfg(all(feature = "async", feature = "cranelift"))] - #[cfg_attr(nightlydoc, doc(cfg(all(feature = "async", feature = "cranelift"))))] + #[cfg_attr(docsrs, doc(cfg(all(feature = "async", feature = "cranelift"))))] pub async fn module_async( &mut self, mut store: impl AsContextMut, @@ -1098,7 +1098,7 @@ impl Linker { /// Attempts to instantiate the `module` provided. This is the same as /// [`Linker::instantiate`], except for async `Store`s. #[cfg(feature = "async")] - #[cfg_attr(nightlydoc, doc(cfg(feature = "async")))] + #[cfg_attr(docsrs, doc(cfg(feature = "async")))] pub async fn instantiate_async( &self, mut store: impl AsContextMut, @@ -1366,7 +1366,7 @@ impl DefinitionType { pub(crate) fn from(store: &StoreOpaque, item: &Extern) -> DefinitionType { let data = store.store_data(); match item { - Extern::Func(f) => DefinitionType::Func(f.sig_index(data)), + Extern::Func(f) => DefinitionType::Func(f.type_index(data)), Extern::Table(t) => DefinitionType::Table(*t.wasmtime_ty(data), t.internal_size(store)), Extern::Global(t) => DefinitionType::Global(*t.wasmtime_ty(data)), Extern::Memory(t) => { diff --git a/crates/wasmtime/src/memory.rs b/crates/wasmtime/src/runtime/memory.rs similarity index 99% rename from crates/wasmtime/src/memory.rs rename to crates/wasmtime/src/runtime/memory.rs index 94cb354d4246..ae81055ee1e9 100644 --- a/crates/wasmtime/src/memory.rs +++ b/crates/wasmtime/src/runtime/memory.rs @@ -238,7 +238,7 @@ impl Memory { Self::_new(store.as_context_mut().0, ty) } - #[cfg_attr(nightlydoc, doc(cfg(feature = "async")))] + #[cfg_attr(docsrs, doc(cfg(feature = "async")))] /// Async variant of [`Memory::new`]. You must use this variant with /// [`Store`](`crate::Store`)s which have a /// [`ResourceLimiterAsync`](`crate::ResourceLimiterAsync`). @@ -520,7 +520,7 @@ impl Memory { } } - #[cfg_attr(nightlydoc, doc(cfg(feature = "async")))] + #[cfg_attr(docsrs, doc(cfg(feature = "async")))] /// Async variant of [`Memory::grow`]. Required when using a /// [`ResourceLimiterAsync`](`crate::ResourceLimiterAsync`). /// @@ -670,6 +670,8 @@ pub unsafe trait MemoryCreator: Send + Sync { /// are tuned from the various [`Config`](crate::Config) methods about /// memory sizes/guards. Additionally these two values are guaranteed to be /// multiples of the system page size. + /// + /// Memory created from this method should be zero filled. fn new_memory( &self, ty: MemoryType, @@ -730,7 +732,7 @@ impl SharedMemory { } debug_assert!(ty.maximum().is_some()); - let tunables = &engine.config().tunables; + let tunables = engine.tunables(); let plan = MemoryPlan::for_memory(ty.wasmtime_memory().clone(), tunables); let memory = wasmtime_runtime::SharedMemory::new(plan)?; Ok(Self(memory, engine.clone())) diff --git a/crates/wasmtime/src/module.rs b/crates/wasmtime/src/runtime/module.rs similarity index 89% rename from crates/wasmtime/src/module.rs rename to crates/wasmtime/src/runtime/module.rs index a5553ff94f9c..cb081b372a56 100644 --- a/crates/wasmtime/src/module.rs +++ b/crates/wasmtime/src/runtime/module.rs @@ -1,7 +1,9 @@ use crate::{ code::CodeObject, + code_memory::CodeMemory, + instantiate::CompiledModule, resources::ResourcesRequired, - signatures::SignatureCollection, + type_registry::TypeCollection, types::{ExportType, ExternType, ImportType}, Engine, }; @@ -15,13 +17,12 @@ use std::ptr::NonNull; use std::sync::Arc; use wasmparser::{Parser, ValidPayload, Validator}; use wasmtime_environ::{ - DefinedFuncIndex, DefinedMemoryIndex, HostPtr, ModuleEnvironment, ModuleTypes, ObjectKind, - VMOffsets, + CompiledModuleInfo, DefinedFuncIndex, DefinedMemoryIndex, EntityIndex, HostPtr, ModuleTypes, + ObjectKind, VMOffsets, }; -use wasmtime_jit::{CodeMemory, CompiledModule, CompiledModuleInfo}; use wasmtime_runtime::{ CompiledModuleId, MemoryImage, MmapVec, ModuleMemoryImages, VMArrayCallFunction, - VMNativeCallFunction, VMSharedSignatureIndex, VMWasmCallFunction, + VMNativeCallFunction, VMSharedTypeIndex, VMWasmCallFunction, }; mod registry; @@ -39,14 +40,25 @@ pub use registry::{ /// representation. Instead you'll need to create an /// [`Instance`](crate::Instance) to interact with the wasm module. /// -/// Creating a `Module` currently involves compiling code, meaning that it can -/// be an expensive operation. All `Module` instances are compiled according to -/// the configuration in [`Config`], but typically they're JIT-compiled. If -/// you'd like to instantiate a module multiple times you can do so with -/// compiling the original wasm module only once with a single [`Module`] -/// instance. +/// A `Module` can be created by compiling WebAssembly code through APIs such as +/// [`Module::new`]. This would be a JIT-style use case where code is compiled +/// just before it's used. Alternatively a `Module` can be compiled in one +/// process and [`Module::serialize`] can be used to save it to storage. A later +/// call to [`Module::deserialize`] will quickly load the module to execute and +/// does not need to compile any code, representing a more AOT-style use case. /// -/// The `Module` is thread-safe and safe to share across threads. +/// Currently a `Module` does not implement any form of tiering or dynamic +/// optimization of compiled code. Creation of a `Module` via [`Module::new`] or +/// related APIs will perform the entire compilation step synchronously. When +/// finished no further compilation will happen at runtime or later during +/// execution of WebAssembly instances for example. +/// +/// Compilation of WebAssembly by default goes through Cranelift and is +/// recommended to be done once-per-module. The same WebAssembly binary need not +/// be compiled multiple times and can instead used an embedder-cached result of +/// the first call. +/// +/// `Module` is thread-safe and safe to share across threads. /// /// ## Modules and `Clone` /// @@ -97,6 +109,25 @@ pub use registry::{ /// # } /// ``` /// +/// Serializing and deserializing a module looks like: +/// +/// ```no_run +/// # use wasmtime::*; +/// # fn main() -> anyhow::Result<()> { +/// let engine = Engine::default(); +/// # let wasm_bytes: Vec = Vec::new(); +/// let module = Module::new(&engine, &wasm_bytes)?; +/// let module_bytes = module.serialize()?; +/// +/// // ... can save `module_bytes` to disk or other storage ... +/// +/// // recreate the module from the serialized bytes. For the `unsafe` bits +/// // see the documentation of `deserialize`. +/// let module = unsafe { Module::deserialize(&engine, &module_bytes)? }; +/// # Ok(()) +/// # } +/// ``` +/// /// [`Config`]: crate::Config #[derive(Clone)] pub struct Module { @@ -156,9 +187,8 @@ impl Module { /// loaded into memory all at once, this API does not support streaming /// compilation of a module. /// - /// If the module has not been already been compiled, the WebAssembly binary will - /// be decoded and validated. It will also be compiled according to the - /// configuration of the provided `engine`. + /// The WebAssembly binary will be decoded and validated. It will also be + /// compiled according to the configuration of the provided `engine`. /// /// # Errors /// @@ -207,7 +237,7 @@ impl Module { /// # } /// ``` #[cfg(any(feature = "cranelift", feature = "winch"))] - #[cfg_attr(nightlydoc, doc(cfg(any(feature = "cranelift", feature = "winch"))))] + #[cfg_attr(docsrs, doc(cfg(any(feature = "cranelift", feature = "winch"))))] pub fn new(engine: &Engine, bytes: impl AsRef<[u8]>) -> Result { let bytes = bytes.as_ref(); #[cfg(feature = "wat")] @@ -244,7 +274,7 @@ impl Module { /// # } /// ``` #[cfg(any(feature = "cranelift", feature = "winch"))] - #[cfg_attr(nightlydoc, doc(cfg(any(feature = "cranelift", feature = "winch"))))] + #[cfg_attr(docsrs, doc(cfg(any(feature = "cranelift", feature = "winch"))))] pub fn from_file(engine: &Engine, file: impl AsRef) -> Result { let file = file.as_ref(); match Self::new( @@ -299,8 +329,10 @@ impl Module { /// # } /// ``` #[cfg(any(feature = "cranelift", feature = "winch"))] - #[cfg_attr(nightlydoc, doc(cfg(any(feature = "cranelift", feature = "winch"))))] + #[cfg_attr(docsrs, doc(cfg(any(feature = "cranelift", feature = "winch"))))] pub fn from_binary(engine: &Engine, binary: &[u8]) -> Result { + use crate::{compile::build_artifacts, instantiate::MmapVecWrapper}; + engine .check_compatible_with_native_host() .context("compilation settings are not compatible with the native host")?; @@ -317,8 +349,8 @@ impl Module { // Cache miss, compute the actual artifacts |(engine, wasm)| -> Result<_> { - let (mmap, info) = Module::build_artifacts(engine.0, wasm)?; - let code = publish_mmap(mmap)?; + let (mmap, info) = build_artifacts::(engine.0, wasm)?; + let code = publish_mmap(mmap.0)?; Ok((code, info)) }, @@ -334,8 +366,8 @@ impl Module { }, )?; } else { - let (mmap, info_and_types) = Module::build_artifacts(engine, binary)?; - let code = publish_mmap(mmap)?; + let (mmap, info_and_types) = build_artifacts::(engine, binary)?; + let code = publish_mmap(mmap.0)?; } }; @@ -368,10 +400,10 @@ impl Module { /// entire lifetime of the [`Module`] returned. Any changes to the file on /// disk may change future instantiations of the module to be incorrect. /// This is because the file is mapped into memory and lazily loaded pages - /// reflect the current state of the file, not necessarily the origianl + /// reflect the current state of the file, not necessarily the original /// state of the file. #[cfg(any(feature = "cranelift", feature = "winch"))] - #[cfg_attr(nightlydoc, doc(cfg(any(feature = "cranelift", feature = "winch"))))] + #[cfg_attr(docsrs, doc(cfg(any(feature = "cranelift", feature = "winch"))))] pub unsafe fn from_trusted_file(engine: &Engine, file: impl AsRef) -> Result { let mmap = MmapVec::from_file(file.as_ref())?; if &mmap[0..4] == b"\x7fELF" { @@ -382,74 +414,6 @@ impl Module { Module::new(engine, &*mmap) } - /// Converts an input binary-encoded WebAssembly module to compilation - /// artifacts and type information. - /// - /// This is where compilation actually happens of WebAssembly modules and - /// translation/parsing/validation of the binary input occurs. The binary - /// artifact represented in the `MmapVec` returned here is an in-memory ELF - /// file in an owned area of virtual linear memory where permissions (such - /// as the executable bit) can be applied. - /// - /// Additionally compilation returns an `Option` here which is always - /// `Some`, notably compiled metadata about the module in addition to the - /// type information found within. - #[cfg(any(feature = "cranelift", feature = "winch"))] - pub(crate) fn build_artifacts( - engine: &Engine, - wasm: &[u8], - ) -> Result<(MmapVec, Option<(CompiledModuleInfo, ModuleTypes)>)> { - use crate::compiler::CompileInputs; - - let tunables = &engine.config().tunables; - - // First a `ModuleEnvironment` is created which records type information - // about the wasm module. This is where the WebAssembly is parsed and - // validated. Afterwards `types` will have all the type information for - // this module. - let mut validator = - wasmparser::Validator::new_with_features(engine.config().features.clone()); - let parser = wasmparser::Parser::new(0); - let mut types = Default::default(); - let mut translation = ModuleEnvironment::new(tunables, &mut validator, &mut types) - .translate(parser, wasm) - .context("failed to parse WebAssembly module")?; - let functions = mem::take(&mut translation.function_body_inputs); - let types = types.finish(); - - let compile_inputs = CompileInputs::for_module(&types, &translation, functions); - let unlinked_compile_outputs = compile_inputs.compile(engine)?; - let (compiled_funcs, function_indices) = unlinked_compile_outputs.pre_link(); - - // Emplace all compiled functions into the object file with any other - // sections associated with code as well. - let mut object = engine.compiler().object(ObjectKind::Module)?; - // Insert `Engine` and type-level information into the compiled - // artifact so if this module is deserialized later it contains all - // information necessary. - // - // Note that `append_compiler_info` and `append_types` here in theory - // can both be skipped if this module will never get serialized. - // They're only used during deserialization and not during runtime for - // the module itself. Currently there's no need for that, however, so - // it's left as an exercise for later. - engine.append_compiler_info(&mut object); - engine.append_bti(&mut object); - - let (mut object, compilation_artifacts) = function_indices.link_and_append_code( - object, - engine, - compiled_funcs, - std::iter::once(translation).collect(), - )?; - - let info = compilation_artifacts.unwrap_as_module_info(); - object.serialize_info(&(&info, &types)); - let mmap = object.finish()?; - - Ok((mmap, Some((info, types)))) - } - /// Deserializes an in-memory compiled module previously created with /// [`Module::serialize`] or [`Engine::precompile_module`]. /// @@ -553,7 +517,7 @@ impl Module { // Note that the unsafety here should be ok since the `trampolines` // field should only point to valid trampoline function pointers // within the text section. - let signatures = SignatureCollection::new_for_module(engine.signatures(), &types); + let signatures = TypeCollection::new_for_module(engine, &types); // Package up all our data into a `CodeObject` and delegate to the final // step of module compilation. @@ -647,7 +611,7 @@ impl Module { /// this method can be useful to get the serialized version without /// compiling twice. #[cfg(any(feature = "cranelift", feature = "winch"))] - #[cfg_attr(nightlydoc, doc(cfg(any(feature = "cranelift", feature = "winch"))))] + #[cfg_attr(docsrs, doc(cfg(any(feature = "cranelift", feature = "winch"))))] pub fn serialize(&self) -> Result> { // The current representation of compiled modules within a compiled // component means that it cannot be serialized. The mmap returned here @@ -688,7 +652,7 @@ impl Module { self.inner.code.module_types() } - pub(crate) fn signatures(&self) -> &SignatureCollection { + pub(crate) fn signatures(&self) -> &TypeCollection { self.inner.code.signatures() } @@ -772,9 +736,10 @@ impl Module { ) -> impl ExactSizeIterator> + 'module { let module = self.compiled_module().module(); let types = self.types(); + let engine = self.engine(); module .imports() - .map(move |(module, field, ty)| ImportType::new(module, field, ty, types)) + .map(move |(module, field, ty)| ImportType::new(module, field, ty, types, engine)) .collect::>() .into_iter() } @@ -838,8 +803,9 @@ impl Module { ) -> impl ExactSizeIterator> + 'module { let module = self.compiled_module().module(); let types = self.types(); + let engine = self.engine(); module.exports.iter().map(move |(name, entity_index)| { - ExportType::new(name, module.type_of(*entity_index), types) + ExportType::new(name, module.type_of(*entity_index), types, engine) }) } @@ -890,11 +856,31 @@ impl Module { let module = self.compiled_module().module(); let entity_index = module.exports.get(name)?; Some(ExternType::from_wasmtime( + self.engine(), self.types(), &module.type_of(*entity_index), )) } + /// Looks up an export in this [`Module`] by name to get its index. + /// + /// This function will return the index of an export with the given name. This can be useful + /// to avoid the cost of looking up the export by name multiple times. Instead the + /// [`ModuleExport`] can be stored and used to look up the export on the + /// [`Instance`](crate::Instance) later. + pub fn get_export_index(&self, name: &str) -> Option { + let compiled_module = self.compiled_module(); + let module = compiled_module.module(); + module + .exports + .get_full(name) + .map(|(export_name_index, _, &entity)| ModuleExport { + module: self.id(), + entity, + export_name_index, + }) + } + /// Returns the [`Engine`] that this [`Module`] was compiled by. pub fn engine(&self) -> &Engine { &self.inner.engine @@ -1039,7 +1025,7 @@ impl Module { /// after an entry's offset, but before the next entry's offset, is /// considered to map to the same Wasm binary offset as the original /// entry. For example, the address map will not contain the following - /// sequnce of entries: + /// sequence of entries: /// /// ```ignore /// [ @@ -1080,7 +1066,7 @@ impl Module { /// Get the locations of functions in this module's `.text` section. /// - /// Each function's locartion is a (`.text` section offset, length) pair. + /// Each function's location is a (`.text` section offset, length) pair. pub fn function_locations<'a>(&'a self) -> impl ExactSizeIterator + 'a { self.compiled_module().finished_functions().map(|(f, _)| { let loc = self.compiled_module().func_loc(f); @@ -1115,6 +1101,17 @@ impl Drop for ModuleInner { } } +/// Describes the location of an export in a module. +#[derive(Copy, Clone)] +pub struct ModuleExport { + /// The module that this export is defined in. + pub(crate) module: CompiledModuleId, + /// A raw index into the wasm module. + pub(crate) entity: EntityIndex, + /// The index of the export name. + pub(crate) export_name_index: usize, +} + fn _assert_send_sync() { fn _assert() {} _assert::(); @@ -1140,7 +1137,7 @@ impl std::hash::Hash for HashedEngineCompileEnv<'_> { // Hash configuration state read for compilation let config = self.0.config(); - config.tunables.hash(hasher); + self.0.tunables().hash(hasher); config.features.hash(hasher); config.wmemcheck.hash(hasher); @@ -1184,9 +1181,9 @@ impl wasmtime_runtime::ModuleRuntimeInfo for ModuleInner { fn wasm_to_native_trampoline( &self, - signature: VMSharedSignatureIndex, + signature: VMSharedTypeIndex, ) -> Option> { - let sig = self.code.signatures().local_signature(signature)?; + let sig = self.code.signatures().module_local_type(signature)?; let ptr = self .module .wasm_to_native_trampoline(sig) @@ -1209,7 +1206,7 @@ impl wasmtime_runtime::ModuleRuntimeInfo for ModuleInner { self.module.code_memory().wasm_data() } - fn signature_ids(&self) -> &[VMSharedSignatureIndex] { + fn type_ids(&self) -> &[VMSharedTypeIndex] { self.code.signatures().as_module_map().values().as_slice() } @@ -1250,7 +1247,7 @@ impl wasmtime_runtime::ModuleInfo for ModuleInner { /// default-callee instance). pub(crate) struct BareModuleInfo { module: Arc, - one_signature: Option, + one_signature: Option, offsets: VMOffsets, } @@ -1261,7 +1258,7 @@ impl BareModuleInfo { pub(crate) fn maybe_imported_func( module: Arc, - one_signature: Option, + one_signature: Option, ) -> Self { BareModuleInfo { offsets: VMOffsets::new(HostPtr, &module), @@ -1297,7 +1294,7 @@ impl wasmtime_runtime::ModuleRuntimeInfo for BareModuleInfo { fn wasm_to_native_trampoline( &self, - _signature: VMSharedSignatureIndex, + _signature: VMSharedTypeIndex, ) -> Option> { unreachable!() } @@ -1314,7 +1311,7 @@ impl wasmtime_runtime::ModuleRuntimeInfo for BareModuleInfo { &[] } - fn signature_ids(&self) -> &[VMSharedSignatureIndex] { + fn type_ids(&self) -> &[VMSharedTypeIndex] { match &self.one_signature { Some(id) => std::slice::from_ref(id), None => &[], diff --git a/crates/wasmtime/src/module/registry.rs b/crates/wasmtime/src/runtime/module/registry.rs similarity index 98% rename from crates/wasmtime/src/module/registry.rs rename to crates/wasmtime/src/runtime/module/registry.rs index 65de4bf22536..1b6e286e3b92 100644 --- a/crates/wasmtime/src/module/registry.rs +++ b/crates/wasmtime/src/runtime/module/registry.rs @@ -3,7 +3,7 @@ use crate::code::CodeObject; #[cfg(feature = "component-model")] use crate::component::Component; -use crate::{FrameInfo, Module, Trap}; +use crate::{code_memory::CodeMemory, FrameInfo, Module, Trap}; use once_cell::sync::Lazy; use std::collections::btree_map::Entry; use std::{ @@ -11,8 +11,7 @@ use std::{ ptr::NonNull, sync::{Arc, RwLock}, }; -use wasmtime_jit::CodeMemory; -use wasmtime_runtime::{ModuleInfo, VMSharedSignatureIndex, VMWasmCallFunction}; +use wasmtime_runtime::{ModuleInfo, VMSharedTypeIndex, VMWasmCallFunction}; /// Used for registering modules with a store. /// @@ -187,7 +186,7 @@ impl ModuleRegistry { pub fn wasm_to_native_trampoline( &self, - sig: VMSharedSignatureIndex, + sig: VMSharedTypeIndex, ) -> Option> { // TODO: We are doing a linear search over each module. This is fine for // now because we typically have very few modules per store (almost diff --git a/crates/wasmtime/src/profiling.rs b/crates/wasmtime/src/runtime/profiling.rs similarity index 90% rename from crates/wasmtime/src/profiling.rs rename to crates/wasmtime/src/runtime/profiling.rs index 9b59e584a62a..b56d17bc5d60 100644 --- a/crates/wasmtime/src/profiling.rs +++ b/crates/wasmtime/src/runtime/profiling.rs @@ -1,14 +1,16 @@ -use crate::{AsContext, Module}; +use crate::{instantiate::CompiledModule, AsContext, Module}; +#[allow(unused_imports)] +use anyhow::bail; use anyhow::Result; -use fxprof_processed_profile::debugid::DebugId; +#[cfg(feature = "profiling")] use fxprof_processed_profile::{ - CategoryHandle, CpuDelta, Frame, FrameFlags, FrameInfo, LibraryInfo, Profile, + debugid::DebugId, CategoryHandle, Frame, FrameFlags, FrameInfo, LibraryInfo, Profile, ReferenceTimestamp, Symbol, SymbolTable, Timestamp, }; use std::ops::Range; use std::sync::Arc; use std::time::{Duration, Instant}; -use wasmtime_jit::CompiledModule; +use wasmtime_environ::demangle_function_name; use wasmtime_runtime::Backtrace; // TODO: collect more data @@ -70,6 +72,7 @@ use wasmtime_runtime::Backtrace; /// where they don't already have the WebAssembly module binary available this /// could theoretically lead to an undesirable information disclosure. So you /// should only include user-provided modules in profiles. +#[cfg(feature = "profiling")] #[derive(Debug)] pub struct GuestProfiler { profile: Profile, @@ -79,6 +82,7 @@ pub struct GuestProfiler { start: Instant, } +#[cfg(feature = "profiling")] impl GuestProfiler { /// Begin profiling a new guest. When this function is called, the current /// wall-clock time is recorded as the start time for the guest. @@ -128,7 +132,11 @@ impl GuestProfiler { /// any stack frames for allowed modules on the current stack. It should /// typically be called from a callback registered using /// [`Store::epoch_deadline_callback()`](crate::Store::epoch_deadline_callback). - pub fn sample(&mut self, store: impl AsContext) { + /// + /// The `delta` parameter is the amount of CPU time that was used by this + /// guest since the previous sample. It is allowed to pass `Duration::ZERO` + /// here if recording CPU usage information is not needed. + pub fn sample(&mut self, store: impl AsContext, delta: Duration) { let now = Timestamp::from_nanos_since_reference( self.start.elapsed().as_nanos().try_into().unwrap(), ); @@ -160,7 +168,7 @@ impl GuestProfiler { }); self.profile - .add_sample(self.thread, now, frames, CpuDelta::ZERO, 1); + .add_sample(self.thread, now, frames, delta.into(), 1); } /// When the guest finishes running, call this function to write the @@ -181,13 +189,15 @@ impl GuestProfiler { } } +#[cfg(feature = "profiling")] fn module_symbols(name: String, compiled: &CompiledModule) -> Option { let symbols = Vec::from_iter(compiled.finished_functions().map(|(defined_idx, _)| { let loc = compiled.func_loc(defined_idx); let func_idx = compiled.module().func_index(defined_idx); - let name = match compiled.func_name(func_idx) { - None => format!("wasm_function_{}", defined_idx.as_u32()), - Some(name) => name.to_string(), + let mut name = String::new(); + match compiled.func_name(func_idx) { + None => name = format!("wasm_function_{}", defined_idx.as_u32()), + Some(func_name) => demangle_function_name(&mut name, func_name).unwrap(), }; Symbol { address: loc.start, diff --git a/crates/wasmtime/src/ref.rs b/crates/wasmtime/src/runtime/ref.rs similarity index 100% rename from crates/wasmtime/src/ref.rs rename to crates/wasmtime/src/runtime/ref.rs diff --git a/crates/wasmtime/src/resources.rs b/crates/wasmtime/src/runtime/resources.rs similarity index 100% rename from crates/wasmtime/src/resources.rs rename to crates/wasmtime/src/runtime/resources.rs diff --git a/crates/wasmtime/src/signatures.rs b/crates/wasmtime/src/runtime/signatures.rs similarity index 100% rename from crates/wasmtime/src/signatures.rs rename to crates/wasmtime/src/runtime/signatures.rs diff --git a/crates/wasmtime/src/stack.rs b/crates/wasmtime/src/runtime/stack.rs similarity index 98% rename from crates/wasmtime/src/stack.rs rename to crates/wasmtime/src/runtime/stack.rs index fde7dd7568d2..d057ad2e9976 100644 --- a/crates/wasmtime/src/stack.rs +++ b/crates/wasmtime/src/runtime/stack.rs @@ -22,7 +22,7 @@ pub unsafe trait StackCreator: Send + Sync { /// /// Note there should be at least one guard page of protected memory at the bottom /// of the stack to catch potential stack overflow scenarios. Additionally, stacks should be - /// page aligned. + /// page aligned and zero filled. fn new_stack(&self, size: usize) -> Result, Error>; } diff --git a/crates/wasmtime/src/store.rs b/crates/wasmtime/src/runtime/store.rs similarity index 98% rename from crates/wasmtime/src/store.rs rename to crates/wasmtime/src/runtime/store.rs index edc6d2107644..0854c1315001 100644 --- a/crates/wasmtime/src/store.rs +++ b/crates/wasmtime/src/runtime/store.rs @@ -120,8 +120,8 @@ use func_refs::FuncRefs; /// [`Store`] it will not be deallocated until the [`Store`] itself is dropped. /// This makes [`Store`] unsuitable for creating an unbounded number of /// instances in it because [`Store`] will never release this memory. It's -/// recommended to have a [`Store`] correspond roughly to the lifetime of a "main -/// instance" that an embedding is interested in executing. +/// recommended to have a [`Store`] correspond roughly to the lifetime of a +/// "main instance" that an embedding is interested in executing. /// /// ## Type parameter `T` /// @@ -158,6 +158,18 @@ use func_refs::FuncRefs; /// You can create a store with default configuration settings using /// `Store::default()`. This will create a brand new [`Engine`] with default /// configuration (see [`Config`](crate::Config) for more information). +/// +/// ## Cross-store usage of items +/// +/// In `wasmtime` wasm items such as [`Global`] and [`Memory`] "belong" to a +/// [`Store`]. The store they belong to is the one they were created with +/// (passed in as a parameter) or instantiated with. This store is the only +/// store that can be used to interact with wasm items after they're created. +/// +/// The `wasmtime` crate will panic if the [`Store`] argument passed in to these +/// operations is incorrect. In other words it's considered a programmer error +/// rather than a recoverable error for the wrong [`Store`] to be used when +/// calling APIs. pub struct Store { // for comments about `ManuallyDrop`, see `Store::into_data` inner: ManuallyDrop>>, @@ -357,6 +369,8 @@ pub struct StoreOpaque { component_host_table: wasmtime_runtime::component::ResourceTable, #[cfg(feature = "component-model")] component_calls: wasmtime_runtime::component::CallContexts, + #[cfg(feature = "component-model")] + host_resource_data: crate::component::HostResourceData, } #[cfg(feature = "async")] @@ -508,6 +522,8 @@ impl Store { component_host_table: Default::default(), #[cfg(feature = "component-model")] component_calls: Default::default(), + #[cfg(feature = "component-model")] + host_resource_data: Default::default(), }, limiter: None, call_hook: None, @@ -700,7 +716,7 @@ impl Store { /// [`Store`] configured via /// [`Config::async_support`](crate::Config::async_support). #[cfg(feature = "async")] - #[cfg_attr(nightlydoc, doc(cfg(feature = "async")))] + #[cfg_attr(docsrs, doc(cfg(feature = "async")))] pub fn limiter_async( &mut self, mut limiter: impl FnMut(&mut T) -> &mut (dyn crate::ResourceLimiterAsync) @@ -724,7 +740,7 @@ impl Store { inner.limiter = Some(ResourceLimiterInner::Async(Box::new(limiter))); } - #[cfg_attr(nightlydoc, doc(cfg(feature = "async")))] + #[cfg_attr(docsrs, doc(cfg(feature = "async")))] /// Configures an async function that runs on calls and returns between /// WebAssembly and host code. For the non-async equivalent of this method, /// see [`Store::call_hook`]. @@ -780,12 +796,13 @@ impl Store { self.inner.gc() } - /// Returns the amount fuel in this [`Store`]. + /// Returns the amount fuel in this [`Store`]. When fuel is enabled, it must + /// be configured via [`Store::set_fuel`]. + /// + /// # Errors /// - /// If fuel consumption is not enabled via - /// [`Config::consume_fuel`](crate::Config::consume_fuel) then this - /// function will return `None`. Also note that fuel, if enabled, must be - /// originally configured via [`Store::set_fuel`]. + /// This function will return an error if fuel consumption is not enabled + /// via [`Config::consume_fuel`](crate::Config::consume_fuel). pub fn get_fuel(&self) -> Result { self.inner.get_fuel() } @@ -939,7 +956,7 @@ impl Store { self.inner.epoch_deadline_callback(Box::new(callback)); } - #[cfg_attr(nightlydoc, doc(cfg(feature = "async")))] + #[cfg_attr(docsrs, doc(cfg(feature = "async")))] /// Configures epoch-deadline expiration to yield to the async /// caller and the update the deadline. /// @@ -1056,7 +1073,7 @@ impl<'a, T> StoreContextMut<'a, T> { self.0.epoch_deadline_trap(); } - #[cfg_attr(nightlydoc, doc(cfg(feature = "async")))] + #[cfg_attr(docsrs, doc(cfg(feature = "async")))] /// Configures epoch-deadline expiration to yield to the async /// caller and the update the deadline. /// @@ -1389,7 +1406,7 @@ impl StoreOpaque { pub fn get_fuel(&self) -> Result { anyhow::ensure!( - self.engine().config().tunables.consume_fuel, + self.engine().tunables().consume_fuel, "fuel is not configured in this store" ); let injected_fuel = unsafe { *self.runtime_limits.fuel_consumed.get() }; @@ -1407,7 +1424,7 @@ impl StoreOpaque { pub fn set_fuel(&mut self, fuel: u64) -> Result<()> { anyhow::ensure!( - self.engine().config().tunables.consume_fuel, + self.engine().tunables().consume_fuel, "fuel is not configured in this store" ); let injected_fuel = unsafe { &mut *self.runtime_limits.fuel_consumed.get() }; @@ -1422,7 +1439,7 @@ impl StoreOpaque { pub fn fuel_async_yield_interval(&mut self, interval: Option) -> Result<()> { anyhow::ensure!( - self.engine().config().tunables.consume_fuel, + self.engine().tunables().consume_fuel, "fuel is not configured in this store" ); anyhow::ensure!( @@ -1614,13 +1631,18 @@ at https://bytecodealliance.org/security. #[inline] #[cfg(feature = "component-model")] - pub(crate) fn component_calls_and_host_table( + pub(crate) fn component_resource_state( &mut self, ) -> ( &mut wasmtime_runtime::component::CallContexts, &mut wasmtime_runtime::component::ResourceTable, + &mut crate::component::HostResourceData, ) { - (&mut self.component_calls, &mut self.component_host_table) + ( + &mut self.component_calls, + &mut self.component_host_table, + &mut self.host_resource_data, + ) } #[cfg(feature = "component-model")] diff --git a/crates/wasmtime/src/store/context.rs b/crates/wasmtime/src/runtime/store/context.rs similarity index 100% rename from crates/wasmtime/src/store/context.rs rename to crates/wasmtime/src/runtime/store/context.rs diff --git a/crates/wasmtime/src/store/data.rs b/crates/wasmtime/src/runtime/store/data.rs similarity index 100% rename from crates/wasmtime/src/store/data.rs rename to crates/wasmtime/src/runtime/store/data.rs diff --git a/crates/wasmtime/src/store/func_refs.rs b/crates/wasmtime/src/runtime/store/func_refs.rs similarity index 100% rename from crates/wasmtime/src/store/func_refs.rs rename to crates/wasmtime/src/runtime/store/func_refs.rs diff --git a/crates/wasmtime/src/trampoline.rs b/crates/wasmtime/src/runtime/trampoline.rs similarity index 95% rename from crates/wasmtime/src/trampoline.rs rename to crates/wasmtime/src/runtime/trampoline.rs index 2c28509c8f81..4a094d163426 100644 --- a/crates/wasmtime/src/trampoline.rs +++ b/crates/wasmtime/src/runtime/trampoline.rs @@ -20,7 +20,7 @@ use std::sync::Arc; use wasmtime_environ::{MemoryIndex, Module, TableIndex}; use wasmtime_runtime::{ Imports, InstanceAllocationRequest, InstanceAllocator, OnDemandInstanceAllocator, SharedMemory, - StorePtr, VMFunctionImport, VMSharedSignatureIndex, + StorePtr, VMFunctionImport, VMSharedTypeIndex, }; fn create_handle( @@ -28,7 +28,7 @@ fn create_handle( store: &mut StoreOpaque, host_state: Box, func_imports: &[VMFunctionImport], - one_signature: Option, + one_signature: Option, ) -> Result { let mut imports = Imports::default(); imports.functions = func_imports; diff --git a/crates/wasmtime/src/trampoline/func.rs b/crates/wasmtime/src/runtime/trampoline/func.rs similarity index 87% rename from crates/wasmtime/src/trampoline/func.rs rename to crates/wasmtime/src/runtime/trampoline/func.rs index 716e709a140e..50c078e9d2a3 100644 --- a/crates/wasmtime/src/trampoline/func.rs +++ b/crates/wasmtime/src/runtime/trampoline/func.rs @@ -1,10 +1,10 @@ //! Support for a calling of an imported function. -use crate::{Engine, FuncType, ValRaw}; +use crate::type_registry::RegisteredType; +use crate::{code_memory::CodeMemory, Engine, FuncType, ValRaw}; use anyhow::Result; use std::panic::{self, AssertUnwindSafe}; use std::ptr::NonNull; -use wasmtime_jit::CodeMemory; use wasmtime_runtime::{ StoreBox, VMArrayCallHostFuncContext, VMContext, VMFuncRef, VMOpaqueContext, }; @@ -13,6 +13,10 @@ struct TrampolineState { func: F, #[allow(dead_code)] code_memory: CodeMemory, + + // Need to keep our `VMSharedTypeIndex` registered in the engine. + #[allow(dead_code)] + sig: RegisteredType, } /// Shim to call a host-defined function that uses the array calling convention. @@ -81,6 +85,7 @@ pub fn create_array_call_function( where F: Fn(*mut VMContext, &mut [ValRaw]) -> Result<()> + Send + Sync + 'static, { + use crate::instantiate::finish_object; use std::ptr; let mut obj = engine @@ -94,14 +99,16 @@ where &mut obj, )?; engine.append_bti(&mut obj); - let obj = wasmtime_jit::ObjectBuilder::new(obj, &engine.config().tunables).finish()?; + let obj = finish_object(wasmtime_environ::ObjectBuilder::new(obj, engine.tunables()))?; // Copy the results of JIT compilation into executable memory, and this will // also take care of unwind table registration. let mut code_memory = CodeMemory::new(obj)?; code_memory.publish()?; - engine.profiler().register_module(&code_memory, &|_| None); + engine + .profiler() + .register_module(&code_memory.mmap()[..], &|_| None); // Extract the host/wasm trampolines from the results of compilation since // we know their start/length. @@ -116,7 +123,7 @@ where let native_call = text[native_call_range.start as usize..].as_ptr() as *mut _; let native_call = NonNull::new(native_call).unwrap(); - let sig = engine.signatures().register(ft.as_wasm_func_type()); + let sig = ft.clone().into_registered_type(); unsafe { Ok(VMArrayCallHostFuncContext::new( @@ -124,10 +131,14 @@ where array_call, wasm_call, native_call, - type_index: sig, + type_index: sig.index(), vmctx: ptr::null_mut(), }, - Box::new(TrampolineState { func, code_memory }), + Box::new(TrampolineState { + func, + code_memory, + sig, + }), )) } } diff --git a/crates/wasmtime/src/trampoline/global.rs b/crates/wasmtime/src/runtime/trampoline/global.rs similarity index 100% rename from crates/wasmtime/src/trampoline/global.rs rename to crates/wasmtime/src/runtime/trampoline/global.rs diff --git a/crates/wasmtime/src/trampoline/memory.rs b/crates/wasmtime/src/runtime/trampoline/memory.rs similarity index 99% rename from crates/wasmtime/src/trampoline/memory.rs rename to crates/wasmtime/src/runtime/trampoline/memory.rs index 72c7eb891f81..9d258375718e 100644 --- a/crates/wasmtime/src/trampoline/memory.rs +++ b/crates/wasmtime/src/runtime/trampoline/memory.rs @@ -40,7 +40,7 @@ pub fn create_memory( // preallocated (i.e., shared memory) or allocated manually below. let plan = wasmtime_environ::MemoryPlan::for_memory( memory_ty.wasmtime_memory().clone(), - &store.engine().config().tunables, + store.engine().tunables(), ); let memory_id = module.memory_plans.push(plan.clone()); diff --git a/crates/wasmtime/src/trampoline/table.rs b/crates/wasmtime/src/runtime/trampoline/table.rs similarity index 93% rename from crates/wasmtime/src/trampoline/table.rs rename to crates/wasmtime/src/runtime/trampoline/table.rs index f351a26096f1..b6034dc3eaee 100644 --- a/crates/wasmtime/src/trampoline/table.rs +++ b/crates/wasmtime/src/runtime/trampoline/table.rs @@ -8,7 +8,7 @@ pub fn create_table(store: &mut StoreOpaque, table: &TableType) -> Result, + reverse_types: HashMap, +} + +impl Debug for TypeCollection { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let TypeCollection { + engine: _, + types, + reverse_types: _, + } = self; + f.debug_struct("TypeCollection") + .field("types", types) + .finish_non_exhaustive() + } +} + +impl TypeCollection { + /// Creates a type collection for a module given the module's types. + pub fn new_for_module(engine: &Engine, types: &ModuleTypes) -> Self { + let engine = engine.clone(); + let registry = engine.signatures(); + let types = registry.0.write().unwrap().register_for_module(types); + let reverse_types = types.iter().map(|(k, v)| (*v, k)).collect(); + + Self { + engine, + types, + reverse_types, + } + } + + /// Treats the type collection as a map from a module type index to + /// registered shared type indexes. + /// + /// This is used for looking up module shared type indexes during module + /// instantiation. + pub fn as_module_map(&self) -> &PrimaryMap { + &self.types + } + + /// Gets the shared type index given a module type index. + #[inline] + pub fn shared_type(&self, index: ModuleInternedTypeIndex) -> Option { + self.types.get(index).copied() + } + + /// Get the module-local type index for the given shared type index. + pub fn module_local_type(&self, index: VMSharedTypeIndex) -> Option { + self.reverse_types.get(&index).copied() + } +} + +impl Drop for TypeCollection { + fn drop(&mut self) { + if !self.types.is_empty() { + self.engine + .signatures() + .0 + .write() + .unwrap() + .unregister_types(self); + } + } +} + +/// A Wasm type that has been registered in the engine's `TypeRegistry`. +/// +/// Prevents its associated type from being unregistered while it is alive. +/// +/// Automatically unregisters the type on drop. (Unless other `RegisteredTypes` +/// are keeping the type registered). +/// +/// Dereferences to its underlying `WasmFuncType`. +pub struct RegisteredType { + engine: Engine, + index: VMSharedTypeIndex, + + // This field is not *strictly* necessary to have in this type, since we + // could always grab the registry's lock and look it up by index, but + // holding this reference should make accessing the actual type that much + // cheaper. + ty: Arc, +} + +impl Debug for RegisteredType { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let RegisteredType { + engine: _, + index, + ty, + } = self; + f.debug_struct("RegisteredType") + .field("index", index) + .field("ty", ty) + .finish_non_exhaustive() + } +} + +impl Clone for RegisteredType { + fn clone(&self) -> Self { + { + let i = usize::try_from(self.index.bits()).unwrap(); + let mut registry = self.engine.signatures().0.write().unwrap(); + let entry = registry.entries[i].unwrap_occupied_mut(); + entry.references += 1; + log::trace!( + "cloned registered type {:?} (references -> {})", + self.index, + entry.references + ); + } + + RegisteredType { + engine: self.engine.clone(), + index: self.index, + ty: Arc::clone(&self.ty), + } + } +} + +impl Drop for RegisteredType { + fn drop(&mut self) { + self.engine + .signatures() + .0 + .write() + .unwrap() + .unregister_entry(self.index, 1); + } +} + +impl std::ops::Deref for RegisteredType { + type Target = Arc; + + fn deref(&self) -> &Self::Target { + &self.ty + } +} + +impl PartialEq for RegisteredType { + fn eq(&self, other: &Self) -> bool { + let eq = Arc::ptr_eq(&self.ty, &other.ty); + + if cfg!(debug_assertions) { + if eq { + assert_eq!(self.index, other.index); + assert!(Engine::same(&self.engine, &other.engine)); + } else { + assert!(self.index != other.index || !Engine::same(&self.engine, &other.engine)); + } + } + + eq + } +} + +impl Eq for RegisteredType {} + +impl std::hash::Hash for RegisteredType { + fn hash(&self, state: &mut H) { + let ptr = Arc::as_ptr(&self.ty); + ptr.hash(state); + } +} + +impl RegisteredType { + /// Constructs a new `RegisteredType`, registering the given type with the + /// engine's `TypeRegistry`. + pub fn new(engine: &Engine, ty: &WasmFuncType) -> RegisteredType { + let (index, ty) = engine.signatures().0.write().unwrap().register_raw(ty); + RegisteredType::from_parts(engine.clone(), index, ty) + } + + /// Create an owning handle to the given index's associated type. + /// + /// This will prevent the associated type from being unregistered as long as + /// the returned `RegisteredType` is kept alive. + /// + /// Returns `None` if `index` is not registered in the given engine's + /// registry. + pub fn root(engine: &Engine, index: VMSharedTypeIndex) -> Option { + let i = usize::try_from(index.bits()).unwrap(); + let ty = { + let mut inner = engine.signatures().0.write().unwrap(); + let e = inner.entries.get_mut(i)?.as_occupied_mut()?; + e.references += 1; + log::trace!("rooting {index:?} (references -> {})", e.references); + Arc::clone(&e.ty) + }; + Some(RegisteredType::from_parts(engine.clone(), index, ty)) + } + + /// Construct a new `RegisteredType`. + /// + /// It is the caller's responsibility to ensure that the entry's reference + /// count has already been incremented. + fn from_parts(engine: Engine, index: VMSharedTypeIndex, ty: Arc) -> Self { + debug_assert!({ + let registry = engine.signatures().0.read().unwrap(); + let i = usize::try_from(index.bits()).unwrap(); + let e = registry.entries[i].as_occupied().unwrap(); + e.references > 0 + }); + RegisteredType { engine, index, ty } + } + + /// Get this registered type's index. + pub fn index(&self) -> VMSharedTypeIndex { + self.index + } +} + +#[derive(Debug)] +struct OccupiedEntry { + ty: Arc, + references: usize, +} + +#[derive(Debug)] +enum RegistryEntry { + /// An occupied entry containing a registered type. + Occupied(OccupiedEntry), + + /// A vacant entry that is additionally a link in the free list of all + /// vacant entries. + Vacant { + /// The next link in the free list of all vacant entries, if any. + next_vacant: Option, + }, +} + +impl RegistryEntry { + fn is_vacant(&self) -> bool { + matches!(self, Self::Vacant { .. }) + } + + fn as_occupied(&self) -> Option<&OccupiedEntry> { + match self { + Self::Occupied(o) => Some(o), + Self::Vacant { .. } => None, + } + } + + fn as_occupied_mut(&mut self) -> Option<&mut OccupiedEntry> { + match self { + Self::Occupied(o) => Some(o), + Self::Vacant { .. } => None, + } + } + + fn unwrap_occupied_mut(&mut self) -> &mut OccupiedEntry { + match self { + Self::Occupied(o) => o, + Self::Vacant { .. } => panic!("unwrap_occupied_mut on vacant entry"), + } + } + + fn unwrap_next_vacant(&self) -> Option { + match self { + Self::Vacant { next_vacant } => *next_vacant, + Self::Occupied(_) => panic!("unwrap_next_vacant on occupied entry"), + } + } +} + +#[derive(Debug, Default)] +struct TypeRegistryInner { + // A map from the Wasm function type to a `VMSharedTypeIndex`, for all + // the Wasm function types we have already registered. + map: HashMap, VMSharedTypeIndex>, + + // A map from `VMSharedTypeIndex::bits()` to the type index's associated + // Wasm type. + entries: Vec, + + // The head of the free list of the entries that are vacant and can + // therefore (along with their associated `VMSharedTypeIndex`) be reused. + // + // This is a size optimization, and arguably not strictly necessary for + // correctness, but is necessary to avoid unbounded memory growth: if we did + // not reuse entries/indices, we would have holes in our `self.entries` list + // and, as we load and unload new Wasm modules, `self.entries` would keep + // growing indefinitely. + first_vacant: Option, +} + +impl TypeRegistryInner { + fn register_for_module( + &mut self, + types: &ModuleTypes, + ) -> PrimaryMap { + log::trace!("Registering module types"); + let mut map = PrimaryMap::default(); + for (idx, ty) in types.wasm_types() { + let (shared_type_index, _) = self.register_raw(ty); + let map_idx = map.push(shared_type_index); + assert_eq!(idx, map_idx); + } + map + } + + /// Add a new type to this registry. + /// + /// Does not increment its reference count, that is the responsibility of + /// callers. + fn register_new(&mut self, ty: Arc) -> VMSharedTypeIndex { + let (index, entry) = match self.first_vacant.take() { + Some(index) => { + let i = usize::try_from(index.bits()).unwrap(); + let entry = &mut self.entries[i]; + self.first_vacant = entry.unwrap_next_vacant(); + (index, entry) + } + None => { + debug_assert_eq!(self.entries.len(), self.map.len()); + + let len = self.entries.len(); + let len = u32::try_from(len).unwrap(); + + // Keep `index_map`'s length under `u32::MAX` because + // `u32::MAX` is reserved for `VMSharedTypeIndex`'s + // default value. + assert!( + len < std::u32::MAX, + "Invariant check: self.entries.len() < std::u32::MAX" + ); + + let index = VMSharedTypeIndex::new(len); + self.entries + .push(RegistryEntry::Vacant { next_vacant: None }); + + (index, self.entries.last_mut().unwrap()) + } + }; + + let old_map_entry = self.map.insert(ty.clone(), index); + assert!(old_map_entry.is_none()); + + assert!(entry.is_vacant()); + *entry = RegistryEntry::Occupied(OccupiedEntry { ty, references: 0 }); + + index + } + + /// Register the given type, incrementing its reference count. + fn register_raw(&mut self, ty: &WasmFuncType) -> (VMSharedTypeIndex, Arc) { + let index = if let Some(i) = self.map.get(ty) { + *i + } else { + let ty = Arc::new(ty.clone()); + self.register_new(ty) + }; + + let i = usize::try_from(index.bits()).unwrap(); + let entry = self.entries[i].unwrap_occupied_mut(); + entry.references += 1; + + log::trace!("registered {index:?} (references -> {})", entry.references); + + (index, Arc::clone(&entry.ty)) + } + + fn unregister_types(&mut self, collection: &TypeCollection) { + for (_, index) in collection.types.iter() { + self.unregister_entry(*index, 1); + } + } + + fn unregister_entry(&mut self, index: VMSharedTypeIndex, count: usize) { + let i = usize::try_from(index.bits()).unwrap(); + let entry = self.entries[i].unwrap_occupied_mut(); + + assert!(entry.references >= count); + entry.references -= count; + log::trace!( + "unregistered {index:?} by {count} (references -> {})", + entry.references + ); + + if entry.references == 0 { + self.map.remove(&entry.ty); + self.entries[i] = RegistryEntry::Vacant { + next_vacant: self.first_vacant.take(), + }; + self.first_vacant = Some(index); + } + } +} + +// `TypeRegistryInner` implements `Drop` in debug builds to assert that +// all types have been unregistered for the registry. +#[cfg(debug_assertions)] +impl Drop for TypeRegistryInner { + fn drop(&mut self) { + assert!( + self.map.is_empty(), + "type registry not empty: still have registered types in self.map" + ); + assert!( + self.entries.iter().all(|e| e.is_vacant()), + "type registry not empty: not all entries are vacant" + ); + } +} + +/// Implements a shared type registry. +/// +/// WebAssembly requires that the caller and callee types in an indirect +/// call must match. To implement this efficiently, keep a registry of all +/// types, shared by all instances, so that call sites can just do an +/// index comparison. +#[derive(Debug)] +pub struct TypeRegistry(RwLock); + +impl TypeRegistry { + /// Creates a new shared type registry. + pub fn new() -> Self { + Self(RwLock::new(TypeRegistryInner::default())) + } + + /// Looks up a function type from a shared type index. + /// + /// This does *NOT* prevent the type from being unregistered while you are + /// still using the resulting value! Use the `RegisteredType::root` + /// constructor if you need to ensure that property and you don't have some + /// other mechanism already keeping the type registered. + pub fn borrow(&self, index: VMSharedTypeIndex) -> Option> { + let i = usize::try_from(index.bits()).unwrap(); + let inner = self.0.read().unwrap(); + let e = inner.entries.get(i)?; + Some(e.as_occupied()?.ty.clone()) + } +} diff --git a/crates/wasmtime/src/types.rs b/crates/wasmtime/src/runtime/types.rs similarity index 86% rename from crates/wasmtime/src/types.rs rename to crates/wasmtime/src/runtime/types.rs index 98b3ca73a67b..131a8c7c189d 100644 --- a/crates/wasmtime/src/types.rs +++ b/crates/wasmtime/src/runtime/types.rs @@ -1,7 +1,10 @@ use std::fmt; use wasmtime_environ::{ - EntityType, Global, Memory, ModuleTypes, Table, WasmFuncType, WasmRefType, WasmType, + EntityType, Global, Memory, ModuleTypes, Table, WasmFuncType, WasmRefType, WasmValType, }; +use wasmtime_runtime::VMSharedTypeIndex; + +use crate::{type_registry::RegisteredType, Engine}; pub(crate) mod matching; @@ -73,34 +76,34 @@ impl ValType { } } - pub(crate) fn to_wasm_type(&self) -> WasmType { + pub(crate) fn to_wasm_type(&self) -> WasmValType { match self { - Self::I32 => WasmType::I32, - Self::I64 => WasmType::I64, - Self::F32 => WasmType::F32, - Self::F64 => WasmType::F64, - Self::V128 => WasmType::V128, - Self::FuncRef => WasmType::Ref(WasmRefType::FUNCREF), - Self::ExternRef => WasmType::Ref(WasmRefType::EXTERNREF), + Self::I32 => WasmValType::I32, + Self::I64 => WasmValType::I64, + Self::F32 => WasmValType::F32, + Self::F64 => WasmValType::F64, + Self::V128 => WasmValType::V128, + Self::FuncRef => WasmValType::Ref(WasmRefType::FUNCREF), + Self::ExternRef => WasmValType::Ref(WasmRefType::EXTERNREF), } } - pub(crate) fn from_wasm_type(ty: &WasmType) -> Self { + pub(crate) fn from_wasm_type(ty: &WasmValType) -> Self { match ty { - WasmType::I32 => Self::I32, - WasmType::I64 => Self::I64, - WasmType::F32 => Self::F32, - WasmType::F64 => Self::F64, - WasmType::V128 => Self::V128, - WasmType::Ref(WasmRefType::FUNCREF) => Self::FuncRef, - WasmType::Ref(WasmRefType::EXTERNREF) => Self::ExternRef, + WasmValType::I32 => Self::I32, + WasmValType::I64 => Self::I64, + WasmValType::F32 => Self::F32, + WasmValType::F64 => Self::F64, + WasmValType::V128 => Self::V128, + WasmValType::Ref(WasmRefType::FUNCREF) => Self::FuncRef, + WasmValType::Ref(WasmRefType::EXTERNREF) => Self::ExternRef, // FIXME: exposing the full function-references (and beyond) // proposals will require redesigning the embedder API for `ValType` // and types in Wasmtime. That is a large undertaking which is // deferred for later. The intention for now is that // function-references types can't show up in the "public API" of a // core wasm module but it can use everything internally still. - WasmType::Ref(_) => { + WasmValType::Ref(_) => { unimplemented!("typed function references are not exposed in the public API yet") } } @@ -158,9 +161,13 @@ impl ExternType { (Memory(MemoryType) memory unwrap_memory) } - pub(crate) fn from_wasmtime(types: &ModuleTypes, ty: &EntityType) -> ExternType { + pub(crate) fn from_wasmtime( + engine: &Engine, + types: &ModuleTypes, + ty: &EntityType, + ) -> ExternType { match ty { - EntityType::Function(idx) => FuncType::from_wasm_func_type(types[*idx].clone()).into(), + EntityType::Function(idx) => FuncType::from_wasm_func_type(engine, &types[*idx]).into(), EntityType::Global(ty) => GlobalType::from_wasmtime_global(ty).into(), EntityType::Memory(ty) => MemoryType::from_wasmtime_memory(ty).into(), EntityType::Table(ty) => TableType::from_wasmtime_table(ty).into(), @@ -198,7 +205,7 @@ impl From for ExternType { /// WebAssembly functions can have 0 or more parameters and results. #[derive(Debug, Clone, Hash, Eq, PartialEq)] pub struct FuncType { - sig: WasmFuncType, + ty: RegisteredType, } impl FuncType { @@ -207,35 +214,54 @@ impl FuncType { /// The function descriptor returned will represent a function which takes /// `params` as arguments and returns `results` when it is finished. pub fn new( + engine: &Engine, params: impl IntoIterator, results: impl IntoIterator, ) -> FuncType { - FuncType { - sig: WasmFuncType::new( + Self::from_wasm_func_type( + engine, + &WasmFuncType::new( params.into_iter().map(|t| t.to_wasm_type()).collect(), results.into_iter().map(|t| t.to_wasm_type()).collect(), ), - } + ) } /// Returns the list of parameter types for this function. #[inline] pub fn params(&self) -> impl ExactSizeIterator + '_ { - self.sig.params().iter().map(ValType::from_wasm_type) + self.ty.params().iter().map(ValType::from_wasm_type) } /// Returns the list of result types for this function. #[inline] pub fn results(&self) -> impl ExactSizeIterator + '_ { - self.sig.returns().iter().map(ValType::from_wasm_type) + self.ty.returns().iter().map(ValType::from_wasm_type) + } + + pub(crate) fn type_index(&self) -> VMSharedTypeIndex { + self.ty.index() } pub(crate) fn as_wasm_func_type(&self) -> &WasmFuncType { - &self.sig + &self.ty + } + + pub(crate) fn into_registered_type(self) -> RegisteredType { + self.ty } - pub(crate) fn from_wasm_func_type(sig: WasmFuncType) -> FuncType { - Self { sig } + pub(crate) fn from_wasm_func_type(engine: &Engine, ty: &WasmFuncType) -> FuncType { + let ty = RegisteredType::new(engine, ty); + Self { ty } + } + + pub(crate) fn from_shared_type_index(engine: &Engine, index: VMSharedTypeIndex) -> FuncType { + let ty = RegisteredType::root(engine, index).expect( + "VMSharedTypeIndex is not registered in the Engine! Wrong \ + engine? Didn't root the index somewhere?", + ); + Self { ty } } } @@ -331,7 +357,7 @@ impl TableType { /// Returns the element value type of this table. pub fn element(&self) -> ValType { - ValType::from_wasm_type(&WasmType::Ref(self.ty.wasm_ty)) + ValType::from_wasm_type(&WasmValType::Ref(self.ty.wasm_ty)) } /// Returns minimum number of elements this table must have @@ -485,6 +511,7 @@ pub struct ImportType<'module> { /// The type of the import. ty: EntityType, types: &'module ModuleTypes, + engine: &'module Engine, } impl<'module> ImportType<'module> { @@ -495,12 +522,14 @@ impl<'module> ImportType<'module> { name: &'module str, ty: EntityType, types: &'module ModuleTypes, + engine: &'module Engine, ) -> ImportType<'module> { ImportType { module, name, ty, types, + engine, } } @@ -517,7 +546,7 @@ impl<'module> ImportType<'module> { /// Returns the expected type of this import. pub fn ty(&self) -> ExternType { - ExternType::from_wasmtime(self.types, &self.ty) + ExternType::from_wasmtime(self.engine, self.types, &self.ty) } } @@ -547,6 +576,7 @@ pub struct ExportType<'module> { /// The type of the export. ty: EntityType, types: &'module ModuleTypes, + engine: &'module Engine, } impl<'module> ExportType<'module> { @@ -556,8 +586,14 @@ impl<'module> ExportType<'module> { name: &'module str, ty: EntityType, types: &'module ModuleTypes, + engine: &'module Engine, ) -> ExportType<'module> { - ExportType { name, ty, types } + ExportType { + name, + ty, + types, + engine, + } } /// Returns the name by which this export is known. @@ -567,7 +603,7 @@ impl<'module> ExportType<'module> { /// Returns the type of this export. pub fn ty(&self) -> ExternType { - ExternType::from_wasmtime(self.types, &self.ty) + ExternType::from_wasmtime(self.engine, self.types, &self.ty) } } diff --git a/crates/wasmtime/src/types/matching.rs b/crates/wasmtime/src/runtime/types/matching.rs similarity index 89% rename from crates/wasmtime/src/types/matching.rs rename to crates/wasmtime/src/runtime/types/matching.rs index f0e24e1fe1b6..0fca282276bb 100644 --- a/crates/wasmtime/src/types/matching.rs +++ b/crates/wasmtime/src/runtime/types/matching.rs @@ -1,14 +1,14 @@ use crate::linker::DefinitionType; -use crate::{signatures::SignatureCollection, Engine}; +use crate::{type_registry::TypeCollection, Engine}; use anyhow::{anyhow, bail, Result}; use wasmtime_environ::{ - EntityType, Global, Memory, ModuleTypes, SignatureIndex, Table, WasmFuncType, WasmHeapType, - WasmRefType, WasmType, + EntityType, Global, Memory, ModuleInternedTypeIndex, ModuleTypes, Table, WasmFuncType, + WasmHeapType, WasmRefType, WasmValType, }; -use wasmtime_runtime::VMSharedSignatureIndex; +use wasmtime_runtime::VMSharedTypeIndex; pub struct MatchCx<'a> { - pub signatures: &'a SignatureCollection, + pub signatures: &'a TypeCollection, pub types: &'a ModuleTypes, pub engine: &'a Engine, } @@ -16,10 +16,10 @@ pub struct MatchCx<'a> { impl MatchCx<'_> { pub fn vmshared_signature_index( &self, - expected: SignatureIndex, - actual: VMSharedSignatureIndex, + expected: ModuleInternedTypeIndex, + actual: VMSharedTypeIndex, ) -> Result<()> { - let matches = match self.signatures.shared_signature(expected) { + let matches = match self.signatures.shared_type(expected) { Some(idx) => actual == idx, // If our expected signature isn't registered, then there's no way // that `actual` can match it. @@ -30,7 +30,7 @@ impl MatchCx<'_> { } let msg = "function types incompatible"; let expected = &self.types[expected]; - let actual = match self.engine.signatures().lookup_type(actual) { + let actual = match self.engine.signatures().borrow(actual) { Some(ty) => ty, None => { debug_assert!(false, "all signatures should be registered"); @@ -153,8 +153,8 @@ fn global_ty(expected: &Global, actual: &Global) -> Result<()> { fn table_ty(expected: &Table, actual: &Table, actual_runtime_size: Option) -> Result<()> { equal_ty( - WasmType::Ref(expected.wasm_ty), - WasmType::Ref(actual.wasm_ty), + WasmValType::Ref(expected.wasm_ty), + WasmValType::Ref(actual.wasm_ty), "table", )?; match_limits( @@ -194,14 +194,14 @@ fn memory_ty(expected: &Memory, actual: &Memory, actual_runtime_size: Option Result<()> { let result = match (actual, expected) { - (WasmHeapType::TypedFunc(actual), WasmHeapType::TypedFunc(expected)) => { + (WasmHeapType::Concrete(actual), WasmHeapType::Concrete(expected)) => { // TODO(dhil): we need either canonicalised types or a context here. actual == expected } - (WasmHeapType::TypedFunc(_), WasmHeapType::Func) + (WasmHeapType::Concrete(_), WasmHeapType::Func) | (WasmHeapType::Func, WasmHeapType::Func) | (WasmHeapType::Extern, WasmHeapType::Extern) => true, - (WasmHeapType::Func, _) | (WasmHeapType::Extern, _) | (WasmHeapType::TypedFunc(_), _) => { + (WasmHeapType::Func, _) | (WasmHeapType::Extern, _) | (WasmHeapType::Concrete(_), _) => { false } }; @@ -231,14 +231,14 @@ fn match_ref(expected: WasmRefType, actual: WasmRefType, desc: &str) -> Result<( // Checks whether actual is a subtype of expected, i.e. `actual <: expected` // (note the parameters are given the other way around in code). -fn match_ty(expected: WasmType, actual: WasmType, desc: &str) -> Result<()> { +fn match_ty(expected: WasmValType, actual: WasmValType, desc: &str) -> Result<()> { match (actual, expected) { - (WasmType::Ref(actual), WasmType::Ref(expected)) => match_ref(expected, actual, desc), + (WasmValType::Ref(actual), WasmValType::Ref(expected)) => match_ref(expected, actual, desc), (actual, expected) => equal_ty(expected, actual, desc), } } -fn equal_ty(expected: WasmType, actual: WasmType, desc: &str) -> Result<()> { +fn equal_ty(expected: WasmValType, actual: WasmValType, desc: &str) -> Result<()> { if expected == actual { return Ok(()); } diff --git a/crates/wasmtime/src/unix.rs b/crates/wasmtime/src/runtime/unix.rs similarity index 100% rename from crates/wasmtime/src/unix.rs rename to crates/wasmtime/src/runtime/unix.rs diff --git a/crates/wasmtime/src/v128.rs b/crates/wasmtime/src/runtime/v128.rs similarity index 64% rename from crates/wasmtime/src/v128.rs rename to crates/wasmtime/src/runtime/v128.rs index 25b48b1e368c..595fe8061aa2 100644 --- a/crates/wasmtime/src/v128.rs +++ b/crates/wasmtime/src/runtime/v128.rs @@ -7,6 +7,7 @@ use crate::store::StoreOpaque; use crate::{ValRaw, ValType, WasmTy}; use std::cmp::Ordering; use std::fmt; +use wasmtime_runtime::V128Abi; /// Representation of a 128-bit vector type, `v128`, for WebAssembly. /// @@ -25,40 +26,10 @@ use std::fmt; /// [`TypedFunc`]: crate::TypedFunc #[derive(Copy, Clone)] #[repr(transparent)] -pub struct V128(Abi); - -// NB: this is why this type is only suitable with `TypedFunc` on some platforms -// and no other. See the documentation for each platform for why each ABI is -// chosen. -cfg_if::cfg_if! { - if #[cfg(target_arch = "x86_64")] { - // x86 vectors are represented with XMM registers which are represented - // with the `__m128i` type. This type is considered a vector type for - // ABI purposes which is implemented by Cranelift. - type Abi = std::arch::x86_64::__m128i; - } else if #[cfg(target_arch = "aarch64")] { - // AArch64 uses vector registered which here is used with a vector type. - // Note that the specific type shouldn't matter too much but the choice - // of using a vector is the significant part. - type Abi = std::arch::aarch64::uint8x16_t; - } else if #[cfg(target_arch = "riscv64")] { - // RISC-V currently always passes all vector arguments indirectly in the - // ABI. Currently Rust has no stable means of representing this meaning - // that a 128-bit representation is chosen here but it can't be passed - // directly to WebAssembly, for example, and must instead be passed - // through an array-call trampoline. - type Abi = u128; - } else if #[cfg(target_arch = "s390x")] { - // Currently Rust has no stable means of representing vector registers - // so like RISC-V at this time this uses a bland 128-bit representation. - type Abi = u128; - } else { - compile_error!("unsupported platform"); - } -} +pub struct V128(V128Abi); union Reinterpret { - abi: Abi, + abi: V128Abi, u128: u128, } @@ -112,7 +83,7 @@ impl Ord for V128 { // the documentation above in the `cfg_if!` for why this is conditional. #[cfg(any(target_arch = "x86_64", target_arch = "aarch64"))] unsafe impl WasmTy for V128 { - type Abi = Abi; + type Abi = V128Abi; #[inline] fn valtype() -> ValType { diff --git a/crates/wasmtime/src/values.rs b/crates/wasmtime/src/runtime/values.rs similarity index 100% rename from crates/wasmtime/src/values.rs rename to crates/wasmtime/src/runtime/values.rs diff --git a/crates/wasmtime/src/windows.rs b/crates/wasmtime/src/runtime/windows.rs similarity index 100% rename from crates/wasmtime/src/windows.rs rename to crates/wasmtime/src/runtime/windows.rs diff --git a/crates/wast/Cargo.toml b/crates/wast/Cargo.toml index b264511394fc..b326466d6f49 100644 --- a/crates/wast/Cargo.toml +++ b/crates/wast/Cargo.toml @@ -9,9 +9,12 @@ keywords = ["webassembly", "wasm"] repository = "https://github.com/bytecodealliance/wasmtime" edition.workspace = true +[lints] +workspace = true + [dependencies] anyhow = { workspace = true } -wasmtime = { workspace = true, features = ['cranelift', 'wat'] } +wasmtime = { workspace = true, features = ['cranelift', 'wat', 'runtime'] } wast = { workspace = true } log = { workspace = true } diff --git a/crates/wast/src/lib.rs b/crates/wast/src/lib.rs index 96c076ca2602..9539934e02cf 100644 --- a/crates/wast/src/lib.rs +++ b/crates/wast/src/lib.rs @@ -1,8 +1,6 @@ //! Implementation of the WAST text format for wasmtime. -#![deny(missing_docs, trivial_numeric_casts, unused_extern_crates)] -#![warn(unused_import_braces)] -#![deny(unstable_features)] +#![deny(missing_docs)] #[cfg(feature = "component-model")] mod component; diff --git a/crates/wast/src/spectest.rs b/crates/wast/src/spectest.rs index 17d49b7c294d..5f00ba73ac87 100644 --- a/crates/wast/src/spectest.rs +++ b/crates/wast/src/spectest.rs @@ -59,7 +59,7 @@ pub fn link_spectest( pub fn link_component_spectest(linker: &mut component::Linker) -> Result<()> { use std::sync::atomic::{AtomicU32, Ordering::SeqCst}; use std::sync::Arc; - use wasmtime::component::Resource; + use wasmtime::component::{Resource, ResourceType}; let engine = linker.engine().clone(); linker @@ -92,7 +92,7 @@ pub fn link_component_spectest(linker: &mut component::Linker) -> Result<( let state = Arc::new(ResourceState::default()); - i.resource::("resource1", { + i.resource("resource1", ResourceType::host::(), { let state = state.clone(); move |_, rep| { state.drops.fetch_add(1, SeqCst); @@ -101,13 +101,21 @@ pub fn link_component_spectest(linker: &mut component::Linker) -> Result<( Ok(()) } })?; - i.resource::("resource2", |_, _| Ok(()))?; + i.resource( + "resource2", + ResourceType::host::(), + |_, _| Ok(()), + )?; // Currently the embedder API requires redefining the resource destructor // here despite this being the same type as before, and fixing that is left // for a future refactoring. - i.resource::("resource1-again", |_, _| { - panic!("shouldn't be destroyed"); - })?; + i.resource( + "resource1-again", + ResourceType::host::(), + |_, _| { + panic!("shouldn't be destroyed"); + }, + )?; i.func_wrap("[constructor]resource1", |_cx, (rep,): (u32,)| { Ok((Resource::::new_own(rep),)) diff --git a/crates/wiggle/Cargo.toml b/crates/wiggle/Cargo.toml index 479fac45531b..7dfa3a9a2d53 100644 --- a/crates/wiggle/Cargo.toml +++ b/crates/wiggle/Cargo.toml @@ -10,6 +10,9 @@ keywords = ["webassembly", "wasm"] repository = "https://github.com/bytecodealliance/wasmtime" include = ["src/**/*", "README.md", "LICENSE"] +[lints] +workspace = true + [dependencies] thiserror = { workspace = true } witx = { path = "../wasi-common/WASI/tools/witx", version = "0.9.1", optional = true } @@ -17,13 +20,14 @@ wiggle-macro = { workspace = true } tracing = { workspace = true } bitflags = { workspace = true } async-trait = { workspace = true } -wasmtime = { workspace = true } +wasmtime = { workspace = true, optional = true } anyhow = { workspace = true } [dev-dependencies] wiggle-test = { path = "test-helpers" } proptest = "1.0.0" tokio = { version = "1", features = ["rt-multi-thread","time", "macros"] } +wasmtime = { workspace = true } [[test]] name = "atoms_async" @@ -59,7 +63,10 @@ wiggle_metadata = ['witx', "wiggle-macro/wiggle_metadata"] # the logs out of wiggle-generated libraries. tracing_log = [ "tracing/log" ] +# This feature enables integration with wasmtime. +wasmtime = ["dep:wasmtime"] + # Support for async in the wasmtime crates. wasmtime_async = [ "wasmtime/async" ] -default = ["wiggle_metadata", "wasmtime_async" ] +default = ["wiggle_metadata", "wasmtime", "wasmtime_async" ] diff --git a/crates/wiggle/generate/Cargo.toml b/crates/wiggle/generate/Cargo.toml index 98684a627847..6e0d6798be0e 100644 --- a/crates/wiggle/generate/Cargo.toml +++ b/crates/wiggle/generate/Cargo.toml @@ -11,7 +11,8 @@ repository = "https://github.com/bytecodealliance/wasmtime" readme = "README.md" include = ["src/**/*", "README.md", "LICENSE"] -[lib] +[lints] +workspace = true [dependencies] witx = { version = "0.9.1", path = "../../wasi-common/WASI/tools/witx" } diff --git a/crates/wiggle/generate/src/types/handle.rs b/crates/wiggle/generate/src/types/handle.rs index d277ffec39d6..8d9b550316bc 100644 --- a/crates/wiggle/generate/src/types/handle.rs +++ b/crates/wiggle/generate/src/types/handle.rs @@ -7,7 +7,7 @@ use witx::Layout; pub(super) fn define_handle(name: &witx::Id, h: &witx::HandleDatatype) -> TokenStream { let ident = names::type_(name); let size = h.mem_size_align().size as u32; - let align = h.mem_size_align().align as usize; + let align = h.mem_size_align().align; quote! { #[repr(transparent)] #[derive(Copy, Clone, Debug, ::std::hash::Hash, Eq, PartialEq)] diff --git a/crates/wiggle/generate/src/types/record.rs b/crates/wiggle/generate/src/types/record.rs index 167f317caa6b..0febd104026e 100644 --- a/crates/wiggle/generate/src/types/record.rs +++ b/crates/wiggle/generate/src/types/record.rs @@ -8,7 +8,7 @@ use witx::Layout; pub(super) fn define_struct(name: &witx::Id, s: &witx::RecordDatatype) -> TokenStream { let ident = names::type_(name); let size = s.mem_size_align().size as u32; - let align = s.mem_size_align().align as usize; + let align = s.mem_size_align().align; let member_names = s.members.iter().map(|m| names::struct_member(&m.name)); let member_decls = s.members.iter().map(|m| { diff --git a/crates/wiggle/generate/src/types/variant.rs b/crates/wiggle/generate/src/types/variant.rs index 5fc5943696d1..df340edbfc25 100644 --- a/crates/wiggle/generate/src/types/variant.rs +++ b/crates/wiggle/generate/src/types/variant.rs @@ -12,7 +12,7 @@ pub(super) fn define_variant( ) -> TokenStream { let ident = names::type_(name); let size = v.mem_size_align().size as u32; - let align = v.mem_size_align().align as usize; + let align = v.mem_size_align().align; let contents_offset = v.payload_offset() as u32; let lifetime = quote!('a); diff --git a/crates/wiggle/src/lib.rs b/crates/wiggle/src/lib.rs index 7bad7f20ee07..14141c36d952 100644 --- a/crates/wiggle/src/lib.rs +++ b/crates/wiggle/src/lib.rs @@ -21,7 +21,7 @@ mod error; mod guest_type; mod region; -pub extern crate tracing; +pub use tracing; pub use error::GuestError; pub use guest_type::{GuestErrorType, GuestType, GuestTypeTransparent}; @@ -32,6 +32,7 @@ pub mod async_trait_crate { } pub mod wasmtime; +#[cfg(feature = "wasmtime")] pub mod wasmtime_crate { pub use wasmtime::*; } @@ -402,7 +403,7 @@ impl<'a, T: ?Sized + Pointee> GuestPtr<'a, T> { /// etc of the returned pointer. pub fn cast(&self) -> GuestPtr<'a, U> where - T: Pointee, + U: Pointee + ?Sized, { GuestPtr::new(self.mem, self.pointer) } diff --git a/crates/wiggle/test-helpers/Cargo.toml b/crates/wiggle/test-helpers/Cargo.toml index f09c25dca087..5f81b602285d 100644 --- a/crates/wiggle/test-helpers/Cargo.toml +++ b/crates/wiggle/test-helpers/Cargo.toml @@ -11,6 +11,9 @@ repository = "https://github.com/bytecodealliance/wasmtime" include = ["src/**/*", "LICENSE"] publish = false +[lints] +workspace = true + [dependencies] proptest = "1.0.0" wiggle = { path = "..", features = ["tracing_log"] } diff --git a/crates/winch/Cargo.toml b/crates/winch/Cargo.toml index c1901b2d8185..2231a538fce7 100644 --- a/crates/winch/Cargo.toml +++ b/crates/winch/Cargo.toml @@ -7,6 +7,9 @@ edition.workspace = true license = "Apache-2.0 WITH LLVM-exception" repository = "https://github.com/bytecodealliance/wasmtime" +[lints] +workspace = true + [dependencies] winch-codegen = { workspace = true } target-lexicon = { workspace = true } diff --git a/crates/winch/src/builder.rs b/crates/winch/src/builder.rs index d9d534cc7a74..2f9e5010928b 100644 --- a/crates/winch/src/builder.rs +++ b/crates/winch/src/builder.rs @@ -1,6 +1,7 @@ use crate::compiler::Compiler; use anyhow::{bail, Result}; use std::sync::Arc; +use target_lexicon::Triple; use wasmtime_cranelift_shared::isa_builder::IsaBuilder; use wasmtime_environ::{CompilerBuilder, Setting}; use winch_codegen::{isa, TargetIsa}; @@ -10,10 +11,10 @@ struct Builder { inner: IsaBuilder>>, } -pub fn builder() -> Box { - Box::new(Builder { - inner: IsaBuilder::new(|triple| isa::lookup(triple).map_err(|e| e.into())), - }) +pub fn builder(triple: Option) -> Result> { + Ok(Box::new(Builder { + inner: IsaBuilder::new(triple, |triple| isa::lookup(triple).map_err(|e| e.into()))?, + })) } impl CompilerBuilder for Builder { diff --git a/crates/winch/src/compiler.rs b/crates/winch/src/compiler.rs index 89e4a775d3c3..c58318eb8003 100644 --- a/crates/winch/src/compiler.rs +++ b/crates/winch/src/compiler.rs @@ -1,4 +1,5 @@ use anyhow::Result; +use cranelift_codegen::isa::unwind::UnwindInfoKind; use object::write::{Object, SymbolId}; use std::any::Any; use std::mem; @@ -7,7 +8,8 @@ use wasmparser::FuncValidatorAllocations; use wasmtime_cranelift_shared::{CompiledFunction, ModuleTextBuilder}; use wasmtime_environ::{ CompileError, DefinedFuncIndex, FilePos, FuncIndex, FunctionBodyData, FunctionLoc, - ModuleTranslation, ModuleTypes, PrimaryMap, TrapEncodingBuilder, VMOffsets, WasmFunctionInfo, + ModuleTranslation, ModuleTypesBuilder, PrimaryMap, TrapEncodingBuilder, VMOffsets, + WasmFunctionInfo, }; use winch_codegen::{BuiltinFunctions, TargetIsa, TrampolineKind}; @@ -62,6 +64,27 @@ impl Compiler { context.allocations = allocs; self.contexts.lock().unwrap().push(context); } + + /// Emit unwind info into the [`CompiledFunction`]. + fn emit_unwind_info( + &self, + compiled_function: &mut CompiledFunction, + ) -> Result<(), CompileError> { + let kind = match self.isa.triple().operating_system { + target_lexicon::OperatingSystem::Windows => UnwindInfoKind::Windows, + _ => UnwindInfoKind::SystemV, + }; + + if let Some(info) = self + .isa + .emit_unwind_info(&compiled_function.buffer, kind) + .map_err(|e| CompileError::Codegen(format!("{e:?}")))? + { + compiled_function.set_unwind_info(info); + } + + Ok(()) + } } impl wasmtime_environ::Compiler for Compiler { @@ -70,7 +93,7 @@ impl wasmtime_environ::Compiler for Compiler { translation: &ModuleTranslation<'_>, index: DefinedFuncIndex, data: FunctionBodyData<'_>, - types: &ModuleTypes, + types: &ModuleTypesBuilder, ) -> Result<(WasmFunctionInfo, Box), CompileError> { let index = translation.module.func_index(index); let sig = translation.module.functions[index].signature; @@ -97,9 +120,14 @@ impl wasmtime_environ::Compiler for Compiler { .map_err(|e| CompileError::Codegen(format!("{e:?}"))); self.save_context(context, validator.into_allocations()); let buffer = buffer?; - let compiled_function = + + let mut compiled_function = CompiledFunction::new(buffer, CompiledFuncEnv {}, self.isa.function_alignment()); + if self.isa.flags().unwind_info() { + self.emit_unwind_info(&mut compiled_function)?; + } + Ok(( WasmFunctionInfo { start_srcloc, @@ -112,7 +140,7 @@ impl wasmtime_environ::Compiler for Compiler { fn compile_array_to_wasm_trampoline( &self, translation: &ModuleTranslation<'_>, - types: &ModuleTypes, + types: &ModuleTypesBuilder, index: DefinedFuncIndex, ) -> Result, CompileError> { let func_index = translation.module.func_index(index); @@ -122,16 +150,21 @@ impl wasmtime_environ::Compiler for Compiler { .isa .compile_trampoline(&ty, TrampolineKind::ArrayToWasm(func_index)) .map_err(|e| CompileError::Codegen(format!("{:?}", e)))?; - let compiled_function = + + let mut compiled_function = CompiledFunction::new(buffer, CompiledFuncEnv {}, self.isa.function_alignment()); + if self.isa.flags().unwind_info() { + self.emit_unwind_info(&mut compiled_function)?; + } + Ok(Box::new(compiled_function)) } fn compile_native_to_wasm_trampoline( &self, translation: &ModuleTranslation<'_>, - types: &ModuleTypes, + types: &ModuleTypesBuilder, index: DefinedFuncIndex, ) -> Result, CompileError> { let func_index = translation.module.func_index(index); @@ -143,9 +176,13 @@ impl wasmtime_environ::Compiler for Compiler { .compile_trampoline(ty, TrampolineKind::NativeToWasm(func_index)) .map_err(|e| CompileError::Codegen(format!("{:?}", e)))?; - let compiled_function = + let mut compiled_function = CompiledFunction::new(buffer, CompiledFuncEnv {}, self.isa.function_alignment()); + if self.isa.flags().unwind_info() { + self.emit_unwind_info(&mut compiled_function)?; + } + Ok(Box::new(compiled_function)) } @@ -158,9 +195,13 @@ impl wasmtime_environ::Compiler for Compiler { .compile_trampoline(wasm_func_ty, TrampolineKind::WasmToNative) .map_err(|e| CompileError::Codegen(format!("{:?}", e)))?; - let compiled_function = + let mut compiled_function = CompiledFunction::new(buffer, CompiledFuncEnv {}, self.isa.function_alignment()); + if self.isa.flags().unwind_info() { + self.emit_unwind_info(&mut compiled_function)?; + } + Ok(Box::new(compiled_function)) } diff --git a/crates/wit-bindgen/Cargo.toml b/crates/wit-bindgen/Cargo.toml index cc4b27260bbe..6e549ef06e3b 100644 --- a/crates/wit-bindgen/Cargo.toml +++ b/crates/wit-bindgen/Cargo.toml @@ -8,6 +8,9 @@ repository = "https://github.com/bytecodealliance/wasmtime" documentation = "https://docs.rs/wasmtime-wit-bindgen/" edition.workspace = true +[lints] +workspace = true + [dependencies] anyhow = { workspace = true } heck = { workspace = true } diff --git a/crates/wit-bindgen/src/lib.rs b/crates/wit-bindgen/src/lib.rs index eca7fd3916cd..7042eb7f0fa4 100644 --- a/crates/wit-bindgen/src/lib.rs +++ b/crates/wit-bindgen/src/lib.rs @@ -185,7 +185,7 @@ impl Wasmtime { let pkgname = &resolve.packages[iface.package.unwrap()].name; path.push(pkgname.namespace.to_snake_case()); path.push(self.name_package_module(resolve, iface.package.unwrap())); - path.push(iface.name.as_ref().unwrap().to_snake_case()); + path.push(to_rust_ident(iface.name.as_ref().unwrap())); } } let entry = if let Some(remapped_path) = self.lookup_replacement(resolve, name, None) { @@ -362,13 +362,13 @@ impl Wasmtime { gen.gen.name_interface(resolve, *id, name, true); gen.current_interface = Some((*id, name, true)); gen.types(*id); + let struct_name = "Guest"; let iface = &resolve.interfaces[*id]; let iface_name = match name { WorldKey::Name(name) => name, WorldKey::Interface(_) => iface.name.as_ref().unwrap(), }; - let camel = to_rust_upper_camel_case(iface_name); - uwriteln!(gen.src, "pub struct {camel} {{"); + uwriteln!(gen.src, "pub struct {struct_name} {{"); for (_, func) in iface.functions.iter() { uwriteln!( gen.src, @@ -378,13 +378,13 @@ impl Wasmtime { } uwriteln!(gen.src, "}}"); - uwriteln!(gen.src, "impl {camel} {{"); + uwriteln!(gen.src, "impl {struct_name} {{"); uwrite!( gen.src, " pub fn new( __exports: &mut wasmtime::component::ExportInstance<'_, '_>, - ) -> wasmtime::Result<{camel}> {{ + ) -> wasmtime::Result<{struct_name}> {{ " ); let mut fields = Vec::new(); @@ -393,7 +393,7 @@ impl Wasmtime { uwriteln!(gen.src, "let {name} = {getter};"); fields.push(name); } - uwriteln!(gen.src, "Ok({camel} {{"); + uwriteln!(gen.src, "Ok({struct_name} {{"); for name in fields { uwriteln!(gen.src, "{name},"); } @@ -440,7 +440,7 @@ impl Wasmtime { } let module = &gen.src[..]; - let snake = iface_name.to_snake_case(); + let snake = to_rust_ident(iface_name); let module = format!( " @@ -467,17 +467,17 @@ impl Wasmtime { let (path, method_name) = match pkgname { Some(pkgname) => ( format!( - "exports::{}::{}::{snake}::{camel}", + "exports::{}::{}::{snake}::{struct_name}", pkgname.namespace.to_snake_case(), self.name_package_module(resolve, iface.package.unwrap()), ), format!( "{}_{}_{snake}", pkgname.namespace.to_snake_case(), - pkgname.name.to_snake_case() + self.name_package_module(resolve, iface.package.unwrap()) ), ), - None => (format!("exports::{snake}::{camel}"), snake.clone()), + None => (format!("exports::{snake}::{struct_name}"), snake.clone()), }; let getter = format!( "\ @@ -519,7 +519,13 @@ impl Wasmtime { self.toplevel_import_trait(resolve, world); uwriteln!(self.src, "const _: () = {{"); - uwriteln!(self.src, "use wasmtime::component::__internal::anyhow;"); + uwriteln!( + self.src, + " + #[allow(unused_imports)] + use wasmtime::component::__internal::anyhow; + " + ); uwriteln!(self.src, "impl {camel} {{"); self.toplevel_add_to_linker(resolve, world); @@ -807,8 +813,9 @@ impl Wasmtime { let camel = name.to_upper_camel_case(); uwriteln!( self.src, - "linker.resource::<{camel}>( + "linker.resource( \"{name}\", + wasmtime::component::ResourceType::host::<{camel}>(), move |mut store, rep| -> wasmtime::Result<()> {{ Host{camel}::drop(get(store.data_mut()), wasmtime::component::Resource::new_own(rep)) }}, @@ -1010,14 +1017,6 @@ impl<'a> InterfaceGenerator<'a> { uwriteln!(self.src, "}}"); } else { - let iface_name = match self.current_interface.unwrap().1 { - WorldKey::Name(name) => name.to_upper_camel_case(), - WorldKey::Interface(i) => self.resolve.interfaces[*i] - .name - .as_ref() - .unwrap() - .to_upper_camel_case(), - }; self.rustdoc(docs); uwriteln!( self.src, @@ -1025,7 +1024,7 @@ impl<'a> InterfaceGenerator<'a> { pub type {camel} = wasmtime::component::ResourceAny; pub struct Guest{camel}<'a> {{ - funcs: &'a {iface_name}, + funcs: &'a Guest, }} " ); @@ -1604,8 +1603,9 @@ impl<'a> InterfaceGenerator<'a> { let camel = name.to_upper_camel_case(); uwriteln!( self.src, - "inst.resource::<{camel}>( + "inst.resource( \"{name}\", + wasmtime::component::ResourceType::host::<{camel}>(), move |mut store, rep| -> wasmtime::Result<()> {{ Host{camel}::drop(get(store.data_mut()), wasmtime::component::Resource::new_own(rep)) }}, diff --git a/crates/wit-bindgen/src/rust.rs b/crates/wit-bindgen/src/rust.rs index 009bebffbbe8..94226dea2a6a 100644 --- a/crates/wit-bindgen/src/rust.rs +++ b/crates/wit-bindgen/src/rust.rs @@ -286,75 +286,6 @@ pub trait RustGenerator<'a> { result } - /// Writes the camel-cased 'name' of the passed type to `out`, as used to name union variants. - fn write_name(&self, ty: &Type, out: &mut String) { - match ty { - Type::Bool => out.push_str("Bool"), - Type::U8 => out.push_str("U8"), - Type::U16 => out.push_str("U16"), - Type::U32 => out.push_str("U32"), - Type::U64 => out.push_str("U64"), - Type::S8 => out.push_str("I8"), - Type::S16 => out.push_str("I16"), - Type::S32 => out.push_str("I32"), - Type::S64 => out.push_str("I64"), - Type::Float32 => out.push_str("F32"), - Type::Float64 => out.push_str("F64"), - Type::Char => out.push_str("Char"), - Type::String => out.push_str("String"), - Type::Id(id) => { - let ty = &self.resolve().types[*id]; - match &ty.name { - Some(name) => out.push_str(&name.to_upper_camel_case()), - None => match &ty.kind { - TypeDefKind::Option(ty) => { - out.push_str("Optional"); - self.write_name(ty, out); - } - TypeDefKind::Result(_) => out.push_str("Result"), - TypeDefKind::Tuple(_) => out.push_str("Tuple"), - TypeDefKind::List(ty) => { - self.write_name(ty, out); - out.push_str("List") - } - TypeDefKind::Future(ty) => { - self.write_optional_name(ty.as_ref(), out); - out.push_str("Future"); - } - TypeDefKind::Stream(s) => { - self.write_optional_name(s.element.as_ref(), out); - self.write_optional_name(s.end.as_ref(), out); - out.push_str("Stream"); - } - - TypeDefKind::Type(ty) => self.write_name(ty, out), - TypeDefKind::Record(_) => out.push_str("Record"), - TypeDefKind::Flags(_) => out.push_str("Flags"), - TypeDefKind::Variant(_) => out.push_str("Variant"), - TypeDefKind::Enum(_) => out.push_str("Enum"), - TypeDefKind::Handle(Handle::Borrow(id)) => { - out.push_str("Borrow"); - self.write_name(&Type::Id(*id), out); - } - TypeDefKind::Handle(Handle::Own(id)) => { - out.push_str("Own"); - self.write_name(&Type::Id(*id), out); - } - TypeDefKind::Resource => unreachable!(), - TypeDefKind::Unknown => unreachable!(), - }, - } - } - } - } - - fn write_optional_name(&self, ty: Option<&Type>, out: &mut String) { - match ty { - Some(ty) => self.write_name(ty, out), - None => out.push_str("()"), - } - } - fn param_name(&self, ty: TypeId) -> String { let info = self.info(ty); let name = self.resolve().types[ty] diff --git a/crates/wmemcheck/Cargo.toml b/crates/wmemcheck/Cargo.toml index af62cc4541cb..5d21c510ba8b 100644 --- a/crates/wmemcheck/Cargo.toml +++ b/crates/wmemcheck/Cargo.toml @@ -8,4 +8,5 @@ repository = "https://github.com/bytecodealliance/wasmtime" documentation = "https://docs.rs/wasmtime-cranelift/" edition.workspace = true -[dependencies] +[lints] +workspace = true diff --git a/deny.toml b/deny.toml index 026b19a2c8d9..e9f09df26c43 100644 --- a/deny.toml +++ b/deny.toml @@ -59,4 +59,7 @@ skip-tree = [ # They want to publish version 2.0 to upgrade `hashbrown` so in the meantime # it is duplicated for us. { name = "indexmap", depth = 2 }, + + # criterion is on old version, will update on next release. + { name = "itertools" }, ] diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 73ff7f807516..56f96c0cb2ca 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -54,6 +54,7 @@ - [Testing](./contributing-testing.md) - [Fuzzing](./contributing-fuzzing.md) - [CI](./contributing-ci.md) + - [Reducing Test Cases](./contributing-reducing-test-cases.md) - [Cross Compiling](./contributing-cross-compiling.md) - [Coding Guidelines](./contributing-coding-guidelines.md) - [Development Process](./contributing-development-process.md) diff --git a/docs/WASI-tutorial.md b/docs/WASI-tutorial.md index 1ca52be105a5..340370f8511b 100644 --- a/docs/WASI-tutorial.md +++ b/docs/WASI-tutorial.md @@ -270,7 +270,7 @@ First, create a new `demo.wat` file: ;; Import the required fd_write WASI function which will write the given io vectors to stdout ;; The function signature for fd_write is: ;; (File Descriptor, *iovs, iovs_len, nwritten) -> Returns number of bytes written - (import "wasi_unstable" "fd_write" (func $fd_write (param i32 i32 i32 i32) (result i32))) + (import "wasi_snapshot_preview1" "fd_write" (func $fd_write (param i32 i32 i32 i32) (result i32))) (memory 1) (export "memory" (memory 0)) diff --git a/docs/contributing-architecture.md b/docs/contributing-architecture.md index 935d1fefbfbe..294a5ad5eea3 100644 --- a/docs/contributing-architecture.md +++ b/docs/contributing-architecture.md @@ -457,10 +457,6 @@ values that are actively in use on the stack. The main Wasmtime internal crates are: * `wasmtime` - the safe public API of `wasmtime`. -* `wasmtime-jit` - JIT-specific support for Wasmtime. This is the concrete - implementation that manages executable memory generated at Runtime. Currently - all modules are compiled this way, but one day Wasmtime may be able to be - compiled without JIT support where only precompiled modules can be loaded. * `wasmtime-runtime` - low-level runtime implementation of Wasmtime. This is where `VMContext` and `InstanceHandle` live. This crate is theoretically agnostic to how JIT code was compiled and the runtime that it's running diff --git a/docs/contributing-building.md b/docs/contributing-building.md index fcbb281c8964..11c6593a6de6 100644 --- a/docs/contributing-building.md +++ b/docs/contributing-building.md @@ -57,7 +57,7 @@ with `cargo run`. To build the C API of Wasmtime you can run: ```shell -cargo build --release --manifest-path crates/c-api/Cargo.toml +cargo build --release -p wasmtime-c-api ``` This will place the shared library inside of `target/release`. On Linux it will @@ -68,17 +68,17 @@ be called `libwasmtime.{a,so}`, on macOS it will be called ## Building Other Wasmtime Crates You can build any of the Wasmtime crates by appending `-p wasmtime-whatever` to -the `cargo build` invocation. For example, to build the `wasmtime-jit` crate, +the `cargo build` invocation. For example, to build the `wasmtime-environ` crate, execute this command: ```shell -cargo build -p wasmtime-jit +cargo build -p wasmtime-environ ``` Alternatively, you can `cd` into the crate's directory, and run `cargo build` there, without needing to supply the `-p` flag: ```shell -cd crates/jit/ +cd crates/environ/ cargo build ``` diff --git a/docs/contributing-coding-guidelines.md b/docs/contributing-coding-guidelines.md index 40d4f0543044..157db09547c7 100644 --- a/docs/contributing-coding-guidelines.md +++ b/docs/contributing-coding-guidelines.md @@ -33,4 +33,56 @@ periodically and the general repository does not depend on nightly features. Updating Wasmtime's MSRV is done by editing the `rust-version` field in the workspace root's `Cargo.toml` -[Rust Update Policy for Firefox]: https://wiki.mozilla.org/Rust_Update_Policy_for_Firefox#Schedule +### Dependencies of Wasmtime + +Wasmtime and Cranelift have a higher threshold than default for adding +dependencies to the project. All dependencies are required to be "vetted" +through the [`cargo vet` tool](https://mozilla.github.io/cargo-vet/). This is +checked on CI and will run on all modifications to `Cargo.lock`. + +A "vet" for Wasmtime is not a meticulous code review of a dependency for +correctness but rather it is a statement that the crate does not contain +malicious code and is safe for us to run during development and (optionally) +users to run when they run Wasmtime themselves. Wasmtime's vet entries are used +by other organizations which means that this isn't simply for our own personal +use. Wasmtime additionally uses vet entries from other organizations as well +which means we don't have to vet everything ourselves. + +New vet entries are required to be made by trusted contributors to Wasmtime. +This is all configured in the `supply-chain` folder of Wasmtime. These files +generally aren't hand-edited though and are instead managed through the `cargo +vet` tool itself. Note that our `supply-chain/audits.toml` additionally contains +entries which indicates that authors are trusted as opposed to vets of +individual crates. This lowers the burden of updating version of a crate from a +trusted author. + +When put together this means that contributions to Wasmtime and Cranelift which +update existing dependencies or add new dependencies will not be mergeable by +default (CI will fail). This is expected from our project's configuration and +this situation will be handled one of a few ways: + +* If a new dependency is being added it might be worth trying to slim down + what's required or avoiding the dependency altogether. Avoiding new + dependencies is best when reasonable, but it is not always reasonable to do + so. This is left to the judgement of the author and reviewer. + +* When updating dependencies this should be done for a specific purpose relevant + to the PR-at-hand. For example if the PR implements a new feature then the + dependency update should be required for the new feature. Otherwise it's best + to leave dependency updates to their own PRs. It's ok to update dependencies + "just for the update" but we prefer to have that as separate PRs. + +* If a new dependency or dependency update is required, then a trusted + contributor of Wasmtime will be required to perform a vet of the new + crate/version. This will be done through a separate PR to Wasmtime so we ask + contributors to not run `cargo vet` themselves to get CI passing. Reviewers + understand what `cargo vet` failures are on CI and how it doesn't reflect on + the quality of the PR itself. Once the reviewer (or another maintainer) merges + a PR adding the vet entries necessary for the original contribution it can be + rebased to get CI passing. + +Note that this process is not in place to prevent new dependencies or prevent +updates, but rather it ensures that development of Wasmtime is done with a +trusted set of code that has been reviewed by trusted parties. We welcome +dependency updates and new functionality, so please don't be too alarmed when +contributing and seeing a failure of `cargo vet` on CI! diff --git a/docs/contributing-reducing-test-cases.md b/docs/contributing-reducing-test-cases.md new file mode 100644 index 000000000000..ce81b1be3596 --- /dev/null +++ b/docs/contributing-reducing-test-cases.md @@ -0,0 +1,110 @@ +# Reducing Test Cases + +When reporting a bug, or investing a bug report, in Wasmtime it is easier for +everyone involved when there is a test case that reproduces the bug. It is even +better when that test case is as small as possible, so that developers don't +need to wade through megabytes of unrelated Wasm that isn't necessary to +showcase the bug. The process of taking a large test case and stripping out the +unnecessary bits is called *test case reduction*. + +[The `wasm-tools shrink` tool](github.com/bytecodealliance/wasm-tools) can +automatically reduce Wasm test cases when given + +1. the original, unreduced test case, and +2. a predicate script to determine whether the bug reproduces on a given reduced + test case candidate. + +If the test case causes Wasmtime to segfault, the script can run Wasmtime and +check its exit code. If the test case produces a different result in Wasmtime vs +another Wasm engine, the script can run both engines and compare their +results. It is also often useful to `grep` through the candidate's WAT +disassembly to make sure that relevant features and instructions are present. + +## Case Study: [Issue #7779](https://github.com/bytecodealliance/wasmtime/issues/7779) + +A bug was reported involving the `memory.init` instruction. The attached test +case was larger than it needed to be and contained a bunch of functions and +other things that were irrelevant. A perfect use case for `wasm-tools shrink`! + +First, we needed a predicate script to identify the reported buggy behavior. The +script is given the candidate test case as its first argument and must exit zero +if the candidate exhibits the bug and non-zero otherwise. + +```bash +#!/usr/bin/env bash + +# Propagate failure: exit non-zero if any individual command exits non-zero. +set -e + +# Disassembly the candidate into WAT. Make sure the `memory.init` instruction +# is present, since the bug report is about that instruction. Additionally, make +# sure it is referencing the same data segment. +wasm-tools print $1 | grep -q 'memory.init 2' + +# Make sure that the data segment in question remains unchanged, as mutating its +# length can change the semantics of the `memory.init` instruction. +wasm-tools print $1 | grep -Eq '\(data \(;2;\) \(i32\.const 32\) "\\01\\02\\03\\04\\05\\06\\07\\08\\ff"\)' + +# Make sure that the `_start` function that contains the `memory.init` is still +# exported, so that running the Wasm will run the `memory.init` instruction. +wasm-tools print $1 | grep -Eq '\(export "_start" \(func 0\)\)' + +# Run the testcase in Wasmtime and make sure that it traps the same way as the +# original test case. +cargo run --manifest-path ~/wasmtime/Cargo.toml -- run $1 2>&1 \ + | grep -q 'wasm trap: out of bounds memory access' +``` + +Note that this script is a little fuzzy! It just checks for `memory.init` and a +particular trap. That trap can correctly occur according to Wasm semantics when +`memory.init` is given certain inputs! This means we need to double check that +the reduced test case actually exhibits a real bug and its inputs haven't been +transformed into something that Wasm semantics specify should indeed +trap. Sometimes writing very precise predicate scripts is difficult, but we do +the best we can and usually it works out fine. + +With the predicate script in hand, we can automatically reduce the original test +case: + +```shell-session +$ wasm-tools shrink predicate.sh test-case.wasm +369 bytes (1.07% smaller) +359 bytes (3.75% smaller) +357 bytes (4.29% smaller) +354 bytes (5.09% smaller) +344 bytes (7.77% smaller) +... +118 bytes (68.36% smaller) +106 bytes (71.58% smaller) +94 bytes (74.80% smaller) +91 bytes (75.60% smaller) +90 bytes (75.87% smaller) + +test-case.shrunken.wasm :: 90 bytes (75.87% smaller) +================================================================================ +(module + (type (;0;) (func)) + (func (;0;) (type 0) + (local i32 f32 i64 f64) + i32.const 0 + i32.const 9 + i32.const 0 + memory.init 2 + ) + (memory (;0;) 1 5) + (export "_start" (func 0)) + (data (;0;) (i32.const 8) "") + (data (;1;) (i32.const 16) "") + (data (;2;) (i32.const 32) "\01\02\03\04\05\06\07\08\ff") +) +================================================================================ +``` + +In this case, the arguments to the original `memory.init` instruction haven't +changed, and neither has the relevant data segment, so the reduced test case +should exhibit the same behavior as the original. + +In the end, it was [determined that Wasmtime was behaving as +expected](https://github.com/bytecodealliance/wasmtime/issues/7779#issuecomment-1894350625), +but the presence of the reduced test case makes it much easier to make that +determination. diff --git a/docs/contributing-release-process.md b/docs/contributing-release-process.md index b25d690567d1..1fa5483d9b06 100644 --- a/docs/contributing-release-process.md +++ b/docs/contributing-release-process.md @@ -6,7 +6,7 @@ others might be curious in this as well! ## Releasing a major version -Major versions of Wasmtime are relased once-a-month. Most of this is automatic +Major versions of Wasmtime are released once-a-month. Most of this is automatic and all that needs to be done is to merge GitHub PRs that CI will generate. At a high-level the structure of Wasmtime's release process is: diff --git a/docs/examples-profiling-vtune.md b/docs/examples-profiling-vtune.md index 61c67d1b572f..9fb45b385865 100644 --- a/docs/examples-profiling-vtune.md +++ b/docs/examples-profiling-vtune.md @@ -4,7 +4,7 @@ and 64-bit x86 architectures. The tool collects profiling data during runtime and then, either through the command line or GUI, provides a variety of options for viewing and analyzing that data. VTune Profiler is available in both -commerical and free options. The free, downloadable version is available +commercial and free options. The free, downloadable version is available [here][download] and is backed by a community forum for support. This version is appropriate for detailed analysis of your Wasm program. @@ -65,7 +65,7 @@ This command tells the VTune collector (`vtune`) to collect hot spot profiling data as Wasmtime is executing `foo.wasm`. The `--profile=vtune` flag enables VTune support in Wasmtime so that the collector is also alerted to JIT events that take place during runtime. The first time this is run, the result of the -command is a results diretory `r000hs/` which contains profiling data for +command is a results directory `r000hs/` which contains profiling data for Wasmtime and the execution of `foo.wasm`. This data can then be read and displayed via the command line or via the VTune GUI by importing the result. diff --git a/docs/examples-rust-wasi.md b/docs/examples-rust-wasi.md index 1cafb1c87e9d..61b4c1251810 100644 --- a/docs/examples-rust-wasi.md +++ b/docs/examples-rust-wasi.md @@ -5,21 +5,29 @@ repository to run the example locally. [code]: https://github.com/bytecodealliance/wasmtime/blob/main/examples/wasi/main.rs -This example shows how to use the [`wasmtime-wasi`] crate to define WASI +This example shows how to use the [`wasi-common`] crate to define WASI functions within a [`Linker`] which can then be used to instantiate a WebAssembly module. -[`wasmtime-wasi`]: https://crates.io/crates/wasmtime-wasi +[`wasi-common`]: https://crates.io/crates/wasi-common [`Linker`]: https://docs.rs/wasmtime/*/wasmtime/struct.Linker.html -## Wasm Source code +### WebAssembly module source code +For this WASI example, this Hello World program is compiled to a WebAssembly module using the WASI Preview 1 API. + +`wasi.rs` ```rust {{#include ../examples/wasi/wasm/wasi.rs}} ``` -## `wasi.rs` +Building this program generates `target/wasm32-wasi/debug/wasi.wasm`, used below. + +### Invoke the WASM module +This example shows adding and configuring the WASI imports to invoke the above WASM module. + +`main.rs` ```rust,ignore {{#include ../examples/wasi/main.rs}} ``` @@ -31,19 +39,19 @@ WasiCtx` from within the `T` stored in the `Store` itself. In the above example this is trivial because the `T` in `Store` is `WasiCtx` itself, but you can also store other state in `Store` like so: -[`add_to_linker`]: https://docs.rs/wasmtime-wasi/*/wasmtime_wasi/sync/fn.add_to_linker.html -[`Store`]: https://docs.rs/wasmtime/0.26.0/wasmtime/struct.Store.html +[`add_to_linker`]: https://docs.rs/wasi-common/*/wasi_common/sync/fn.add_to_linker.html +[`Store`]: https://docs.rs/wasmtime/*/wasmtime/struct.Store.html [`BorrowMut`]: https://doc.rust-lang.org/stable/std/borrow/trait.BorrowMut.html -[`WasiCtx`]: https://docs.rs/wasmtime-wasi/*/wasmtime_wasi/struct.WasiCtx.html +[`WasiCtx`]: https://docs.rs/wasi-common/*/wasi_common/struct.WasiCtx.html ```rust # extern crate wasmtime; -# extern crate wasmtime_wasi; +# extern crate wasi_common; # extern crate anyhow; use anyhow::Result; use std::borrow::{Borrow, BorrowMut}; use wasmtime::*; -use wasmtime_wasi::{WasiCtx, sync::WasiCtxBuilder}; +use wasi_common::{WasiCtx, sync::WasiCtxBuilder}; struct MyState { message: String, @@ -53,7 +61,7 @@ struct MyState { fn main() -> Result<()> { let engine = Engine::default(); let mut linker = Linker::new(&engine); - wasmtime_wasi::add_to_linker(&mut linker, |state: &mut MyState| &mut state.wasi)?; + wasi_common::sync::add_to_linker(&mut linker, |state: &mut MyState| &mut state.wasi)?; let wasi = WasiCtxBuilder::new() .inherit_stdio() @@ -70,3 +78,24 @@ fn main() -> Result<()> { Ok(()) } ``` + +## WASI Preview 2 + +An experimental implementation of the WASI Preview 2 API is also available, along with an adapter layer for WASI Preview 1 WebAssembly modules. In future this `preview2` API will become the default. There are some features which are currently only accessible through the `preview2` API such as async support and overriding the clock and random implementations. + +### Async example + +This [async example code][code2] shows how to use the [wasmtime-wasi::preview2][`preview2`] module to +execute the same WASI Preview 1 WebAssembly module from the example above. This example requires the `wasmtime` crate `async` feature to be enabled. + +This does not require any change to the WebAssembly module, it's just the WASI API host functions which are implemented to be async. See [wasmtime async support](https://docs.wasmtime.dev/api/wasmtime/struct.Config.html#method.async_support). + +[code2]: https://github.com/bytecodealliance/wasmtime/blob/main/examples/wasi-async/main.rs +[`preview2`]: https://docs.rs/wasmtime-wasi/*/wasmtime_wasi/preview2/index.html + +```rust,ignore +{{#include ../examples/wasi-async/main.rs}} +``` + +You can also [browse this source code online][code2] and clone the wasmtime +repository to run the example locally. \ No newline at end of file diff --git a/docs/introduction.md b/docs/introduction.md index 207285c71866..6385e9463585 100644 --- a/docs/introduction.md +++ b/docs/introduction.md @@ -1,7 +1,7 @@ # Introduction -[Wasmtime][github] is a [Bytecode Alliance][BA] project that is a standalone -optimizing runtime for [WebAssembly], [the Component Model], and [WASI]. It runs +[Wasmtime][github] is a standalone optimizing runtime for [WebAssembly], +[the Component Model], and [WASI] by the [Bytecode Alliance][BA]. It runs WebAssembly code [outside of the Web], and can be used both as a command-line utility or as a library embedded in a larger application. Wasmtime strives to be a highly configurable and embeddable runtime to run on any scale of application. diff --git a/docs/stability-tiers.md b/docs/stability-tiers.md index 19c052919241..042c4f7e1f66 100644 --- a/docs/stability-tiers.md +++ b/docs/stability-tiers.md @@ -50,7 +50,7 @@ For explanations of what each tier means see below. | Target | `aarch64-unknown-linux-gnu`| Continuous fuzzing | | Target | `s390x-unknown-linux-gnu` | Continuous fuzzing | | Target | `x86_64-pc-windows-gnu` | Clear owner of the target | -| WebAssembly Proposal | [`memory64`]] | Unstable wasm proposal | +| WebAssembly Proposal | [`memory64`] | Unstable wasm proposal | | WebAssembly Proposal | [`multi-memory`] | Unstable wasm proposal | | WebAssembly Proposal | [`threads`] | Unstable wasm proposal | | WebAssembly Proposal | [`component-model`] | Unstable wasm proposal | diff --git a/docs/zkasm/test-infra.md b/docs/zkasm/test-infra.md new file mode 100644 index 000000000000..2ae20793c3b0 --- /dev/null +++ b/docs/zkasm/test-infra.md @@ -0,0 +1,55 @@ +# About + +We want to build a robust testing infrastructure which will: + +- allow easily add new test. +- allow to reuse existing cranelift tests. +- be easy to introduce new type of tests. + +We want keep our testing infra flexible and friendly to user. Also, this version is not final, and will be improved. For example, testing the interpreter by running wasm in it is out of scope for now. + + +# Testing use cases + +We have two main use cases for our testing infra: + +- CI. We want run our tests in CI to keep quality of code in main branch on high level +- Developing. We want our tests to be easy to run by developer in local machine and see how current version of code works. This use case give us a new requirement -- our testing infra should be fast enough, ideally run in few seconds. + +# How to use testing infra + +## How test file looks like? + +[Filetest docs describe it](https://github.com/bytecodealliance/wasmtime/blob/main/cranelift/filetests/README.md). To run our zkasm test simply add `test run-zkasm` to the header of `.clif` file. + +## How to run a test on my machine? + +To run a single test, you can use next command: +`cargo run -- test /testname.clif` + +To run multiple tests in a directory, you can use: +`cargo run -- test /` + + +# Test infra implementation + +Firstly, our testing infrastructure based on Cranelift testing infrastructure ([filetests](https://github.com/bytecodealliance/wasmtime/blob/main/cranelift/docs/testing.md)). It provides us powerful reusable parts, like test files parsing, and a number of ready to use testcases. + +## Files to look at + +Our `test run-zkasm` is a new test type in filetests, described in `cranelift/filetests/src/test_run_zkasm.rs`. +Also, it can be useful to take a look at `cranelift/filetests/src/zkasm_codegen.rs` with some helper functions. + +## What our test actually do? + +Firstly, test infra parses whole `.clif` file (different `.clif` files are parsed independently and don't affect each other). Than, takes all functions and invocations and build one big zkasm program from them, where assertions are compiled as a special assert function, which don't halt execution of the program if assert fails. Instead, it saves results of assert, and in the end this results are taken to build table with results of whole testfile. There can be four types of results: `pass`, `assert_fails`, `compilation_fails`, `run_time_error`. Unfortunately, with our approach (building one zkasm program for one test file), two last statuses will be applied to all tests in file if any of tests in this file get such result. But, we chosed this approach, because starting of zkasm program takes significant time, and we want our tests be fast and easy to use. Function with custom assert is described in `tests/zkasm/run-tests-zkasm.js` + +## Future improvements + +Probably, we will add some new test types, for example, test type which takes wasm code and executes it in interpreter. + +# Decisions to think + +## One zkasm program per file + +This decision have it's own pros and cons: while it allows to run tests fastly, it leads to not good behaviour in case of compilation and runtime errors. It will be nice to find some better option here. diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 32343ddae679..4277fcdc64d7 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -22,6 +22,9 @@ function(CREATE_TARGET TARGET TARGET_PATH) target_include_directories(wasmtime-${TARGET} PUBLIC wasmtime) target_link_libraries(wasmtime-${TARGET} PUBLIC wasmtime) + if(APPLE) + target_link_libraries(wasmtime-${TARGET} PRIVATE "-framework CoreFoundation") + endif() add_test(NAME ${TARGET}-c COMMAND $ WORKING_DIRECTORY ../..) endfunction() @@ -59,6 +62,7 @@ create_target(wasi wasi/main.c) create_rust_wasm(fib-debug wasm32-unknown-unknown) create_rust_wasm(tokio wasm32-wasi) create_rust_wasm(wasi wasm32-wasi) +create_rust_wasm(component wasm32-unknown-unknown) create_rust_test(epochs) create_rust_test(externref) create_rust_test(fib-debug) @@ -74,3 +78,4 @@ create_rust_test(serialize) create_rust_test(threads) create_rust_test(wasi) create_rust_test(tokio wasmtime-wasi/tokio) +create_rust_test(component) diff --git a/examples/component/convert.wit b/examples/component/convert.wit new file mode 100644 index 000000000000..1a10ce5be4f2 --- /dev/null +++ b/examples/component/convert.wit @@ -0,0 +1,11 @@ +package local:demo; + +world convert { + /// This interface needs to be provided by the host + import host: interface { + /// Example function that does a simple a × b operation + multiply: func(a: float32, b: float32) -> float32; + } + /// Exported function for computing: (°C × 9/5) + 32 = °F + export convert-celsius-to-fahrenheit: func(x: float32) -> float32; +} diff --git a/examples/component/main.rs b/examples/component/main.rs new file mode 100644 index 000000000000..0c5d26389ed0 --- /dev/null +++ b/examples/component/main.rs @@ -0,0 +1,63 @@ +use anyhow::Context; +use std::{fs, path::Path}; +use wit_component; + +use wasmtime::{ + component::{bindgen, Component, Linker}, + Config, Engine, Result, Store, +}; + +// Generate bindings of the guest and host components. +bindgen!("convert" in "./examples/component/convert.wit"); + +struct HostComponent; + +// Implmentation of the host interface defined in the wit file. +impl host::Host for HostComponent { + fn multiply(&mut self, a: f32, b: f32) -> wasmtime::Result { + Ok(a * b) + } +} + +struct MyState { + host: HostComponent, +} + +/// This function is only needed until rust can natively output a component. +/// +/// Generally embeddings should not be expected to do this programatically, but instead +/// language specific tooling should be used, for example in Rust `cargo component` +/// is a good way of doing that: https://github.com/bytecodealliance/cargo-component +/// +/// In this example we convert the code here to simplify the testing process and build system. +fn convert_to_component(path: impl AsRef) -> Result> { + let bytes = &fs::read(&path).context("failed to read input file")?; + wit_component::ComponentEncoder::default() + .module(&bytes)? + .encode() +} + +fn main() -> Result<()> { + // Create an engine with the component model enabled (disabled by default). + let engine = Engine::new(Config::new().wasm_component_model(true))?; + + // NOTE: The wasm32-unknown-unknown target is used here for simplicity, real world use cases + // should probably use the wasm32-wasi target, and enable wasi preview2 within the component + // model. + let component = convert_to_component("target/wasm32-unknown-unknown/debug/guest.wasm")?; + + // Create our component and call our generated host function. + let component = Component::from_binary(&engine, &component)?; + let mut store = Store::new( + &engine, + MyState { + host: HostComponent {}, + }, + ); + let mut linker = Linker::new(&engine); + host::add_to_linker(&mut linker, |state: &mut MyState| &mut state.host)?; + let (convert, _instance) = Convert::instantiate(&mut store, &component, &linker)?; + let result = convert.call_convert_celsius_to_fahrenheit(&mut store, 23.4)?; + println!("Converted to: {:?}", result); + Ok(()) +} diff --git a/examples/component/wasm/Cargo.toml b/examples/component/wasm/Cargo.toml new file mode 100644 index 000000000000..d3380f5120a3 --- /dev/null +++ b/examples/component/wasm/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "example-component-wasm" +version = "0.0.0" +authors = ["The Wasmtime Project Developers"] +edition = "2021" +publish = false + +[dependencies] +wit-bindgen = { workspace = true, default-features = true } + +[lib] +path = "guest.rs" +name = "guest" +crate-type = ["cdylib"] diff --git a/examples/component/wasm/guest.rs b/examples/component/wasm/guest.rs new file mode 100644 index 000000000000..05c806b9c58d --- /dev/null +++ b/examples/component/wasm/guest.rs @@ -0,0 +1,17 @@ +// Use wit_bindgen to generate the bindings from the component model to Rust. +// For more information see: https://github.com/bytecodealliance/wit-bindgen/ +wit_bindgen::generate!({ + path: "..", + world: "convert", + exports: { + world: GuestComponent, + }, +}); + +struct GuestComponent; + +impl Guest for GuestComponent { + fn convert_celsius_to_fahrenheit(x: f32) -> f32 { + host::multiply(x, 1.8) + 32.0 + } +} diff --git a/examples/externref.c b/examples/externref.c index b0107c8db437..f9924bb93fd4 100644 --- a/examples/externref.c +++ b/examples/externref.c @@ -18,7 +18,8 @@ to tweak the `-lpthread` and such annotations as well as the name of the You can also build using cmake: -mkdir build && cd build && cmake .. && cmake --build . --target wasmtime-externref +mkdir build && cd build && cmake .. && \ + cmake --build . --target wasmtime-externref */ #include @@ -28,7 +29,8 @@ mkdir build && cd build && cmake .. && cmake --build . --target wasmtime-externr #include #include -static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_trap_t *trap); +static void exit_with_error(const char *message, wasmtime_error_t *error, + wasm_trap_t *trap); int main() { int ret = 0; @@ -51,14 +53,17 @@ int main() { wasmtime_context_t *context = wasmtime_store_context(store); // Read our input file, which in this case is a wasm text file. - FILE* file = fopen("examples/externref.wat", "r"); + FILE *file = fopen("examples/externref.wat", "r"); assert(file != NULL); fseek(file, 0L, SEEK_END); size_t file_size = ftell(file); fseek(file, 0L, SEEK_SET); wasm_byte_vec_t wat; wasm_byte_vec_new_uninitialized(&wat, file_size); - assert(fread(wat.data, file_size, 1, file) == 1); + if (fread(wat.data, file_size, 1, file) != 1) { + printf("> Error loading module!\n"); + return 1; + } fclose(file); // Parse the wat into the binary wasm format @@ -71,7 +76,7 @@ int main() { // Now that we've got our binary webassembly we can compile our module. printf("Compiling module...\n"); wasmtime_module_t *module = NULL; - error = wasmtime_module_new(engine, (uint8_t*) wasm.data, wasm.size, &module); + error = wasmtime_module_new(engine, (uint8_t *)wasm.data, wasm.size, &module); wasm_byte_vec_delete(&wasm); if (error != NULL) exit_with_error("failed to compile module", error, NULL); @@ -90,18 +95,20 @@ int main() { // // Note that the NULL here is a finalizer callback, but we don't need one for // this example. - wasmtime_externref_t *externref = wasmtime_externref_new("Hello, World!", NULL); + wasmtime_externref_t *externref = + wasmtime_externref_new("Hello, World!", NULL); // The `externref`'s wrapped data should be the string "Hello, World!". - void* data = wasmtime_externref_data(externref); - assert(strcmp((char*)data, "Hello, World!") == 0); + void *data = wasmtime_externref_data(externref); + assert(strcmp((char *)data, "Hello, World!") == 0); printf("Touching `externref` table...\n"); wasmtime_extern_t item; // Lookup the `table` export. - ok = wasmtime_instance_export_get(context, &instance, "table", strlen("table"), &item); + ok = wasmtime_instance_export_get(context, &instance, "table", + strlen("table"), &item); assert(ok); assert(item.kind == WASMTIME_EXTERN_TABLE); @@ -118,13 +125,15 @@ int main() { ok = wasmtime_table_get(context, &item.of.table, 3, &elem); assert(ok); assert(elem.kind == WASMTIME_EXTERNREF); - assert(strcmp((char*)wasmtime_externref_data(elem.of.externref), "Hello, World!") == 0); + assert(strcmp((char *)wasmtime_externref_data(elem.of.externref), + "Hello, World!") == 0); wasmtime_val_delete(&elem); printf("Touching `externref` global...\n"); // Lookup the `global` export. - ok = wasmtime_instance_export_get(context, &instance, "global", strlen("global"), &item); + ok = wasmtime_instance_export_get(context, &instance, "global", + strlen("global"), &item); assert(ok); assert(item.kind == WASMTIME_EXTERN_GLOBAL); @@ -137,26 +146,30 @@ int main() { wasmtime_val_t global_val; wasmtime_global_get(context, &item.of.global, &global_val); assert(global_val.kind == WASMTIME_EXTERNREF); - assert(strcmp((char*)wasmtime_externref_data(elem.of.externref), "Hello, World!") == 0); + assert(strcmp((char *)wasmtime_externref_data(elem.of.externref), + "Hello, World!") == 0); wasmtime_val_delete(&global_val); printf("Calling `externref` func...\n"); // Lookup the `func` export. - ok = wasmtime_instance_export_get(context, &instance, "func", strlen("func"), &item); + ok = wasmtime_instance_export_get(context, &instance, "func", strlen("func"), + &item); assert(ok); assert(item.kind == WASMTIME_EXTERN_FUNC); // And call it! wasmtime_val_t results[1]; - error = wasmtime_func_call(context, &item.of.func, &externref_val, 1, results, 1, &trap); + error = wasmtime_func_call(context, &item.of.func, &externref_val, 1, results, + 1, &trap); if (error != NULL || trap != NULL) exit_with_error("failed to call function", error, trap); // `func` returns the same reference we gave it, so `results[0]` should be our // `externref`. assert(results[0].kind == WASMTIME_EXTERNREF); - assert(strcmp((char*)wasmtime_externref_data(results[0].of.externref), "Hello, World!") == 0); + assert(strcmp((char *)wasmtime_externref_data(results[0].of.externref), + "Hello, World!") == 0); wasmtime_val_delete(&results[0]); // We can GC any now-unused references to our externref that the store is @@ -174,7 +187,8 @@ int main() { return 0; } -static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_trap_t *trap) { +static void exit_with_error(const char *message, wasmtime_error_t *error, + wasm_trap_t *trap) { fprintf(stderr, "error: %s\n", message); wasm_byte_vec_t error_message; if (error != NULL) { @@ -184,7 +198,7 @@ static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_t wasm_trap_message(trap, &error_message); wasm_trap_delete(trap); } - fprintf(stderr, "%.*s\n", (int) error_message.size, error_message.data); + fprintf(stderr, "%.*s\n", (int)error_message.size, error_message.data); wasm_byte_vec_delete(&error_message); exit(1); } diff --git a/examples/fib-debug/main.c b/examples/fib-debug/main.c index 20f0b0acb2ad..dee99461eeef 100644 --- a/examples/fib-debug/main.c +++ b/examples/fib-debug/main.c @@ -1,30 +1,31 @@ +#include #include #include #include -#include #include #include #define own -static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_trap_t *trap); +static void exit_with_error(const char *message, wasmtime_error_t *error, + wasm_trap_t *trap); -int main(int argc, const char* argv[]) { +int main(int argc, const char *argv[]) { // Configuring engine to support generating of DWARF info. // lldb can be used to attach to the program and observe // original fib-wasm.c source code and variables. - wasm_config_t* config = wasm_config_new(); + wasm_config_t *config = wasm_config_new(); wasmtime_config_debug_info_set(config, true); // Initialize. printf("Initializing...\n"); - wasm_engine_t* engine = wasm_engine_new_with_config(config); - wasmtime_store_t* store = wasmtime_store_new(engine, NULL, NULL); - wasmtime_context_t* context = wasmtime_store_context(store); + wasm_engine_t *engine = wasm_engine_new_with_config(config); + wasmtime_store_t *store = wasmtime_store_new(engine, NULL, NULL); + wasmtime_context_t *context = wasmtime_store_context(store); // Load binary. printf("Loading binary...\n"); - FILE* file = fopen("target/wasm32-unknown-unknown/debug/fib.wasm", "rb"); + FILE *file = fopen("target/wasm32-unknown-unknown/debug/fib.wasm", "rb"); if (!file) { printf("> Error opening module!\n"); return 1; @@ -43,7 +44,8 @@ int main(int argc, const char* argv[]) { // Compile. printf("Compiling module...\n"); wasmtime_module_t *module = NULL; - wasmtime_error_t* error = wasmtime_module_new(engine, (uint8_t*) binary.data, binary.size, &module); + wasmtime_error_t *error = + wasmtime_module_new(engine, (uint8_t *)binary.data, binary.size, &module); if (!module) exit_with_error("failed to compile module", error, NULL); wasm_byte_vec_delete(&binary); @@ -68,7 +70,8 @@ int main(int argc, const char* argv[]) { params[0].kind = WASMTIME_I32; params[0].of.i32 = 6; wasmtime_val_t results[1]; - error = wasmtime_func_call(context, &fib.of.func, params, 1, results, 1, &trap); + error = + wasmtime_func_call(context, &fib.of.func, params, 1, results, 1, &trap); if (error != NULL || trap != NULL) exit_with_error("failed to call function", error, trap); @@ -85,7 +88,8 @@ int main(int argc, const char* argv[]) { return 0; } -static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_trap_t *trap) { +static void exit_with_error(const char *message, wasmtime_error_t *error, + wasm_trap_t *trap) { fprintf(stderr, "error: %s\n", message); wasm_byte_vec_t error_message; if (error != NULL) { @@ -93,7 +97,7 @@ static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_t } else { wasm_trap_message(trap, &error_message); } - fprintf(stderr, "%.*s\n", (int) error_message.size, error_message.data); + fprintf(stderr, "%.*s\n", (int)error_message.size, error_message.data); wasm_byte_vec_delete(&error_message); exit(1); } diff --git a/examples/fib-debug/wasm/Cargo.toml b/examples/fib-debug/wasm/Cargo.toml index 483a0b05a772..d0b7c908c33e 100644 --- a/examples/fib-debug/wasm/Cargo.toml +++ b/examples/fib-debug/wasm/Cargo.toml @@ -5,6 +5,9 @@ authors = ["The Wasmtime Project Developers"] edition = "2021" publish = false +[lints] +workspace = true + [lib] crate-type = ["cdylib"] path = "fib.rs" diff --git a/examples/fuel.c b/examples/fuel.c index 173bdcf58d77..945dc5bf5f24 100644 --- a/examples/fuel.c +++ b/examples/fuel.c @@ -27,7 +27,8 @@ mkdir build && cd build && cmake .. && cmake --build . --target wasmtime-fuel #include #include -static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_trap_t *trap); +static void exit_with_error(const char *message, wasmtime_error_t *error, + wasm_trap_t *trap); int main() { wasmtime_error_t *error = NULL; @@ -36,7 +37,8 @@ int main() { assert(config != NULL); wasmtime_config_consume_fuel_set(config, true); - // Create an *engine*, which is a compilation context, with our configured options. + // Create an *engine*, which is a compilation context, with our configured + // options. wasm_engine_t *engine = wasm_engine_new_with_config(config); assert(engine != NULL); wasmtime_store_t *store = wasmtime_store_new(engine, NULL, NULL); @@ -48,7 +50,7 @@ int main() { exit_with_error("failed to set fuel", error, NULL); // Load our input file to parse it next - FILE* file = fopen("examples/fuel.wat", "r"); + FILE *file = fopen("examples/fuel.wat", "r"); if (!file) { printf("> Error loading file!\n"); return 1; @@ -73,7 +75,7 @@ int main() { // Compile and instantiate our module wasmtime_module_t *module = NULL; - error = wasmtime_module_new(engine, (uint8_t*) wasm.data, wasm.size, &module); + error = wasmtime_module_new(engine, (uint8_t *)wasm.data, wasm.size, &module); if (module == NULL) exit_with_error("failed to compile module", error, NULL); wasm_byte_vec_delete(&wasm); @@ -86,19 +88,21 @@ int main() { // Lookup our `fibonacci` export function wasmtime_extern_t fib; - bool ok = wasmtime_instance_export_get(context, &instance, "fibonacci", strlen("fibonacci"), &fib); + bool ok = wasmtime_instance_export_get(context, &instance, "fibonacci", + strlen("fibonacci"), &fib); assert(ok); assert(fib.kind == WASMTIME_EXTERN_FUNC); // Call it repeatedly until it fails - for (int n = 1; ; n++) { + for (int n = 1;; n++) { uint64_t fuel_before; wasmtime_context_get_fuel(context, &fuel_before); wasmtime_val_t params[1]; params[0].kind = WASMTIME_I32; params[0].of.i32 = n; wasmtime_val_t results[1]; - error = wasmtime_func_call(context, &fib.of.func, params, 1, results, 1, &trap); + error = + wasmtime_func_call(context, &fib.of.func, params, 1, results, 1, &trap); if (error != NULL || trap != NULL) { if (trap != NULL) { wasmtime_trap_code_t code; @@ -112,7 +116,8 @@ int main() { uint64_t fuel_after; wasmtime_context_get_fuel(context, &fuel_after); assert(results[0].kind == WASMTIME_I32); - printf("fib(%d) = %d [consumed %lu fuel]\n", n, results[0].of.i32, fuel_after - fuel_before); + printf("fib(%d) = %d [consumed %lu fuel]\n", n, results[0].of.i32, + fuel_after - fuel_before); error = wasmtime_context_set_fuel(context, 10000); if (error != NULL) @@ -126,7 +131,8 @@ int main() { return 0; } -static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_trap_t *trap) { +static void exit_with_error(const char *message, wasmtime_error_t *error, + wasm_trap_t *trap) { fprintf(stderr, "error: %s\n", message); wasm_byte_vec_t error_message; if (error != NULL) { @@ -134,7 +140,7 @@ static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_t } else { wasm_trap_message(trap, &error_message); } - fprintf(stderr, "%.*s\n", (int) error_message.size, error_message.data); + fprintf(stderr, "%.*s\n", (int)error_message.size, error_message.data); wasm_byte_vec_delete(&error_message); exit(1); } diff --git a/examples/gcd.c b/examples/gcd.c index cac7f6bb0dd4..9f7f45c0a561 100644 --- a/examples/gcd.c +++ b/examples/gcd.c @@ -27,7 +27,8 @@ mkdir build && cd build && cmake .. && cmake --build . --target wasmtime-gcd #include #include -static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_trap_t *trap); +static void exit_with_error(const char *message, wasmtime_error_t *error, + wasm_trap_t *trap); int main() { int ret = 0; @@ -39,7 +40,7 @@ int main() { wasmtime_context_t *context = wasmtime_store_context(store); // Load our input file to parse it next - FILE* file = fopen("examples/gcd.wat", "r"); + FILE *file = fopen("examples/gcd.wat", "r"); if (!file) { printf("> Error loading file!\n"); return 1; @@ -64,7 +65,7 @@ int main() { // Compile and instantiate our module wasmtime_module_t *module = NULL; - error = wasmtime_module_new(engine, (uint8_t*) wasm.data, wasm.size, &module); + error = wasmtime_module_new(engine, (uint8_t *)wasm.data, wasm.size, &module); if (module == NULL) exit_with_error("failed to compile module", error, NULL); wasm_byte_vec_delete(&wasm); @@ -90,7 +91,8 @@ int main() { params[1].kind = WASMTIME_I32; params[1].of.i32 = b; wasmtime_val_t results[1]; - error = wasmtime_func_call(context, &gcd.of.func, params, 2, results, 1, &trap); + error = + wasmtime_func_call(context, &gcd.of.func, params, 2, results, 1, &trap); if (error != NULL || trap != NULL) exit_with_error("failed to call gcd", error, trap); assert(results[0].kind == WASMTIME_I32); @@ -106,7 +108,8 @@ int main() { return ret; } -static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_trap_t *trap) { +static void exit_with_error(const char *message, wasmtime_error_t *error, + wasm_trap_t *trap) { fprintf(stderr, "error: %s\n", message); wasm_byte_vec_t error_message; if (error != NULL) { @@ -114,7 +117,7 @@ static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_t } else { wasm_trap_message(trap, &error_message); } - fprintf(stderr, "%.*s\n", (int) error_message.size, error_message.data); + fprintf(stderr, "%.*s\n", (int)error_message.size, error_message.data); wasm_byte_vec_delete(&error_message); exit(1); } diff --git a/examples/hello.c b/examples/hello.c index 5adf97b9b9ad..dc7343432c74 100644 --- a/examples/hello.c +++ b/examples/hello.c @@ -28,16 +28,12 @@ mkdir build && cd build && cmake .. && cmake --build . --target wasmtime-hello #include #include -static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_trap_t *trap); - -static wasm_trap_t* hello_callback( - void *env, - wasmtime_caller_t *caller, - const wasmtime_val_t *args, - size_t nargs, - wasmtime_val_t *results, - size_t nresults -) { +static void exit_with_error(const char *message, wasmtime_error_t *error, + wasm_trap_t *trap); + +static wasm_trap_t *hello_callback(void *env, wasmtime_caller_t *caller, + const wasmtime_val_t *args, size_t nargs, + wasmtime_val_t *results, size_t nresults) { printf("Calling back...\n"); printf("> Hello World!\n"); return NULL; @@ -60,14 +56,17 @@ int main() { wasmtime_context_t *context = wasmtime_store_context(store); // Read our input file, which in this case is a wasm text file. - FILE* file = fopen("examples/hello.wat", "r"); + FILE *file = fopen("examples/hello.wat", "r"); assert(file != NULL); fseek(file, 0L, SEEK_END); size_t file_size = ftell(file); fseek(file, 0L, SEEK_SET); wasm_byte_vec_t wat; wasm_byte_vec_new_uninitialized(&wat, file_size); - assert(fread(wat.data, file_size, 1, file) == 1); + if (fread(wat.data, file_size, 1, file) != 1) { + printf("> Error loading module!\n"); + return 1; + } fclose(file); // Parse the wat into the binary wasm format @@ -80,7 +79,7 @@ int main() { // Now that we've got our binary webassembly we can compile our module. printf("Compiling module...\n"); wasmtime_module_t *module = NULL; - error = wasmtime_module_new(engine, (uint8_t*) wasm.data, wasm.size, &module); + error = wasmtime_module_new(engine, (uint8_t *)wasm.data, wasm.size, &module); wasm_byte_vec_delete(&wasm); if (error != NULL) exit_with_error("failed to compile module", error, NULL); @@ -131,7 +130,8 @@ int main() { return ret; } -static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_trap_t *trap) { +static void exit_with_error(const char *message, wasmtime_error_t *error, + wasm_trap_t *trap) { fprintf(stderr, "error: %s\n", message); wasm_byte_vec_t error_message; if (error != NULL) { @@ -141,7 +141,7 @@ static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_t wasm_trap_message(trap, &error_message); wasm_trap_delete(trap); } - fprintf(stderr, "%.*s\n", (int) error_message.size, error_message.data); + fprintf(stderr, "%.*s\n", (int)error_message.size, error_message.data); wasm_byte_vec_delete(&error_message); exit(1); } diff --git a/examples/interrupt.c b/examples/interrupt.c index 900bd2b64cd5..13292f2ca52b 100644 --- a/examples/interrupt.c +++ b/examples/interrupt.c @@ -19,7 +19,8 @@ to tweak the `-lpthread` and such annotations as well as the name of the You can also build using cmake: -mkdir build && cd build && cmake .. && cmake --build . --target wasmtime-interrupt +mkdir build && cd build && cmake .. && \ + cmake --build . --target wasmtime-interrupt */ #include @@ -36,7 +37,7 @@ static void spawn_interrupt(wasm_engine_t *engine) { #include #include -static void* helper(void *_engine) { +static void *helper(void *_engine) { wasm_engine_t *engine = _engine; struct timespec sleep_dur; sleep_dur.tv_sec = 1; @@ -54,7 +55,8 @@ static void spawn_interrupt(wasm_engine_t *engine) { } #endif -static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_trap_t *trap); +static void exit_with_error(const char *message, wasmtime_error_t *error, + wasm_trap_t *trap); int main() { // Create a `wasm_store_t` with interrupts enabled @@ -71,14 +73,17 @@ int main() { wasmtime_context_set_epoch_deadline(context, 1); // Read our input file, which in this case is a wasm text file. - FILE* file = fopen("examples/interrupt.wat", "r"); + FILE *file = fopen("examples/interrupt.wat", "r"); assert(file != NULL); fseek(file, 0L, SEEK_END); size_t file_size = ftell(file); fseek(file, 0L, SEEK_SET); wasm_byte_vec_t wat; wasm_byte_vec_new_uninitialized(&wat, file_size); - assert(fread(wat.data, file_size, 1, file) == 1); + if (fread(wat.data, file_size, 1, file) != 1) { + printf("> Error loading module!\n"); + return 1; + } fclose(file); // Parse the wat into the binary wasm format @@ -90,7 +95,7 @@ int main() { // Now that we've got our binary webassembly we can compile our module. wasmtime_module_t *module = NULL; - error = wasmtime_module_new(engine, (uint8_t*) wasm.data, wasm.size, &module); + error = wasmtime_module_new(engine, (uint8_t *)wasm.data, wasm.size, &module); wasm_byte_vec_delete(&wasm); if (error != NULL) exit_with_error("failed to compile module", error, NULL); @@ -123,7 +128,8 @@ int main() { return 0; } -static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_trap_t *trap) { +static void exit_with_error(const char *message, wasmtime_error_t *error, + wasm_trap_t *trap) { fprintf(stderr, "error: %s\n", message); wasm_byte_vec_t error_message; if (error != NULL) { @@ -133,7 +139,7 @@ static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_t wasm_trap_message(trap, &error_message); wasm_trap_delete(trap); } - fprintf(stderr, "%.*s\n", (int) error_message.size, error_message.data); + fprintf(stderr, "%.*s\n", (int)error_message.size, error_message.data); wasm_byte_vec_delete(&error_message); exit(1); } diff --git a/examples/linking.c b/examples/linking.c index b32d46890c0a..d048451c207c 100644 --- a/examples/linking.c +++ b/examples/linking.c @@ -24,14 +24,16 @@ mkdir build && cd build && cmake .. && cmake --build . --target wasmtime-linking #include #include #include -#include #include +#include #include #define MIN(a, b) ((a) < (b) ? (a) : (b)) -static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_trap_t *trap); -static void read_wat_file(wasm_engine_t *engine, wasm_byte_vec_t *bytes, const char *file); +static void exit_with_error(const char *message, wasmtime_error_t *error, + wasm_trap_t *trap); +static void read_wat_file(wasm_engine_t *engine, wasm_byte_vec_t *bytes, + const char *file); int main() { // Set up our context @@ -49,10 +51,12 @@ int main() { wasmtime_error_t *error; wasmtime_module_t *linking1_module = NULL; wasmtime_module_t *linking2_module = NULL; - error = wasmtime_module_new(engine, (uint8_t*) linking1_wasm.data, linking1_wasm.size, &linking1_module); + error = wasmtime_module_new(engine, (uint8_t *)linking1_wasm.data, + linking1_wasm.size, &linking1_module); if (error != NULL) exit_with_error("failed to compile linking1", error, NULL); - error = wasmtime_module_new(engine, (uint8_t*) linking2_wasm.data, linking2_wasm.size, &linking2_module); + error = wasmtime_module_new(engine, (uint8_t *)linking2_wasm.data, + linking2_wasm.size, &linking2_module); if (error != NULL) exit_with_error("failed to compile linking2", error, NULL); wasm_byte_vec_delete(&linking1_wasm); @@ -80,18 +84,21 @@ int main() { // Instantiate `linking2` with our linker. wasmtime_instance_t linking2; - error = wasmtime_linker_instantiate(linker, context, linking2_module, &linking2, &trap); + error = wasmtime_linker_instantiate(linker, context, linking2_module, + &linking2, &trap); if (error != NULL || trap != NULL) exit_with_error("failed to instantiate linking2", error, trap); // Register our new `linking2` instance with the linker - error = wasmtime_linker_define_instance(linker, context, "linking2", strlen("linking2"), &linking2); + error = wasmtime_linker_define_instance(linker, context, "linking2", + strlen("linking2"), &linking2); if (error != NULL) exit_with_error("failed to link linking2", error, NULL); // Instantiate `linking1` with the linker now that `linking2` is defined wasmtime_instance_t linking1; - error = wasmtime_linker_instantiate(linker, context, linking1_module, &linking1, &trap); + error = wasmtime_linker_instantiate(linker, context, linking1_module, + &linking1, &trap); if (error != NULL || trap != NULL) exit_with_error("failed to instantiate linking1", error, trap); @@ -113,14 +120,11 @@ int main() { return 0; } -static void read_wat_file( - wasm_engine_t *engine, - wasm_byte_vec_t *bytes, - const char *filename -) { +static void read_wat_file(wasm_engine_t *engine, wasm_byte_vec_t *bytes, + const char *filename) { wasm_byte_vec_t wat; // Load our input file to parse it next - FILE* file = fopen(filename, "r"); + FILE *file = fopen(filename, "r"); if (!file) { printf("> Error loading file!\n"); exit(1); @@ -142,7 +146,8 @@ static void read_wat_file( wasm_byte_vec_delete(&wat); } -static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_trap_t *trap) { +static void exit_with_error(const char *message, wasmtime_error_t *error, + wasm_trap_t *trap) { fprintf(stderr, "error: %s\n", message); wasm_byte_vec_t error_message; if (error != NULL) { @@ -152,7 +157,7 @@ static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_t wasm_trap_message(trap, &error_message); wasm_trap_delete(trap); } - fprintf(stderr, "%.*s\n", (int) error_message.size, error_message.data); + fprintf(stderr, "%.*s\n", (int)error_message.size, error_message.data); wasm_byte_vec_delete(&error_message); exit(1); } diff --git a/examples/linking.rs b/examples/linking.rs index a2d75605725a..c3c9502880a8 100644 --- a/examples/linking.rs +++ b/examples/linking.rs @@ -3,8 +3,8 @@ // You can execute this example with `cargo run --example linking` use anyhow::Result; +use wasi_common::sync::WasiCtxBuilder; use wasmtime::*; -use wasmtime_wasi::sync::WasiCtxBuilder; fn main() -> Result<()> { let engine = Engine::default(); @@ -12,7 +12,7 @@ fn main() -> Result<()> { // First set up our linker which is going to be linking modules together. We // want our linker to have wasi available, so we set that up here as well. let mut linker = Linker::new(&engine); - wasmtime_wasi::add_to_linker(&mut linker, |s| s)?; + wasi_common::sync::add_to_linker(&mut linker, |s| s)?; // Load and compile our two modules let linking1 = Module::from_file(&engine, "examples/linking1.wat")?; diff --git a/examples/memory.c b/examples/memory.c index 37eaf0e13744..3f4bf311ee0c 100644 --- a/examples/memory.c +++ b/examples/memory.c @@ -32,7 +32,8 @@ originally #include #include -static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_trap_t *trap); +static void exit_with_error(const char *message, wasmtime_error_t *error, + wasm_trap_t *trap); void check(bool success) { if (!success) { @@ -41,16 +42,12 @@ void check(bool success) { } } -void check_call(wasmtime_context_t *store, - wasmtime_func_t *func, - const wasmtime_val_t* args, - size_t nargs, - int32_t expected) { +void check_call(wasmtime_context_t *store, wasmtime_func_t *func, + const wasmtime_val_t *args, size_t nargs, int32_t expected) { wasmtime_val_t results[1]; wasm_trap_t *trap = NULL; - wasmtime_error_t *error = wasmtime_func_call( - store, func, args, nargs, results, 1, &trap - ); + wasmtime_error_t *error = + wasmtime_func_call(store, func, args, nargs, results, 1, &trap); if (error != NULL || trap != NULL) exit_with_error("failed to call function", error, trap); if (results[0].of.i32 != expected) { @@ -59,18 +56,21 @@ void check_call(wasmtime_context_t *store, } } -void check_call0(wasmtime_context_t *store, wasmtime_func_t *func, int32_t expected) { +void check_call0(wasmtime_context_t *store, wasmtime_func_t *func, + int32_t expected) { check_call(store, func, NULL, 0, expected); } -void check_call1(wasmtime_context_t *store, wasmtime_func_t *func, int32_t arg, int32_t expected) { +void check_call1(wasmtime_context_t *store, wasmtime_func_t *func, int32_t arg, + int32_t expected) { wasmtime_val_t args[1]; args[0].kind = WASMTIME_I32; args[0].of.i32 = arg; check_call(store, func, args, 1, expected); } -void check_call2(wasmtime_context_t *store, wasmtime_func_t *func, int32_t arg1, int32_t arg2, int32_t expected) { +void check_call2(wasmtime_context_t *store, wasmtime_func_t *func, int32_t arg1, + int32_t arg2, int32_t expected) { wasmtime_val_t args[2]; args[0].kind = WASMTIME_I32; args[0].of.i32 = arg1; @@ -79,14 +79,17 @@ void check_call2(wasmtime_context_t *store, wasmtime_func_t *func, int32_t arg1, check_call(store, func, args, 2, expected); } -void check_ok(wasmtime_context_t *store, wasmtime_func_t *func, const wasmtime_val_t* args, size_t nargs) { +void check_ok(wasmtime_context_t *store, wasmtime_func_t *func, + const wasmtime_val_t *args, size_t nargs) { wasm_trap_t *trap = NULL; - wasmtime_error_t *error = wasmtime_func_call(store, func, args, nargs, NULL, 0, &trap); + wasmtime_error_t *error = + wasmtime_func_call(store, func, args, nargs, NULL, 0, &trap); if (error != NULL || trap != NULL) exit_with_error("failed to call function", error, trap); } -void check_ok2(wasmtime_context_t *store, wasmtime_func_t *func, int32_t arg1, int32_t arg2) { +void check_ok2(wasmtime_context_t *store, wasmtime_func_t *func, int32_t arg1, + int32_t arg2) { wasmtime_val_t args[2]; args[0].kind = WASMTIME_I32; args[0].of.i32 = arg1; @@ -95,15 +98,13 @@ void check_ok2(wasmtime_context_t *store, wasmtime_func_t *func, int32_t arg1, i check_ok(store, func, args, 2); } -void check_trap(wasmtime_context_t *store, - wasmtime_func_t *func, - const wasmtime_val_t *args, - size_t nargs, - size_t num_results) { +void check_trap(wasmtime_context_t *store, wasmtime_func_t *func, + const wasmtime_val_t *args, size_t nargs, size_t num_results) { assert(num_results <= 1); wasmtime_val_t results[1]; wasm_trap_t *trap = NULL; - wasmtime_error_t *error = wasmtime_func_call(store, func, args, nargs, results, num_results, &trap); + wasmtime_error_t *error = + wasmtime_func_call(store, func, args, nargs, results, num_results, &trap); if (error != NULL) exit_with_error("failed to call function", error, NULL); if (trap == NULL) { @@ -113,14 +114,16 @@ void check_trap(wasmtime_context_t *store, wasm_trap_delete(trap); } -void check_trap1(wasmtime_context_t *store, wasmtime_func_t *func, int32_t arg) { +void check_trap1(wasmtime_context_t *store, wasmtime_func_t *func, + int32_t arg) { wasmtime_val_t args[1]; args[0].kind = WASMTIME_I32; args[0].of.i32 = arg; check_trap(store, func, args, 1, 1); } -void check_trap2(wasmtime_context_t *store, wasmtime_func_t *func, int32_t arg1, int32_t arg2) { +void check_trap2(wasmtime_context_t *store, wasmtime_func_t *func, int32_t arg1, + int32_t arg2) { wasmtime_val_t args[2]; args[0].kind = WASMTIME_I32; args[0].of.i32 = arg1; @@ -129,15 +132,15 @@ void check_trap2(wasmtime_context_t *store, wasmtime_func_t *func, int32_t arg1, check_trap(store, func, args, 2, 0); } -int main(int argc, const char* argv[]) { +int main(int argc, const char *argv[]) { // Initialize. printf("Initializing...\n"); - wasm_engine_t* engine = wasm_engine_new(); - wasmtime_store_t* store = wasmtime_store_new(engine, NULL, NULL); + wasm_engine_t *engine = wasm_engine_new(); + wasmtime_store_t *store = wasmtime_store_new(engine, NULL, NULL); wasmtime_context_t *context = wasmtime_store_context(store); // Load our input file to parse it next - FILE* file = fopen("examples/memory.wat", "r"); + FILE *file = fopen("examples/memory.wat", "r"); if (!file) { printf("> Error loading file!\n"); return 1; @@ -162,8 +165,9 @@ int main(int argc, const char* argv[]) { // Compile. printf("Compiling module...\n"); - wasmtime_module_t* module = NULL; - error = wasmtime_module_new(engine, (uint8_t*) binary.data, binary.size, &module); + wasmtime_module_t *module = NULL; + error = + wasmtime_module_new(engine, (uint8_t *)binary.data, binary.size, &module); if (error) exit_with_error("failed to compile module", error, NULL); wasm_byte_vec_delete(&binary); @@ -183,16 +187,20 @@ int main(int argc, const char* argv[]) { wasmtime_func_t size_func, load_func, store_func; wasmtime_extern_t item; bool ok; - ok = wasmtime_instance_export_get(context, &instance, "memory", strlen("memory"), &item); + ok = wasmtime_instance_export_get(context, &instance, "memory", + strlen("memory"), &item); assert(ok && item.kind == WASMTIME_EXTERN_MEMORY); memory = item.of.memory; - ok = wasmtime_instance_export_get(context, &instance, "size", strlen("size"), &item); + ok = wasmtime_instance_export_get(context, &instance, "size", strlen("size"), + &item); assert(ok && item.kind == WASMTIME_EXTERN_FUNC); size_func = item.of.func; - ok = wasmtime_instance_export_get(context, &instance, "load", strlen("load"), &item); + ok = wasmtime_instance_export_get(context, &instance, "load", strlen("load"), + &item); assert(ok && item.kind == WASMTIME_EXTERN_FUNC); load_func = item.of.func; - ok = wasmtime_instance_export_get(context, &instance, "store", strlen("store"), &item); + ok = wasmtime_instance_export_get(context, &instance, "store", + strlen("store"), &item); assert(ok && item.kind == WASMTIME_EXTERN_FUNC); store_func = item.of.func; @@ -246,7 +254,7 @@ int main(int argc, const char* argv[]) { // Create stand-alone memory. printf("Creating stand-alone memory...\n"); wasm_limits_t limits = {5, 5}; - wasm_memorytype_t* memorytype = wasm_memorytype_new(&limits); + wasm_memorytype_t *memorytype = wasm_memorytype_new(&limits); wasmtime_memory_t memory2; error = wasmtime_memory_new(context, memorytype, &memory2); if (error != NULL) @@ -264,7 +272,8 @@ int main(int argc, const char* argv[]) { return 0; } -static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_trap_t *trap) { +static void exit_with_error(const char *message, wasmtime_error_t *error, + wasm_trap_t *trap) { fprintf(stderr, "error: %s\n", message); wasm_byte_vec_t error_message; if (error != NULL) { @@ -274,7 +283,7 @@ static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_t wasm_trap_message(trap, &error_message); wasm_trap_delete(trap); } - fprintf(stderr, "%.*s\n", (int) error_message.size, error_message.data); + fprintf(stderr, "%.*s\n", (int)error_message.size, error_message.data); wasm_byte_vec_delete(&error_message); exit(1); } diff --git a/examples/mpk-available.rs b/examples/mpk-available.rs new file mode 100644 index 000000000000..e486631123b9 --- /dev/null +++ b/examples/mpk-available.rs @@ -0,0 +1,16 @@ +//! This example checks if memory protection keys (MPK) are available on the +//! current system using the +//! [`PoolingAllocationConfig::are_memory_protection_keys_available`] API. + +use std::process::exit; +use wasmtime::*; + +fn main() { + if PoolingAllocationConfig::are_memory_protection_keys_available() { + eprintln!("MPK is available"); + exit(0); + } else { + eprintln!("MPK is not available"); + exit(1); + } +} diff --git a/examples/mpk.rs b/examples/mpk.rs new file mode 100644 index 000000000000..05300f96c326 --- /dev/null +++ b/examples/mpk.rs @@ -0,0 +1,264 @@ +//! This example demonstrates: +//! - how to enable memory protection keys (MPK) in a Wasmtime embedding (see +//! [`build_engine`]) +//! - the expected memory compression from using MPK: it will probe the system +//! by creating larger and larger memory pools until system memory is +//! exhausted (see [`probe_engine_size`]). Then, it prints a comparison of the +//! memory used in both the MPK enabled and MPK disabled configurations. +//! +//! You can execute this example with: +//! +//! ```console +//! $ cargo run --example mpk +//! ``` +//! +//! Append `-- --help` for details about the configuring the memory size of the +//! pool. Also, to inspect interesting configuration values used for +//! constructing the pool, turn on logging: +//! +//! ```console +//! $ RUST_LOG=debug cargo run --example mpk -- --memory-size 512MiB +//! ``` +//! +//! Note that MPK support is limited to x86 Linux systems. OS limits on the +//! number of virtual memory areas (VMAs) can significantly restrict the total +//! number MPK-striped memory slots; each MPK-protected slot ends up using a new +//! VMA entry. On Linux, one can raise this limit: +//! +//! ```console +//! $ sysctl vm.max_map_count +//! 65530 +//! $ sysctl vm.max_map_count=$LARGER_LIMIT +//! ``` + +use anyhow::{anyhow, Result}; +use bytesize::ByteSize; +use clap::Parser; +use log::{info, warn}; +use std::str::FromStr; +use wasmtime::*; + +fn main() -> Result<()> { + env_logger::init(); + let args = Args::parse(); + info!("{:?}", args); + + let without_mpk = probe_engine_size(&args, MpkEnabled::Disable)?; + println!("without MPK:\t{}", without_mpk.to_string()); + + if PoolingAllocationConfig::are_memory_protection_keys_available() { + let with_mpk = probe_engine_size(&args, MpkEnabled::Enable)?; + println!("with MPK:\t{}", with_mpk.to_string()); + println!( + "\t\t{}x more slots per reserved memory", + with_mpk.compare(&without_mpk) + ); + } else { + println!("with MPK:\tunavailable\t\tunavailable"); + } + + Ok(()) +} + +#[derive(Debug, Parser)] +#[command(author, version, about, long_about = None)] +struct Args { + /// The maximum number of bytes for each WebAssembly linear memory in the + /// pool. + #[arg(long, default_value = "128MiB", value_parser = parse_byte_size)] + memory_size: u64, + + /// The maximum number of bytes a memory is considered static; see + /// `Config::static_memory_maximum_size` for more details and the default + /// value if unset. + #[arg(long, value_parser = parse_byte_size)] + static_memory_maximum_size: Option, + + /// The size in bytes of the guard region to expect between static memory + /// slots; see [`Config::static_memory_guard_size`] for more details and the + /// default value if unset. + #[arg(long, value_parser = parse_byte_size)] + static_memory_guard_size: Option, +} + +/// Parse a human-readable byte size--e.g., "512 MiB"--into the correct number +/// of bytes. +fn parse_byte_size(value: &str) -> Result { + let size = ByteSize::from_str(value).map_err(|e| anyhow!(e))?; + Ok(size.as_u64()) +} + +/// Find the engine with the largest number of memories we can create on this +/// machine. +fn probe_engine_size(args: &Args, mpk: MpkEnabled) -> Result { + let mut search = ExponentialSearch::new(); + let mut mapped_bytes = 0; + while !search.done() { + match build_engine(&args, search.next(), mpk) { + Ok(rb) => { + // TODO: assert!(rb >= mapped_bytes); + mapped_bytes = rb; + search.record(true) + } + Err(e) => { + warn!("failed engine allocation, continuing search: {:?}", e); + search.record(false) + } + } + } + Ok(Pool { + num_memories: search.next(), + mapped_bytes, + }) +} + +#[derive(Debug)] +#[allow(dead_code)] +struct Pool { + num_memories: u32, + mapped_bytes: usize, +} +impl Pool { + /// Print a human-readable, tab-separated description of this structure. + fn to_string(&self) -> String { + let human_size = ByteSize::b(self.mapped_bytes as u64).to_string_as(true); + format!( + "{} memory slots\t{} reserved", + self.num_memories, human_size + ) + } + /// Return the number of times more memory slots in `self` than `other` + /// after normalizing by the mapped bytes sizes. Rounds to three decimal + /// places arbitrarily; no significance intended. + fn compare(&self, other: &Pool) -> f64 { + let size_ratio = other.mapped_bytes as f64 / self.mapped_bytes as f64; + let slots_ratio = self.num_memories as f64 / other.num_memories as f64; + let times_more_efficient = slots_ratio * size_ratio; + (times_more_efficient * 1000.0).round() / 1000.0 + } +} + +/// Exponentially increase the `next` value until the attempts fail, then +/// perform a binary search to find the maximum attempted value that still +/// succeeds. +#[derive(Debug)] +struct ExponentialSearch { + /// Determines if we are in the growth phase. + growing: bool, + /// The last successful value tried; this is the algorithm's lower bound. + last: u32, + /// The next value to try; this is the algorithm's upper bound. + next: u32, +} +impl ExponentialSearch { + fn new() -> Self { + Self { + growing: true, + last: 0, + next: 1, + } + } + fn next(&self) -> u32 { + self.next + } + fn record(&mut self, success: bool) { + if !success { + self.growing = false + } + let diff = if self.growing { + (self.next - self.last) * 2 + } else { + (self.next - self.last + 1) / 2 + }; + if success { + self.last = self.next; + self.next = self.next + diff; + } else { + self.next = self.next - diff; + } + } + fn done(&self) -> bool { + self.last == self.next + } +} + +/// Build a pool-allocated engine with `num_memories` slots. +fn build_engine(args: &Args, num_memories: u32, enable_mpk: MpkEnabled) -> Result { + // Configure the memory pool. + let mut pool = PoolingAllocationConfig::default(); + let memory_pages = args.memory_size / u64::from(wasmtime_environ::WASM_PAGE_SIZE); + pool.memory_pages(memory_pages); + pool.total_memories(num_memories) + .memory_protection_keys(enable_mpk); + + // Configure the engine itself. + let mut config = Config::new(); + if let Some(static_memory_maximum_size) = args.static_memory_maximum_size { + config.static_memory_maximum_size(static_memory_maximum_size); + } + if let Some(static_memory_guard_size) = args.static_memory_guard_size { + config.static_memory_guard_size(static_memory_guard_size); + } + config.allocation_strategy(InstanceAllocationStrategy::Pooling(pool)); + + // Measure memory use before and after the engine is built. + let mapped_bytes_before = num_bytes_mapped()?; + let engine = Engine::new(&config)?; + let mapped_bytes_after = num_bytes_mapped()?; + + // Ensure we actually use the engine somehow. + engine.increment_epoch(); + + let mapped_bytes = mapped_bytes_after - mapped_bytes_before; + info!( + "{}-slot pool ({:?}): {} bytes mapped", + num_memories, enable_mpk, mapped_bytes + ); + Ok(mapped_bytes) +} + +/// Add up the sizes of all the mapped virtual memory regions for the current +/// Linux process. +/// +/// This manually parses `/proc/self/maps` to avoid a rather-large `proc-maps` +/// dependency. We do expect this example to be Linux-specific anyways. For +/// reference, lines of that file look like: +/// +/// ```text +/// 5652d4418000-5652d441a000 r--p 00000000 00:23 84629427 /usr/bin/... +/// ``` +/// +/// We parse the start and end addresses: - [ignore the rest]. +#[cfg(target_os = "linux")] +fn num_bytes_mapped() -> Result { + use std::fs::File; + use std::io::{BufRead, BufReader}; + + let file = File::open("/proc/self/maps")?; + let reader = BufReader::new(file); + let mut total = 0; + for line in reader.lines() { + let line = line?; + let range = line + .split_whitespace() + .next() + .ok_or(anyhow!("parse failure: expected whitespace"))?; + let mut addresses = range.split("-"); + let start = addresses + .next() + .ok_or(anyhow!("parse failure: expected dash-separated address"))?; + let start = usize::from_str_radix(start, 16)?; + let end = addresses + .next() + .ok_or(anyhow!("parse failure: expected dash-separated address"))?; + let end = usize::from_str_radix(end, 16)?; + + total += end - start; + } + Ok(total) +} + +#[cfg(not(target_os = "linux"))] +fn num_bytes_mapped() -> Result { + anyhow::bail!("this example can only read virtual memory maps on Linux") +} diff --git a/examples/multi.c b/examples/multi.c index 4039e2a89eb8..6edcdd18b0d8 100644 --- a/examples/multi.c +++ b/examples/multi.c @@ -25,26 +25,22 @@ Also note that this example was taken from originally */ +#include #include #include #include -#include #include #include -static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_trap_t *trap); +static void exit_with_error(const char *message, wasmtime_error_t *error, + wasm_trap_t *trap); // A function to be called from Wasm code. -wasm_trap_t* callback( - void *env, - wasmtime_caller_t *caller, - const wasmtime_val_t* args, - size_t nargs, - wasmtime_val_t* results, - size_t nresults -) { +wasm_trap_t *callback(void *env, wasmtime_caller_t *caller, + const wasmtime_val_t *args, size_t nargs, + wasmtime_val_t *results, size_t nresults) { printf("Calling back...\n"); - printf("> %"PRIu32" %"PRIu64"\n", args[0].of.i32, args[1].of.i64); + printf("> %" PRIu32 " %" PRIu64 "\n", args[0].of.i32, args[1].of.i64); printf("\n"); results[0] = args[1]; @@ -52,17 +48,11 @@ wasm_trap_t* callback( return NULL; } - // A function closure. -wasm_trap_t* closure_callback( - void* env, - wasmtime_caller_t *caller, - const wasmtime_val_t* args, - size_t nargs, - wasmtime_val_t* results, - size_t nresults -) { - int i = *(int*)env; +wasm_trap_t *closure_callback(void *env, wasmtime_caller_t *caller, + const wasmtime_val_t *args, size_t nargs, + wasmtime_val_t *results, size_t nresults) { + int i = *(int *)env; printf("Calling back closure...\n"); printf("> %d\n", i); @@ -71,16 +61,15 @@ wasm_trap_t* closure_callback( return NULL; } - -int main(int argc, const char* argv[]) { +int main(int argc, const char *argv[]) { // Initialize. printf("Initializing...\n"); - wasm_engine_t* engine = wasm_engine_new(); - wasmtime_store_t* store = wasmtime_store_new(engine, NULL, NULL); + wasm_engine_t *engine = wasm_engine_new(); + wasmtime_store_t *store = wasmtime_store_new(engine, NULL, NULL); wasmtime_context_t *context = wasmtime_store_context(store); // Load our input file to parse it next - FILE* file = fopen("examples/multi.wat", "r"); + FILE *file = fopen("examples/multi.wat", "r"); if (!file) { printf("> Error loading file!\n"); return 1; @@ -105,22 +94,21 @@ int main(int argc, const char* argv[]) { // Compile. printf("Compiling module...\n"); - wasmtime_module_t* module = NULL; - error = wasmtime_module_new(engine, (uint8_t*) binary.data, binary.size, &module); + wasmtime_module_t *module = NULL; + error = + wasmtime_module_new(engine, (uint8_t *)binary.data, binary.size, &module); if (error) exit_with_error("failed to compile module", error, NULL); wasm_byte_vec_delete(&binary); // Create external print functions. printf("Creating callback...\n"); - wasm_functype_t* callback_type = wasm_functype_new_2_2( - wasm_valtype_new_i32(), - wasm_valtype_new_i64(), - wasm_valtype_new_i64(), - wasm_valtype_new_i32() - ); + wasm_functype_t *callback_type = + wasm_functype_new_2_2(wasm_valtype_new_i32(), wasm_valtype_new_i64(), + wasm_valtype_new_i64(), wasm_valtype_new_i32()); wasmtime_func_t callback_func; - wasmtime_func_new(context, callback_type, callback, NULL, NULL, &callback_func); + wasmtime_func_new(context, callback_type, callback, NULL, NULL, + &callback_func); wasm_functype_delete(callback_type); // Instantiate. @@ -129,7 +117,7 @@ int main(int argc, const char* argv[]) { imports[0].kind = WASMTIME_EXTERN_FUNC; imports[0].of.func = callback_func; wasmtime_instance_t instance; - wasm_trap_t* trap = NULL; + wasm_trap_t *trap = NULL; error = wasmtime_instance_new(context, module, imports, 1, &instance, &trap); if (error != NULL || trap != NULL) exit_with_error("failed to instantiate", error, trap); @@ -156,8 +144,7 @@ int main(int argc, const char* argv[]) { // Print result. printf("Printing result...\n"); - printf("> %"PRIu64" %"PRIu32"\n", - results[0].of.i64, results[1].of.i32); + printf("> %" PRIu64 " %" PRIu32 "\n", results[0].of.i64, results[1].of.i32); assert(results[0].kind == WASMTIME_I64); assert(results[0].of.i64 == 2); @@ -174,7 +161,8 @@ int main(int argc, const char* argv[]) { return 0; } -static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_trap_t *trap) { +static void exit_with_error(const char *message, wasmtime_error_t *error, + wasm_trap_t *trap) { fprintf(stderr, "error: %s\n", message); wasm_byte_vec_t error_message; if (error != NULL) { @@ -184,7 +172,7 @@ static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_t wasm_trap_message(trap, &error_message); wasm_trap_delete(trap); } - fprintf(stderr, "%.*s\n", (int) error_message.size, error_message.data); + fprintf(stderr, "%.*s\n", (int)error_message.size, error_message.data); wasm_byte_vec_delete(&error_message); exit(1); } diff --git a/examples/multimemory.c b/examples/multimemory.c index 3f1823d6d326..88f1f57521aa 100644 --- a/examples/multimemory.c +++ b/examples/multimemory.c @@ -17,7 +17,8 @@ to tweak the `-lpthread` and such annotations. You can also build using cmake: -mkdir build && cd build && cmake .. && cmake --build . --target wasmtime-multimemory +mkdir build && cd build && cmake .. && \ + cmake --build . --target wasmtime-multimemory */ #include @@ -27,7 +28,8 @@ mkdir build && cd build && cmake .. && cmake --build . --target wasmtime-multime #include #include -static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_trap_t *trap); +static void exit_with_error(const char *message, wasmtime_error_t *error, + wasm_trap_t *trap); void check(bool success) { if (!success) { @@ -36,16 +38,12 @@ void check(bool success) { } } -void check_call(wasmtime_context_t *store, - wasmtime_func_t *func, - const wasmtime_val_t* args, - size_t nargs, - int32_t expected) { +void check_call(wasmtime_context_t *store, wasmtime_func_t *func, + const wasmtime_val_t *args, size_t nargs, int32_t expected) { wasmtime_val_t results[1]; wasm_trap_t *trap = NULL; - wasmtime_error_t *error = wasmtime_func_call( - store, func, args, nargs, results, 1, &trap - ); + wasmtime_error_t *error = + wasmtime_func_call(store, func, args, nargs, results, 1, &trap); if (error != NULL || trap != NULL) exit_with_error("failed to call function", error, trap); if (results[0].of.i32 != expected) { @@ -54,18 +52,21 @@ void check_call(wasmtime_context_t *store, } } -void check_call0(wasmtime_context_t *store, wasmtime_func_t *func, int32_t expected) { +void check_call0(wasmtime_context_t *store, wasmtime_func_t *func, + int32_t expected) { check_call(store, func, NULL, 0, expected); } -void check_call1(wasmtime_context_t *store, wasmtime_func_t *func, int32_t arg, int32_t expected) { +void check_call1(wasmtime_context_t *store, wasmtime_func_t *func, int32_t arg, + int32_t expected) { wasmtime_val_t args[1]; args[0].kind = WASMTIME_I32; args[0].of.i32 = arg; check_call(store, func, args, 1, expected); } -void check_call2(wasmtime_context_t *store, wasmtime_func_t *func, int32_t arg1, int32_t arg2, int32_t expected) { +void check_call2(wasmtime_context_t *store, wasmtime_func_t *func, int32_t arg1, + int32_t arg2, int32_t expected) { wasmtime_val_t args[2]; args[0].kind = WASMTIME_I32; args[0].of.i32 = arg1; @@ -74,14 +75,17 @@ void check_call2(wasmtime_context_t *store, wasmtime_func_t *func, int32_t arg1, check_call(store, func, args, 2, expected); } -void check_ok(wasmtime_context_t *store, wasmtime_func_t *func, const wasmtime_val_t* args, size_t nargs) { +void check_ok(wasmtime_context_t *store, wasmtime_func_t *func, + const wasmtime_val_t *args, size_t nargs) { wasm_trap_t *trap = NULL; - wasmtime_error_t *error = wasmtime_func_call(store, func, args, nargs, NULL, 0, &trap); + wasmtime_error_t *error = + wasmtime_func_call(store, func, args, nargs, NULL, 0, &trap); if (error != NULL || trap != NULL) exit_with_error("failed to call function", error, trap); } -void check_ok2(wasmtime_context_t *store, wasmtime_func_t *func, int32_t arg1, int32_t arg2) { +void check_ok2(wasmtime_context_t *store, wasmtime_func_t *func, int32_t arg1, + int32_t arg2) { wasmtime_val_t args[2]; args[0].kind = WASMTIME_I32; args[0].of.i32 = arg1; @@ -90,15 +94,13 @@ void check_ok2(wasmtime_context_t *store, wasmtime_func_t *func, int32_t arg1, i check_ok(store, func, args, 2); } -void check_trap(wasmtime_context_t *store, - wasmtime_func_t *func, - const wasmtime_val_t *args, - size_t nargs, - size_t num_results) { +void check_trap(wasmtime_context_t *store, wasmtime_func_t *func, + const wasmtime_val_t *args, size_t nargs, size_t num_results) { assert(num_results <= 1); wasmtime_val_t results[1]; wasm_trap_t *trap = NULL; - wasmtime_error_t *error = wasmtime_func_call(store, func, args, nargs, results, num_results, &trap); + wasmtime_error_t *error = + wasmtime_func_call(store, func, args, nargs, results, num_results, &trap); if (error != NULL) exit_with_error("failed to call function", error, NULL); if (trap == NULL) { @@ -108,14 +110,16 @@ void check_trap(wasmtime_context_t *store, wasm_trap_delete(trap); } -void check_trap1(wasmtime_context_t *store, wasmtime_func_t *func, int32_t arg) { +void check_trap1(wasmtime_context_t *store, wasmtime_func_t *func, + int32_t arg) { wasmtime_val_t args[1]; args[0].kind = WASMTIME_I32; args[0].of.i32 = arg; check_trap(store, func, args, 1, 1); } -void check_trap2(wasmtime_context_t *store, wasmtime_func_t *func, int32_t arg1, int32_t arg2) { +void check_trap2(wasmtime_context_t *store, wasmtime_func_t *func, int32_t arg1, + int32_t arg2) { wasmtime_val_t args[2]; args[0].kind = WASMTIME_I32; args[0].of.i32 = arg1; @@ -124,7 +128,7 @@ void check_trap2(wasmtime_context_t *store, wasmtime_func_t *func, int32_t arg1, check_trap(store, func, args, 2, 0); } -int main(int argc, const char* argv[]) { +int main(int argc, const char *argv[]) { // Initialize. printf("Initializing...\n"); @@ -135,11 +139,11 @@ int main(int argc, const char* argv[]) { wasm_engine_t *engine = wasm_engine_new_with_config(config); assert(engine != NULL); - wasmtime_store_t* store = wasmtime_store_new(engine, NULL, NULL); + wasmtime_store_t *store = wasmtime_store_new(engine, NULL, NULL); wasmtime_context_t *context = wasmtime_store_context(store); // Load our input file to parse it next - FILE* file = fopen("examples/multimemory.wat", "r"); + FILE *file = fopen("examples/multimemory.wat", "r"); if (!file) { printf("> Error loading file!\n"); return 1; @@ -164,8 +168,9 @@ int main(int argc, const char* argv[]) { // Compile. printf("Compiling module...\n"); - wasmtime_module_t* module = NULL; - error = wasmtime_module_new(engine, (uint8_t*) binary.data, binary.size, &module); + wasmtime_module_t *module = NULL; + error = + wasmtime_module_new(engine, (uint8_t *)binary.data, binary.size, &module); if (error) exit_with_error("failed to compile module", error, NULL); wasm_byte_vec_delete(&binary); @@ -185,28 +190,36 @@ int main(int argc, const char* argv[]) { wasmtime_func_t size0, load0, store0, size1, load1, store1; wasmtime_extern_t item; bool ok; - ok = wasmtime_instance_export_get(context, &instance, "memory0", strlen("memory0"), &item); + ok = wasmtime_instance_export_get(context, &instance, "memory0", + strlen("memory0"), &item); assert(ok && item.kind == WASMTIME_EXTERN_MEMORY); memory0 = item.of.memory; - ok = wasmtime_instance_export_get(context, &instance, "size0", strlen("size0"), &item); + ok = wasmtime_instance_export_get(context, &instance, "size0", + strlen("size0"), &item); assert(ok && item.kind == WASMTIME_EXTERN_FUNC); size0 = item.of.func; - ok = wasmtime_instance_export_get(context, &instance, "load0", strlen("load0"), &item); + ok = wasmtime_instance_export_get(context, &instance, "load0", + strlen("load0"), &item); assert(ok && item.kind == WASMTIME_EXTERN_FUNC); load0 = item.of.func; - ok = wasmtime_instance_export_get(context, &instance, "store0", strlen("store0"), &item); + ok = wasmtime_instance_export_get(context, &instance, "store0", + strlen("store0"), &item); assert(ok && item.kind == WASMTIME_EXTERN_FUNC); store0 = item.of.func; - ok = wasmtime_instance_export_get(context, &instance, "memory1", strlen("memory1"), &item); + ok = wasmtime_instance_export_get(context, &instance, "memory1", + strlen("memory1"), &item); assert(ok && item.kind == WASMTIME_EXTERN_MEMORY); memory1 = item.of.memory; - ok = wasmtime_instance_export_get(context, &instance, "size1", strlen("size1"), &item); + ok = wasmtime_instance_export_get(context, &instance, "size1", + strlen("size1"), &item); assert(ok && item.kind == WASMTIME_EXTERN_FUNC); size1 = item.of.func; - ok = wasmtime_instance_export_get(context, &instance, "load1", strlen("load1"), &item); + ok = wasmtime_instance_export_get(context, &instance, "load1", + strlen("load1"), &item); assert(ok && item.kind == WASMTIME_EXTERN_FUNC); load1 = item.of.func; - ok = wasmtime_instance_export_get(context, &instance, "store1", strlen("store1"), &item); + ok = wasmtime_instance_export_get(context, &instance, "store1", + strlen("store1"), &item); assert(ok && item.kind == WASMTIME_EXTERN_FUNC); store1 = item.of.func; @@ -315,7 +328,8 @@ int main(int argc, const char* argv[]) { return 0; } -static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_trap_t *trap) { +static void exit_with_error(const char *message, wasmtime_error_t *error, + wasm_trap_t *trap) { fprintf(stderr, "error: %s\n", message); wasm_byte_vec_t error_message; if (error != NULL) { @@ -325,7 +339,7 @@ static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_t wasm_trap_message(trap, &error_message); wasm_trap_delete(trap); } - fprintf(stderr, "%.*s\n", (int) error_message.size, error_message.data); + fprintf(stderr, "%.*s\n", (int)error_message.size, error_message.data); wasm_byte_vec_delete(&error_message); exit(1); } diff --git a/examples/serialize.c b/examples/serialize.c index 19052571d432..1d3acc7b3ee4 100644 --- a/examples/serialize.c +++ b/examples/serialize.c @@ -19,7 +19,8 @@ to tweak the `-lpthread` and such annotations as well as the name of the You can also build using cmake: -mkdir build && cd build && cmake .. && cmake --build . --target wasmtime-serialize +mkdir build && cd build && cmake .. && \ + cmake --build . --target wasmtime-serialize */ #include @@ -28,21 +29,18 @@ mkdir build && cd build && cmake .. && cmake --build . --target wasmtime-seriali #include #include -static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_trap_t *trap); +static void exit_with_error(const char *message, wasmtime_error_t *error, + wasm_trap_t *trap); -static wasm_trap_t* hello_callback( - void *env, - wasmtime_caller_t *caller, - const wasmtime_val_t* args, - size_t nargs, - wasmtime_val_t* results, - size_t nresults) { +static wasm_trap_t *hello_callback(void *env, wasmtime_caller_t *caller, + const wasmtime_val_t *args, size_t nargs, + wasmtime_val_t *results, size_t nresults) { printf("Calling back...\n"); printf("> Hello World!\n"); return NULL; } -int serialize(wasm_byte_vec_t* buffer) { +int serialize(wasm_byte_vec_t *buffer) { // Set up our compilation context. Note that we could also work with a // `wasm_config_t` here to configure what feature are enabled and various // compilation settings. @@ -51,14 +49,17 @@ int serialize(wasm_byte_vec_t* buffer) { assert(engine != NULL); // Read our input file, which in this case is a wasm text file. - FILE* file = fopen("examples/hello.wat", "r"); + FILE *file = fopen("examples/hello.wat", "r"); assert(file != NULL); fseek(file, 0L, SEEK_END); size_t file_size = ftell(file); fseek(file, 0L, SEEK_SET); wasm_byte_vec_t wat; wasm_byte_vec_new_uninitialized(&wat, file_size); - assert(fread(wat.data, file_size, 1, file) == 1); + if (fread(wat.data, file_size, 1, file) != 1) { + printf("> Error loading module!\n"); + return 1; + } fclose(file); // Parse the wat into the binary wasm format @@ -72,7 +73,7 @@ int serialize(wasm_byte_vec_t* buffer) { // and serialize into buffer. printf("Compiling and serializing module...\n"); wasmtime_module_t *module = NULL; - error = wasmtime_module_new(engine, (uint8_t*)wasm.data, wasm.size, &module); + error = wasmtime_module_new(engine, (uint8_t *)wasm.data, wasm.size, &module); wasm_byte_vec_delete(&wasm); if (error != NULL) exit_with_error("failed to compile module", error, NULL); @@ -87,7 +88,7 @@ int serialize(wasm_byte_vec_t* buffer) { return 0; } -int deserialize(wasm_byte_vec_t* buffer) { +int deserialize(wasm_byte_vec_t *buffer) { // Set up our compilation context. Note that we could also work with a // `wasm_config_t` here to configure what feature are enabled and various // compilation settings. @@ -104,7 +105,8 @@ int deserialize(wasm_byte_vec_t* buffer) { // Deserialize compiled module. printf("Deserialize module...\n"); wasmtime_module_t *module = NULL; - wasmtime_error_t *error = wasmtime_module_deserialize(engine, (uint8_t*) buffer->data, buffer->size, &module); + wasmtime_error_t *error = wasmtime_module_deserialize( + engine, (uint8_t *)buffer->data, buffer->size, &module); if (error != NULL) exit_with_error("failed to compile module", error, NULL); @@ -163,7 +165,8 @@ int main() { return 0; } -static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_trap_t *trap) { +static void exit_with_error(const char *message, wasmtime_error_t *error, + wasm_trap_t *trap) { fprintf(stderr, "error: %s\n", message); wasm_byte_vec_t error_message; if (error != NULL) { @@ -173,7 +176,7 @@ static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_t wasm_trap_message(trap, &error_message); wasm_trap_delete(trap); } - fprintf(stderr, "%.*s\n", (int) error_message.size, error_message.data); + fprintf(stderr, "%.*s\n", (int)error_message.size, error_message.data); wasm_byte_vec_delete(&error_message); exit(1); } diff --git a/examples/threads.c b/examples/threads.c index 707601be53cf..7e13b9f3a52f 100644 --- a/examples/threads.c +++ b/examples/threads.c @@ -25,64 +25,66 @@ mkdir build && cd build && cmake .. && cmake --build . --target wasmtime-threads #ifndef _WIN32 #include +#include #include #include #include -#include #include #include #include #define own -static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_trap_t *trap); +static void exit_with_error(const char *message, wasmtime_error_t *error, + wasm_trap_t *trap); const int N_THREADS = 10; const int N_REPS = 3; // A function to be called from Wasm code. -own wasm_trap_t* callback(const wasm_val_vec_t* args, wasm_val_vec_t* results) { +own wasm_trap_t *callback(const wasm_val_vec_t *args, wasm_val_vec_t *results) { assert(args->data[0].kind == WASM_I32); printf("> Thread %d running\n", args->data[0].of.i32); return NULL; } - typedef struct { - wasm_engine_t* engine; - wasm_shared_module_t* module; + wasm_engine_t *engine; + wasm_shared_module_t *module; int id; } thread_args; -void* run(void* args_abs) { - thread_args* args = (thread_args*)args_abs; +void *run(void *args_abs) { + thread_args *args = (thread_args *)args_abs; // Rereate store and module. - own wasm_store_t* store = wasm_store_new(args->engine); - own wasm_module_t* module = wasm_module_obtain(store, args->module); + own wasm_store_t *store = wasm_store_new(args->engine); + own wasm_module_t *module = wasm_module_obtain(store, args->module); // Run the example N times. for (int i = 0; i < N_REPS; ++i) { usleep(100000); // Create imports. - own wasm_functype_t* func_type = wasm_functype_new_1_0(wasm_valtype_new_i32()); - own wasm_func_t* func = wasm_func_new(store, func_type, callback); + own wasm_functype_t *func_type = + wasm_functype_new_1_0(wasm_valtype_new_i32()); + own wasm_func_t *func = wasm_func_new(store, func_type, callback); wasm_functype_delete(func_type); wasm_val_t val = {.kind = WASM_I32, .of = {.i32 = (int32_t)args->id}}; - own wasm_globaltype_t* global_type = - wasm_globaltype_new(wasm_valtype_new_i32(), WASM_CONST); - own wasm_global_t* global = wasm_global_new(store, global_type, &val); + own wasm_globaltype_t *global_type = + wasm_globaltype_new(wasm_valtype_new_i32(), WASM_CONST); + own wasm_global_t *global = wasm_global_new(store, global_type, &val); wasm_globaltype_delete(global_type); // Instantiate. - wasm_extern_t* imports[] = { - wasm_func_as_extern(func), wasm_global_as_extern(global), + wasm_extern_t *imports[] = { + wasm_func_as_extern(func), + wasm_global_as_extern(global), }; wasm_extern_vec_t imports_vec = WASM_ARRAY_VEC(imports); - own wasm_instance_t* instance = - wasm_instance_new(store, module, &imports_vec, NULL); + own wasm_instance_t *instance = + wasm_instance_new(store, module, &imports_vec, NULL); if (!instance) { printf("> Error instantiating module!\n"); return NULL; @@ -127,10 +129,10 @@ void* run(void* args_abs) { int main(int argc, const char *argv[]) { // Initialize. - wasm_engine_t* engine = wasm_engine_new(); + wasm_engine_t *engine = wasm_engine_new(); // Load our input file to parse it next - FILE* file = fopen("examples/threads.wat", "r"); + FILE *file = fopen("examples/threads.wat", "r"); if (!file) { printf("> Error loading file!\n"); return 1; @@ -154,8 +156,8 @@ int main(int argc, const char *argv[]) { wasm_byte_vec_delete(&wat); // Compile and share. - own wasm_store_t* store = wasm_store_new(engine); - own wasm_module_t* module = wasm_module_new(store, &binary); + own wasm_store_t *store = wasm_store_new(engine); + own wasm_module_t *module = wasm_module_new(store, &binary); if (!module) { printf("> Error compiling module!\n"); return 1; @@ -163,7 +165,7 @@ int main(int argc, const char *argv[]) { wasm_byte_vec_delete(&binary); - own wasm_shared_module_t* shared = wasm_module_share(module); + own wasm_shared_module_t *shared = wasm_module_share(module); wasm_module_delete(module); wasm_store_delete(store); @@ -171,12 +173,19 @@ int main(int argc, const char *argv[]) { // Spawn threads. pthread_t threads[N_THREADS]; for (int i = 0; i < N_THREADS; i++) { - thread_args* args = malloc(sizeof(thread_args)); + thread_args *args = malloc(sizeof(thread_args)); args->id = i; args->engine = engine; args->module = shared; printf("Initializing thread %d...\n", i); - pthread_create(&threads[i], NULL, &run, args); + + // Guarantee at least 2MB of stack to allow running Cranelift in debug mode + // on CI. + pthread_attr_t attrs; + pthread_attr_init(&attrs); + pthread_attr_setstacksize(&attrs, 2 << 20); + pthread_create(&threads[i], &attrs, &run, args); + pthread_attr_destroy(&attrs); } for (int i = 0; i < N_THREADS; i++) { @@ -190,7 +199,8 @@ int main(int argc, const char *argv[]) { return 0; } -static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_trap_t *trap) { +static void exit_with_error(const char *message, wasmtime_error_t *error, + wasm_trap_t *trap) { fprintf(stderr, "error: %s\n", message); wasm_byte_vec_t error_message; if (error != NULL) { @@ -198,14 +208,12 @@ static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_t } else { wasm_trap_message(trap, &error_message); } - fprintf(stderr, "%.*s\n", (int) error_message.size, error_message.data); + fprintf(stderr, "%.*s\n", (int)error_message.size, error_message.data); wasm_byte_vec_delete(&error_message); exit(1); } #else // TODO implement example for Windows -int main(int argc, const char *argv[]) { - return 0; -} +int main(int argc, const char *argv[]) { return 0; } #endif // _WIN32 diff --git a/examples/tokio/main.rs b/examples/tokio/main.rs index 2073f38886fa..b4a3d1724ada 100644 --- a/examples/tokio/main.rs +++ b/examples/tokio/main.rs @@ -2,10 +2,10 @@ use anyhow::Error; use std::sync::Arc; use tokio::time::Duration; use wasmtime::{Config, Engine, Linker, Module, Store}; -// For this example we want to use the async version of wasmtime_wasi. +// For this example we want to use the async version of wasi_common. // Notably, this version of wasi uses a scheduler that will async yield // when sleeping in `poll_oneoff`. -use wasmtime_wasi::{tokio::WasiCtxBuilder, WasiCtx}; +use wasi_common::{tokio::WasiCtxBuilder, WasiCtx}; #[tokio::main] async fn main() -> Result<(), Error> { @@ -61,7 +61,7 @@ impl Environment { // adds WASI functions to the linker, notably the async versions built // on tokio. let mut linker = Linker::new(&engine); - wasmtime_wasi::tokio::add_to_linker(&mut linker, |cx| cx)?; + wasi_common::tokio::add_to_linker(&mut linker, |cx| cx)?; Ok(Self { engine, diff --git a/examples/wasi-async/main.rs b/examples/wasi-async/main.rs new file mode 100644 index 000000000000..f99e543a9926 --- /dev/null +++ b/examples/wasi-async/main.rs @@ -0,0 +1,75 @@ +//! Example of instantiating a wasm module which uses WASI preview1 imports +//! implemented through the async preview2 WASI implementation. + +/* +You can execute this example with: + cmake examples/ + cargo run --example wasi-async +*/ + +use anyhow::Result; +use wasmtime::{Config, Engine, Linker, Module, Store}; +use wasmtime_wasi::preview2; + +struct WasiHostCtx { + preview2_ctx: preview2::WasiCtx, + preview2_table: wasmtime::component::ResourceTable, + preview1_adapter: preview2::preview1::WasiPreview1Adapter, +} + +impl preview2::WasiView for WasiHostCtx { + fn table(&mut self) -> &mut wasmtime::component::ResourceTable { + &mut self.preview2_table + } + + fn ctx(&mut self) -> &mut preview2::WasiCtx { + &mut self.preview2_ctx + } +} + +impl preview2::preview1::WasiPreview1View for WasiHostCtx { + fn adapter(&self) -> &preview2::preview1::WasiPreview1Adapter { + &self.preview1_adapter + } + + fn adapter_mut(&mut self) -> &mut preview2::preview1::WasiPreview1Adapter { + &mut self.preview1_adapter + } +} + +#[tokio::main] +async fn main() -> Result<()> { + // Construct the wasm engine with async support enabled. + let mut config = Config::new(); + config.async_support(true); + let engine = Engine::new(&config)?; + + // Add the WASI preview1 API to the linker (will be implemented in terms of + // the preview2 API) + let mut linker: Linker = Linker::new(&engine); + preview2::preview1::add_to_linker_async(&mut linker)?; + + // Add capabilities (e.g. filesystem access) to the WASI preview2 context here. + let wasi_ctx = preview2::WasiCtxBuilder::new().inherit_stdio().build(); + + let host_ctx = WasiHostCtx { + preview2_ctx: wasi_ctx, + preview2_table: preview2::ResourceTable::new(), + preview1_adapter: preview2::preview1::WasiPreview1Adapter::new(), + }; + let mut store: Store = Store::new(&engine, host_ctx); + + // Instantiate our 'Hello World' wasm module. + // Note: This is a module built against the preview1 WASI API. + let module = Module::from_file(&engine, "target/wasm32-wasi/debug/wasi.wasm")?; + let func = linker + .module_async(&mut store, "", &module) + .await? + .get_default(&mut store, "")? + .typed::<(), ()>(&store)?; + + // Invoke the WASI program default function. + func.call_async(&mut store, ()).await?; + + Ok(()) +} diff --git a/examples/wasi/main.c b/examples/wasi/main.c index f55715aa6202..753d66497097 100644 --- a/examples/wasi/main.c +++ b/examples/wasi/main.c @@ -24,13 +24,14 @@ mkdir build && cd build && cmake .. && cmake --build . --target wasmtime-wasi #include #include #include -#include #include +#include #include #define MIN(a, b) ((a) < (b) ? (a) : (b)) -static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_trap_t *trap); +static void exit_with_error(const char *message, wasmtime_error_t *error, + wasm_trap_t *trap); int main() { // Set up our context @@ -48,7 +49,7 @@ int main() { wasm_byte_vec_t wasm; // Load our input file to parse it next - FILE* file = fopen("target/wasm32-wasi/debug/wasi.wasm", "rb"); + FILE *file = fopen("target/wasm32-wasi/debug/wasi.wasm", "rb"); if (!file) { printf("> Error loading file!\n"); exit(1); @@ -65,7 +66,7 @@ int main() { // Compile our modules wasmtime_module_t *module = NULL; - error = wasmtime_module_new(engine, (uint8_t*)wasm.data, wasm.size, &module); + error = wasmtime_module_new(engine, (uint8_t *)wasm.data, wasm.size, &module); if (!module) exit_with_error("failed to compile module", error, NULL); wasm_byte_vec_delete(&wasm); @@ -105,7 +106,8 @@ int main() { return 0; } -static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_trap_t *trap) { +static void exit_with_error(const char *message, wasmtime_error_t *error, + wasm_trap_t *trap) { fprintf(stderr, "error: %s\n", message); wasm_byte_vec_t error_message; if (error != NULL) { @@ -115,7 +117,7 @@ static void exit_with_error(const char *message, wasmtime_error_t *error, wasm_t wasm_trap_message(trap, &error_message); wasm_trap_delete(trap); } - fprintf(stderr, "%.*s\n", (int) error_message.size, error_message.data); + fprintf(stderr, "%.*s\n", (int)error_message.size, error_message.data); wasm_byte_vec_delete(&error_message); exit(1); } diff --git a/examples/wasi/main.rs b/examples/wasi/main.rs index 69ff61756980..4c4cd7caa88c 100644 --- a/examples/wasi/main.rs +++ b/examples/wasi/main.rs @@ -7,14 +7,14 @@ You can execute this example with: */ use anyhow::Result; +use wasi_common::sync::WasiCtxBuilder; use wasmtime::*; -use wasmtime_wasi::sync::WasiCtxBuilder; fn main() -> Result<()> { // Define the WASI functions globally on the `Config`. let engine = Engine::default(); let mut linker = Linker::new(&engine); - wasmtime_wasi::add_to_linker(&mut linker, |s| s)?; + wasi_common::sync::add_to_linker(&mut linker, |s| s)?; // Create a WASI context and put it in a Store; all instances in the store // share this context. `WasiCtxBuilder` provides a number of ways to diff --git a/fuzz/Cargo.toml b/fuzz/Cargo.toml index 5e290c3f265c..2eea42d97c4b 100644 --- a/fuzz/Cargo.toml +++ b/fuzz/Cargo.toml @@ -4,6 +4,9 @@ version = "0.0.0" edition.workspace = true publish = false +[lints] +workspace = true + [package.metadata] cargo-fuzz = true @@ -82,12 +85,6 @@ path = "fuzz_targets/stacks.rs" test = false doc = false -[[bin]] -name = "compile-maybe-invalid" -path = "fuzz_targets/compile-maybe-invalid.rs" -test = false -doc = false - [[bin]] name = "cranelift-fuzzgen" path = "fuzz_targets/cranelift-fuzzgen.rs" diff --git a/fuzz/fuzz_targets/compile-maybe-invalid.rs b/fuzz/fuzz_targets/compile-maybe-invalid.rs deleted file mode 100644 index 2cdb282f8598..000000000000 --- a/fuzz/fuzz_targets/compile-maybe-invalid.rs +++ /dev/null @@ -1,12 +0,0 @@ -#![no_main] - -use libfuzzer_sys::fuzz_target; -use wasmtime::{Engine, Module}; -use wasmtime_fuzzing::wasm_smith::MaybeInvalidModule; - -fuzz_target!(|module: MaybeInvalidModule| { - let engine = Engine::default(); - let wasm = module.to_bytes(); - wasmtime_fuzzing::oracles::log_wasm(&wasm); - drop(Module::new(&engine, &wasm)); -}); diff --git a/fuzz/fuzz_targets/cranelift-fuzzgen.rs b/fuzz/fuzz_targets/cranelift-fuzzgen.rs index 3aa9cb0ef0fd..c591fcaa6fe1 100644 --- a/fuzz/fuzz_targets/cranelift-fuzzgen.rs +++ b/fuzz/fuzz_targets/cranelift-fuzzgen.rs @@ -346,7 +346,7 @@ fn run_test_inputs(testcase: &TestCase, run: impl Fn(&[DataValue]) -> RunResult) STATISTICS.run_result_timeout.fetch_add(1, Ordering::SeqCst); return; } - RunResult::Error(_) => panic!("interpreter failed: {:?}", int_res), + RunResult::Error(e) => panic!("interpreter failed: {e:?}"), } let res = run(args); diff --git a/fuzz/fuzz_targets/differential.rs b/fuzz/fuzz_targets/differential.rs index a884a8430ce0..be2ecac641c5 100644 --- a/fuzz/fuzz_targets/differential.rs +++ b/fuzz/fuzz_targets/differential.rs @@ -5,6 +5,7 @@ use libfuzzer_sys::fuzz_target; use std::sync::atomic::AtomicUsize; use std::sync::atomic::Ordering::SeqCst; use std::sync::Once; +use wasmparser::ValType; use wasmtime_fuzzing::generators::CompilerStrategy; use wasmtime_fuzzing::generators::{Config, DiffValue, DiffValueType, SingleInstModule}; use wasmtime_fuzzing::oracles::diff_wasmtime::WasmtimeInstance; @@ -81,16 +82,25 @@ fn execute_one(data: &[u8]) -> Result<()> { // When fuzzing Winch, explicitly override the compiler strategy, which by // default its arbitrary implementation unconditionally returns // `Cranelift`. - // We also explicitly disable multi-value support. if fuzz_winch { config.wasmtime.compiler_strategy = CompilerStrategy::Winch; - config.module_config.config.multi_value_enabled = false; + // Disable the Wasm proposals not supported by Winch. + // Reference Types and (Function References) are not disabled entirely + // because certain instructions involving `funcref` are supported (all + // the table instructions). + config.module_config.config.simd_enabled = false; + config.module_config.config.relaxed_simd_enabled = false; + config.module_config.config.memory64_enabled = false; + config.module_config.config.gc_enabled = false; + config.module_config.config.threads_enabled = false; + config.module_config.config.tail_call_enabled = false; + config.module_config.config.exceptions_enabled = false; } // Choose an engine that Wasmtime will be differentially executed against. // The chosen engine is then created, which might update `config`, and // returned as a trait object. - let lhs = u.choose(unsafe { &ALLOWED_ENGINES })?; + let lhs = u.choose(unsafe { &*std::ptr::addr_of!(ALLOWED_ENGINES) })?; let mut lhs = match engine::build(&mut u, lhs, &mut config)? { Some(engine) => engine, // The chosen engine does not have support compiled into the fuzzer, @@ -283,139 +293,72 @@ impl RuntimeStats { fn winch_supports_module(module: &[u8]) -> bool { use wasmparser::{Operator::*, Parser, Payload}; + fn is_type_supported(ty: &ValType) -> bool { + match ty { + ValType::Ref(r) => r.is_func_ref(), + _ => true, + } + } + let mut supported = true; let mut parser = Parser::new(0).parse_all(module); 'main: while let Some(payload) = parser.next() { match payload.unwrap() { Payload::CodeSectionEntry(body) => { + let local_reader = body.get_locals_reader().unwrap(); + for local in local_reader { + let (_, ty) = local.unwrap(); + if !is_type_supported(&ty) { + supported = false; + break 'main; + } + } let op_reader = body.get_operators_reader().unwrap(); for op in op_reader { match op.unwrap() { - I32Const { .. } - | I64Const { .. } - | I32Add { .. } - | I64Add { .. } - | I32Sub { .. } - | I32Mul { .. } - | I32DivS { .. } - | I32DivU { .. } - | I64DivS { .. } - | I64DivU { .. } - | I64RemU { .. } - | I64RemS { .. } - | I32RemU { .. } - | I32RemS { .. } - | I64Mul { .. } - | I64Sub { .. } - | I32Eq { .. } - | I64Eq { .. } - | I32Ne { .. } - | I64Ne { .. } - | I32LtS { .. } - | I64LtS { .. } - | I32LtU { .. } - | I64LtU { .. } - | I32LeS { .. } - | I64LeS { .. } - | I32LeU { .. } - | I64LeU { .. } - | I32GtS { .. } - | I64GtS { .. } - | I32GtU { .. } - | I64GtU { .. } - | I32GeS { .. } - | I64GeS { .. } - | I32GeU { .. } - | I64GeU { .. } - | I32Eqz { .. } - | I64Eqz { .. } - | I32And { .. } - | I64And { .. } - | I32Or { .. } - | I64Or { .. } - | I32Xor { .. } - | I64Xor { .. } - | I32Shl { .. } - | I64Shl { .. } - | I32ShrS { .. } - | I64ShrS { .. } - | I32ShrU { .. } - | I64ShrU { .. } - | I32Rotl { .. } - | I64Rotl { .. } - | I32Rotr { .. } - | I64Rotr { .. } - | I32Clz { .. } - | I64Clz { .. } - | I32Ctz { .. } - | I64Ctz { .. } - | I32Popcnt { .. } - | I64Popcnt { .. } - | LocalGet { .. } - | LocalSet { .. } - | LocalTee { .. } - | GlobalGet { .. } - | GlobalSet { .. } - | Call { .. } - | Nop { .. } - | End { .. } - | If { .. } - | Else { .. } - | Block { .. } - | Loop { .. } - | Br { .. } - | BrIf { .. } - | BrTable { .. } - | Unreachable { .. } - | Return { .. } - | F32Const { .. } - | F64Const { .. } - | F32Add { .. } - | F64Add { .. } - | F32Sub { .. } - | F64Sub { .. } - | F32Mul { .. } - | F64Mul { .. } - | F32Div { .. } - | F64Div { .. } - | F32Min { .. } - | F64Min { .. } - | F32Max { .. } - | F64Max { .. } - | F32Copysign { .. } - | F64Copysign { .. } - | F32Abs { .. } - | F64Abs { .. } - | F32Neg { .. } - | F64Neg { .. } - | F32Sqrt { .. } - | F64Sqrt { .. } - | F32Eq { .. } - | F64Eq { .. } - | F32Ne { .. } - | F64Ne { .. } - | F32Lt { .. } - | F64Lt { .. } - | F32Gt { .. } - | F64Gt { .. } - | F32Le { .. } - | F64Le { .. } - | F32Ge { .. } - | F64Ge { .. } - | CallIndirect { .. } - | ElemDrop { .. } - | TableCopy { .. } - | TableSet { .. } - | TableGet { .. } - | TableFill { .. } - | TableGrow { .. } - | TableSize { .. } - | TableInit { .. } => {} - _ => { + RefIsNull { .. } + | RefNull { .. } + | RefFunc { .. } + | RefAsNonNull { .. } + | BrOnNonNull { .. } + | CallRef { .. } + | BrOnNull { .. } => { supported = false; break 'main; } + _ => {} + } + } + } + Payload::TypeSection(section) => { + for ty in section.into_iter_err_on_gc_types() { + if let Ok(t) = ty { + for p in t.params().iter().chain(t.results()) { + if !is_type_supported(p) { + supported = false; + break 'main; + } + } + } else { + supported = false; + break 'main; + } + } + } + Payload::GlobalSection(section) => { + for global in section { + if !is_type_supported(&global.unwrap().ty.content_type) { + supported = false; + break 'main; + } + } + } + Payload::TableSection(section) => { + for t in section { + if !t.unwrap().ty.element_type.is_func_ref() { + supported = false; + break 'main; } } } diff --git a/fuzz/fuzz_targets/instantiate-many.rs b/fuzz/fuzz_targets/instantiate-many.rs index 48f1248a181d..0ee9fa2ebcbc 100644 --- a/fuzz/fuzz_targets/instantiate-many.rs +++ b/fuzz/fuzz_targets/instantiate-many.rs @@ -5,6 +5,7 @@ use libfuzzer_sys::arbitrary::{Result, Unstructured}; use libfuzzer_sys::fuzz_target; +use wasmtime_fuzzing::single_module_fuzzer::KnownValid; use wasmtime_fuzzing::{generators, oracles}; const MAX_MODULES: usize = 5; @@ -56,7 +57,7 @@ fn execute_one(data: &[u8]) -> Result<()> { .collect::>>()?, ); - oracles::instantiate_many(&modules, true, &config, &commands); + oracles::instantiate_many(&modules, KnownValid::Yes, &config, &commands); Ok(()) } diff --git a/fuzz/fuzz_targets/instantiate.rs b/fuzz/fuzz_targets/instantiate.rs index 8e552bea0dcd..cc5ae10f516b 100644 --- a/fuzz/fuzz_targets/instantiate.rs +++ b/fuzz/fuzz_targets/instantiate.rs @@ -3,6 +3,7 @@ use libfuzzer_sys::arbitrary::{Arbitrary, Result, Unstructured}; use wasmtime_fuzzing::generators::Config; use wasmtime_fuzzing::oracles::{instantiate, Timeout}; +use wasmtime_fuzzing::single_module_fuzzer::KnownValid; wasmtime_fuzzing::single_module_fuzzer!(execute gen_module); @@ -31,7 +32,7 @@ impl<'a> Arbitrary<'a> for InstantiateInput { fn execute( module: &[u8], - known_valid: bool, + known_valid: KnownValid, mut input: InstantiateInput, u: &mut Unstructured<'_>, ) -> Result<()> { @@ -39,21 +40,40 @@ fn execute( // If the input module isn't a "known valid" module then it can't be // relied on self-regulating itself, so force a timeout via epochs/fuel // in the configuration. - Timeout::None if !known_valid => input.config.generate_timeout(u)?, + Timeout::None if known_valid == KnownValid::No => input.config.generate_timeout(u)?, other => other, }; instantiate(module, known_valid, &input.config, timeout); Ok(()) } -fn gen_module(input: &mut InstantiateInput, u: &mut Unstructured<'_>) -> Result> { - let module = input.config.generate( - u, - if let Timeout::None = input.timeout { - Some(1000) - } else { - None - }, - )?; - Ok(module.to_bytes()) +fn gen_module( + input: &mut InstantiateInput, + u: &mut Unstructured<'_>, +) -> Result<(Vec, KnownValid)> { + // With a small-ish chance take raw fuzz input and put it in the module to + // stress module compilation/validation. In such a situation we can't use + // `ensure_termination` in wasm-smith so list the timeout as `None` to time + // out via epochs or Wasmtime-level fuel. + // + // Otherwise though if no timeout is configured use wasm-smith fuel to + // ensure termination. + let allow_invalid_funcs = u.ratio(1, 10)?; + + let default_fuel = if allow_invalid_funcs { + input.config.module_config.config.allow_invalid_funcs = true; + input.timeout = Timeout::None; + None + } else if let Timeout::None = input.timeout { + Some(1000) + } else { + None + }; + let module = input.config.generate(u, default_fuel)?; + let known_valid = if allow_invalid_funcs { + KnownValid::No + } else { + KnownValid::Yes + }; + Ok((module.to_bytes(), known_valid)) } diff --git a/scripts/publish.rs b/scripts/publish.rs index 598dd40c0901..3707da75449e 100644 --- a/scripts/publish.rs +++ b/scripts/publish.rs @@ -56,7 +56,6 @@ const CRATES_TO_PUBLISH: &[&str] = &[ "wasmtime-runtime", "wasmtime-cranelift-shared", "wasmtime-cranelift", - "wasmtime-jit", "wasmtime-cache", "winch-codegen", "wasmtime-winch", @@ -64,14 +63,14 @@ const CRATES_TO_PUBLISH: &[&str] = &[ // wasi-common/wiggle "wiggle", "wasi-common", - "wasi-cap-std-sync", - "wasi-tokio", // other misc wasmtime crates "wasmtime-wasi", "wasmtime-wasi-http", "wasmtime-wasi-nn", "wasmtime-wasi-threads", "wasmtime-wast", + "wasmtime-c-api-macros", + "wasmtime-c-api-impl", "wasmtime-cli-flags", "wasmtime-explorer", "wasmtime-cli", diff --git a/src/bin/wasmtime.rs b/src/bin/wasmtime.rs index a8e90550552f..6abcbf819703 100644 --- a/src/bin/wasmtime.rs +++ b/src/bin/wasmtime.rs @@ -8,8 +8,8 @@ use clap::Parser; /// Wasmtime WebAssembly Runtime #[derive(Parser, PartialEq)] -#[clap( - version, +#[command( + version = version(), after_help = "If a subcommand is not provided, the `run` subcommand will be used.\n\ \n\ Usage examples:\n\ @@ -34,12 +34,17 @@ use clap::Parser; args_conflicts_with_subcommands = true )] struct Wasmtime { - #[clap(subcommand)] + #[command(subcommand)] subcommand: Option, - #[clap(flatten)] + #[command(flatten)] run: wasmtime_cli::commands::RunCommand, } +/// If WASMTIME_VERSION_INFO is set, use it, otherwise use CARGO_PKG_VERSION. +fn version() -> &'static str { + option_env!("WASMTIME_VERSION_INFO").unwrap_or(env!("CARGO_PKG_VERSION")) +} + #[derive(Parser, PartialEq)] enum Subcommand { /// Runs a WebAssembly module diff --git a/src/commands/compile.rs b/src/commands/compile.rs index d5f7ef0d3c93..4a399238fa16 100644 --- a/src/commands/compile.rs +++ b/src/commands/compile.rs @@ -30,30 +30,29 @@ static AFTER_HELP: Lazy = Lazy::new(|| { /// Compiles a WebAssembly module. #[derive(Parser, PartialEq)] -#[structopt( - name = "compile", +#[command( version, after_help = AFTER_HELP.as_str() )] pub struct CompileCommand { - #[clap(flatten)] + #[command(flatten)] #[allow(missing_docs)] pub common: CommonOptions, /// The target triple; default is the host triple - #[clap(long, value_name = "TARGET")] + #[arg(long, value_name = "TARGET")] pub target: Option, /// The path of the output compiled module; defaults to .cwasm - #[clap(short = 'o', long, value_name = "OUTPUT")] + #[arg(short = 'o', long, value_name = "OUTPUT")] pub output: Option, /// The directory path to write clif files into, one clif file per wasm function. - #[clap(long = "emit-clif", value_name = "PATH")] + #[arg(long = "emit-clif", value_name = "PATH")] pub emit_clif: Option, /// The path of the WebAssembly to compile - #[clap(index = 1, value_name = "MODULE")] + #[arg(index = 1, value_name = "MODULE")] pub module: PathBuf, } diff --git a/src/commands/config.rs b/src/commands/config.rs index b18e90ea82a3..d53b8f9a1299 100644 --- a/src/commands/config.rs +++ b/src/commands/config.rs @@ -1,23 +1,22 @@ //! The module that implements the `wasmtime config` command. use anyhow::Result; -use clap::Parser; +use clap::{Parser, Subcommand}; const CONFIG_NEW_AFTER_HELP: &str = "If no file path is specified, the system configuration file path will be used."; /// Controls Wasmtime configuration settings #[derive(Parser, PartialEq)] -#[clap(name = "config")] pub struct ConfigCommand { - #[clap(subcommand)] + #[command(subcommand)] subcommand: ConfigSubcommand, } -#[derive(clap::Subcommand, PartialEq)] +#[derive(Subcommand, PartialEq)] enum ConfigSubcommand { /// Creates a new Wasmtime configuration file - #[clap(after_help = CONFIG_NEW_AFTER_HELP)] + #[command(after_help = CONFIG_NEW_AFTER_HELP)] New(ConfigNewCommand), } @@ -32,10 +31,9 @@ impl ConfigCommand { /// Creates a new Wasmtime configuration file #[derive(Parser, PartialEq)] -#[clap(name = "new", after_help = CONFIG_NEW_AFTER_HELP)] pub struct ConfigNewCommand { /// The path of the new configuration file - #[clap(index = 1, value_name = "FILE_PATH")] + #[arg(index = 1, value_name = "FILE_PATH")] path: Option, } diff --git a/src/commands/explore.rs b/src/commands/explore.rs index 6b008253f164..465a1d342ff3 100644 --- a/src/commands/explore.rs +++ b/src/commands/explore.rs @@ -7,22 +7,21 @@ use wasmtime_cli_flags::CommonOptions; /// Explore the compilation of a WebAssembly module to native code. #[derive(Parser, PartialEq)] -#[clap(name = "explore")] pub struct ExploreCommand { - #[clap(flatten)] + #[command(flatten)] common: CommonOptions, /// The target triple; default is the host triple - #[clap(long, value_name = "TARGET")] + #[arg(long, value_name = "TARGET")] target: Option, /// The path of the WebAssembly module to compile - #[clap(required = true, value_name = "MODULE")] + #[arg(required = true, value_name = "MODULE")] module: PathBuf, /// The path of the explorer output (derived from the MODULE name if none /// provided) - #[clap(short, long)] + #[arg(short, long)] output: Option, } diff --git a/src/commands/run.rs b/src/commands/run.rs index 6ca015dddf67..94ab6f0039ee 100644 --- a/src/commands/run.rs +++ b/src/commands/run.rs @@ -11,12 +11,11 @@ use anyhow::{anyhow, bail, Context as _, Error, Result}; use clap::Parser; use std::ffi::OsString; use std::path::{Path, PathBuf}; -use std::sync::Arc; +use std::sync::{Arc, Mutex}; use std::thread; +use wasi_common::sync::{ambient_authority, Dir, TcpListener, WasiCtxBuilder}; use wasmtime::{Engine, Func, Module, Store, StoreLimits, Val, ValType}; -use wasmtime_wasi::maybe_exit_on_error; use wasmtime_wasi::preview2; -use wasmtime_wasi::sync::{ambient_authority, Dir, TcpListener, WasiCtxBuilder}; #[cfg(feature = "wasi-nn")] use wasmtime_wasi_nn::WasiNnCtx; @@ -55,9 +54,8 @@ fn parse_preloads(s: &str) -> Result<(String, PathBuf)> { /// Runs a WebAssembly module #[derive(Parser, PartialEq)] -#[structopt(name = "run")] pub struct RunCommand { - #[clap(flatten)] + #[command(flatten)] #[allow(missing_docs)] pub run: RunCommon, @@ -67,7 +65,7 @@ pub struct RunCommand { /// host is made available within the guest. If specified as `HOST::GUEST` /// then the `HOST` directory is opened and made available as the name /// `GUEST` in the guest. - #[clap(long = "dir", value_name = "HOST_DIR[::GUEST_DIR]", value_parser = parse_dirs)] + #[arg(long = "dir", value_name = "HOST_DIR[::GUEST_DIR]", value_parser = parse_dirs)] pub dirs: Vec<(String, String)>, /// Pass an environment variable to the program. @@ -77,15 +75,15 @@ pub struct RunCommand { /// form will set the environment variable named `FOO` to the same value it /// has in the calling process for the guest, or in other words it will /// cause the environment variable `FOO` to be inherited. - #[clap(long = "env", number_of_values = 1, value_name = "NAME[=VAL]", value_parser = parse_env_var)] + #[arg(long = "env", number_of_values = 1, value_name = "NAME[=VAL]", value_parser = parse_env_var)] pub vars: Vec<(String, Option)>, /// The name of the function to run - #[clap(long, value_name = "FUNCTION")] + #[arg(long, value_name = "FUNCTION")] pub invoke: Option, /// Load the given WebAssembly module before the main module - #[clap( + #[arg( long = "preload", number_of_values = 1, value_name = "NAME=MODULE_PATH", @@ -98,7 +96,7 @@ pub struct RunCommand { /// Arguments passed to the wasm module will be configured as WASI CLI /// arguments unless the `--invoke` CLI argument is passed in which case /// arguments will be interpreted as arguments to the function specified. - #[clap(value_name = "WASM", trailing_var_arg = true, required = true)] + #[arg(value_name = "WASM", trailing_var_arg = true, required = true)] pub module_and_args: Vec, } @@ -224,7 +222,30 @@ impl RunCommand { // Exit the process if Wasmtime understands the error; // otherwise, fall back on Rust's default error printing/return // code. - return Err(maybe_exit_on_error(e)); + if store.data().preview1_ctx.is_some() { + return Err(wasi_common::maybe_exit_on_error(e)); + } else if store.data().preview2_ctx.is_some() { + if let Some(exit) = e + .downcast_ref::() + .map(|c| c.process_exit_code()) + { + std::process::exit(exit); + } + if e.is::() { + eprintln!("Error: {e:?}"); + cfg_if::cfg_if! { + if #[cfg(unix)] { + std::process::exit(rustix::process::EXIT_SIGNALED_SIGABRT); + } else if #[cfg(windows)] { + // https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/abort?view=vs-2019 + std::process::exit(3); + } + } + } + return Err(e); + } else { + unreachable!("either preview1_ctx or preview2_ctx present") + } } } @@ -330,7 +351,7 @@ impl RunCommand { .unwrap(); Arc::get_mut(&mut profiler) .expect("profiling doesn't support threads yet") - .sample(&store); + .sample(&store, std::time::Duration::ZERO); store.as_context_mut().data_mut().guest_profiler = Some(profiler); } @@ -465,7 +486,7 @@ impl RunCommand { // explicit exit here with status 1 if `Err(())` is returned. result.and_then(|wasm_result| match wasm_result { Ok(()) => Ok(()), - Err(()) => Err(wasmtime_wasi::I32Exit(1).into()), + Err(()) => Err(wasmtime_wasi::preview2::I32Exit(1).into()), }) } }; @@ -590,14 +611,21 @@ impl RunCommand { // are enabled, then use the historical preview1 // implementation. (Some(false), _) | (None, Some(true)) => { - wasmtime_wasi::add_to_linker(linker, |host| { + wasi_common::sync::add_to_linker(linker, |host| { host.preview1_ctx.as_mut().unwrap() })?; self.set_preview1_ctx(store)?; } // If preview2 was explicitly requested, always use it. // Otherwise use it so long as threads are disabled. + // + // Note that for now `preview0` is currently + // default-enabled but this may turn into + // default-disabled in the future. (Some(true), _) | (None, Some(false) | None) => { + if self.run.common.wasi.preview0 != Some(false) { + preview2::preview0::add_to_linker_sync(linker)?; + } preview2::preview1::add_to_linker_sync(linker)?; self.set_preview2_ctx(store)?; } @@ -766,25 +794,36 @@ impl RunCommand { } if self.run.common.wasi.inherit_network == Some(true) { - builder.inherit_network(ambient_authority()); + builder.inherit_network(); } if let Some(enable) = self.run.common.wasi.allow_ip_name_lookup { builder.allow_ip_name_lookup(enable); } + if let Some(enable) = self.run.common.wasi.tcp { + builder.allow_tcp(enable); + } + if let Some(enable) = self.run.common.wasi.udp { + builder.allow_udp(enable); + } - store.data_mut().preview2_ctx = Some(Arc::new(builder.build())); + let ctx = builder.build(); + store.data_mut().preview2_ctx = Some(Arc::new(Mutex::new(ctx))); Ok(()) } } #[derive(Default, Clone)] struct Host { - preview1_ctx: Option, - preview2_ctx: Option>, + preview1_ctx: Option, + + // The Mutex is only needed to satisfy the Sync constraint but we never + // actually perform any locking on it as we use Mutex::get_mut for every + // access. + preview2_ctx: Option>>, // Resource table for preview2 if the `preview2_ctx` is in use, otherwise // "just" an empty table. - preview2_table: Arc, + preview2_table: Arc>, // State necessary for the preview1 implementation of WASI backed by the // preview2 host implementation. Only used with the `--preview2` flag right @@ -803,21 +842,19 @@ struct Host { } impl preview2::WasiView for Host { - fn table(&self) -> &preview2::Table { - &self.preview2_table - } - - fn table_mut(&mut self) -> &mut preview2::Table { - Arc::get_mut(&mut self.preview2_table).expect("preview2 is not compatible with threads") + fn table(&mut self) -> &mut wasmtime::component::ResourceTable { + Arc::get_mut(&mut self.preview2_table) + .expect("preview2 is not compatible with threads") + .get_mut() + .unwrap() } - fn ctx(&self) -> &preview2::WasiCtx { - self.preview2_ctx.as_ref().unwrap() - } - - fn ctx_mut(&mut self) -> &mut preview2::WasiCtx { + fn ctx(&mut self) -> &mut preview2::WasiCtx { let ctx = self.preview2_ctx.as_mut().unwrap(); - Arc::get_mut(ctx).expect("preview2 is not compatible with threads") + Arc::get_mut(ctx) + .expect("preview2 is not compatible with threads") + .get_mut() + .unwrap() } } @@ -838,8 +875,11 @@ impl wasmtime_wasi_http::types::WasiHttpView for Host { Arc::get_mut(ctx).expect("preview2 is not compatible with threads") } - fn table(&mut self) -> &mut preview2::Table { - Arc::get_mut(&mut self.preview2_table).expect("preview2 is not compatible with threads") + fn table(&mut self) -> &mut wasmtime::component::ResourceTable { + Arc::get_mut(&mut self.preview2_table) + .expect("preview2 is not compatible with threads") + .get_mut() + .unwrap() } } diff --git a/src/commands/serve.rs b/src/commands/serve.rs index fe5a8f240857..b05b18275875 100644 --- a/src/commands/serve.rs +++ b/src/commands/serve.rs @@ -1,9 +1,9 @@ use crate::common::{Profile, RunCommon, RunTarget}; use anyhow::{anyhow, bail, Result}; use clap::Parser; +use std::net::SocketAddr; use std::{ path::PathBuf, - pin::Pin, sync::{ atomic::{AtomicBool, AtomicU64, Ordering}, Arc, @@ -11,18 +11,18 @@ use std::{ }; use wasmtime::component::{InstancePre, Linker}; use wasmtime::{Engine, Store, StoreLimits}; -use wasmtime_wasi::preview2::{ - self, StreamError, StreamResult, Table, WasiCtx, WasiCtxBuilder, WasiView, -}; +use wasmtime_wasi::preview2::{self, StreamError, StreamResult, WasiCtx, WasiCtxBuilder, WasiView}; +use wasmtime_wasi_http::io::TokioIo; use wasmtime_wasi_http::{ - body::HyperOutgoingBody, hyper_response_error, WasiHttpCtx, WasiHttpView, + bindings::http::types as http_types, body::HyperOutgoingBody, hyper_response_error, + WasiHttpCtx, WasiHttpView, }; #[cfg(feature = "wasi-nn")] use wasmtime_wasi_nn::WasiNnCtx; struct Host { - table: Table, + table: wasmtime::component::ResourceTable, ctx: WasiCtx, http: WasiHttpCtx, @@ -33,25 +33,17 @@ struct Host { } impl WasiView for Host { - fn table(&self) -> &Table { - &self.table - } - - fn table_mut(&mut self) -> &mut Table { + fn table(&mut self) -> &mut wasmtime::component::ResourceTable { &mut self.table } - fn ctx(&self) -> &WasiCtx { - &self.ctx - } - - fn ctx_mut(&mut self) -> &mut WasiCtx { + fn ctx(&mut self) -> &mut WasiCtx { &mut self.ctx } } impl WasiHttpView for Host { - fn table(&mut self) -> &mut Table { + fn table(&mut self) -> &mut wasmtime::component::ResourceTable { &mut self.table } @@ -67,17 +59,16 @@ const DEFAULT_ADDR: std::net::SocketAddr = std::net::SocketAddr::new( /// Runs a WebAssembly module #[derive(Parser, PartialEq)] -#[structopt(name = "serve")] pub struct ServeCommand { - #[clap(flatten)] + #[command(flatten)] run: RunCommon, /// Socket address for the web server to bind to. - #[clap(long = "addr", value_name = "SOCKADDR", default_value_t = DEFAULT_ADDR )] - addr: std::net::SocketAddr, + #[arg(long = "addr", value_name = "SOCKADDR", default_value_t = DEFAULT_ADDR )] + addr: SocketAddr, /// The WebAssembly component to run. - #[clap(value_name = "WASM", required = true)] + #[arg(value_name = "WASM", required = true)] component: PathBuf, } @@ -155,7 +146,7 @@ impl ServeCommand { }); let mut host = Host { - table: Table::new(), + table: wasmtime::component::ResourceTable::new(), ctx: builder.build(), http: WasiHttpCtx, @@ -184,7 +175,7 @@ impl ServeCommand { let mut store = Store::new(engine, host); if self.run.common.wasm.timeout.is_some() { - store.set_epoch_deadline(1); + store.set_epoch_deadline(u64::from(EPOCH_PRECISION) + 1); } store.data_mut().limits = self.run.store_limits(); @@ -200,19 +191,41 @@ impl ServeCommand { } fn add_to_linker(&self, linker: &mut Linker) -> Result<()> { - // wasi-http and the component model are implicitly enabled for `wasmtime serve`, so we - // don't test for `self.run.common.wasi.common` or `self.run.common.wasi.http` in this - // function. - - wasmtime_wasi_http::proxy::add_to_linker(linker)?; + // Repurpose the `-Scommon` flag of `wasmtime run` for `wasmtime serve` + // to serve as a signal to enable all WASI interfaces instead of just + // those in the `proxy` world. If `-Scommon` is present then add all + // `command` APIs which includes all "common" or base WASI APIs and then + // additionally add in the required HTTP APIs. + // + // If `-Scommon` isn't passed then use the `proxy::add_to_linker` + // bindings which adds just those interfaces that the proxy interface + // uses. + if self.run.common.wasi.common == Some(true) { + preview2::command::add_to_linker(linker)?; + wasmtime_wasi_http::proxy::add_only_http_to_linker(linker)?; + } else { + wasmtime_wasi_http::proxy::add_to_linker(linker)?; + } if self.run.common.wasi.nn == Some(true) { + #[cfg(not(feature = "wasi-nn"))] + { + bail!("support for wasi-nn was disabled at compile time"); + } #[cfg(feature = "wasi-nn")] { wasmtime_wasi_nn::wit::ML::add_to_linker(linker, |host| host.nn.as_mut().unwrap())?; } } + if self.run.common.wasi.threads == Some(true) { + bail!("support for wasi-threads is not available with components"); + } + + if self.run.common.wasi.http == Some(false) { + bail!("support for wasi-http must be enabled for `serve` subcommand"); + } + Ok(()) } @@ -250,12 +263,25 @@ impl ServeCommand { let instance = linker.instantiate_pre(&component)?; - let listener = tokio::net::TcpListener::bind(self.addr).await?; + // Tokio by default sets `SO_REUSEADDR` for listeners but that makes it + // a bit confusing if you run Wasmtime but forget to close a previous + // `serve` session. To avoid that we explicitly disable `SO_REUSEADDR` + // here. + let socket = match &self.addr { + SocketAddr::V4(_) => tokio::net::TcpSocket::new_v4()?, + SocketAddr::V6(_) => tokio::net::TcpSocket::new_v6()?, + }; + socket.set_reuseaddr(false)?; + socket.bind(self.addr)?; + let listener = socket.listen(100)?; eprintln!("Serving HTTP on http://{}/", listener.local_addr()?); let _epoch_thread = if let Some(timeout) = self.run.common.wasm.timeout { - Some(EpochThread::spawn(timeout, engine.clone())) + Some(EpochThread::spawn( + timeout / EPOCH_PRECISION, + engine.clone(), + )) } else { None }; @@ -266,11 +292,15 @@ impl ServeCommand { loop { let (stream, _) = listener.accept().await?; + let stream = TokioIo::new(stream); let h = handler.clone(); - tokio::task::spawn(async move { + tokio::task::spawn(async { if let Err(e) = http1::Builder::new() .keep_alive(true) - .serve_connection(stream, h) + .serve_connection( + stream, + hyper::service::service_fn(move |req| handle_request(h.clone(), req)), + ) .await { eprintln!("error: {e:?}"); @@ -280,6 +310,12 @@ impl ServeCommand { } } +/// This is the number of epochs that we will observe before expiring a request handler. As +/// instances may be started at any point within an epoch, and epochs are counted globally per +/// engine, we expire after `EPOCH_PRECISION + 1` epochs have been observed. This gives a maximum +/// overshoot of `timeout / EPOCH_PRECISION`, which is more desirable than expiring early. +const EPOCH_PRECISION: u32 = 10; + struct EpochThread { shutdown: Arc, handle: Option>, @@ -341,59 +377,80 @@ impl ProxyHandler { type Request = hyper::Request; -impl hyper::service::Service for ProxyHandler { - type Response = hyper::Response; - type Error = anyhow::Error; - type Future = Pin> + Send>>; - - fn call(&mut self, req: Request) -> Self::Future { - use http_body_util::BodyExt; - - let ProxyHandler(inner) = self.clone(); - - let (sender, receiver) = tokio::sync::oneshot::channel(); - - // TODO: need to track the join handle, but don't want to block the response on it - tokio::task::spawn(async move { - let req_id = inner.next_req_id(); +async fn handle_request( + ProxyHandler(inner): ProxyHandler, + req: Request, +) -> Result> { + use http_body_util::BodyExt; + + let (sender, receiver) = tokio::sync::oneshot::channel(); + + // TODO: need to track the join handle, but don't want to block the response on it + tokio::task::spawn(async move { + let req_id = inner.next_req_id(); + let (mut parts, body) = req.into_parts(); + + parts.uri = { + let uri_parts = parts.uri.into_parts(); + + let scheme = uri_parts.scheme.unwrap_or(http::uri::Scheme::HTTP); + + let host = if let Some(val) = parts.headers.get(hyper::header::HOST) { + std::str::from_utf8(val.as_bytes()) + .map_err(|_| http_types::ErrorCode::HttpRequestUriInvalid)? + } else { + uri_parts + .authority + .as_ref() + .ok_or(http_types::ErrorCode::HttpRequestUriInvalid)? + .host() + }; + + let path_with_query = uri_parts + .path_and_query + .ok_or(http_types::ErrorCode::HttpRequestUriInvalid)?; + + hyper::Uri::builder() + .scheme(scheme) + .authority(host) + .path_and_query(path_with_query) + .build() + .map_err(|_| http_types::ErrorCode::HttpRequestUriInvalid)? + }; - log::info!( - "Request {req_id} handling {} to {}", - req.method(), - req.uri() - ); + let req = hyper::Request::from_parts(parts, body.map_err(hyper_response_error).boxed()); - let mut store = inner.cmd.new_store(&inner.engine, req_id)?; + log::info!( + "Request {req_id} handling {} to {}", + req.method(), + req.uri() + ); - let req = store - .data_mut() - .new_incoming_request(req.map(|body| body.map_err(hyper_response_error).boxed()))?; + let mut store = inner.cmd.new_store(&inner.engine, req_id)?; - let out = store.data_mut().new_response_outparam(sender)?; + let req = store.data_mut().new_incoming_request(req)?; + let out = store.data_mut().new_response_outparam(sender)?; - let (proxy, _inst) = - wasmtime_wasi_http::proxy::Proxy::instantiate_pre(&mut store, &inner.instance_pre) - .await?; + let (proxy, _inst) = + wasmtime_wasi_http::proxy::Proxy::instantiate_pre(&mut store, &inner.instance_pre) + .await?; - if let Err(e) = proxy - .wasi_http_incoming_handler() - .call_handle(store, req, out) - .await - { - log::error!("[{req_id}] :: {:#?}", e); - return Err(e); - } + if let Err(e) = proxy + .wasi_http_incoming_handler() + .call_handle(store, req, out) + .await + { + log::error!("[{req_id}] :: {:#?}", e); + return Err(e); + } - Ok(()) - }); + Ok(()) + }); - Box::pin(async move { - match receiver.await { - Ok(Ok(resp)) => Ok(resp), - Ok(Err(e)) => Err(e.into()), - Err(_) => bail!("guest never invoked `response-outparam::set` method"), - } - }) + match receiver.await { + Ok(Ok(resp)) => Ok(resp), + Ok(Err(e)) => Err(e.into()), + Err(_) => bail!("guest never invoked `response-outparam::set` method"), } } diff --git a/src/commands/settings.rs b/src/commands/settings.rs index 600a23454649..1a4a967f02dc 100644 --- a/src/commands/settings.rs +++ b/src/commands/settings.rs @@ -9,14 +9,13 @@ use wasmtime_environ::{CompilerBuilder, FlagValue, Setting, SettingKind}; /// Displays available Cranelift settings for a target. #[derive(Parser, PartialEq)] -#[clap(name = "run")] pub struct SettingsCommand { /// The target triple to get the settings for; defaults to the host triple. - #[clap(long, value_name = "TARGET")] + #[arg(long, value_name = "TARGET")] target: Option, /// Switch output format to JSON - #[clap(long)] + #[arg(long)] json: bool, } @@ -108,7 +107,7 @@ impl SettingsCommand { /// Executes the command. pub fn execute(self) -> Result<()> { // Gather settings from the cranelift compiler builder - let mut builder = wasmtime_cranelift::builder(); + let mut builder = wasmtime_cranelift::builder(None)?; if let Some(target) = &self.target { let target = target_lexicon::Triple::from_str(target).map_err(|e| anyhow!(e))?; builder.target(target)?; diff --git a/src/commands/wast.rs b/src/commands/wast.rs index 669b817a547d..1edeeb4dcb53 100644 --- a/src/commands/wast.rs +++ b/src/commands/wast.rs @@ -9,13 +9,12 @@ use wasmtime_wast::WastContext; /// Runs a WebAssembly test script file #[derive(Parser, PartialEq)] -#[clap(name = "wast", version)] pub struct WastCommand { - #[clap(flatten)] + #[command(flatten)] common: CommonOptions, /// The path of the WebAssembly test script to run - #[clap(required = true, value_name = "SCRIPT_FILE")] + #[arg(required = true, value_name = "SCRIPT_FILE")] scripts: Vec, } diff --git a/src/common.rs b/src/common.rs index 2d5f68c6f21e..2850639d016f 100644 --- a/src/common.rs +++ b/src/common.rs @@ -37,7 +37,7 @@ impl RunTarget { /// Common command line arguments for run commands. #[derive(Parser, PartialEq)] pub struct RunCommon { - #[clap(flatten)] + #[command(flatten)] pub common: CommonOptions, /// Allow executing precompiled WebAssembly modules as `*.cwasm` files. @@ -46,7 +46,7 @@ pub struct RunCommon { /// is arbitrary user input. Only `wasmtime`-precompiled modules generated /// via the `wasmtime compile` command or equivalent should be passed as an /// argument with this option specified. - #[clap(long = "allow-precompiled")] + #[arg(long = "allow-precompiled")] pub allow_precompiled: bool, /// Profiling strategy (valid options are: perfmap, jitdump, vtune, guest) @@ -64,7 +64,7 @@ pub struct RunCommon { /// where `path` is where to write the profile and `interval` is the /// duration between samples. When used with `--wasm-timeout` the timeout /// will be rounded up to the nearest multiple of this interval. - #[clap( + #[arg( long, value_name = "STRATEGY", value_parser = Profile::parse, @@ -107,7 +107,7 @@ impl RunCommon { #[cfg(feature = "component-model")] fn ensure_allow_components(&self) -> Result<()> { - if self.common.wasm.component_model != Some(true) { + if self.common.wasm.component_model == Some(false) { bail!("cannot execute a component without `--wasm component-model`"); } diff --git a/src/lib.rs b/src/lib.rs index 7b657e7e37df..c2d0808bc981 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,13 +2,7 @@ //! //! This crate implements the Wasmtime command line tools. -#![deny( - missing_docs, - trivial_numeric_casts, - unused_extern_crates, - unstable_features -)] -#![warn(unused_import_braces)] +#![deny(missing_docs)] pub mod commands; diff --git a/src/old_cli.rs b/src/old_cli.rs index ec73aab63525..f6bbe5ff4b1d 100644 --- a/src/old_cli.rs +++ b/src/old_cli.rs @@ -10,7 +10,7 @@ use std::time::Duration; /// Wasmtime WebAssembly Runtime #[derive(Parser)] -#[clap( +#[command( version, after_help = "If a subcommand is not provided, the `run` subcommand will be used.\n\ \n\ @@ -50,23 +50,23 @@ pub enum Subcommand { } #[derive(Parser)] -#[structopt(name = "run", trailing_var_arg = true)] +#[command(trailing_var_arg = true)] pub struct RunCommand { - #[clap(flatten)] + #[command(flatten)] common: CommonOptions, /// Allow unknown exports when running commands. - #[clap(long = "allow-unknown-exports")] + #[arg(long = "allow-unknown-exports")] allow_unknown_exports: bool, /// Allow the main module to import unknown functions, using an /// implementation that immediately traps, when running commands. - #[clap(long = "trap-unknown-imports")] + #[arg(long = "trap-unknown-imports")] trap_unknown_imports: bool, /// Allow the main module to import unknown functions, using an /// implementation that returns default values, when running commands. - #[clap(long = "default-values-unknown-imports")] + #[arg(long = "default-values-unknown-imports")] default_values_unknown_imports: bool, /// Allow executing precompiled WebAssembly modules as `*.cwasm` files. @@ -75,16 +75,16 @@ pub struct RunCommand { /// is arbitrary user input. Only `wasmtime`-precompiled modules generated /// via the `wasmtime compile` command or equivalent should be passed as an /// argument with this option specified. - #[clap(long = "allow-precompiled")] + #[arg(long = "allow-precompiled")] allow_precompiled: bool, /// Inherit environment variables and file descriptors following the /// systemd listen fd specification (UNIX only) - #[clap(long = "listenfd")] + #[arg(long = "listenfd")] listenfd: bool, /// Grant access to the given TCP listen socket - #[clap( + #[arg( long = "tcplisten", number_of_values = 1, value_name = "SOCKET ADDRESS" @@ -92,7 +92,7 @@ pub struct RunCommand { tcplisten: Vec, /// Grant access to the given host directory - #[clap(long = "dir", number_of_values = 1, value_name = "DIRECTORY")] + #[arg(long = "dir", number_of_values = 1, value_name = "DIRECTORY")] dirs: Vec, /// Pass an environment variable to the program. @@ -102,15 +102,15 @@ pub struct RunCommand { /// form will set the environment variable named `FOO` to the same value it /// has in the calling process for the guest, or in other words it will /// cause the environment variable `FOO` to be inherited. - #[clap(long = "env", number_of_values = 1, value_name = "NAME[=VAL]", value_parser = parse_env_var)] + #[arg(long = "env", number_of_values = 1, value_name = "NAME[=VAL]", value_parser = parse_env_var)] vars: Vec<(String, Option)>, /// The name of the function to run - #[clap(long, value_name = "FUNCTION")] + #[arg(long, value_name = "FUNCTION")] invoke: Option, /// Grant access to a guest directory mapped as a host directory - #[clap(long = "mapdir", number_of_values = 1, value_name = "GUEST_DIR::HOST_DIR", value_parser = parse_map_dirs)] + #[arg(long = "mapdir", number_of_values = 1, value_name = "GUEST_DIR::HOST_DIR", value_parser = parse_map_dirs)] map_dirs: Vec<(String, String)>, /// Pre-load machine learning graphs (i.e., models) for use by wasi-nn. @@ -121,11 +121,11 @@ pub struct RunCommand { /// an OpenVINO model named `bar`. Note that which model encodings are /// available is dependent on the backends implemented in the /// `wasmtime_wasi_nn` crate. - #[clap(long = "wasi-nn-graph", value_name = "FORMAT::HOST_DIR", value_parser = parse_graphs)] + #[arg(long = "wasi-nn-graph", value_name = "FORMAT::HOST_DIR", value_parser = parse_graphs)] graphs: Vec<(String, String)>, /// The path of the WebAssembly module to run - #[clap( + #[arg( required = true, value_name = "MODULE", value_parser = OsStringValueParser::new().try_map(parse_module), @@ -133,7 +133,7 @@ pub struct RunCommand { module: PathBuf, /// Load the given WebAssembly module before the main module - #[clap( + #[arg( long = "preload", number_of_values = 1, value_name = "NAME=MODULE_PATH", @@ -142,7 +142,7 @@ pub struct RunCommand { preloads: Vec<(String, PathBuf)>, /// Maximum execution time of wasm code before timing out (1, 2s, 100ms, etc) - #[clap( + #[arg( long = "wasm-timeout", value_name = "TIME", value_parser = parse_dur, @@ -164,7 +164,7 @@ pub struct RunCommand { /// where `path` is where to write the profile and `interval` is the /// duration between samples. When used with `--wasm-timeout` the timeout /// will be rounded up to the nearest multiple of this interval. - #[clap( + #[arg( long, value_name = "STRATEGY", value_parser = parse_profile, @@ -172,35 +172,35 @@ pub struct RunCommand { profile: Option, /// Enable coredump generation after a WebAssembly trap. - #[clap(long = "coredump-on-trap", value_name = "PATH")] + #[arg(long = "coredump-on-trap", value_name = "PATH")] coredump_on_trap: Option, // NOTE: this must come last for trailing varargs /// The arguments to pass to the module - #[clap(value_name = "ARGS")] + #[arg(value_name = "ARGS")] module_args: Vec, /// Maximum size, in bytes, that a linear memory is allowed to reach. /// /// Growth beyond this limit will cause `memory.grow` instructions in /// WebAssembly modules to return -1 and fail. - #[clap(long, value_name = "BYTES")] + #[arg(long, value_name = "BYTES")] max_memory_size: Option, /// Maximum size, in table elements, that a table is allowed to reach. - #[clap(long)] + #[arg(long)] max_table_elements: Option, /// Maximum number of WebAssembly instances allowed to be created. - #[clap(long)] + #[arg(long)] max_instances: Option, /// Maximum number of WebAssembly tables allowed to be created. - #[clap(long)] + #[arg(long)] max_tables: Option, /// Maximum number of WebAssembly linear memories allowed to be created. - #[clap(long)] + #[arg(long)] max_memories: Option, /// Force a trap to be raised on `memory.grow` and `table.grow` failure @@ -209,7 +209,7 @@ pub struct RunCommand { /// This is not necessarily a spec-compliant option to enable but can be /// useful for tracking down a backtrace of what is requesting so much /// memory, for example. - #[clap(long)] + #[arg(long)] trap_on_grow_failure: bool, /// Indicates that the implementation of WASI preview1 should be backed by @@ -217,18 +217,18 @@ pub struct RunCommand { /// /// This will become the default in the future and this option will be /// removed. For now this is primarily here for testing. - #[clap(long)] + #[arg(long)] preview2: bool, /// Enables memory error checking. /// /// See wmemcheck.md for documentation on how to use. - #[clap(long)] + #[arg(long)] wmemcheck: bool, /// Flag for WASI preview2 to inherit the host's network within the guest so /// it has full access to all addresses/ports/etc. - #[clap(long)] + #[arg(long)] inherit_network: bool, } fn parse_module(s: OsString) -> anyhow::Result { @@ -315,23 +315,23 @@ fn parse_profile(s: &str) -> Result { /// Compiles a WebAssembly module. #[derive(Parser)] pub struct CompileCommand { - #[clap(flatten)] + #[command(flatten)] pub common: CommonOptions, /// The target triple; default is the host triple - #[clap(long, value_name = "TARGET")] + #[arg(long, value_name = "TARGET")] pub target: Option, /// The path of the output compiled module; defaults to .cwasm - #[clap(short = 'o', long, value_name = "OUTPUT")] + #[arg(short = 'o', long, value_name = "OUTPUT")] pub output: Option, /// The directory path to write clif files into, one clif file per wasm function. - #[clap(long = "emit-clif", value_name = "PATH")] + #[arg(long = "emit-clif", value_name = "PATH")] pub emit_clif: Option, /// The path of the WebAssembly to compile - #[clap(index = 1, value_name = "MODULE")] + #[arg(index = 1, value_name = "MODULE")] pub module: PathBuf, } @@ -340,45 +340,45 @@ pub struct CompileCommand { #[cfg_attr(test, derive(Debug, PartialEq))] pub struct CommonOptions { /// Use specified configuration file - #[clap(long, value_name = "CONFIG_PATH")] + #[arg(long, value_name = "CONFIG_PATH")] pub config: Option, /// Disable logging - #[clap(long, conflicts_with = "log_to_files")] + #[arg(long, conflicts_with = "log_to_files")] pub disable_logging: bool, /// Log to per-thread log files instead of stderr - #[clap(long)] + #[arg(long)] pub log_to_files: bool, /// Generate debug information - #[clap(short = 'g')] + #[arg(short = 'g')] pub debug_info: bool, /// Disable cache system - #[clap(long)] + #[arg(long)] pub disable_cache: bool, /// Disable parallel compilation - #[clap(long)] + #[arg(long)] pub disable_parallel_compilation: bool, /// Enable or disable WebAssembly features - #[clap(long, value_name = "FEATURE,FEATURE,...", value_parser = parse_wasm_features)] + #[arg(long, value_name = "FEATURE,FEATURE,...", value_parser = parse_wasm_features)] pub wasm_features: Option, /// Enable or disable WASI modules - #[clap(long, value_name = "MODULE,MODULE,...", value_parser = parse_wasi_modules)] + #[arg(long, value_name = "MODULE,MODULE,...", value_parser = parse_wasi_modules)] pub wasi_modules: Option, /// Generate jitdump file (supported on --features=profiling build) /// Run optimization passes on translated functions, on by default - #[clap(short = 'O', long)] + #[arg(short = 'O', long)] pub optimize: bool, /// Optimization level for generated functions /// Supported levels: 0 (none), 1, 2 (most), or s (size); default is "most" - #[clap( + #[arg( long, value_name = "LEVEL", value_parser = parse_opt_level, @@ -388,7 +388,7 @@ pub struct CommonOptions { /// Set a Cranelift setting to a given value. /// Use `wasmtime settings` to list Cranelift settings for a target. - #[clap( + #[arg( long = "cranelift-set", value_name = "NAME=VALUE", number_of_values = 1, @@ -399,7 +399,7 @@ pub struct CommonOptions { /// Enable a Cranelift boolean setting or preset. /// Use `wasmtime settings` to list Cranelift settings for a target. - #[clap( + #[arg( long, value_name = "SETTING", number_of_values = 1, @@ -409,32 +409,32 @@ pub struct CommonOptions { /// Maximum size in bytes of wasm memory before it becomes dynamically /// relocatable instead of up-front-reserved. - #[clap(long, value_name = "MAXIMUM")] + #[arg(long, value_name = "MAXIMUM")] pub static_memory_maximum_size: Option, /// Force using a "static" style for all wasm memories - #[clap(long)] + #[arg(long)] pub static_memory_forced: bool, /// Byte size of the guard region after static memories are allocated - #[clap(long, value_name = "SIZE")] + #[arg(long, value_name = "SIZE")] pub static_memory_guard_size: Option, /// Byte size of the guard region after dynamic memories are allocated - #[clap(long, value_name = "SIZE")] + #[arg(long, value_name = "SIZE")] pub dynamic_memory_guard_size: Option, /// Bytes to reserve at the end of linear memory for growth for dynamic /// memories. - #[clap(long, value_name = "SIZE")] + #[arg(long, value_name = "SIZE")] pub dynamic_memory_reserved_for_growth: Option, /// Enable Cranelift's internal debug verifier (expensive) - #[clap(long)] + #[arg(long)] pub enable_cranelift_debug_verifier: bool, /// Enable Cranelift's internal NaN canonicalization - #[clap(long)] + #[arg(long)] pub enable_cranelift_nan_canonicalization: bool, /// Enable execution fuel with N units fuel, where execution will trap after @@ -444,33 +444,33 @@ pub struct CommonOptions { /// such as `nop`, `drop`, `block`, and `loop`, consume 0 units, as any /// execution cost associated with them involves other instructions which do /// consume fuel. - #[clap(long, value_name = "N")] + #[arg(long, value_name = "N")] pub fuel: Option, /// Executing wasm code will yield when a global epoch counter /// changes, allowing for async operation without blocking the /// executor. - #[clap(long)] + #[arg(long)] pub epoch_interruption: bool, /// Disable the on-by-default address map from native code to wasm code - #[clap(long)] + #[arg(long)] pub disable_address_map: bool, /// Disable the default of attempting to initialize linear memory via a /// copy-on-write mapping - #[clap(long)] + #[arg(long)] pub disable_memory_init_cow: bool, /// Enable the pooling allocator, in place of the on-demand /// allocator. #[cfg(feature = "pooling-allocator")] - #[clap(long)] + #[arg(long)] pub pooling_allocator: bool, /// Maximum stack size, in bytes, that wasm is allowed to consume before a /// stack overflow is reported. - #[clap(long)] + #[arg(long)] pub max_wasm_stack: Option, /// Whether or not to force deterministic and host-independent behavior of @@ -481,14 +481,14 @@ pub struct CommonOptions { /// of these instructions to match the deterministic behavior classified in /// the specification. Note that enabling this option may come at a /// performance cost. - #[clap(long)] + #[arg(long)] pub relaxed_simd_deterministic: bool, /// Explicitly specify the name of the compiler to use for WebAssembly. /// /// Currently only `cranelift` and `winch` are supported, but not all builds /// of Wasmtime have both built in. - #[clap(long)] + #[arg(long)] pub compiler: Option, } diff --git a/supply-chain/README b/supply-chain/README deleted file mode 100644 index 26b31a631189..000000000000 --- a/supply-chain/README +++ /dev/null @@ -1,7 +0,0 @@ -This directory contains the state for cargo-vet, a tool to help projects ensure -that third-party Rust dependencies have been audited by a trusted entity. - -More about the tool can be found here: https://mozilla.github.io/cargo-vet/ - -The audits.toml file may be imported by other projects, and therefore should be -handled with care. Ask for help if you're not sure. diff --git a/supply-chain/README.md b/supply-chain/README.md new file mode 100644 index 000000000000..066484407d6e --- /dev/null +++ b/supply-chain/README.md @@ -0,0 +1,8 @@ +# Wasmtime's Configuration of `cargo vet` + +This directory contains the state for [`cargo vet`], a tool to help projects +ensure that third-party Rust dependencies have been audited by a trusted entity. +For more information about Wasmtime's usage of `cargo vet` see our +[documentation](https://docs.wasmtime.dev/contributing-coding-guidelines.html#dependencies-of-wasmtime). + +[`cargo vet`]: https://mozilla.github.io/cargo-vet/ diff --git a/supply-chain/audits.toml b/supply-chain/audits.toml index bed9b135b975..44c8bf49e803 100644 --- a/supply-chain/audits.toml +++ b/supply-chain/audits.toml @@ -701,6 +701,15 @@ who = "Chris Fallin " criteria = "safe-to-deploy" delta = "0.7.6 -> 0.8.2" +[[audits.ahash]] +who = "Alex Crichton " +criteria = "safe-to-deploy" +delta = "0.8.2 -> 0.8.7" +notes = """ +Shuffling of features in this update and while there are updates to `unsafe` +code it's no different than before and the usage remains the same. +""" + [[audits.ambient-authority]] who = "Dan Gohman " criteria = "safe-to-deploy" @@ -833,6 +842,11 @@ criteria = "safe-to-deploy" version = "3.11.1" notes = "I am the author of this crate." +[[audits.bytesize]] +who = "Andrew Brown " +criteria = "safe-to-deploy" +version = "1.3.0" + [[audits.camino]] who = "Pat Hickey " criteria = "safe-to-deploy" @@ -982,6 +996,12 @@ criteria = "safe-to-deploy" version = "0.15.3" notes = "no build, no unsafe, inputs to cargo command are reasonably sanitized" +[[audits.cargo_metadata]] +who = "Alex Crichton " +criteria = "safe-to-deploy" +delta = "0.17.0 -> 0.18.1" +notes = "No major changes, no unsafe code here." + [[audits.cast]] who = "Alex Crichton " criteria = "safe-to-run" @@ -1032,6 +1052,21 @@ criteria = "safe-to-deploy" version = "0.2.4" notes = "A few tiny blocks of `unsafe` but each of them is very obviously correct." +[[audits.core-foundation-sys]] +who = "Dan Gohman " +criteria = "safe-to-deploy" +delta = "0.8.4 -> 0.8.6" +notes = """ +The changes here are all typical bindings updates: new functions, types, and +constants. I have not audited all the bindings for ABI conformance. +""" + +[[audits.cpp_demangle]] +who = "Alex Crichton " +criteria = "safe-to-deploy" +delta = "0.3.5 -> 0.4.3" +notes = "No substantive changes to `unsafe` code and otherwise all looks good." + [[audits.cpufeatures]] who = "Alex Crichton " criteria = "safe-to-deploy" @@ -1325,6 +1360,18 @@ who = "Jamey Sharp " criteria = "safe-to-deploy" delta = "0.3.1 -> 0.3.0" +[[audits.h2]] +who = "Alex Crichton " +criteria = "safe-to-deploy" +delta = "0.3.19 -> 0.4.0" +notes = "A number of changes but nothing adding new `unsafe` or anything outside the purview of what this crate already manages." + +[[audits.h2]] +who = "Alex Crichton " +criteria = "safe-to-deploy" +delta = "0.4.0 -> 0.4.2" +notes = "Minor updates and fixes in this version bump, nothing major." + [[audits.hashbrown]] who = "Chris Fallin " criteria = "safe-to-deploy" @@ -1348,23 +1395,65 @@ who = "Pat Hickey " criteria = "safe-to-deploy" delta = "0.2.0 -> 0.3.0" +[[audits.http]] +who = "Alex Crichton " +criteria = "safe-to-deploy" +delta = "0.2.9 -> 1.0.0" +notes = "Minor changes leading up to the 1.0.0 release and nothing fundamentally new here." + [[audits.http-body]] who = "Pat Hickey " criteria = "safe-to-deploy" version = "1.0.0-rc.2" +[[audits.http-body]] +who = "Alex Crichton " +criteria = "safe-to-deploy" +delta = "1.0.0-rc.2 -> 1.0.0" +notes = "Only minor changes made for a stable release." + [[audits.http-body-util]] who = "Pat Hickey " criteria = "safe-to-deploy" version = "0.1.0-rc.2" notes = "only one use of unsafe related to pin projection. unclear to me why pin_project! is used in many modules of the project, but the expanded output of that macro is inlined in either.rs" +[[audits.http-body-util]] +who = "Alex Crichton " +criteria = "safe-to-deploy" +delta = "0.1.0-rc.2 -> 0.1.0" +notes = "Minor documentation updates an additions, nothing major." + [[audits.httpdate]] who = "Pat Hickey " criteria = "safe-to-deploy" version = "1.0.2" notes = "No unsafety, no io" +[[audits.hyper]] +who = "Alex Crichton " +criteria = "safe-to-deploy" +delta = "1.0.0-rc.3 -> 1.0.1" +notes = """ +Quite a few changes here relative to the last RC but everything is related to +refactorings and such. No new fundamental addition of functionality or +substantially new unsafe code. +""" + +[[audits.iana-time-zone]] +who = "Dan Gohman " +criteria = "safe-to-deploy" +version = "0.1.59" +notes = """ +I also manually ran windows-bindgen and confirmed that the output matches +the bindings checked into the repo. +""" + +[[audits.iana-time-zone-haiku]] +who = "Dan Gohman " +criteria = "safe-to-deploy" +version = "0.1.2" + [[audits.id-arena]] who = "Nick Fitzgerald " criteria = "safe-to-deploy" @@ -1455,6 +1544,15 @@ criteria = "safe-to-deploy" delta = "0.4.1 -> 0.4.3" notes = "The Bytecode Alliance is the author of this crate." +[[audits.itertools]] +who = "Nick Fitzgerald " +criteria = "safe-to-deploy" +delta = "0.10.5 -> 0.12.1" +notes = """ +Minimal `unsafe` usage. Few blocks that existed looked reasonable. Does what it +says on the tin: lots of iterators. +""" + [[audits.ittapi]] who = "Andrew Brown " criteria = "safe-to-deploy" @@ -1521,6 +1619,18 @@ criteria = "safe-to-deploy" delta = "0.2.148 -> 0.2.149" notes = "Lots of new functions and constants for new platforms and nothing out of the ordinary for what one would expect of the `libc` crate." +[[audits.libc]] +who = "Dan Gohman " +criteria = "safe-to-deploy" +delta = "0.2.149 -> 0.2.151" +notes = "More new functions, types, and constants, as is usual for the `libc` crate, as well as various minor code cleanups." + +[[audits.libc]] +who = "Alex Crichton " +criteria = "safe-to-deploy" +delta = "0.2.151 -> 0.2.153" +notes = "More bindings for more platforms. I have not verified that everything is exactly as-is on the platform as specified but nothing major is otherwise introduced as part of this bump." + [[audits.libfuzzer-sys]] who = "Nick Fitzgerald " criteria = "safe-to-run" @@ -1533,6 +1643,11 @@ criteria = "safe-to-run" delta = "0.4.4 -> 0.4.5" notes = "I am the author of this crate." +[[audits.libloading]] +who = "Iceber Gu " +criteria = "safe-to-deploy" +delta = "0.7.3 -> 0.8.1" + [[audits.libm]] who = "Alex Crichton " criteria = "safe-to-deploy" @@ -1724,6 +1839,11 @@ who = "Andrew Brown " criteria = "safe-to-deploy" delta = "0.4.2 -> 0.5.0" +[[audits.openvino]] +who = "Iceber Gu " +criteria = "safe-to-deploy" +delta = "0.5.0 -> 0.6.0" + [[audits.openvino-finder]] who = "Matthew Tamayo-Rios " criteria = "safe-to-deploy" @@ -1737,6 +1857,11 @@ who = "Andrew Brown " criteria = "safe-to-deploy" delta = "0.4.2 -> 0.5.0" +[[audits.openvino-finder]] +who = "Iceber Gu " +criteria = "safe-to-deploy" +delta = "0.5.0 -> 0.6.0" + [[audits.openvino-sys]] who = "Matthew Tamayo-Rios " criteria = "safe-to-deploy" @@ -1750,6 +1875,11 @@ who = "Andrew Brown " criteria = "safe-to-deploy" delta = "0.4.2 -> 0.5.0" +[[audits.openvino-sys]] +who = "Iceber Gu " +criteria = "safe-to-deploy" +delta = "0.5.0 -> 0.6.0" + [[audits.overload]] who = "Pat Hickey " criteria = "safe-to-deploy" @@ -1783,6 +1913,15 @@ criteria = "safe-to-deploy" version = "0.3.25" notes = "This crate shells out to the pkg-config executable, but it appears to sanitize inputs reasonably." +[[audits.pkg-config]] +who = "Alex Crichton " +criteria = "safe-to-deploy" +delta = "0.3.26 -> 0.3.29" +notes = """ +No `unsafe` additions or anything outside of the purview of the crate in this +change. +""" + [[audits.pretty_env_logger]] who = "Alex Crichton " criteria = "safe-to-deploy" @@ -2252,6 +2391,12 @@ who = "Pat Hickey " criteria = "safe-to-deploy" version = "0.3.0" +[[audits.wasi-nn]] +who = "Andrew Brown " +criteria = "safe-to-deploy" +version = "0.6.0" +notes = "This crate contains `unsafe` code due to its purpose: it wraps up `witx-bindgen`-generated code that calls the raw wasi-nn API." + [[audits.wasm-bindgen-shared]] who = "Pat Hickey " criteria = "safe-to-deploy" @@ -2968,6 +3113,25 @@ criteria = "safe-to-deploy" version = "0.6.4" notes = "The Bytecode Alliance is the author of this crate." +[[audits.zstd]] +who = "Alex Crichton " +criteria = "safe-to-deploy" +delta = "0.11.1+zstd.1.5.2 -> 0.13.0" +notes = """ +No major updates to the crate here. Small updates to `unsafe` code which are +refactorings of what was there prior. +""" + +[[audits.zstd-safe]] +who = "Alex Crichton " +criteria = "safe-to-deploy" +delta = "5.0.1+zstd.1.5.2 -> 7.0.0" +notes = """ +Lots of new comments around methods and refactorings for updates in zstd itself. +Does contain new unsafe code, notably an implementation of an internal trait for +the standard library `io::Cursor` type. +""" + [[trusted.aho-corasick]] criteria = "safe-to-deploy" user-id = 189 # Andrew Gallant (BurntSushi) @@ -3100,6 +3264,12 @@ user-id = 6743 # Ed Page (epage) start = "2022-04-15" end = "2024-07-06" +[[trusted.cpp_demangle]] +criteria = "safe-to-deploy" +user-id = 696 # Nick Fitzgerald (fitzgen) +start = "2019-07-30" +end = "2025-02-12" + [[trusted.equivalent]] criteria = "safe-to-deploy" user-id = 539 # Josh Stone (cuviper) @@ -3280,6 +3450,12 @@ user-id = 3618 # David Tolnay (dtolnay) start = "2019-02-28" end = "2024-07-06" +[[trusted.serde_spanned]] +criteria = "safe-to-deploy" +user-id = 6743 # Ed Page (epage) +start = "2023-01-20" +end = "2025-02-12" + [[trusted.syn]] criteria = "safe-to-deploy" user-id = 3618 # David Tolnay (dtolnay) @@ -3322,6 +3498,24 @@ user-id = 1 # Alex Crichton (alexcrichton) start = "2019-05-16" end = "2024-07-06" +[[trusted.toml]] +criteria = "safe-to-deploy" +user-id = 6743 # Ed Page (epage) +start = "2022-12-14" +end = "2025-02-12" + +[[trusted.toml_datetime]] +criteria = "safe-to-deploy" +user-id = 6743 # Ed Page (epage) +start = "2022-10-21" +end = "2025-02-12" + +[[trusted.toml_edit]] +criteria = "safe-to-deploy" +user-id = 6743 # Ed Page (epage) +start = "2021-09-13" +end = "2025-02-12" + [[trusted.walkdir]] criteria = "safe-to-deploy" user-id = 189 # Andrew Gallant (BurntSushi) @@ -3370,6 +3564,18 @@ user-id = 189 # Andrew Gallant (BurntSushi) start = "2020-01-11" end = "2024-07-15" +[[trusted.windows]] +criteria = "safe-to-deploy" +user-id = 64539 # Kenny Kerr (kennykerr) +start = "2021-01-15" +end = "2025-01-30" + +[[trusted.windows-core]] +criteria = "safe-to-deploy" +user-id = 64539 # Kenny Kerr (kennykerr) +start = "2021-11-15" +end = "2025-01-02" + [[trusted.windows-sys]] criteria = "safe-to-deploy" user-id = 64539 # Kenny Kerr (kennykerr) @@ -3424,6 +3630,12 @@ user-id = 64539 # Kenny Kerr (kennykerr) start = "2021-10-27" end = "2024-06-17" +[[trusted.winnow]] +criteria = "safe-to-deploy" +user-id = 6743 # Ed Page (epage) +start = "2023-02-22" +end = "2025-02-12" + [[trusted.winx]] criteria = "safe-to-deploy" user-id = 6825 # Dan Gohman (sunfishcode) diff --git a/supply-chain/config.toml b/supply-chain/config.toml index a1f88774dde1..1c1f0575e337 100644 --- a/supply-chain/config.toml +++ b/supply-chain/config.toml @@ -2,7 +2,7 @@ # cargo-vet config file [cargo-vet] -version = "0.8" +version = "0.9" [imports.embark-studios] url = "https://raw.githubusercontent.com/EmbarkStudios/rust-ecosystem/main/audits.toml" @@ -76,15 +76,9 @@ audit-as-crates-io = true [policy.isle-fuzz] criteria = "safe-to-run" -[policy.wasi-cap-std-sync] -audit-as-crates-io = true - [policy.wasi-common] audit-as-crates-io = true -[policy.wasi-tokio] -audit-as-crates-io = true - [policy.wasmtime] audit-as-crates-io = true @@ -130,9 +124,6 @@ criteria = "safe-to-run" [policy.wasmtime-fuzzing] criteria = "safe-to-run" -[policy.wasmtime-jit] -audit-as-crates-io = true - [policy.wasmtime-jit-debug] audit-as-crates-io = true @@ -246,10 +237,6 @@ criteria = "safe-to-run" version = "0.4.4" criteria = "safe-to-run" -[[exemptions.crossbeam-channel]] -version = "0.5.4" -criteria = "safe-to-deploy" - [[exemptions.crossbeam-deque]] version = "0.8.1" criteria = "safe-to-deploy" @@ -294,10 +281,6 @@ criteria = "safe-to-run" version = "0.3.6" criteria = "safe-to-deploy" -[[exemptions.env_logger]] -version = "0.7.1" -criteria = "safe-to-deploy" - [[exemptions.env_logger]] version = "0.9.0" criteria = "safe-to-deploy" @@ -345,10 +328,6 @@ version = "0.3.19" criteria = "safe-to-deploy" notes = "we are exempting tokio, hyper, and their tightly coupled dependencies by the same authors, expecting that the authors at aws will publish attestions we can import at some point soon" -[[exemptions.hermit-abi]] -version = "0.1.19" -criteria = "safe-to-deploy" - [[exemptions.hermit-abi]] version = "0.2.0" criteria = "safe-to-deploy" @@ -363,10 +342,6 @@ version = "1.8.0" criteria = "safe-to-deploy" notes = "we are exempting tokio, hyper, and their tightly coupled dependencies by the same authors, expecting that the authors at aws will publish attestions we can import at some point soon" -[[exemptions.humantime]] -version = "1.3.0" -criteria = "safe-to-deploy" - [[exemptions.humantime]] version = "2.1.0" criteria = "safe-to-deploy" @@ -620,6 +595,22 @@ criteria = "safe-to-deploy" version = "0.11.0+wasi-snapshot-preview1" criteria = "safe-to-deploy" +[[exemptions.wasmi]] +version = "0.31.1" +criteria = "safe-to-run" + +[[exemptions.wasmi_arena]] +version = "0.4.1" +criteria = "safe-to-run" + +[[exemptions.wasmi_core]] +version = "0.13.0" +criteria = "safe-to-run" + +[[exemptions.wasmparser-nostd]] +version = "0.100.1" +criteria = "safe-to-run" + [[exemptions.web-sys]] version = "0.3.57" criteria = "safe-to-deploy" @@ -641,6 +632,14 @@ criteria = "safe-to-deploy" version = "0.4.0" criteria = "safe-to-deploy" +[[exemptions.zerocopy]] +version = "0.7.32" +criteria = "safe-to-deploy" + +[[exemptions.zerocopy-derive]] +version = "0.7.32" +criteria = "safe-to-deploy" + [[exemptions.zstd]] version = "0.11.1+zstd.1.5.2" criteria = "safe-to-deploy" @@ -650,5 +649,5 @@ version = "5.0.1+zstd.1.5.2" criteria = "safe-to-deploy" [[exemptions.zstd-sys]] -version = "2.0.1+zstd.1.5.2" +version = "2.0.9+zstd.1.5.5" criteria = "safe-to-deploy" diff --git a/supply-chain/imports.lock b/supply-chain/imports.lock index 1761b70bec2b..d1e9fe4ef1d4 100644 --- a/supply-chain/imports.lock +++ b/supply-chain/imports.lock @@ -2,400 +2,392 @@ # cargo-vet imports lock [[unpublished.cranelift]] -version = "0.102.0" -audited_as = "0.101.2" +version = "0.105.0" +audited_as = "0.104.0" [[unpublished.cranelift]] -version = "0.103.0" -audited_as = "0.101.4" +version = "0.106.0" +audited_as = "0.104.0" [[unpublished.cranelift-bforest]] -version = "0.102.0" -audited_as = "0.101.2" +version = "0.105.0" +audited_as = "0.104.0" [[unpublished.cranelift-bforest]] -version = "0.103.0" -audited_as = "0.101.4" +version = "0.106.0" +audited_as = "0.104.0" [[unpublished.cranelift-codegen]] -version = "0.102.0" -audited_as = "0.101.2" +version = "0.105.0" +audited_as = "0.104.0" [[unpublished.cranelift-codegen]] -version = "0.103.0" -audited_as = "0.101.4" +version = "0.106.0" +audited_as = "0.104.0" [[unpublished.cranelift-codegen-meta]] -version = "0.102.0" -audited_as = "0.101.2" +version = "0.105.0" +audited_as = "0.104.0" [[unpublished.cranelift-codegen-meta]] -version = "0.103.0" -audited_as = "0.101.4" +version = "0.106.0" +audited_as = "0.104.0" [[unpublished.cranelift-codegen-shared]] -version = "0.102.0" -audited_as = "0.101.2" +version = "0.105.0" +audited_as = "0.104.0" [[unpublished.cranelift-codegen-shared]] -version = "0.103.0" -audited_as = "0.101.4" +version = "0.106.0" +audited_as = "0.104.0" [[unpublished.cranelift-control]] -version = "0.102.0" -audited_as = "0.101.2" +version = "0.105.0" +audited_as = "0.104.0" [[unpublished.cranelift-control]] -version = "0.103.0" -audited_as = "0.101.4" +version = "0.106.0" +audited_as = "0.104.0" [[unpublished.cranelift-entity]] -version = "0.102.0" -audited_as = "0.101.2" +version = "0.105.0" +audited_as = "0.104.0" [[unpublished.cranelift-entity]] -version = "0.103.0" -audited_as = "0.101.4" +version = "0.106.0" +audited_as = "0.104.0" [[unpublished.cranelift-frontend]] -version = "0.102.0" -audited_as = "0.101.2" +version = "0.105.0" +audited_as = "0.104.0" [[unpublished.cranelift-frontend]] -version = "0.103.0" -audited_as = "0.101.4" +version = "0.106.0" +audited_as = "0.104.0" [[unpublished.cranelift-interpreter]] -version = "0.102.0" -audited_as = "0.101.2" +version = "0.105.0" +audited_as = "0.104.0" [[unpublished.cranelift-interpreter]] -version = "0.103.0" -audited_as = "0.101.4" +version = "0.106.0" +audited_as = "0.104.0" [[unpublished.cranelift-isle]] -version = "0.102.0" -audited_as = "0.101.2" +version = "0.105.0" +audited_as = "0.104.0" [[unpublished.cranelift-isle]] -version = "0.103.0" -audited_as = "0.101.4" +version = "0.106.0" +audited_as = "0.104.0" [[unpublished.cranelift-jit]] -version = "0.102.0" -audited_as = "0.101.2" +version = "0.105.0" +audited_as = "0.104.0" [[unpublished.cranelift-jit]] -version = "0.103.0" -audited_as = "0.101.4" +version = "0.106.0" +audited_as = "0.104.0" [[unpublished.cranelift-module]] -version = "0.102.0" -audited_as = "0.101.2" +version = "0.105.0" +audited_as = "0.104.0" [[unpublished.cranelift-module]] -version = "0.103.0" -audited_as = "0.101.4" +version = "0.106.0" +audited_as = "0.104.0" [[unpublished.cranelift-native]] -version = "0.102.0" -audited_as = "0.101.2" +version = "0.105.0" +audited_as = "0.104.0" [[unpublished.cranelift-native]] -version = "0.103.0" -audited_as = "0.101.4" +version = "0.106.0" +audited_as = "0.104.0" [[unpublished.cranelift-object]] -version = "0.102.0" -audited_as = "0.101.2" +version = "0.105.0" +audited_as = "0.104.0" [[unpublished.cranelift-object]] -version = "0.103.0" -audited_as = "0.101.4" +version = "0.106.0" +audited_as = "0.104.0" [[unpublished.cranelift-reader]] -version = "0.102.0" -audited_as = "0.101.2" +version = "0.105.0" +audited_as = "0.104.0" [[unpublished.cranelift-reader]] -version = "0.103.0" -audited_as = "0.101.4" +version = "0.106.0" +audited_as = "0.104.0" [[unpublished.cranelift-serde]] -version = "0.102.0" -audited_as = "0.101.2" +version = "0.105.0" +audited_as = "0.104.0" [[unpublished.cranelift-serde]] -version = "0.103.0" -audited_as = "0.101.4" +version = "0.106.0" +audited_as = "0.104.0" [[unpublished.cranelift-wasm]] -version = "0.102.0" -audited_as = "0.101.2" +version = "0.105.0" +audited_as = "0.104.0" [[unpublished.cranelift-wasm]] -version = "0.103.0" -audited_as = "0.101.4" +version = "0.106.0" +audited_as = "0.104.0" [[unpublished.wasi-cap-std-sync]] -version = "15.0.0" -audited_as = "14.0.2" +version = "18.0.0" +audited_as = "17.0.0" [[unpublished.wasi-cap-std-sync]] -version = "16.0.0" -audited_as = "14.0.4" +version = "19.0.0" +audited_as = "17.0.0" [[unpublished.wasi-common]] -version = "15.0.0" -audited_as = "14.0.2" +version = "18.0.0" +audited_as = "17.0.0" [[unpublished.wasi-common]] -version = "16.0.0" -audited_as = "14.0.4" +version = "19.0.0" +audited_as = "17.0.0" [[unpublished.wasi-tokio]] -version = "15.0.0" -audited_as = "14.0.2" +version = "18.0.0" +audited_as = "17.0.0" [[unpublished.wasi-tokio]] -version = "16.0.0" -audited_as = "14.0.4" +version = "19.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime]] -version = "15.0.0" -audited_as = "14.0.2" +version = "18.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime]] -version = "16.0.0" -audited_as = "14.0.4" +version = "19.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-asm-macros]] -version = "15.0.0" -audited_as = "14.0.2" +version = "18.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-asm-macros]] -version = "16.0.0" -audited_as = "14.0.4" +version = "19.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-cache]] -version = "15.0.0" -audited_as = "14.0.2" +version = "18.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-cache]] -version = "16.0.0" -audited_as = "14.0.4" +version = "19.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-cli]] -version = "15.0.0" -audited_as = "14.0.2" +version = "18.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-cli]] -version = "16.0.0" -audited_as = "14.0.4" +version = "19.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-cli-flags]] -version = "15.0.0" -audited_as = "14.0.2" +version = "18.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-cli-flags]] -version = "16.0.0" -audited_as = "14.0.4" +version = "19.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-component-macro]] -version = "15.0.0" -audited_as = "14.0.2" +version = "18.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-component-macro]] -version = "16.0.0" -audited_as = "14.0.4" +version = "19.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-component-util]] -version = "15.0.0" -audited_as = "14.0.2" +version = "18.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-component-util]] -version = "16.0.0" -audited_as = "14.0.4" +version = "19.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-cranelift]] -version = "15.0.0" -audited_as = "14.0.2" +version = "18.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-cranelift]] -version = "16.0.0" -audited_as = "14.0.4" +version = "19.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-cranelift-shared]] -version = "15.0.0" -audited_as = "14.0.2" +version = "18.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-cranelift-shared]] -version = "16.0.0" -audited_as = "14.0.4" +version = "19.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-environ]] -version = "15.0.0" -audited_as = "14.0.2" +version = "18.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-environ]] -version = "16.0.0" -audited_as = "14.0.4" +version = "19.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-explorer]] -version = "15.0.0" -audited_as = "14.0.2" +version = "18.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-explorer]] -version = "16.0.0" -audited_as = "14.0.4" +version = "19.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-fiber]] -version = "15.0.0" -audited_as = "14.0.2" +version = "18.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-fiber]] -version = "16.0.0" -audited_as = "14.0.4" - -[[unpublished.wasmtime-jit]] -version = "15.0.0" -audited_as = "14.0.2" - -[[unpublished.wasmtime-jit]] -version = "16.0.0" -audited_as = "14.0.4" +version = "19.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-jit-debug]] -version = "15.0.0" -audited_as = "14.0.2" +version = "18.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-jit-debug]] -version = "16.0.0" -audited_as = "14.0.4" +version = "19.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-jit-icache-coherence]] -version = "15.0.0" -audited_as = "14.0.2" +version = "18.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-jit-icache-coherence]] -version = "16.0.0" -audited_as = "14.0.4" +version = "19.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-runtime]] -version = "15.0.0" -audited_as = "14.0.2" +version = "18.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-runtime]] -version = "16.0.0" -audited_as = "14.0.4" +version = "19.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-types]] -version = "15.0.0" -audited_as = "14.0.2" +version = "18.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-types]] -version = "16.0.0" -audited_as = "14.0.4" +version = "19.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-wasi]] -version = "15.0.0" -audited_as = "14.0.2" +version = "18.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-wasi]] -version = "16.0.0" -audited_as = "14.0.4" +version = "19.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-wasi-http]] -version = "15.0.0" -audited_as = "14.0.2" +version = "18.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-wasi-http]] -version = "16.0.0" -audited_as = "14.0.4" +version = "19.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-wasi-nn]] -version = "15.0.0" -audited_as = "14.0.2" +version = "18.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-wasi-nn]] -version = "16.0.0" -audited_as = "14.0.4" +version = "19.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-wasi-threads]] -version = "15.0.0" -audited_as = "14.0.2" +version = "18.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-wasi-threads]] -version = "16.0.0" -audited_as = "14.0.4" +version = "19.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-wast]] -version = "15.0.0" -audited_as = "14.0.2" +version = "18.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-wast]] -version = "16.0.0" -audited_as = "14.0.4" +version = "19.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-winch]] -version = "15.0.0" -audited_as = "14.0.2" +version = "18.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-winch]] -version = "16.0.0" -audited_as = "14.0.4" +version = "19.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-wit-bindgen]] -version = "15.0.0" -audited_as = "14.0.2" +version = "18.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-wit-bindgen]] -version = "16.0.0" -audited_as = "14.0.4" +version = "19.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-wmemcheck]] -version = "15.0.0" -audited_as = "14.0.2" +version = "18.0.0" +audited_as = "17.0.0" [[unpublished.wasmtime-wmemcheck]] -version = "16.0.0" -audited_as = "14.0.4" +version = "19.0.0" +audited_as = "17.0.0" [[unpublished.wiggle]] -version = "15.0.0" -audited_as = "14.0.2" +version = "18.0.0" +audited_as = "17.0.0" [[unpublished.wiggle]] -version = "16.0.0" -audited_as = "14.0.4" +version = "19.0.0" +audited_as = "17.0.0" [[unpublished.wiggle-generate]] -version = "15.0.0" -audited_as = "14.0.2" +version = "18.0.0" +audited_as = "17.0.0" [[unpublished.wiggle-generate]] -version = "16.0.0" -audited_as = "14.0.4" +version = "19.0.0" +audited_as = "17.0.0" [[unpublished.wiggle-macro]] -version = "15.0.0" -audited_as = "14.0.2" +version = "18.0.0" +audited_as = "17.0.0" [[unpublished.wiggle-macro]] -version = "16.0.0" -audited_as = "14.0.4" +version = "19.0.0" +audited_as = "17.0.0" [[unpublished.wiggle-test]] version = "0.0.0" audited_as = "0.1.0" [[unpublished.winch-codegen]] -version = "0.13.0" -audited_as = "0.12.2" +version = "0.16.0" +audited_as = "0.15.0" [[unpublished.winch-codegen]] -version = "0.14.0" -audited_as = "0.12.4" +version = "0.17.0" +audited_as = "0.15.0" [[publisher.aho-corasick]] version = "1.0.2" @@ -475,8 +467,8 @@ user-login = "BurntSushi" user-name = "Andrew Gallant" [[publisher.bumpalo]] -version = "3.12.0" -when = "2023-01-17" +version = "3.14.0" +when = "2023-09-14" user-id = 696 user-login = "fitzgen" user-name = "Nick Fitzgerald" @@ -489,50 +481,85 @@ user-login = "BurntSushi" user-name = "Andrew Gallant" [[publisher.cap-fs-ext]] -version = "2.0.0" -when = "2023-06-30" +version = "2.0.1" +when = "2024-01-02" +user-id = 6825 +user-login = "sunfishcode" +user-name = "Dan Gohman" + +[[publisher.cap-fs-ext]] +version = "3.0.0" +when = "2024-01-11" user-id = 6825 user-login = "sunfishcode" user-name = "Dan Gohman" [[publisher.cap-net-ext]] -version = "2.0.0" -when = "2023-06-30" +version = "2.0.1" +when = "2024-01-02" +user-id = 6825 +user-login = "sunfishcode" +user-name = "Dan Gohman" + +[[publisher.cap-net-ext]] +version = "3.0.0" +when = "2024-01-11" user-id = 6825 user-login = "sunfishcode" user-name = "Dan Gohman" [[publisher.cap-primitives]] -version = "2.0.0" -when = "2023-06-30" +version = "2.0.1" +when = "2024-01-02" +user-id = 6825 +user-login = "sunfishcode" +user-name = "Dan Gohman" + +[[publisher.cap-primitives]] +version = "3.0.0" +when = "2024-01-11" user-id = 6825 user-login = "sunfishcode" user-name = "Dan Gohman" [[publisher.cap-rand]] -version = "2.0.0" -when = "2023-06-30" +version = "2.0.1" +when = "2024-01-02" +user-id = 6825 +user-login = "sunfishcode" +user-name = "Dan Gohman" + +[[publisher.cap-rand]] +version = "3.0.0" +when = "2024-01-11" user-id = 6825 user-login = "sunfishcode" user-name = "Dan Gohman" [[publisher.cap-std]] -version = "2.0.0" -when = "2023-06-30" +version = "2.0.1" +when = "2024-01-02" user-id = 6825 user-login = "sunfishcode" user-name = "Dan Gohman" -[[publisher.cap-tempfile]] -version = "2.0.0" -when = "2023-06-30" +[[publisher.cap-std]] +version = "3.0.0" +when = "2024-01-11" user-id = 6825 user-login = "sunfishcode" user-name = "Dan Gohman" [[publisher.cap-time-ext]] -version = "2.0.0" -when = "2023-06-30" +version = "2.0.1" +when = "2024-01-02" +user-id = 6825 +user-login = "sunfishcode" +user-name = "Dan Gohman" + +[[publisher.cap-time-ext]] +version = "3.0.0" +when = "2024-01-11" user-id = 6825 user-login = "sunfishcode" user-name = "Dan Gohman" @@ -565,207 +592,112 @@ user-id = 6743 user-login = "epage" user-name = "Ed Page" -[[publisher.cranelift]] -version = "0.101.2" -when = "2023-10-26" -user-id = 73222 -user-login = "wasmtime-publish" +[[publisher.core-foundation-sys]] +version = "0.8.4" +when = "2023-04-03" +user-id = 5946 +user-login = "jrmuizel" +user-name = "Jeff Muizelaar" [[publisher.cranelift]] -version = "0.101.4" -when = "2023-11-01" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.cranelift-bforest]] -version = "0.101.2" -when = "2023-10-26" +version = "0.104.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.cranelift-bforest]] -version = "0.101.4" -when = "2023-11-01" +version = "0.104.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.cranelift-codegen]] -version = "0.101.2" -when = "2023-10-26" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.cranelift-codegen]] -version = "0.101.4" -when = "2023-11-01" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.cranelift-codegen-meta]] -version = "0.101.2" -when = "2023-10-26" +version = "0.104.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.cranelift-codegen-meta]] -version = "0.101.4" -when = "2023-11-01" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.cranelift-codegen-shared]] -version = "0.101.2" -when = "2023-10-26" +version = "0.104.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.cranelift-codegen-shared]] -version = "0.101.4" -when = "2023-11-01" +version = "0.104.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.cranelift-control]] -version = "0.101.2" -when = "2023-10-26" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.cranelift-control]] -version = "0.101.4" -when = "2023-11-01" +version = "0.104.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.cranelift-entity]] -version = "0.101.2" -when = "2023-10-26" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.cranelift-entity]] -version = "0.101.4" -when = "2023-11-01" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.cranelift-frontend]] -version = "0.101.2" -when = "2023-10-26" +version = "0.104.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.cranelift-frontend]] -version = "0.101.4" -when = "2023-11-01" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.cranelift-interpreter]] -version = "0.101.2" -when = "2023-10-26" +version = "0.104.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.cranelift-interpreter]] -version = "0.101.4" -when = "2023-11-01" +version = "0.104.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.cranelift-isle]] -version = "0.101.2" -when = "2023-10-26" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.cranelift-isle]] -version = "0.101.4" -when = "2023-11-01" +version = "0.104.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.cranelift-jit]] -version = "0.101.2" -when = "2023-10-26" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.cranelift-jit]] -version = "0.101.4" -when = "2023-11-01" +version = "0.104.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.cranelift-module]] -version = "0.101.2" -when = "2023-10-26" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.cranelift-module]] -version = "0.101.4" -when = "2023-11-01" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.cranelift-native]] -version = "0.101.2" -when = "2023-10-26" +version = "0.104.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.cranelift-native]] -version = "0.101.4" -when = "2023-11-01" +version = "0.104.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.cranelift-object]] -version = "0.101.2" -when = "2023-10-26" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.cranelift-object]] -version = "0.101.4" -when = "2023-11-01" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.cranelift-reader]] -version = "0.101.2" -when = "2023-10-26" +version = "0.104.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.cranelift-reader]] -version = "0.101.4" -when = "2023-11-01" +version = "0.104.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.cranelift-serde]] -version = "0.101.2" -when = "2023-10-26" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.cranelift-serde]] -version = "0.101.4" -when = "2023-11-01" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.cranelift-wasm]] -version = "0.101.2" -when = "2023-10-26" +version = "0.104.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.cranelift-wasm]] -version = "0.101.4" -when = "2023-11-01" +version = "0.104.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" @@ -784,15 +716,15 @@ user-login = "cuviper" user-name = "Josh Stone" [[publisher.errno]] -version = "0.3.6" -when = "2023-11-07" +version = "0.3.8" +when = "2023-11-28" user-id = 6825 user-login = "sunfishcode" user-name = "Dan Gohman" [[publisher.fd-lock]] -version = "4.0.0" -when = "2023-06-30" +version = "4.0.2" +when = "2023-12-29" user-id = 6825 user-login = "sunfishcode" user-name = "Dan Gohman" @@ -805,8 +737,8 @@ user-login = "sunfishcode" user-name = "Dan Gohman" [[publisher.fs-set-times]] -version = "0.20.0" -when = "2023-06-29" +version = "0.20.1" +when = "2023-12-01" user-id = 6825 user-login = "sunfishcode" user-name = "Dan Gohman" @@ -833,8 +765,8 @@ user-login = "cuviper" user-name = "Josh Stone" [[publisher.io-extras]] -version = "0.18.0" -when = "2023-06-11" +version = "0.18.1" +when = "2023-12-01" user-id = 6825 user-login = "sunfishcode" user-name = "Dan Gohman" @@ -846,9 +778,16 @@ user-id = 6825 user-login = "sunfishcode" user-name = "Dan Gohman" +[[publisher.io-lifetimes]] +version = "2.0.3" +when = "2023-12-01" +user-id = 6825 +user-login = "sunfishcode" +user-name = "Dan Gohman" + [[publisher.is-terminal]] -version = "0.4.9" -when = "2023-07-06" +version = "0.4.10" +when = "2023-12-28" user-id = 6825 user-login = "sunfishcode" user-name = "Dan Gohman" @@ -875,8 +814,8 @@ user-login = "Amanieu" user-name = "Amanieu d'Antras" [[publisher.linux-raw-sys]] -version = "0.4.10" -when = "2023-10-09" +version = "0.4.12" +when = "2023-11-30" user-id = 6825 user-login = "sunfishcode" user-name = "Dan Gohman" @@ -945,8 +884,15 @@ user-login = "BurntSushi" user-name = "Andrew Gallant" [[publisher.rustix]] -version = "0.38.21" -when = "2023-10-26" +version = "0.38.28" +when = "2023-12-09" +user-id = 6825 +user-login = "sunfishcode" +user-name = "Dan Gohman" + +[[publisher.rustix]] +version = "0.38.31" +when = "2024-02-01" user-id = 6825 user-login = "sunfishcode" user-name = "Dan Gohman" @@ -993,6 +939,13 @@ user-id = 3618 user-login = "dtolnay" user-name = "David Tolnay" +[[publisher.serde_spanned]] +version = "0.6.5" +when = "2023-12-19" +user-id = 6743 +user-login = "epage" +user-name = "Ed Page" + [[publisher.spdx]] version = "0.10.1" when = "2023-04-06" @@ -1007,22 +960,22 @@ user-login = "dtolnay" user-name = "David Tolnay" [[publisher.syn]] -version = "2.0.29" -when = "2023-08-17" +version = "2.0.32" +when = "2023-09-10" user-id = 3618 user-login = "dtolnay" user-name = "David Tolnay" [[publisher.system-interface]] -version = "0.26.0" -when = "2023-06-30" +version = "0.26.1" +when = "2024-01-02" user-id = 6825 user-login = "sunfishcode" user-name = "Dan Gohman" -[[publisher.target-lexicon]] -version = "0.12.3" -when = "2022-02-01" +[[publisher.system-interface]] +version = "0.27.1" +when = "2024-02-13" user-id = 6825 user-login = "sunfishcode" user-name = "Dan Gohman" @@ -1034,6 +987,13 @@ user-id = 6825 user-login = "sunfishcode" user-name = "Dan Gohman" +[[publisher.target-lexicon]] +version = "0.12.13" +when = "2024-01-02" +user-id = 6825 +user-login = "sunfishcode" +user-name = "Dan Gohman" + [[publisher.termcolor]] version = "1.1.3" when = "2022-03-02" @@ -1056,11 +1016,25 @@ user-login = "dtolnay" user-name = "David Tolnay" [[publisher.toml]] -version = "0.5.7" -when = "2020-10-11" -user-id = 1 -user-login = "alexcrichton" -user-name = "Alex Crichton" +version = "0.8.10" +when = "2024-02-05" +user-id = 6743 +user-login = "epage" +user-name = "Ed Page" + +[[publisher.toml_datetime]] +version = "0.6.5" +when = "2023-10-23" +user-id = 6743 +user-login = "epage" +user-name = "Ed Page" + +[[publisher.toml_edit]] +version = "0.22.4" +when = "2024-02-06" +user-id = 6743 +user-login = "epage" +user-name = "Ed Page" [[publisher.unicode-segmentation]] version = "1.10.1" @@ -1090,39 +1064,9 @@ user-id = 189 user-login = "BurntSushi" user-name = "Andrew Gallant" -[[publisher.wasi-cap-std-sync]] -version = "14.0.2" -when = "2023-10-26" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.wasi-cap-std-sync]] -version = "14.0.4" -when = "2023-11-01" -user-id = 73222 -user-login = "wasmtime-publish" - [[publisher.wasi-common]] -version = "14.0.2" -when = "2023-10-26" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.wasi-common]] -version = "14.0.4" -when = "2023-11-01" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.wasi-tokio]] -version = "14.0.2" -when = "2023-10-26" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.wasi-tokio]] -version = "14.0.4" -when = "2023-11-01" +version = "17.0.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" @@ -1162,506 +1106,290 @@ user-login = "alexcrichton" user-name = "Alex Crichton" [[publisher.wasm-encoder]] -version = "0.35.0" -when = "2023-10-14" +version = "0.38.1" +when = "2023-11-29" user-id = 1 user-login = "alexcrichton" user-name = "Alex Crichton" [[publisher.wasm-encoder]] -version = "0.36.1" -when = "2023-10-30" +version = "0.41.0" +when = "2024-01-29" user-id = 1 user-login = "alexcrichton" user-name = "Alex Crichton" [[publisher.wasm-encoder]] -version = "0.36.2" -when = "2023-11-06" +version = "0.41.2" +when = "2024-02-12" user-id = 1 user-login = "alexcrichton" user-name = "Alex Crichton" [[publisher.wasm-metadata]] -version = "0.10.9" -when = "2023-10-14" +version = "0.10.17" +when = "2024-01-29" user-id = 1 user-login = "alexcrichton" user-name = "Alex Crichton" [[publisher.wasm-metadata]] -version = "0.10.10" -when = "2023-10-30" -user-id = 1 -user-login = "alexcrichton" -user-name = "Alex Crichton" - -[[publisher.wasm-metadata]] -version = "0.10.11" -when = "2023-11-06" +version = "0.10.20" +when = "2024-02-12" user-id = 1 user-login = "alexcrichton" user-name = "Alex Crichton" [[publisher.wasm-mutate]] -version = "0.2.38" -when = "2023-10-14" +version = "0.2.46" +when = "2024-01-29" user-id = 1 user-login = "alexcrichton" user-name = "Alex Crichton" [[publisher.wasm-mutate]] -version = "0.2.39" -when = "2023-10-30" -user-id = 1 -user-login = "alexcrichton" -user-name = "Alex Crichton" - -[[publisher.wasm-mutate]] -version = "0.2.40" -when = "2023-11-06" +version = "0.2.48" +when = "2024-02-12" user-id = 1 user-login = "alexcrichton" user-name = "Alex Crichton" [[publisher.wasm-smith]] -version = "0.12.21" -when = "2023-10-14" +version = "0.15.1" +when = "2024-01-29" user-id = 1 user-login = "alexcrichton" user-name = "Alex Crichton" [[publisher.wasm-smith]] -version = "0.12.22" -when = "2023-10-30" -user-id = 1 -user-login = "alexcrichton" -user-name = "Alex Crichton" - -[[publisher.wasm-smith]] -version = "0.12.23" -when = "2023-11-06" +version = "0.16.1" +when = "2024-02-12" user-id = 1 user-login = "alexcrichton" user-name = "Alex Crichton" [[publisher.wasmparser]] -version = "0.115.0" -when = "2023-10-14" +version = "0.118.1" +when = "2023-11-29" user-id = 1 user-login = "alexcrichton" user-name = "Alex Crichton" [[publisher.wasmparser]] -version = "0.116.0" -when = "2023-10-30" +version = "0.121.0" +when = "2024-01-29" user-id = 1 user-login = "alexcrichton" user-name = "Alex Crichton" [[publisher.wasmparser]] -version = "0.116.1" -when = "2023-11-06" +version = "0.121.2" +when = "2024-02-12" user-id = 1 user-login = "alexcrichton" user-name = "Alex Crichton" [[publisher.wasmprinter]] -version = "0.2.70" -when = "2023-10-14" +version = "0.2.78" +when = "2024-01-29" user-id = 1 user-login = "alexcrichton" user-name = "Alex Crichton" [[publisher.wasmprinter]] -version = "0.2.71" -when = "2023-10-30" -user-id = 1 -user-login = "alexcrichton" -user-name = "Alex Crichton" - -[[publisher.wasmprinter]] -version = "0.2.72" -when = "2023-11-06" +version = "0.2.80" +when = "2024-02-12" user-id = 1 user-login = "alexcrichton" user-name = "Alex Crichton" [[publisher.wasmtime]] -version = "14.0.2" -when = "2023-10-26" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.wasmtime]] -version = "14.0.4" -when = "2023-11-01" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.wasmtime-asm-macros]] -version = "14.0.2" -when = "2023-10-26" +version = "17.0.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wasmtime-asm-macros]] -version = "14.0.4" -when = "2023-11-01" +version = "17.0.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wasmtime-cache]] -version = "14.0.2" -when = "2023-10-26" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.wasmtime-cache]] -version = "14.0.4" -when = "2023-11-01" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.wasmtime-cli]] -version = "14.0.2" -when = "2023-10-26" +version = "17.0.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wasmtime-cli]] -version = "14.0.4" -when = "2023-11-01" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.wasmtime-cli-flags]] -version = "14.0.2" -when = "2023-10-26" +version = "17.0.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wasmtime-cli-flags]] -version = "14.0.4" -when = "2023-11-01" +version = "17.0.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wasmtime-component-macro]] -version = "14.0.2" -when = "2023-10-26" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.wasmtime-component-macro]] -version = "14.0.4" -when = "2023-11-01" +version = "17.0.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wasmtime-component-util]] -version = "14.0.2" -when = "2023-10-26" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.wasmtime-component-util]] -version = "14.0.4" -when = "2023-11-01" +version = "17.0.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wasmtime-cranelift]] -version = "14.0.2" -when = "2023-10-26" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.wasmtime-cranelift]] -version = "14.0.4" -when = "2023-11-01" +version = "17.0.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wasmtime-cranelift-shared]] -version = "14.0.2" -when = "2023-10-26" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.wasmtime-cranelift-shared]] -version = "14.0.4" -when = "2023-11-01" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.wasmtime-environ]] -version = "14.0.2" -when = "2023-10-26" +version = "17.0.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wasmtime-environ]] -version = "14.0.4" -when = "2023-11-01" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.wasmtime-explorer]] -version = "14.0.2" -when = "2023-10-26" +version = "17.0.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wasmtime-explorer]] -version = "14.0.4" -when = "2023-11-01" +version = "17.0.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wasmtime-fiber]] -version = "14.0.2" -when = "2023-10-26" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.wasmtime-fiber]] -version = "14.0.4" -when = "2023-11-01" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.wasmtime-jit]] -version = "14.0.2" -when = "2023-10-26" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.wasmtime-jit]] -version = "14.0.4" -when = "2023-11-01" +version = "17.0.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wasmtime-jit-debug]] -version = "14.0.2" -when = "2023-10-26" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.wasmtime-jit-debug]] -version = "14.0.4" -when = "2023-11-01" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.wasmtime-jit-icache-coherence]] -version = "14.0.2" -when = "2023-10-26" +version = "17.0.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wasmtime-jit-icache-coherence]] -version = "14.0.4" -when = "2023-11-01" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.wasmtime-runtime]] -version = "14.0.2" -when = "2023-10-26" +version = "17.0.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wasmtime-runtime]] -version = "14.0.4" -when = "2023-11-01" +version = "17.0.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wasmtime-types]] -version = "14.0.2" -when = "2023-10-26" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.wasmtime-types]] -version = "14.0.4" -when = "2023-11-01" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.wasmtime-wasi]] -version = "14.0.2" -when = "2023-10-26" +version = "17.0.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wasmtime-wasi]] -version = "14.0.4" -when = "2023-11-01" +version = "17.0.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wasmtime-wasi-http]] -version = "14.0.2" -when = "2023-10-26" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.wasmtime-wasi-http]] -version = "14.0.4" -when = "2023-11-01" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.wasmtime-wasi-nn]] -version = "14.0.2" -when = "2023-10-26" +version = "17.0.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wasmtime-wasi-nn]] -version = "14.0.4" -when = "2023-11-01" +version = "17.0.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wasmtime-wasi-threads]] -version = "14.0.2" -when = "2023-10-26" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.wasmtime-wasi-threads]] -version = "14.0.4" -when = "2023-11-01" +version = "17.0.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wasmtime-wast]] -version = "14.0.2" -when = "2023-10-26" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.wasmtime-wast]] -version = "14.0.4" -when = "2023-11-01" +version = "17.0.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wasmtime-winch]] -version = "14.0.2" -when = "2023-10-26" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.wasmtime-winch]] -version = "14.0.4" -when = "2023-11-01" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.wasmtime-wit-bindgen]] -version = "14.0.2" -when = "2023-10-26" +version = "17.0.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wasmtime-wit-bindgen]] -version = "14.0.4" -when = "2023-11-01" +version = "17.0.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wasmtime-wmemcheck]] -version = "14.0.2" -when = "2023-10-26" +version = "17.0.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" -[[publisher.wasmtime-wmemcheck]] -version = "14.0.4" -when = "2023-11-01" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.wast]] -version = "66.0.2" -when = "2023-10-14" -user-id = 1 -user-login = "alexcrichton" -user-name = "Alex Crichton" - [[publisher.wast]] -version = "67.0.0" -when = "2023-10-30" +version = "70.0.2" +when = "2024-01-29" user-id = 1 user-login = "alexcrichton" user-name = "Alex Crichton" [[publisher.wast]] -version = "67.0.1" -when = "2023-11-06" +version = "71.0.1" +when = "2024-02-12" user-id = 1 user-login = "alexcrichton" user-name = "Alex Crichton" [[publisher.wat]] -version = "1.0.77" -when = "2023-10-14" +version = "1.0.85" +when = "2024-01-29" user-id = 1 user-login = "alexcrichton" user-name = "Alex Crichton" [[publisher.wat]] -version = "1.0.78" -when = "2023-10-30" -user-id = 1 -user-login = "alexcrichton" -user-name = "Alex Crichton" - -[[publisher.wat]] -version = "1.0.79" -when = "2023-11-06" +version = "1.0.88" +when = "2024-02-12" user-id = 1 user-login = "alexcrichton" user-name = "Alex Crichton" [[publisher.wiggle]] -version = "14.0.2" -when = "2023-10-26" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.wiggle]] -version = "14.0.4" -when = "2023-11-01" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.wiggle-generate]] -version = "14.0.2" -when = "2023-10-26" +version = "17.0.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wiggle-generate]] -version = "14.0.4" -when = "2023-11-01" -user-id = 73222 -user-login = "wasmtime-publish" - -[[publisher.wiggle-macro]] -version = "14.0.2" -when = "2023-10-26" +version = "17.0.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" [[publisher.wiggle-macro]] -version = "14.0.4" -when = "2023-11-01" +version = "17.0.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" @@ -1680,16 +1408,24 @@ user-login = "BurntSushi" user-name = "Andrew Gallant" [[publisher.winch-codegen]] -version = "0.12.2" -when = "2023-10-26" +version = "0.15.0" +when = "2024-01-25" user-id = 73222 user-login = "wasmtime-publish" -[[publisher.winch-codegen]] -version = "0.12.4" -when = "2023-11-01" -user-id = 73222 -user-login = "wasmtime-publish" +[[publisher.windows-core]] +version = "0.51.1" +when = "2023-08-17" +user-id = 64539 +user-login = "kennykerr" +user-name = "Kenny Kerr" + +[[publisher.windows-core]] +version = "0.52.0" +when = "2023-11-15" +user-id = 64539 +user-login = "kennykerr" +user-name = "Kenny Kerr" [[publisher.windows-sys]] version = "0.48.0" @@ -1698,6 +1434,13 @@ user-id = 64539 user-login = "kennykerr" user-name = "Kenny Kerr" +[[publisher.windows-sys]] +version = "0.52.0" +when = "2023-11-15" +user-id = 64539 +user-login = "kennykerr" +user-name = "Kenny Kerr" + [[publisher.windows-targets]] version = "0.48.0" when = "2023-03-31" @@ -1705,6 +1448,20 @@ user-id = 64539 user-login = "kennykerr" user-name = "Kenny Kerr" +[[publisher.windows-targets]] +version = "0.48.5" +when = "2023-08-18" +user-id = 64539 +user-login = "kennykerr" +user-name = "Kenny Kerr" + +[[publisher.windows-targets]] +version = "0.52.0" +when = "2023-11-15" +user-id = 64539 +user-login = "kennykerr" +user-name = "Kenny Kerr" + [[publisher.windows_aarch64_gnullvm]] version = "0.48.0" when = "2023-03-31" @@ -1712,6 +1469,20 @@ user-id = 64539 user-login = "kennykerr" user-name = "Kenny Kerr" +[[publisher.windows_aarch64_gnullvm]] +version = "0.48.5" +when = "2023-08-18" +user-id = 64539 +user-login = "kennykerr" +user-name = "Kenny Kerr" + +[[publisher.windows_aarch64_gnullvm]] +version = "0.52.0" +when = "2023-11-15" +user-id = 64539 +user-login = "kennykerr" +user-name = "Kenny Kerr" + [[publisher.windows_aarch64_msvc]] version = "0.48.0" when = "2023-03-31" @@ -1719,6 +1490,20 @@ user-id = 64539 user-login = "kennykerr" user-name = "Kenny Kerr" +[[publisher.windows_aarch64_msvc]] +version = "0.48.5" +when = "2023-08-18" +user-id = 64539 +user-login = "kennykerr" +user-name = "Kenny Kerr" + +[[publisher.windows_aarch64_msvc]] +version = "0.52.0" +when = "2023-11-15" +user-id = 64539 +user-login = "kennykerr" +user-name = "Kenny Kerr" + [[publisher.windows_i686_gnu]] version = "0.48.0" when = "2023-03-31" @@ -1726,6 +1511,20 @@ user-id = 64539 user-login = "kennykerr" user-name = "Kenny Kerr" +[[publisher.windows_i686_gnu]] +version = "0.48.5" +when = "2023-08-18" +user-id = 64539 +user-login = "kennykerr" +user-name = "Kenny Kerr" + +[[publisher.windows_i686_gnu]] +version = "0.52.0" +when = "2023-11-15" +user-id = 64539 +user-login = "kennykerr" +user-name = "Kenny Kerr" + [[publisher.windows_i686_msvc]] version = "0.48.0" when = "2023-03-31" @@ -1733,6 +1532,20 @@ user-id = 64539 user-login = "kennykerr" user-name = "Kenny Kerr" +[[publisher.windows_i686_msvc]] +version = "0.48.5" +when = "2023-08-18" +user-id = 64539 +user-login = "kennykerr" +user-name = "Kenny Kerr" + +[[publisher.windows_i686_msvc]] +version = "0.52.0" +when = "2023-11-15" +user-id = 64539 +user-login = "kennykerr" +user-name = "Kenny Kerr" + [[publisher.windows_x86_64_gnu]] version = "0.48.0" when = "2023-03-31" @@ -1740,6 +1553,20 @@ user-id = 64539 user-login = "kennykerr" user-name = "Kenny Kerr" +[[publisher.windows_x86_64_gnu]] +version = "0.48.5" +when = "2023-08-18" +user-id = 64539 +user-login = "kennykerr" +user-name = "Kenny Kerr" + +[[publisher.windows_x86_64_gnu]] +version = "0.52.0" +when = "2023-11-15" +user-id = 64539 +user-login = "kennykerr" +user-name = "Kenny Kerr" + [[publisher.windows_x86_64_gnullvm]] version = "0.48.0" when = "2023-03-31" @@ -1747,6 +1574,20 @@ user-id = 64539 user-login = "kennykerr" user-name = "Kenny Kerr" +[[publisher.windows_x86_64_gnullvm]] +version = "0.48.5" +when = "2023-08-18" +user-id = 64539 +user-login = "kennykerr" +user-name = "Kenny Kerr" + +[[publisher.windows_x86_64_gnullvm]] +version = "0.52.0" +when = "2023-11-15" +user-id = 64539 +user-login = "kennykerr" +user-name = "Kenny Kerr" + [[publisher.windows_x86_64_msvc]] version = "0.48.0" when = "2023-03-31" @@ -1754,107 +1595,121 @@ user-id = 64539 user-login = "kennykerr" user-name = "Kenny Kerr" +[[publisher.windows_x86_64_msvc]] +version = "0.48.5" +when = "2023-08-18" +user-id = 64539 +user-login = "kennykerr" +user-name = "Kenny Kerr" + +[[publisher.windows_x86_64_msvc]] +version = "0.52.0" +when = "2023-11-15" +user-id = 64539 +user-login = "kennykerr" +user-name = "Kenny Kerr" + +[[publisher.winnow]] +version = "0.5.39" +when = "2024-02-06" +user-id = 6743 +user-login = "epage" +user-name = "Ed Page" + [[publisher.winx]] -version = "0.36.1" -when = "2023-06-29" +version = "0.36.3" +when = "2023-12-01" user-id = 6825 user-login = "sunfishcode" user-name = "Dan Gohman" [[publisher.wit-bindgen]] -version = "0.13.0" -when = "2023-10-18" +version = "0.15.0" +when = "2023-11-27" user-id = 1 user-login = "alexcrichton" user-name = "Alex Crichton" [[publisher.wit-bindgen]] -version = "0.13.1" -when = "2023-10-30" +version = "0.17.0" +when = "2024-02-05" user-id = 1 user-login = "alexcrichton" user-name = "Alex Crichton" [[publisher.wit-bindgen-core]] -version = "0.13.0" -when = "2023-10-18" +version = "0.15.0" +when = "2023-11-27" user-id = 1 user-login = "alexcrichton" user-name = "Alex Crichton" [[publisher.wit-bindgen-core]] -version = "0.13.1" -when = "2023-10-30" +version = "0.17.0" +when = "2024-02-05" user-id = 1 user-login = "alexcrichton" user-name = "Alex Crichton" [[publisher.wit-bindgen-rust]] -version = "0.13.0" -when = "2023-10-18" +version = "0.15.0" +when = "2023-11-27" user-id = 1 user-login = "alexcrichton" user-name = "Alex Crichton" [[publisher.wit-bindgen-rust]] -version = "0.13.2" -when = "2023-10-30" +version = "0.17.0" +when = "2024-02-05" user-id = 1 user-login = "alexcrichton" user-name = "Alex Crichton" [[publisher.wit-bindgen-rust-macro]] -version = "0.13.0" -when = "2023-10-18" +version = "0.15.0" +when = "2023-11-27" user-id = 1 user-login = "alexcrichton" user-name = "Alex Crichton" [[publisher.wit-bindgen-rust-macro]] -version = "0.13.1" -when = "2023-10-30" +version = "0.17.0" +when = "2024-02-05" user-id = 1 user-login = "alexcrichton" user-name = "Alex Crichton" [[publisher.wit-component]] -version = "0.16.0" -when = "2023-10-18" +version = "0.18.2" +when = "2023-11-20" user-id = 1 user-login = "alexcrichton" user-name = "Alex Crichton" [[publisher.wit-component]] -version = "0.17.0" -when = "2023-10-30" +version = "0.20.1" +when = "2024-01-29" user-id = 1 user-login = "alexcrichton" user-name = "Alex Crichton" [[publisher.wit-component]] -version = "0.18.0" -when = "2023-11-06" +version = "0.21.0" +when = "2024-02-12" user-id = 1 user-login = "alexcrichton" user-name = "Alex Crichton" [[publisher.wit-parser]] -version = "0.12.1" -when = "2023-10-18" -user-id = 1 -user-login = "alexcrichton" -user-name = "Alex Crichton" - -[[publisher.wit-parser]] -version = "0.12.2" -when = "2023-10-30" +version = "0.13.1" +when = "2024-01-09" user-id = 1 user-login = "alexcrichton" user-name = "Alex Crichton" [[publisher.wit-parser]] -version = "0.13.0" -when = "2023-11-06" +version = "0.14.0" +when = "2024-02-12" user-id = 1 user-login = "alexcrichton" user-name = "Alex Crichton" @@ -1867,6 +1722,18 @@ start = "2020-01-01" end = "2024-05-23" notes = "Maintained by Embark. No unsafe usage or ambient capabilities" +[[audits.embark-studios.audits.cargo_metadata]] +who = "Johan Andersson " +criteria = "safe-to-deploy" +delta = "0.15.3 -> 0.15.4" +notes = "No notable changes" + +[[audits.embark-studios.audits.cargo_metadata]] +who = "Johan Andersson " +criteria = "safe-to-deploy" +delta = "0.15.4 -> 0.17.0" +notes = "No notable changes" + [[audits.embark-studios.audits.colorchoice]] who = "Johan Andersson " criteria = "safe-to-deploy" @@ -1924,6 +1791,12 @@ criteria = "safe-to-run" version = "0.1.12" aggregated-from = "https://chromium.googlesource.com/chromiumos/third_party/rust_crates/+/main/cargo-vet/audits.toml?format=TEXT" +[[audits.google.audits.itertools]] +who = "ChromeOS" +criteria = "safe-to-run" +version = "0.10.5" +aggregated-from = "https://chromium.googlesource.com/chromiumos/third_party/rust_crates/+/main/cargo-vet/audits.toml?format=TEXT" + [[audits.google.audits.libfuzzer-sys]] who = "ChromeOS" criteria = "safe-to-run" @@ -1999,6 +1872,16 @@ who = "David Cook " criteria = "safe-to-deploy" version = "0.7.1" +[[audits.mozilla.wildcard-audits.core-foundation-sys]] +who = "Bobby Holley " +criteria = "safe-to-deploy" +user-id = 5946 # Jeff Muizelaar (jrmuizel) +start = "2020-10-14" +end = "2023-05-04" +renew = false +notes = "I've reviewed every source contribution that was neither authored nor reviewed by Mozilla." +aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml" + [[audits.mozilla.wildcard-audits.unicode-segmentation]] who = "Manish Goregaokar " criteria = "safe-to-deploy" @@ -2026,6 +1909,25 @@ end = "2024-05-03" notes = "All code written or reviewed by Manish" aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml" +[[audits.mozilla.audits.android_system_properties]] +who = "Nicolas Silva " +criteria = "safe-to-deploy" +version = "0.1.2" +notes = "I wrote this crate, reviewed by jimb. It is mostly a Rust port of some C++ code we already ship." +aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml" + +[[audits.mozilla.audits.android_system_properties]] +who = "Mike Hommey " +criteria = "safe-to-deploy" +delta = "0.1.2 -> 0.1.4" +aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml" + +[[audits.mozilla.audits.android_system_properties]] +who = "Mike Hommey " +criteria = "safe-to-deploy" +delta = "0.1.4 -> 0.1.5" +aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml" + [[audits.mozilla.audits.autocfg]] who = "Josh Stone " criteria = "safe-to-deploy" @@ -2097,6 +1999,18 @@ criteria = "safe-to-deploy" delta = "1.3.0 -> 1.4.0" aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml" +[[audits.mozilla.audits.cc]] +who = "Mike Hommey " +criteria = "safe-to-deploy" +delta = "1.0.73 -> 1.0.78" +aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml" + +[[audits.mozilla.audits.cc]] +who = "Jan-Erik Rediger " +criteria = "safe-to-deploy" +delta = "1.0.78 -> 1.0.83" +aggregated-from = "https://raw.githubusercontent.com/mozilla/glean/main/supply-chain/audits.toml" + [[audits.mozilla.audits.crypto-common]] who = "Mike Hommey " criteria = "safe-to-deploy" @@ -2208,10 +2122,10 @@ version = "0.12.3" notes = "This version is used in rust's libstd, so effectively we're already trusting it" aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml" -[[audits.mozilla.audits.hermit-abi]] +[[audits.mozilla.audits.itertools]] who = "Mike Hommey " criteria = "safe-to-deploy" -delta = "0.1.19 -> 0.2.6" +delta = "0.10.3 -> 0.10.5" aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml" [[audits.mozilla.audits.lazy_static]] @@ -2276,6 +2190,12 @@ criteria = "safe-to-deploy" delta = "1.16.0 -> 1.17.1" aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml" +[[audits.mozilla.audits.pkg-config]] +who = "Mike Hommey " +criteria = "safe-to-deploy" +delta = "0.3.25 -> 0.3.26" +aggregated-from = "https://hg.mozilla.org/mozilla-central/raw-file/tip/supply-chain/audits.toml" + [[audits.mozilla.audits.proc-macro2]] who = "Nika Layzell " criteria = "safe-to-deploy" diff --git a/tests/all/async_functions.rs b/tests/all/async_functions.rs index 3796c9b05585..fdc643a34eb4 100644 --- a/tests/all/async_functions.rs +++ b/tests/all/async_functions.rs @@ -25,11 +25,10 @@ async fn run_smoke_typed_test(store: &mut Store<()>, func: Func) { #[tokio::test] async fn smoke() { let mut store = async_store(); - let func = Func::new_async( - &mut store, - FuncType::new(None, None), - move |_caller, _params, _results| Box::new(async { Ok(()) }), - ); + let func_ty = FuncType::new(store.engine(), None, None); + let func = Func::new_async(&mut store, func_ty, move |_caller, _params, _results| { + Box::new(async { Ok(()) }) + }); run_smoke_test(&mut store, func).await; run_smoke_typed_test(&mut store, func).await; @@ -46,7 +45,7 @@ async fn smoke_host_func() -> Result<()> { linker.func_new_async( "", "first", - FuncType::new(None, None), + FuncType::new(store.engine(), None, None), move |_caller, _params, _results| Box::new(async { Ok(()) }), )?; @@ -74,16 +73,13 @@ async fn smoke_host_func() -> Result<()> { #[tokio::test] async fn smoke_with_suspension() { let mut store = async_store(); - let func = Func::new_async( - &mut store, - FuncType::new(None, None), - move |_caller, _params, _results| { - Box::new(async { - tokio::task::yield_now().await; - Ok(()) - }) - }, - ); + let func_ty = FuncType::new(store.engine(), None, None); + let func = Func::new_async(&mut store, func_ty, move |_caller, _params, _results| { + Box::new(async { + tokio::task::yield_now().await; + Ok(()) + }) + }); run_smoke_test(&mut store, func).await; run_smoke_typed_test(&mut store, func).await; @@ -105,7 +101,7 @@ async fn smoke_host_func_with_suspension() -> Result<()> { linker.func_new_async( "", "first", - FuncType::new(None, None), + FuncType::new(store.engine(), None, None), move |_caller, _params, _results| { Box::new(async { tokio::task::yield_now().await; @@ -143,32 +139,26 @@ async fn smoke_host_func_with_suspension() -> Result<()> { #[tokio::test] async fn recursive_call() { let mut store = async_store(); - let async_wasm_func = Func::new_async( - &mut store, - FuncType::new(None, None), - |_caller, _params, _results| { - Box::new(async { - tokio::task::yield_now().await; - Ok(()) - }) - }, - ); + let func_ty = FuncType::new(store.engine(), None, None); + let async_wasm_func = Func::new_async(&mut store, func_ty, |_caller, _params, _results| { + Box::new(async { + tokio::task::yield_now().await; + Ok(()) + }) + }); // Create an imported function which recursively invokes another wasm // function asynchronously, although this one is just our own host function // which suffices for this test. - let func2 = Func::new_async( - &mut store, - FuncType::new(None, None), - move |mut caller, _params, _results| { - Box::new(async move { - async_wasm_func - .call_async(&mut caller, &[], &mut []) - .await?; - Ok(()) - }) - }, - ); + let func_ty = FuncType::new(store.engine(), None, None); + let func2 = Func::new_async(&mut store, func_ty, move |mut caller, _params, _results| { + Box::new(async move { + async_wasm_func + .call_async(&mut caller, &[], &mut []) + .await?; + Ok(()) + }) + }); // Create an instance which calls an async import twice. let module = Module::new( @@ -204,36 +194,30 @@ async fn suspend_while_suspending() { // The purpose of this test is intended to stress various cases in how // we manage pointers in ways that are not necessarily common but are still // possible in safe code. - let async_thunk = Func::new_async( - &mut store, - FuncType::new(None, None), - |_caller, _params, _results| Box::new(async { Ok(()) }), - ); - let sync_call_async_thunk = Func::new( - &mut store, - FuncType::new(None, None), - move |mut caller, _params, _results| { + let func_ty = FuncType::new(store.engine(), None, None); + let async_thunk = Func::new_async(&mut store, func_ty, |_caller, _params, _results| { + Box::new(async { Ok(()) }) + }); + let func_ty = FuncType::new(store.engine(), None, None); + let sync_call_async_thunk = + Func::new(&mut store, func_ty, move |mut caller, _params, _results| { let mut future = Box::pin(async_thunk.call_async(&mut caller, &[], &mut [])); let poll = future .as_mut() .poll(&mut Context::from_waker(&noop_waker())); assert!(poll.is_ready()); Ok(()) - }, - ); + }); // A small async function that simply awaits once to pump the loops and // then finishes. - let async_import = Func::new_async( - &mut store, - FuncType::new(None, None), - move |_caller, _params, _results| { - Box::new(async move { - tokio::task::yield_now().await; - Ok(()) - }) - }, - ); + let func_ty = FuncType::new(store.engine(), None, None); + let async_import = Func::new_async(&mut store, func_ty, move |_caller, _params, _results| { + Box::new(async move { + tokio::task::yield_now().await; + Ok(()) + }) + }); let module = Module::new( store.engine(), @@ -264,23 +248,20 @@ async fn suspend_while_suspending() { async fn cancel_during_run() { let mut store = Store::new(&Engine::new(Config::new().async_support(true)).unwrap(), 0); - let async_thunk = Func::new_async( - &mut store, - FuncType::new(None, None), - move |mut caller, _params, _results| { - assert_eq!(*caller.data(), 0); - *caller.data_mut() = 1; - let dtor = SetOnDrop(caller); - Box::new(async move { - // SetOnDrop is not destroyed when dropping the reference of it - // here. Instead, it is moved into the future where it's forced - // to live in and will be destroyed at the end of the future. - let _ = &dtor; - tokio::task::yield_now().await; - Ok(()) - }) - }, - ); + let func_ty = FuncType::new(store.engine(), None, None); + let async_thunk = Func::new_async(&mut store, func_ty, move |mut caller, _params, _results| { + assert_eq!(*caller.data(), 0); + *caller.data_mut() = 1; + let dtor = SetOnDrop(caller); + Box::new(async move { + // SetOnDrop is not destroyed when dropping the reference of it + // here. Instead, it is moved into the future where it's forced + // to live in and will be destroyed at the end of the future. + let _ = &dtor; + tokio::task::yield_now().await; + Ok(()) + }) + }); // Shouldn't have called anything yet... assert_eq!(*store.data(), 0); @@ -373,11 +354,10 @@ async fn async_with_pooling_stacks() { let engine = Engine::new(&config).unwrap(); let mut store = Store::new(&engine, ()); - let func = Func::new_async( - &mut store, - FuncType::new(None, None), - move |_caller, _params, _results| Box::new(async { Ok(()) }), - ); + let func_ty = FuncType::new(store.engine(), None, None); + let func = Func::new_async(&mut store, func_ty, move |_caller, _params, _results| { + Box::new(async { Ok(()) }) + }); run_smoke_test(&mut store, func).await; run_smoke_typed_test(&mut store, func).await; @@ -399,7 +379,7 @@ async fn async_host_func_with_pooling_stacks() -> Result<()> { linker.func_new_async( "", "", - FuncType::new(None, None), + FuncType::new(store.engine(), None, None), move |_caller, _params, _results| Box::new(async { Ok(()) }), )?; @@ -588,6 +568,7 @@ async fn recursive_async() -> Result<()> { async fn linker_module_command() -> Result<()> { let mut store = async_store(); let mut linker = Linker::new(store.engine()); + let module1 = Module::new( store.engine(), r#" @@ -603,6 +584,7 @@ async fn linker_module_command() -> Result<()> { ) "#, )?; + let module2 = Module::new( store.engine(), r#" diff --git a/tests/all/call_hook.rs b/tests/all/call_hook.rs index 9d47ecb85d8b..04b0ee2f8830 100644 --- a/tests/all/call_hook.rs +++ b/tests/all/call_hook.rs @@ -32,9 +32,14 @@ fn call_wrapped_func() -> Result<(), Error> { assert_eq!(d, 4.0); }, )); + let func_ty = FuncType::new( + store.engine(), + [ValType::I32, ValType::I64, ValType::F32, ValType::F64], + [], + ); funcs.push(Func::new( &mut store, - FuncType::new([ValType::I32, ValType::I64, ValType::F32, ValType::F64], []), + func_ty, |caller: Caller, params, results| { verify(caller.data()); @@ -47,20 +52,21 @@ fn call_wrapped_func() -> Result<(), Error> { Ok(()) }, )); + let func_ty = FuncType::new( + store.engine(), + [ValType::I32, ValType::I64, ValType::F32, ValType::F64], + [], + ); funcs.push(unsafe { - Func::new_unchecked( - &mut store, - FuncType::new([ValType::I32, ValType::I64, ValType::F32, ValType::F64], []), - |caller: Caller, space| { - verify(caller.data()); - - assert_eq!(space[0].get_i32(), 1i32); - assert_eq!(space[1].get_i64(), 2i64); - assert_eq!(space[2].get_f32(), 3.0f32.to_bits()); - assert_eq!(space[3].get_f64(), 4.0f64.to_bits()); - Ok(()) - }, - ) + Func::new_unchecked(&mut store, func_ty, |caller: Caller, space| { + verify(caller.data()); + + assert_eq!(space[0].get_i32(), 1i32); + assert_eq!(space[1].get_i64(), 2i64); + assert_eq!(space[2].get_f32(), 3.0f32.to_bits()); + assert_eq!(space[3].get_f64(), 4.0f64.to_bits()); + Ok(()) + }) }); let mut n = 0; diff --git a/tests/all/cli_tests.rs b/tests/all/cli_tests.rs index ff336feb8daf..f5fcc6a5ea58 100644 --- a/tests/all/cli_tests.rs +++ b/tests/all/cli_tests.rs @@ -188,8 +188,10 @@ fn run_wasmtime_unreachable_wat() -> Result<()> { #[test] fn hello_wasi_snapshot0() -> Result<()> { let wasm = build_wasm("tests/all/cli_tests/hello_wasi_snapshot0.wat")?; - let stdout = run_wasmtime(&["-Ccache=n", "-Spreview2=n", wasm.path().to_str().unwrap()])?; - assert_eq!(stdout, "Hello, world!\n"); + for preview2 in ["-Spreview2=n", "-Spreview2=y"] { + let stdout = run_wasmtime(&["-Ccache=n", preview2, wasm.path().to_str().unwrap()])?; + assert_eq!(stdout, "Hello, world!\n"); + } Ok(()) } @@ -252,11 +254,14 @@ fn timeout_in_invoke() -> Result<()> { #[test] fn exit2_wasi_snapshot0() -> Result<()> { let wasm = build_wasm("tests/all/cli_tests/exit2_wasi_snapshot0.wat")?; - let output = run_wasmtime_for_output( - &["-Ccache=n", "-Spreview2=n", wasm.path().to_str().unwrap()], - None, - )?; - assert_eq!(output.status.code().unwrap(), 2); + + for preview2 in ["-Spreview2=n", "-Spreview2=y"] { + let output = run_wasmtime_for_output( + &["-Ccache=n", preview2, wasm.path().to_str().unwrap()], + None, + )?; + assert_eq!(output.status.code().unwrap(), 2); + } Ok(()) } @@ -273,14 +278,17 @@ fn exit2_wasi_snapshot1() -> Result<()> { #[test] fn exit125_wasi_snapshot0() -> Result<()> { let wasm = build_wasm("tests/all/cli_tests/exit125_wasi_snapshot0.wat")?; - let output = run_wasmtime_for_output( - &["-Ccache=n", "-Spreview2=n", wasm.path().to_str().unwrap()], - None, - )?; - if cfg!(windows) { - assert_eq!(output.status.code().unwrap(), 1); - } else { - assert_eq!(output.status.code().unwrap(), 125); + for preview2 in ["-Spreview2=n", "-Spreview2=y"] { + let output = run_wasmtime_for_output( + &["-Ccache=n", preview2, wasm.path().to_str().unwrap()], + None, + )?; + dbg!(&output); + if cfg!(windows) { + assert_eq!(output.status.code().unwrap(), 1); + } else { + assert_eq!(output.status.code().unwrap(), 125); + } } Ok(()) } @@ -302,13 +310,16 @@ fn exit125_wasi_snapshot1() -> Result<()> { #[test] fn exit126_wasi_snapshot0() -> Result<()> { let wasm = build_wasm("tests/all/cli_tests/exit126_wasi_snapshot0.wat")?; - let output = run_wasmtime_for_output( - &["-Ccache=n", "-Spreview2=n", wasm.path().to_str().unwrap()], - None, - )?; - assert_eq!(output.status.code().unwrap(), 1); - assert!(output.stdout.is_empty()); - assert!(String::from_utf8_lossy(&output.stderr).contains("invalid exit status")); + + for preview2 in ["-Spreview2=n", "-Spreview2=y"] { + let output = run_wasmtime_for_output( + &["-Ccache=n", preview2, wasm.path().to_str().unwrap()], + None, + )?; + assert_eq!(output.status.code().unwrap(), 1); + assert!(output.stdout.is_empty()); + assert!(String::from_utf8_lossy(&output.stderr).contains("invalid exit status")); + } Ok(()) } @@ -450,20 +461,22 @@ fn hello_wasi_snapshot0_from_stdin() -> Result<()> { // Run a simple WASI hello world, snapshot0 edition. // The module is piped from standard input. let wasm = build_wasm("tests/all/cli_tests/hello_wasi_snapshot0.wat")?; - let stdout = { - let path = wasm.path(); - let args: &[&str] = &["-Ccache=n", "-Spreview2=n", "-"]; - let output = run_wasmtime_for_output(args, Some(path))?; - if !output.status.success() { - bail!( - "Failed to execute wasmtime with: {:?}\n{}", - args, - String::from_utf8_lossy(&output.stderr) - ); - } - Ok::<_, anyhow::Error>(String::from_utf8(output.stdout).unwrap()) - }?; - assert_eq!(stdout, "Hello, world!\n"); + for preview2 in ["-Spreview2=n", "-Spreview2=y"] { + let stdout = { + let path = wasm.path(); + let args: &[&str] = &["-Ccache=n", preview2, "-"]; + let output = run_wasmtime_for_output(args, Some(path))?; + if !output.status.success() { + bail!( + "Failed to execute wasmtime with: {:?}\n{}", + args, + String::from_utf8_lossy(&output.stderr) + ); + } + Ok::<_, anyhow::Error>(String::from_utf8(output.stdout).unwrap()) + }?; + assert_eq!(stdout, "Hello, world!\n"); + } Ok(()) } @@ -747,6 +760,7 @@ fn component_missing_feature() -> Result<()> { let wasm = build_wasm(path)?; let output = get_wasmtime_command()? .arg("-Ccache=n") + .arg("-Wcomponent-model=n") .arg(wasm.path()) .output()?; assert!(!output.status.success()); @@ -759,6 +773,7 @@ fn component_missing_feature() -> Result<()> { // also tests with raw *.wat input let output = get_wasmtime_command()? .arg("-Ccache=n") + .arg("-Wcomponent-model=n") .arg(path) .output()?; assert!(!output.status.success()); @@ -771,6 +786,27 @@ fn component_missing_feature() -> Result<()> { Ok(()) } +#[test] +#[cfg_attr(not(feature = "component-model"), ignore)] +fn component_enabled_by_default() -> Result<()> { + let path = "tests/all/cli_tests/component-basic.wat"; + let wasm = build_wasm(path)?; + let output = get_wasmtime_command()? + .arg("-Ccache=n") + .arg(wasm.path()) + .output()?; + assert!(output.status.success()); + + // also tests with raw *.wat input + let output = get_wasmtime_command()? + .arg("-Ccache=n") + .arg(path) + .output()?; + assert!(output.status.success()); + + Ok(()) +} + // If the text format is invalid then the filename should be mentioned in the // error message. #[test] @@ -1195,6 +1231,24 @@ fn float_args() -> Result<()> { Ok(()) } +#[test] +fn mpk_without_pooling() -> Result<()> { + let output = get_wasmtime_command()? + .args(&[ + "run", + "-O", + "memory-protection-keys=y", + "--invoke", + "echo_f32", + "tests/all/cli_tests/simple.wat", + "1.0", + ]) + .env("WASMTIME_NEW_CLI", "1") + .output()?; + assert!(!output.status.success()); + Ok(()) +} + mod test_programs { use super::{get_wasmtime_command, run_wasmtime}; use anyhow::Result; @@ -1485,4 +1539,52 @@ mod test_programs { ])?; Ok(()) } + + #[test] + fn cli_no_tcp() -> Result<()> { + let output = super::run_wasmtime_for_output( + &[ + "-Wcomponent-model", + // Turn on network but turn off TCP + "-Sinherit-network,tcp=no", + CLI_NO_TCP_COMPONENT, + ], + None, + )?; + println!("{}", String::from_utf8_lossy(&output.stderr)); + assert!(output.status.success()); + Ok(()) + } + + #[test] + fn cli_no_udp() -> Result<()> { + let output = super::run_wasmtime_for_output( + &[ + "-Wcomponent-model", + // Turn on network but turn off UDP + "-Sinherit-network,udp=no", + CLI_NO_UDP_COMPONENT, + ], + None, + )?; + println!("{}", String::from_utf8_lossy(&output.stderr)); + assert!(output.status.success()); + Ok(()) + } + + #[test] + fn cli_no_ip_name_lookup() -> Result<()> { + let output = super::run_wasmtime_for_output( + &[ + "-Wcomponent-model", + // Turn on network but ensure name lookup is disabled + "-Sinherit-network,allow-ip-name-lookup=no", + CLI_NO_IP_NAME_LOOKUP_COMPONENT, + ], + None, + )?; + println!("{}", String::from_utf8_lossy(&output.stderr)); + assert!(output.status.success()); + Ok(()) + } } diff --git a/tests/all/cli_tests/component-basic.wat b/tests/all/cli_tests/component-basic.wat index 431fb2b92749..057ee944a529 100644 --- a/tests/all/cli_tests/component-basic.wat +++ b/tests/all/cli_tests/component-basic.wat @@ -7,6 +7,6 @@ (func $run (result (result)) (canon lift (core func $i "run"))) - (instance (export (interface "wasi:cli/run@0.2.0-rc-2023-11-10")) + (instance (export (interface "wasi:cli/run@0.2.0")) (export "run" (func $run))) ) diff --git a/tests/all/cli_tests/rs2wasm-add-func.wat b/tests/all/cli_tests/rs2wasm-add-func.wat index 89af3ffc4dca..660cd87434dd 100644 --- a/tests/all/cli_tests/rs2wasm-add-func.wat +++ b/tests/all/cli_tests/rs2wasm-add-func.wat @@ -6,7 +6,7 @@ local.get 0 i32.add) (func $start (type 0)) - (table (;0;) 1 1 anyfunc) + (table (;0;) 1 1 funcref) (memory (;0;) 17) (global (;0;) i32 (i32.const 1049114)) (global (;1;) i32 (i32.const 1049114)) diff --git a/tests/all/component_model/dynamic.rs b/tests/all/component_model/dynamic.rs index 6d24163c58f0..f83f550d8583 100644 --- a/tests/all/component_model/dynamic.rs +++ b/tests/all/component_model/dynamic.rs @@ -3,8 +3,10 @@ use super::{make_echo_component, make_echo_component_with_params, Param, Type}; use anyhow::Result; use component_test_util::FuncExt; -use wasmtime::component::{self, Component, Linker, Val}; -use wasmtime::Store; +use wasmtime::component::types::{self, Case, ComponentItem, Field}; +use wasmtime::component::{self, Component, Linker, ResourceType, Val}; +use wasmtime::{Module, Store}; +use wasmtime_component_util::REALLOC_AND_FREE; #[test] fn primitives() -> Result<()> { @@ -551,3 +553,379 @@ fn everything() -> Result<()> { Ok(()) } + +#[test] +fn introspection() -> Result<()> { + let engine = super::engine(); + + let component = Component::new( + &engine, + format!( + r#" + (component + (import "res" (type $res (sub resource))) + + (import "ai" (instance $i)) + (import "bi" (instance $i2 (export "m" (core module)))) + + (alias export $i2 "m" (core module $m)) + + (type $t (func (param "a" u32) (result u32))) + (component $a + (core module $m + (func (export "add-five") (param i32) (result i32) + local.get 0 + i32.const 5 + i32.add) + ) + (core instance $m (instantiate $m)) + (func (export "add-five") (type $t) (canon lift (core func $m "add-five"))) + ) + (component $b + (import "interface-v1" (instance $i + (export "add-five" (func (type $t))))) + (core module $m + (func $add-five (import "interface-0.1.0" "add-five") (param i32) (result i32)) + (func) ;; causes index out of bounds + (func (export "run") (result i32) i32.const 0 call $add-five) + ) + (core func $add-five (canon lower (func $i "add-five"))) + (core instance $i (instantiate 0 + (with "interface-0.1.0" (instance + (export "add-five" (func $add-five)) + )) + )) + (func (result u32) (canon lift (core func $i "run"))) + (export "run" (func 1)) + ) + (instance $a (instantiate $a)) + (instance $b (instantiate $b (with "interface-v1" (instance $a)))) + (export "run" (func $b "run")) + + (component $c + (component $c + (export "m" (core module $m)) + ) + (instance $c (instantiate $c)) + (export "i" (instance $c)) + ) + (instance $c (instantiate $c)) + (export "i" (instance $c)) + (export "r" (instance $i)) + (export "r2" (instance $i2)) + + (type $b' (enum "a" "b")) + (export $b "b" (type $b')) + (type $c' (record (field "D" bool) (field "E" u32))) + (export $c "c" (type $c')) + (type $f' (flags "G" "H" "I")) + (export $f "f" (type $f')) + (type $m' (record (field "N" bool) (field "O" u32))) + (export $m "m" (type $m')) + (type $j' (variant + (case "K" u32) + (case "L" float64) + (case "M" $m) + )) + (export $j "j" (type $j')) + + (type $Foo' (record + (field "A" u32) + (field "B" $b) + (field "C" $c) + (field "F" (list $f)) + (field "J" $j) + (field "P" s8) + (field "Q" s16) + (field "R" s32) + (field "S" s64) + (field "T" float32) + (field "U" float64) + (field "V" string) + (field "W" char) + (field "Y" (tuple u32 u32)) + (field "AA" (option u32)) + (field "BB" (result string (error string))) + (field "CC" (own $res)) + )) + (export $Foo "foo" (type $Foo')) + + (core module $m2 + (func (export "f") (param i32) (result i32) + local.get 0 + ) + (memory (export "memory") 1) + {REALLOC_AND_FREE} + ) + (core instance $i3 (instantiate $m2)) + + (func (export "fn") (param "x" (option $Foo)) (result (option (tuple u32 u32))) + (canon lift + (core func $i3 "f") + (memory $i3 "memory") + (realloc (func $i3 "realloc")) + ) + ) + ) + "# + ), + )?; + + struct MyType; + + let mut linker = Linker::<()>::new(&engine); + linker + .root() + .resource("res", ResourceType::host::(), |_, _| Ok(()))?; + linker.instance("ai")?; + linker + .instance("bi")? + .module("m", &Module::new(&engine, "(module)")?)?; + + let component_ty = linker.substituted_component_type(&component)?; + + let mut imports = component_ty.imports(linker.engine()); + assert_eq!(imports.len(), 3); + let (name, res_ty) = imports.next().unwrap(); + assert_eq!(name, "res"); + let ComponentItem::Resource(res_ty) = res_ty else { + panic!("`res` import item of wrong type") + }; + assert_eq!(res_ty, ResourceType::host::()); + + let (name, ai_ty) = imports.next().unwrap(); + assert_eq!(name, "ai"); + let ComponentItem::ComponentInstance(ai_ty) = ai_ty else { + panic!("`ai` import item of wrong type") + }; + assert_eq!(ai_ty.exports(linker.engine()).len(), 0); + + let (name, bi_ty) = imports.next().unwrap(); + assert_eq!(name, "bi"); + let ComponentItem::ComponentInstance(bi_ty) = bi_ty else { + panic!("`bi` import item of wrong type") + }; + let mut bi_exports = bi_ty.exports(linker.engine()); + assert_eq!(bi_exports.len(), 1); + let (name, bi_m_ty) = bi_exports.next().unwrap(); + assert_eq!(name, "m"); + let ComponentItem::Module(bi_m_ty) = bi_m_ty else { + panic!("`bi.m` import item of wrong type") + }; + assert_eq!(bi_m_ty.imports(linker.engine()).len(), 0); + assert_eq!(bi_m_ty.exports(linker.engine()).len(), 0); + + let mut exports = component_ty.exports(linker.engine()); + assert_eq!(exports.len(), 11); + + let (name, run_ty) = exports.next().unwrap(); + assert_eq!(name, "run"); + let ComponentItem::ComponentFunc(run_ty) = run_ty else { + panic!("`run` export item of wrong type") + }; + assert_eq!(run_ty.params().len(), 0); + + let mut run_results = run_ty.results(); + assert_eq!(run_results.len(), 1); + assert_eq!(run_results.next().unwrap(), types::Type::U32); + + let (name, i_ty) = exports.next().unwrap(); + assert_eq!(name, "i"); + let ComponentItem::ComponentInstance(i_ty) = i_ty else { + panic!("`i` export item of wrong type") + }; + let mut i_ty_exports = i_ty.exports(linker.engine()); + assert_eq!(i_ty_exports.len(), 1); + let (name, i_i_ty) = i_ty_exports.next().unwrap(); + assert_eq!(name, "i"); + let ComponentItem::ComponentInstance(i_i_ty) = i_i_ty else { + panic!("`i.i` import item of wrong type") + }; + let mut i_i_ty_exports = i_i_ty.exports(linker.engine()); + assert_eq!(i_i_ty_exports.len(), 1); + let (name, i_i_m_ty) = i_i_ty_exports.next().unwrap(); + assert_eq!(name, "m"); + let ComponentItem::Module(i_i_m_ty) = i_i_m_ty else { + panic!("`i.i.m` import item of wrong type") + }; + assert_eq!(i_i_m_ty.imports(linker.engine()).len(), 0); + assert_eq!(i_i_m_ty.exports(linker.engine()).len(), 0); + + let (name, r_ty) = exports.next().unwrap(); + assert_eq!(name, "r"); + let ComponentItem::ComponentInstance(r_ty) = r_ty else { + panic!("`r` export item of wrong type") + }; + assert_eq!(r_ty.exports(linker.engine()).len(), 0); + + let (name, r2_ty) = exports.next().unwrap(); + assert_eq!(name, "r2"); + let ComponentItem::ComponentInstance(r2_ty) = r2_ty else { + panic!("`r2` export item of wrong type") + }; + let mut r2_exports = r2_ty.exports(linker.engine()); + assert_eq!(r2_exports.len(), 1); + let (name, r2_m_ty) = r2_exports.next().unwrap(); + assert_eq!(name, "m"); + let ComponentItem::Module(r2_m_ty) = r2_m_ty else { + panic!("`r2.m` export item of wrong type") + }; + assert_eq!(r2_m_ty.imports(linker.engine()).len(), 0); + assert_eq!(r2_m_ty.exports(linker.engine()).len(), 0); + + let (name, b_ty) = exports.next().unwrap(); + assert_eq!(name, "b"); + let ComponentItem::Type(b_ty) = b_ty else { + panic!("`b` export item of wrong type") + }; + assert_eq!(b_ty.unwrap_enum().names().collect::>(), ["a", "b"]); + + let (name, c_ty) = exports.next().unwrap(); + assert_eq!(name, "c"); + let ComponentItem::Type(c_ty) = c_ty else { + panic!("`c` export item of wrong type") + }; + let mut fields = c_ty.unwrap_record().fields(); + { + let Field { name, ty } = fields.next().unwrap(); + assert_eq!(name, "D"); + assert_eq!(ty, types::Type::Bool); + let Field { name, ty } = fields.next().unwrap(); + assert_eq!(name, "E"); + assert_eq!(ty, types::Type::U32); + } + + let (name, f_ty) = exports.next().unwrap(); + assert_eq!(name, "f"); + let ComponentItem::Type(f_ty) = f_ty else { + panic!("`f` export item of wrong type") + }; + assert_eq!( + f_ty.unwrap_flags().names().collect::>(), + ["G", "H", "I"] + ); + + let (name, m_ty) = exports.next().unwrap(); + assert_eq!(name, "m"); + let ComponentItem::Type(m_ty) = m_ty else { + panic!("`m` export item of wrong type") + }; + { + let mut fields = m_ty.unwrap_record().fields(); + let Field { name, ty } = fields.next().unwrap(); + assert_eq!(name, "N"); + assert_eq!(ty, types::Type::Bool); + let Field { name, ty } = fields.next().unwrap(); + assert_eq!(name, "O"); + assert_eq!(ty, types::Type::U32); + } + + let (name, j_ty) = exports.next().unwrap(); + assert_eq!(name, "j"); + let ComponentItem::Type(j_ty) = j_ty else { + panic!("`j` export item of wrong type") + }; + let mut cases = j_ty.unwrap_variant().cases(); + { + let Case { name, ty } = cases.next().unwrap(); + assert_eq!(name, "K"); + assert_eq!(ty, Some(types::Type::U32)); + let Case { name, ty } = cases.next().unwrap(); + assert_eq!(name, "L"); + assert_eq!(ty, Some(types::Type::Float64)); + let Case { name, ty } = cases.next().unwrap(); + assert_eq!(name, "M"); + assert_eq!(ty, Some(m_ty)); + } + + let (name, foo_ty) = exports.next().unwrap(); + assert_eq!(name, "foo"); + let ComponentItem::Type(foo_ty) = foo_ty else { + panic!("`foo` export item of wrong type") + }; + { + let mut fields = foo_ty.unwrap_record().fields(); + assert_eq!(fields.len(), 17); + let Field { name, ty } = fields.next().unwrap(); + assert_eq!(name, "A"); + assert_eq!(ty, types::Type::U32); + let Field { name, ty } = fields.next().unwrap(); + assert_eq!(name, "B"); + assert_eq!(ty, b_ty); + let Field { name, ty } = fields.next().unwrap(); + assert_eq!(name, "C"); + assert_eq!(ty, c_ty); + let Field { name, ty } = fields.next().unwrap(); + assert_eq!(name, "F"); + let ty = ty.unwrap_list(); + assert_eq!(ty.ty(), f_ty); + let Field { name, ty } = fields.next().unwrap(); + assert_eq!(name, "J"); + assert_eq!(ty, j_ty); + let Field { name, ty } = fields.next().unwrap(); + assert_eq!(name, "P"); + assert_eq!(ty, types::Type::S8); + let Field { name, ty } = fields.next().unwrap(); + assert_eq!(name, "Q"); + assert_eq!(ty, types::Type::S16); + let Field { name, ty } = fields.next().unwrap(); + assert_eq!(name, "R"); + assert_eq!(ty, types::Type::S32); + let Field { name, ty } = fields.next().unwrap(); + assert_eq!(name, "S"); + assert_eq!(ty, types::Type::S64); + let Field { name, ty } = fields.next().unwrap(); + assert_eq!(name, "T"); + assert_eq!(ty, types::Type::Float32); + let Field { name, ty } = fields.next().unwrap(); + assert_eq!(name, "U"); + assert_eq!(ty, types::Type::Float64); + let Field { name, ty } = fields.next().unwrap(); + assert_eq!(name, "V"); + assert_eq!(ty, types::Type::String); + let Field { name, ty } = fields.next().unwrap(); + assert_eq!(name, "W"); + assert_eq!(ty, types::Type::Char); + let Field { name, ty } = fields.next().unwrap(); + assert_eq!(name, "Y"); + assert_eq!( + ty.unwrap_tuple().types().collect::>(), + [types::Type::U32, types::Type::U32] + ); + let Field { name, ty } = fields.next().unwrap(); + assert_eq!(name, "AA"); + assert_eq!(ty.unwrap_option().ty(), types::Type::U32); + let Field { name, ty } = fields.next().unwrap(); + assert_eq!(name, "BB"); + let ty = ty.unwrap_result(); + assert_eq!(ty.ok(), Some(types::Type::String)); + assert_eq!(ty.err(), Some(types::Type::String)); + let Field { name, ty } = fields.next().unwrap(); + assert_eq!(name, "CC"); + assert_eq!(*ty.unwrap_own(), res_ty); + } + + let (name, fn_ty) = exports.next().unwrap(); + assert_eq!(name, "fn"); + let ComponentItem::ComponentFunc(fn_ty) = fn_ty else { + panic!("`fn` export item of wrong type") + }; + let mut params = fn_ty.params(); + assert_eq!(params.len(), 1); + assert_eq!(params.next().unwrap().unwrap_option().ty(), foo_ty); + + let mut results = fn_ty.results(); + assert_eq!(results.len(), 1); + assert_eq!( + results + .next() + .unwrap() + .unwrap_option() + .ty() + .unwrap_tuple() + .types() + .collect::>(), + [types::Type::U32, types::Type::U32] + ); + Ok(()) +} diff --git a/tests/all/component_model/resources.rs b/tests/all/component_model/resources.rs index ba821251f79c..08059df4c218 100644 --- a/tests/all/component_model/resources.rs +++ b/tests/all/component_model/resources.rs @@ -37,8 +37,12 @@ fn host_resource_types() -> Result<()> { let mut store = Store::new(&engine, ()); let mut linker = Linker::new(&engine); - linker.root().resource::("t", |_, _| Ok(()))?; - linker.root().resource::("u", |_, _| Ok(()))?; + linker + .root() + .resource("t", ResourceType::host::(), |_, _| Ok(()))?; + linker + .root() + .resource("u", ResourceType::host::(), |_, _| Ok(()))?; let i = linker.instantiate(&mut store, &c)?; let t1 = i.get_resource(&mut store, "t1").unwrap(); let t2 = i.get_resource(&mut store, "t2").unwrap(); @@ -133,44 +137,70 @@ fn resource_any() -> Result<()> { "#, )?; - let mut store = Store::new(&engine, ()); let linker = Linker::new(&engine); - let i = linker.instantiate(&mut store, &c)?; - let t = i.get_resource(&mut store, "t").unwrap(); - let u = i.get_resource(&mut store, "u").unwrap(); + { + let mut store = Store::new(&engine, ()); + let i = linker.instantiate(&mut store, &c)?; + let t = i.get_resource(&mut store, "t").unwrap(); + let u = i.get_resource(&mut store, "u").unwrap(); - assert_ne!(t, u); + assert_ne!(t, u); - let t_ctor = i.get_typed_func::<(u32,), (ResourceAny,)>(&mut store, "[constructor]t")?; - let u_ctor = i.get_typed_func::<(u32,), (ResourceAny,)>(&mut store, "[constructor]u")?; - let t_dtor = i.get_typed_func::<(ResourceAny,), ()>(&mut store, "drop-t")?; - let u_dtor = i.get_typed_func::<(ResourceAny,), ()>(&mut store, "drop-u")?; + let t_ctor = i.get_typed_func::<(u32,), (ResourceAny,)>(&mut store, "[constructor]t")?; + let u_ctor = i.get_typed_func::<(u32,), (ResourceAny,)>(&mut store, "[constructor]u")?; + let t_dtor = i.get_typed_func::<(ResourceAny,), ()>(&mut store, "drop-t")?; + let u_dtor = i.get_typed_func::<(ResourceAny,), ()>(&mut store, "drop-u")?; - let (t1,) = t_ctor.call(&mut store, (100,))?; - t_ctor.post_return(&mut store)?; - let (t2,) = t_ctor.call(&mut store, (200,))?; - t_ctor.post_return(&mut store)?; - let (u1,) = u_ctor.call(&mut store, (300,))?; - u_ctor.post_return(&mut store)?; - let (u2,) = u_ctor.call(&mut store, (400,))?; - u_ctor.post_return(&mut store)?; + let (t1,) = t_ctor.call(&mut store, (100,))?; + t_ctor.post_return(&mut store)?; + let (t2,) = t_ctor.call(&mut store, (200,))?; + t_ctor.post_return(&mut store)?; + let (u1,) = u_ctor.call(&mut store, (300,))?; + u_ctor.post_return(&mut store)?; + let (u2,) = u_ctor.call(&mut store, (400,))?; + u_ctor.post_return(&mut store)?; - assert_eq!(t1.ty(), t); - assert_eq!(t2.ty(), t); - assert_eq!(u1.ty(), u); - assert_eq!(u2.ty(), u); + assert_eq!(t1.ty(), t); + assert_eq!(t2.ty(), t); + assert_eq!(u1.ty(), u); + assert_eq!(u2.ty(), u); - u_dtor.call(&mut store, (u2,))?; - u_dtor.post_return(&mut store)?; + u_dtor.call(&mut store, (u2,))?; + u_dtor.post_return(&mut store)?; - u_dtor.call(&mut store, (u1,))?; - u_dtor.post_return(&mut store)?; + u_dtor.call(&mut store, (u1,))?; + u_dtor.post_return(&mut store)?; - t_dtor.call(&mut store, (t1,))?; - t_dtor.post_return(&mut store)?; + t_dtor.call(&mut store, (t1,))?; + t_dtor.post_return(&mut store)?; - t_dtor.call(&mut store, (t2,))?; - t_dtor.post_return(&mut store)?; + t_dtor.call(&mut store, (t2,))?; + t_dtor.post_return(&mut store)?; + } + + { + let mut store = Store::new(&engine, ()); + let i = linker.instantiate(&mut store, &c)?; + let t_ctor = i.get_typed_func::<(u32,), (ResourceAny,)>(&mut store, "[constructor]t")?; + let u_ctor = i.get_typed_func::<(u32,), (ResourceAny,)>(&mut store, "[constructor]u")?; + let t_dtor = i.get_typed_func::<(ResourceAny,), ()>(&mut store, "drop-t")?; + + // `t` is placed at host index 0 + let (t,) = t_ctor.call(&mut store, (100,))?; + t_ctor.post_return(&mut store)?; + t_dtor.call(&mut store, (t,))?; + t_dtor.post_return(&mut store)?; + + // `u` is also placed at host index 0 since `t` was deallocated + let (_u,) = u_ctor.call(&mut store, (100,))?; + u_ctor.post_return(&mut store)?; + + // reuse of `t` should fail, despite it pointing to a valid resource + assert_eq!( + t_dtor.call(&mut store, (t,)).unwrap_err().to_string(), + "host-owned resource is being used with the wrong type" + ); + } Ok(()) } @@ -367,7 +397,9 @@ fn drop_host_twice() -> Result<()> { let mut store = Store::new(&engine, ()); let mut linker = Linker::new(&engine); - linker.root().resource::("t", |_, _| Ok(()))?; + linker + .root() + .resource("t", ResourceType::host::(), |_, _| Ok(()))?; let i = linker.instantiate(&mut store, &c)?; let dtor = i.get_typed_func::<(&Resource,), ()>(&mut store, "dtor")?; @@ -431,12 +463,14 @@ fn manually_destroy() -> Result<()> { let mut store = Store::new(&engine, Data::default()); let mut linker = Linker::new(&engine); - linker.root().resource::("t1", |mut cx, rep| { - let data: &mut Data = cx.data_mut(); - data.drops += 1; - data.last_drop = Some(rep); - Ok(()) - })?; + linker + .root() + .resource("t1", ResourceType::host::(), |mut cx, rep| { + let data: &mut Data = cx.data_mut(); + data.drops += 1; + data.last_drop = Some(rep); + Ok(()) + })?; let i = linker.instantiate(&mut store, &c)?; let t2_ctor = i.get_typed_func::<(u32,), (ResourceAny,)>(&mut store, "[constructor]t2")?; let t2_drops = i.get_typed_func::<(), (u32,)>(&mut store, "[static]t2.drops")?; @@ -497,7 +531,9 @@ fn dynamic_type() -> Result<()> { let mut store = Store::new(&engine, ()); let mut linker = Linker::new(&engine); - linker.root().resource::("t1", |_, _| Ok(()))?; + linker + .root() + .resource("t1", ResourceType::host::(), |_, _| Ok(()))?; let i = linker.instantiate(&mut store, &c)?; let a = i.get_func(&mut store, "a").unwrap(); @@ -548,11 +584,16 @@ fn dynamic_val() -> Result<()> { let mut store = Store::new(&engine, ()); let mut linker = Linker::new(&engine); - linker.root().resource::("t1", |_, _| Ok(()))?; - let i = linker.instantiate(&mut store, &c)?; + let idx = linker + .root() + .resource("t1", ResourceType::host::(), |_, _| Ok(()))?; + let i_pre = linker.instantiate_pre(&c)?; + let i = i_pre.instantiate(&mut store)?; let a = i.get_func(&mut store, "a").unwrap(); let a_typed = i.get_typed_func::<(Resource,), (ResourceAny,)>(&mut store, "a")?; + let a_typed_result = + i.get_typed_func::<(Resource,), (Resource,)>(&mut store, "a")?; let b = i.get_func(&mut store, "b").unwrap(); let t2 = i.get_resource(&mut store, "t2").unwrap(); @@ -567,6 +608,66 @@ fn dynamic_val() -> Result<()> { match &results[0] { Val::Resource(resource) => { assert_eq!(resource.ty(), ResourceType::host::()); + assert!(resource.owned()); + + let resource = resource.try_into_resource::(&mut store)?; + assert_eq!(resource.rep(), 100); + assert!(resource.owned()); + + let resource = resource.try_into_resource_any(&mut store, &i_pre, idx)?; + assert_eq!(resource.ty(), ResourceType::host::()); + assert!(resource.owned()); + } + _ => unreachable!(), + } + + let t1_any = Resource::::new_own(100).try_into_resource_any(&mut store, &i_pre, idx)?; + let mut results = [Val::Bool(false)]; + a.call(&mut store, &[Val::Resource(t1_any)], &mut results)?; + a.post_return(&mut store)?; + match &results[0] { + Val::Resource(resource) => { + assert_eq!(resource.ty(), ResourceType::host::()); + assert!(resource.owned()); + + let resource = resource.try_into_resource::(&mut store)?; + assert_eq!(resource.rep(), 100); + assert!(resource.owned()); + + let resource = resource.try_into_resource_any(&mut store, &i_pre, idx)?; + assert_eq!(resource.ty(), ResourceType::host::()); + assert!(resource.owned()); + } + _ => unreachable!(), + } + + let t1 = Resource::::new_own(100) + .try_into_resource_any(&mut store, &i_pre, idx)? + .try_into_resource(&mut store)?; + let (t1,) = a_typed_result.call(&mut store, (t1,))?; + a_typed_result.post_return(&mut store)?; + assert_eq!(t1.rep(), 100); + assert!(t1.owned()); + + let t1_any = t1 + .try_into_resource_any(&mut store, &i_pre, idx)? + .try_into_resource::(&mut store)? + .try_into_resource_any(&mut store, &i_pre, idx)?; + let mut results = [Val::Bool(false)]; + a.call(&mut store, &[Val::Resource(t1_any)], &mut results)?; + a.post_return(&mut store)?; + match &results[0] { + Val::Resource(resource) => { + assert_eq!(resource.ty(), ResourceType::host::()); + assert!(resource.owned()); + + let resource = resource.try_into_resource::(&mut store)?; + assert_eq!(resource.rep(), 100); + assert!(resource.owned()); + + let resource = resource.try_into_resource_any(&mut store, &i_pre, idx)?; + assert_eq!(resource.ty(), ResourceType::host::()); + assert!(resource.owned()); } _ => unreachable!(), } @@ -665,7 +766,9 @@ fn active_borrows_at_end_of_call() -> Result<()> { let mut store = Store::new(&engine, ()); let mut linker = Linker::new(&engine); - linker.root().resource::("t", |_, _| Ok(()))?; + linker + .root() + .resource("t", ResourceType::host::(), |_, _| Ok(()))?; let i = linker.instantiate(&mut store, &c)?; let f = i.get_typed_func::<(&Resource,), ()>(&mut store, "f")?; @@ -720,7 +823,9 @@ fn thread_through_borrow() -> Result<()> { let mut store = Store::new(&engine, ()); let mut linker = Linker::new(&engine); - linker.root().resource::("t", |_, _| Ok(()))?; + linker + .root() + .resource("t", ResourceType::host::(), |_, _| Ok(()))?; linker .root() .func_wrap("f", |_cx, (r,): (Resource,)| { @@ -764,7 +869,9 @@ fn cannot_use_borrow_for_own() -> Result<()> { let mut store = Store::new(&engine, ()); let mut linker = Linker::new(&engine); - linker.root().resource::("t", |_, _| Ok(()))?; + linker + .root() + .resource("t", ResourceType::host::(), |_, _| Ok(()))?; let i = linker.instantiate(&mut store, &c)?; let f = i.get_typed_func::<(&Resource,), (Resource,)>(&mut store, "f")?; @@ -775,6 +882,72 @@ fn cannot_use_borrow_for_own() -> Result<()> { Ok(()) } +#[test] +fn can_use_own_for_borrow() -> Result<()> { + let engine = super::engine(); + let c = Component::new( + &engine, + r#" + (component + (import "t" (type $t (sub resource))) + + (core func $drop (canon resource.drop $t)) + + (core module $m + (import "" "drop" (func $drop (param i32))) + (func (export "f") (param i32) + (call $drop (local.get 0)) + ) + ) + (core instance $i (instantiate $m + (with "" (instance + (export "drop" (func $drop)) + )) + )) + + (func (export "f") (param "x" (borrow $t)) + (canon lift (core func $i "f"))) + ) + "#, + )?; + + struct MyType; + + let mut store = Store::new(&engine, ()); + let mut linker = Linker::new(&engine); + let ty_idx = linker + .root() + .resource("t", ResourceType::host::(), |_, _| Ok(()))?; + let i_pre = linker.instantiate_pre(&c)?; + let i = i_pre.instantiate(&mut store)?; + + let f = i.get_func(&mut store, "f").unwrap(); + let f_typed = i.get_typed_func::<(&Resource,), ()>(&mut store, "f")?; + + let resource = Resource::new_own(100); + f_typed.call(&mut store, (&resource,))?; + f_typed.post_return(&mut store)?; + + let resource = Resource::new_borrow(200); + f_typed.call(&mut store, (&resource,))?; + f_typed.post_return(&mut store)?; + + let resource = + Resource::::new_own(300).try_into_resource_any(&mut store, &i_pre, ty_idx)?; + f.call(&mut store, &[Val::Resource(resource)], &mut [])?; + f.post_return(&mut store)?; + resource.resource_drop(&mut store)?; + + // TODO: Enable once https://github.com/bytecodealliance/wasmtime/issues/7793 is fixed + //let resource = + // Resource::::new_borrow(400).try_into_resource_any(&mut store, &i_pre, ty_idx)?; + //f.call(&mut store, &[Val::Resource(resource)], &mut [])?; + //f.post_return(&mut store)?; + //resource.resource_drop(&mut store)?; + + Ok(()) +} + #[test] fn passthrough_wrong_type() -> Result<()> { let engine = super::engine(); @@ -809,7 +982,9 @@ fn passthrough_wrong_type() -> Result<()> { let mut store = Store::new(&engine, ()); let mut linker = Linker::new(&engine); - linker.root().resource::("t", |_, _| Ok(()))?; + linker + .root() + .resource("t", ResourceType::host::(), |_, _| Ok(()))?; linker .root() .func_wrap("f", |_cx, (r,): (Resource,)| Ok((r,)))?; @@ -849,7 +1024,9 @@ fn pass_moved_resource() -> Result<()> { let mut store = Store::new(&engine, ()); let mut linker = Linker::new(&engine); - linker.root().resource::("t", |_, _| Ok(()))?; + linker + .root() + .resource("t", ResourceType::host::(), |_, _| Ok(()))?; let i = linker.instantiate(&mut store, &c)?; let f = i.get_typed_func::<(&Resource, &Resource), ()>(&mut store, "f")?; @@ -980,7 +1157,9 @@ fn host_borrow_as_resource_any() -> Result<()> { // First test the above component where the host properly drops the argument { let mut linker = Linker::new(&engine); - linker.root().resource::("t", |_, _| Ok(()))?; + linker + .root() + .resource("t", ResourceType::host::(), |_, _| Ok(()))?; linker .root() .func_wrap("f", |mut cx, (r,): (ResourceAny,)| { @@ -998,7 +1177,9 @@ fn host_borrow_as_resource_any() -> Result<()> { // Then also test the case where the host forgets a drop { let mut linker = Linker::new(&engine); - linker.root().resource::("t", |_, _| Ok(()))?; + linker + .root() + .resource("t", ResourceType::host::(), |_, _| Ok(()))?; linker.root().func_wrap("f", |_cx, (_r,): (ResourceAny,)| { // ... no drop here Ok(()) @@ -1107,7 +1288,9 @@ fn pass_host_borrow_to_guest() -> Result<()> { let mut store = Store::new(&engine, ()); let mut linker = Linker::new(&engine); - linker.root().resource::("t", |_, _| Ok(()))?; + linker + .root() + .resource("t", ResourceType::host::(), |_, _| Ok(()))?; let i = linker.instantiate(&mut store, &c)?; let take = i.get_typed_func::<(&Resource,), ()>(&mut store, "take")?; @@ -1180,7 +1363,9 @@ fn drop_on_owned_resource() -> Result<()> { let mut store = Store::new(&engine, ()); let mut linker = Linker::new(&engine); - linker.root().resource::("t", |_, _| Ok(()))?; + linker + .root() + .resource("t", ResourceType::host::(), |_, _| Ok(()))?; linker.root().func_wrap("[constructor]t", |_cx, ()| { Ok((Resource::::new_own(300),)) })?; @@ -1257,8 +1442,12 @@ fn guest_different_host_same() -> Result<()> { let mut store = Store::new(&engine, ()); let mut linker = Linker::new(&engine); - linker.root().resource::("t1", |_, _| Ok(()))?; - linker.root().resource::("t2", |_, _| Ok(()))?; + linker + .root() + .resource("t1", ResourceType::host::(), |_, _| Ok(()))?; + linker + .root() + .resource("t2", ResourceType::host::(), |_, _| Ok(()))?; linker.root().func_wrap( "f", |_cx, (r1, r2): (Resource, Resource)| { diff --git a/tests/all/coredump.rs b/tests/all/coredump.rs index 492bce76db64..1290bd82583d 100644 --- a/tests/all/coredump.rs +++ b/tests/all/coredump.rs @@ -17,7 +17,7 @@ fn coredump_attached_to_error() -> Result<()> { "#; let module = Module::new(store.engine(), wat)?; - let hello_type = FuncType::new(None, None); + let hello_type = FuncType::new(store.engine(), None, None); let hello_func = Func::new(&mut store, hello_type, |_, _, _| bail!("test 123")); let instance = Instance::new(&mut store, &module, &[hello_func.into()])?; diff --git a/tests/all/debug/testsuite/dead_code.c b/tests/all/debug/testsuite/dead_code.c index 61067a78daa8..ea65e8efbc44 100644 --- a/tests/all/debug/testsuite/dead_code.c +++ b/tests/all/debug/testsuite/dead_code.c @@ -1,5 +1,4 @@ -int bar(int a) -{ +int bar(int a) { int b[50]; b[0] = a; b[29] = a; @@ -8,12 +7,6 @@ int bar(int a) int baz(int a); -__attribute__((export_name("foo"))) int foo() -{ - return baz(10); -} +__attribute__((export_name("foo"))) int foo() { return baz(10); } -__attribute__((noinline)) int baz(int a) -{ - return a + 5; -} +__attribute__((noinline)) int baz(int a) { return a + 5; } diff --git a/tests/all/debug/testsuite/reverse-str.c b/tests/all/debug/testsuite/reverse-str.c index 0cad1b2f0fe2..d7585a87fbcd 100644 --- a/tests/all/debug/testsuite/reverse-str.c +++ b/tests/all/debug/testsuite/reverse-str.c @@ -3,19 +3,18 @@ // -O0 -nostdlib -fdebug-prefix-map=$PWD=. #include -void reverse(char *s, size_t len) -{ - if (!len) return; - size_t i = 0, j = len - 1; - while (i < j) { - char t = s[i]; - s[i++] = s[j]; - s[j--] = t; - } +void reverse(char *s, size_t len) { + if (!len) + return; + size_t i = 0, j = len - 1; + while (i < j) { + char t = s[i]; + s[i++] = s[j]; + s[j--] = t; + } } -void _start() -{ - char hello[] = "Hello, world."; - reverse(hello, 13); +void _start() { + char hello[] = "Hello, world."; + reverse(hello, 13); } diff --git a/tests/all/debug/testsuite/spilled_frame_base.c b/tests/all/debug/testsuite/spilled_frame_base.c index d0733681201a..8948ac6cf2cc 100644 --- a/tests/all/debug/testsuite/spilled_frame_base.c +++ b/tests/all/debug/testsuite/spilled_frame_base.c @@ -1,16 +1,21 @@ -// Originally built using WASI SDK 20.0, "clang spilled_frame_base.c -o spilled_frame_base.wasm -g -target wasm32-wasi" -void func_11(int x, int y, int z, int a, int b, int c, int d, int e, int f, int g, int h) { } -void func_12(int x, int y, int z, int a, int b, int c, int d, int e, int f, int g, int h, int i) { } -void func_13(int x, int y, int z, int a, int b, int c, int d, int e, int f, int g, int h, int i, int j) { } -void func_14(int x, int y, int z, int a, int b, int c, int d, int e, int f, int g, int h, int i, int j, int k) { } +// Originally built using WASI SDK 20.0, "clang spilled_frame_base.c -o +// spilled_frame_base.wasm -g -target wasm32-wasi" +void func_11(int x, int y, int z, int a, int b, int c, int d, int e, int f, + int g, int h) {} +void func_12(int x, int y, int z, int a, int b, int c, int d, int e, int f, + int g, int h, int i) {} +void func_13(int x, int y, int z, int a, int b, int c, int d, int e, int f, + int g, int h, int i, int j) {} +void func_14(int x, int y, int z, int a, int b, int c, int d, int e, int f, + int g, int h, int i, int j, int k) {} int main() { - int i = 1; + int i = 1; - func_11(55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65); - func_12(66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77); - func_13(78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90); - func_14(91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104); + func_11(55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65); + func_12(66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77); + func_13(78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90); + func_14(91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104); - return i + i; + return i + i; } diff --git a/tests/all/epoch_interruption.rs b/tests/all/epoch_interruption.rs index 51d4b831c166..3d6af5aaa639 100644 --- a/tests/all/epoch_interruption.rs +++ b/tests/all/epoch_interruption.rs @@ -21,7 +21,7 @@ fn make_env(engine: &Engine) -> Linker { .func_new( "", "bump_epoch", - FuncType::new(None, None), + FuncType::new(&engine, None, None), move |_caller, _params, _results| { engine.increment_epoch(); Ok(()) @@ -418,7 +418,7 @@ async fn drop_future_on_epoch_yield() { .func_new( "", "oops", - FuncType::new(None, None), + FuncType::new(&engine, None, None), move |_caller, _params, _results| { panic!("Should not have reached this point!"); }, @@ -428,7 +428,7 @@ async fn drop_future_on_epoch_yield() { .func_new( "", "im_alive", - FuncType::new(None, None), + FuncType::new(&engine, None, None), move |_caller, _params, _results| { alive_flag_clone.store(true, Ordering::Release); Ok(()) diff --git a/tests/all/func.rs b/tests/all/func.rs index fab609520497..2cd3e88a7381 100644 --- a/tests/all/func.rs +++ b/tests/all/func.rs @@ -71,16 +71,17 @@ fn call_wasm_to_array() -> Result<()> { )?; let mut store = Store::<()>::default(); let module = Module::new(store.engine(), &wasm)?; - let import_func = Func::new( - &mut store, - FuncType::new(vec![], vec![ValType::I32, ValType::I32, ValType::I32]), - |_, _params, results| { - results[0] = Val::I32(1); - results[1] = Val::I32(2); - results[2] = Val::I32(3); - Ok(()) - }, + let func_ty = FuncType::new( + store.engine(), + vec![], + vec![ValType::I32, ValType::I32, ValType::I32], ); + let import_func = Func::new(&mut store, func_ty, |_, _params, results| { + results[0] = Val::I32(1); + results[1] = Val::I32(2); + results[2] = Val::I32(3); + Ok(()) + }); let instance = Instance::new(&mut store, &module, &[import_func.into()])?; let func = instance .get_typed_func::<(), (i32, i32, i32)>(&mut store, "run") @@ -133,19 +134,17 @@ fn call_native_to_native() -> Result<()> { fn call_native_to_array() -> Result<()> { let mut store = Store::<()>::default(); - let func = Func::new( - &mut store, - FuncType::new( - [ValType::I32, ValType::I32, ValType::I32], - [ValType::I32, ValType::I32, ValType::I32], - ), - |_caller, params, results| { - results[0] = params[2].clone(); - results[1] = params[0].clone(); - results[2] = params[1].clone(); - Ok(()) - }, + let func_ty = FuncType::new( + store.engine(), + [ValType::I32, ValType::I32, ValType::I32], + [ValType::I32, ValType::I32, ValType::I32], ); + let func = Func::new(&mut store, func_ty, |_caller, params, results| { + results[0] = params[2].clone(); + results[1] = params[0].clone(); + results[2] = params[1].clone(); + Ok(()) + }); let func = func.typed::<(i32, i32, i32), (i32, i32, i32)>(&store)?; let results = func.call(&mut store, (1, 2, 3))?; assert_eq!(results, (3, 1, 2)); @@ -204,19 +203,17 @@ fn call_array_to_native() -> Result<()> { #[cfg_attr(miri, ignore)] fn call_array_to_array() -> Result<()> { let mut store = Store::<()>::default(); - let func = Func::new( - &mut store, - FuncType::new( - [ValType::I32, ValType::I32, ValType::I32], - [ValType::I32, ValType::I32, ValType::I32], - ), - |_caller, params, results| { - results[0] = params[2].clone(); - results[1] = params[0].clone(); - results[2] = params[1].clone(); - Ok(()) - }, + let func_ty = FuncType::new( + store.engine(), + [ValType::I32, ValType::I32, ValType::I32], + [ValType::I32, ValType::I32, ValType::I32], ); + let func = Func::new(&mut store, func_ty, |_caller, params, results| { + results[0] = params[2].clone(); + results[1] = params[0].clone(); + results[2] = params[1].clone(); + Ok(()) + }); let mut results = [Val::I32(0), Val::I32(0), Val::I32(0)]; func.call( &mut store, @@ -664,13 +661,13 @@ fn get_from_wrapper() { #[cfg_attr(miri, ignore)] fn get_from_signature() { let mut store = Store::<()>::default(); - let ty = FuncType::new(None, None); + let ty = FuncType::new(store.engine(), None, None); let f = Func::new(&mut store, ty, |_, _, _| panic!()); assert!(f.typed::<(), ()>(&store).is_ok()); assert!(f.typed::<(), i32>(&store).is_err()); assert!(f.typed::(&store).is_err()); - let ty = FuncType::new(Some(ValType::I32), Some(ValType::F64)); + let ty = FuncType::new(store.engine(), Some(ValType::I32), Some(ValType::F64)); let f = Func::new(&mut store, ty, |_, _, _| panic!()); assert!(f.typed::<(), ()>(&store).is_err()); assert!(f.typed::<(), i32>(&store).is_err()); @@ -820,7 +817,7 @@ fn caller_memory() -> anyhow::Result<()> { #[cfg_attr(miri, ignore)] fn func_write_nothing() -> anyhow::Result<()> { let mut store = Store::<()>::default(); - let ty = FuncType::new(None, Some(ValType::I32)); + let ty = FuncType::new(store.engine(), None, Some(ValType::I32)); let f = Func::new(&mut store, ty, |_, _, _| Ok(())); let err = f.call(&mut store, &[], &mut [Val::I32(0)]).unwrap_err(); assert!(err @@ -902,14 +899,12 @@ fn externref_signature_no_reference_types() -> anyhow::Result<()> { config.wasm_reference_types(false); let mut store = Store::new(&Engine::new(&config)?, ()); Func::wrap(&mut store, |_: Option| {}); - Func::new( - &mut store, - FuncType::new( - [ValType::FuncRef, ValType::ExternRef].iter().cloned(), - [ValType::FuncRef, ValType::ExternRef].iter().cloned(), - ), - |_, _, _| Ok(()), + let func_ty = FuncType::new( + store.engine(), + [ValType::FuncRef, ValType::ExternRef].iter().cloned(), + [ValType::FuncRef, ValType::ExternRef].iter().cloned(), ); + Func::new(&mut store, func_ty, |_, _, _| Ok(())); Ok(()) } @@ -1004,7 +999,8 @@ fn trap_doesnt_leak() -> anyhow::Result<()> { // test that `Func::new` is correct let canary2 = Canary::default(); let dtor2_run = canary2.0.clone(); - let f2 = Func::new(&mut store, FuncType::new(None, None), move |_, _, _| { + let func_ty = FuncType::new(store.engine(), None, None); + let f2 = Func::new(&mut store, func_ty, move |_, _, _| { let _ = &canary2; bail!("") }); diff --git a/tests/all/funcref.rs b/tests/all/funcref.rs index eab2d593927f..0500009b8fc6 100644 --- a/tests/all/funcref.rs +++ b/tests/all/funcref.rs @@ -141,14 +141,11 @@ fn func_new_returns_wrong_store() -> anyhow::Result<()> { let f1 = Func::wrap(&mut store1, move || { let _ = &set; }); - let f2 = Func::new( - &mut store2, - FuncType::new(None, Some(ValType::FuncRef)), - move |_, _, results| { - results[0] = f1.clone().into(); - Ok(()) - }, - ); + let func_ty = FuncType::new(store2.engine(), None, Some(ValType::FuncRef)); + let f2 = Func::new(&mut store2, func_ty, move |_, _, results| { + results[0] = f1.clone().into(); + Ok(()) + }); assert!(f2.call(&mut store2, &[], &mut [Val::I32(0)]).is_err()); } assert!(dropped.load(SeqCst)); diff --git a/tests/all/host_funcs.rs b/tests/all/host_funcs.rs index 76033acd62ca..be1cc2873f7e 100644 --- a/tests/all/host_funcs.rs +++ b/tests/all/host_funcs.rs @@ -1,8 +1,8 @@ use anyhow::{bail, Result}; use std::sync::atomic::{AtomicUsize, Ordering::SeqCst}; +use wasi_common::sync::WasiCtxBuilder; +use wasi_common::I32Exit; use wasmtime::*; -use wasmtime_wasi::sync::WasiCtxBuilder; -use wasmtime_wasi::I32Exit; #[test] #[should_panic = "cannot use `func_new_async` without enabling async support"] @@ -12,7 +12,7 @@ fn async_required() { drop(linker.func_new_async( "", "", - FuncType::new(None, None), + FuncType::new(&engine, None, None), move |_caller, _params, _results| Box::new(async { Ok(()) }), )); } @@ -493,10 +493,10 @@ fn new_from_signature() -> Result<()> { let engine = Engine::default(); let mut linker = Linker::new(&engine); - let ty = FuncType::new(None, None); + let ty = FuncType::new(&engine, None, None); linker.func_new("", "f1", ty, |_, _, _| panic!())?; - let ty = FuncType::new(Some(ValType::I32), Some(ValType::F64)); + let ty = FuncType::new(&engine, Some(ValType::I32), Some(ValType::F64)); linker.func_new("", "f2", ty, |_, _, _| panic!())?; let mut store = Store::new(&engine, ()); @@ -603,7 +603,7 @@ fn call_wrapped_func() -> Result<()> { fn func_return_nothing() -> Result<()> { let engine = Engine::default(); let mut linker = Linker::new(&engine); - let ty = FuncType::new(None, Some(ValType::I32)); + let ty = FuncType::new(&engine, None, Some(ValType::I32)); linker.func_new("", "", ty, |_, _, _| Ok(()))?; let mut store = Store::new(&engine, ()); @@ -708,7 +708,7 @@ fn store_with_context() -> Result<()> { fn wasi_imports() -> Result<()> { let engine = Engine::default(); let mut linker = Linker::new(&engine); - wasmtime_wasi::add_to_linker(&mut linker, |s| s)?; + wasi_common::sync::add_to_linker(&mut linker, |s| s)?; let wasm = wat::parse_str( r#" diff --git a/tests/all/import_calling_export.rs b/tests/all/import_calling_export.rs index 247fbcd1ebc0..a0f1d7482cba 100644 --- a/tests/all/import_calling_export.rs +++ b/tests/all/import_calling_export.rs @@ -19,18 +19,15 @@ fn test_import_calling_export() { let mut store = Store::>::default(); let module = Module::new(store.engine(), WAT).expect("failed to create module"); - let callback_func = Func::new( - &mut store, - FuncType::new(None, None), - move |mut caller, _, _| { - caller - .data() - .unwrap() - .call(&mut caller, &[], &mut []) - .expect("expected function not to trap"); - Ok(()) - }, - ); + let func_ty = FuncType::new(store.engine(), None, None); + let callback_func = Func::new(&mut store, func_ty, move |mut caller, _, _| { + caller + .data() + .unwrap() + .call(&mut caller, &[], &mut []) + .expect("expected function not to trap"); + Ok(()) + }); let imports = vec![callback_func.into()]; let instance = Instance::new(&mut store, &module, imports.as_slice()) @@ -64,15 +61,12 @@ fn test_returns_incorrect_type() -> Result<()> { let mut store = Store::<()>::default(); let module = Module::new(store.engine(), WAT)?; - let callback_func = Func::new( - &mut store, - FuncType::new(None, Some(ValType::I32)), - |_, _, results| { - // Evil! Returns I64 here instead of promised in the signature I32. - results[0] = Val::I64(228); - Ok(()) - }, - ); + let func_ty = FuncType::new(store.engine(), None, Some(ValType::I32)); + let callback_func = Func::new(&mut store, func_ty, |_, _, results| { + // Evil! Returns I64 here instead of promised in the signature I32. + results[0] = Val::I64(228); + Ok(()) + }); let imports = vec![callback_func.into()]; let instance = Instance::new(&mut store, &module, imports.as_slice())?; diff --git a/tests/all/import_indexes.rs b/tests/all/import_indexes.rs index 6383d576e34c..6a92ddd2836b 100644 --- a/tests/all/import_indexes.rs +++ b/tests/all/import_indexes.rs @@ -17,12 +17,13 @@ fn same_import_names_still_distinct() -> anyhow::Result<()> { "#; let mut store = Store::<()>::default(); - let module = Module::new(store.engine(), WAT)?; + let engine = store.engine().clone(); + let module = Module::new(&engine, WAT)?; let imports = [ Func::new( &mut store, - FuncType::new(None, Some(ValType::I32)), + FuncType::new(&engine, None, Some(ValType::I32)), |_, params, results| { assert!(params.is_empty()); assert_eq!(results.len(), 1); @@ -33,7 +34,7 @@ fn same_import_names_still_distinct() -> anyhow::Result<()> { .into(), Func::new( &mut store, - FuncType::new(None, Some(ValType::F32)), + FuncType::new(&engine, None, Some(ValType::F32)), |_, params, results| { assert!(params.is_empty()); assert_eq!(results.len(), 1); diff --git a/tests/all/invoke_func_via_table.rs b/tests/all/invoke_func_via_table.rs index 8edb1838645b..d8a42fa3799a 100644 --- a/tests/all/invoke_func_via_table.rs +++ b/tests/all/invoke_func_via_table.rs @@ -11,7 +11,7 @@ fn test_invoke_func_via_table() -> Result<()> { (module (func $f (result i64) (i64.const 42)) - (table (export "table") 1 1 anyfunc) + (table (export "table") 1 1 funcref) (elem (i32.const 0) $f) ) "#; diff --git a/tests/all/limits.rs b/tests/all/limits.rs index bb8640af8a27..ffcc793caa6e 100644 --- a/tests/all/limits.rs +++ b/tests/all/limits.rs @@ -12,7 +12,7 @@ fn test_limits() -> Result<()> { &engine, r#"(module (memory $m (export "m") 0) - (table (export "t") 0 anyfunc) + (table (export "t") 0 funcref) (func (export "grow") (param i32) (result i32) (memory.grow $m (local.get 0))) )"#, @@ -100,7 +100,7 @@ async fn test_limits_async() -> Result<()> { let engine = Engine::new(&config).unwrap(); let module = Module::new( &engine, - r#"(module (memory (export "m") 0) (table (export "t") 0 anyfunc))"#, + r#"(module (memory (export "m") 0) (table (export "t") 0 funcref))"#, )?; struct LimitsAsync { @@ -190,7 +190,7 @@ fn test_limits_memory_only() -> Result<()> { let engine = Engine::default(); let module = Module::new( &engine, - r#"(module (memory (export "m") 0) (table (export "t") 0 anyfunc))"#, + r#"(module (memory (export "m") 0) (table (export "t") 0 funcref))"#, )?; let mut store = Store::new( @@ -276,7 +276,7 @@ fn test_limits_table_only() -> Result<()> { let engine = Engine::default(); let module = Module::new( &engine, - r#"(module (memory (export "m") 0) (table (export "t") 0 anyfunc))"#, + r#"(module (memory (export "m") 0) (table (export "t") 0 funcref))"#, )?; let mut store = Store::new(&engine, StoreLimitsBuilder::new().table_elements(5).build()); @@ -323,7 +323,7 @@ fn test_limits_table_only() -> Result<()> { #[test] fn test_initial_table_limits_exceeded() -> Result<()> { let engine = Engine::default(); - let module = Module::new(&engine, r#"(module (table (export "t") 23 anyfunc))"#)?; + let module = Module::new(&engine, r#"(module (table (export "t") 23 funcref))"#)?; let mut store = Store::new(&engine, StoreLimitsBuilder::new().table_elements(4).build()); store.limiter(|s| s as &mut dyn ResourceLimiter); @@ -409,8 +409,7 @@ impl ResourceLimiter for MemoryContext { // Check if the desired exceeds a maximum (either from Wasm or from the host) assert!(desired < maximum.unwrap_or(usize::MAX)); - assert_eq!(current as usize, self.wasm_memory_used); - let desired = desired as usize; + assert_eq!(current, self.wasm_memory_used); if desired + self.host_memory_used > self.memory_limit { self.limit_exceeded = true; @@ -524,8 +523,7 @@ impl ResourceLimiterAsync for MemoryContext { // Check if the desired exceeds a maximum (either from Wasm or from the host) assert!(desired < maximum.unwrap_or(usize::MAX)); - assert_eq!(current as usize, self.wasm_memory_used); - let desired = desired as usize; + assert_eq!(current, self.wasm_memory_used); if desired + self.host_memory_used > self.memory_limit { self.limit_exceeded = true; @@ -663,7 +661,7 @@ fn test_custom_table_limiter() -> Result<()> { let engine = Engine::default(); let linker = Linker::new(&engine); - let module = Module::new(&engine, r#"(module (table (export "t") 0 anyfunc))"#)?; + let module = Module::new(&engine, r#"(module (table (export "t") 0 funcref))"#)?; let context = TableContext { elements_used: 0, @@ -754,7 +752,7 @@ fn custom_limiter_detect_grow_failure() -> Result<()> { let module = Module::new( &engine, - r#"(module (memory (export "m") 0) (table (export "t") 0 anyfunc))"#, + r#"(module (memory (export "m") 0) (table (export "t") 0 funcref))"#, )?; let context = FailureDetector::default(); @@ -866,7 +864,7 @@ async fn custom_limiter_async_detect_grow_failure() -> Result<()> { let module = Module::new( &engine, - r#"(module (memory (export "m") 0) (table (export "t") 0 anyfunc))"#, + r#"(module (memory (export "m") 0) (table (export "t") 0 funcref))"#, )?; let context = FailureDetector::default(); @@ -1025,7 +1023,7 @@ fn panic_in_table_limiter() { let engine = Engine::default(); let linker = Linker::new(&engine); - let module = Module::new(&engine, r#"(module (table (export "t") 0 anyfunc))"#).unwrap(); + let module = Module::new(&engine, r#"(module (table (export "t") 0 funcref))"#).unwrap(); let mut store = Store::new(&engine, Panic); store.limiter(|s| s as &mut dyn ResourceLimiter); @@ -1097,7 +1095,7 @@ async fn panic_in_async_table_limiter() { let engine = Engine::new(&config).unwrap(); let linker = Linker::new(&engine); - let module = Module::new(&engine, r#"(module (table (export "t") 0 anyfunc))"#).unwrap(); + let module = Module::new(&engine, r#"(module (table (export "t") 0 funcref))"#).unwrap(); let mut store = Store::new(&engine, Panic); store.limiter_async(|s| s as &mut dyn ResourceLimiterAsync); @@ -1119,7 +1117,7 @@ fn growth_trap() -> Result<()> { &engine, r#"(module (memory $m (export "m") 0) - (table (export "t") 0 anyfunc) + (table (export "t") 0 funcref) (func (export "grow") (param i32) (result i32) (memory.grow $m (local.get 0))) )"#, diff --git a/tests/all/main.rs b/tests/all/main.rs index cffe15555558..bb8ac88b0571 100644 --- a/tests/all/main.rs +++ b/tests/all/main.rs @@ -27,6 +27,7 @@ mod memory_creator; mod module; mod module_serialize; mod name; +mod piped_tests; mod pooling_allocator; mod relocs; mod stack_creator; @@ -92,6 +93,12 @@ pub(crate) fn small_pool_config() -> wasmtime::PoolingAllocationConfig { config.total_tables(1); config.table_elements(10); + // When testing, we may choose to start with MPK force-enabled to ensure + // we use that functionality. + if std::env::var("WASMTIME_TEST_FORCE_MPK").is_ok() { + config.memory_protection_keys(wasmtime_runtime::MpkEnabled::Enable); + } + #[cfg(feature = "async")] config.total_stacks(1); diff --git a/tests/all/memory.rs b/tests/all/memory.rs index 4e2920200136..fa2cbadd88be 100644 --- a/tests/all/memory.rs +++ b/tests/all/memory.rs @@ -642,3 +642,21 @@ fn shared_memory_wait_notify() -> Result<()> { Ok(()) } + +#[test] +#[cfg_attr(miri, ignore)] +fn init_with_negative_segment() -> Result<()> { + let engine = Engine::default(); + let module = Module::new( + &engine, + r#" + (module + (memory 65536) + (data (i32.const 0x8000_0000) "x") + ) + "#, + )?; + let mut store = Store::new(&engine, ()); + Instance::new(&mut store, &module, &[])?; + Ok(()) +} diff --git a/tests/all/memory_creator.rs b/tests/all/memory_creator.rs index 3984b2e00c42..5c1cc72c2360 100644 --- a/tests/all/memory_creator.rs +++ b/tests/all/memory_creator.rs @@ -28,6 +28,9 @@ mod not_for_windows { let mem = mmap_anonymous(null_mut(), size, ProtFlags::empty(), MapFlags::PRIVATE) .expect("mmap failed"); + // NOTE: mmap_anonymous returns zero initialized memory, which is relied upon by this + // API. + mprotect(mem, minimum, MprotectFlags::READ | MprotectFlags::WRITE) .expect("mprotect failed"); *glob_counter.lock().unwrap() += minimum; @@ -77,7 +80,7 @@ mod not_for_windows { } fn wasm_accessible(&self) -> Range { - let base = self.mem as usize; + let base = self.mem; let end = base + self.size; base..end } diff --git a/tests/all/piped_tests.rs b/tests/all/piped_tests.rs new file mode 100644 index 000000000000..b4bda7ce3f5a --- /dev/null +++ b/tests/all/piped_tests.rs @@ -0,0 +1,69 @@ +#![cfg(not(miri))] + +use super::cli_tests::get_wasmtime_command; +use anyhow::Result; +use std::process::Stdio; + +pub fn run_wasmtime_piped(component_path: &str) -> Result<()> { + let mut producer = get_wasmtime_command()? + .arg("run") + .arg("-Wcomponent-model") + .arg("--env") + .arg("PIPED_SIDE=PRODUCER") + .arg(component_path) + .stdout(Stdio::piped()) + .spawn()?; + + let mut consumer = get_wasmtime_command()? + .arg("run") + .arg("-Wcomponent-model") + .arg("--env") + .arg("PIPED_SIDE=CONSUMER") + .arg(component_path) + .stdin(producer.stdout.take().unwrap()) + .spawn()?; + + let producer = producer.wait()?; + if !producer.success() { + // make sure the consumer gets killed off + if consumer.try_wait().is_err() { + consumer.kill().expect("Failed to kill consumer"); + } + + panic!("Producer failed"); + } + + assert!(consumer.wait()?.success(), "Consumer failed"); + + Ok(()) +} + +mod test_programs { + use super::run_wasmtime_piped; + use test_programs_artifacts::*; + + macro_rules! assert_test_exists { + ($name:ident) => { + #[allow(unused_imports)] + use self::$name as _; + }; + } + foreach_piped!(assert_test_exists); + + // Below here is mechanical: there should be one test for every binary in + // wasi-tests. + #[test] + fn piped_simple() { + run_wasmtime_piped(PIPED_SIMPLE_COMPONENT).unwrap() + } + + #[test] + fn piped_multiple() { + run_wasmtime_piped(PIPED_MULTIPLE_COMPONENT).unwrap() + } + + #[test] + fn piped_polling() { + run_wasmtime_piped(PIPED_POLLING_COMPONENT).unwrap() + } +} diff --git a/tests/all/pooling_allocator.rs b/tests/all/pooling_allocator.rs index b79f10d6a6e9..86f221306fa1 100644 --- a/tests/all/pooling_allocator.rs +++ b/tests/all/pooling_allocator.rs @@ -650,13 +650,22 @@ fn instance_too_large() -> Result<()> { config.allocation_strategy(InstanceAllocationStrategy::Pooling(pool)); let engine = Engine::new(&config)?; - let expected = "\ + let expected = if cfg!(feature = "wmemcheck") { + "\ +instance allocation for this module requires 336 bytes which exceeds the \ +configured maximum of 16 bytes; breakdown of allocation requirement: + + * 76.19% - 256 bytes - instance state management +" + } else { + "\ instance allocation for this module requires 240 bytes which exceeds the \ configured maximum of 16 bytes; breakdown of allocation requirement: * 66.67% - 160 bytes - instance state management * 6.67% - 16 bytes - jit store state -"; +" + }; match Module::new(&engine, "(module)") { Ok(_) => panic!("should have failed to compile"), Err(e) => assert_eq!(e.to_string(), expected), @@ -668,13 +677,23 @@ configured maximum of 16 bytes; breakdown of allocation requirement: } lots_of_globals.push_str(")"); - let expected = "\ + let expected = if cfg!(feature = "wmemcheck") { + "\ +instance allocation for this module requires 1936 bytes which exceeds the \ +configured maximum of 16 bytes; breakdown of allocation requirement: + + * 13.22% - 256 bytes - instance state management + * 82.64% - 1600 bytes - defined globals +" + } else { + "\ instance allocation for this module requires 1840 bytes which exceeds the \ configured maximum of 16 bytes; breakdown of allocation requirement: * 8.70% - 160 bytes - instance state management * 86.96% - 1600 bytes - defined globals -"; +" + }; match Module::new(&engine, &lots_of_globals) { Ok(_) => panic!("should have failed to compile"), Err(e) => assert_eq!(e.to_string(), expected), @@ -947,7 +966,7 @@ async fn total_stacks_limit() -> Result<()> { linker.func_new_async( "async", "yield", - FuncType::new([], []), + FuncType::new(&engine, [], []), |_caller, _params, _results| { Box::new(async { tokio::task::yield_now().await; diff --git a/tests/all/stack_creator.rs b/tests/all/stack_creator.rs index 5b46d8942a2c..9545908d1a18 100644 --- a/tests/all/stack_creator.rs +++ b/tests/all/stack_creator.rs @@ -55,6 +55,8 @@ impl CustomStackCreator { let mem = System.alloc(layout); let notnull = NonNull::new(mem); if let Some(mem) = notnull { + // It's required that stack memory is zeroed for wasmtime + libc::memset(mem.as_ptr().cast(), 0, layout.size()); // Mark guard page as protected rustix::mm::mprotect( mem.as_ptr().cast(), @@ -133,7 +135,7 @@ async fn called_on_custom_heap_stack() -> Result<()> { "#, )?; - let ty = FuncType::new([], [ValType::I64]); + let ty = FuncType::new(store.engine(), [], [ValType::I64]); let host_func = Func::new(&mut store, ty, move |_caller, _params, results| { let foo = 42; // output an address on the stack diff --git a/tests/all/traps.rs b/tests/all/traps.rs index cb33af235b49..1cfc97ae6a0e 100644 --- a/tests/all/traps.rs +++ b/tests/all/traps.rs @@ -17,7 +17,7 @@ fn test_trap_return() -> Result<()> { "#; let module = Module::new(store.engine(), wat)?; - let hello_type = FuncType::new(None, None); + let hello_type = FuncType::new(store.engine(), None, None); let hello_func = Func::new(&mut store, hello_type, |_, _, _| bail!("test 123")); let instance = Instance::new(&mut store, &module, &[hello_func.into()])?; @@ -45,7 +45,7 @@ fn test_anyhow_error_return() -> Result<()> { "#; let module = Module::new(store.engine(), wat)?; - let hello_type = FuncType::new(None, None); + let hello_type = FuncType::new(store.engine(), None, None); let hello_func = Func::new(&mut store, hello_type, |_, _, _| { Err(anyhow::Error::msg("test 1234")) }); @@ -83,7 +83,7 @@ fn test_trap_return_downcast() -> Result<()> { impl std::error::Error for MyTrap {} let module = Module::new(store.engine(), wat)?; - let hello_type = FuncType::new(None, None); + let hello_type = FuncType::new(store.engine(), None, None); let hello_func = Func::new(&mut store, hello_type, |_, _, _| { Err(anyhow::Error::from(MyTrap)) }); @@ -169,7 +169,7 @@ fn test_trap_through_host() -> Result<()> { let host_func_a = Func::new( &mut store, - FuncType::new(vec![], vec![]), + FuncType::new(&engine, vec![], vec![]), |mut caller, _args, _results| { caller .get_export("b") @@ -182,7 +182,7 @@ fn test_trap_through_host() -> Result<()> { ); let host_func_b = Func::new( &mut store, - FuncType::new(vec![], vec![]), + FuncType::new(&engine, vec![], vec![]), |mut caller, _args, _results| { caller .get_export("c") @@ -243,7 +243,7 @@ fn test_trap_trace_cb() -> Result<()> { ) "#; - let fn_type = FuncType::new(None, None); + let fn_type = FuncType::new(store.engine(), None, None); let fn_func = Func::new(&mut store, fn_type, |_, _, _| bail!("cb throw")); let module = Module::new(store.engine(), wat)?; @@ -382,7 +382,7 @@ fn trap_start_function_import() -> Result<()> { )?; let module = Module::new(store.engine(), &binary)?; - let sig = FuncType::new(None, None); + let sig = FuncType::new(store.engine(), None, None); let func = Func::new(&mut store, sig, |_, _, _| bail!("user trap")); let err = Instance::new(&mut store, &module, &[func.into()]).unwrap_err(); assert!(format!("{err:?}").contains("user trap")); @@ -404,7 +404,7 @@ fn rust_panic_import() -> Result<()> { )?; let module = Module::new(store.engine(), &binary)?; - let sig = FuncType::new(None, None); + let sig = FuncType::new(store.engine(), None, None); let func = Func::new(&mut store, sig, |_, _, _| panic!("this is a panic")); let func2 = Func::wrap(&mut store, || panic!("this is another panic")); let instance = Instance::new(&mut store, &module, &[func.into(), func2.into()])?; @@ -448,7 +448,7 @@ fn rust_catch_panic_import() -> Result<()> { let module = Module::new(store.engine(), &binary)?; let num_panics = std::sync::Arc::new(std::sync::atomic::AtomicU32::new(0)); - let sig = FuncType::new(None, None); + let sig = FuncType::new(store.engine(), None, None); let panic = Func::new(&mut store, sig, { let num_panics = num_panics.clone(); move |_, _, _| { @@ -493,7 +493,7 @@ fn rust_panic_start_function() -> Result<()> { )?; let module = Module::new(store.engine(), &binary)?; - let sig = FuncType::new(None, None); + let sig = FuncType::new(store.engine(), None, None); let func = Func::new(&mut store, sig, |_, _, _| panic!("this is a panic")); let err = panic::catch_unwind(AssertUnwindSafe(|| { drop(Instance::new(&mut store, &module, &[func.into()])); @@ -558,7 +558,7 @@ fn call_signature_mismatch() -> Result<()> { (func $bar (param i32)) (start $foo) - (table 1 anyfunc) + (table 1 funcref) (elem (i32.const 0) 1) ) "#, @@ -754,10 +754,10 @@ fn parse_dwarf_info() -> Result<()> { let engine = Engine::new(&config)?; let module = Module::new(&engine, &wasm)?; let mut linker = Linker::new(&engine); - wasmtime_wasi::add_to_linker(&mut linker, |s| s)?; + wasi_common::sync::add_to_linker(&mut linker, |s| s)?; let mut store = Store::new( &engine, - wasmtime_wasi::sync::WasiCtxBuilder::new() + wasi_common::sync::WasiCtxBuilder::new() .inherit_stdio() .build(), ); @@ -1349,12 +1349,13 @@ fn wasm_fault_address_reported_by_default() -> Result<()> { // NB: at this time there's no programmatic access to the fault address // because it's not always available for load/store traps. Only static - // memories on 32-bit have this information, but bounds-checked memories - // use manual trapping instructions and otherwise don't have a means of + // memories on 32-bit have this information, but bounds-checked memories use + // manual trapping instructions and otherwise don't have a means of // communicating the faulting address at this time. // // It looks like the exact reported fault address may not be deterministic, - // so assert that we have the right error message, but not the exact address. + // so assert that we have the right error message, but not the exact + // address. let err = format!("{err:?}"); assert!( err.contains("memory fault at wasm address ") @@ -1364,6 +1365,44 @@ fn wasm_fault_address_reported_by_default() -> Result<()> { Ok(()) } +#[cfg(target_arch = "x86_64")] +#[test] +fn wasm_fault_address_reported_from_mpk_protected_memory() -> Result<()> { + // Trigger the case where an OOB memory access causes a segfault and the + // store attempts to convert it into a `WasmFault`, calculating the Wasm + // address from the raw faulting address. Previously, a store could not do + // this calculation for MPK-protected, causing an abort. + let mut pool = crate::small_pool_config(); + pool.total_memories(16); + pool.memory_protection_keys(MpkEnabled::Auto); + let mut config = Config::new(); + config.allocation_strategy(InstanceAllocationStrategy::Pooling(pool)); + let engine = Engine::new(&config)?; + + let mut store = Store::new(&engine, ()); + let module = Module::new( + &engine, + r#" + (module + (memory 1) + (func $start + i32.const 0xdeadbeef + i32.load + drop) + (start $start) + ) + "#, + )?; + let err = Instance::new(&mut store, &module, &[]).unwrap_err(); + + // We expect an error here, not an abort; but we also check that the store + // can now calculate the correct Wasm address. If this test is failing with + // an abort, use `--nocapture` to see more details. + let err = format!("{err:?}"); + assert!(err.contains("0xdeadbeef"), "bad error: {err}"); + Ok(()) +} + #[test] fn trap_with_array_to_wasm_stack_args() -> Result<()> { let engine = Engine::default(); @@ -1496,14 +1535,14 @@ fn dont_see_stale_stack_walking_registers() -> Result<()> { let host_start = Func::new( &mut store, - FuncType::new([], []), + FuncType::new(&engine, [], []), |_caller, _args, _results| Ok(()), ); linker.define(&store, "", "host_start", host_start)?; let host_get_trap = Func::new( &mut store, - FuncType::new([], []), + FuncType::new(&engine, [], []), |_caller, _args, _results| Err(anyhow::anyhow!("trap!!!")), ); linker.define(&store, "", "host_get_trap", host_get_trap)?; @@ -1554,7 +1593,7 @@ fn same_module_multiple_stores() -> Result<()> { let stacks = Arc::new(Mutex::new(vec![])); let mut store3 = Store::new(&engine, ()); - let f3 = Func::new(&mut store3, FuncType::new([], []), { + let f3 = Func::new(&mut store3, FuncType::new(&engine, [], []), { let stacks = stacks.clone(); move |caller, _params, _results| { stacks @@ -1570,7 +1609,7 @@ fn same_module_multiple_stores() -> Result<()> { let instance3 = Instance::new(&mut store3, &module, &[f3.into(), call_ref3.into()])?; let mut store2 = Store::new(&engine, store3); - let f2 = Func::new(&mut store2, FuncType::new([], []), { + let f2 = Func::new(&mut store2, FuncType::new(&engine, [], []), { let stacks = stacks.clone(); move |mut caller, _params, _results| { stacks @@ -1591,7 +1630,7 @@ fn same_module_multiple_stores() -> Result<()> { let instance2 = Instance::new(&mut store2, &module, &[f2.into(), call_ref2.into()])?; let mut store1 = Store::new(&engine, store2); - let f1 = Func::new(&mut store1, FuncType::new([], []), { + let f1 = Func::new(&mut store1, FuncType::new(&engine, [], []), { let stacks = stacks.clone(); move |mut caller, _params, _results| { stacks diff --git a/tests/all/wast.rs b/tests/all/wast.rs index 5b93799aba9e..01f184cbaf8f 100644 --- a/tests/all/wast.rs +++ b/tests/all/wast.rs @@ -7,6 +7,7 @@ use wasmtime::{ Config, Engine, InstanceAllocationStrategy, PoolingAllocationConfig, Store, Strategy, }; use wasmtime_environ::WASM_PAGE_SIZE; +use wasmtime_runtime::MpkEnabled; use wasmtime_wast::WastContext; include!(concat!(env!("OUT_DIR"), "/wast_testsuite_tests.rs")); @@ -133,6 +134,13 @@ fn run_wast(wast: &str, strategy: Strategy, pooling: bool) -> anyhow::Result<()> .memory_pages(805) .max_memories_per_module(if multi_memory { 9 } else { 1 }) .max_tables_per_module(4); + + // When testing, we may choose to start with MPK force-enabled to ensure + // we use that functionality. + if std::env::var("WASMTIME_TEST_FORCE_MPK").is_ok() { + pool.memory_protection_keys(MpkEnabled::Enable); + } + cfg.allocation_strategy(InstanceAllocationStrategy::Pooling(pool)); Some(lock_pooling()) } else { diff --git a/tests/misc_testsuite/int-to-float-splat.wast b/tests/misc_testsuite/int-to-float-splat.wast new file mode 100644 index 000000000000..2a6110200293 --- /dev/null +++ b/tests/misc_testsuite/int-to-float-splat.wast @@ -0,0 +1,15 @@ +(module + (func (param i32) (result v128) + local.get 0 + i32x4.splat + f64x2.convert_low_i32x4_u + ) +) + +(module + (func (result v128) + i32.const 0 + i32x4.splat + f64x2.convert_low_i32x4_u + ) +) diff --git a/tests/misc_testsuite/rs2wasm-add-func.wast b/tests/misc_testsuite/rs2wasm-add-func.wast index 89af3ffc4dca..660cd87434dd 100644 --- a/tests/misc_testsuite/rs2wasm-add-func.wast +++ b/tests/misc_testsuite/rs2wasm-add-func.wast @@ -6,7 +6,7 @@ local.get 0 i32.add) (func $start (type 0)) - (table (;0;) 1 1 anyfunc) + (table (;0;) 1 1 funcref) (memory (;0;) 17) (global (;0;) i32 (i32.const 1049114)) (global (;1;) i32 (i32.const 1049114)) diff --git a/tests/misc_testsuite/winch/block.wast b/tests/misc_testsuite/winch/block.wast deleted file mode 100644 index 6a1a9c65e0da..000000000000 --- a/tests/misc_testsuite/winch/block.wast +++ /dev/null @@ -1,198 +0,0 @@ -;; Test `block` operator - -(module - ;; Auxiliary definition - (memory 1) - - (func $dummy) - - (func (export "empty") - (block) - (block $l) - ) - - (func (export "singular") (result i32) - (block (nop)) - (block (result i32) (i32.const 7)) - ) - - (func (export "nested") (result i32) - (block (result i32) - (block (call $dummy) (block) (nop)) - (block (result i32) (call $dummy) (i32.const 9)) - ) - ) - - (func (export "as-br_table-first") (result i32) - (block (result i32) (block (result i32) (i32.const 1)) (i32.const 2) (br_table 0 0)) - ) - (func (export "as-br_table-last") (result i32) - (block (result i32) (i32.const 2) (block (result i32) (i32.const 1)) (br_table 0 0)) - ) - - (func (export "break-bare") (result i32) - (block (br 0) (unreachable)) - (block (br_if 0 (i32.const 1)) (unreachable)) - (block (br_table 0 (i32.const 0)) (unreachable)) - (block (br_table 0 0 0 (i32.const 1)) (unreachable)) - (i32.const 19) - ) - - (func (export "break-repeated") (result i32) - (block (result i32) - (br 0 (i32.const 18)) - (br 0 (i32.const 19)) - (drop (br_if 0 (i32.const 20) (i32.const 0))) - (drop (br_if 0 (i32.const 20) (i32.const 1))) - (br 0 (i32.const 21)) - (br_table 0 (i32.const 22) (i32.const 4)) - (br_table 0 0 0 (i32.const 23) (i32.const 1)) - (i32.const 21) - ) - ) - - (func (export "deep") (result i32) - (block (result i32) (block (result i32) - (block (result i32) (block (result i32) - (block (result i32) (block (result i32) - (block (result i32) (block (result i32) - (block (result i32) (block (result i32) - (block (result i32) (block (result i32) - (block (result i32) (block (result i32) - (block (result i32) (block (result i32) - (block (result i32) (block (result i32) - (block (result i32) (block (result i32) - (block (result i32) (block (result i32) - (block (result i32) (block (result i32) - (block (result i32) (block (result i32) - (block (result i32) (block (result i32) - (block (result i32) (block (result i32) - (block (result i32) (block (result i32) - (block (result i32) (block (result i32) - (block (result i32) (block (result i32) - (block (result i32) (block (result i32) - (call $dummy) (i32.const 150) - )) - )) - )) - )) - )) - )) - )) - )) - )) - )) - )) - )) - )) - )) - )) - )) - )) - )) - )) - ) - - (func (export "as-if-condition") - (block (result i32) (i32.const 1)) (if (then (call $dummy))) - ) - (func (export "as-if-then") (result i32) - (if (result i32) (i32.const 1) (then (block (result i32) (i32.const 1))) (else (i32.const 2))) - ) - (func (export "as-if-else") (result i32) - (if (result i32) (i32.const 1) (then (i32.const 2)) (else (block (result i32) (i32.const 1)))) - ) - - (func (export "as-br_if-first") (result i32) - (block (result i32) (br_if 0 (block (result i32) (i32.const 1)) (i32.const 2))) - ) - (func (export "as-br_if-last") (result i32) - (block (result i32) (br_if 0 (i32.const 2) (block (result i32) (i32.const 1)))) - ) - - - (func $f (param i32) (result i32) (local.get 0)) - - (func (export "as-call-value") (result i32) - (call $f (block (result i32) (i32.const 1))) - ) - (func (export "as-return-value") (result i32) - (block (result i32) (i32.const 1)) (return) - ) - (func (export "as-drop-operand") - (drop (block (result i32) (i32.const 1))) - ) - (func (export "as-br-value") (result i32) - (block (result i32) (br 0 (block (result i32) (i32.const 1)))) - ) - (func (export "as-local.set-value") (result i32) - (local i32) (local.set 0 (block (result i32) (i32.const 1))) (local.get 0) - ) - - (func (export "as-unary-operand") (result i32) - (i32.ctz (block (result i32) (call $dummy) (i32.const 13))) - ) - (func (export "as-binary-operand") (result i32) - (i32.mul - (block (result i32) (call $dummy) (i32.const 3)) - (block (result i32) (call $dummy) (i32.const 4)) - ) - ) - (func (export "as-test-operand") (result i32) - (i32.eqz (block (result i32) (call $dummy) (i32.const 13))) - ) - (func (export "break-value") (result i32) - (block (result i32) (br 0 (i32.const 18)) (i32.const 19)) - ) - (func (export "break-inner") (result i32) - (local i32) - (local.set 0 (i32.const 0)) - (local.set 0 (i32.add (local.get 0) (block (result i32) (block (result i32) (br 1 (i32.const 0x1)))))) - (local.set 0 (i32.add (local.get 0) (block (result i32) (block (br 0)) (i32.const 0x2)))) - (local.set 0 - (i32.add (local.get 0) (block (result i32) (i32.ctz (br 0 (i32.const 0x4))))) - ) - (local.set 0 - (i32.add (local.get 0) (block (result i32) (i32.ctz (block (result i32) (br 1 (i32.const 0x8)))))) - ) - (local.get 0) - ) - - (func (export "effects") (result i32) - (local i32) - (block - (local.set 0 (i32.const 1)) - (local.set 0 (i32.mul (local.get 0) (i32.const 3))) - (local.set 0 (i32.sub (local.get 0) (i32.const 5))) - (local.set 0 (i32.mul (local.get 0) (i32.const 7))) - (br 0) - (local.set 0 (i32.mul (local.get 0) (i32.const 100))) - ) - (i32.eq (local.get 0) (i32.const -14)) - ) -) - -(assert_return (invoke "empty")) -(assert_return (invoke "singular") (i32.const 7)) -(assert_return (invoke "nested") (i32.const 9)) -(assert_return (invoke "deep") (i32.const 150)) -(assert_return (invoke "as-if-condition")) -(assert_return (invoke "as-if-then") (i32.const 1)) -(assert_return (invoke "as-if-else") (i32.const 2)) -(assert_return (invoke "as-br_if-first") (i32.const 1)) -(assert_return (invoke "as-br_if-last") (i32.const 2)) -(assert_return (invoke "as-call-value") (i32.const 1)) -(assert_return (invoke "as-return-value") (i32.const 1)) -(assert_return (invoke "as-drop-operand")) -(assert_return (invoke "as-br-value") (i32.const 1)) -(assert_return (invoke "as-local.set-value") (i32.const 1)) -(assert_return (invoke "as-unary-operand") (i32.const 0)) -(assert_return (invoke "as-binary-operand") (i32.const 12)) -(assert_return (invoke "as-test-operand") (i32.const 0)) -(assert_return (invoke "break-inner") (i32.const 0xf)) -(assert_return (invoke "effects") (i32.const 1)) - -(assert_return (invoke "as-br_table-first") (i32.const 1)) -(assert_return (invoke "as-br_table-last") (i32.const 2)) -(assert_return (invoke "break-bare") (i32.const 19)) -(assert_return (invoke "break-repeated") (i32.const 18)) diff --git a/tests/misc_testsuite/winch/br.wast b/tests/misc_testsuite/winch/br.wast deleted file mode 100644 index 012c203a4e4a..000000000000 --- a/tests/misc_testsuite/winch/br.wast +++ /dev/null @@ -1,262 +0,0 @@ -;; Test `br` operator - -(module - ;; Auxiliary definition - (func $dummy) - - (func (export "type-i32-value") (result i32) - (block (result i32) (i32.ctz (br 0 (i32.const 1)))) - ) - (func (export "type-i64-value") (result i64) - (block (result i64) (i64.ctz (br 0 (i64.const 2)))) - ) - - (func (export "as-block-first") - (block (br 0) (call $dummy)) - ) - (func (export "as-block-mid") - (block (call $dummy) (br 0) (call $dummy)) - ) - (func (export "as-block-last") - (block (nop) (call $dummy) (br 0)) - ) - (func (export "as-block-value") (result i32) - (block (result i32) (nop) (call $dummy) (br 0 (i32.const 2))) - ) - - (func (export "as-loop-first") (result i32) - (block (result i32) (loop (result i32) (br 1 (i32.const 3)) (i32.const 2))) - ) - (func (export "as-loop-mid") (result i32) - (block (result i32) - (loop (result i32) (call $dummy) (br 1 (i32.const 4)) (i32.const 2)) - ) - ) - (func (export "as-loop-last") (result i32) - (block (result i32) - (loop (result i32) (nop) (call $dummy) (br 1 (i32.const 5))) - ) - ) - - (func (export "as-br-value") (result i32) - (block (result i32) (br 0 (br 0 (i32.const 9)))) - ) - - (func (export "as-br_if-cond") - (block (br_if 0 (br 0))) - ) - - (func (export "as-br_if-value") (result i32) - (block (result i32) - (drop (br_if 0 (br 0 (i32.const 8)) (i32.const 1))) (i32.const 7) - ) - ) - (func (export "as-br_if-value-cond") (result i32) - (block (result i32) - (drop (br_if 0 (i32.const 6) (br 0 (i32.const 9)))) (i32.const 7) - ) - ) - - (func (export "as-return-value") (result i64) - (block (result i64) (return (br 0 (i64.const 7)))) - ) - - (func (export "as-if-cond") (result i32) - (block (result i32) - (if (result i32) (br 0 (i32.const 2)) - (then (i32.const 0)) - (else (i32.const 1)) - ) - ) - ) - (func (export "as-if-then") (param i32 i32) (result i32) - (block (result i32) - (if (result i32) (local.get 0) - (then (br 1 (i32.const 3))) - (else (local.get 1)) - ) - ) - ) - (func (export "as-if-else") (param i32 i32) (result i32) - (block (result i32) - (if (result i32) (local.get 0) - (then (local.get 1)) - (else (br 1 (i32.const 4))) - ) - ) - ) - - - (func $f (param i32 i32 i32) (result i32) (i32.const -1)) - (func (export "as-call-first") (result i32) - (block (result i32) - (call $f (br 0 (i32.const 12)) (i32.const 2) (i32.const 3)) - ) - ) - (func (export "as-call-mid") (result i32) - (block (result i32) - (call $f (i32.const 1) (br 0 (i32.const 13)) (i32.const 3)) - ) - ) - (func (export "as-call-last") (result i32) - (block (result i32) - (call $f (i32.const 1) (i32.const 2) (br 0 (i32.const 14))) - ) - ) - (func (export "as-call-all") (result i32) - (block (result i32) (call $f (br 0 (i32.const 15)))) - ) - - (func (export "as-binary-left") (result i32) - (block (result i32) (i32.add (br 0 (i32.const 3)) (i32.const 10))) - ) - (func (export "as-binary-right") (result i64) - (block (result i64) (i64.sub (i64.const 10) (br 0 (i64.const 45)))) - ) - (func (export "as-binary-both") (result i32) - (block (result i32) (i32.add (br 0 (i32.const 46)))) - ) - - (func (export "as-test-operand") (result i32) - (block (result i32) (i32.eqz (br 0 (i32.const 44)))) - ) - - (func (export "nested-block-value") (result i32) - (i32.add - (i32.const 1) - (block (result i32) - (call $dummy) - (i32.add (i32.const 4) (br 0 (i32.const 8))) - ) - ) - ) - - (func (export "nested-br-value") (result i32) - (i32.add - (i32.const 1) - (block (result i32) - (drop (i32.const 2)) - (drop - (block (result i32) - (drop (i32.const 4)) - (br 0 (br 1 (i32.const 8))) - ) - ) - (i32.const 16) - ) - ) - ) - - (func (export "nested-br_if-value") (result i32) - (i32.add - (i32.const 1) - (block (result i32) - (drop (i32.const 2)) - (drop - (block (result i32) - (drop (i32.const 4)) - (drop (br_if 0 (br 1 (i32.const 8)) (i32.const 1))) - (i32.const 32) - ) - ) - (i32.const 16) - ) - ) - ) - - (func (export "nested-br_if-value-cond") (result i32) - (i32.add - (i32.const 1) - (block (result i32) - (drop (i32.const 2)) - (drop (br_if 0 (i32.const 4) (br 0 (i32.const 8)))) - (i32.const 16) - ) - ) - ) - - (func (export "as-br_table-index") - (block (br_table 0 0 0 (br 0))) - ) - (func (export "as-br_table-value") (result i32) - (block (result i32) - (br_table 0 0 0 (br 0 (i32.const 10)) (i32.const 1)) (i32.const 7) - ) - ) - (func (export "as-br_table-value-index") (result i32) - (block (result i32) - (br_table 0 0 (i32.const 6) (br 0 (i32.const 11))) (i32.const 7) - ) - ) - - (func (export "nested-br_table-value") (result i32) - (i32.add - (i32.const 1) - (block (result i32) - (drop (i32.const 2)) - (drop - (block (result i32) - (drop (i32.const 4)) - (br_table 0 (br 1 (i32.const 8)) (i32.const 1)) - ) - ) - (i32.const 16) - ) - ) - ) - - (func (export "nested-br_table-value-index") (result i32) - (i32.add - (i32.const 1) - (block (result i32) - (drop (i32.const 2)) - (br_table 0 (i32.const 4) (br 0 (i32.const 8))) - (i32.const 16) - ) - ) - ) -) - -(assert_return (invoke "type-i32-value") (i32.const 1)) -(assert_return (invoke "type-i64-value") (i64.const 2)) -(assert_return (invoke "as-block-first")) -(assert_return (invoke "as-block-mid")) -(assert_return (invoke "as-block-last")) -(assert_return (invoke "as-block-value") (i32.const 2)) -(assert_return (invoke "as-loop-first") (i32.const 3)) -(assert_return (invoke "as-loop-mid") (i32.const 4)) -(assert_return (invoke "as-loop-last") (i32.const 5)) -(assert_return (invoke "as-br-value") (i32.const 9)) -(assert_return (invoke "as-br_if-cond")) -(assert_return (invoke "as-br_if-value") (i32.const 8)) -(assert_return (invoke "as-br_if-value-cond") (i32.const 9)) -(assert_return (invoke "as-return-value") (i64.const 7)) - -(assert_return (invoke "as-if-cond") (i32.const 2)) -(assert_return (invoke "as-if-then" (i32.const 1) (i32.const 6)) (i32.const 3)) -(assert_return (invoke "as-if-then" (i32.const 0) (i32.const 6)) (i32.const 6)) -(assert_return (invoke "as-if-else" (i32.const 0) (i32.const 6)) (i32.const 4)) -(assert_return (invoke "as-if-else" (i32.const 1) (i32.const 6)) (i32.const 6)) - -(assert_return (invoke "as-call-first") (i32.const 12)) -(assert_return (invoke "as-call-mid") (i32.const 13)) -(assert_return (invoke "as-call-last") (i32.const 14)) -(assert_return (invoke "as-call-all") (i32.const 15)) - - -(assert_return (invoke "as-binary-left") (i32.const 3)) -(assert_return (invoke "as-binary-right") (i64.const 45)) -(assert_return (invoke "as-binary-both") (i32.const 46)) - -(assert_return (invoke "as-test-operand") (i32.const 44)) - -(assert_return (invoke "nested-block-value") (i32.const 9)) -(assert_return (invoke "nested-br-value") (i32.const 9)) -(assert_return (invoke "nested-br_if-value") (i32.const 9)) -(assert_return (invoke "nested-br_if-value-cond") (i32.const 9)) - -(assert_return (invoke "as-br_table-index")) -(assert_return (invoke "as-br_table-value") (i32.const 10)) -(assert_return (invoke "as-br_table-value-index") (i32.const 11)) -(assert_return (invoke "nested-br_table-value") (i32.const 9)) -(assert_return (invoke "nested-br_table-value-index") (i32.const 9)) diff --git a/tests/misc_testsuite/winch/br_if.wast b/tests/misc_testsuite/winch/br_if.wast deleted file mode 100644 index b2957525f9fb..000000000000 --- a/tests/misc_testsuite/winch/br_if.wast +++ /dev/null @@ -1,317 +0,0 @@ -;; Test `br_if` operator - -(module - (func $dummy) - - (func (export "type-i32-value") (result i32) - (block (result i32) (i32.ctz (br_if 0 (i32.const 1) (i32.const 1)))) - ) - (func (export "type-i64-value") (result i64) - (block (result i64) (i64.ctz (br_if 0 (i64.const 2) (i32.const 1)))) - ) - - (func (export "as-block-first") (param i32) (result i32) - (block (br_if 0 (local.get 0)) (return (i32.const 2))) (i32.const 3) - ) - (func (export "as-block-mid") (param i32) (result i32) - (block (call $dummy) (br_if 0 (local.get 0)) (return (i32.const 2))) - (i32.const 3) - ) - (func (export "as-block-last") (param i32) - (block (call $dummy) (call $dummy) (br_if 0 (local.get 0))) - ) - (func (export "as-block-first-value") (param i32) (result i32) - (block (result i32) - (drop (br_if 0 (i32.const 10) (local.get 0))) (return (i32.const 11)) - ) - ) - (func (export "as-block-mid-value") (param i32) (result i32) - (block (result i32) - (call $dummy) - (drop (br_if 0 (i32.const 20) (local.get 0))) - (return (i32.const 21)) - ) - ) - (func (export "as-block-last-value") (param i32) (result i32) - (block (result i32) - (call $dummy) (call $dummy) (br_if 0 (i32.const 11) (local.get 0)) - ) - ) - - (func (export "as-loop-first") (param i32) (result i32) - (block (loop (br_if 1 (local.get 0)) (return (i32.const 2)))) (i32.const 3) - ) - (func (export "as-loop-mid") (param i32) (result i32) - (block (loop (call $dummy) (br_if 1 (local.get 0)) (return (i32.const 2)))) - (i32.const 4) - ) - (func (export "as-loop-last") (param i32) - (loop (call $dummy) (br_if 1 (local.get 0))) - ) - - (func (export "as-br-value") (result i32) - (block (result i32) (br 0 (br_if 0 (i32.const 1) (i32.const 2)))) - ) - - (func (export "as-br_if-value") (result i32) - (block (result i32) - (drop (br_if 0 (br_if 0 (i32.const 1) (i32.const 2)) (i32.const 3))) - (i32.const 4) - ) - ) - (func (export "as-br_if-value-cond") (param i32) (result i32) - (block (result i32) - (drop (br_if 0 (i32.const 2) (br_if 0 (i32.const 1) (local.get 0)))) - (i32.const 4) - ) - ) - - (func (export "as-br_if-cond") - (block (br_if 0 (br_if 0 (i32.const 1) (i32.const 1)))) - ) - - (func (export "as-return-value") (result i64) - (block (result i64) (return (br_if 0 (i64.const 1) (i32.const 2)))) - ) - - (func (export "as-if-cond") (param i32) (result i32) - (block (result i32) - (if (result i32) - (br_if 0 (i32.const 1) (local.get 0)) - (then (i32.const 2)) - (else (i32.const 3)) - ) - ) - ) - (func (export "as-if-then") (param i32 i32) - (block - (if (local.get 0) (then (br_if 1 (local.get 1))) (else (call $dummy))) - ) - ) - (func (export "as-if-else") (param i32 i32) - (block - (if (local.get 0) (then (call $dummy)) (else (br_if 1 (local.get 1)))) - ) - ) - - (func $f (param i32 i32 i32) (result i32) (i32.const -1)) - (func (export "as-call-first") (result i32) - (block (result i32) - (call $f - (br_if 0 (i32.const 12) (i32.const 1)) (i32.const 2) (i32.const 3) - ) - ) - ) - (func (export "as-call-mid") (result i32) - (block (result i32) - (call $f - (i32.const 1) (br_if 0 (i32.const 13) (i32.const 1)) (i32.const 3) - ) - ) - ) - (func (export "as-call-last") (result i32) - (block (result i32) - (call $f - (i32.const 1) (i32.const 2) (br_if 0 (i32.const 14) (i32.const 1)) - ) - ) - ) - - (func (export "as-local.set-value") (param i32) (result i32) - (local i32) - (block (result i32) - (local.set 0 (br_if 0 (i32.const 17) (local.get 0))) - (i32.const -1) - ) - ) - - (func (export "as-binary-left") (result i32) - (block (result i32) (i32.add (br_if 0 (i32.const 1) (i32.const 1)) (i32.const 10))) - ) - (func (export "as-binary-right") (result i32) - (block (result i32) (i32.sub (i32.const 10) (br_if 0 (i32.const 1) (i32.const 1)))) - ) - (func (export "as-test-operand") (result i32) - (block (result i32) (i32.eqz (br_if 0 (i32.const 0) (i32.const 1)))) - ) - (func (export "as-compare-left") (result i32) - (block (result i32) (i32.le_u (br_if 0 (i32.const 1) (i32.const 1)) (i32.const 10))) - ) - (func (export "as-compare-right") (result i32) - (block (result i32) (i32.ne (i32.const 10) (br_if 0 (i32.const 1) (i32.const 42)))) - ) - - (func (export "nested-block-value") (param i32) (result i32) - (i32.add - (i32.const 1) - (block (result i32) - (drop (i32.const 2)) - (i32.add - (i32.const 4) - (block (result i32) - (drop (br_if 1 (i32.const 8) (local.get 0))) - (i32.const 16) - ) - ) - ) - ) - ) - - (func (export "nested-br-value") (param i32) (result i32) - (i32.add - (i32.const 1) - (block (result i32) - (drop (i32.const 2)) - (br 0 - (block (result i32) - (drop (br_if 1 (i32.const 8) (local.get 0))) (i32.const 4) - ) - ) - (i32.const 16) - ) - ) - ) - - (func (export "nested-br_if-value") (param i32) (result i32) - (i32.add - (i32.const 1) - (block (result i32) - (drop (i32.const 2)) - (drop (br_if 0 - (block (result i32) - (drop (br_if 1 (i32.const 8) (local.get 0))) (i32.const 4) - ) - (i32.const 1) - )) - (i32.const 16) - ) - ) - ) - - (func (export "nested-br_if-value-cond") (param i32) (result i32) - (i32.add - (i32.const 1) - (block (result i32) - (drop (i32.const 2)) - (drop (br_if 0 - (i32.const 4) - (block (result i32) - (drop (br_if 1 (i32.const 8) (local.get 0))) (i32.const 1) - ) - )) - (i32.const 16) - ) - ) - ) - - (func (export "as-br_table-index") - (block (br_table 0 0 0 (br_if 0 (i32.const 1) (i32.const 2)))) - ) - (func (export "as-br_table-value") (result i32) - (block (result i32) - (br_table 0 0 0 (br_if 0 (i32.const 1) (i32.const 2)) (i32.const 3)) (i32.const 4) - ) - ) - (func (export "as-br_table-value-index") (result i32) - (block (result i32) - (br_table 0 0 (i32.const 2) (br_if 0 (i32.const 1) (i32.const 3))) (i32.const 4) - ) - ) - - (func (export "nested-br_table-value") (param i32) (result i32) - (i32.add - (i32.const 1) - (block (result i32) - (drop (i32.const 2)) - (br_table 0 - (block (result i32) - (drop (br_if 1 (i32.const 8) (local.get 0))) (i32.const 4) - ) - (i32.const 1) - ) - (i32.const 16) - ) - ) - ) - - (func (export "nested-br_table-value-index") (param i32) (result i32) - (i32.add - (i32.const 1) - (block (result i32) - (drop (i32.const 2)) - (br_table 0 - (i32.const 4) - (block (result i32) - (drop (br_if 1 (i32.const 8) (local.get 0))) (i32.const 1) - ) - ) - (i32.const 16) - ) - ) - ) -) - - -(assert_return (invoke "type-i32-value") (i32.const 1)) -(assert_return (invoke "type-i64-value") (i64.const 2)) -(assert_return (invoke "as-block-first" (i32.const 0)) (i32.const 2)) -(assert_return (invoke "as-block-first" (i32.const 1)) (i32.const 3)) -(assert_return (invoke "as-block-mid" (i32.const 0)) (i32.const 2)) -(assert_return (invoke "as-block-mid" (i32.const 1)) (i32.const 3)) -(assert_return (invoke "as-block-last" (i32.const 0))) -(assert_return (invoke "as-block-last" (i32.const 1))) -(assert_return (invoke "as-block-first-value" (i32.const 0)) (i32.const 11)) -(assert_return (invoke "as-block-first-value" (i32.const 1)) (i32.const 10)) -(assert_return (invoke "as-block-mid-value" (i32.const 0)) (i32.const 21)) -(assert_return (invoke "as-block-mid-value" (i32.const 1)) (i32.const 20)) -(assert_return (invoke "as-block-last-value" (i32.const 0)) (i32.const 11)) -(assert_return (invoke "as-block-last-value" (i32.const 1)) (i32.const 11)) -(assert_return (invoke "as-loop-first" (i32.const 0)) (i32.const 2)) -(assert_return (invoke "as-loop-first" (i32.const 1)) (i32.const 3)) -(assert_return (invoke "as-loop-mid" (i32.const 0)) (i32.const 2)) -(assert_return (invoke "as-loop-mid" (i32.const 1)) (i32.const 4)) -(assert_return (invoke "as-loop-last" (i32.const 0))) -(assert_return (invoke "as-loop-last" (i32.const 1))) -(assert_return (invoke "as-br-value") (i32.const 1)) -(assert_return (invoke "as-br_if-cond")) -(assert_return (invoke "as-return-value") (i64.const 1)) -(assert_return (invoke "as-if-cond" (i32.const 0)) (i32.const 2)) -(assert_return (invoke "as-if-cond" (i32.const 1)) (i32.const 1)) -(assert_return (invoke "as-if-then" (i32.const 0) (i32.const 0))) -(assert_return (invoke "as-if-then" (i32.const 4) (i32.const 0))) -(assert_return (invoke "as-if-then" (i32.const 0) (i32.const 1))) -(assert_return (invoke "as-if-then" (i32.const 4) (i32.const 1))) -(assert_return (invoke "as-if-else" (i32.const 0) (i32.const 0))) -(assert_return (invoke "as-if-else" (i32.const 3) (i32.const 0))) -(assert_return (invoke "as-if-else" (i32.const 0) (i32.const 1))) -(assert_return (invoke "as-if-else" (i32.const 3) (i32.const 1))) -(assert_return (invoke "as-call-first") (i32.const 12)) -(assert_return (invoke "as-call-mid") (i32.const 13)) -(assert_return (invoke "as-call-last") (i32.const 14)) -(assert_return (invoke "as-local.set-value" (i32.const 0)) (i32.const -1)) -(assert_return (invoke "as-local.set-value" (i32.const 1)) (i32.const 17)) -(assert_return (invoke "as-binary-left") (i32.const 1)) -(assert_return (invoke "as-binary-right") (i32.const 1)) -(assert_return (invoke "as-test-operand") (i32.const 0)) -(assert_return (invoke "as-compare-left") (i32.const 1)) -(assert_return (invoke "as-compare-right") (i32.const 1)) -(assert_return (invoke "as-br_if-value") (i32.const 1)) -(assert_return (invoke "as-br_if-value-cond" (i32.const 0)) (i32.const 2)) -(assert_return (invoke "as-br_if-value-cond" (i32.const 1)) (i32.const 1)) -(assert_return (invoke "nested-block-value" (i32.const 0)) (i32.const 21)) -(assert_return (invoke "nested-block-value" (i32.const 1)) (i32.const 9)) -(assert_return (invoke "nested-br-value" (i32.const 0)) (i32.const 5)) -(assert_return (invoke "nested-br-value" (i32.const 1)) (i32.const 9)) -(assert_return (invoke "nested-br_if-value" (i32.const 0)) (i32.const 5)) -(assert_return (invoke "nested-br_if-value" (i32.const 1)) (i32.const 9)) -(assert_return (invoke "nested-br_if-value-cond" (i32.const 0)) (i32.const 5)) -(assert_return (invoke "nested-br_if-value-cond" (i32.const 1)) (i32.const 9)) - -(assert_return (invoke "as-br_table-index")) -(assert_return (invoke "as-br_table-value") (i32.const 1)) -(assert_return (invoke "as-br_table-value-index") (i32.const 1)) - -(assert_return (invoke "nested-br_table-value" (i32.const 0)) (i32.const 5)) -(assert_return (invoke "nested-br_table-value" (i32.const 1)) (i32.const 9)) -(assert_return (invoke "nested-br_table-value-index" (i32.const 0)) (i32.const 5)) -(assert_return (invoke "nested-br_table-value-index" (i32.const 1)) (i32.const 9)) diff --git a/tests/misc_testsuite/winch/br_table.wast b/tests/misc_testsuite/winch/br_table.wast index 54784e13d00b..87e462b0e8c6 100644 --- a/tests/misc_testsuite/winch/br_table.wast +++ b/tests/misc_testsuite/winch/br_table.wast @@ -10,6 +10,25 @@ (func (export "type-i64") (block (drop (i64.ctz (br_table 0 0 (i32.const 0))))) ) + (func (export "type-f32") + (block (drop (f32.neg (br_table 0 0 (i32.const 0))))) + ) + (func (export "type-f64") + (block (drop (f64.neg (br_table 0 0 (i32.const 0))))) + ) + + (func (export "type-i32-value") (result i32) + (block (result i32) (i32.ctz (br_table 0 0 (i32.const 1) (i32.const 0)))) + ) + (func (export "type-i64-value") (result i64) + (block (result i64) (i64.ctz (br_table 0 0 (i64.const 2) (i32.const 0)))) + ) + (func (export "type-f32-value") (result f32) + (block (result f32) (f32.neg (br_table 0 0 (f32.const 3) (i32.const 0)))) + ) + (func (export "type-f64-value") (result f64) + (block (result f64) (f64.neg (br_table 0 0 (f64.const 4) (i32.const 0)))) + ) (func (export "empty") (param i32) (result i32) (block (br_table 0 (local.get 0)) (return (i32.const 21))) @@ -1119,10 +1138,50 @@ (i32.const 3) ) ) + + (memory 1) + (func (export "as-load-address") (result f32) + (block (result f32) (f32.load (br_table 0 (f32.const 1.7) (i32.const 1)))) + ) + (func (export "as-loadN-address") (result i64) + (block (result i64) (i64.load8_s (br_table 0 (i64.const 30) (i32.const 1)))) + ) + + (func (export "as-store-address") (result i32) + (block (result i32) + (f64.store (br_table 0 (i32.const 30) (i32.const 1)) (f64.const 7)) + (i32.const -1) + ) + ) + (func (export "as-store-value") (result i32) + (block (result i32) + (i64.store (i32.const 2) (br_table 0 (i32.const 31) (i32.const 1))) + (i32.const -1) + ) + ) + + (func (export "as-storeN-address") (result i32) + (block (result i32) + (i32.store8 (br_table 0 (i32.const 32) (i32.const 0)) (i32.const 7)) + (i32.const -1) + ) + ) + (func (export "as-storeN-value") (result i32) + (block (result i32) + (i64.store16 (i32.const 2) (br_table 0 (i32.const 33) (i32.const 0))) + (i32.const -1) + ) + ) ) (assert_return (invoke "type-i32")) (assert_return (invoke "type-i64")) +(assert_return (invoke "type-f32")) +(assert_return (invoke "type-f64")) +(assert_return (invoke "type-i32-value") (i32.const 1)) +(assert_return (invoke "type-i64-value") (i64.const 2)) +(assert_return (invoke "type-f32-value") (f32.const 3)) +(assert_return (invoke "type-f64-value") (f64.const 4)) (assert_return (invoke "empty" (i32.const 0)) (i32.const 22)) (assert_return (invoke "empty" (i32.const 1)) (i32.const 22)) @@ -1265,3 +1324,11 @@ (assert_return (invoke "nested-br_table-value-index" (i32.const 9423975)) (i32.const 9)) (assert_return (invoke "nested-br_table-loop-block" (i32.const 1)) (i32.const 3)) + +(assert_return (invoke "as-load-address") (f32.const 1.7)) +(assert_return (invoke "as-loadN-address") (i64.const 30)) + +(assert_return (invoke "as-store-address") (i32.const 30)) +(assert_return (invoke "as-store-value") (i32.const 31)) +(assert_return (invoke "as-storeN-address") (i32.const 32)) +(assert_return (invoke "as-storeN-value") (i32.const 33)) diff --git a/tests/misc_testsuite/winch/call.wast b/tests/misc_testsuite/winch/call.wast deleted file mode 100644 index 66d33db31a02..000000000000 --- a/tests/misc_testsuite/winch/call.wast +++ /dev/null @@ -1,242 +0,0 @@ -;; Test `call` operator - - -(module - ;; Auxiliary definitions - (func $const-i32 (result i32) (i32.const 0x132)) - (func $const-i64 (result i64) (i64.const 0x164)) - (func $const-i32-i64 (result i32 i64) (i32.const 0x132) (i64.const 0x164)) - - (func $id-i32 (param i32) (result i32) (local.get 0)) - (func $id-i64 (param i64) (result i64) (local.get 0)) - - (func $i32-i64 (param i32 i64) (result i64) (local.get 1)) - - (func $id-i32-f64 (param i32 f64) (result i32 f64) - (local.get 0) (local.get 1) - ) - - (func $swap-i32-i32 (param i32 i32) (result i32 i32) - (local.get 1) (local.get 0) - ) - (func $swap-f32-f64 (param f32 f64) (result f64 f32) - (local.get 1) (local.get 0) - ) - (func $swap-f64-i32 (param f64 i32) (result i32 f64) - (local.get 1) (local.get 0) - ) - - ;; Typing - - (func (export "type-i32") (result i32) (call $const-i32)) - (func (export "type-i64") (result i64) (call $const-i64)) - (func (export "type-all-i32-f64") (result i32 f64) - (call $id-i32-f64 (i32.const 32) (f64.const 1.64)) - ) - (func (export "type-i32-i64") (result i32 i64) (call $const-i32-i64)) - - (func (export "type-all-i32-i32") (result i32 i32) - (call $swap-i32-i32 (i32.const 1) (i32.const 2)) - ) - (func (export "type-all-f32-f64") (result f64 f32) - (call $swap-f32-f64 (f32.const 1) (f64.const 2)) - ) - (func (export "type-all-f64-i32") (result i32 f64) - (call $swap-f64-i32 (f64.const 1) (i32.const 2)) - ) - - (func (export "type-first-i32") (result i32) (call $id-i32 (i32.const 32))) - (func (export "type-first-i64") (result i64) (call $id-i64 (i64.const 64))) - - (func (export "type-second-i64") (result i64) - (call $i32-i64 (i32.const 32) (i64.const 64)) - ) - - ;; Recursion - - (func $fac (export "fac") (param i64) (result i64) - (if (result i64) (i64.eqz (local.get 0)) - (then (i64.const 1)) - (else - (i64.mul - (local.get 0) - (call $fac (i64.sub (local.get 0) (i64.const 1))) - ) - ) - ) - ) - - (func $fac-acc (export "fac-acc") (param i64 i64) (result i64) - (if (result i64) (i64.eqz (local.get 0)) - (then (local.get 1)) - (else - (call $fac-acc - (i64.sub (local.get 0) (i64.const 1)) - (i64.mul (local.get 0) (local.get 1)) - ) - ) - ) - ) - - (func $fib (export "fib") (param i64) (result i64) - (if (result i64) (i64.le_u (local.get 0) (i64.const 1)) - (then (i64.const 1)) - (else - (i64.add - (call $fib (i64.sub (local.get 0) (i64.const 2))) - (call $fib (i64.sub (local.get 0) (i64.const 1))) - ) - ) - ) - ) - - (func $even (export "even") (param i64) (result i32) - (if (result i32) (i64.eqz (local.get 0)) - (then (i32.const 44)) - (else (call $odd (i64.sub (local.get 0) (i64.const 1)))) - ) - ) - (func $odd (export "odd") (param i64) (result i32) - (if (result i32) (i64.eqz (local.get 0)) - (then (i32.const 99)) - (else (call $even (i64.sub (local.get 0) (i64.const 1)))) - ) - ) - - ;; Stack exhaustion - - ;; Implementations are required to have every call consume some abstract - ;; resource towards exhausting some abstract finite limit, such that - ;; infinitely recursive test cases reliably trap in finite time. This is - ;; because otherwise applications could come to depend on it on those - ;; implementations and be incompatible with implementations that don't do - ;; it (or don't do it under the same circumstances). - - (func $runaway (export "runaway") (call $runaway)) - - (func $mutual-runaway1 (export "mutual-runaway") (call $mutual-runaway2)) - (func $mutual-runaway2 (call $mutual-runaway1)) - - ;; As parameter of control constructs and instructions - - (memory 1) - - (func (export "as-if-condition") (result i32) - (if (result i32) (call $const-i32) (then (i32.const 1)) (else (i32.const 2))) - ) - - (func (export "as-drop-operand") - (call $const-i32) (drop) - ) - - (func (export "as-br_if-first") (result i32) - (block (result i32) (br_if 0 (call $const-i32) (i32.const 2))) - ) - (func (export "as-br_if-last") (result i32) - (block (result i32) (br_if 0 (i32.const 2) (call $const-i32))) - ) - - - (func (export "as-return-value") (result i32) - (call $const-i32) (return) - ) - (func (export "as-br-value") (result i32) - (block (result i32) (br 0 (call $const-i32))) - ) - (func (export "as-local.set-value") (result i32) - (local i32) (local.set 0 (call $const-i32)) (local.get 0) - ) - (func $dummy (param i32) (result i32) (local.get 0)) - - (func (export "as-binary-left") (result i32) - (block (result i32) (i32.add (call $dummy (i32.const 1)) (i32.const 10))) - ) - (func (export "as-binary-right") (result i32) - (block (result i32) (i32.sub (i32.const 10) (call $dummy (i32.const 1)))) - ) - - (func (export "as-test-operand") (result i32) - (block (result i32) (i32.eqz (call $dummy (i32.const 1)))) - ) - - (func (export "as-compare-left") (result i32) - (block (result i32) (i32.le_u (call $dummy (i32.const 1)) (i32.const 10))) - ) - (func (export "as-compare-right") (result i32) - (block (result i32) (i32.ne (i32.const 10) (call $dummy (i32.const 1)))) - ) - - (func (export "as-br_table-first") (result i32) - (block (result i32) (call $const-i32) (i32.const 2) (br_table 0 0)) - ) - (func (export "as-br_table-last") (result i32) - (block (result i32) (i32.const 2) (call $const-i32) (br_table 0 0)) - ) - - (func $return-from-long-argument-list-helper (param f32 i32 i32 f64 f32 f32 f32 f64 f32 i32 i32 f32 f64 i64 i64 i32 i64 i64 f32 i64 i64 i64 i32 f32 f32 f32 f64 f32 i32 i64 f32 f64 f64 f32 i32 f32 f32 f64 i64 f64 i32 i64 f32 f64 i32 i32 i32 i64 f64 i32 i64 i64 f64 f64 f64 f64 f64 f64 i32 f32 f64 f64 i32 i64 f32 f32 f32 i32 f64 f64 f64 f64 f64 f32 i64 i64 i32 i32 i32 f32 f64 i32 i64 f32 f32 f32 i32 i32 f32 f64 i64 f32 f64 f32 f32 f32 i32 f32 i64 i32) (result i32) - (local.get 99) - ) - - (func (export "return-from-long-argument-list") (param i32) (result i32) - (call $return-from-long-argument-list-helper (f32.const 0) (i32.const 0) (i32.const 0) (f64.const 0) (f32.const 0) (f32.const 0) (f32.const 0) (f64.const 0) (f32.const 0) (i32.const 0) (i32.const 0) (f32.const 0) (f64.const 0) (i64.const 0) (i64.const 0) (i32.const 0) (i64.const 0) (i64.const 0) (f32.const 0) (i64.const 0) (i64.const 0) (i64.const 0) (i32.const 0) (f32.const 0) (f32.const 0) (f32.const 0) (f64.const 0) (f32.const 0) (i32.const 0) (i64.const 0) (f32.const 0) (f64.const 0) (f64.const 0) (f32.const 0) (i32.const 0) (f32.const 0) (f32.const 0) (f64.const 0) (i64.const 0) (f64.const 0) (i32.const 0) (i64.const 0) (f32.const 0) (f64.const 0) (i32.const 0) (i32.const 0) (i32.const 0) (i64.const 0) (f64.const 0) (i32.const 0) (i64.const 0) (i64.const 0) (f64.const 0) (f64.const 0) (f64.const 0) (f64.const 0) (f64.const 0) (f64.const 0) (i32.const 0) (f32.const 0) (f64.const 0) (f64.const 0) (i32.const 0) (i64.const 0) (f32.const 0) (f32.const 0) (f32.const 0) (i32.const 0) (f64.const 0) (f64.const 0) (f64.const 0) (f64.const 0) (f64.const 0) (f32.const 0) (i64.const 0) (i64.const 0) (i32.const 0) (i32.const 0) (i32.const 0) (f32.const 0) (f64.const 0) (i32.const 0) (i64.const 0) (f32.const 0) (f32.const 0) (f32.const 0) (i32.const 0) (i32.const 0) (f32.const 0) (f64.const 0) (i64.const 0) (f32.const 0) (f64.const 0) (f32.const 0) (f32.const 0) (f32.const 0) (i32.const 0) (f32.const 0) (i64.const 0) (local.get 0)) - ) - (func (export "as-call-all-operands") (result i32 i32) - (call $swap-i32-i32 (call $swap-i32-i32 (i32.const 3) (i32.const 4))) - ) -) - -(assert_return (invoke "type-i32") (i32.const 0x132)) -(assert_return (invoke "type-i64") (i64.const 0x164)) -(assert_return (invoke "type-first-i32") (i32.const 32)) -(assert_return (invoke "type-first-i64") (i64.const 64)) -(assert_return (invoke "type-second-i64") (i64.const 64)) -(assert_return (invoke "type-i32-i64") (i32.const 0x132) (i64.const 0x164)) -(assert_return (invoke "type-all-i32-f64") (i32.const 32) (f64.const 1.64)) -(assert_return (invoke "type-all-i32-i32") (i32.const 2) (i32.const 1)) -(assert_return (invoke "type-all-f32-f64") (f64.const 2) (f32.const 1)) -(assert_return (invoke "type-all-f64-i32") (i32.const 2) (f64.const 1)) - -(assert_return (invoke "fac" (i64.const 0)) (i64.const 1)) -(assert_return (invoke "fac" (i64.const 1)) (i64.const 1)) -(assert_return (invoke "fac" (i64.const 5)) (i64.const 120)) -(assert_return (invoke "fac" (i64.const 25)) (i64.const 7034535277573963776)) -(assert_return (invoke "fac-acc" (i64.const 0) (i64.const 1)) (i64.const 1)) -(assert_return (invoke "fac-acc" (i64.const 1) (i64.const 1)) (i64.const 1)) -(assert_return (invoke "fac-acc" (i64.const 5) (i64.const 1)) (i64.const 120)) -(assert_return - (invoke "fac-acc" (i64.const 25) (i64.const 1)) - (i64.const 7034535277573963776) -) - -(assert_return (invoke "fib" (i64.const 0)) (i64.const 1)) -(assert_return (invoke "fib" (i64.const 1)) (i64.const 1)) -(assert_return (invoke "fib" (i64.const 2)) (i64.const 2)) -(assert_return (invoke "fib" (i64.const 5)) (i64.const 8)) -(assert_return (invoke "fib" (i64.const 20)) (i64.const 10946)) -(assert_return (invoke "even" (i64.const 0)) (i32.const 44)) -(assert_return (invoke "even" (i64.const 1)) (i32.const 99)) -(assert_return (invoke "even" (i64.const 100)) (i32.const 44)) -(assert_return (invoke "even" (i64.const 77)) (i32.const 99)) -(assert_return (invoke "odd" (i64.const 0)) (i32.const 99)) -(assert_return (invoke "odd" (i64.const 1)) (i32.const 44)) -(assert_return (invoke "odd" (i64.const 200)) (i32.const 99)) -(assert_return (invoke "odd" (i64.const 77)) (i32.const 44)) -(assert_return (invoke "as-if-condition") (i32.const 1)) -(assert_return (invoke "as-br_if-first") (i32.const 0x132)) -(assert_return (invoke "as-br_if-last") (i32.const 2)) -(assert_return (invoke "as-return-value") (i32.const 0x132)) -(assert_return (invoke "as-br-value") (i32.const 0x132)) -(assert_return (invoke "as-local.set-value") (i32.const 0x132)) - -(assert_return (invoke "as-binary-left") (i32.const 11)) -(assert_return (invoke "as-binary-right") (i32.const 9)) -(assert_return (invoke "as-test-operand") (i32.const 0)) -(assert_return (invoke "as-compare-left") (i32.const 1)) -(assert_return (invoke "as-compare-right") (i32.const 1)) -(assert_return (invoke "as-drop-operand")) - -(assert_return (invoke "as-br_table-first") (i32.const 0x132)) -(assert_return (invoke "as-br_table-last") (i32.const 2)) -(assert_return (invoke "return-from-long-argument-list" (i32.const 42)) (i32.const 42)) -(assert_return (invoke "as-call-all-operands") (i32.const 3) (i32.const 4)) -(assert_return (invoke "return-from-long-argument-list" (i32.const 42)) (i32.const 42)) diff --git a/tests/misc_testsuite/winch/call_indirect.wast b/tests/misc_testsuite/winch/call_indirect.wast deleted file mode 100644 index 71393dfca7dc..000000000000 --- a/tests/misc_testsuite/winch/call_indirect.wast +++ /dev/null @@ -1,444 +0,0 @@ -;; Test `call_indirect` operator - -(module - ;; Auxiliary definitions - (type $proc (func)) - (type $out-i32 (func (result i32))) - (type $out-i64 (func (result i64))) - (type $out-f32 (func (result f32))) - (type $out-f64 (func (result f64))) - (type $out-f64-i32 (func (result f64 i32))) - (type $over-i32 (func (param i32) (result i32))) - (type $over-i64 (func (param i64) (result i64))) - (type $over-f32 (func (param f32) (result f32))) - (type $over-f64 (func (param f64) (result f64))) - (type $f32-i32 (func (param f32 i32) (result i32))) - (type $i32-i64 (func (param i32 i64) (result i64))) - (type $f64-f32 (func (param f64 f32) (result f32))) - (type $i64-f64 (func (param i64 f64) (result f64))) - (type $over-i32-duplicate (func (param i32) (result i32))) - (type $over-i64-duplicate (func (param i64) (result i64))) - (type $over-f32-duplicate (func (param f32) (result f32))) - (type $over-f64-duplicate (func (param f64) (result f64))) - - (type $over-i32-f64 (func (param i32 f64) (result i32 f64))) - (type $swap-i32-i64 (func (param i32 i64) (result i64 i32))) - - (func $const-i32 (type $out-i32) (i32.const 0x132)) - (func $const-i64 (type $out-i64) (i64.const 0x164)) - (func $const-f32 (type $out-f32) (f32.const 0xf32)) - (func $const-f64 (type $out-f64) (f64.const 0xf64)) - (func $const-f64-i32 (type $out-f64-i32) (f64.const 0xf64) (i32.const 32)) - - (func $id-i32 (type $over-i32) (local.get 0)) - (func $id-i64 (type $over-i64) (local.get 0)) - (func $id-f32 (type $over-f32) (local.get 0)) - (func $id-f64 (type $over-f64) (local.get 0)) - (func $id-i32-f64 (type $over-i32-f64) (local.get 0) (local.get 1)) - (func $swap-i32-i64 (type $swap-i32-i64) (local.get 1) (local.get 0)) - - (func $i32-i64 (type $i32-i64) (local.get 1)) - (func $i64-f64 (type $i64-f64) (local.get 1)) - (func $f32-i32 (type $f32-i32) (local.get 1)) - (func $f64-f32 (type $f64-f32) (local.get 1)) - - (func $over-i32-duplicate (type $over-i32-duplicate) (local.get 0)) - (func $over-i64-duplicate (type $over-i64-duplicate) (local.get 0)) - (func $over-f32-duplicate (type $over-f32-duplicate) (local.get 0)) - (func $over-f64-duplicate (type $over-f64-duplicate) (local.get 0)) - - (table funcref - (elem - $const-i32 $const-i64 $const-f32 $const-f64 ;; 0..3 - $id-i32 $id-i64 $id-f32 $id-f64 ;; 4..7 - $f32-i32 $i32-i64 $f64-f32 $i64-f64 ;; 8..11 - $fac-i64 $fib-i64 $even $odd ;; 12..15 - $over-i32-duplicate $over-i64-duplicate ;; 16..17 - $over-f32-duplicate $over-f64-duplicate ;; 18..19 - $fac-i32 $fib-i32 ;; 20..21 - $const-f64-i32 $id-i32-f64 $swap-i32-i64 ;; 22..24 - ) - ) - - ;; Typing - - (func (export "type-i32") (result i32) - (call_indirect (type $out-i32) (i32.const 0)) - ) - (func (export "type-i64") (result i64) - (call_indirect (type $out-i64) (i32.const 1)) - ) - (func (export "type-f32") (result f32) - (call_indirect (type $out-f32) (i32.const 2)) - ) - (func (export "type-f64") (result f64) - (call_indirect (type $out-f64) (i32.const 3)) - ) - - (func (export "type-f64-i32") (result f64 i32) - (call_indirect (type $out-f64-i32) (i32.const 22)) - ) - - (func (export "type-index") (result i64) - (call_indirect (type $over-i64) (i64.const 100) (i32.const 5)) - ) - - (func (export "type-first-i32") (result i32) - (call_indirect (type $over-i32) (i32.const 32) (i32.const 4)) - ) - (func (export "type-first-i64") (result i64) - (call_indirect (type $over-i64) (i64.const 64) (i32.const 5)) - ) - (func (export "type-first-f32") (result f32) - (call_indirect (type $over-f32) (f32.const 1.32) (i32.const 6)) - ) - (func (export "type-first-f64") (result f64) - (call_indirect (type $over-f64) (f64.const 1.64) (i32.const 7)) - ) - - (func (export "type-second-i32") (result i32) - (call_indirect (type $f32-i32) (f32.const 32.1) (i32.const 32) (i32.const 8)) - ) - (func (export "type-second-i64") (result i64) - (call_indirect (type $i32-i64) (i32.const 32) (i64.const 64) (i32.const 9)) - ) - (func (export "type-second-f32") (result f32) - (call_indirect (type $f64-f32) (f64.const 64) (f32.const 32) (i32.const 10)) - ) - (func (export "type-second-f64") (result f64) - (call_indirect (type $i64-f64) (i64.const 64) (f64.const 64.1) (i32.const 11)) - ) - - (func (export "type-all-i32-f64") (result i32 f64) - (call_indirect (type $over-i32-f64) - (i32.const 1) (f64.const 2) (i32.const 23) - ) - ) - (func (export "type-all-i32-i64") (result i64 i32) - (call_indirect (type $swap-i32-i64) - (i32.const 1) (i64.const 2) (i32.const 24) - ) - ) - (func (export "type-all-f64-i32") (result f64 i32) - (call_indirect (type $out-f64-i32) (i32.const 22)) - ) - - ;; Dispatch - - (func (export "dispatch") (param i32 i64) (result i64) - (call_indirect (type $over-i64) (local.get 1) (local.get 0)) - ) - - (func (export "dispatch-structural-i64") (param i32) (result i64) - (call_indirect (type $over-i64-duplicate) (i64.const 9) (local.get 0)) - ) - (func (export "dispatch-structural-i32") (param i32) (result i32) - (call_indirect (type $over-i32-duplicate) (i32.const 9) (local.get 0)) - ) - (func (export "dispatch-structural-f32") (param i32) (result f32) - (call_indirect (type $over-f32-duplicate) (f32.const 9.0) (local.get 0)) - ) - (func (export "dispatch-structural-f64") (param i32) (result f64) - (call_indirect (type $over-f64-duplicate) (f64.const 9.0) (local.get 0)) - ) - - ;; Recursion - - (func $fac-i64 (export "fac-i64") (type $over-i64) - (if (result i64) (i64.eqz (local.get 0)) - (then (i64.const 1)) - (else - (i64.mul - (local.get 0) - (call_indirect (type $over-i64) - (i64.sub (local.get 0) (i64.const 1)) - (i32.const 12) - ) - ) - ) - ) - ) - - (func $fib-i64 (export "fib-i64") (type $over-i64) - (if (result i64) (i64.le_u (local.get 0) (i64.const 1)) - (then (i64.const 1)) - (else - (i64.add - (call_indirect (type $over-i64) - (i64.sub (local.get 0) (i64.const 2)) - (i32.const 13) - ) - (call_indirect (type $over-i64) - (i64.sub (local.get 0) (i64.const 1)) - (i32.const 13) - ) - ) - ) - ) - ) - - (func $fac-i32 (export "fac-i32") (type $over-i32) - (if (result i32) (i32.eqz (local.get 0)) - (then (i32.const 1)) - (else - (i32.mul - (local.get 0) - (call_indirect (type $over-i32) - (i32.sub (local.get 0) (i32.const 1)) - (i32.const 20) - ) - ) - ) - ) - ) - - (func $fib-i32 (export "fib-i32") (type $over-i32) - (if (result i32) (i32.le_u (local.get 0) (i32.const 1)) - (then (i32.const 1)) - (else - (i32.add - (call_indirect (type $over-i32) - (i32.sub (local.get 0) (i32.const 2)) - (i32.const 21) - ) - (call_indirect (type $over-i32) - (i32.sub (local.get 0) (i32.const 1)) - (i32.const 21) - ) - ) - ) - ) - ) - - (func $even (export "even") (param i32) (result i32) - (if (result i32) (i32.eqz (local.get 0)) - (then (i32.const 44)) - (else - (call_indirect (type $over-i32) - (i32.sub (local.get 0) (i32.const 1)) - (i32.const 15) - ) - ) - ) - ) - (func $odd (export "odd") (param i32) (result i32) - (if (result i32) (i32.eqz (local.get 0)) - (then (i32.const 99)) - (else - (call_indirect (type $over-i32) - (i32.sub (local.get 0) (i32.const 1)) - (i32.const 14) - ) - ) - ) - ) - - ;; As parameter of control constructs and instructions - - (memory 1) - - (func (export "as-select-first") (result i32) - (select (call_indirect (type $out-i32) (i32.const 0)) (i32.const 2) (i32.const 3)) - ) - (func (export "as-select-mid") (result i32) - (select (i32.const 2) (call_indirect (type $out-i32) (i32.const 0)) (i32.const 3)) - ) - (func (export "as-select-last") (result i32) - (select (i32.const 2) (i32.const 3) (call_indirect (type $out-i32) (i32.const 0))) - ) - - (func (export "as-if-condition") (result i32) - (if (result i32) (call_indirect (type $out-i32) (i32.const 0)) (then (i32.const 1)) (else (i32.const 2))) - ) - - (func (export "as-br_if-first") (result i64) - (block (result i64) (br_if 0 (call_indirect (type $out-i64) (i32.const 1)) (i32.const 2))) - ) - (func (export "as-br_if-last") (result i32) - (block (result i32) (br_if 0 (i32.const 2) (call_indirect (type $out-i32) (i32.const 0)))) - ) - - (func (export "as-br_table-first") (result f32) - (block (result f32) (call_indirect (type $out-f32) (i32.const 2)) (i32.const 2) (br_table 0 0)) - ) - (func (export "as-br_table-last") (result i32) - (block (result i32) (i32.const 2) (call_indirect (type $out-i32) (i32.const 0)) (br_table 0 0)) - ) - - (func (export "as-return-value") (result i32) - (call_indirect (type $over-i32) (i32.const 1) (i32.const 4)) (return) - ) - (func (export "as-drop-operand") - (call_indirect (type $over-i64) (i64.const 1) (i32.const 5)) (drop) - ) - (func (export "as-br-value") (result f32) - (block (result f32) (br 0 (call_indirect (type $over-f32) (f32.const 1) (i32.const 6)))) - ) - (func (export "as-local.set-value") (result f64) - (local f64) (local.set 0 (call_indirect (type $over-f64) (f64.const 1) (i32.const 7))) (local.get 0) - ) - (func (export "as-local.tee-value") (result f64) - (local f64) (local.tee 0 (call_indirect (type $over-f64) (f64.const 1) (i32.const 7))) - ) - (global $a (mut f64) (f64.const 10.0)) - (func (export "as-global.set-value") (result f64) - (global.set $a (call_indirect (type $over-f64) (f64.const 1.0) (i32.const 7))) - (global.get $a) - ) - - (func (export "as-binary-left") (result i32) - (block (result i32) - (i32.add - (call_indirect (type $over-i32) (i32.const 1) (i32.const 4)) - (i32.const 10) - ) - ) - ) - (func (export "as-binary-right") (result i32) - (block (result i32) - (i32.sub - (i32.const 10) - (call_indirect (type $over-i32) (i32.const 1) (i32.const 4)) - ) - ) - ) - - (func (export "as-test-operand") (result i32) - (block (result i32) - (i32.eqz - (call_indirect (type $over-i32) (i32.const 1) (i32.const 4)) - ) - ) - ) - - (func (export "as-compare-left") (result i32) - (block (result i32) - (i32.le_u - (call_indirect (type $over-i32) (i32.const 1) (i32.const 4)) - (i32.const 10) - ) - ) - ) - (func (export "as-compare-right") (result i32) - (block (result i32) - (i32.ne - (i32.const 10) - (call_indirect (type $over-i32) (i32.const 1) (i32.const 4)) - ) - ) - ) -) - -(assert_return (invoke "type-i32") (i32.const 0x132)) -(assert_return (invoke "type-i64") (i64.const 0x164)) -(assert_return (invoke "type-f32") (f32.const 0xf32)) -(assert_return (invoke "type-f64") (f64.const 0xf64)) -(assert_return (invoke "type-f64-i32") (f64.const 0xf64) (i32.const 32)) - -(assert_return (invoke "type-index") (i64.const 100)) - -(assert_return (invoke "type-first-i32") (i32.const 32)) -(assert_return (invoke "type-first-i64") (i64.const 64)) -(assert_return (invoke "type-first-f32") (f32.const 1.32)) -(assert_return (invoke "type-first-f64") (f64.const 1.64)) - -(assert_return (invoke "type-second-i32") (i32.const 32)) -(assert_return (invoke "type-second-i64") (i64.const 64)) -(assert_return (invoke "type-second-f32") (f32.const 32)) -(assert_return (invoke "type-second-f64") (f64.const 64.1)) - -(assert_return (invoke "type-all-f64-i32") (f64.const 0xf64) (i32.const 32)) -(assert_return (invoke "type-all-i32-f64") (i32.const 1) (f64.const 2)) -(assert_return (invoke "type-all-i32-i64") (i64.const 2) (i32.const 1)) - -(assert_return (invoke "dispatch" (i32.const 5) (i64.const 2)) (i64.const 2)) -(assert_return (invoke "dispatch" (i32.const 5) (i64.const 5)) (i64.const 5)) -(assert_return (invoke "dispatch" (i32.const 12) (i64.const 5)) (i64.const 120)) -(assert_return (invoke "dispatch" (i32.const 13) (i64.const 5)) (i64.const 8)) -(assert_return (invoke "dispatch" (i32.const 17) (i64.const 2)) (i64.const 2)) -(assert_trap (invoke "dispatch" (i32.const 0) (i64.const 2)) "indirect call type mismatch") -(assert_trap (invoke "dispatch" (i32.const 15) (i64.const 2)) "indirect call type mismatch") -(assert_trap (invoke "dispatch" (i32.const 32) (i64.const 2)) "undefined element") -(assert_trap (invoke "dispatch" (i32.const -1) (i64.const 2)) "undefined element") -(assert_trap (invoke "dispatch" (i32.const 1213432423) (i64.const 2)) "undefined element") - -(assert_return (invoke "dispatch-structural-i64" (i32.const 5)) (i64.const 9)) -(assert_return (invoke "dispatch-structural-i64" (i32.const 12)) (i64.const 362880)) -(assert_return (invoke "dispatch-structural-i64" (i32.const 13)) (i64.const 55)) -(assert_return (invoke "dispatch-structural-i64" (i32.const 17)) (i64.const 9)) -(assert_trap (invoke "dispatch-structural-i64" (i32.const 11)) "indirect call type mismatch") -(assert_trap (invoke "dispatch-structural-i64" (i32.const 19)) "indirect call type mismatch") - -(assert_return (invoke "dispatch-structural-i32" (i32.const 4)) (i32.const 9)) -(assert_return (invoke "dispatch-structural-i32" (i32.const 20)) (i32.const 362880)) -(assert_return (invoke "dispatch-structural-i32" (i32.const 21)) (i32.const 55)) -(assert_return (invoke "dispatch-structural-i32" (i32.const 16)) (i32.const 9)) -(assert_trap (invoke "dispatch-structural-i32" (i32.const 8)) "indirect call type mismatch") -(assert_trap (invoke "dispatch-structural-i32" (i32.const 18)) "indirect call type mismatch") - -(assert_return (invoke "dispatch-structural-f32" (i32.const 6)) (f32.const 9.0)) -(assert_return (invoke "dispatch-structural-f32" (i32.const 18)) (f32.const 9.0)) -(assert_trap (invoke "dispatch-structural-f32" (i32.const 8)) "indirect call type mismatch") -(assert_trap (invoke "dispatch-structural-f32" (i32.const 19)) "indirect call type mismatch") - -(assert_return (invoke "dispatch-structural-f64" (i32.const 7)) (f64.const 9.0)) -(assert_return (invoke "dispatch-structural-f64" (i32.const 19)) (f64.const 9.0)) -(assert_trap (invoke "dispatch-structural-f64" (i32.const 10)) "indirect call type mismatch") -(assert_trap (invoke "dispatch-structural-f64" (i32.const 18)) "indirect call type mismatch") - -(assert_return (invoke "fac-i64" (i64.const 0)) (i64.const 1)) -(assert_return (invoke "fac-i64" (i64.const 1)) (i64.const 1)) -(assert_return (invoke "fac-i64" (i64.const 5)) (i64.const 120)) -(assert_return (invoke "fac-i64" (i64.const 25)) (i64.const 7034535277573963776)) - -(assert_return (invoke "fac-i32" (i32.const 0)) (i32.const 1)) -(assert_return (invoke "fac-i32" (i32.const 1)) (i32.const 1)) -(assert_return (invoke "fac-i32" (i32.const 5)) (i32.const 120)) -(assert_return (invoke "fac-i32" (i32.const 10)) (i32.const 3628800)) - -(assert_return (invoke "fib-i64" (i64.const 0)) (i64.const 1)) -(assert_return (invoke "fib-i64" (i64.const 1)) (i64.const 1)) -(assert_return (invoke "fib-i64" (i64.const 2)) (i64.const 2)) -(assert_return (invoke "fib-i64" (i64.const 5)) (i64.const 8)) -(assert_return (invoke "fib-i64" (i64.const 20)) (i64.const 10946)) - -(assert_return (invoke "fib-i32" (i32.const 0)) (i32.const 1)) -(assert_return (invoke "fib-i32" (i32.const 1)) (i32.const 1)) -(assert_return (invoke "fib-i32" (i32.const 2)) (i32.const 2)) -(assert_return (invoke "fib-i32" (i32.const 5)) (i32.const 8)) -(assert_return (invoke "fib-i32" (i32.const 20)) (i32.const 10946)) - -(assert_return (invoke "even" (i32.const 0)) (i32.const 44)) -(assert_return (invoke "even" (i32.const 1)) (i32.const 99)) -(assert_return (invoke "even" (i32.const 100)) (i32.const 44)) -(assert_return (invoke "even" (i32.const 77)) (i32.const 99)) -(assert_return (invoke "odd" (i32.const 0)) (i32.const 99)) -(assert_return (invoke "odd" (i32.const 1)) (i32.const 44)) -(assert_return (invoke "odd" (i32.const 200)) (i32.const 99)) -(assert_return (invoke "odd" (i32.const 77)) (i32.const 44)) - -(assert_return (invoke "as-select-first") (i32.const 0x132)) -(assert_return (invoke "as-select-mid") (i32.const 2)) -(assert_return (invoke "as-select-last") (i32.const 2)) - -(assert_return (invoke "as-if-condition") (i32.const 1)) - -(assert_return (invoke "as-br_if-first") (i64.const 0x164)) -(assert_return (invoke "as-br_if-last") (i32.const 2)) - -(assert_return (invoke "as-br_table-first") (f32.const 0xf32)) -(assert_return (invoke "as-br_table-last") (i32.const 2)) - -(assert_return (invoke "as-return-value") (i32.const 1)) -(assert_return (invoke "as-drop-operand")) -(assert_return (invoke "as-br-value") (f32.const 1)) -(assert_return (invoke "as-local.set-value") (f64.const 1)) -(assert_return (invoke "as-local.tee-value") (f64.const 1)) -(assert_return (invoke "as-global.set-value") (f64.const 1.0)) - -(assert_return (invoke "as-binary-left") (i32.const 11)) -(assert_return (invoke "as-binary-right") (i32.const 9)) -(assert_return (invoke "as-test-operand") (i32.const 0)) -(assert_return (invoke "as-compare-left") (i32.const 1)) -(assert_return (invoke "as-compare-right") (i32.const 1)) - diff --git a/tests/misc_testsuite/winch/f32.wast b/tests/misc_testsuite/winch/f32.wast deleted file mode 100644 index ea5ad759ce7c..000000000000 --- a/tests/misc_testsuite/winch/f32.wast +++ /dev/null @@ -1,2821 +0,0 @@ -(module (func (export "f") (result f32) (f32.const +0x1.00000100000000000p-50))) -(assert_return (invoke "f") (f32.const +0x1.000000p-50)) -(module (func (export "f") (result f32) (f32.const -0x1.00000100000000000p-50))) -(assert_return (invoke "f") (f32.const -0x1.000000p-50)) -(module (func (export "f") (result f32) (f32.const +0x1.00000100000000001p-50))) -(assert_return (invoke "f") (f32.const +0x1.000002p-50)) -(module (func (export "f") (result f32) (f32.const -0x1.00000100000000001p-50))) -(assert_return (invoke "f") (f32.const -0x1.000002p-50)) -(module (func (export "f") (result f32) (f32.const +0x1.000001fffffffffffp-50))) -(assert_return (invoke "f") (f32.const +0x1.000002p-50)) -(module (func (export "f") (result f32) (f32.const -0x1.000001fffffffffffp-50))) -(assert_return (invoke "f") (f32.const -0x1.000002p-50)) -(module (func (export "f") (result f32) (f32.const +0x1.00000200000000000p-50))) -(assert_return (invoke "f") (f32.const +0x1.000002p-50)) -(module (func (export "f") (result f32) (f32.const -0x1.00000200000000000p-50))) -(assert_return (invoke "f") (f32.const -0x1.000002p-50)) -(module (func (export "f") (result f32) (f32.const +0x1.00000200000000001p-50))) -(assert_return (invoke "f") (f32.const +0x1.000002p-50)) -(module (func (export "f") (result f32) (f32.const -0x1.00000200000000001p-50))) -(assert_return (invoke "f") (f32.const -0x1.000002p-50)) -(module (func (export "f") (result f32) (f32.const +0x1.000002fffffffffffp-50))) -(assert_return (invoke "f") (f32.const +0x1.000002p-50)) -(module (func (export "f") (result f32) (f32.const -0x1.000002fffffffffffp-50))) -(assert_return (invoke "f") (f32.const -0x1.000002p-50)) -(module (func (export "f") (result f32) (f32.const +0x1.00000300000000000p-50))) -(assert_return (invoke "f") (f32.const +0x1.000004p-50)) -(module (func (export "f") (result f32) (f32.const -0x1.00000300000000000p-50))) -(assert_return (invoke "f") (f32.const -0x1.000004p-50)) -(module (func (export "f") (result f32) (f32.const +0x1.00000300000000001p-50))) -(assert_return (invoke "f") (f32.const +0x1.000004p-50)) -(module (func (export "f") (result f32) (f32.const -0x1.00000300000000001p-50))) -(assert_return (invoke "f") (f32.const -0x1.000004p-50)) -(module (func (export "f") (result f32) (f32.const +0x1.000003fffffffffffp-50))) -(assert_return (invoke "f") (f32.const +0x1.000004p-50)) -(module (func (export "f") (result f32) (f32.const -0x1.000003fffffffffffp-50))) -(assert_return (invoke "f") (f32.const -0x1.000004p-50)) -(module (func (export "f") (result f32) (f32.const +0x1.00000400000000000p-50))) -(assert_return (invoke "f") (f32.const +0x1.000004p-50)) -(module (func (export "f") (result f32) (f32.const -0x1.00000400000000000p-50))) -(assert_return (invoke "f") (f32.const -0x1.000004p-50)) -(module (func (export "f") (result f32) (f32.const +0x1.00000400000000001p-50))) -(assert_return (invoke "f") (f32.const +0x1.000004p-50)) -(module (func (export "f") (result f32) (f32.const -0x1.00000400000000001p-50))) -(assert_return (invoke "f") (f32.const -0x1.000004p-50)) -(module (func (export "f") (result f32) (f32.const +0x1.000004fffffffffffp-50))) -(assert_return (invoke "f") (f32.const +0x1.000004p-50)) -(module (func (export "f") (result f32) (f32.const -0x1.000004fffffffffffp-50))) -(assert_return (invoke "f") (f32.const -0x1.000004p-50)) -(module (func (export "f") (result f32) (f32.const +0x1.00000500000000000p-50))) -(assert_return (invoke "f") (f32.const +0x1.000004p-50)) -(module (func (export "f") (result f32) (f32.const -0x1.00000500000000000p-50))) -(assert_return (invoke "f") (f32.const -0x1.000004p-50)) -(module (func (export "f") (result f32) (f32.const +0x1.00000500000000001p-50))) -(assert_return (invoke "f") (f32.const +0x1.000006p-50)) -(module (func (export "f") (result f32) (f32.const -0x1.00000500000000001p-50))) -(assert_return (invoke "f") (f32.const -0x1.000006p-50)) - -(module (func (export "f") (result f32) (f32.const +0x4000.004000000p-64))) -(assert_return (invoke "f") (f32.const +0x1.000000p-50)) -(module (func (export "f") (result f32) (f32.const -0x4000.004000000p-64))) -(assert_return (invoke "f") (f32.const -0x1.000000p-50)) -(module (func (export "f") (result f32) (f32.const +0x4000.004000001p-64))) -(assert_return (invoke "f") (f32.const +0x1.000002p-50)) -(module (func (export "f") (result f32) (f32.const -0x4000.004000001p-64))) -(assert_return (invoke "f") (f32.const -0x1.000002p-50)) -(module (func (export "f") (result f32) (f32.const +0x4000.007ffffffp-64))) -(assert_return (invoke "f") (f32.const +0x1.000002p-50)) -(module (func (export "f") (result f32) (f32.const -0x4000.007ffffffp-64))) -(assert_return (invoke "f") (f32.const -0x1.000002p-50)) -(module (func (export "f") (result f32) (f32.const +0x4000.008000000p-64))) -(assert_return (invoke "f") (f32.const +0x1.000002p-50)) -(module (func (export "f") (result f32) (f32.const -0x4000.008000000p-64))) -(assert_return (invoke "f") (f32.const -0x1.000002p-50)) -(module (func (export "f") (result f32) (f32.const +0x4000.008000001p-64))) -(assert_return (invoke "f") (f32.const +0x1.000002p-50)) -(module (func (export "f") (result f32) (f32.const -0x4000.008000001p-64))) -(assert_return (invoke "f") (f32.const -0x1.000002p-50)) -(module (func (export "f") (result f32) (f32.const +0x4000.00bffffffp-64))) -(assert_return (invoke "f") (f32.const +0x1.000002p-50)) -(module (func (export "f") (result f32) (f32.const -0x4000.00bffffffp-64))) -(assert_return (invoke "f") (f32.const -0x1.000002p-50)) -(module (func (export "f") (result f32) (f32.const +0x4000.00c000000p-64))) -(assert_return (invoke "f") (f32.const +0x1.000004p-50)) -(module (func (export "f") (result f32) (f32.const -0x4000.00c000000p-64))) -(assert_return (invoke "f") (f32.const -0x1.000004p-50)) -(module (func (export "f") (result f32) (f32.const +0x4000.00c000001p-64))) -(assert_return (invoke "f") (f32.const +0x1.000004p-50)) -(module (func (export "f") (result f32) (f32.const -0x4000.00c000001p-64))) -(assert_return (invoke "f") (f32.const -0x1.000004p-50)) -(module (func (export "f") (result f32) (f32.const +0x4000.00fffffffp-64))) -(assert_return (invoke "f") (f32.const +0x1.000004p-50)) -(module (func (export "f") (result f32) (f32.const -0x4000.00fffffffp-64))) -(assert_return (invoke "f") (f32.const -0x1.000004p-50)) -(module (func (export "f") (result f32) (f32.const +0x4000.010000001p-64))) -(assert_return (invoke "f") (f32.const +0x1.000004p-50)) -(module (func (export "f") (result f32) (f32.const -0x4000.010000001p-64))) -(assert_return (invoke "f") (f32.const -0x1.000004p-50)) -(module (func (export "f") (result f32) (f32.const +0x4000.013ffffffp-64))) -(assert_return (invoke "f") (f32.const +0x1.000004p-50)) -(module (func (export "f") (result f32) (f32.const -0x4000.013ffffffp-64))) -(assert_return (invoke "f") (f32.const -0x1.000004p-50)) -(module (func (export "f") (result f32) (f32.const +0x4000.014000001p-64))) -(assert_return (invoke "f") (f32.const +0x1.000006p-50)) -(module (func (export "f") (result f32) (f32.const -0x4000.014000001p-64))) -(assert_return (invoke "f") (f32.const -0x1.000006p-50)) - -(module (func (export "f") (result f32) (f32.const +8.8817847263968443573e-16))) -(assert_return (invoke "f") (f32.const +0x1.000000p-50)) -(module (func (export "f") (result f32) (f32.const -8.8817847263968443573e-16))) -(assert_return (invoke "f") (f32.const -0x1.000000p-50)) -(module (func (export "f") (result f32) (f32.const +8.8817847263968443574e-16))) -(assert_return (invoke "f") (f32.const +0x1.000002p-50)) -(module (func (export "f") (result f32) (f32.const -8.8817847263968443574e-16))) -(assert_return (invoke "f") (f32.const -0x1.000002p-50)) -(module (func (export "f") (result f32) (f32.const +8.8817857851880284252e-16))) -(assert_return (invoke "f") (f32.const +0x1.000002p-50)) -(module (func (export "f") (result f32) (f32.const -8.8817857851880284252e-16))) -(assert_return (invoke "f") (f32.const -0x1.000002p-50)) -(module (func (export "f") (result f32) (f32.const +8.8817857851880284253e-16))) -(assert_return (invoke "f") (f32.const +0x1.000004p-50)) -(module (func (export "f") (result f32) (f32.const -8.8817857851880284253e-16))) -(assert_return (invoke "f") (f32.const -0x1.000004p-50)) - -;; f32, large exponent -(module (func (export "f") (result f32) (f32.const +0x1.00000100000000000p+50))) -(assert_return (invoke "f") (f32.const +0x1.000000p+50)) -(module (func (export "f") (result f32) (f32.const -0x1.00000100000000000p+50))) -(assert_return (invoke "f") (f32.const -0x1.000000p+50)) -(module (func (export "f") (result f32) (f32.const +0x1.00000100000000001p+50))) -(assert_return (invoke "f") (f32.const +0x1.000002p+50)) -(module (func (export "f") (result f32) (f32.const -0x1.00000100000000001p+50))) -(assert_return (invoke "f") (f32.const -0x1.000002p+50)) -(module (func (export "f") (result f32) (f32.const +0x1.000001fffffffffffp+50))) -(assert_return (invoke "f") (f32.const +0x1.000002p+50)) -(module (func (export "f") (result f32) (f32.const -0x1.000001fffffffffffp+50))) -(assert_return (invoke "f") (f32.const -0x1.000002p+50)) -(module (func (export "f") (result f32) (f32.const +0x1.00000200000000000p+50))) -(assert_return (invoke "f") (f32.const +0x1.000002p+50)) -(module (func (export "f") (result f32) (f32.const -0x1.00000200000000000p+50))) -(assert_return (invoke "f") (f32.const -0x1.000002p+50)) -(module (func (export "f") (result f32) (f32.const +0x1.00000200000000001p+50))) -(assert_return (invoke "f") (f32.const +0x1.000002p+50)) -(module (func (export "f") (result f32) (f32.const -0x1.00000200000000001p+50))) -(assert_return (invoke "f") (f32.const -0x1.000002p+50)) -(module (func (export "f") (result f32) (f32.const +0x1.000002fffffffffffp+50))) -(assert_return (invoke "f") (f32.const +0x1.000002p+50)) -(module (func (export "f") (result f32) (f32.const -0x1.000002fffffffffffp+50))) -(assert_return (invoke "f") (f32.const -0x1.000002p+50)) -(module (func (export "f") (result f32) (f32.const +0x1.00000300000000000p+50))) -(assert_return (invoke "f") (f32.const +0x1.000004p+50)) -(module (func (export "f") (result f32) (f32.const -0x1.00000300000000000p+50))) -(assert_return (invoke "f") (f32.const -0x1.000004p+50)) -(module (func (export "f") (result f32) (f32.const +0x1.00000300000000001p+50))) -(assert_return (invoke "f") (f32.const +0x1.000004p+50)) -(module (func (export "f") (result f32) (f32.const -0x1.00000300000000001p+50))) -(assert_return (invoke "f") (f32.const -0x1.000004p+50)) -(module (func (export "f") (result f32) (f32.const +0x1.000003fffffffffffp+50))) -(assert_return (invoke "f") (f32.const +0x1.000004p+50)) -(module (func (export "f") (result f32) (f32.const -0x1.000003fffffffffffp+50))) -(assert_return (invoke "f") (f32.const -0x1.000004p+50)) -(module (func (export "f") (result f32) (f32.const +0x1.00000400000000000p+50))) -(assert_return (invoke "f") (f32.const +0x1.000004p+50)) -(module (func (export "f") (result f32) (f32.const -0x1.00000400000000000p+50))) -(assert_return (invoke "f") (f32.const -0x1.000004p+50)) -(module (func (export "f") (result f32) (f32.const +0x1.00000400000000001p+50))) -(assert_return (invoke "f") (f32.const +0x1.000004p+50)) -(module (func (export "f") (result f32) (f32.const -0x1.00000400000000001p+50))) -(assert_return (invoke "f") (f32.const -0x1.000004p+50)) -(module (func (export "f") (result f32) (f32.const +0x1.000004fffffffffffp+50))) -(assert_return (invoke "f") (f32.const +0x1.000004p+50)) -(module (func (export "f") (result f32) (f32.const -0x1.000004fffffffffffp+50))) -(assert_return (invoke "f") (f32.const -0x1.000004p+50)) -(module (func (export "f") (result f32) (f32.const +0x1.00000500000000000p+50))) -(assert_return (invoke "f") (f32.const +0x1.000004p+50)) -(module (func (export "f") (result f32) (f32.const -0x1.00000500000000000p+50))) -(assert_return (invoke "f") (f32.const -0x1.000004p+50)) -(module (func (export "f") (result f32) (f32.const +0x1.00000500000000001p+50))) -(assert_return (invoke "f") (f32.const +0x1.000006p+50)) -(module (func (export "f") (result f32) (f32.const -0x1.00000500000000001p+50))) -(assert_return (invoke "f") (f32.const -0x1.000006p+50)) - -(module (func (export "f") (result f32) (f32.const +0x4000004000000))) -(assert_return (invoke "f") (f32.const +0x1.000000p+50)) -(module (func (export "f") (result f32) (f32.const -0x4000004000000))) -(assert_return (invoke "f") (f32.const -0x1.000000p+50)) -(module (func (export "f") (result f32) (f32.const +0x4000004000001))) -(assert_return (invoke "f") (f32.const +0x1.000002p+50)) -(module (func (export "f") (result f32) (f32.const -0x4000004000001))) -(assert_return (invoke "f") (f32.const -0x1.000002p+50)) -(module (func (export "f") (result f32) (f32.const +0x4000007ffffff))) -(assert_return (invoke "f") (f32.const +0x1.000002p+50)) -(module (func (export "f") (result f32) (f32.const -0x4000007ffffff))) -(assert_return (invoke "f") (f32.const -0x1.000002p+50)) -(module (func (export "f") (result f32) (f32.const +0x4000008000000))) -(assert_return (invoke "f") (f32.const +0x1.000002p+50)) -(module (func (export "f") (result f32) (f32.const -0x4000008000000))) -(assert_return (invoke "f") (f32.const -0x1.000002p+50)) -(module (func (export "f") (result f32) (f32.const +0x4000008000001))) -(assert_return (invoke "f") (f32.const +0x1.000002p+50)) -(module (func (export "f") (result f32) (f32.const -0x4000008000001))) -(assert_return (invoke "f") (f32.const -0x1.000002p+50)) -(module (func (export "f") (result f32) (f32.const +0x400000bffffff))) -(assert_return (invoke "f") (f32.const +0x1.000002p+50)) -(module (func (export "f") (result f32) (f32.const -0x400000bffffff))) -(assert_return (invoke "f") (f32.const -0x1.000002p+50)) -(module (func (export "f") (result f32) (f32.const +0x400000c000000))) -(assert_return (invoke "f") (f32.const +0x1.000004p+50)) -(module (func (export "f") (result f32) (f32.const -0x400000c000000))) -(assert_return (invoke "f") (f32.const -0x1.000004p+50)) - -(module (func (export "f") (result f32) (f32.const +1125899973951488))) -(assert_return (invoke "f") (f32.const +0x1.000000p+50)) -(module (func (export "f") (result f32) (f32.const -1125899973951488))) -(assert_return (invoke "f") (f32.const -0x1.000000p+50)) -(module (func (export "f") (result f32) (f32.const +1125899973951489))) -(assert_return (invoke "f") (f32.const +0x1.000002p+50)) -(module (func (export "f") (result f32) (f32.const -1125899973951489))) -(assert_return (invoke "f") (f32.const -0x1.000002p+50)) -(module (func (export "f") (result f32) (f32.const +1125900108169215))) -(assert_return (invoke "f") (f32.const +0x1.000002p+50)) -(module (func (export "f") (result f32) (f32.const -1125900108169215))) -(assert_return (invoke "f") (f32.const -0x1.000002p+50)) -(module (func (export "f") (result f32) (f32.const +1125900108169216))) -(assert_return (invoke "f") (f32.const +0x1.000004p+50)) -(module (func (export "f") (result f32) (f32.const -1125900108169216))) -(assert_return (invoke "f") (f32.const -0x1.000004p+50)) - -;; f32, subnormal -(module (func (export "f") (result f32) (f32.const +0x0.00000100000000000p-126))) -(assert_return (invoke "f") (f32.const +0x0.000000p-126)) -(module (func (export "f") (result f32) (f32.const -0x0.00000100000000000p-126))) -(assert_return (invoke "f") (f32.const -0x0.000000p-126)) -(module (func (export "f") (result f32) (f32.const +0x0.00000100000000001p-126))) -(assert_return (invoke "f") (f32.const +0x0.000002p-126)) -(module (func (export "f") (result f32) (f32.const -0x0.00000100000000001p-126))) -(assert_return (invoke "f") (f32.const -0x0.000002p-126)) -(module (func (export "f") (result f32) (f32.const +0x0.000001fffffffffffp-126))) -(assert_return (invoke "f") (f32.const +0x0.000002p-126)) -(module (func (export "f") (result f32) (f32.const -0x0.000001fffffffffffp-126))) -(assert_return (invoke "f") (f32.const -0x0.000002p-126)) -(module (func (export "f") (result f32) (f32.const +0x0.00000200000000000p-126))) -(assert_return (invoke "f") (f32.const +0x0.000002p-126)) -(module (func (export "f") (result f32) (f32.const -0x0.00000200000000000p-126))) -(assert_return (invoke "f") (f32.const -0x0.000002p-126)) -(module (func (export "f") (result f32) (f32.const +0x0.00000200000000001p-126))) -(assert_return (invoke "f") (f32.const +0x0.000002p-126)) -(module (func (export "f") (result f32) (f32.const -0x0.00000200000000001p-126))) -(assert_return (invoke "f") (f32.const -0x0.000002p-126)) -(module (func (export "f") (result f32) (f32.const +0x0.000002fffffffffffp-126))) -(assert_return (invoke "f") (f32.const +0x0.000002p-126)) -(module (func (export "f") (result f32) (f32.const -0x0.000002fffffffffffp-126))) -(assert_return (invoke "f") (f32.const -0x0.000002p-126)) -(module (func (export "f") (result f32) (f32.const +0x0.00000300000000000p-126))) -(assert_return (invoke "f") (f32.const +0x0.000004p-126)) -(module (func (export "f") (result f32) (f32.const -0x0.00000300000000000p-126))) -(assert_return (invoke "f") (f32.const -0x0.000004p-126)) -(module (func (export "f") (result f32) (f32.const +0x0.00000300000000001p-126))) -(assert_return (invoke "f") (f32.const +0x0.000004p-126)) -(module (func (export "f") (result f32) (f32.const -0x0.00000300000000001p-126))) -(assert_return (invoke "f") (f32.const -0x0.000004p-126)) -(module (func (export "f") (result f32) (f32.const +0x0.000003fffffffffffp-126))) -(assert_return (invoke "f") (f32.const +0x0.000004p-126)) -(module (func (export "f") (result f32) (f32.const -0x0.000003fffffffffffp-126))) -(assert_return (invoke "f") (f32.const -0x0.000004p-126)) -(module (func (export "f") (result f32) (f32.const +0x0.00000400000000000p-126))) -(assert_return (invoke "f") (f32.const +0x0.000004p-126)) -(module (func (export "f") (result f32) (f32.const -0x0.00000400000000000p-126))) -(assert_return (invoke "f") (f32.const -0x0.000004p-126)) -(module (func (export "f") (result f32) (f32.const +0x0.00000400000000001p-126))) -(assert_return (invoke "f") (f32.const +0x0.000004p-126)) -(module (func (export "f") (result f32) (f32.const -0x0.00000400000000001p-126))) -(assert_return (invoke "f") (f32.const -0x0.000004p-126)) -(module (func (export "f") (result f32) (f32.const +0x0.000004fffffffffffp-126))) -(assert_return (invoke "f") (f32.const +0x0.000004p-126)) -(module (func (export "f") (result f32) (f32.const -0x0.000004fffffffffffp-126))) -(assert_return (invoke "f") (f32.const -0x0.000004p-126)) -(module (func (export "f") (result f32) (f32.const +0x0.00000500000000000p-126))) -(assert_return (invoke "f") (f32.const +0x0.000004p-126)) -(module (func (export "f") (result f32) (f32.const -0x0.00000500000000000p-126))) -(assert_return (invoke "f") (f32.const -0x0.000004p-126)) -(module (func (export "f") (result f32) (f32.const +0x0.00000500000000001p-126))) -(assert_return (invoke "f") (f32.const +0x0.000006p-126)) -(module (func (export "f") (result f32) (f32.const -0x0.00000500000000001p-126))) -(assert_return (invoke "f") (f32.const -0x0.000006p-126)) - -;; f32, round down at limit to infinity -(module (func (export "f") (result f32) (f32.const +0x1.fffffe8p127))) -(assert_return (invoke "f") (f32.const +0x1.fffffep127)) -(module (func (export "f") (result f32) (f32.const -0x1.fffffe8p127))) -(assert_return (invoke "f") (f32.const -0x1.fffffep127)) -(module (func (export "f") (result f32) (f32.const +0x1.fffffefffffff8p127))) -(assert_return (invoke "f") (f32.const +0x1.fffffep127)) -(module (func (export "f") (result f32) (f32.const -0x1.fffffefffffff8p127))) -(assert_return (invoke "f") (f32.const -0x1.fffffep127)) -(module (func (export "f") (result f32) (f32.const +0x1.fffffefffffffffffp127))) -(assert_return (invoke "f") (f32.const +0x1.fffffep127)) -(module (func (export "f") (result f32) (f32.const -0x1.fffffefffffffffffp127))) -(assert_return (invoke "f") (f32.const -0x1.fffffep127)) - - -(module - (func $id-f32 (param f32) (result f32) (local.get 0)) - (func (export "type-first-f32") (result f32) (call $id-f32 (f32.const 1.32))) -) -(assert_return (invoke "type-first-f32") (f32.const 1.32)) - - -(module - (func (export "add") (param $x f32) (param $y f32) (result f32) (f32.add (local.get $x) (local.get $y))) - (func (export "sub") (param $x f32) (param $y f32) (result f32) (f32.sub (local.get $x) (local.get $y))) - (func (export "mul") (param $x f32) (param $y f32) (result f32) (f32.mul (local.get $x) (local.get $y))) - (func (export "div") (param $x f32) (param $y f32) (result f32) (f32.div (local.get $x) (local.get $y))) - (func (export "sqrt") (param $x f32) (result f32) (f32.sqrt (local.get $x))) - (func (export "min") (param $x f32) (param $y f32) (result f32) (f32.min (local.get $x) (local.get $y))) - (func (export "max") (param $x f32) (param $y f32) (result f32) (f32.max (local.get $x) (local.get $y))) - (func (export "ceil") (param $x f32) (result f32) (f32.ceil (local.get $x))) - (func (export "floor") (param $x f32) (result f32) (f32.floor (local.get $x))) - (func (export "trunc") (param $x f32) (result f32) (f32.trunc (local.get $x))) - (func (export "nearest") (param $x f32) (result f32) (f32.nearest (local.get $x))) -) - -(assert_return (invoke "add" (f32.const -0x0p+0) (f32.const -0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "add" (f32.const -0x0p+0) (f32.const 0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "add" (f32.const 0x0p+0) (f32.const -0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "add" (f32.const 0x0p+0) (f32.const 0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "add" (f32.const -0x0p+0) (f32.const -0x1p-149)) (f32.const -0x1p-149)) -(assert_return (invoke "add" (f32.const -0x0p+0) (f32.const 0x1p-149)) (f32.const 0x1p-149)) -(assert_return (invoke "add" (f32.const 0x0p+0) (f32.const -0x1p-149)) (f32.const -0x1p-149)) -(assert_return (invoke "add" (f32.const 0x0p+0) (f32.const 0x1p-149)) (f32.const 0x1p-149)) -(assert_return (invoke "add" (f32.const -0x0p+0) (f32.const -0x1p-126)) (f32.const -0x1p-126)) -(assert_return (invoke "add" (f32.const -0x0p+0) (f32.const 0x1p-126)) (f32.const 0x1p-126)) -(assert_return (invoke "add" (f32.const 0x0p+0) (f32.const -0x1p-126)) (f32.const -0x1p-126)) -(assert_return (invoke "add" (f32.const 0x0p+0) (f32.const 0x1p-126)) (f32.const 0x1p-126)) -(assert_return (invoke "add" (f32.const -0x0p+0) (f32.const -0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "add" (f32.const -0x0p+0) (f32.const 0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "add" (f32.const 0x0p+0) (f32.const -0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "add" (f32.const 0x0p+0) (f32.const 0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "add" (f32.const -0x0p+0) (f32.const -0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "add" (f32.const -0x0p+0) (f32.const 0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "add" (f32.const 0x0p+0) (f32.const -0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "add" (f32.const 0x0p+0) (f32.const 0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "add" (f32.const -0x0p+0) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "add" (f32.const -0x0p+0) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "add" (f32.const 0x0p+0) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "add" (f32.const 0x0p+0) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "add" (f32.const -0x0p+0) (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const -0x0p+0) (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const 0x0p+0) (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const 0x0p+0) (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const -0x0p+0) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "add" (f32.const -0x0p+0) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "add" (f32.const 0x0p+0) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "add" (f32.const 0x0p+0) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "add" (f32.const -0x0p+0) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const -0x0p+0) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -0x0p+0) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const -0x0p+0) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const 0x0p+0) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const 0x0p+0) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const 0x0p+0) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const 0x0p+0) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -0x1p-149) (f32.const -0x0p+0)) (f32.const -0x1p-149)) -(assert_return (invoke "add" (f32.const -0x1p-149) (f32.const 0x0p+0)) (f32.const -0x1p-149)) -(assert_return (invoke "add" (f32.const 0x1p-149) (f32.const -0x0p+0)) (f32.const 0x1p-149)) -(assert_return (invoke "add" (f32.const 0x1p-149) (f32.const 0x0p+0)) (f32.const 0x1p-149)) -(assert_return (invoke "add" (f32.const -0x1p-149) (f32.const -0x1p-149)) (f32.const -0x1p-148)) -(assert_return (invoke "add" (f32.const -0x1p-149) (f32.const 0x1p-149)) (f32.const 0x0p+0)) -(assert_return (invoke "add" (f32.const 0x1p-149) (f32.const -0x1p-149)) (f32.const 0x0p+0)) -(assert_return (invoke "add" (f32.const 0x1p-149) (f32.const 0x1p-149)) (f32.const 0x1p-148)) -(assert_return (invoke "add" (f32.const -0x1p-149) (f32.const -0x1p-126)) (f32.const -0x1.000002p-126)) -(assert_return (invoke "add" (f32.const -0x1p-149) (f32.const 0x1p-126)) (f32.const 0x1.fffffcp-127)) -(assert_return (invoke "add" (f32.const 0x1p-149) (f32.const -0x1p-126)) (f32.const -0x1.fffffcp-127)) -(assert_return (invoke "add" (f32.const 0x1p-149) (f32.const 0x1p-126)) (f32.const 0x1.000002p-126)) -(assert_return (invoke "add" (f32.const -0x1p-149) (f32.const -0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "add" (f32.const -0x1p-149) (f32.const 0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "add" (f32.const 0x1p-149) (f32.const -0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "add" (f32.const 0x1p-149) (f32.const 0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "add" (f32.const -0x1p-149) (f32.const -0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "add" (f32.const -0x1p-149) (f32.const 0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "add" (f32.const 0x1p-149) (f32.const -0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "add" (f32.const 0x1p-149) (f32.const 0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "add" (f32.const -0x1p-149) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "add" (f32.const -0x1p-149) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "add" (f32.const 0x1p-149) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "add" (f32.const 0x1p-149) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "add" (f32.const -0x1p-149) (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const -0x1p-149) (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const 0x1p-149) (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const 0x1p-149) (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const -0x1p-149) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "add" (f32.const -0x1p-149) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "add" (f32.const 0x1p-149) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "add" (f32.const 0x1p-149) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "add" (f32.const -0x1p-149) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const -0x1p-149) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -0x1p-149) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const -0x1p-149) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const 0x1p-149) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const 0x1p-149) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const 0x1p-149) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const 0x1p-149) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -0x1p-126) (f32.const -0x0p+0)) (f32.const -0x1p-126)) -(assert_return (invoke "add" (f32.const -0x1p-126) (f32.const 0x0p+0)) (f32.const -0x1p-126)) -(assert_return (invoke "add" (f32.const 0x1p-126) (f32.const -0x0p+0)) (f32.const 0x1p-126)) -(assert_return (invoke "add" (f32.const 0x1p-126) (f32.const 0x0p+0)) (f32.const 0x1p-126)) -(assert_return (invoke "add" (f32.const -0x1p-126) (f32.const -0x1p-149)) (f32.const -0x1.000002p-126)) -(assert_return (invoke "add" (f32.const -0x1p-126) (f32.const 0x1p-149)) (f32.const -0x1.fffffcp-127)) -(assert_return (invoke "add" (f32.const 0x1p-126) (f32.const -0x1p-149)) (f32.const 0x1.fffffcp-127)) -(assert_return (invoke "add" (f32.const 0x1p-126) (f32.const 0x1p-149)) (f32.const 0x1.000002p-126)) -(assert_return (invoke "add" (f32.const -0x1p-126) (f32.const -0x1p-126)) (f32.const -0x1p-125)) -(assert_return (invoke "add" (f32.const -0x1p-126) (f32.const 0x1p-126)) (f32.const 0x0p+0)) -(assert_return (invoke "add" (f32.const 0x1p-126) (f32.const -0x1p-126)) (f32.const 0x0p+0)) -(assert_return (invoke "add" (f32.const 0x1p-126) (f32.const 0x1p-126)) (f32.const 0x1p-125)) -(assert_return (invoke "add" (f32.const -0x1p-126) (f32.const -0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "add" (f32.const -0x1p-126) (f32.const 0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "add" (f32.const 0x1p-126) (f32.const -0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "add" (f32.const 0x1p-126) (f32.const 0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "add" (f32.const -0x1p-126) (f32.const -0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "add" (f32.const -0x1p-126) (f32.const 0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "add" (f32.const 0x1p-126) (f32.const -0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "add" (f32.const 0x1p-126) (f32.const 0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "add" (f32.const -0x1p-126) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "add" (f32.const -0x1p-126) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "add" (f32.const 0x1p-126) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "add" (f32.const 0x1p-126) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "add" (f32.const -0x1p-126) (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const -0x1p-126) (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const 0x1p-126) (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const 0x1p-126) (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const -0x1p-126) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "add" (f32.const -0x1p-126) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "add" (f32.const 0x1p-126) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "add" (f32.const 0x1p-126) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "add" (f32.const -0x1p-126) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const -0x1p-126) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -0x1p-126) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const -0x1p-126) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const 0x1p-126) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const 0x1p-126) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const 0x1p-126) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const 0x1p-126) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -0x1p-1) (f32.const -0x0p+0)) (f32.const -0x1p-1)) -(assert_return (invoke "add" (f32.const -0x1p-1) (f32.const 0x0p+0)) (f32.const -0x1p-1)) -(assert_return (invoke "add" (f32.const 0x1p-1) (f32.const -0x0p+0)) (f32.const 0x1p-1)) -(assert_return (invoke "add" (f32.const 0x1p-1) (f32.const 0x0p+0)) (f32.const 0x1p-1)) -(assert_return (invoke "add" (f32.const -0x1p-1) (f32.const -0x1p-149)) (f32.const -0x1p-1)) -(assert_return (invoke "add" (f32.const -0x1p-1) (f32.const 0x1p-149)) (f32.const -0x1p-1)) -(assert_return (invoke "add" (f32.const 0x1p-1) (f32.const -0x1p-149)) (f32.const 0x1p-1)) -(assert_return (invoke "add" (f32.const 0x1p-1) (f32.const 0x1p-149)) (f32.const 0x1p-1)) -(assert_return (invoke "add" (f32.const -0x1p-1) (f32.const -0x1p-126)) (f32.const -0x1p-1)) -(assert_return (invoke "add" (f32.const -0x1p-1) (f32.const 0x1p-126)) (f32.const -0x1p-1)) -(assert_return (invoke "add" (f32.const 0x1p-1) (f32.const -0x1p-126)) (f32.const 0x1p-1)) -(assert_return (invoke "add" (f32.const 0x1p-1) (f32.const 0x1p-126)) (f32.const 0x1p-1)) -(assert_return (invoke "add" (f32.const -0x1p-1) (f32.const -0x1p-1)) (f32.const -0x1p+0)) -(assert_return (invoke "add" (f32.const -0x1p-1) (f32.const 0x1p-1)) (f32.const 0x0p+0)) -(assert_return (invoke "add" (f32.const 0x1p-1) (f32.const -0x1p-1)) (f32.const 0x0p+0)) -(assert_return (invoke "add" (f32.const 0x1p-1) (f32.const 0x1p-1)) (f32.const 0x1p+0)) -(assert_return (invoke "add" (f32.const -0x1p-1) (f32.const -0x1p+0)) (f32.const -0x1.8p+0)) -(assert_return (invoke "add" (f32.const -0x1p-1) (f32.const 0x1p+0)) (f32.const 0x1p-1)) -(assert_return (invoke "add" (f32.const 0x1p-1) (f32.const -0x1p+0)) (f32.const -0x1p-1)) -(assert_return (invoke "add" (f32.const 0x1p-1) (f32.const 0x1p+0)) (f32.const 0x1.8p+0)) -(assert_return (invoke "add" (f32.const -0x1p-1) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.b21fb6p+2)) -(assert_return (invoke "add" (f32.const -0x1p-1) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.721fb6p+2)) -(assert_return (invoke "add" (f32.const 0x1p-1) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.721fb6p+2)) -(assert_return (invoke "add" (f32.const 0x1p-1) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.b21fb6p+2)) -(assert_return (invoke "add" (f32.const -0x1p-1) (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const -0x1p-1) (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const 0x1p-1) (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const 0x1p-1) (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const -0x1p-1) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "add" (f32.const -0x1p-1) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "add" (f32.const 0x1p-1) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "add" (f32.const 0x1p-1) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "add" (f32.const -0x1p-1) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const -0x1p-1) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -0x1p-1) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const -0x1p-1) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const 0x1p-1) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const 0x1p-1) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const 0x1p-1) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const 0x1p-1) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -0x1p+0) (f32.const -0x0p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "add" (f32.const -0x1p+0) (f32.const 0x0p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "add" (f32.const 0x1p+0) (f32.const -0x0p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "add" (f32.const 0x1p+0) (f32.const 0x0p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "add" (f32.const -0x1p+0) (f32.const -0x1p-149)) (f32.const -0x1p+0)) -(assert_return (invoke "add" (f32.const -0x1p+0) (f32.const 0x1p-149)) (f32.const -0x1p+0)) -(assert_return (invoke "add" (f32.const 0x1p+0) (f32.const -0x1p-149)) (f32.const 0x1p+0)) -(assert_return (invoke "add" (f32.const 0x1p+0) (f32.const 0x1p-149)) (f32.const 0x1p+0)) -(assert_return (invoke "add" (f32.const -0x1p+0) (f32.const -0x1p-126)) (f32.const -0x1p+0)) -(assert_return (invoke "add" (f32.const -0x1p+0) (f32.const 0x1p-126)) (f32.const -0x1p+0)) -(assert_return (invoke "add" (f32.const 0x1p+0) (f32.const -0x1p-126)) (f32.const 0x1p+0)) -(assert_return (invoke "add" (f32.const 0x1p+0) (f32.const 0x1p-126)) (f32.const 0x1p+0)) -(assert_return (invoke "add" (f32.const -0x1p+0) (f32.const -0x1p-1)) (f32.const -0x1.8p+0)) -(assert_return (invoke "add" (f32.const -0x1p+0) (f32.const 0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "add" (f32.const 0x1p+0) (f32.const -0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "add" (f32.const 0x1p+0) (f32.const 0x1p-1)) (f32.const 0x1.8p+0)) -(assert_return (invoke "add" (f32.const -0x1p+0) (f32.const -0x1p+0)) (f32.const -0x1p+1)) -(assert_return (invoke "add" (f32.const -0x1p+0) (f32.const 0x1p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "add" (f32.const 0x1p+0) (f32.const -0x1p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "add" (f32.const 0x1p+0) (f32.const 0x1p+0)) (f32.const 0x1p+1)) -(assert_return (invoke "add" (f32.const -0x1p+0) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.d21fb6p+2)) -(assert_return (invoke "add" (f32.const -0x1p+0) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.521fb6p+2)) -(assert_return (invoke "add" (f32.const 0x1p+0) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.521fb6p+2)) -(assert_return (invoke "add" (f32.const 0x1p+0) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.d21fb6p+2)) -(assert_return (invoke "add" (f32.const -0x1p+0) (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const -0x1p+0) (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const 0x1p+0) (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const 0x1p+0) (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const -0x1p+0) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "add" (f32.const -0x1p+0) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "add" (f32.const 0x1p+0) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "add" (f32.const 0x1p+0) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "add" (f32.const -0x1p+0) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const -0x1p+0) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -0x1p+0) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const -0x1p+0) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const 0x1p+0) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const 0x1p+0) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const 0x1p+0) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const 0x1p+0) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -0x1.921fb6p+2) (f32.const -0x0p+0)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "add" (f32.const -0x1.921fb6p+2) (f32.const 0x0p+0)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "add" (f32.const 0x1.921fb6p+2) (f32.const -0x0p+0)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "add" (f32.const 0x1.921fb6p+2) (f32.const 0x0p+0)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "add" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-149)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "add" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-149)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "add" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-149)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "add" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-149)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "add" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-126)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "add" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-126)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "add" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-126)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "add" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-126)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "add" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-1)) (f32.const -0x1.b21fb6p+2)) -(assert_return (invoke "add" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-1)) (f32.const -0x1.721fb6p+2)) -(assert_return (invoke "add" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-1)) (f32.const 0x1.721fb6p+2)) -(assert_return (invoke "add" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-1)) (f32.const 0x1.b21fb6p+2)) -(assert_return (invoke "add" (f32.const -0x1.921fb6p+2) (f32.const -0x1p+0)) (f32.const -0x1.d21fb6p+2)) -(assert_return (invoke "add" (f32.const -0x1.921fb6p+2) (f32.const 0x1p+0)) (f32.const -0x1.521fb6p+2)) -(assert_return (invoke "add" (f32.const 0x1.921fb6p+2) (f32.const -0x1p+0)) (f32.const 0x1.521fb6p+2)) -(assert_return (invoke "add" (f32.const 0x1.921fb6p+2) (f32.const 0x1p+0)) (f32.const 0x1.d21fb6p+2)) -(assert_return (invoke "add" (f32.const -0x1.921fb6p+2) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.921fb6p+3)) -(assert_return (invoke "add" (f32.const -0x1.921fb6p+2) (f32.const 0x1.921fb6p+2)) (f32.const 0x0p+0)) -(assert_return (invoke "add" (f32.const 0x1.921fb6p+2) (f32.const -0x1.921fb6p+2)) (f32.const 0x0p+0)) -(assert_return (invoke "add" (f32.const 0x1.921fb6p+2) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.921fb6p+3)) -(assert_return (invoke "add" (f32.const -0x1.921fb6p+2) (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const -0x1.921fb6p+2) (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const 0x1.921fb6p+2) (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const 0x1.921fb6p+2) (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const -0x1.921fb6p+2) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "add" (f32.const -0x1.921fb6p+2) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "add" (f32.const 0x1.921fb6p+2) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "add" (f32.const 0x1.921fb6p+2) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "add" (f32.const -0x1.921fb6p+2) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const -0x1.921fb6p+2) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -0x1.921fb6p+2) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const -0x1.921fb6p+2) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const 0x1.921fb6p+2) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const 0x1.921fb6p+2) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const 0x1.921fb6p+2) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const 0x1.921fb6p+2) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -0x1.fffffep+127) (f32.const -0x0p+0)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const -0x1.fffffep+127) (f32.const 0x0p+0)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const 0x1.fffffep+127) (f32.const -0x0p+0)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const 0x1.fffffep+127) (f32.const 0x0p+0)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const -0x1.fffffep+127) (f32.const -0x1p-149)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const -0x1.fffffep+127) (f32.const 0x1p-149)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const 0x1.fffffep+127) (f32.const -0x1p-149)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const 0x1.fffffep+127) (f32.const 0x1p-149)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const -0x1.fffffep+127) (f32.const -0x1p-126)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const -0x1.fffffep+127) (f32.const 0x1p-126)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const 0x1.fffffep+127) (f32.const -0x1p-126)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const 0x1.fffffep+127) (f32.const 0x1p-126)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const -0x1.fffffep+127) (f32.const -0x1p-1)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const -0x1.fffffep+127) (f32.const 0x1p-1)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const 0x1.fffffep+127) (f32.const -0x1p-1)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const 0x1.fffffep+127) (f32.const 0x1p-1)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const -0x1.fffffep+127) (f32.const -0x1p+0)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const -0x1.fffffep+127) (f32.const 0x1p+0)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const 0x1.fffffep+127) (f32.const -0x1p+0)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const 0x1.fffffep+127) (f32.const 0x1p+0)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const -0x1.fffffep+127) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const -0x1.fffffep+127) (f32.const 0x1.921fb6p+2)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const 0x1.fffffep+127) (f32.const -0x1.921fb6p+2)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const 0x1.fffffep+127) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "add" (f32.const -0x1.fffffep+127) (f32.const -0x1.fffffep+127)) (f32.const -inf)) -(assert_return (invoke "add" (f32.const -0x1.fffffep+127) (f32.const 0x1.fffffep+127)) (f32.const 0x0p+0)) -(assert_return (invoke "add" (f32.const 0x1.fffffep+127) (f32.const -0x1.fffffep+127)) (f32.const 0x0p+0)) -(assert_return (invoke "add" (f32.const 0x1.fffffep+127) (f32.const 0x1.fffffep+127)) (f32.const inf)) -(assert_return (invoke "add" (f32.const -0x1.fffffep+127) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "add" (f32.const -0x1.fffffep+127) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "add" (f32.const 0x1.fffffep+127) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "add" (f32.const 0x1.fffffep+127) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "add" (f32.const -0x1.fffffep+127) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const -0x1.fffffep+127) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -0x1.fffffep+127) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const -0x1.fffffep+127) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const 0x1.fffffep+127) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const 0x1.fffffep+127) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const 0x1.fffffep+127) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const 0x1.fffffep+127) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -inf) (f32.const -0x0p+0)) (f32.const -inf)) -(assert_return (invoke "add" (f32.const -inf) (f32.const 0x0p+0)) (f32.const -inf)) -(assert_return (invoke "add" (f32.const inf) (f32.const -0x0p+0)) (f32.const inf)) -(assert_return (invoke "add" (f32.const inf) (f32.const 0x0p+0)) (f32.const inf)) -(assert_return (invoke "add" (f32.const -inf) (f32.const -0x1p-149)) (f32.const -inf)) -(assert_return (invoke "add" (f32.const -inf) (f32.const 0x1p-149)) (f32.const -inf)) -(assert_return (invoke "add" (f32.const inf) (f32.const -0x1p-149)) (f32.const inf)) -(assert_return (invoke "add" (f32.const inf) (f32.const 0x1p-149)) (f32.const inf)) -(assert_return (invoke "add" (f32.const -inf) (f32.const -0x1p-126)) (f32.const -inf)) -(assert_return (invoke "add" (f32.const -inf) (f32.const 0x1p-126)) (f32.const -inf)) -(assert_return (invoke "add" (f32.const inf) (f32.const -0x1p-126)) (f32.const inf)) -(assert_return (invoke "add" (f32.const inf) (f32.const 0x1p-126)) (f32.const inf)) -(assert_return (invoke "add" (f32.const -inf) (f32.const -0x1p-1)) (f32.const -inf)) -(assert_return (invoke "add" (f32.const -inf) (f32.const 0x1p-1)) (f32.const -inf)) -(assert_return (invoke "add" (f32.const inf) (f32.const -0x1p-1)) (f32.const inf)) -(assert_return (invoke "add" (f32.const inf) (f32.const 0x1p-1)) (f32.const inf)) -(assert_return (invoke "add" (f32.const -inf) (f32.const -0x1p+0)) (f32.const -inf)) -(assert_return (invoke "add" (f32.const -inf) (f32.const 0x1p+0)) (f32.const -inf)) -(assert_return (invoke "add" (f32.const inf) (f32.const -0x1p+0)) (f32.const inf)) -(assert_return (invoke "add" (f32.const inf) (f32.const 0x1p+0)) (f32.const inf)) -(assert_return (invoke "add" (f32.const -inf) (f32.const -0x1.921fb6p+2)) (f32.const -inf)) -(assert_return (invoke "add" (f32.const -inf) (f32.const 0x1.921fb6p+2)) (f32.const -inf)) -(assert_return (invoke "add" (f32.const inf) (f32.const -0x1.921fb6p+2)) (f32.const inf)) -(assert_return (invoke "add" (f32.const inf) (f32.const 0x1.921fb6p+2)) (f32.const inf)) -(assert_return (invoke "add" (f32.const -inf) (f32.const -0x1.fffffep+127)) (f32.const -inf)) -(assert_return (invoke "add" (f32.const -inf) (f32.const 0x1.fffffep+127)) (f32.const -inf)) -(assert_return (invoke "add" (f32.const inf) (f32.const -0x1.fffffep+127)) (f32.const inf)) -(assert_return (invoke "add" (f32.const inf) (f32.const 0x1.fffffep+127)) (f32.const inf)) -(assert_return (invoke "add" (f32.const -inf) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "add" (f32.const -inf) (f32.const inf)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const inf) (f32.const -inf)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const inf) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "add" (f32.const -inf) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const -inf) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -inf) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const -inf) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const inf) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const inf) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const inf) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const inf) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -nan) (f32.const -0x0p+0)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const -nan:0x200000) (f32.const -0x0p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -nan) (f32.const 0x0p+0)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const -nan:0x200000) (f32.const 0x0p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const nan) (f32.const -0x0p+0)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const nan:0x200000) (f32.const -0x0p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const nan) (f32.const 0x0p+0)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const nan:0x200000) (f32.const 0x0p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -nan) (f32.const -0x1p-149)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const -nan:0x200000) (f32.const -0x1p-149)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -nan) (f32.const 0x1p-149)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const -nan:0x200000) (f32.const 0x1p-149)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const nan) (f32.const -0x1p-149)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const nan:0x200000) (f32.const -0x1p-149)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const nan) (f32.const 0x1p-149)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const nan:0x200000) (f32.const 0x1p-149)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -nan) (f32.const -0x1p-126)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const -nan:0x200000) (f32.const -0x1p-126)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -nan) (f32.const 0x1p-126)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const -nan:0x200000) (f32.const 0x1p-126)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const nan) (f32.const -0x1p-126)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const nan:0x200000) (f32.const -0x1p-126)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const nan) (f32.const 0x1p-126)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const nan:0x200000) (f32.const 0x1p-126)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -nan) (f32.const -0x1p-1)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const -nan:0x200000) (f32.const -0x1p-1)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -nan) (f32.const 0x1p-1)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const -nan:0x200000) (f32.const 0x1p-1)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const nan) (f32.const -0x1p-1)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const nan:0x200000) (f32.const -0x1p-1)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const nan) (f32.const 0x1p-1)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const nan:0x200000) (f32.const 0x1p-1)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -nan) (f32.const -0x1p+0)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const -nan:0x200000) (f32.const -0x1p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -nan) (f32.const 0x1p+0)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const -nan:0x200000) (f32.const 0x1p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const nan) (f32.const -0x1p+0)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const nan:0x200000) (f32.const -0x1p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const nan) (f32.const 0x1p+0)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const nan:0x200000) (f32.const 0x1p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -nan) (f32.const -0x1.921fb6p+2)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const -nan:0x200000) (f32.const -0x1.921fb6p+2)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -nan) (f32.const 0x1.921fb6p+2)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const -nan:0x200000) (f32.const 0x1.921fb6p+2)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const nan) (f32.const -0x1.921fb6p+2)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const nan:0x200000) (f32.const -0x1.921fb6p+2)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const nan) (f32.const 0x1.921fb6p+2)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const nan:0x200000) (f32.const 0x1.921fb6p+2)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -nan) (f32.const -0x1.fffffep+127)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const -nan:0x200000) (f32.const -0x1.fffffep+127)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -nan) (f32.const 0x1.fffffep+127)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const -nan:0x200000) (f32.const 0x1.fffffep+127)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const nan) (f32.const -0x1.fffffep+127)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const nan:0x200000) (f32.const -0x1.fffffep+127)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const nan) (f32.const 0x1.fffffep+127)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const nan:0x200000) (f32.const 0x1.fffffep+127)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -nan) (f32.const -inf)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const -nan:0x200000) (f32.const -inf)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -nan) (f32.const inf)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const -nan:0x200000) (f32.const inf)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const nan) (f32.const -inf)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const nan:0x200000) (f32.const -inf)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const nan) (f32.const inf)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const nan:0x200000) (f32.const inf)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -nan) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const -nan:0x200000) (f32.const -nan)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -nan) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -nan:0x200000) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -nan) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const -nan:0x200000) (f32.const nan)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -nan) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const -nan:0x200000) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const nan) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const nan:0x200000) (f32.const -nan)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const nan) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const nan:0x200000) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const nan) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "add" (f32.const nan:0x200000) (f32.const nan)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const nan) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "add" (f32.const nan:0x200000) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -0x0p+0) (f32.const -0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "sub" (f32.const -0x0p+0) (f32.const 0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "sub" (f32.const 0x0p+0) (f32.const -0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "sub" (f32.const 0x0p+0) (f32.const 0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "sub" (f32.const -0x0p+0) (f32.const -0x1p-149)) (f32.const 0x1p-149)) -(assert_return (invoke "sub" (f32.const -0x0p+0) (f32.const 0x1p-149)) (f32.const -0x1p-149)) -(assert_return (invoke "sub" (f32.const 0x0p+0) (f32.const -0x1p-149)) (f32.const 0x1p-149)) -(assert_return (invoke "sub" (f32.const 0x0p+0) (f32.const 0x1p-149)) (f32.const -0x1p-149)) -(assert_return (invoke "sub" (f32.const -0x0p+0) (f32.const -0x1p-126)) (f32.const 0x1p-126)) -(assert_return (invoke "sub" (f32.const -0x0p+0) (f32.const 0x1p-126)) (f32.const -0x1p-126)) -(assert_return (invoke "sub" (f32.const 0x0p+0) (f32.const -0x1p-126)) (f32.const 0x1p-126)) -(assert_return (invoke "sub" (f32.const 0x0p+0) (f32.const 0x1p-126)) (f32.const -0x1p-126)) -(assert_return (invoke "sub" (f32.const -0x0p+0) (f32.const -0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "sub" (f32.const -0x0p+0) (f32.const 0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "sub" (f32.const 0x0p+0) (f32.const -0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "sub" (f32.const 0x0p+0) (f32.const 0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "sub" (f32.const -0x0p+0) (f32.const -0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "sub" (f32.const -0x0p+0) (f32.const 0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "sub" (f32.const 0x0p+0) (f32.const -0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "sub" (f32.const 0x0p+0) (f32.const 0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "sub" (f32.const -0x0p+0) (f32.const -0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "sub" (f32.const -0x0p+0) (f32.const 0x1.921fb6p+2)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "sub" (f32.const 0x0p+0) (f32.const -0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "sub" (f32.const 0x0p+0) (f32.const 0x1.921fb6p+2)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "sub" (f32.const -0x0p+0) (f32.const -0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const -0x0p+0) (f32.const 0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const 0x0p+0) (f32.const -0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const 0x0p+0) (f32.const 0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const -0x0p+0) (f32.const -inf)) (f32.const inf)) -(assert_return (invoke "sub" (f32.const -0x0p+0) (f32.const inf)) (f32.const -inf)) -(assert_return (invoke "sub" (f32.const 0x0p+0) (f32.const -inf)) (f32.const inf)) -(assert_return (invoke "sub" (f32.const 0x0p+0) (f32.const inf)) (f32.const -inf)) -(assert_return (invoke "sub" (f32.const -0x0p+0) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const -0x0p+0) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -0x0p+0) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const -0x0p+0) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const 0x0p+0) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const 0x0p+0) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const 0x0p+0) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const 0x0p+0) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -0x1p-149) (f32.const -0x0p+0)) (f32.const -0x1p-149)) -(assert_return (invoke "sub" (f32.const -0x1p-149) (f32.const 0x0p+0)) (f32.const -0x1p-149)) -(assert_return (invoke "sub" (f32.const 0x1p-149) (f32.const -0x0p+0)) (f32.const 0x1p-149)) -(assert_return (invoke "sub" (f32.const 0x1p-149) (f32.const 0x0p+0)) (f32.const 0x1p-149)) -(assert_return (invoke "sub" (f32.const -0x1p-149) (f32.const -0x1p-149)) (f32.const 0x0p+0)) -(assert_return (invoke "sub" (f32.const -0x1p-149) (f32.const 0x1p-149)) (f32.const -0x1p-148)) -(assert_return (invoke "sub" (f32.const 0x1p-149) (f32.const -0x1p-149)) (f32.const 0x1p-148)) -(assert_return (invoke "sub" (f32.const 0x1p-149) (f32.const 0x1p-149)) (f32.const 0x0p+0)) -(assert_return (invoke "sub" (f32.const -0x1p-149) (f32.const -0x1p-126)) (f32.const 0x1.fffffcp-127)) -(assert_return (invoke "sub" (f32.const -0x1p-149) (f32.const 0x1p-126)) (f32.const -0x1.000002p-126)) -(assert_return (invoke "sub" (f32.const 0x1p-149) (f32.const -0x1p-126)) (f32.const 0x1.000002p-126)) -(assert_return (invoke "sub" (f32.const 0x1p-149) (f32.const 0x1p-126)) (f32.const -0x1.fffffcp-127)) -(assert_return (invoke "sub" (f32.const -0x1p-149) (f32.const -0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "sub" (f32.const -0x1p-149) (f32.const 0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "sub" (f32.const 0x1p-149) (f32.const -0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "sub" (f32.const 0x1p-149) (f32.const 0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "sub" (f32.const -0x1p-149) (f32.const -0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "sub" (f32.const -0x1p-149) (f32.const 0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "sub" (f32.const 0x1p-149) (f32.const -0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "sub" (f32.const 0x1p-149) (f32.const 0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "sub" (f32.const -0x1p-149) (f32.const -0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "sub" (f32.const -0x1p-149) (f32.const 0x1.921fb6p+2)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "sub" (f32.const 0x1p-149) (f32.const -0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "sub" (f32.const 0x1p-149) (f32.const 0x1.921fb6p+2)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "sub" (f32.const -0x1p-149) (f32.const -0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const -0x1p-149) (f32.const 0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const 0x1p-149) (f32.const -0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const 0x1p-149) (f32.const 0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const -0x1p-149) (f32.const -inf)) (f32.const inf)) -(assert_return (invoke "sub" (f32.const -0x1p-149) (f32.const inf)) (f32.const -inf)) -(assert_return (invoke "sub" (f32.const 0x1p-149) (f32.const -inf)) (f32.const inf)) -(assert_return (invoke "sub" (f32.const 0x1p-149) (f32.const inf)) (f32.const -inf)) -(assert_return (invoke "sub" (f32.const -0x1p-149) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const -0x1p-149) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -0x1p-149) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const -0x1p-149) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const 0x1p-149) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const 0x1p-149) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const 0x1p-149) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const 0x1p-149) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -0x1p-126) (f32.const -0x0p+0)) (f32.const -0x1p-126)) -(assert_return (invoke "sub" (f32.const -0x1p-126) (f32.const 0x0p+0)) (f32.const -0x1p-126)) -(assert_return (invoke "sub" (f32.const 0x1p-126) (f32.const -0x0p+0)) (f32.const 0x1p-126)) -(assert_return (invoke "sub" (f32.const 0x1p-126) (f32.const 0x0p+0)) (f32.const 0x1p-126)) -(assert_return (invoke "sub" (f32.const -0x1p-126) (f32.const -0x1p-149)) (f32.const -0x1.fffffcp-127)) -(assert_return (invoke "sub" (f32.const -0x1p-126) (f32.const 0x1p-149)) (f32.const -0x1.000002p-126)) -(assert_return (invoke "sub" (f32.const 0x1p-126) (f32.const -0x1p-149)) (f32.const 0x1.000002p-126)) -(assert_return (invoke "sub" (f32.const 0x1p-126) (f32.const 0x1p-149)) (f32.const 0x1.fffffcp-127)) -(assert_return (invoke "sub" (f32.const -0x1p-126) (f32.const -0x1p-126)) (f32.const 0x0p+0)) -(assert_return (invoke "sub" (f32.const -0x1p-126) (f32.const 0x1p-126)) (f32.const -0x1p-125)) -(assert_return (invoke "sub" (f32.const 0x1p-126) (f32.const -0x1p-126)) (f32.const 0x1p-125)) -(assert_return (invoke "sub" (f32.const 0x1p-126) (f32.const 0x1p-126)) (f32.const 0x0p+0)) -(assert_return (invoke "sub" (f32.const -0x1p-126) (f32.const -0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "sub" (f32.const -0x1p-126) (f32.const 0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "sub" (f32.const 0x1p-126) (f32.const -0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "sub" (f32.const 0x1p-126) (f32.const 0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "sub" (f32.const -0x1p-126) (f32.const -0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "sub" (f32.const -0x1p-126) (f32.const 0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "sub" (f32.const 0x1p-126) (f32.const -0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "sub" (f32.const 0x1p-126) (f32.const 0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "sub" (f32.const -0x1p-126) (f32.const -0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "sub" (f32.const -0x1p-126) (f32.const 0x1.921fb6p+2)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "sub" (f32.const 0x1p-126) (f32.const -0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "sub" (f32.const 0x1p-126) (f32.const 0x1.921fb6p+2)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "sub" (f32.const -0x1p-126) (f32.const -0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const -0x1p-126) (f32.const 0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const 0x1p-126) (f32.const -0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const 0x1p-126) (f32.const 0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const -0x1p-126) (f32.const -inf)) (f32.const inf)) -(assert_return (invoke "sub" (f32.const -0x1p-126) (f32.const inf)) (f32.const -inf)) -(assert_return (invoke "sub" (f32.const 0x1p-126) (f32.const -inf)) (f32.const inf)) -(assert_return (invoke "sub" (f32.const 0x1p-126) (f32.const inf)) (f32.const -inf)) -(assert_return (invoke "sub" (f32.const -0x1p-126) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const -0x1p-126) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -0x1p-126) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const -0x1p-126) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const 0x1p-126) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const 0x1p-126) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const 0x1p-126) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const 0x1p-126) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -0x1p-1) (f32.const -0x0p+0)) (f32.const -0x1p-1)) -(assert_return (invoke "sub" (f32.const -0x1p-1) (f32.const 0x0p+0)) (f32.const -0x1p-1)) -(assert_return (invoke "sub" (f32.const 0x1p-1) (f32.const -0x0p+0)) (f32.const 0x1p-1)) -(assert_return (invoke "sub" (f32.const 0x1p-1) (f32.const 0x0p+0)) (f32.const 0x1p-1)) -(assert_return (invoke "sub" (f32.const -0x1p-1) (f32.const -0x1p-149)) (f32.const -0x1p-1)) -(assert_return (invoke "sub" (f32.const -0x1p-1) (f32.const 0x1p-149)) (f32.const -0x1p-1)) -(assert_return (invoke "sub" (f32.const 0x1p-1) (f32.const -0x1p-149)) (f32.const 0x1p-1)) -(assert_return (invoke "sub" (f32.const 0x1p-1) (f32.const 0x1p-149)) (f32.const 0x1p-1)) -(assert_return (invoke "sub" (f32.const -0x1p-1) (f32.const -0x1p-126)) (f32.const -0x1p-1)) -(assert_return (invoke "sub" (f32.const -0x1p-1) (f32.const 0x1p-126)) (f32.const -0x1p-1)) -(assert_return (invoke "sub" (f32.const 0x1p-1) (f32.const -0x1p-126)) (f32.const 0x1p-1)) -(assert_return (invoke "sub" (f32.const 0x1p-1) (f32.const 0x1p-126)) (f32.const 0x1p-1)) -(assert_return (invoke "sub" (f32.const -0x1p-1) (f32.const -0x1p-1)) (f32.const 0x0p+0)) -(assert_return (invoke "sub" (f32.const -0x1p-1) (f32.const 0x1p-1)) (f32.const -0x1p+0)) -(assert_return (invoke "sub" (f32.const 0x1p-1) (f32.const -0x1p-1)) (f32.const 0x1p+0)) -(assert_return (invoke "sub" (f32.const 0x1p-1) (f32.const 0x1p-1)) (f32.const 0x0p+0)) -(assert_return (invoke "sub" (f32.const -0x1p-1) (f32.const -0x1p+0)) (f32.const 0x1p-1)) -(assert_return (invoke "sub" (f32.const -0x1p-1) (f32.const 0x1p+0)) (f32.const -0x1.8p+0)) -(assert_return (invoke "sub" (f32.const 0x1p-1) (f32.const -0x1p+0)) (f32.const 0x1.8p+0)) -(assert_return (invoke "sub" (f32.const 0x1p-1) (f32.const 0x1p+0)) (f32.const -0x1p-1)) -(assert_return (invoke "sub" (f32.const -0x1p-1) (f32.const -0x1.921fb6p+2)) (f32.const 0x1.721fb6p+2)) -(assert_return (invoke "sub" (f32.const -0x1p-1) (f32.const 0x1.921fb6p+2)) (f32.const -0x1.b21fb6p+2)) -(assert_return (invoke "sub" (f32.const 0x1p-1) (f32.const -0x1.921fb6p+2)) (f32.const 0x1.b21fb6p+2)) -(assert_return (invoke "sub" (f32.const 0x1p-1) (f32.const 0x1.921fb6p+2)) (f32.const -0x1.721fb6p+2)) -(assert_return (invoke "sub" (f32.const -0x1p-1) (f32.const -0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const -0x1p-1) (f32.const 0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const 0x1p-1) (f32.const -0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const 0x1p-1) (f32.const 0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const -0x1p-1) (f32.const -inf)) (f32.const inf)) -(assert_return (invoke "sub" (f32.const -0x1p-1) (f32.const inf)) (f32.const -inf)) -(assert_return (invoke "sub" (f32.const 0x1p-1) (f32.const -inf)) (f32.const inf)) -(assert_return (invoke "sub" (f32.const 0x1p-1) (f32.const inf)) (f32.const -inf)) -(assert_return (invoke "sub" (f32.const -0x1p-1) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const -0x1p-1) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -0x1p-1) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const -0x1p-1) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const 0x1p-1) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const 0x1p-1) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const 0x1p-1) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const 0x1p-1) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -0x1p+0) (f32.const -0x0p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "sub" (f32.const -0x1p+0) (f32.const 0x0p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "sub" (f32.const 0x1p+0) (f32.const -0x0p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "sub" (f32.const 0x1p+0) (f32.const 0x0p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "sub" (f32.const -0x1p+0) (f32.const -0x1p-149)) (f32.const -0x1p+0)) -(assert_return (invoke "sub" (f32.const -0x1p+0) (f32.const 0x1p-149)) (f32.const -0x1p+0)) -(assert_return (invoke "sub" (f32.const 0x1p+0) (f32.const -0x1p-149)) (f32.const 0x1p+0)) -(assert_return (invoke "sub" (f32.const 0x1p+0) (f32.const 0x1p-149)) (f32.const 0x1p+0)) -(assert_return (invoke "sub" (f32.const -0x1p+0) (f32.const -0x1p-126)) (f32.const -0x1p+0)) -(assert_return (invoke "sub" (f32.const -0x1p+0) (f32.const 0x1p-126)) (f32.const -0x1p+0)) -(assert_return (invoke "sub" (f32.const 0x1p+0) (f32.const -0x1p-126)) (f32.const 0x1p+0)) -(assert_return (invoke "sub" (f32.const 0x1p+0) (f32.const 0x1p-126)) (f32.const 0x1p+0)) -(assert_return (invoke "sub" (f32.const -0x1p+0) (f32.const -0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "sub" (f32.const -0x1p+0) (f32.const 0x1p-1)) (f32.const -0x1.8p+0)) -(assert_return (invoke "sub" (f32.const 0x1p+0) (f32.const -0x1p-1)) (f32.const 0x1.8p+0)) -(assert_return (invoke "sub" (f32.const 0x1p+0) (f32.const 0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "sub" (f32.const -0x1p+0) (f32.const -0x1p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "sub" (f32.const -0x1p+0) (f32.const 0x1p+0)) (f32.const -0x1p+1)) -(assert_return (invoke "sub" (f32.const 0x1p+0) (f32.const -0x1p+0)) (f32.const 0x1p+1)) -(assert_return (invoke "sub" (f32.const 0x1p+0) (f32.const 0x1p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "sub" (f32.const -0x1p+0) (f32.const -0x1.921fb6p+2)) (f32.const 0x1.521fb6p+2)) -(assert_return (invoke "sub" (f32.const -0x1p+0) (f32.const 0x1.921fb6p+2)) (f32.const -0x1.d21fb6p+2)) -(assert_return (invoke "sub" (f32.const 0x1p+0) (f32.const -0x1.921fb6p+2)) (f32.const 0x1.d21fb6p+2)) -(assert_return (invoke "sub" (f32.const 0x1p+0) (f32.const 0x1.921fb6p+2)) (f32.const -0x1.521fb6p+2)) -(assert_return (invoke "sub" (f32.const -0x1p+0) (f32.const -0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const -0x1p+0) (f32.const 0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const 0x1p+0) (f32.const -0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const 0x1p+0) (f32.const 0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const -0x1p+0) (f32.const -inf)) (f32.const inf)) -(assert_return (invoke "sub" (f32.const -0x1p+0) (f32.const inf)) (f32.const -inf)) -(assert_return (invoke "sub" (f32.const 0x1p+0) (f32.const -inf)) (f32.const inf)) -(assert_return (invoke "sub" (f32.const 0x1p+0) (f32.const inf)) (f32.const -inf)) -(assert_return (invoke "sub" (f32.const -0x1p+0) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const -0x1p+0) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -0x1p+0) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const -0x1p+0) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const 0x1p+0) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const 0x1p+0) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const 0x1p+0) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const 0x1p+0) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -0x1.921fb6p+2) (f32.const -0x0p+0)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "sub" (f32.const -0x1.921fb6p+2) (f32.const 0x0p+0)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "sub" (f32.const 0x1.921fb6p+2) (f32.const -0x0p+0)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "sub" (f32.const 0x1.921fb6p+2) (f32.const 0x0p+0)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "sub" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-149)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "sub" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-149)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "sub" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-149)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "sub" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-149)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "sub" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-126)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "sub" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-126)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "sub" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-126)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "sub" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-126)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "sub" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-1)) (f32.const -0x1.721fb6p+2)) -(assert_return (invoke "sub" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-1)) (f32.const -0x1.b21fb6p+2)) -(assert_return (invoke "sub" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-1)) (f32.const 0x1.b21fb6p+2)) -(assert_return (invoke "sub" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-1)) (f32.const 0x1.721fb6p+2)) -(assert_return (invoke "sub" (f32.const -0x1.921fb6p+2) (f32.const -0x1p+0)) (f32.const -0x1.521fb6p+2)) -(assert_return (invoke "sub" (f32.const -0x1.921fb6p+2) (f32.const 0x1p+0)) (f32.const -0x1.d21fb6p+2)) -(assert_return (invoke "sub" (f32.const 0x1.921fb6p+2) (f32.const -0x1p+0)) (f32.const 0x1.d21fb6p+2)) -(assert_return (invoke "sub" (f32.const 0x1.921fb6p+2) (f32.const 0x1p+0)) (f32.const 0x1.521fb6p+2)) -(assert_return (invoke "sub" (f32.const -0x1.921fb6p+2) (f32.const -0x1.921fb6p+2)) (f32.const 0x0p+0)) -(assert_return (invoke "sub" (f32.const -0x1.921fb6p+2) (f32.const 0x1.921fb6p+2)) (f32.const -0x1.921fb6p+3)) -(assert_return (invoke "sub" (f32.const 0x1.921fb6p+2) (f32.const -0x1.921fb6p+2)) (f32.const 0x1.921fb6p+3)) -(assert_return (invoke "sub" (f32.const 0x1.921fb6p+2) (f32.const 0x1.921fb6p+2)) (f32.const 0x0p+0)) -(assert_return (invoke "sub" (f32.const -0x1.921fb6p+2) (f32.const -0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const -0x1.921fb6p+2) (f32.const 0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const 0x1.921fb6p+2) (f32.const -0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const 0x1.921fb6p+2) (f32.const 0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const -0x1.921fb6p+2) (f32.const -inf)) (f32.const inf)) -(assert_return (invoke "sub" (f32.const -0x1.921fb6p+2) (f32.const inf)) (f32.const -inf)) -(assert_return (invoke "sub" (f32.const 0x1.921fb6p+2) (f32.const -inf)) (f32.const inf)) -(assert_return (invoke "sub" (f32.const 0x1.921fb6p+2) (f32.const inf)) (f32.const -inf)) -(assert_return (invoke "sub" (f32.const -0x1.921fb6p+2) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const -0x1.921fb6p+2) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -0x1.921fb6p+2) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const -0x1.921fb6p+2) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const 0x1.921fb6p+2) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const 0x1.921fb6p+2) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const 0x1.921fb6p+2) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const 0x1.921fb6p+2) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -0x1.fffffep+127) (f32.const -0x0p+0)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const -0x1.fffffep+127) (f32.const 0x0p+0)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const 0x1.fffffep+127) (f32.const -0x0p+0)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const 0x1.fffffep+127) (f32.const 0x0p+0)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const -0x1.fffffep+127) (f32.const -0x1p-149)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const -0x1.fffffep+127) (f32.const 0x1p-149)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const 0x1.fffffep+127) (f32.const -0x1p-149)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const 0x1.fffffep+127) (f32.const 0x1p-149)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const -0x1.fffffep+127) (f32.const -0x1p-126)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const -0x1.fffffep+127) (f32.const 0x1p-126)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const 0x1.fffffep+127) (f32.const -0x1p-126)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const 0x1.fffffep+127) (f32.const 0x1p-126)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const -0x1.fffffep+127) (f32.const -0x1p-1)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const -0x1.fffffep+127) (f32.const 0x1p-1)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const 0x1.fffffep+127) (f32.const -0x1p-1)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const 0x1.fffffep+127) (f32.const 0x1p-1)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const -0x1.fffffep+127) (f32.const -0x1p+0)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const -0x1.fffffep+127) (f32.const 0x1p+0)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const 0x1.fffffep+127) (f32.const -0x1p+0)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const 0x1.fffffep+127) (f32.const 0x1p+0)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const -0x1.fffffep+127) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const -0x1.fffffep+127) (f32.const 0x1.921fb6p+2)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const 0x1.fffffep+127) (f32.const -0x1.921fb6p+2)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const 0x1.fffffep+127) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "sub" (f32.const -0x1.fffffep+127) (f32.const -0x1.fffffep+127)) (f32.const 0x0p+0)) -(assert_return (invoke "sub" (f32.const -0x1.fffffep+127) (f32.const 0x1.fffffep+127)) (f32.const -inf)) -(assert_return (invoke "sub" (f32.const 0x1.fffffep+127) (f32.const -0x1.fffffep+127)) (f32.const inf)) -(assert_return (invoke "sub" (f32.const 0x1.fffffep+127) (f32.const 0x1.fffffep+127)) (f32.const 0x0p+0)) -(assert_return (invoke "sub" (f32.const -0x1.fffffep+127) (f32.const -inf)) (f32.const inf)) -(assert_return (invoke "sub" (f32.const -0x1.fffffep+127) (f32.const inf)) (f32.const -inf)) -(assert_return (invoke "sub" (f32.const 0x1.fffffep+127) (f32.const -inf)) (f32.const inf)) -(assert_return (invoke "sub" (f32.const 0x1.fffffep+127) (f32.const inf)) (f32.const -inf)) -(assert_return (invoke "sub" (f32.const -0x1.fffffep+127) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const -0x1.fffffep+127) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -0x1.fffffep+127) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const -0x1.fffffep+127) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const 0x1.fffffep+127) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const 0x1.fffffep+127) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const 0x1.fffffep+127) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const 0x1.fffffep+127) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -inf) (f32.const -0x0p+0)) (f32.const -inf)) -(assert_return (invoke "sub" (f32.const -inf) (f32.const 0x0p+0)) (f32.const -inf)) -(assert_return (invoke "sub" (f32.const inf) (f32.const -0x0p+0)) (f32.const inf)) -(assert_return (invoke "sub" (f32.const inf) (f32.const 0x0p+0)) (f32.const inf)) -(assert_return (invoke "sub" (f32.const -inf) (f32.const -0x1p-149)) (f32.const -inf)) -(assert_return (invoke "sub" (f32.const -inf) (f32.const 0x1p-149)) (f32.const -inf)) -(assert_return (invoke "sub" (f32.const inf) (f32.const -0x1p-149)) (f32.const inf)) -(assert_return (invoke "sub" (f32.const inf) (f32.const 0x1p-149)) (f32.const inf)) -(assert_return (invoke "sub" (f32.const -inf) (f32.const -0x1p-126)) (f32.const -inf)) -(assert_return (invoke "sub" (f32.const -inf) (f32.const 0x1p-126)) (f32.const -inf)) -(assert_return (invoke "sub" (f32.const inf) (f32.const -0x1p-126)) (f32.const inf)) -(assert_return (invoke "sub" (f32.const inf) (f32.const 0x1p-126)) (f32.const inf)) -(assert_return (invoke "sub" (f32.const -inf) (f32.const -0x1p-1)) (f32.const -inf)) -(assert_return (invoke "sub" (f32.const -inf) (f32.const 0x1p-1)) (f32.const -inf)) -(assert_return (invoke "sub" (f32.const inf) (f32.const -0x1p-1)) (f32.const inf)) -(assert_return (invoke "sub" (f32.const inf) (f32.const 0x1p-1)) (f32.const inf)) -(assert_return (invoke "sub" (f32.const -inf) (f32.const -0x1p+0)) (f32.const -inf)) -(assert_return (invoke "sub" (f32.const -inf) (f32.const 0x1p+0)) (f32.const -inf)) -(assert_return (invoke "sub" (f32.const inf) (f32.const -0x1p+0)) (f32.const inf)) -(assert_return (invoke "sub" (f32.const inf) (f32.const 0x1p+0)) (f32.const inf)) -(assert_return (invoke "sub" (f32.const -inf) (f32.const -0x1.921fb6p+2)) (f32.const -inf)) -(assert_return (invoke "sub" (f32.const -inf) (f32.const 0x1.921fb6p+2)) (f32.const -inf)) -(assert_return (invoke "sub" (f32.const inf) (f32.const -0x1.921fb6p+2)) (f32.const inf)) -(assert_return (invoke "sub" (f32.const inf) (f32.const 0x1.921fb6p+2)) (f32.const inf)) -(assert_return (invoke "sub" (f32.const -inf) (f32.const -0x1.fffffep+127)) (f32.const -inf)) -(assert_return (invoke "sub" (f32.const -inf) (f32.const 0x1.fffffep+127)) (f32.const -inf)) -(assert_return (invoke "sub" (f32.const inf) (f32.const -0x1.fffffep+127)) (f32.const inf)) -(assert_return (invoke "sub" (f32.const inf) (f32.const 0x1.fffffep+127)) (f32.const inf)) -(assert_return (invoke "sub" (f32.const -inf) (f32.const -inf)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const -inf) (f32.const inf)) (f32.const -inf)) -(assert_return (invoke "sub" (f32.const inf) (f32.const -inf)) (f32.const inf)) -(assert_return (invoke "sub" (f32.const inf) (f32.const inf)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const -inf) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const -inf) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -inf) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const -inf) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const inf) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const inf) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const inf) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const inf) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -nan) (f32.const -0x0p+0)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const -nan:0x200000) (f32.const -0x0p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -nan) (f32.const 0x0p+0)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const -nan:0x200000) (f32.const 0x0p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const nan) (f32.const -0x0p+0)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const nan:0x200000) (f32.const -0x0p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const nan) (f32.const 0x0p+0)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const nan:0x200000) (f32.const 0x0p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -nan) (f32.const -0x1p-149)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const -nan:0x200000) (f32.const -0x1p-149)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -nan) (f32.const 0x1p-149)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const -nan:0x200000) (f32.const 0x1p-149)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const nan) (f32.const -0x1p-149)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const nan:0x200000) (f32.const -0x1p-149)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const nan) (f32.const 0x1p-149)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const nan:0x200000) (f32.const 0x1p-149)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -nan) (f32.const -0x1p-126)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const -nan:0x200000) (f32.const -0x1p-126)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -nan) (f32.const 0x1p-126)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const -nan:0x200000) (f32.const 0x1p-126)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const nan) (f32.const -0x1p-126)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const nan:0x200000) (f32.const -0x1p-126)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const nan) (f32.const 0x1p-126)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const nan:0x200000) (f32.const 0x1p-126)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -nan) (f32.const -0x1p-1)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const -nan:0x200000) (f32.const -0x1p-1)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -nan) (f32.const 0x1p-1)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const -nan:0x200000) (f32.const 0x1p-1)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const nan) (f32.const -0x1p-1)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const nan:0x200000) (f32.const -0x1p-1)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const nan) (f32.const 0x1p-1)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const nan:0x200000) (f32.const 0x1p-1)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -nan) (f32.const -0x1p+0)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const -nan:0x200000) (f32.const -0x1p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -nan) (f32.const 0x1p+0)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const -nan:0x200000) (f32.const 0x1p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const nan) (f32.const -0x1p+0)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const nan:0x200000) (f32.const -0x1p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const nan) (f32.const 0x1p+0)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const nan:0x200000) (f32.const 0x1p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -nan) (f32.const -0x1.921fb6p+2)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const -nan:0x200000) (f32.const -0x1.921fb6p+2)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -nan) (f32.const 0x1.921fb6p+2)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const -nan:0x200000) (f32.const 0x1.921fb6p+2)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const nan) (f32.const -0x1.921fb6p+2)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const nan:0x200000) (f32.const -0x1.921fb6p+2)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const nan) (f32.const 0x1.921fb6p+2)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const nan:0x200000) (f32.const 0x1.921fb6p+2)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -nan) (f32.const -0x1.fffffep+127)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const -nan:0x200000) (f32.const -0x1.fffffep+127)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -nan) (f32.const 0x1.fffffep+127)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const -nan:0x200000) (f32.const 0x1.fffffep+127)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const nan) (f32.const -0x1.fffffep+127)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const nan:0x200000) (f32.const -0x1.fffffep+127)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const nan) (f32.const 0x1.fffffep+127)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const nan:0x200000) (f32.const 0x1.fffffep+127)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -nan) (f32.const -inf)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const -nan:0x200000) (f32.const -inf)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -nan) (f32.const inf)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const -nan:0x200000) (f32.const inf)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const nan) (f32.const -inf)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const nan:0x200000) (f32.const -inf)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const nan) (f32.const inf)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const nan:0x200000) (f32.const inf)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -nan) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const -nan:0x200000) (f32.const -nan)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -nan) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -nan:0x200000) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -nan) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const -nan:0x200000) (f32.const nan)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -nan) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const -nan:0x200000) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const nan) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const nan:0x200000) (f32.const -nan)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const nan) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const nan:0x200000) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const nan) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "sub" (f32.const nan:0x200000) (f32.const nan)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const nan) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sub" (f32.const nan:0x200000) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -0x0p+0) (f32.const -0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x0p+0) (f32.const 0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x0p+0) (f32.const -0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x0p+0) (f32.const 0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x0p+0) (f32.const -0x1p-149)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x0p+0) (f32.const 0x1p-149)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x0p+0) (f32.const -0x1p-149)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x0p+0) (f32.const 0x1p-149)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x0p+0) (f32.const -0x1p-126)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x0p+0) (f32.const 0x1p-126)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x0p+0) (f32.const -0x1p-126)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x0p+0) (f32.const 0x1p-126)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x0p+0) (f32.const -0x1p-1)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x0p+0) (f32.const 0x1p-1)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x0p+0) (f32.const -0x1p-1)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x0p+0) (f32.const 0x1p-1)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x0p+0) (f32.const -0x1p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x0p+0) (f32.const 0x1p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x0p+0) (f32.const -0x1p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x0p+0) (f32.const 0x1p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x0p+0) (f32.const -0x1.921fb6p+2)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x0p+0) (f32.const 0x1.921fb6p+2)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x0p+0) (f32.const -0x1.921fb6p+2)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x0p+0) (f32.const 0x1.921fb6p+2)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x0p+0) (f32.const -0x1.fffffep+127)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x0p+0) (f32.const 0x1.fffffep+127)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x0p+0) (f32.const -0x1.fffffep+127)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x0p+0) (f32.const 0x1.fffffep+127)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x0p+0) (f32.const -inf)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -0x0p+0) (f32.const inf)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const 0x0p+0) (f32.const -inf)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const 0x0p+0) (f32.const inf)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -0x0p+0) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -0x0p+0) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -0x0p+0) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -0x0p+0) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const 0x0p+0) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const 0x0p+0) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const 0x0p+0) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const 0x0p+0) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -0x1p-149) (f32.const -0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x1p-149) (f32.const 0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x1p-149) (f32.const -0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x1p-149) (f32.const 0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x1p-149) (f32.const -0x1p-149)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x1p-149) (f32.const 0x1p-149)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x1p-149) (f32.const -0x1p-149)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x1p-149) (f32.const 0x1p-149)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x1p-149) (f32.const -0x1p-126)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x1p-149) (f32.const 0x1p-126)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x1p-149) (f32.const -0x1p-126)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x1p-149) (f32.const 0x1p-126)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x1p-149) (f32.const -0x1p-1)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x1p-149) (f32.const 0x1p-1)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x1p-149) (f32.const -0x1p-1)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x1p-149) (f32.const 0x1p-1)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x1p-149) (f32.const -0x1p+0)) (f32.const 0x1p-149)) -(assert_return (invoke "mul" (f32.const -0x1p-149) (f32.const 0x1p+0)) (f32.const -0x1p-149)) -(assert_return (invoke "mul" (f32.const 0x1p-149) (f32.const -0x1p+0)) (f32.const -0x1p-149)) -(assert_return (invoke "mul" (f32.const 0x1p-149) (f32.const 0x1p+0)) (f32.const 0x1p-149)) -(assert_return (invoke "mul" (f32.const -0x1p-149) (f32.const -0x1.921fb6p+2)) (f32.const 0x1.8p-147)) -(assert_return (invoke "mul" (f32.const -0x1p-149) (f32.const 0x1.921fb6p+2)) (f32.const -0x1.8p-147)) -(assert_return (invoke "mul" (f32.const 0x1p-149) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.8p-147)) -(assert_return (invoke "mul" (f32.const 0x1p-149) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.8p-147)) -(assert_return (invoke "mul" (f32.const -0x1p-149) (f32.const -0x1.fffffep+127)) (f32.const 0x1.fffffep-22)) -(assert_return (invoke "mul" (f32.const -0x1p-149) (f32.const 0x1.fffffep+127)) (f32.const -0x1.fffffep-22)) -(assert_return (invoke "mul" (f32.const 0x1p-149) (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep-22)) -(assert_return (invoke "mul" (f32.const 0x1p-149) (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep-22)) -(assert_return (invoke "mul" (f32.const -0x1p-149) (f32.const -inf)) (f32.const inf)) -(assert_return (invoke "mul" (f32.const -0x1p-149) (f32.const inf)) (f32.const -inf)) -(assert_return (invoke "mul" (f32.const 0x1p-149) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "mul" (f32.const 0x1p-149) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "mul" (f32.const -0x1p-149) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -0x1p-149) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -0x1p-149) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -0x1p-149) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const 0x1p-149) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const 0x1p-149) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const 0x1p-149) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const 0x1p-149) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -0x1p-126) (f32.const -0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x1p-126) (f32.const 0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x1p-126) (f32.const -0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x1p-126) (f32.const 0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x1p-126) (f32.const -0x1p-149)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x1p-126) (f32.const 0x1p-149)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x1p-126) (f32.const -0x1p-149)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x1p-126) (f32.const 0x1p-149)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x1p-126) (f32.const -0x1p-126)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x1p-126) (f32.const 0x1p-126)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x1p-126) (f32.const -0x1p-126)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x1p-126) (f32.const 0x1p-126)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x1p-126) (f32.const -0x1p-1)) (f32.const 0x1p-127)) -(assert_return (invoke "mul" (f32.const -0x1p-126) (f32.const 0x1p-1)) (f32.const -0x1p-127)) -(assert_return (invoke "mul" (f32.const 0x1p-126) (f32.const -0x1p-1)) (f32.const -0x1p-127)) -(assert_return (invoke "mul" (f32.const 0x1p-126) (f32.const 0x1p-1)) (f32.const 0x1p-127)) -(assert_return (invoke "mul" (f32.const -0x1p-126) (f32.const -0x1p+0)) (f32.const 0x1p-126)) -(assert_return (invoke "mul" (f32.const -0x1p-126) (f32.const 0x1p+0)) (f32.const -0x1p-126)) -(assert_return (invoke "mul" (f32.const 0x1p-126) (f32.const -0x1p+0)) (f32.const -0x1p-126)) -(assert_return (invoke "mul" (f32.const 0x1p-126) (f32.const 0x1p+0)) (f32.const 0x1p-126)) -(assert_return (invoke "mul" (f32.const -0x1p-126) (f32.const -0x1.921fb6p+2)) (f32.const 0x1.921fb6p-124)) -(assert_return (invoke "mul" (f32.const -0x1p-126) (f32.const 0x1.921fb6p+2)) (f32.const -0x1.921fb6p-124)) -(assert_return (invoke "mul" (f32.const 0x1p-126) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.921fb6p-124)) -(assert_return (invoke "mul" (f32.const 0x1p-126) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.921fb6p-124)) -(assert_return (invoke "mul" (f32.const -0x1p-126) (f32.const -0x1.fffffep+127)) (f32.const 0x1.fffffep+1)) -(assert_return (invoke "mul" (f32.const -0x1p-126) (f32.const 0x1.fffffep+127)) (f32.const -0x1.fffffep+1)) -(assert_return (invoke "mul" (f32.const 0x1p-126) (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+1)) -(assert_return (invoke "mul" (f32.const 0x1p-126) (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+1)) -(assert_return (invoke "mul" (f32.const -0x1p-126) (f32.const -inf)) (f32.const inf)) -(assert_return (invoke "mul" (f32.const -0x1p-126) (f32.const inf)) (f32.const -inf)) -(assert_return (invoke "mul" (f32.const 0x1p-126) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "mul" (f32.const 0x1p-126) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "mul" (f32.const -0x1p-126) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -0x1p-126) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -0x1p-126) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -0x1p-126) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const 0x1p-126) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const 0x1p-126) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const 0x1p-126) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const 0x1p-126) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -0x1p-1) (f32.const -0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x1p-1) (f32.const 0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x1p-1) (f32.const -0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x1p-1) (f32.const 0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x1p-1) (f32.const -0x1p-149)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x1p-1) (f32.const 0x1p-149)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x1p-1) (f32.const -0x1p-149)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x1p-1) (f32.const 0x1p-149)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x1p-1) (f32.const -0x1p-126)) (f32.const 0x1p-127)) -(assert_return (invoke "mul" (f32.const -0x1p-1) (f32.const 0x1p-126)) (f32.const -0x1p-127)) -(assert_return (invoke "mul" (f32.const 0x1p-1) (f32.const -0x1p-126)) (f32.const -0x1p-127)) -(assert_return (invoke "mul" (f32.const 0x1p-1) (f32.const 0x1p-126)) (f32.const 0x1p-127)) -(assert_return (invoke "mul" (f32.const -0x1p-1) (f32.const -0x1p-1)) (f32.const 0x1p-2)) -(assert_return (invoke "mul" (f32.const -0x1p-1) (f32.const 0x1p-1)) (f32.const -0x1p-2)) -(assert_return (invoke "mul" (f32.const 0x1p-1) (f32.const -0x1p-1)) (f32.const -0x1p-2)) -(assert_return (invoke "mul" (f32.const 0x1p-1) (f32.const 0x1p-1)) (f32.const 0x1p-2)) -(assert_return (invoke "mul" (f32.const -0x1p-1) (f32.const -0x1p+0)) (f32.const 0x1p-1)) -(assert_return (invoke "mul" (f32.const -0x1p-1) (f32.const 0x1p+0)) (f32.const -0x1p-1)) -(assert_return (invoke "mul" (f32.const 0x1p-1) (f32.const -0x1p+0)) (f32.const -0x1p-1)) -(assert_return (invoke "mul" (f32.const 0x1p-1) (f32.const 0x1p+0)) (f32.const 0x1p-1)) -(assert_return (invoke "mul" (f32.const -0x1p-1) (f32.const -0x1.921fb6p+2)) (f32.const 0x1.921fb6p+1)) -(assert_return (invoke "mul" (f32.const -0x1p-1) (f32.const 0x1.921fb6p+2)) (f32.const -0x1.921fb6p+1)) -(assert_return (invoke "mul" (f32.const 0x1p-1) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.921fb6p+1)) -(assert_return (invoke "mul" (f32.const 0x1p-1) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.921fb6p+1)) -(assert_return (invoke "mul" (f32.const -0x1p-1) (f32.const -0x1.fffffep+127)) (f32.const 0x1.fffffep+126)) -(assert_return (invoke "mul" (f32.const -0x1p-1) (f32.const 0x1.fffffep+127)) (f32.const -0x1.fffffep+126)) -(assert_return (invoke "mul" (f32.const 0x1p-1) (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+126)) -(assert_return (invoke "mul" (f32.const 0x1p-1) (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+126)) -(assert_return (invoke "mul" (f32.const -0x1p-1) (f32.const -inf)) (f32.const inf)) -(assert_return (invoke "mul" (f32.const -0x1p-1) (f32.const inf)) (f32.const -inf)) -(assert_return (invoke "mul" (f32.const 0x1p-1) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "mul" (f32.const 0x1p-1) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "mul" (f32.const -0x1p-1) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -0x1p-1) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -0x1p-1) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -0x1p-1) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const 0x1p-1) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const 0x1p-1) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const 0x1p-1) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const 0x1p-1) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -0x1p+0) (f32.const -0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x1p+0) (f32.const 0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x1p+0) (f32.const -0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x1p+0) (f32.const 0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x1p+0) (f32.const -0x1p-149)) (f32.const 0x1p-149)) -(assert_return (invoke "mul" (f32.const -0x1p+0) (f32.const 0x1p-149)) (f32.const -0x1p-149)) -(assert_return (invoke "mul" (f32.const 0x1p+0) (f32.const -0x1p-149)) (f32.const -0x1p-149)) -(assert_return (invoke "mul" (f32.const 0x1p+0) (f32.const 0x1p-149)) (f32.const 0x1p-149)) -(assert_return (invoke "mul" (f32.const -0x1p+0) (f32.const -0x1p-126)) (f32.const 0x1p-126)) -(assert_return (invoke "mul" (f32.const -0x1p+0) (f32.const 0x1p-126)) (f32.const -0x1p-126)) -(assert_return (invoke "mul" (f32.const 0x1p+0) (f32.const -0x1p-126)) (f32.const -0x1p-126)) -(assert_return (invoke "mul" (f32.const 0x1p+0) (f32.const 0x1p-126)) (f32.const 0x1p-126)) -(assert_return (invoke "mul" (f32.const -0x1p+0) (f32.const -0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "mul" (f32.const -0x1p+0) (f32.const 0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "mul" (f32.const 0x1p+0) (f32.const -0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "mul" (f32.const 0x1p+0) (f32.const 0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "mul" (f32.const -0x1p+0) (f32.const -0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "mul" (f32.const -0x1p+0) (f32.const 0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "mul" (f32.const 0x1p+0) (f32.const -0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "mul" (f32.const 0x1p+0) (f32.const 0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "mul" (f32.const -0x1p+0) (f32.const -0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "mul" (f32.const -0x1p+0) (f32.const 0x1.921fb6p+2)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "mul" (f32.const 0x1p+0) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "mul" (f32.const 0x1p+0) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "mul" (f32.const -0x1p+0) (f32.const -0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "mul" (f32.const -0x1p+0) (f32.const 0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "mul" (f32.const 0x1p+0) (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "mul" (f32.const 0x1p+0) (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "mul" (f32.const -0x1p+0) (f32.const -inf)) (f32.const inf)) -(assert_return (invoke "mul" (f32.const -0x1p+0) (f32.const inf)) (f32.const -inf)) -(assert_return (invoke "mul" (f32.const 0x1p+0) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "mul" (f32.const 0x1p+0) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "mul" (f32.const -0x1p+0) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -0x1p+0) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -0x1p+0) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -0x1p+0) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const 0x1p+0) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const 0x1p+0) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const 0x1p+0) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const 0x1p+0) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -0x1.921fb6p+2) (f32.const -0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x1.921fb6p+2) (f32.const 0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x1.921fb6p+2) (f32.const -0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x1.921fb6p+2) (f32.const 0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-149)) (f32.const 0x1.8p-147)) -(assert_return (invoke "mul" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-149)) (f32.const -0x1.8p-147)) -(assert_return (invoke "mul" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-149)) (f32.const -0x1.8p-147)) -(assert_return (invoke "mul" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-149)) (f32.const 0x1.8p-147)) -(assert_return (invoke "mul" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-126)) (f32.const 0x1.921fb6p-124)) -(assert_return (invoke "mul" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-126)) (f32.const -0x1.921fb6p-124)) -(assert_return (invoke "mul" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-126)) (f32.const -0x1.921fb6p-124)) -(assert_return (invoke "mul" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-126)) (f32.const 0x1.921fb6p-124)) -(assert_return (invoke "mul" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-1)) (f32.const 0x1.921fb6p+1)) -(assert_return (invoke "mul" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-1)) (f32.const -0x1.921fb6p+1)) -(assert_return (invoke "mul" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-1)) (f32.const -0x1.921fb6p+1)) -(assert_return (invoke "mul" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-1)) (f32.const 0x1.921fb6p+1)) -(assert_return (invoke "mul" (f32.const -0x1.921fb6p+2) (f32.const -0x1p+0)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "mul" (f32.const -0x1.921fb6p+2) (f32.const 0x1p+0)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "mul" (f32.const 0x1.921fb6p+2) (f32.const -0x1p+0)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "mul" (f32.const 0x1.921fb6p+2) (f32.const 0x1p+0)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "mul" (f32.const -0x1.921fb6p+2) (f32.const -0x1.921fb6p+2)) (f32.const 0x1.3bd3cep+5)) -(assert_return (invoke "mul" (f32.const -0x1.921fb6p+2) (f32.const 0x1.921fb6p+2)) (f32.const -0x1.3bd3cep+5)) -(assert_return (invoke "mul" (f32.const 0x1.921fb6p+2) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.3bd3cep+5)) -(assert_return (invoke "mul" (f32.const 0x1.921fb6p+2) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.3bd3cep+5)) -(assert_return (invoke "mul" (f32.const -0x1.921fb6p+2) (f32.const -0x1.fffffep+127)) (f32.const inf)) -(assert_return (invoke "mul" (f32.const -0x1.921fb6p+2) (f32.const 0x1.fffffep+127)) (f32.const -inf)) -(assert_return (invoke "mul" (f32.const 0x1.921fb6p+2) (f32.const -0x1.fffffep+127)) (f32.const -inf)) -(assert_return (invoke "mul" (f32.const 0x1.921fb6p+2) (f32.const 0x1.fffffep+127)) (f32.const inf)) -(assert_return (invoke "mul" (f32.const -0x1.921fb6p+2) (f32.const -inf)) (f32.const inf)) -(assert_return (invoke "mul" (f32.const -0x1.921fb6p+2) (f32.const inf)) (f32.const -inf)) -(assert_return (invoke "mul" (f32.const 0x1.921fb6p+2) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "mul" (f32.const 0x1.921fb6p+2) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "mul" (f32.const -0x1.921fb6p+2) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -0x1.921fb6p+2) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -0x1.921fb6p+2) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -0x1.921fb6p+2) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const 0x1.921fb6p+2) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const 0x1.921fb6p+2) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const 0x1.921fb6p+2) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const 0x1.921fb6p+2) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -0x1.fffffep+127) (f32.const -0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x1.fffffep+127) (f32.const 0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x1.fffffep+127) (f32.const -0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "mul" (f32.const 0x1.fffffep+127) (f32.const 0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "mul" (f32.const -0x1.fffffep+127) (f32.const -0x1p-149)) (f32.const 0x1.fffffep-22)) -(assert_return (invoke "mul" (f32.const -0x1.fffffep+127) (f32.const 0x1p-149)) (f32.const -0x1.fffffep-22)) -(assert_return (invoke "mul" (f32.const 0x1.fffffep+127) (f32.const -0x1p-149)) (f32.const -0x1.fffffep-22)) -(assert_return (invoke "mul" (f32.const 0x1.fffffep+127) (f32.const 0x1p-149)) (f32.const 0x1.fffffep-22)) -(assert_return (invoke "mul" (f32.const -0x1.fffffep+127) (f32.const -0x1p-126)) (f32.const 0x1.fffffep+1)) -(assert_return (invoke "mul" (f32.const -0x1.fffffep+127) (f32.const 0x1p-126)) (f32.const -0x1.fffffep+1)) -(assert_return (invoke "mul" (f32.const 0x1.fffffep+127) (f32.const -0x1p-126)) (f32.const -0x1.fffffep+1)) -(assert_return (invoke "mul" (f32.const 0x1.fffffep+127) (f32.const 0x1p-126)) (f32.const 0x1.fffffep+1)) -(assert_return (invoke "mul" (f32.const -0x1.fffffep+127) (f32.const -0x1p-1)) (f32.const 0x1.fffffep+126)) -(assert_return (invoke "mul" (f32.const -0x1.fffffep+127) (f32.const 0x1p-1)) (f32.const -0x1.fffffep+126)) -(assert_return (invoke "mul" (f32.const 0x1.fffffep+127) (f32.const -0x1p-1)) (f32.const -0x1.fffffep+126)) -(assert_return (invoke "mul" (f32.const 0x1.fffffep+127) (f32.const 0x1p-1)) (f32.const 0x1.fffffep+126)) -(assert_return (invoke "mul" (f32.const -0x1.fffffep+127) (f32.const -0x1p+0)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "mul" (f32.const -0x1.fffffep+127) (f32.const 0x1p+0)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "mul" (f32.const 0x1.fffffep+127) (f32.const -0x1p+0)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "mul" (f32.const 0x1.fffffep+127) (f32.const 0x1p+0)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "mul" (f32.const -0x1.fffffep+127) (f32.const -0x1.921fb6p+2)) (f32.const inf)) -(assert_return (invoke "mul" (f32.const -0x1.fffffep+127) (f32.const 0x1.921fb6p+2)) (f32.const -inf)) -(assert_return (invoke "mul" (f32.const 0x1.fffffep+127) (f32.const -0x1.921fb6p+2)) (f32.const -inf)) -(assert_return (invoke "mul" (f32.const 0x1.fffffep+127) (f32.const 0x1.921fb6p+2)) (f32.const inf)) -(assert_return (invoke "mul" (f32.const -0x1.fffffep+127) (f32.const -0x1.fffffep+127)) (f32.const inf)) -(assert_return (invoke "mul" (f32.const -0x1.fffffep+127) (f32.const 0x1.fffffep+127)) (f32.const -inf)) -(assert_return (invoke "mul" (f32.const 0x1.fffffep+127) (f32.const -0x1.fffffep+127)) (f32.const -inf)) -(assert_return (invoke "mul" (f32.const 0x1.fffffep+127) (f32.const 0x1.fffffep+127)) (f32.const inf)) -(assert_return (invoke "mul" (f32.const -0x1.fffffep+127) (f32.const -inf)) (f32.const inf)) -(assert_return (invoke "mul" (f32.const -0x1.fffffep+127) (f32.const inf)) (f32.const -inf)) -(assert_return (invoke "mul" (f32.const 0x1.fffffep+127) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "mul" (f32.const 0x1.fffffep+127) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "mul" (f32.const -0x1.fffffep+127) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -0x1.fffffep+127) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -0x1.fffffep+127) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -0x1.fffffep+127) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const 0x1.fffffep+127) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const 0x1.fffffep+127) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const 0x1.fffffep+127) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const 0x1.fffffep+127) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -inf) (f32.const -0x0p+0)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -inf) (f32.const 0x0p+0)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const inf) (f32.const -0x0p+0)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const inf) (f32.const 0x0p+0)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -inf) (f32.const -0x1p-149)) (f32.const inf)) -(assert_return (invoke "mul" (f32.const -inf) (f32.const 0x1p-149)) (f32.const -inf)) -(assert_return (invoke "mul" (f32.const inf) (f32.const -0x1p-149)) (f32.const -inf)) -(assert_return (invoke "mul" (f32.const inf) (f32.const 0x1p-149)) (f32.const inf)) -(assert_return (invoke "mul" (f32.const -inf) (f32.const -0x1p-126)) (f32.const inf)) -(assert_return (invoke "mul" (f32.const -inf) (f32.const 0x1p-126)) (f32.const -inf)) -(assert_return (invoke "mul" (f32.const inf) (f32.const -0x1p-126)) (f32.const -inf)) -(assert_return (invoke "mul" (f32.const inf) (f32.const 0x1p-126)) (f32.const inf)) -(assert_return (invoke "mul" (f32.const -inf) (f32.const -0x1p-1)) (f32.const inf)) -(assert_return (invoke "mul" (f32.const -inf) (f32.const 0x1p-1)) (f32.const -inf)) -(assert_return (invoke "mul" (f32.const inf) (f32.const -0x1p-1)) (f32.const -inf)) -(assert_return (invoke "mul" (f32.const inf) (f32.const 0x1p-1)) (f32.const inf)) -(assert_return (invoke "mul" (f32.const -inf) (f32.const -0x1p+0)) (f32.const inf)) -(assert_return (invoke "mul" (f32.const -inf) (f32.const 0x1p+0)) (f32.const -inf)) -(assert_return (invoke "mul" (f32.const inf) (f32.const -0x1p+0)) (f32.const -inf)) -(assert_return (invoke "mul" (f32.const inf) (f32.const 0x1p+0)) (f32.const inf)) -(assert_return (invoke "mul" (f32.const -inf) (f32.const -0x1.921fb6p+2)) (f32.const inf)) -(assert_return (invoke "mul" (f32.const -inf) (f32.const 0x1.921fb6p+2)) (f32.const -inf)) -(assert_return (invoke "mul" (f32.const inf) (f32.const -0x1.921fb6p+2)) (f32.const -inf)) -(assert_return (invoke "mul" (f32.const inf) (f32.const 0x1.921fb6p+2)) (f32.const inf)) -(assert_return (invoke "mul" (f32.const -inf) (f32.const -0x1.fffffep+127)) (f32.const inf)) -(assert_return (invoke "mul" (f32.const -inf) (f32.const 0x1.fffffep+127)) (f32.const -inf)) -(assert_return (invoke "mul" (f32.const inf) (f32.const -0x1.fffffep+127)) (f32.const -inf)) -(assert_return (invoke "mul" (f32.const inf) (f32.const 0x1.fffffep+127)) (f32.const inf)) -(assert_return (invoke "mul" (f32.const -inf) (f32.const -inf)) (f32.const inf)) -(assert_return (invoke "mul" (f32.const -inf) (f32.const inf)) (f32.const -inf)) -(assert_return (invoke "mul" (f32.const inf) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "mul" (f32.const inf) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "mul" (f32.const -inf) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -inf) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -inf) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -inf) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const inf) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const inf) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const inf) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const inf) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -nan) (f32.const -0x0p+0)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -nan:0x200000) (f32.const -0x0p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -nan) (f32.const 0x0p+0)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -nan:0x200000) (f32.const 0x0p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const nan) (f32.const -0x0p+0)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const nan:0x200000) (f32.const -0x0p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const nan) (f32.const 0x0p+0)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const nan:0x200000) (f32.const 0x0p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -nan) (f32.const -0x1p-149)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -nan:0x200000) (f32.const -0x1p-149)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -nan) (f32.const 0x1p-149)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -nan:0x200000) (f32.const 0x1p-149)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const nan) (f32.const -0x1p-149)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const nan:0x200000) (f32.const -0x1p-149)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const nan) (f32.const 0x1p-149)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const nan:0x200000) (f32.const 0x1p-149)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -nan) (f32.const -0x1p-126)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -nan:0x200000) (f32.const -0x1p-126)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -nan) (f32.const 0x1p-126)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -nan:0x200000) (f32.const 0x1p-126)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const nan) (f32.const -0x1p-126)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const nan:0x200000) (f32.const -0x1p-126)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const nan) (f32.const 0x1p-126)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const nan:0x200000) (f32.const 0x1p-126)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -nan) (f32.const -0x1p-1)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -nan:0x200000) (f32.const -0x1p-1)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -nan) (f32.const 0x1p-1)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -nan:0x200000) (f32.const 0x1p-1)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const nan) (f32.const -0x1p-1)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const nan:0x200000) (f32.const -0x1p-1)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const nan) (f32.const 0x1p-1)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const nan:0x200000) (f32.const 0x1p-1)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -nan) (f32.const -0x1p+0)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -nan:0x200000) (f32.const -0x1p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -nan) (f32.const 0x1p+0)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -nan:0x200000) (f32.const 0x1p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const nan) (f32.const -0x1p+0)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const nan:0x200000) (f32.const -0x1p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const nan) (f32.const 0x1p+0)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const nan:0x200000) (f32.const 0x1p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -nan) (f32.const -0x1.921fb6p+2)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -nan:0x200000) (f32.const -0x1.921fb6p+2)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -nan) (f32.const 0x1.921fb6p+2)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -nan:0x200000) (f32.const 0x1.921fb6p+2)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const nan) (f32.const -0x1.921fb6p+2)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const nan:0x200000) (f32.const -0x1.921fb6p+2)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const nan) (f32.const 0x1.921fb6p+2)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const nan:0x200000) (f32.const 0x1.921fb6p+2)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -nan) (f32.const -0x1.fffffep+127)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -nan:0x200000) (f32.const -0x1.fffffep+127)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -nan) (f32.const 0x1.fffffep+127)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -nan:0x200000) (f32.const 0x1.fffffep+127)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const nan) (f32.const -0x1.fffffep+127)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const nan:0x200000) (f32.const -0x1.fffffep+127)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const nan) (f32.const 0x1.fffffep+127)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const nan:0x200000) (f32.const 0x1.fffffep+127)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -nan) (f32.const -inf)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -nan:0x200000) (f32.const -inf)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -nan) (f32.const inf)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -nan:0x200000) (f32.const inf)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const nan) (f32.const -inf)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const nan:0x200000) (f32.const -inf)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const nan) (f32.const inf)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const nan:0x200000) (f32.const inf)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -nan) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -nan:0x200000) (f32.const -nan)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -nan) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -nan:0x200000) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -nan) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const -nan:0x200000) (f32.const nan)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -nan) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const -nan:0x200000) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const nan) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const nan:0x200000) (f32.const -nan)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const nan) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const nan:0x200000) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const nan) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "mul" (f32.const nan:0x200000) (f32.const nan)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const nan) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "mul" (f32.const nan:0x200000) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -0x0p+0) (f32.const -0x0p+0)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -0x0p+0) (f32.const 0x0p+0)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const 0x0p+0) (f32.const -0x0p+0)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const 0x0p+0) (f32.const 0x0p+0)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -0x0p+0) (f32.const -0x1p-149)) (f32.const 0x0p+0)) -(assert_return (invoke "div" (f32.const -0x0p+0) (f32.const 0x1p-149)) (f32.const -0x0p+0)) -(assert_return (invoke "div" (f32.const 0x0p+0) (f32.const -0x1p-149)) (f32.const -0x0p+0)) -(assert_return (invoke "div" (f32.const 0x0p+0) (f32.const 0x1p-149)) (f32.const 0x0p+0)) -(assert_return (invoke "div" (f32.const -0x0p+0) (f32.const -0x1p-126)) (f32.const 0x0p+0)) -(assert_return (invoke "div" (f32.const -0x0p+0) (f32.const 0x1p-126)) (f32.const -0x0p+0)) -(assert_return (invoke "div" (f32.const 0x0p+0) (f32.const -0x1p-126)) (f32.const -0x0p+0)) -(assert_return (invoke "div" (f32.const 0x0p+0) (f32.const 0x1p-126)) (f32.const 0x0p+0)) -(assert_return (invoke "div" (f32.const -0x0p+0) (f32.const -0x1p-1)) (f32.const 0x0p+0)) -(assert_return (invoke "div" (f32.const -0x0p+0) (f32.const 0x1p-1)) (f32.const -0x0p+0)) -(assert_return (invoke "div" (f32.const 0x0p+0) (f32.const -0x1p-1)) (f32.const -0x0p+0)) -(assert_return (invoke "div" (f32.const 0x0p+0) (f32.const 0x1p-1)) (f32.const 0x0p+0)) -(assert_return (invoke "div" (f32.const -0x0p+0) (f32.const -0x1p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "div" (f32.const -0x0p+0) (f32.const 0x1p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "div" (f32.const 0x0p+0) (f32.const -0x1p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "div" (f32.const 0x0p+0) (f32.const 0x1p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "div" (f32.const -0x0p+0) (f32.const -0x1.921fb6p+2)) (f32.const 0x0p+0)) -(assert_return (invoke "div" (f32.const -0x0p+0) (f32.const 0x1.921fb6p+2)) (f32.const -0x0p+0)) -(assert_return (invoke "div" (f32.const 0x0p+0) (f32.const -0x1.921fb6p+2)) (f32.const -0x0p+0)) -(assert_return (invoke "div" (f32.const 0x0p+0) (f32.const 0x1.921fb6p+2)) (f32.const 0x0p+0)) -(assert_return (invoke "div" (f32.const -0x0p+0) (f32.const -0x1.fffffep+127)) (f32.const 0x0p+0)) -(assert_return (invoke "div" (f32.const -0x0p+0) (f32.const 0x1.fffffep+127)) (f32.const -0x0p+0)) -(assert_return (invoke "div" (f32.const 0x0p+0) (f32.const -0x1.fffffep+127)) (f32.const -0x0p+0)) -(assert_return (invoke "div" (f32.const 0x0p+0) (f32.const 0x1.fffffep+127)) (f32.const 0x0p+0)) -(assert_return (invoke "div" (f32.const -0x0p+0) (f32.const -inf)) (f32.const 0x0p+0)) -(assert_return (invoke "div" (f32.const -0x0p+0) (f32.const inf)) (f32.const -0x0p+0)) -(assert_return (invoke "div" (f32.const 0x0p+0) (f32.const -inf)) (f32.const -0x0p+0)) -(assert_return (invoke "div" (f32.const 0x0p+0) (f32.const inf)) (f32.const 0x0p+0)) -(assert_return (invoke "div" (f32.const -0x0p+0) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -0x0p+0) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -0x0p+0) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -0x0p+0) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const 0x0p+0) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const 0x0p+0) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const 0x0p+0) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const 0x0p+0) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -0x1p-149) (f32.const -0x0p+0)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -0x1p-149) (f32.const 0x0p+0)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const 0x1p-149) (f32.const -0x0p+0)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const 0x1p-149) (f32.const 0x0p+0)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -0x1p-149) (f32.const -0x1p-149)) (f32.const 0x1p+0)) -(assert_return (invoke "div" (f32.const -0x1p-149) (f32.const 0x1p-149)) (f32.const -0x1p+0)) -(assert_return (invoke "div" (f32.const 0x1p-149) (f32.const -0x1p-149)) (f32.const -0x1p+0)) -(assert_return (invoke "div" (f32.const 0x1p-149) (f32.const 0x1p-149)) (f32.const 0x1p+0)) -(assert_return (invoke "div" (f32.const -0x1p-149) (f32.const -0x1p-126)) (f32.const 0x1p-23)) -(assert_return (invoke "div" (f32.const -0x1p-149) (f32.const 0x1p-126)) (f32.const -0x1p-23)) -(assert_return (invoke "div" (f32.const 0x1p-149) (f32.const -0x1p-126)) (f32.const -0x1p-23)) -(assert_return (invoke "div" (f32.const 0x1p-149) (f32.const 0x1p-126)) (f32.const 0x1p-23)) -(assert_return (invoke "div" (f32.const -0x1p-149) (f32.const -0x1p-1)) (f32.const 0x1p-148)) -(assert_return (invoke "div" (f32.const -0x1p-149) (f32.const 0x1p-1)) (f32.const -0x1p-148)) -(assert_return (invoke "div" (f32.const 0x1p-149) (f32.const -0x1p-1)) (f32.const -0x1p-148)) -(assert_return (invoke "div" (f32.const 0x1p-149) (f32.const 0x1p-1)) (f32.const 0x1p-148)) -(assert_return (invoke "div" (f32.const -0x1p-149) (f32.const -0x1p+0)) (f32.const 0x1p-149)) -(assert_return (invoke "div" (f32.const -0x1p-149) (f32.const 0x1p+0)) (f32.const -0x1p-149)) -(assert_return (invoke "div" (f32.const 0x1p-149) (f32.const -0x1p+0)) (f32.const -0x1p-149)) -(assert_return (invoke "div" (f32.const 0x1p-149) (f32.const 0x1p+0)) (f32.const 0x1p-149)) -(assert_return (invoke "div" (f32.const -0x1p-149) (f32.const -0x1.921fb6p+2)) (f32.const 0x0p+0)) -(assert_return (invoke "div" (f32.const -0x1p-149) (f32.const 0x1.921fb6p+2)) (f32.const -0x0p+0)) -(assert_return (invoke "div" (f32.const 0x1p-149) (f32.const -0x1.921fb6p+2)) (f32.const -0x0p+0)) -(assert_return (invoke "div" (f32.const 0x1p-149) (f32.const 0x1.921fb6p+2)) (f32.const 0x0p+0)) -(assert_return (invoke "div" (f32.const -0x1p-149) (f32.const -0x1.fffffep+127)) (f32.const 0x0p+0)) -(assert_return (invoke "div" (f32.const -0x1p-149) (f32.const 0x1.fffffep+127)) (f32.const -0x0p+0)) -(assert_return (invoke "div" (f32.const 0x1p-149) (f32.const -0x1.fffffep+127)) (f32.const -0x0p+0)) -(assert_return (invoke "div" (f32.const 0x1p-149) (f32.const 0x1.fffffep+127)) (f32.const 0x0p+0)) -(assert_return (invoke "div" (f32.const -0x1p-149) (f32.const -inf)) (f32.const 0x0p+0)) -(assert_return (invoke "div" (f32.const -0x1p-149) (f32.const inf)) (f32.const -0x0p+0)) -(assert_return (invoke "div" (f32.const 0x1p-149) (f32.const -inf)) (f32.const -0x0p+0)) -(assert_return (invoke "div" (f32.const 0x1p-149) (f32.const inf)) (f32.const 0x0p+0)) -(assert_return (invoke "div" (f32.const -0x1p-149) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -0x1p-149) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -0x1p-149) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -0x1p-149) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const 0x1p-149) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const 0x1p-149) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const 0x1p-149) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const 0x1p-149) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -0x1p-126) (f32.const -0x0p+0)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -0x1p-126) (f32.const 0x0p+0)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const 0x1p-126) (f32.const -0x0p+0)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const 0x1p-126) (f32.const 0x0p+0)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -0x1p-126) (f32.const -0x1p-149)) (f32.const 0x1p+23)) -(assert_return (invoke "div" (f32.const -0x1p-126) (f32.const 0x1p-149)) (f32.const -0x1p+23)) -(assert_return (invoke "div" (f32.const 0x1p-126) (f32.const -0x1p-149)) (f32.const -0x1p+23)) -(assert_return (invoke "div" (f32.const 0x1p-126) (f32.const 0x1p-149)) (f32.const 0x1p+23)) -(assert_return (invoke "div" (f32.const -0x1p-126) (f32.const -0x1p-126)) (f32.const 0x1p+0)) -(assert_return (invoke "div" (f32.const -0x1p-126) (f32.const 0x1p-126)) (f32.const -0x1p+0)) -(assert_return (invoke "div" (f32.const 0x1p-126) (f32.const -0x1p-126)) (f32.const -0x1p+0)) -(assert_return (invoke "div" (f32.const 0x1p-126) (f32.const 0x1p-126)) (f32.const 0x1p+0)) -(assert_return (invoke "div" (f32.const -0x1p-126) (f32.const -0x1p-1)) (f32.const 0x1p-125)) -(assert_return (invoke "div" (f32.const -0x1p-126) (f32.const 0x1p-1)) (f32.const -0x1p-125)) -(assert_return (invoke "div" (f32.const 0x1p-126) (f32.const -0x1p-1)) (f32.const -0x1p-125)) -(assert_return (invoke "div" (f32.const 0x1p-126) (f32.const 0x1p-1)) (f32.const 0x1p-125)) -(assert_return (invoke "div" (f32.const -0x1p-126) (f32.const -0x1p+0)) (f32.const 0x1p-126)) -(assert_return (invoke "div" (f32.const -0x1p-126) (f32.const 0x1p+0)) (f32.const -0x1p-126)) -(assert_return (invoke "div" (f32.const 0x1p-126) (f32.const -0x1p+0)) (f32.const -0x1p-126)) -(assert_return (invoke "div" (f32.const 0x1p-126) (f32.const 0x1p+0)) (f32.const 0x1p-126)) -(assert_return (invoke "div" (f32.const -0x1p-126) (f32.const -0x1.921fb6p+2)) (f32.const 0x1.45f3p-129)) -(assert_return (invoke "div" (f32.const -0x1p-126) (f32.const 0x1.921fb6p+2)) (f32.const -0x1.45f3p-129)) -(assert_return (invoke "div" (f32.const 0x1p-126) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.45f3p-129)) -(assert_return (invoke "div" (f32.const 0x1p-126) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.45f3p-129)) -(assert_return (invoke "div" (f32.const -0x1p-126) (f32.const -0x1.fffffep+127)) (f32.const 0x0p+0)) -(assert_return (invoke "div" (f32.const -0x1p-126) (f32.const 0x1.fffffep+127)) (f32.const -0x0p+0)) -(assert_return (invoke "div" (f32.const 0x1p-126) (f32.const -0x1.fffffep+127)) (f32.const -0x0p+0)) -(assert_return (invoke "div" (f32.const 0x1p-126) (f32.const 0x1.fffffep+127)) (f32.const 0x0p+0)) -(assert_return (invoke "div" (f32.const -0x1p-126) (f32.const -inf)) (f32.const 0x0p+0)) -(assert_return (invoke "div" (f32.const -0x1p-126) (f32.const inf)) (f32.const -0x0p+0)) -(assert_return (invoke "div" (f32.const 0x1p-126) (f32.const -inf)) (f32.const -0x0p+0)) -(assert_return (invoke "div" (f32.const 0x1p-126) (f32.const inf)) (f32.const 0x0p+0)) -(assert_return (invoke "div" (f32.const -0x1p-126) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -0x1p-126) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -0x1p-126) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -0x1p-126) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const 0x1p-126) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const 0x1p-126) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const 0x1p-126) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const 0x1p-126) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -0x1p-1) (f32.const -0x0p+0)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -0x1p-1) (f32.const 0x0p+0)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const 0x1p-1) (f32.const -0x0p+0)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const 0x1p-1) (f32.const 0x0p+0)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -0x1p-1) (f32.const -0x1p-149)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -0x1p-1) (f32.const 0x1p-149)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const 0x1p-1) (f32.const -0x1p-149)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const 0x1p-1) (f32.const 0x1p-149)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -0x1p-1) (f32.const -0x1p-126)) (f32.const 0x1p+125)) -(assert_return (invoke "div" (f32.const -0x1p-1) (f32.const 0x1p-126)) (f32.const -0x1p+125)) -(assert_return (invoke "div" (f32.const 0x1p-1) (f32.const -0x1p-126)) (f32.const -0x1p+125)) -(assert_return (invoke "div" (f32.const 0x1p-1) (f32.const 0x1p-126)) (f32.const 0x1p+125)) -(assert_return (invoke "div" (f32.const -0x1p-1) (f32.const -0x1p-1)) (f32.const 0x1p+0)) -(assert_return (invoke "div" (f32.const -0x1p-1) (f32.const 0x1p-1)) (f32.const -0x1p+0)) -(assert_return (invoke "div" (f32.const 0x1p-1) (f32.const -0x1p-1)) (f32.const -0x1p+0)) -(assert_return (invoke "div" (f32.const 0x1p-1) (f32.const 0x1p-1)) (f32.const 0x1p+0)) -(assert_return (invoke "div" (f32.const -0x1p-1) (f32.const -0x1p+0)) (f32.const 0x1p-1)) -(assert_return (invoke "div" (f32.const -0x1p-1) (f32.const 0x1p+0)) (f32.const -0x1p-1)) -(assert_return (invoke "div" (f32.const 0x1p-1) (f32.const -0x1p+0)) (f32.const -0x1p-1)) -(assert_return (invoke "div" (f32.const 0x1p-1) (f32.const 0x1p+0)) (f32.const 0x1p-1)) -(assert_return (invoke "div" (f32.const -0x1p-1) (f32.const -0x1.921fb6p+2)) (f32.const 0x1.45f306p-4)) -(assert_return (invoke "div" (f32.const -0x1p-1) (f32.const 0x1.921fb6p+2)) (f32.const -0x1.45f306p-4)) -(assert_return (invoke "div" (f32.const 0x1p-1) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.45f306p-4)) -(assert_return (invoke "div" (f32.const 0x1p-1) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.45f306p-4)) -(assert_return (invoke "div" (f32.const -0x1p-1) (f32.const -0x1.fffffep+127)) (f32.const 0x1p-129)) -(assert_return (invoke "div" (f32.const -0x1p-1) (f32.const 0x1.fffffep+127)) (f32.const -0x1p-129)) -(assert_return (invoke "div" (f32.const 0x1p-1) (f32.const -0x1.fffffep+127)) (f32.const -0x1p-129)) -(assert_return (invoke "div" (f32.const 0x1p-1) (f32.const 0x1.fffffep+127)) (f32.const 0x1p-129)) -(assert_return (invoke "div" (f32.const -0x1p-1) (f32.const -inf)) (f32.const 0x0p+0)) -(assert_return (invoke "div" (f32.const -0x1p-1) (f32.const inf)) (f32.const -0x0p+0)) -(assert_return (invoke "div" (f32.const 0x1p-1) (f32.const -inf)) (f32.const -0x0p+0)) -(assert_return (invoke "div" (f32.const 0x1p-1) (f32.const inf)) (f32.const 0x0p+0)) -(assert_return (invoke "div" (f32.const -0x1p-1) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -0x1p-1) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -0x1p-1) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -0x1p-1) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const 0x1p-1) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const 0x1p-1) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const 0x1p-1) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const 0x1p-1) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -0x1p+0) (f32.const -0x0p+0)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -0x1p+0) (f32.const 0x0p+0)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const 0x1p+0) (f32.const -0x0p+0)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const 0x1p+0) (f32.const 0x0p+0)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -0x1p+0) (f32.const -0x1p-149)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -0x1p+0) (f32.const 0x1p-149)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const 0x1p+0) (f32.const -0x1p-149)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const 0x1p+0) (f32.const 0x1p-149)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -0x1p+0) (f32.const -0x1p-126)) (f32.const 0x1p+126)) -(assert_return (invoke "div" (f32.const -0x1p+0) (f32.const 0x1p-126)) (f32.const -0x1p+126)) -(assert_return (invoke "div" (f32.const 0x1p+0) (f32.const -0x1p-126)) (f32.const -0x1p+126)) -(assert_return (invoke "div" (f32.const 0x1p+0) (f32.const 0x1p-126)) (f32.const 0x1p+126)) -(assert_return (invoke "div" (f32.const -0x1p+0) (f32.const -0x1p-1)) (f32.const 0x1p+1)) -(assert_return (invoke "div" (f32.const -0x1p+0) (f32.const 0x1p-1)) (f32.const -0x1p+1)) -(assert_return (invoke "div" (f32.const 0x1p+0) (f32.const -0x1p-1)) (f32.const -0x1p+1)) -(assert_return (invoke "div" (f32.const 0x1p+0) (f32.const 0x1p-1)) (f32.const 0x1p+1)) -(assert_return (invoke "div" (f32.const -0x1p+0) (f32.const -0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "div" (f32.const -0x1p+0) (f32.const 0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "div" (f32.const 0x1p+0) (f32.const -0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "div" (f32.const 0x1p+0) (f32.const 0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "div" (f32.const -0x1p+0) (f32.const -0x1.921fb6p+2)) (f32.const 0x1.45f306p-3)) -(assert_return (invoke "div" (f32.const -0x1p+0) (f32.const 0x1.921fb6p+2)) (f32.const -0x1.45f306p-3)) -(assert_return (invoke "div" (f32.const 0x1p+0) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.45f306p-3)) -(assert_return (invoke "div" (f32.const 0x1p+0) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.45f306p-3)) -(assert_return (invoke "div" (f32.const -0x1p+0) (f32.const -0x1.fffffep+127)) (f32.const 0x1p-128)) -(assert_return (invoke "div" (f32.const -0x1p+0) (f32.const 0x1.fffffep+127)) (f32.const -0x1p-128)) -(assert_return (invoke "div" (f32.const 0x1p+0) (f32.const -0x1.fffffep+127)) (f32.const -0x1p-128)) -(assert_return (invoke "div" (f32.const 0x1p+0) (f32.const 0x1.fffffep+127)) (f32.const 0x1p-128)) -(assert_return (invoke "div" (f32.const -0x1p+0) (f32.const -inf)) (f32.const 0x0p+0)) -(assert_return (invoke "div" (f32.const -0x1p+0) (f32.const inf)) (f32.const -0x0p+0)) -(assert_return (invoke "div" (f32.const 0x1p+0) (f32.const -inf)) (f32.const -0x0p+0)) -(assert_return (invoke "div" (f32.const 0x1p+0) (f32.const inf)) (f32.const 0x0p+0)) -(assert_return (invoke "div" (f32.const -0x1p+0) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -0x1p+0) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -0x1p+0) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -0x1p+0) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const 0x1p+0) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const 0x1p+0) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const 0x1p+0) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const 0x1p+0) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -0x1.921fb6p+2) (f32.const -0x0p+0)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -0x1.921fb6p+2) (f32.const 0x0p+0)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const 0x1.921fb6p+2) (f32.const -0x0p+0)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const 0x1.921fb6p+2) (f32.const 0x0p+0)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-149)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-149)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-149)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-149)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-126)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-126)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-126)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-126)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-1)) (f32.const 0x1.921fb6p+3)) -(assert_return (invoke "div" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-1)) (f32.const -0x1.921fb6p+3)) -(assert_return (invoke "div" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-1)) (f32.const -0x1.921fb6p+3)) -(assert_return (invoke "div" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-1)) (f32.const 0x1.921fb6p+3)) -(assert_return (invoke "div" (f32.const -0x1.921fb6p+2) (f32.const -0x1p+0)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "div" (f32.const -0x1.921fb6p+2) (f32.const 0x1p+0)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "div" (f32.const 0x1.921fb6p+2) (f32.const -0x1p+0)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "div" (f32.const 0x1.921fb6p+2) (f32.const 0x1p+0)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "div" (f32.const -0x1.921fb6p+2) (f32.const -0x1.921fb6p+2)) (f32.const 0x1p+0)) -(assert_return (invoke "div" (f32.const -0x1.921fb6p+2) (f32.const 0x1.921fb6p+2)) (f32.const -0x1p+0)) -(assert_return (invoke "div" (f32.const 0x1.921fb6p+2) (f32.const -0x1.921fb6p+2)) (f32.const -0x1p+0)) -(assert_return (invoke "div" (f32.const 0x1.921fb6p+2) (f32.const 0x1.921fb6p+2)) (f32.const 0x1p+0)) -(assert_return (invoke "div" (f32.const -0x1.921fb6p+2) (f32.const -0x1.fffffep+127)) (f32.const 0x1.921fb8p-126)) -(assert_return (invoke "div" (f32.const -0x1.921fb6p+2) (f32.const 0x1.fffffep+127)) (f32.const -0x1.921fb8p-126)) -(assert_return (invoke "div" (f32.const 0x1.921fb6p+2) (f32.const -0x1.fffffep+127)) (f32.const -0x1.921fb8p-126)) -(assert_return (invoke "div" (f32.const 0x1.921fb6p+2) (f32.const 0x1.fffffep+127)) (f32.const 0x1.921fb8p-126)) -(assert_return (invoke "div" (f32.const -0x1.921fb6p+2) (f32.const -inf)) (f32.const 0x0p+0)) -(assert_return (invoke "div" (f32.const -0x1.921fb6p+2) (f32.const inf)) (f32.const -0x0p+0)) -(assert_return (invoke "div" (f32.const 0x1.921fb6p+2) (f32.const -inf)) (f32.const -0x0p+0)) -(assert_return (invoke "div" (f32.const 0x1.921fb6p+2) (f32.const inf)) (f32.const 0x0p+0)) -(assert_return (invoke "div" (f32.const -0x1.921fb6p+2) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -0x1.921fb6p+2) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -0x1.921fb6p+2) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -0x1.921fb6p+2) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const 0x1.921fb6p+2) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const 0x1.921fb6p+2) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const 0x1.921fb6p+2) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const 0x1.921fb6p+2) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -0x1.fffffep+127) (f32.const -0x0p+0)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -0x1.fffffep+127) (f32.const 0x0p+0)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const 0x1.fffffep+127) (f32.const -0x0p+0)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const 0x1.fffffep+127) (f32.const 0x0p+0)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -0x1.fffffep+127) (f32.const -0x1p-149)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -0x1.fffffep+127) (f32.const 0x1p-149)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const 0x1.fffffep+127) (f32.const -0x1p-149)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const 0x1.fffffep+127) (f32.const 0x1p-149)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -0x1.fffffep+127) (f32.const -0x1p-126)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -0x1.fffffep+127) (f32.const 0x1p-126)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const 0x1.fffffep+127) (f32.const -0x1p-126)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const 0x1.fffffep+127) (f32.const 0x1p-126)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -0x1.fffffep+127) (f32.const -0x1p-1)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -0x1.fffffep+127) (f32.const 0x1p-1)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const 0x1.fffffep+127) (f32.const -0x1p-1)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const 0x1.fffffep+127) (f32.const 0x1p-1)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -0x1.fffffep+127) (f32.const -0x1p+0)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "div" (f32.const -0x1.fffffep+127) (f32.const 0x1p+0)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "div" (f32.const 0x1.fffffep+127) (f32.const -0x1p+0)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "div" (f32.const 0x1.fffffep+127) (f32.const 0x1p+0)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "div" (f32.const -0x1.fffffep+127) (f32.const -0x1.921fb6p+2)) (f32.const 0x1.45f304p+125)) -(assert_return (invoke "div" (f32.const -0x1.fffffep+127) (f32.const 0x1.921fb6p+2)) (f32.const -0x1.45f304p+125)) -(assert_return (invoke "div" (f32.const 0x1.fffffep+127) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.45f304p+125)) -(assert_return (invoke "div" (f32.const 0x1.fffffep+127) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.45f304p+125)) -(assert_return (invoke "div" (f32.const -0x1.fffffep+127) (f32.const -0x1.fffffep+127)) (f32.const 0x1p+0)) -(assert_return (invoke "div" (f32.const -0x1.fffffep+127) (f32.const 0x1.fffffep+127)) (f32.const -0x1p+0)) -(assert_return (invoke "div" (f32.const 0x1.fffffep+127) (f32.const -0x1.fffffep+127)) (f32.const -0x1p+0)) -(assert_return (invoke "div" (f32.const 0x1.fffffep+127) (f32.const 0x1.fffffep+127)) (f32.const 0x1p+0)) -(assert_return (invoke "div" (f32.const -0x1.fffffep+127) (f32.const -inf)) (f32.const 0x0p+0)) -(assert_return (invoke "div" (f32.const -0x1.fffffep+127) (f32.const inf)) (f32.const -0x0p+0)) -(assert_return (invoke "div" (f32.const 0x1.fffffep+127) (f32.const -inf)) (f32.const -0x0p+0)) -(assert_return (invoke "div" (f32.const 0x1.fffffep+127) (f32.const inf)) (f32.const 0x0p+0)) -(assert_return (invoke "div" (f32.const -0x1.fffffep+127) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -0x1.fffffep+127) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -0x1.fffffep+127) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -0x1.fffffep+127) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const 0x1.fffffep+127) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const 0x1.fffffep+127) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const 0x1.fffffep+127) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const 0x1.fffffep+127) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -inf) (f32.const -0x0p+0)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -inf) (f32.const 0x0p+0)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const inf) (f32.const -0x0p+0)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const inf) (f32.const 0x0p+0)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -inf) (f32.const -0x1p-149)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -inf) (f32.const 0x1p-149)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const inf) (f32.const -0x1p-149)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const inf) (f32.const 0x1p-149)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -inf) (f32.const -0x1p-126)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -inf) (f32.const 0x1p-126)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const inf) (f32.const -0x1p-126)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const inf) (f32.const 0x1p-126)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -inf) (f32.const -0x1p-1)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -inf) (f32.const 0x1p-1)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const inf) (f32.const -0x1p-1)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const inf) (f32.const 0x1p-1)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -inf) (f32.const -0x1p+0)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -inf) (f32.const 0x1p+0)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const inf) (f32.const -0x1p+0)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const inf) (f32.const 0x1p+0)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -inf) (f32.const -0x1.921fb6p+2)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -inf) (f32.const 0x1.921fb6p+2)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const inf) (f32.const -0x1.921fb6p+2)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const inf) (f32.const 0x1.921fb6p+2)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -inf) (f32.const -0x1.fffffep+127)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -inf) (f32.const 0x1.fffffep+127)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const inf) (f32.const -0x1.fffffep+127)) (f32.const -inf)) -(assert_return (invoke "div" (f32.const inf) (f32.const 0x1.fffffep+127)) (f32.const inf)) -(assert_return (invoke "div" (f32.const -inf) (f32.const -inf)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -inf) (f32.const inf)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const inf) (f32.const -inf)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const inf) (f32.const inf)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -inf) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -inf) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -inf) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -inf) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const inf) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const inf) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const inf) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const inf) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -nan) (f32.const -0x0p+0)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -nan:0x200000) (f32.const -0x0p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -nan) (f32.const 0x0p+0)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -nan:0x200000) (f32.const 0x0p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const nan) (f32.const -0x0p+0)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const nan:0x200000) (f32.const -0x0p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const nan) (f32.const 0x0p+0)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const nan:0x200000) (f32.const 0x0p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -nan) (f32.const -0x1p-149)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -nan:0x200000) (f32.const -0x1p-149)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -nan) (f32.const 0x1p-149)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -nan:0x200000) (f32.const 0x1p-149)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const nan) (f32.const -0x1p-149)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const nan:0x200000) (f32.const -0x1p-149)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const nan) (f32.const 0x1p-149)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const nan:0x200000) (f32.const 0x1p-149)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -nan) (f32.const -0x1p-126)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -nan:0x200000) (f32.const -0x1p-126)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -nan) (f32.const 0x1p-126)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -nan:0x200000) (f32.const 0x1p-126)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const nan) (f32.const -0x1p-126)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const nan:0x200000) (f32.const -0x1p-126)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const nan) (f32.const 0x1p-126)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const nan:0x200000) (f32.const 0x1p-126)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -nan) (f32.const -0x1p-1)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -nan:0x200000) (f32.const -0x1p-1)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -nan) (f32.const 0x1p-1)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -nan:0x200000) (f32.const 0x1p-1)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const nan) (f32.const -0x1p-1)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const nan:0x200000) (f32.const -0x1p-1)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const nan) (f32.const 0x1p-1)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const nan:0x200000) (f32.const 0x1p-1)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -nan) (f32.const -0x1p+0)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -nan:0x200000) (f32.const -0x1p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -nan) (f32.const 0x1p+0)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -nan:0x200000) (f32.const 0x1p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const nan) (f32.const -0x1p+0)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const nan:0x200000) (f32.const -0x1p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const nan) (f32.const 0x1p+0)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const nan:0x200000) (f32.const 0x1p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -nan) (f32.const -0x1.921fb6p+2)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -nan:0x200000) (f32.const -0x1.921fb6p+2)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -nan) (f32.const 0x1.921fb6p+2)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -nan:0x200000) (f32.const 0x1.921fb6p+2)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const nan) (f32.const -0x1.921fb6p+2)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const nan:0x200000) (f32.const -0x1.921fb6p+2)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const nan) (f32.const 0x1.921fb6p+2)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const nan:0x200000) (f32.const 0x1.921fb6p+2)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -nan) (f32.const -0x1.fffffep+127)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -nan:0x200000) (f32.const -0x1.fffffep+127)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -nan) (f32.const 0x1.fffffep+127)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -nan:0x200000) (f32.const 0x1.fffffep+127)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const nan) (f32.const -0x1.fffffep+127)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const nan:0x200000) (f32.const -0x1.fffffep+127)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const nan) (f32.const 0x1.fffffep+127)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const nan:0x200000) (f32.const 0x1.fffffep+127)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -nan) (f32.const -inf)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -nan:0x200000) (f32.const -inf)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -nan) (f32.const inf)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -nan:0x200000) (f32.const inf)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const nan) (f32.const -inf)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const nan:0x200000) (f32.const -inf)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const nan) (f32.const inf)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const nan:0x200000) (f32.const inf)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -nan) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -nan:0x200000) (f32.const -nan)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -nan) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -nan:0x200000) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -nan) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const -nan:0x200000) (f32.const nan)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -nan) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const -nan:0x200000) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const nan) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const nan:0x200000) (f32.const -nan)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const nan) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const nan:0x200000) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const nan) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "div" (f32.const nan:0x200000) (f32.const nan)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const nan) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "div" (f32.const nan:0x200000) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -0x0p+0) (f32.const -0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "min" (f32.const -0x0p+0) (f32.const 0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "min" (f32.const 0x0p+0) (f32.const -0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "min" (f32.const 0x0p+0) (f32.const 0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "min" (f32.const -0x0p+0) (f32.const -0x1p-149)) (f32.const -0x1p-149)) -(assert_return (invoke "min" (f32.const -0x0p+0) (f32.const 0x1p-149)) (f32.const -0x0p+0)) -(assert_return (invoke "min" (f32.const 0x0p+0) (f32.const -0x1p-149)) (f32.const -0x1p-149)) -(assert_return (invoke "min" (f32.const 0x0p+0) (f32.const 0x1p-149)) (f32.const 0x0p+0)) -(assert_return (invoke "min" (f32.const -0x0p+0) (f32.const -0x1p-126)) (f32.const -0x1p-126)) -(assert_return (invoke "min" (f32.const -0x0p+0) (f32.const 0x1p-126)) (f32.const -0x0p+0)) -(assert_return (invoke "min" (f32.const 0x0p+0) (f32.const -0x1p-126)) (f32.const -0x1p-126)) -(assert_return (invoke "min" (f32.const 0x0p+0) (f32.const 0x1p-126)) (f32.const 0x0p+0)) -(assert_return (invoke "min" (f32.const -0x0p+0) (f32.const -0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "min" (f32.const -0x0p+0) (f32.const 0x1p-1)) (f32.const -0x0p+0)) -(assert_return (invoke "min" (f32.const 0x0p+0) (f32.const -0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "min" (f32.const 0x0p+0) (f32.const 0x1p-1)) (f32.const 0x0p+0)) -(assert_return (invoke "min" (f32.const -0x0p+0) (f32.const -0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "min" (f32.const -0x0p+0) (f32.const 0x1p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "min" (f32.const 0x0p+0) (f32.const -0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "min" (f32.const 0x0p+0) (f32.const 0x1p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "min" (f32.const -0x0p+0) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "min" (f32.const -0x0p+0) (f32.const 0x1.921fb6p+2)) (f32.const -0x0p+0)) -(assert_return (invoke "min" (f32.const 0x0p+0) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "min" (f32.const 0x0p+0) (f32.const 0x1.921fb6p+2)) (f32.const 0x0p+0)) -(assert_return (invoke "min" (f32.const -0x0p+0) (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "min" (f32.const -0x0p+0) (f32.const 0x1.fffffep+127)) (f32.const -0x0p+0)) -(assert_return (invoke "min" (f32.const 0x0p+0) (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "min" (f32.const 0x0p+0) (f32.const 0x1.fffffep+127)) (f32.const 0x0p+0)) -(assert_return (invoke "min" (f32.const -0x0p+0) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "min" (f32.const -0x0p+0) (f32.const inf)) (f32.const -0x0p+0)) -(assert_return (invoke "min" (f32.const 0x0p+0) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "min" (f32.const 0x0p+0) (f32.const inf)) (f32.const 0x0p+0)) -(assert_return (invoke "min" (f32.const -0x0p+0) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const -0x0p+0) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -0x0p+0) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const -0x0p+0) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const 0x0p+0) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const 0x0p+0) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const 0x0p+0) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const 0x0p+0) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -0x1p-149) (f32.const -0x0p+0)) (f32.const -0x1p-149)) -(assert_return (invoke "min" (f32.const -0x1p-149) (f32.const 0x0p+0)) (f32.const -0x1p-149)) -(assert_return (invoke "min" (f32.const 0x1p-149) (f32.const -0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "min" (f32.const 0x1p-149) (f32.const 0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "min" (f32.const -0x1p-149) (f32.const -0x1p-149)) (f32.const -0x1p-149)) -(assert_return (invoke "min" (f32.const -0x1p-149) (f32.const 0x1p-149)) (f32.const -0x1p-149)) -(assert_return (invoke "min" (f32.const 0x1p-149) (f32.const -0x1p-149)) (f32.const -0x1p-149)) -(assert_return (invoke "min" (f32.const 0x1p-149) (f32.const 0x1p-149)) (f32.const 0x1p-149)) -(assert_return (invoke "min" (f32.const -0x1p-149) (f32.const -0x1p-126)) (f32.const -0x1p-126)) -(assert_return (invoke "min" (f32.const -0x1p-149) (f32.const 0x1p-126)) (f32.const -0x1p-149)) -(assert_return (invoke "min" (f32.const 0x1p-149) (f32.const -0x1p-126)) (f32.const -0x1p-126)) -(assert_return (invoke "min" (f32.const 0x1p-149) (f32.const 0x1p-126)) (f32.const 0x1p-149)) -(assert_return (invoke "min" (f32.const -0x1p-149) (f32.const -0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "min" (f32.const -0x1p-149) (f32.const 0x1p-1)) (f32.const -0x1p-149)) -(assert_return (invoke "min" (f32.const 0x1p-149) (f32.const -0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "min" (f32.const 0x1p-149) (f32.const 0x1p-1)) (f32.const 0x1p-149)) -(assert_return (invoke "min" (f32.const -0x1p-149) (f32.const -0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "min" (f32.const -0x1p-149) (f32.const 0x1p+0)) (f32.const -0x1p-149)) -(assert_return (invoke "min" (f32.const 0x1p-149) (f32.const -0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "min" (f32.const 0x1p-149) (f32.const 0x1p+0)) (f32.const 0x1p-149)) -(assert_return (invoke "min" (f32.const -0x1p-149) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "min" (f32.const -0x1p-149) (f32.const 0x1.921fb6p+2)) (f32.const -0x1p-149)) -(assert_return (invoke "min" (f32.const 0x1p-149) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "min" (f32.const 0x1p-149) (f32.const 0x1.921fb6p+2)) (f32.const 0x1p-149)) -(assert_return (invoke "min" (f32.const -0x1p-149) (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "min" (f32.const -0x1p-149) (f32.const 0x1.fffffep+127)) (f32.const -0x1p-149)) -(assert_return (invoke "min" (f32.const 0x1p-149) (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "min" (f32.const 0x1p-149) (f32.const 0x1.fffffep+127)) (f32.const 0x1p-149)) -(assert_return (invoke "min" (f32.const -0x1p-149) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "min" (f32.const -0x1p-149) (f32.const inf)) (f32.const -0x1p-149)) -(assert_return (invoke "min" (f32.const 0x1p-149) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "min" (f32.const 0x1p-149) (f32.const inf)) (f32.const 0x1p-149)) -(assert_return (invoke "min" (f32.const -0x1p-149) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const -0x1p-149) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -0x1p-149) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const -0x1p-149) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const 0x1p-149) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const 0x1p-149) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const 0x1p-149) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const 0x1p-149) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -0x1p-126) (f32.const -0x0p+0)) (f32.const -0x1p-126)) -(assert_return (invoke "min" (f32.const -0x1p-126) (f32.const 0x0p+0)) (f32.const -0x1p-126)) -(assert_return (invoke "min" (f32.const 0x1p-126) (f32.const -0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "min" (f32.const 0x1p-126) (f32.const 0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "min" (f32.const -0x1p-126) (f32.const -0x1p-149)) (f32.const -0x1p-126)) -(assert_return (invoke "min" (f32.const -0x1p-126) (f32.const 0x1p-149)) (f32.const -0x1p-126)) -(assert_return (invoke "min" (f32.const 0x1p-126) (f32.const -0x1p-149)) (f32.const -0x1p-149)) -(assert_return (invoke "min" (f32.const 0x1p-126) (f32.const 0x1p-149)) (f32.const 0x1p-149)) -(assert_return (invoke "min" (f32.const -0x1p-126) (f32.const -0x1p-126)) (f32.const -0x1p-126)) -(assert_return (invoke "min" (f32.const -0x1p-126) (f32.const 0x1p-126)) (f32.const -0x1p-126)) -(assert_return (invoke "min" (f32.const 0x1p-126) (f32.const -0x1p-126)) (f32.const -0x1p-126)) -(assert_return (invoke "min" (f32.const 0x1p-126) (f32.const 0x1p-126)) (f32.const 0x1p-126)) -(assert_return (invoke "min" (f32.const -0x1p-126) (f32.const -0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "min" (f32.const -0x1p-126) (f32.const 0x1p-1)) (f32.const -0x1p-126)) -(assert_return (invoke "min" (f32.const 0x1p-126) (f32.const -0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "min" (f32.const 0x1p-126) (f32.const 0x1p-1)) (f32.const 0x1p-126)) -(assert_return (invoke "min" (f32.const -0x1p-126) (f32.const -0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "min" (f32.const -0x1p-126) (f32.const 0x1p+0)) (f32.const -0x1p-126)) -(assert_return (invoke "min" (f32.const 0x1p-126) (f32.const -0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "min" (f32.const 0x1p-126) (f32.const 0x1p+0)) (f32.const 0x1p-126)) -(assert_return (invoke "min" (f32.const -0x1p-126) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "min" (f32.const -0x1p-126) (f32.const 0x1.921fb6p+2)) (f32.const -0x1p-126)) -(assert_return (invoke "min" (f32.const 0x1p-126) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "min" (f32.const 0x1p-126) (f32.const 0x1.921fb6p+2)) (f32.const 0x1p-126)) -(assert_return (invoke "min" (f32.const -0x1p-126) (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "min" (f32.const -0x1p-126) (f32.const 0x1.fffffep+127)) (f32.const -0x1p-126)) -(assert_return (invoke "min" (f32.const 0x1p-126) (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "min" (f32.const 0x1p-126) (f32.const 0x1.fffffep+127)) (f32.const 0x1p-126)) -(assert_return (invoke "min" (f32.const -0x1p-126) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "min" (f32.const -0x1p-126) (f32.const inf)) (f32.const -0x1p-126)) -(assert_return (invoke "min" (f32.const 0x1p-126) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "min" (f32.const 0x1p-126) (f32.const inf)) (f32.const 0x1p-126)) -(assert_return (invoke "min" (f32.const -0x1p-126) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const -0x1p-126) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -0x1p-126) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const -0x1p-126) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const 0x1p-126) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const 0x1p-126) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const 0x1p-126) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const 0x1p-126) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -0x1p-1) (f32.const -0x0p+0)) (f32.const -0x1p-1)) -(assert_return (invoke "min" (f32.const -0x1p-1) (f32.const 0x0p+0)) (f32.const -0x1p-1)) -(assert_return (invoke "min" (f32.const 0x1p-1) (f32.const -0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "min" (f32.const 0x1p-1) (f32.const 0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "min" (f32.const -0x1p-1) (f32.const -0x1p-149)) (f32.const -0x1p-1)) -(assert_return (invoke "min" (f32.const -0x1p-1) (f32.const 0x1p-149)) (f32.const -0x1p-1)) -(assert_return (invoke "min" (f32.const 0x1p-1) (f32.const -0x1p-149)) (f32.const -0x1p-149)) -(assert_return (invoke "min" (f32.const 0x1p-1) (f32.const 0x1p-149)) (f32.const 0x1p-149)) -(assert_return (invoke "min" (f32.const -0x1p-1) (f32.const -0x1p-126)) (f32.const -0x1p-1)) -(assert_return (invoke "min" (f32.const -0x1p-1) (f32.const 0x1p-126)) (f32.const -0x1p-1)) -(assert_return (invoke "min" (f32.const 0x1p-1) (f32.const -0x1p-126)) (f32.const -0x1p-126)) -(assert_return (invoke "min" (f32.const 0x1p-1) (f32.const 0x1p-126)) (f32.const 0x1p-126)) -(assert_return (invoke "min" (f32.const -0x1p-1) (f32.const -0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "min" (f32.const -0x1p-1) (f32.const 0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "min" (f32.const 0x1p-1) (f32.const -0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "min" (f32.const 0x1p-1) (f32.const 0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "min" (f32.const -0x1p-1) (f32.const -0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "min" (f32.const -0x1p-1) (f32.const 0x1p+0)) (f32.const -0x1p-1)) -(assert_return (invoke "min" (f32.const 0x1p-1) (f32.const -0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "min" (f32.const 0x1p-1) (f32.const 0x1p+0)) (f32.const 0x1p-1)) -(assert_return (invoke "min" (f32.const -0x1p-1) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "min" (f32.const -0x1p-1) (f32.const 0x1.921fb6p+2)) (f32.const -0x1p-1)) -(assert_return (invoke "min" (f32.const 0x1p-1) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "min" (f32.const 0x1p-1) (f32.const 0x1.921fb6p+2)) (f32.const 0x1p-1)) -(assert_return (invoke "min" (f32.const -0x1p-1) (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "min" (f32.const -0x1p-1) (f32.const 0x1.fffffep+127)) (f32.const -0x1p-1)) -(assert_return (invoke "min" (f32.const 0x1p-1) (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "min" (f32.const 0x1p-1) (f32.const 0x1.fffffep+127)) (f32.const 0x1p-1)) -(assert_return (invoke "min" (f32.const -0x1p-1) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "min" (f32.const -0x1p-1) (f32.const inf)) (f32.const -0x1p-1)) -(assert_return (invoke "min" (f32.const 0x1p-1) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "min" (f32.const 0x1p-1) (f32.const inf)) (f32.const 0x1p-1)) -(assert_return (invoke "min" (f32.const -0x1p-1) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const -0x1p-1) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -0x1p-1) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const -0x1p-1) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const 0x1p-1) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const 0x1p-1) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const 0x1p-1) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const 0x1p-1) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -0x1p+0) (f32.const -0x0p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "min" (f32.const -0x1p+0) (f32.const 0x0p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "min" (f32.const 0x1p+0) (f32.const -0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "min" (f32.const 0x1p+0) (f32.const 0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "min" (f32.const -0x1p+0) (f32.const -0x1p-149)) (f32.const -0x1p+0)) -(assert_return (invoke "min" (f32.const -0x1p+0) (f32.const 0x1p-149)) (f32.const -0x1p+0)) -(assert_return (invoke "min" (f32.const 0x1p+0) (f32.const -0x1p-149)) (f32.const -0x1p-149)) -(assert_return (invoke "min" (f32.const 0x1p+0) (f32.const 0x1p-149)) (f32.const 0x1p-149)) -(assert_return (invoke "min" (f32.const -0x1p+0) (f32.const -0x1p-126)) (f32.const -0x1p+0)) -(assert_return (invoke "min" (f32.const -0x1p+0) (f32.const 0x1p-126)) (f32.const -0x1p+0)) -(assert_return (invoke "min" (f32.const 0x1p+0) (f32.const -0x1p-126)) (f32.const -0x1p-126)) -(assert_return (invoke "min" (f32.const 0x1p+0) (f32.const 0x1p-126)) (f32.const 0x1p-126)) -(assert_return (invoke "min" (f32.const -0x1p+0) (f32.const -0x1p-1)) (f32.const -0x1p+0)) -(assert_return (invoke "min" (f32.const -0x1p+0) (f32.const 0x1p-1)) (f32.const -0x1p+0)) -(assert_return (invoke "min" (f32.const 0x1p+0) (f32.const -0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "min" (f32.const 0x1p+0) (f32.const 0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "min" (f32.const -0x1p+0) (f32.const -0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "min" (f32.const -0x1p+0) (f32.const 0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "min" (f32.const 0x1p+0) (f32.const -0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "min" (f32.const 0x1p+0) (f32.const 0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "min" (f32.const -0x1p+0) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "min" (f32.const -0x1p+0) (f32.const 0x1.921fb6p+2)) (f32.const -0x1p+0)) -(assert_return (invoke "min" (f32.const 0x1p+0) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "min" (f32.const 0x1p+0) (f32.const 0x1.921fb6p+2)) (f32.const 0x1p+0)) -(assert_return (invoke "min" (f32.const -0x1p+0) (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "min" (f32.const -0x1p+0) (f32.const 0x1.fffffep+127)) (f32.const -0x1p+0)) -(assert_return (invoke "min" (f32.const 0x1p+0) (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "min" (f32.const 0x1p+0) (f32.const 0x1.fffffep+127)) (f32.const 0x1p+0)) -(assert_return (invoke "min" (f32.const -0x1p+0) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "min" (f32.const -0x1p+0) (f32.const inf)) (f32.const -0x1p+0)) -(assert_return (invoke "min" (f32.const 0x1p+0) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "min" (f32.const 0x1p+0) (f32.const inf)) (f32.const 0x1p+0)) -(assert_return (invoke "min" (f32.const -0x1p+0) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const -0x1p+0) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -0x1p+0) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const -0x1p+0) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const 0x1p+0) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const 0x1p+0) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const 0x1p+0) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const 0x1p+0) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -0x1.921fb6p+2) (f32.const -0x0p+0)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "min" (f32.const -0x1.921fb6p+2) (f32.const 0x0p+0)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "min" (f32.const 0x1.921fb6p+2) (f32.const -0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "min" (f32.const 0x1.921fb6p+2) (f32.const 0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "min" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-149)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "min" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-149)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "min" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-149)) (f32.const -0x1p-149)) -(assert_return (invoke "min" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-149)) (f32.const 0x1p-149)) -(assert_return (invoke "min" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-126)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "min" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-126)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "min" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-126)) (f32.const -0x1p-126)) -(assert_return (invoke "min" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-126)) (f32.const 0x1p-126)) -(assert_return (invoke "min" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-1)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "min" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-1)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "min" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "min" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "min" (f32.const -0x1.921fb6p+2) (f32.const -0x1p+0)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "min" (f32.const -0x1.921fb6p+2) (f32.const 0x1p+0)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "min" (f32.const 0x1.921fb6p+2) (f32.const -0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "min" (f32.const 0x1.921fb6p+2) (f32.const 0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "min" (f32.const -0x1.921fb6p+2) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "min" (f32.const -0x1.921fb6p+2) (f32.const 0x1.921fb6p+2)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "min" (f32.const 0x1.921fb6p+2) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "min" (f32.const 0x1.921fb6p+2) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "min" (f32.const -0x1.921fb6p+2) (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "min" (f32.const -0x1.921fb6p+2) (f32.const 0x1.fffffep+127)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "min" (f32.const 0x1.921fb6p+2) (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "min" (f32.const 0x1.921fb6p+2) (f32.const 0x1.fffffep+127)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "min" (f32.const -0x1.921fb6p+2) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "min" (f32.const -0x1.921fb6p+2) (f32.const inf)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "min" (f32.const 0x1.921fb6p+2) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "min" (f32.const 0x1.921fb6p+2) (f32.const inf)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "min" (f32.const -0x1.921fb6p+2) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const -0x1.921fb6p+2) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -0x1.921fb6p+2) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const -0x1.921fb6p+2) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const 0x1.921fb6p+2) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const 0x1.921fb6p+2) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const 0x1.921fb6p+2) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const 0x1.921fb6p+2) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -0x1.fffffep+127) (f32.const -0x0p+0)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "min" (f32.const -0x1.fffffep+127) (f32.const 0x0p+0)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "min" (f32.const 0x1.fffffep+127) (f32.const -0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "min" (f32.const 0x1.fffffep+127) (f32.const 0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "min" (f32.const -0x1.fffffep+127) (f32.const -0x1p-149)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "min" (f32.const -0x1.fffffep+127) (f32.const 0x1p-149)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "min" (f32.const 0x1.fffffep+127) (f32.const -0x1p-149)) (f32.const -0x1p-149)) -(assert_return (invoke "min" (f32.const 0x1.fffffep+127) (f32.const 0x1p-149)) (f32.const 0x1p-149)) -(assert_return (invoke "min" (f32.const -0x1.fffffep+127) (f32.const -0x1p-126)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "min" (f32.const -0x1.fffffep+127) (f32.const 0x1p-126)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "min" (f32.const 0x1.fffffep+127) (f32.const -0x1p-126)) (f32.const -0x1p-126)) -(assert_return (invoke "min" (f32.const 0x1.fffffep+127) (f32.const 0x1p-126)) (f32.const 0x1p-126)) -(assert_return (invoke "min" (f32.const -0x1.fffffep+127) (f32.const -0x1p-1)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "min" (f32.const -0x1.fffffep+127) (f32.const 0x1p-1)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "min" (f32.const 0x1.fffffep+127) (f32.const -0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "min" (f32.const 0x1.fffffep+127) (f32.const 0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "min" (f32.const -0x1.fffffep+127) (f32.const -0x1p+0)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "min" (f32.const -0x1.fffffep+127) (f32.const 0x1p+0)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "min" (f32.const 0x1.fffffep+127) (f32.const -0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "min" (f32.const 0x1.fffffep+127) (f32.const 0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "min" (f32.const -0x1.fffffep+127) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "min" (f32.const -0x1.fffffep+127) (f32.const 0x1.921fb6p+2)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "min" (f32.const 0x1.fffffep+127) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "min" (f32.const 0x1.fffffep+127) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "min" (f32.const -0x1.fffffep+127) (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "min" (f32.const -0x1.fffffep+127) (f32.const 0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "min" (f32.const 0x1.fffffep+127) (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "min" (f32.const 0x1.fffffep+127) (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "min" (f32.const -0x1.fffffep+127) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "min" (f32.const -0x1.fffffep+127) (f32.const inf)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "min" (f32.const 0x1.fffffep+127) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "min" (f32.const 0x1.fffffep+127) (f32.const inf)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "min" (f32.const -0x1.fffffep+127) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const -0x1.fffffep+127) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -0x1.fffffep+127) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const -0x1.fffffep+127) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const 0x1.fffffep+127) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const 0x1.fffffep+127) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const 0x1.fffffep+127) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const 0x1.fffffep+127) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -inf) (f32.const -0x0p+0)) (f32.const -inf)) -(assert_return (invoke "min" (f32.const -inf) (f32.const 0x0p+0)) (f32.const -inf)) -(assert_return (invoke "min" (f32.const inf) (f32.const -0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "min" (f32.const inf) (f32.const 0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "min" (f32.const -inf) (f32.const -0x1p-149)) (f32.const -inf)) -(assert_return (invoke "min" (f32.const -inf) (f32.const 0x1p-149)) (f32.const -inf)) -(assert_return (invoke "min" (f32.const inf) (f32.const -0x1p-149)) (f32.const -0x1p-149)) -(assert_return (invoke "min" (f32.const inf) (f32.const 0x1p-149)) (f32.const 0x1p-149)) -(assert_return (invoke "min" (f32.const -inf) (f32.const -0x1p-126)) (f32.const -inf)) -(assert_return (invoke "min" (f32.const -inf) (f32.const 0x1p-126)) (f32.const -inf)) -(assert_return (invoke "min" (f32.const inf) (f32.const -0x1p-126)) (f32.const -0x1p-126)) -(assert_return (invoke "min" (f32.const inf) (f32.const 0x1p-126)) (f32.const 0x1p-126)) -(assert_return (invoke "min" (f32.const -inf) (f32.const -0x1p-1)) (f32.const -inf)) -(assert_return (invoke "min" (f32.const -inf) (f32.const 0x1p-1)) (f32.const -inf)) -(assert_return (invoke "min" (f32.const inf) (f32.const -0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "min" (f32.const inf) (f32.const 0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "min" (f32.const -inf) (f32.const -0x1p+0)) (f32.const -inf)) -(assert_return (invoke "min" (f32.const -inf) (f32.const 0x1p+0)) (f32.const -inf)) -(assert_return (invoke "min" (f32.const inf) (f32.const -0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "min" (f32.const inf) (f32.const 0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "min" (f32.const -inf) (f32.const -0x1.921fb6p+2)) (f32.const -inf)) -(assert_return (invoke "min" (f32.const -inf) (f32.const 0x1.921fb6p+2)) (f32.const -inf)) -(assert_return (invoke "min" (f32.const inf) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "min" (f32.const inf) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "min" (f32.const -inf) (f32.const -0x1.fffffep+127)) (f32.const -inf)) -(assert_return (invoke "min" (f32.const -inf) (f32.const 0x1.fffffep+127)) (f32.const -inf)) -(assert_return (invoke "min" (f32.const inf) (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "min" (f32.const inf) (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "min" (f32.const -inf) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "min" (f32.const -inf) (f32.const inf)) (f32.const -inf)) -(assert_return (invoke "min" (f32.const inf) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "min" (f32.const inf) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "min" (f32.const -inf) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const -inf) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -inf) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const -inf) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const inf) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const inf) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const inf) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const inf) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -nan) (f32.const -0x0p+0)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const -nan:0x200000) (f32.const -0x0p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -nan) (f32.const 0x0p+0)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const -nan:0x200000) (f32.const 0x0p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const nan) (f32.const -0x0p+0)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const nan:0x200000) (f32.const -0x0p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const nan) (f32.const 0x0p+0)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const nan:0x200000) (f32.const 0x0p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -nan) (f32.const -0x1p-149)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const -nan:0x200000) (f32.const -0x1p-149)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -nan) (f32.const 0x1p-149)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const -nan:0x200000) (f32.const 0x1p-149)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const nan) (f32.const -0x1p-149)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const nan:0x200000) (f32.const -0x1p-149)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const nan) (f32.const 0x1p-149)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const nan:0x200000) (f32.const 0x1p-149)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -nan) (f32.const -0x1p-126)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const -nan:0x200000) (f32.const -0x1p-126)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -nan) (f32.const 0x1p-126)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const -nan:0x200000) (f32.const 0x1p-126)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const nan) (f32.const -0x1p-126)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const nan:0x200000) (f32.const -0x1p-126)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const nan) (f32.const 0x1p-126)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const nan:0x200000) (f32.const 0x1p-126)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -nan) (f32.const -0x1p-1)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const -nan:0x200000) (f32.const -0x1p-1)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -nan) (f32.const 0x1p-1)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const -nan:0x200000) (f32.const 0x1p-1)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const nan) (f32.const -0x1p-1)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const nan:0x200000) (f32.const -0x1p-1)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const nan) (f32.const 0x1p-1)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const nan:0x200000) (f32.const 0x1p-1)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -nan) (f32.const -0x1p+0)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const -nan:0x200000) (f32.const -0x1p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -nan) (f32.const 0x1p+0)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const -nan:0x200000) (f32.const 0x1p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const nan) (f32.const -0x1p+0)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const nan:0x200000) (f32.const -0x1p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const nan) (f32.const 0x1p+0)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const nan:0x200000) (f32.const 0x1p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -nan) (f32.const -0x1.921fb6p+2)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const -nan:0x200000) (f32.const -0x1.921fb6p+2)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -nan) (f32.const 0x1.921fb6p+2)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const -nan:0x200000) (f32.const 0x1.921fb6p+2)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const nan) (f32.const -0x1.921fb6p+2)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const nan:0x200000) (f32.const -0x1.921fb6p+2)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const nan) (f32.const 0x1.921fb6p+2)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const nan:0x200000) (f32.const 0x1.921fb6p+2)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -nan) (f32.const -0x1.fffffep+127)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const -nan:0x200000) (f32.const -0x1.fffffep+127)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -nan) (f32.const 0x1.fffffep+127)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const -nan:0x200000) (f32.const 0x1.fffffep+127)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const nan) (f32.const -0x1.fffffep+127)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const nan:0x200000) (f32.const -0x1.fffffep+127)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const nan) (f32.const 0x1.fffffep+127)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const nan:0x200000) (f32.const 0x1.fffffep+127)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -nan) (f32.const -inf)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const -nan:0x200000) (f32.const -inf)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -nan) (f32.const inf)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const -nan:0x200000) (f32.const inf)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const nan) (f32.const -inf)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const nan:0x200000) (f32.const -inf)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const nan) (f32.const inf)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const nan:0x200000) (f32.const inf)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -nan) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const -nan:0x200000) (f32.const -nan)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -nan) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -nan:0x200000) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -nan) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const -nan:0x200000) (f32.const nan)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -nan) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const -nan:0x200000) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const nan) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const nan:0x200000) (f32.const -nan)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const nan) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const nan:0x200000) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const nan) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "min" (f32.const nan:0x200000) (f32.const nan)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const nan) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "min" (f32.const nan:0x200000) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -0x0p+0) (f32.const -0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "max" (f32.const -0x0p+0) (f32.const 0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "max" (f32.const 0x0p+0) (f32.const -0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "max" (f32.const 0x0p+0) (f32.const 0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "max" (f32.const -0x0p+0) (f32.const -0x1p-149)) (f32.const -0x0p+0)) -(assert_return (invoke "max" (f32.const -0x0p+0) (f32.const 0x1p-149)) (f32.const 0x1p-149)) -(assert_return (invoke "max" (f32.const 0x0p+0) (f32.const -0x1p-149)) (f32.const 0x0p+0)) -(assert_return (invoke "max" (f32.const 0x0p+0) (f32.const 0x1p-149)) (f32.const 0x1p-149)) -(assert_return (invoke "max" (f32.const -0x0p+0) (f32.const -0x1p-126)) (f32.const -0x0p+0)) -(assert_return (invoke "max" (f32.const -0x0p+0) (f32.const 0x1p-126)) (f32.const 0x1p-126)) -(assert_return (invoke "max" (f32.const 0x0p+0) (f32.const -0x1p-126)) (f32.const 0x0p+0)) -(assert_return (invoke "max" (f32.const 0x0p+0) (f32.const 0x1p-126)) (f32.const 0x1p-126)) -(assert_return (invoke "max" (f32.const -0x0p+0) (f32.const -0x1p-1)) (f32.const -0x0p+0)) -(assert_return (invoke "max" (f32.const -0x0p+0) (f32.const 0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "max" (f32.const 0x0p+0) (f32.const -0x1p-1)) (f32.const 0x0p+0)) -(assert_return (invoke "max" (f32.const 0x0p+0) (f32.const 0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "max" (f32.const -0x0p+0) (f32.const -0x1p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "max" (f32.const -0x0p+0) (f32.const 0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "max" (f32.const 0x0p+0) (f32.const -0x1p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "max" (f32.const 0x0p+0) (f32.const 0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "max" (f32.const -0x0p+0) (f32.const -0x1.921fb6p+2)) (f32.const -0x0p+0)) -(assert_return (invoke "max" (f32.const -0x0p+0) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "max" (f32.const 0x0p+0) (f32.const -0x1.921fb6p+2)) (f32.const 0x0p+0)) -(assert_return (invoke "max" (f32.const 0x0p+0) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "max" (f32.const -0x0p+0) (f32.const -0x1.fffffep+127)) (f32.const -0x0p+0)) -(assert_return (invoke "max" (f32.const -0x0p+0) (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "max" (f32.const 0x0p+0) (f32.const -0x1.fffffep+127)) (f32.const 0x0p+0)) -(assert_return (invoke "max" (f32.const 0x0p+0) (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "max" (f32.const -0x0p+0) (f32.const -inf)) (f32.const -0x0p+0)) -(assert_return (invoke "max" (f32.const -0x0p+0) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "max" (f32.const 0x0p+0) (f32.const -inf)) (f32.const 0x0p+0)) -(assert_return (invoke "max" (f32.const 0x0p+0) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "max" (f32.const -0x0p+0) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const -0x0p+0) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -0x0p+0) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const -0x0p+0) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const 0x0p+0) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const 0x0p+0) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const 0x0p+0) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const 0x0p+0) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -0x1p-149) (f32.const -0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "max" (f32.const -0x1p-149) (f32.const 0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "max" (f32.const 0x1p-149) (f32.const -0x0p+0)) (f32.const 0x1p-149)) -(assert_return (invoke "max" (f32.const 0x1p-149) (f32.const 0x0p+0)) (f32.const 0x1p-149)) -(assert_return (invoke "max" (f32.const -0x1p-149) (f32.const -0x1p-149)) (f32.const -0x1p-149)) -(assert_return (invoke "max" (f32.const -0x1p-149) (f32.const 0x1p-149)) (f32.const 0x1p-149)) -(assert_return (invoke "max" (f32.const 0x1p-149) (f32.const -0x1p-149)) (f32.const 0x1p-149)) -(assert_return (invoke "max" (f32.const 0x1p-149) (f32.const 0x1p-149)) (f32.const 0x1p-149)) -(assert_return (invoke "max" (f32.const -0x1p-149) (f32.const -0x1p-126)) (f32.const -0x1p-149)) -(assert_return (invoke "max" (f32.const -0x1p-149) (f32.const 0x1p-126)) (f32.const 0x1p-126)) -(assert_return (invoke "max" (f32.const 0x1p-149) (f32.const -0x1p-126)) (f32.const 0x1p-149)) -(assert_return (invoke "max" (f32.const 0x1p-149) (f32.const 0x1p-126)) (f32.const 0x1p-126)) -(assert_return (invoke "max" (f32.const -0x1p-149) (f32.const -0x1p-1)) (f32.const -0x1p-149)) -(assert_return (invoke "max" (f32.const -0x1p-149) (f32.const 0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "max" (f32.const 0x1p-149) (f32.const -0x1p-1)) (f32.const 0x1p-149)) -(assert_return (invoke "max" (f32.const 0x1p-149) (f32.const 0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "max" (f32.const -0x1p-149) (f32.const -0x1p+0)) (f32.const -0x1p-149)) -(assert_return (invoke "max" (f32.const -0x1p-149) (f32.const 0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "max" (f32.const 0x1p-149) (f32.const -0x1p+0)) (f32.const 0x1p-149)) -(assert_return (invoke "max" (f32.const 0x1p-149) (f32.const 0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "max" (f32.const -0x1p-149) (f32.const -0x1.921fb6p+2)) (f32.const -0x1p-149)) -(assert_return (invoke "max" (f32.const -0x1p-149) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "max" (f32.const 0x1p-149) (f32.const -0x1.921fb6p+2)) (f32.const 0x1p-149)) -(assert_return (invoke "max" (f32.const 0x1p-149) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "max" (f32.const -0x1p-149) (f32.const -0x1.fffffep+127)) (f32.const -0x1p-149)) -(assert_return (invoke "max" (f32.const -0x1p-149) (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "max" (f32.const 0x1p-149) (f32.const -0x1.fffffep+127)) (f32.const 0x1p-149)) -(assert_return (invoke "max" (f32.const 0x1p-149) (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "max" (f32.const -0x1p-149) (f32.const -inf)) (f32.const -0x1p-149)) -(assert_return (invoke "max" (f32.const -0x1p-149) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "max" (f32.const 0x1p-149) (f32.const -inf)) (f32.const 0x1p-149)) -(assert_return (invoke "max" (f32.const 0x1p-149) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "max" (f32.const -0x1p-149) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const -0x1p-149) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -0x1p-149) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const -0x1p-149) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const 0x1p-149) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const 0x1p-149) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const 0x1p-149) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const 0x1p-149) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -0x1p-126) (f32.const -0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "max" (f32.const -0x1p-126) (f32.const 0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "max" (f32.const 0x1p-126) (f32.const -0x0p+0)) (f32.const 0x1p-126)) -(assert_return (invoke "max" (f32.const 0x1p-126) (f32.const 0x0p+0)) (f32.const 0x1p-126)) -(assert_return (invoke "max" (f32.const -0x1p-126) (f32.const -0x1p-149)) (f32.const -0x1p-149)) -(assert_return (invoke "max" (f32.const -0x1p-126) (f32.const 0x1p-149)) (f32.const 0x1p-149)) -(assert_return (invoke "max" (f32.const 0x1p-126) (f32.const -0x1p-149)) (f32.const 0x1p-126)) -(assert_return (invoke "max" (f32.const 0x1p-126) (f32.const 0x1p-149)) (f32.const 0x1p-126)) -(assert_return (invoke "max" (f32.const -0x1p-126) (f32.const -0x1p-126)) (f32.const -0x1p-126)) -(assert_return (invoke "max" (f32.const -0x1p-126) (f32.const 0x1p-126)) (f32.const 0x1p-126)) -(assert_return (invoke "max" (f32.const 0x1p-126) (f32.const -0x1p-126)) (f32.const 0x1p-126)) -(assert_return (invoke "max" (f32.const 0x1p-126) (f32.const 0x1p-126)) (f32.const 0x1p-126)) -(assert_return (invoke "max" (f32.const -0x1p-126) (f32.const -0x1p-1)) (f32.const -0x1p-126)) -(assert_return (invoke "max" (f32.const -0x1p-126) (f32.const 0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "max" (f32.const 0x1p-126) (f32.const -0x1p-1)) (f32.const 0x1p-126)) -(assert_return (invoke "max" (f32.const 0x1p-126) (f32.const 0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "max" (f32.const -0x1p-126) (f32.const -0x1p+0)) (f32.const -0x1p-126)) -(assert_return (invoke "max" (f32.const -0x1p-126) (f32.const 0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "max" (f32.const 0x1p-126) (f32.const -0x1p+0)) (f32.const 0x1p-126)) -(assert_return (invoke "max" (f32.const 0x1p-126) (f32.const 0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "max" (f32.const -0x1p-126) (f32.const -0x1.921fb6p+2)) (f32.const -0x1p-126)) -(assert_return (invoke "max" (f32.const -0x1p-126) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "max" (f32.const 0x1p-126) (f32.const -0x1.921fb6p+2)) (f32.const 0x1p-126)) -(assert_return (invoke "max" (f32.const 0x1p-126) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "max" (f32.const -0x1p-126) (f32.const -0x1.fffffep+127)) (f32.const -0x1p-126)) -(assert_return (invoke "max" (f32.const -0x1p-126) (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "max" (f32.const 0x1p-126) (f32.const -0x1.fffffep+127)) (f32.const 0x1p-126)) -(assert_return (invoke "max" (f32.const 0x1p-126) (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "max" (f32.const -0x1p-126) (f32.const -inf)) (f32.const -0x1p-126)) -(assert_return (invoke "max" (f32.const -0x1p-126) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "max" (f32.const 0x1p-126) (f32.const -inf)) (f32.const 0x1p-126)) -(assert_return (invoke "max" (f32.const 0x1p-126) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "max" (f32.const -0x1p-126) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const -0x1p-126) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -0x1p-126) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const -0x1p-126) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const 0x1p-126) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const 0x1p-126) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const 0x1p-126) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const 0x1p-126) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -0x1p-1) (f32.const -0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "max" (f32.const -0x1p-1) (f32.const 0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "max" (f32.const 0x1p-1) (f32.const -0x0p+0)) (f32.const 0x1p-1)) -(assert_return (invoke "max" (f32.const 0x1p-1) (f32.const 0x0p+0)) (f32.const 0x1p-1)) -(assert_return (invoke "max" (f32.const -0x1p-1) (f32.const -0x1p-149)) (f32.const -0x1p-149)) -(assert_return (invoke "max" (f32.const -0x1p-1) (f32.const 0x1p-149)) (f32.const 0x1p-149)) -(assert_return (invoke "max" (f32.const 0x1p-1) (f32.const -0x1p-149)) (f32.const 0x1p-1)) -(assert_return (invoke "max" (f32.const 0x1p-1) (f32.const 0x1p-149)) (f32.const 0x1p-1)) -(assert_return (invoke "max" (f32.const -0x1p-1) (f32.const -0x1p-126)) (f32.const -0x1p-126)) -(assert_return (invoke "max" (f32.const -0x1p-1) (f32.const 0x1p-126)) (f32.const 0x1p-126)) -(assert_return (invoke "max" (f32.const 0x1p-1) (f32.const -0x1p-126)) (f32.const 0x1p-1)) -(assert_return (invoke "max" (f32.const 0x1p-1) (f32.const 0x1p-126)) (f32.const 0x1p-1)) -(assert_return (invoke "max" (f32.const -0x1p-1) (f32.const -0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "max" (f32.const -0x1p-1) (f32.const 0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "max" (f32.const 0x1p-1) (f32.const -0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "max" (f32.const 0x1p-1) (f32.const 0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "max" (f32.const -0x1p-1) (f32.const -0x1p+0)) (f32.const -0x1p-1)) -(assert_return (invoke "max" (f32.const -0x1p-1) (f32.const 0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "max" (f32.const 0x1p-1) (f32.const -0x1p+0)) (f32.const 0x1p-1)) -(assert_return (invoke "max" (f32.const 0x1p-1) (f32.const 0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "max" (f32.const -0x1p-1) (f32.const -0x1.921fb6p+2)) (f32.const -0x1p-1)) -(assert_return (invoke "max" (f32.const -0x1p-1) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "max" (f32.const 0x1p-1) (f32.const -0x1.921fb6p+2)) (f32.const 0x1p-1)) -(assert_return (invoke "max" (f32.const 0x1p-1) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "max" (f32.const -0x1p-1) (f32.const -0x1.fffffep+127)) (f32.const -0x1p-1)) -(assert_return (invoke "max" (f32.const -0x1p-1) (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "max" (f32.const 0x1p-1) (f32.const -0x1.fffffep+127)) (f32.const 0x1p-1)) -(assert_return (invoke "max" (f32.const 0x1p-1) (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "max" (f32.const -0x1p-1) (f32.const -inf)) (f32.const -0x1p-1)) -(assert_return (invoke "max" (f32.const -0x1p-1) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "max" (f32.const 0x1p-1) (f32.const -inf)) (f32.const 0x1p-1)) -(assert_return (invoke "max" (f32.const 0x1p-1) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "max" (f32.const -0x1p-1) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const -0x1p-1) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -0x1p-1) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const -0x1p-1) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const 0x1p-1) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const 0x1p-1) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const 0x1p-1) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const 0x1p-1) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -0x1p+0) (f32.const -0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "max" (f32.const -0x1p+0) (f32.const 0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "max" (f32.const 0x1p+0) (f32.const -0x0p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "max" (f32.const 0x1p+0) (f32.const 0x0p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "max" (f32.const -0x1p+0) (f32.const -0x1p-149)) (f32.const -0x1p-149)) -(assert_return (invoke "max" (f32.const -0x1p+0) (f32.const 0x1p-149)) (f32.const 0x1p-149)) -(assert_return (invoke "max" (f32.const 0x1p+0) (f32.const -0x1p-149)) (f32.const 0x1p+0)) -(assert_return (invoke "max" (f32.const 0x1p+0) (f32.const 0x1p-149)) (f32.const 0x1p+0)) -(assert_return (invoke "max" (f32.const -0x1p+0) (f32.const -0x1p-126)) (f32.const -0x1p-126)) -(assert_return (invoke "max" (f32.const -0x1p+0) (f32.const 0x1p-126)) (f32.const 0x1p-126)) -(assert_return (invoke "max" (f32.const 0x1p+0) (f32.const -0x1p-126)) (f32.const 0x1p+0)) -(assert_return (invoke "max" (f32.const 0x1p+0) (f32.const 0x1p-126)) (f32.const 0x1p+0)) -(assert_return (invoke "max" (f32.const -0x1p+0) (f32.const -0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "max" (f32.const -0x1p+0) (f32.const 0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "max" (f32.const 0x1p+0) (f32.const -0x1p-1)) (f32.const 0x1p+0)) -(assert_return (invoke "max" (f32.const 0x1p+0) (f32.const 0x1p-1)) (f32.const 0x1p+0)) -(assert_return (invoke "max" (f32.const -0x1p+0) (f32.const -0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "max" (f32.const -0x1p+0) (f32.const 0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "max" (f32.const 0x1p+0) (f32.const -0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "max" (f32.const 0x1p+0) (f32.const 0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "max" (f32.const -0x1p+0) (f32.const -0x1.921fb6p+2)) (f32.const -0x1p+0)) -(assert_return (invoke "max" (f32.const -0x1p+0) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "max" (f32.const 0x1p+0) (f32.const -0x1.921fb6p+2)) (f32.const 0x1p+0)) -(assert_return (invoke "max" (f32.const 0x1p+0) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "max" (f32.const -0x1p+0) (f32.const -0x1.fffffep+127)) (f32.const -0x1p+0)) -(assert_return (invoke "max" (f32.const -0x1p+0) (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "max" (f32.const 0x1p+0) (f32.const -0x1.fffffep+127)) (f32.const 0x1p+0)) -(assert_return (invoke "max" (f32.const 0x1p+0) (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "max" (f32.const -0x1p+0) (f32.const -inf)) (f32.const -0x1p+0)) -(assert_return (invoke "max" (f32.const -0x1p+0) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "max" (f32.const 0x1p+0) (f32.const -inf)) (f32.const 0x1p+0)) -(assert_return (invoke "max" (f32.const 0x1p+0) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "max" (f32.const -0x1p+0) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const -0x1p+0) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -0x1p+0) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const -0x1p+0) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const 0x1p+0) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const 0x1p+0) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const 0x1p+0) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const 0x1p+0) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -0x1.921fb6p+2) (f32.const -0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "max" (f32.const -0x1.921fb6p+2) (f32.const 0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "max" (f32.const 0x1.921fb6p+2) (f32.const -0x0p+0)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "max" (f32.const 0x1.921fb6p+2) (f32.const 0x0p+0)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "max" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-149)) (f32.const -0x1p-149)) -(assert_return (invoke "max" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-149)) (f32.const 0x1p-149)) -(assert_return (invoke "max" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-149)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "max" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-149)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "max" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-126)) (f32.const -0x1p-126)) -(assert_return (invoke "max" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-126)) (f32.const 0x1p-126)) -(assert_return (invoke "max" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-126)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "max" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-126)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "max" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "max" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "max" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-1)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "max" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-1)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "max" (f32.const -0x1.921fb6p+2) (f32.const -0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "max" (f32.const -0x1.921fb6p+2) (f32.const 0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "max" (f32.const 0x1.921fb6p+2) (f32.const -0x1p+0)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "max" (f32.const 0x1.921fb6p+2) (f32.const 0x1p+0)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "max" (f32.const -0x1.921fb6p+2) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "max" (f32.const -0x1.921fb6p+2) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "max" (f32.const 0x1.921fb6p+2) (f32.const -0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "max" (f32.const 0x1.921fb6p+2) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "max" (f32.const -0x1.921fb6p+2) (f32.const -0x1.fffffep+127)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "max" (f32.const -0x1.921fb6p+2) (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "max" (f32.const 0x1.921fb6p+2) (f32.const -0x1.fffffep+127)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "max" (f32.const 0x1.921fb6p+2) (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "max" (f32.const -0x1.921fb6p+2) (f32.const -inf)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "max" (f32.const -0x1.921fb6p+2) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "max" (f32.const 0x1.921fb6p+2) (f32.const -inf)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "max" (f32.const 0x1.921fb6p+2) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "max" (f32.const -0x1.921fb6p+2) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const -0x1.921fb6p+2) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -0x1.921fb6p+2) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const -0x1.921fb6p+2) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const 0x1.921fb6p+2) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const 0x1.921fb6p+2) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const 0x1.921fb6p+2) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const 0x1.921fb6p+2) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -0x1.fffffep+127) (f32.const -0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "max" (f32.const -0x1.fffffep+127) (f32.const 0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "max" (f32.const 0x1.fffffep+127) (f32.const -0x0p+0)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "max" (f32.const 0x1.fffffep+127) (f32.const 0x0p+0)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "max" (f32.const -0x1.fffffep+127) (f32.const -0x1p-149)) (f32.const -0x1p-149)) -(assert_return (invoke "max" (f32.const -0x1.fffffep+127) (f32.const 0x1p-149)) (f32.const 0x1p-149)) -(assert_return (invoke "max" (f32.const 0x1.fffffep+127) (f32.const -0x1p-149)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "max" (f32.const 0x1.fffffep+127) (f32.const 0x1p-149)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "max" (f32.const -0x1.fffffep+127) (f32.const -0x1p-126)) (f32.const -0x1p-126)) -(assert_return (invoke "max" (f32.const -0x1.fffffep+127) (f32.const 0x1p-126)) (f32.const 0x1p-126)) -(assert_return (invoke "max" (f32.const 0x1.fffffep+127) (f32.const -0x1p-126)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "max" (f32.const 0x1.fffffep+127) (f32.const 0x1p-126)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "max" (f32.const -0x1.fffffep+127) (f32.const -0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "max" (f32.const -0x1.fffffep+127) (f32.const 0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "max" (f32.const 0x1.fffffep+127) (f32.const -0x1p-1)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "max" (f32.const 0x1.fffffep+127) (f32.const 0x1p-1)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "max" (f32.const -0x1.fffffep+127) (f32.const -0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "max" (f32.const -0x1.fffffep+127) (f32.const 0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "max" (f32.const 0x1.fffffep+127) (f32.const -0x1p+0)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "max" (f32.const 0x1.fffffep+127) (f32.const 0x1p+0)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "max" (f32.const -0x1.fffffep+127) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "max" (f32.const -0x1.fffffep+127) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "max" (f32.const 0x1.fffffep+127) (f32.const -0x1.921fb6p+2)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "max" (f32.const 0x1.fffffep+127) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "max" (f32.const -0x1.fffffep+127) (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "max" (f32.const -0x1.fffffep+127) (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "max" (f32.const 0x1.fffffep+127) (f32.const -0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "max" (f32.const 0x1.fffffep+127) (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "max" (f32.const -0x1.fffffep+127) (f32.const -inf)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "max" (f32.const -0x1.fffffep+127) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "max" (f32.const 0x1.fffffep+127) (f32.const -inf)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "max" (f32.const 0x1.fffffep+127) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "max" (f32.const -0x1.fffffep+127) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const -0x1.fffffep+127) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -0x1.fffffep+127) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const -0x1.fffffep+127) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const 0x1.fffffep+127) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const 0x1.fffffep+127) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const 0x1.fffffep+127) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const 0x1.fffffep+127) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -inf) (f32.const -0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "max" (f32.const -inf) (f32.const 0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "max" (f32.const inf) (f32.const -0x0p+0)) (f32.const inf)) -(assert_return (invoke "max" (f32.const inf) (f32.const 0x0p+0)) (f32.const inf)) -(assert_return (invoke "max" (f32.const -inf) (f32.const -0x1p-149)) (f32.const -0x1p-149)) -(assert_return (invoke "max" (f32.const -inf) (f32.const 0x1p-149)) (f32.const 0x1p-149)) -(assert_return (invoke "max" (f32.const inf) (f32.const -0x1p-149)) (f32.const inf)) -(assert_return (invoke "max" (f32.const inf) (f32.const 0x1p-149)) (f32.const inf)) -(assert_return (invoke "max" (f32.const -inf) (f32.const -0x1p-126)) (f32.const -0x1p-126)) -(assert_return (invoke "max" (f32.const -inf) (f32.const 0x1p-126)) (f32.const 0x1p-126)) -(assert_return (invoke "max" (f32.const inf) (f32.const -0x1p-126)) (f32.const inf)) -(assert_return (invoke "max" (f32.const inf) (f32.const 0x1p-126)) (f32.const inf)) -(assert_return (invoke "max" (f32.const -inf) (f32.const -0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "max" (f32.const -inf) (f32.const 0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "max" (f32.const inf) (f32.const -0x1p-1)) (f32.const inf)) -(assert_return (invoke "max" (f32.const inf) (f32.const 0x1p-1)) (f32.const inf)) -(assert_return (invoke "max" (f32.const -inf) (f32.const -0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "max" (f32.const -inf) (f32.const 0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "max" (f32.const inf) (f32.const -0x1p+0)) (f32.const inf)) -(assert_return (invoke "max" (f32.const inf) (f32.const 0x1p+0)) (f32.const inf)) -(assert_return (invoke "max" (f32.const -inf) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "max" (f32.const -inf) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "max" (f32.const inf) (f32.const -0x1.921fb6p+2)) (f32.const inf)) -(assert_return (invoke "max" (f32.const inf) (f32.const 0x1.921fb6p+2)) (f32.const inf)) -(assert_return (invoke "max" (f32.const -inf) (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "max" (f32.const -inf) (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "max" (f32.const inf) (f32.const -0x1.fffffep+127)) (f32.const inf)) -(assert_return (invoke "max" (f32.const inf) (f32.const 0x1.fffffep+127)) (f32.const inf)) -(assert_return (invoke "max" (f32.const -inf) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "max" (f32.const -inf) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "max" (f32.const inf) (f32.const -inf)) (f32.const inf)) -(assert_return (invoke "max" (f32.const inf) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "max" (f32.const -inf) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const -inf) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -inf) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const -inf) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const inf) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const inf) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const inf) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const inf) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -nan) (f32.const -0x0p+0)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const -nan:0x200000) (f32.const -0x0p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -nan) (f32.const 0x0p+0)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const -nan:0x200000) (f32.const 0x0p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const nan) (f32.const -0x0p+0)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const nan:0x200000) (f32.const -0x0p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const nan) (f32.const 0x0p+0)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const nan:0x200000) (f32.const 0x0p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -nan) (f32.const -0x1p-149)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const -nan:0x200000) (f32.const -0x1p-149)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -nan) (f32.const 0x1p-149)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const -nan:0x200000) (f32.const 0x1p-149)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const nan) (f32.const -0x1p-149)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const nan:0x200000) (f32.const -0x1p-149)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const nan) (f32.const 0x1p-149)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const nan:0x200000) (f32.const 0x1p-149)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -nan) (f32.const -0x1p-126)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const -nan:0x200000) (f32.const -0x1p-126)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -nan) (f32.const 0x1p-126)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const -nan:0x200000) (f32.const 0x1p-126)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const nan) (f32.const -0x1p-126)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const nan:0x200000) (f32.const -0x1p-126)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const nan) (f32.const 0x1p-126)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const nan:0x200000) (f32.const 0x1p-126)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -nan) (f32.const -0x1p-1)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const -nan:0x200000) (f32.const -0x1p-1)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -nan) (f32.const 0x1p-1)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const -nan:0x200000) (f32.const 0x1p-1)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const nan) (f32.const -0x1p-1)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const nan:0x200000) (f32.const -0x1p-1)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const nan) (f32.const 0x1p-1)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const nan:0x200000) (f32.const 0x1p-1)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -nan) (f32.const -0x1p+0)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const -nan:0x200000) (f32.const -0x1p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -nan) (f32.const 0x1p+0)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const -nan:0x200000) (f32.const 0x1p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const nan) (f32.const -0x1p+0)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const nan:0x200000) (f32.const -0x1p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const nan) (f32.const 0x1p+0)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const nan:0x200000) (f32.const 0x1p+0)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -nan) (f32.const -0x1.921fb6p+2)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const -nan:0x200000) (f32.const -0x1.921fb6p+2)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -nan) (f32.const 0x1.921fb6p+2)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const -nan:0x200000) (f32.const 0x1.921fb6p+2)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const nan) (f32.const -0x1.921fb6p+2)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const nan:0x200000) (f32.const -0x1.921fb6p+2)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const nan) (f32.const 0x1.921fb6p+2)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const nan:0x200000) (f32.const 0x1.921fb6p+2)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -nan) (f32.const -0x1.fffffep+127)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const -nan:0x200000) (f32.const -0x1.fffffep+127)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -nan) (f32.const 0x1.fffffep+127)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const -nan:0x200000) (f32.const 0x1.fffffep+127)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const nan) (f32.const -0x1.fffffep+127)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const nan:0x200000) (f32.const -0x1.fffffep+127)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const nan) (f32.const 0x1.fffffep+127)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const nan:0x200000) (f32.const 0x1.fffffep+127)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -nan) (f32.const -inf)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const -nan:0x200000) (f32.const -inf)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -nan) (f32.const inf)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const -nan:0x200000) (f32.const inf)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const nan) (f32.const -inf)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const nan:0x200000) (f32.const -inf)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const nan) (f32.const inf)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const nan:0x200000) (f32.const inf)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -nan) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const -nan:0x200000) (f32.const -nan)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -nan) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -nan:0x200000) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -nan) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const -nan:0x200000) (f32.const nan)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -nan) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const -nan:0x200000) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const nan) (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const nan:0x200000) (f32.const -nan)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const nan) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const nan:0x200000) (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const nan) (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "max" (f32.const nan:0x200000) (f32.const nan)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const nan) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "max" (f32.const nan:0x200000) (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sqrt" (f32.const -0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "sqrt" (f32.const 0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "sqrt" (f32.const -0x1p-149)) (f32.const nan:canonical)) -(assert_return (invoke "sqrt" (f32.const 0x1p-149)) (f32.const 0x1.6a09e6p-75)) -(assert_return (invoke "sqrt" (f32.const -0x1p-126)) (f32.const nan:canonical)) -(assert_return (invoke "sqrt" (f32.const 0x1p-126)) (f32.const 0x1p-63)) -(assert_return (invoke "sqrt" (f32.const -0x1p-1)) (f32.const nan:canonical)) -(assert_return (invoke "sqrt" (f32.const 0x1p-1)) (f32.const 0x1.6a09e6p-1)) -(assert_return (invoke "sqrt" (f32.const -0x1p+0)) (f32.const nan:canonical)) -(assert_return (invoke "sqrt" (f32.const 0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "sqrt" (f32.const -0x1.921fb6p+2)) (f32.const nan:canonical)) -(assert_return (invoke "sqrt" (f32.const 0x1.921fb6p+2)) (f32.const 0x1.40d932p+1)) -(assert_return (invoke "sqrt" (f32.const -0x1.fffffep+127)) (f32.const nan:canonical)) -(assert_return (invoke "sqrt" (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+63)) -(assert_return (invoke "sqrt" (f32.const -inf)) (f32.const nan:canonical)) -(assert_return (invoke "sqrt" (f32.const inf)) (f32.const inf)) -(assert_return (invoke "sqrt" (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "sqrt" (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "sqrt" (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "sqrt" (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "floor" (f32.const -0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "floor" (f32.const 0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "floor" (f32.const -0x1p-149)) (f32.const -0x1p+0)) -(assert_return (invoke "floor" (f32.const 0x1p-149)) (f32.const 0x0p+0)) -(assert_return (invoke "floor" (f32.const -0x1p-126)) (f32.const -0x1p+0)) -(assert_return (invoke "floor" (f32.const 0x1p-126)) (f32.const 0x0p+0)) -(assert_return (invoke "floor" (f32.const -0x1p-1)) (f32.const -0x1p+0)) -(assert_return (invoke "floor" (f32.const 0x1p-1)) (f32.const 0x0p+0)) -(assert_return (invoke "floor" (f32.const -0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "floor" (f32.const 0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "floor" (f32.const -0x1.921fb6p+2)) (f32.const -0x1.cp+2)) -(assert_return (invoke "floor" (f32.const 0x1.921fb6p+2)) (f32.const 0x1.8p+2)) -(assert_return (invoke "floor" (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "floor" (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "floor" (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "floor" (f32.const inf)) (f32.const inf)) -(assert_return (invoke "floor" (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "floor" (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "floor" (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "floor" (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "ceil" (f32.const -0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "ceil" (f32.const 0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "ceil" (f32.const -0x1p-149)) (f32.const -0x0p+0)) -(assert_return (invoke "ceil" (f32.const 0x1p-149)) (f32.const 0x1p+0)) -(assert_return (invoke "ceil" (f32.const -0x1p-126)) (f32.const -0x0p+0)) -(assert_return (invoke "ceil" (f32.const 0x1p-126)) (f32.const 0x1p+0)) -(assert_return (invoke "ceil" (f32.const -0x1p-1)) (f32.const -0x0p+0)) -(assert_return (invoke "ceil" (f32.const 0x1p-1)) (f32.const 0x1p+0)) -(assert_return (invoke "ceil" (f32.const -0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "ceil" (f32.const 0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "ceil" (f32.const -0x1.921fb6p+2)) (f32.const -0x1.8p+2)) -(assert_return (invoke "ceil" (f32.const 0x1.921fb6p+2)) (f32.const 0x1.cp+2)) -(assert_return (invoke "ceil" (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "ceil" (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "ceil" (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "ceil" (f32.const inf)) (f32.const inf)) -(assert_return (invoke "ceil" (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "ceil" (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "ceil" (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "ceil" (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "trunc" (f32.const -0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "trunc" (f32.const 0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "trunc" (f32.const -0x1p-149)) (f32.const -0x0p+0)) -(assert_return (invoke "trunc" (f32.const 0x1p-149)) (f32.const 0x0p+0)) -(assert_return (invoke "trunc" (f32.const -0x1p-126)) (f32.const -0x0p+0)) -(assert_return (invoke "trunc" (f32.const 0x1p-126)) (f32.const 0x0p+0)) -(assert_return (invoke "trunc" (f32.const -0x1p-1)) (f32.const -0x0p+0)) -(assert_return (invoke "trunc" (f32.const 0x1p-1)) (f32.const 0x0p+0)) -(assert_return (invoke "trunc" (f32.const -0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "trunc" (f32.const 0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "trunc" (f32.const -0x1.921fb6p+2)) (f32.const -0x1.8p+2)) -(assert_return (invoke "trunc" (f32.const 0x1.921fb6p+2)) (f32.const 0x1.8p+2)) -(assert_return (invoke "trunc" (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "trunc" (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "trunc" (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "trunc" (f32.const inf)) (f32.const inf)) -(assert_return (invoke "trunc" (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "trunc" (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "trunc" (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "trunc" (f32.const nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "nearest" (f32.const -0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "nearest" (f32.const 0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "nearest" (f32.const -0x1p-149)) (f32.const -0x0p+0)) -(assert_return (invoke "nearest" (f32.const 0x1p-149)) (f32.const 0x0p+0)) -(assert_return (invoke "nearest" (f32.const -0x1p-126)) (f32.const -0x0p+0)) -(assert_return (invoke "nearest" (f32.const 0x1p-126)) (f32.const 0x0p+0)) -(assert_return (invoke "nearest" (f32.const -0x1p-1)) (f32.const -0x0p+0)) -(assert_return (invoke "nearest" (f32.const 0x1p-1)) (f32.const 0x0p+0)) -(assert_return (invoke "nearest" (f32.const -0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "nearest" (f32.const 0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "nearest" (f32.const -0x1.921fb6p+2)) (f32.const -0x1.8p+2)) -(assert_return (invoke "nearest" (f32.const 0x1.921fb6p+2)) (f32.const 0x1.8p+2)) -(assert_return (invoke "nearest" (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "nearest" (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "nearest" (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "nearest" (f32.const inf)) (f32.const inf)) -(assert_return (invoke "nearest" (f32.const -nan)) (f32.const nan:canonical)) -(assert_return (invoke "nearest" (f32.const -nan:0x200000)) (f32.const nan:arithmetic)) -(assert_return (invoke "nearest" (f32.const nan)) (f32.const nan:canonical)) -(assert_return (invoke "nearest" (f32.const nan:0x200000)) (f32.const nan:arithmetic)) diff --git a/tests/misc_testsuite/winch/f32_bitwise.wast b/tests/misc_testsuite/winch/f32_bitwise.wast deleted file mode 100644 index d63c62c96261..000000000000 --- a/tests/misc_testsuite/winch/f32_bitwise.wast +++ /dev/null @@ -1,375 +0,0 @@ -;; Test all the f32 bitwise operators on major boundary values and all special -;; values. - -(module - (func (export "abs") (param $x f32) (result f32) (f32.abs (local.get $x))) - (func (export "neg") (param $x f32) (result f32) (f32.neg (local.get $x))) - (func (export "copysign") (param $x f32) (param $y f32) (result f32) (f32.copysign (local.get $x) (local.get $y))) -) - -(assert_return (invoke "copysign" (f32.const -0x0p+0) (f32.const -0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "copysign" (f32.const -0x0p+0) (f32.const 0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "copysign" (f32.const 0x0p+0) (f32.const -0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "copysign" (f32.const 0x0p+0) (f32.const 0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "copysign" (f32.const -0x0p+0) (f32.const -0x1p-149)) (f32.const -0x0p+0)) -(assert_return (invoke "copysign" (f32.const -0x0p+0) (f32.const 0x1p-149)) (f32.const 0x0p+0)) -(assert_return (invoke "copysign" (f32.const 0x0p+0) (f32.const -0x1p-149)) (f32.const -0x0p+0)) -(assert_return (invoke "copysign" (f32.const 0x0p+0) (f32.const 0x1p-149)) (f32.const 0x0p+0)) -(assert_return (invoke "copysign" (f32.const -0x0p+0) (f32.const -0x1p-126)) (f32.const -0x0p+0)) -(assert_return (invoke "copysign" (f32.const -0x0p+0) (f32.const 0x1p-126)) (f32.const 0x0p+0)) -(assert_return (invoke "copysign" (f32.const 0x0p+0) (f32.const -0x1p-126)) (f32.const -0x0p+0)) -(assert_return (invoke "copysign" (f32.const 0x0p+0) (f32.const 0x1p-126)) (f32.const 0x0p+0)) -(assert_return (invoke "copysign" (f32.const -0x0p+0) (f32.const -0x1p-1)) (f32.const -0x0p+0)) -(assert_return (invoke "copysign" (f32.const -0x0p+0) (f32.const 0x1p-1)) (f32.const 0x0p+0)) -(assert_return (invoke "copysign" (f32.const 0x0p+0) (f32.const -0x1p-1)) (f32.const -0x0p+0)) -(assert_return (invoke "copysign" (f32.const 0x0p+0) (f32.const 0x1p-1)) (f32.const 0x0p+0)) -(assert_return (invoke "copysign" (f32.const -0x0p+0) (f32.const -0x1p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "copysign" (f32.const -0x0p+0) (f32.const 0x1p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "copysign" (f32.const 0x0p+0) (f32.const -0x1p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "copysign" (f32.const 0x0p+0) (f32.const 0x1p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "copysign" (f32.const -0x0p+0) (f32.const -0x1.921fb6p+2)) (f32.const -0x0p+0)) -(assert_return (invoke "copysign" (f32.const -0x0p+0) (f32.const 0x1.921fb6p+2)) (f32.const 0x0p+0)) -(assert_return (invoke "copysign" (f32.const 0x0p+0) (f32.const -0x1.921fb6p+2)) (f32.const -0x0p+0)) -(assert_return (invoke "copysign" (f32.const 0x0p+0) (f32.const 0x1.921fb6p+2)) (f32.const 0x0p+0)) -(assert_return (invoke "copysign" (f32.const -0x0p+0) (f32.const -0x1.fffffep+127)) (f32.const -0x0p+0)) -(assert_return (invoke "copysign" (f32.const -0x0p+0) (f32.const 0x1.fffffep+127)) (f32.const 0x0p+0)) -(assert_return (invoke "copysign" (f32.const 0x0p+0) (f32.const -0x1.fffffep+127)) (f32.const -0x0p+0)) -(assert_return (invoke "copysign" (f32.const 0x0p+0) (f32.const 0x1.fffffep+127)) (f32.const 0x0p+0)) -(assert_return (invoke "copysign" (f32.const -0x0p+0) (f32.const -inf)) (f32.const -0x0p+0)) -(assert_return (invoke "copysign" (f32.const -0x0p+0) (f32.const inf)) (f32.const 0x0p+0)) -(assert_return (invoke "copysign" (f32.const 0x0p+0) (f32.const -inf)) (f32.const -0x0p+0)) -(assert_return (invoke "copysign" (f32.const 0x0p+0) (f32.const inf)) (f32.const 0x0p+0)) -(assert_return (invoke "copysign" (f32.const -0x0p+0) (f32.const -nan)) (f32.const -0x0p+0)) -(assert_return (invoke "copysign" (f32.const -0x0p+0) (f32.const nan)) (f32.const 0x0p+0)) -(assert_return (invoke "copysign" (f32.const 0x0p+0) (f32.const -nan)) (f32.const -0x0p+0)) -(assert_return (invoke "copysign" (f32.const 0x0p+0) (f32.const nan)) (f32.const 0x0p+0)) -(assert_return (invoke "copysign" (f32.const -0x1p-149) (f32.const -0x0p+0)) (f32.const -0x1p-149)) -(assert_return (invoke "copysign" (f32.const -0x1p-149) (f32.const 0x0p+0)) (f32.const 0x1p-149)) -(assert_return (invoke "copysign" (f32.const 0x1p-149) (f32.const -0x0p+0)) (f32.const -0x1p-149)) -(assert_return (invoke "copysign" (f32.const 0x1p-149) (f32.const 0x0p+0)) (f32.const 0x1p-149)) -(assert_return (invoke "copysign" (f32.const -0x1p-149) (f32.const -0x1p-149)) (f32.const -0x1p-149)) -(assert_return (invoke "copysign" (f32.const -0x1p-149) (f32.const 0x1p-149)) (f32.const 0x1p-149)) -(assert_return (invoke "copysign" (f32.const 0x1p-149) (f32.const -0x1p-149)) (f32.const -0x1p-149)) -(assert_return (invoke "copysign" (f32.const 0x1p-149) (f32.const 0x1p-149)) (f32.const 0x1p-149)) -(assert_return (invoke "copysign" (f32.const -0x1p-149) (f32.const -0x1p-126)) (f32.const -0x1p-149)) -(assert_return (invoke "copysign" (f32.const -0x1p-149) (f32.const 0x1p-126)) (f32.const 0x1p-149)) -(assert_return (invoke "copysign" (f32.const 0x1p-149) (f32.const -0x1p-126)) (f32.const -0x1p-149)) -(assert_return (invoke "copysign" (f32.const 0x1p-149) (f32.const 0x1p-126)) (f32.const 0x1p-149)) -(assert_return (invoke "copysign" (f32.const -0x1p-149) (f32.const -0x1p-1)) (f32.const -0x1p-149)) -(assert_return (invoke "copysign" (f32.const -0x1p-149) (f32.const 0x1p-1)) (f32.const 0x1p-149)) -(assert_return (invoke "copysign" (f32.const 0x1p-149) (f32.const -0x1p-1)) (f32.const -0x1p-149)) -(assert_return (invoke "copysign" (f32.const 0x1p-149) (f32.const 0x1p-1)) (f32.const 0x1p-149)) -(assert_return (invoke "copysign" (f32.const -0x1p-149) (f32.const -0x1p+0)) (f32.const -0x1p-149)) -(assert_return (invoke "copysign" (f32.const -0x1p-149) (f32.const 0x1p+0)) (f32.const 0x1p-149)) -(assert_return (invoke "copysign" (f32.const 0x1p-149) (f32.const -0x1p+0)) (f32.const -0x1p-149)) -(assert_return (invoke "copysign" (f32.const 0x1p-149) (f32.const 0x1p+0)) (f32.const 0x1p-149)) -(assert_return (invoke "copysign" (f32.const -0x1p-149) (f32.const -0x1.921fb6p+2)) (f32.const -0x1p-149)) -(assert_return (invoke "copysign" (f32.const -0x1p-149) (f32.const 0x1.921fb6p+2)) (f32.const 0x1p-149)) -(assert_return (invoke "copysign" (f32.const 0x1p-149) (f32.const -0x1.921fb6p+2)) (f32.const -0x1p-149)) -(assert_return (invoke "copysign" (f32.const 0x1p-149) (f32.const 0x1.921fb6p+2)) (f32.const 0x1p-149)) -(assert_return (invoke "copysign" (f32.const -0x1p-149) (f32.const -0x1.fffffep+127)) (f32.const -0x1p-149)) -(assert_return (invoke "copysign" (f32.const -0x1p-149) (f32.const 0x1.fffffep+127)) (f32.const 0x1p-149)) -(assert_return (invoke "copysign" (f32.const 0x1p-149) (f32.const -0x1.fffffep+127)) (f32.const -0x1p-149)) -(assert_return (invoke "copysign" (f32.const 0x1p-149) (f32.const 0x1.fffffep+127)) (f32.const 0x1p-149)) -(assert_return (invoke "copysign" (f32.const -0x1p-149) (f32.const -inf)) (f32.const -0x1p-149)) -(assert_return (invoke "copysign" (f32.const -0x1p-149) (f32.const inf)) (f32.const 0x1p-149)) -(assert_return (invoke "copysign" (f32.const 0x1p-149) (f32.const -inf)) (f32.const -0x1p-149)) -(assert_return (invoke "copysign" (f32.const 0x1p-149) (f32.const inf)) (f32.const 0x1p-149)) -(assert_return (invoke "copysign" (f32.const -0x1p-149) (f32.const -nan)) (f32.const -0x1p-149)) -(assert_return (invoke "copysign" (f32.const -0x1p-149) (f32.const nan)) (f32.const 0x1p-149)) -(assert_return (invoke "copysign" (f32.const 0x1p-149) (f32.const -nan)) (f32.const -0x1p-149)) -(assert_return (invoke "copysign" (f32.const 0x1p-149) (f32.const nan)) (f32.const 0x1p-149)) -(assert_return (invoke "copysign" (f32.const -0x1p-126) (f32.const -0x0p+0)) (f32.const -0x1p-126)) -(assert_return (invoke "copysign" (f32.const -0x1p-126) (f32.const 0x0p+0)) (f32.const 0x1p-126)) -(assert_return (invoke "copysign" (f32.const 0x1p-126) (f32.const -0x0p+0)) (f32.const -0x1p-126)) -(assert_return (invoke "copysign" (f32.const 0x1p-126) (f32.const 0x0p+0)) (f32.const 0x1p-126)) -(assert_return (invoke "copysign" (f32.const -0x1p-126) (f32.const -0x1p-149)) (f32.const -0x1p-126)) -(assert_return (invoke "copysign" (f32.const -0x1p-126) (f32.const 0x1p-149)) (f32.const 0x1p-126)) -(assert_return (invoke "copysign" (f32.const 0x1p-126) (f32.const -0x1p-149)) (f32.const -0x1p-126)) -(assert_return (invoke "copysign" (f32.const 0x1p-126) (f32.const 0x1p-149)) (f32.const 0x1p-126)) -(assert_return (invoke "copysign" (f32.const -0x1p-126) (f32.const -0x1p-126)) (f32.const -0x1p-126)) -(assert_return (invoke "copysign" (f32.const -0x1p-126) (f32.const 0x1p-126)) (f32.const 0x1p-126)) -(assert_return (invoke "copysign" (f32.const 0x1p-126) (f32.const -0x1p-126)) (f32.const -0x1p-126)) -(assert_return (invoke "copysign" (f32.const 0x1p-126) (f32.const 0x1p-126)) (f32.const 0x1p-126)) -(assert_return (invoke "copysign" (f32.const -0x1p-126) (f32.const -0x1p-1)) (f32.const -0x1p-126)) -(assert_return (invoke "copysign" (f32.const -0x1p-126) (f32.const 0x1p-1)) (f32.const 0x1p-126)) -(assert_return (invoke "copysign" (f32.const 0x1p-126) (f32.const -0x1p-1)) (f32.const -0x1p-126)) -(assert_return (invoke "copysign" (f32.const 0x1p-126) (f32.const 0x1p-1)) (f32.const 0x1p-126)) -(assert_return (invoke "copysign" (f32.const -0x1p-126) (f32.const -0x1p+0)) (f32.const -0x1p-126)) -(assert_return (invoke "copysign" (f32.const -0x1p-126) (f32.const 0x1p+0)) (f32.const 0x1p-126)) -(assert_return (invoke "copysign" (f32.const 0x1p-126) (f32.const -0x1p+0)) (f32.const -0x1p-126)) -(assert_return (invoke "copysign" (f32.const 0x1p-126) (f32.const 0x1p+0)) (f32.const 0x1p-126)) -(assert_return (invoke "copysign" (f32.const -0x1p-126) (f32.const -0x1.921fb6p+2)) (f32.const -0x1p-126)) -(assert_return (invoke "copysign" (f32.const -0x1p-126) (f32.const 0x1.921fb6p+2)) (f32.const 0x1p-126)) -(assert_return (invoke "copysign" (f32.const 0x1p-126) (f32.const -0x1.921fb6p+2)) (f32.const -0x1p-126)) -(assert_return (invoke "copysign" (f32.const 0x1p-126) (f32.const 0x1.921fb6p+2)) (f32.const 0x1p-126)) -(assert_return (invoke "copysign" (f32.const -0x1p-126) (f32.const -0x1.fffffep+127)) (f32.const -0x1p-126)) -(assert_return (invoke "copysign" (f32.const -0x1p-126) (f32.const 0x1.fffffep+127)) (f32.const 0x1p-126)) -(assert_return (invoke "copysign" (f32.const 0x1p-126) (f32.const -0x1.fffffep+127)) (f32.const -0x1p-126)) -(assert_return (invoke "copysign" (f32.const 0x1p-126) (f32.const 0x1.fffffep+127)) (f32.const 0x1p-126)) -(assert_return (invoke "copysign" (f32.const -0x1p-126) (f32.const -inf)) (f32.const -0x1p-126)) -(assert_return (invoke "copysign" (f32.const -0x1p-126) (f32.const inf)) (f32.const 0x1p-126)) -(assert_return (invoke "copysign" (f32.const 0x1p-126) (f32.const -inf)) (f32.const -0x1p-126)) -(assert_return (invoke "copysign" (f32.const 0x1p-126) (f32.const inf)) (f32.const 0x1p-126)) -(assert_return (invoke "copysign" (f32.const -0x1p-126) (f32.const -nan)) (f32.const -0x1p-126)) -(assert_return (invoke "copysign" (f32.const -0x1p-126) (f32.const nan)) (f32.const 0x1p-126)) -(assert_return (invoke "copysign" (f32.const 0x1p-126) (f32.const -nan)) (f32.const -0x1p-126)) -(assert_return (invoke "copysign" (f32.const 0x1p-126) (f32.const nan)) (f32.const 0x1p-126)) -(assert_return (invoke "copysign" (f32.const -0x1p-1) (f32.const -0x0p+0)) (f32.const -0x1p-1)) -(assert_return (invoke "copysign" (f32.const -0x1p-1) (f32.const 0x0p+0)) (f32.const 0x1p-1)) -(assert_return (invoke "copysign" (f32.const 0x1p-1) (f32.const -0x0p+0)) (f32.const -0x1p-1)) -(assert_return (invoke "copysign" (f32.const 0x1p-1) (f32.const 0x0p+0)) (f32.const 0x1p-1)) -(assert_return (invoke "copysign" (f32.const -0x1p-1) (f32.const -0x1p-149)) (f32.const -0x1p-1)) -(assert_return (invoke "copysign" (f32.const -0x1p-1) (f32.const 0x1p-149)) (f32.const 0x1p-1)) -(assert_return (invoke "copysign" (f32.const 0x1p-1) (f32.const -0x1p-149)) (f32.const -0x1p-1)) -(assert_return (invoke "copysign" (f32.const 0x1p-1) (f32.const 0x1p-149)) (f32.const 0x1p-1)) -(assert_return (invoke "copysign" (f32.const -0x1p-1) (f32.const -0x1p-126)) (f32.const -0x1p-1)) -(assert_return (invoke "copysign" (f32.const -0x1p-1) (f32.const 0x1p-126)) (f32.const 0x1p-1)) -(assert_return (invoke "copysign" (f32.const 0x1p-1) (f32.const -0x1p-126)) (f32.const -0x1p-1)) -(assert_return (invoke "copysign" (f32.const 0x1p-1) (f32.const 0x1p-126)) (f32.const 0x1p-1)) -(assert_return (invoke "copysign" (f32.const -0x1p-1) (f32.const -0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "copysign" (f32.const -0x1p-1) (f32.const 0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "copysign" (f32.const 0x1p-1) (f32.const -0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "copysign" (f32.const 0x1p-1) (f32.const 0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "copysign" (f32.const -0x1p-1) (f32.const -0x1p+0)) (f32.const -0x1p-1)) -(assert_return (invoke "copysign" (f32.const -0x1p-1) (f32.const 0x1p+0)) (f32.const 0x1p-1)) -(assert_return (invoke "copysign" (f32.const 0x1p-1) (f32.const -0x1p+0)) (f32.const -0x1p-1)) -(assert_return (invoke "copysign" (f32.const 0x1p-1) (f32.const 0x1p+0)) (f32.const 0x1p-1)) -(assert_return (invoke "copysign" (f32.const -0x1p-1) (f32.const -0x1.921fb6p+2)) (f32.const -0x1p-1)) -(assert_return (invoke "copysign" (f32.const -0x1p-1) (f32.const 0x1.921fb6p+2)) (f32.const 0x1p-1)) -(assert_return (invoke "copysign" (f32.const 0x1p-1) (f32.const -0x1.921fb6p+2)) (f32.const -0x1p-1)) -(assert_return (invoke "copysign" (f32.const 0x1p-1) (f32.const 0x1.921fb6p+2)) (f32.const 0x1p-1)) -(assert_return (invoke "copysign" (f32.const -0x1p-1) (f32.const -0x1.fffffep+127)) (f32.const -0x1p-1)) -(assert_return (invoke "copysign" (f32.const -0x1p-1) (f32.const 0x1.fffffep+127)) (f32.const 0x1p-1)) -(assert_return (invoke "copysign" (f32.const 0x1p-1) (f32.const -0x1.fffffep+127)) (f32.const -0x1p-1)) -(assert_return (invoke "copysign" (f32.const 0x1p-1) (f32.const 0x1.fffffep+127)) (f32.const 0x1p-1)) -(assert_return (invoke "copysign" (f32.const -0x1p-1) (f32.const -inf)) (f32.const -0x1p-1)) -(assert_return (invoke "copysign" (f32.const -0x1p-1) (f32.const inf)) (f32.const 0x1p-1)) -(assert_return (invoke "copysign" (f32.const 0x1p-1) (f32.const -inf)) (f32.const -0x1p-1)) -(assert_return (invoke "copysign" (f32.const 0x1p-1) (f32.const inf)) (f32.const 0x1p-1)) -(assert_return (invoke "copysign" (f32.const -0x1p-1) (f32.const -nan)) (f32.const -0x1p-1)) -(assert_return (invoke "copysign" (f32.const -0x1p-1) (f32.const nan)) (f32.const 0x1p-1)) -(assert_return (invoke "copysign" (f32.const 0x1p-1) (f32.const -nan)) (f32.const -0x1p-1)) -(assert_return (invoke "copysign" (f32.const 0x1p-1) (f32.const nan)) (f32.const 0x1p-1)) -(assert_return (invoke "copysign" (f32.const -0x1p+0) (f32.const -0x0p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "copysign" (f32.const -0x1p+0) (f32.const 0x0p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "copysign" (f32.const 0x1p+0) (f32.const -0x0p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "copysign" (f32.const 0x1p+0) (f32.const 0x0p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "copysign" (f32.const -0x1p+0) (f32.const -0x1p-149)) (f32.const -0x1p+0)) -(assert_return (invoke "copysign" (f32.const -0x1p+0) (f32.const 0x1p-149)) (f32.const 0x1p+0)) -(assert_return (invoke "copysign" (f32.const 0x1p+0) (f32.const -0x1p-149)) (f32.const -0x1p+0)) -(assert_return (invoke "copysign" (f32.const 0x1p+0) (f32.const 0x1p-149)) (f32.const 0x1p+0)) -(assert_return (invoke "copysign" (f32.const -0x1p+0) (f32.const -0x1p-126)) (f32.const -0x1p+0)) -(assert_return (invoke "copysign" (f32.const -0x1p+0) (f32.const 0x1p-126)) (f32.const 0x1p+0)) -(assert_return (invoke "copysign" (f32.const 0x1p+0) (f32.const -0x1p-126)) (f32.const -0x1p+0)) -(assert_return (invoke "copysign" (f32.const 0x1p+0) (f32.const 0x1p-126)) (f32.const 0x1p+0)) -(assert_return (invoke "copysign" (f32.const -0x1p+0) (f32.const -0x1p-1)) (f32.const -0x1p+0)) -(assert_return (invoke "copysign" (f32.const -0x1p+0) (f32.const 0x1p-1)) (f32.const 0x1p+0)) -(assert_return (invoke "copysign" (f32.const 0x1p+0) (f32.const -0x1p-1)) (f32.const -0x1p+0)) -(assert_return (invoke "copysign" (f32.const 0x1p+0) (f32.const 0x1p-1)) (f32.const 0x1p+0)) -(assert_return (invoke "copysign" (f32.const -0x1p+0) (f32.const -0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "copysign" (f32.const -0x1p+0) (f32.const 0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "copysign" (f32.const 0x1p+0) (f32.const -0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "copysign" (f32.const 0x1p+0) (f32.const 0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "copysign" (f32.const -0x1p+0) (f32.const -0x1.921fb6p+2)) (f32.const -0x1p+0)) -(assert_return (invoke "copysign" (f32.const -0x1p+0) (f32.const 0x1.921fb6p+2)) (f32.const 0x1p+0)) -(assert_return (invoke "copysign" (f32.const 0x1p+0) (f32.const -0x1.921fb6p+2)) (f32.const -0x1p+0)) -(assert_return (invoke "copysign" (f32.const 0x1p+0) (f32.const 0x1.921fb6p+2)) (f32.const 0x1p+0)) -(assert_return (invoke "copysign" (f32.const -0x1p+0) (f32.const -0x1.fffffep+127)) (f32.const -0x1p+0)) -(assert_return (invoke "copysign" (f32.const -0x1p+0) (f32.const 0x1.fffffep+127)) (f32.const 0x1p+0)) -(assert_return (invoke "copysign" (f32.const 0x1p+0) (f32.const -0x1.fffffep+127)) (f32.const -0x1p+0)) -(assert_return (invoke "copysign" (f32.const 0x1p+0) (f32.const 0x1.fffffep+127)) (f32.const 0x1p+0)) -(assert_return (invoke "copysign" (f32.const -0x1p+0) (f32.const -inf)) (f32.const -0x1p+0)) -(assert_return (invoke "copysign" (f32.const -0x1p+0) (f32.const inf)) (f32.const 0x1p+0)) -(assert_return (invoke "copysign" (f32.const 0x1p+0) (f32.const -inf)) (f32.const -0x1p+0)) -(assert_return (invoke "copysign" (f32.const 0x1p+0) (f32.const inf)) (f32.const 0x1p+0)) -(assert_return (invoke "copysign" (f32.const -0x1p+0) (f32.const -nan)) (f32.const -0x1p+0)) -(assert_return (invoke "copysign" (f32.const -0x1p+0) (f32.const nan)) (f32.const 0x1p+0)) -(assert_return (invoke "copysign" (f32.const 0x1p+0) (f32.const -nan)) (f32.const -0x1p+0)) -(assert_return (invoke "copysign" (f32.const 0x1p+0) (f32.const nan)) (f32.const 0x1p+0)) -(assert_return (invoke "copysign" (f32.const -0x1.921fb6p+2) (f32.const -0x0p+0)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "copysign" (f32.const -0x1.921fb6p+2) (f32.const 0x0p+0)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "copysign" (f32.const 0x1.921fb6p+2) (f32.const -0x0p+0)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "copysign" (f32.const 0x1.921fb6p+2) (f32.const 0x0p+0)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "copysign" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-149)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "copysign" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-149)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "copysign" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-149)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "copysign" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-149)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "copysign" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-126)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "copysign" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-126)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "copysign" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-126)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "copysign" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-126)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "copysign" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-1)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "copysign" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-1)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "copysign" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-1)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "copysign" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-1)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "copysign" (f32.const -0x1.921fb6p+2) (f32.const -0x1p+0)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "copysign" (f32.const -0x1.921fb6p+2) (f32.const 0x1p+0)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "copysign" (f32.const 0x1.921fb6p+2) (f32.const -0x1p+0)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "copysign" (f32.const 0x1.921fb6p+2) (f32.const 0x1p+0)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "copysign" (f32.const -0x1.921fb6p+2) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "copysign" (f32.const -0x1.921fb6p+2) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "copysign" (f32.const 0x1.921fb6p+2) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "copysign" (f32.const 0x1.921fb6p+2) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "copysign" (f32.const -0x1.921fb6p+2) (f32.const -0x1.fffffep+127)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "copysign" (f32.const -0x1.921fb6p+2) (f32.const 0x1.fffffep+127)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "copysign" (f32.const 0x1.921fb6p+2) (f32.const -0x1.fffffep+127)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "copysign" (f32.const 0x1.921fb6p+2) (f32.const 0x1.fffffep+127)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "copysign" (f32.const -0x1.921fb6p+2) (f32.const -inf)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "copysign" (f32.const -0x1.921fb6p+2) (f32.const inf)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "copysign" (f32.const 0x1.921fb6p+2) (f32.const -inf)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "copysign" (f32.const 0x1.921fb6p+2) (f32.const inf)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "copysign" (f32.const -0x1.921fb6p+2) (f32.const -nan)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "copysign" (f32.const -0x1.921fb6p+2) (f32.const nan)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "copysign" (f32.const 0x1.921fb6p+2) (f32.const -nan)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "copysign" (f32.const 0x1.921fb6p+2) (f32.const nan)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "copysign" (f32.const -0x1.fffffep+127) (f32.const -0x0p+0)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "copysign" (f32.const -0x1.fffffep+127) (f32.const 0x0p+0)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "copysign" (f32.const 0x1.fffffep+127) (f32.const -0x0p+0)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "copysign" (f32.const 0x1.fffffep+127) (f32.const 0x0p+0)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "copysign" (f32.const -0x1.fffffep+127) (f32.const -0x1p-149)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "copysign" (f32.const -0x1.fffffep+127) (f32.const 0x1p-149)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "copysign" (f32.const 0x1.fffffep+127) (f32.const -0x1p-149)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "copysign" (f32.const 0x1.fffffep+127) (f32.const 0x1p-149)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "copysign" (f32.const -0x1.fffffep+127) (f32.const -0x1p-126)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "copysign" (f32.const -0x1.fffffep+127) (f32.const 0x1p-126)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "copysign" (f32.const 0x1.fffffep+127) (f32.const -0x1p-126)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "copysign" (f32.const 0x1.fffffep+127) (f32.const 0x1p-126)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "copysign" (f32.const -0x1.fffffep+127) (f32.const -0x1p-1)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "copysign" (f32.const -0x1.fffffep+127) (f32.const 0x1p-1)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "copysign" (f32.const 0x1.fffffep+127) (f32.const -0x1p-1)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "copysign" (f32.const 0x1.fffffep+127) (f32.const 0x1p-1)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "copysign" (f32.const -0x1.fffffep+127) (f32.const -0x1p+0)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "copysign" (f32.const -0x1.fffffep+127) (f32.const 0x1p+0)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "copysign" (f32.const 0x1.fffffep+127) (f32.const -0x1p+0)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "copysign" (f32.const 0x1.fffffep+127) (f32.const 0x1p+0)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "copysign" (f32.const -0x1.fffffep+127) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "copysign" (f32.const -0x1.fffffep+127) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "copysign" (f32.const 0x1.fffffep+127) (f32.const -0x1.921fb6p+2)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "copysign" (f32.const 0x1.fffffep+127) (f32.const 0x1.921fb6p+2)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "copysign" (f32.const -0x1.fffffep+127) (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "copysign" (f32.const -0x1.fffffep+127) (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "copysign" (f32.const 0x1.fffffep+127) (f32.const -0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "copysign" (f32.const 0x1.fffffep+127) (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "copysign" (f32.const -0x1.fffffep+127) (f32.const -inf)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "copysign" (f32.const -0x1.fffffep+127) (f32.const inf)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "copysign" (f32.const 0x1.fffffep+127) (f32.const -inf)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "copysign" (f32.const 0x1.fffffep+127) (f32.const inf)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "copysign" (f32.const -0x1.fffffep+127) (f32.const -nan)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "copysign" (f32.const -0x1.fffffep+127) (f32.const nan)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "copysign" (f32.const 0x1.fffffep+127) (f32.const -nan)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "copysign" (f32.const 0x1.fffffep+127) (f32.const nan)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "copysign" (f32.const -inf) (f32.const -0x0p+0)) (f32.const -inf)) -(assert_return (invoke "copysign" (f32.const -inf) (f32.const 0x0p+0)) (f32.const inf)) -(assert_return (invoke "copysign" (f32.const inf) (f32.const -0x0p+0)) (f32.const -inf)) -(assert_return (invoke "copysign" (f32.const inf) (f32.const 0x0p+0)) (f32.const inf)) -(assert_return (invoke "copysign" (f32.const -inf) (f32.const -0x1p-149)) (f32.const -inf)) -(assert_return (invoke "copysign" (f32.const -inf) (f32.const 0x1p-149)) (f32.const inf)) -(assert_return (invoke "copysign" (f32.const inf) (f32.const -0x1p-149)) (f32.const -inf)) -(assert_return (invoke "copysign" (f32.const inf) (f32.const 0x1p-149)) (f32.const inf)) -(assert_return (invoke "copysign" (f32.const -inf) (f32.const -0x1p-126)) (f32.const -inf)) -(assert_return (invoke "copysign" (f32.const -inf) (f32.const 0x1p-126)) (f32.const inf)) -(assert_return (invoke "copysign" (f32.const inf) (f32.const -0x1p-126)) (f32.const -inf)) -(assert_return (invoke "copysign" (f32.const inf) (f32.const 0x1p-126)) (f32.const inf)) -(assert_return (invoke "copysign" (f32.const -inf) (f32.const -0x1p-1)) (f32.const -inf)) -(assert_return (invoke "copysign" (f32.const -inf) (f32.const 0x1p-1)) (f32.const inf)) -(assert_return (invoke "copysign" (f32.const inf) (f32.const -0x1p-1)) (f32.const -inf)) -(assert_return (invoke "copysign" (f32.const inf) (f32.const 0x1p-1)) (f32.const inf)) -(assert_return (invoke "copysign" (f32.const -inf) (f32.const -0x1p+0)) (f32.const -inf)) -(assert_return (invoke "copysign" (f32.const -inf) (f32.const 0x1p+0)) (f32.const inf)) -(assert_return (invoke "copysign" (f32.const inf) (f32.const -0x1p+0)) (f32.const -inf)) -(assert_return (invoke "copysign" (f32.const inf) (f32.const 0x1p+0)) (f32.const inf)) -(assert_return (invoke "copysign" (f32.const -inf) (f32.const -0x1.921fb6p+2)) (f32.const -inf)) -(assert_return (invoke "copysign" (f32.const -inf) (f32.const 0x1.921fb6p+2)) (f32.const inf)) -(assert_return (invoke "copysign" (f32.const inf) (f32.const -0x1.921fb6p+2)) (f32.const -inf)) -(assert_return (invoke "copysign" (f32.const inf) (f32.const 0x1.921fb6p+2)) (f32.const inf)) -(assert_return (invoke "copysign" (f32.const -inf) (f32.const -0x1.fffffep+127)) (f32.const -inf)) -(assert_return (invoke "copysign" (f32.const -inf) (f32.const 0x1.fffffep+127)) (f32.const inf)) -(assert_return (invoke "copysign" (f32.const inf) (f32.const -0x1.fffffep+127)) (f32.const -inf)) -(assert_return (invoke "copysign" (f32.const inf) (f32.const 0x1.fffffep+127)) (f32.const inf)) -(assert_return (invoke "copysign" (f32.const -inf) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "copysign" (f32.const -inf) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "copysign" (f32.const inf) (f32.const -inf)) (f32.const -inf)) -(assert_return (invoke "copysign" (f32.const inf) (f32.const inf)) (f32.const inf)) -(assert_return (invoke "copysign" (f32.const -inf) (f32.const -nan)) (f32.const -inf)) -(assert_return (invoke "copysign" (f32.const -inf) (f32.const nan)) (f32.const inf)) -(assert_return (invoke "copysign" (f32.const inf) (f32.const -nan)) (f32.const -inf)) -(assert_return (invoke "copysign" (f32.const inf) (f32.const nan)) (f32.const inf)) -(assert_return (invoke "copysign" (f32.const -nan) (f32.const -0x0p+0)) (f32.const -nan)) -(assert_return (invoke "copysign" (f32.const -nan) (f32.const 0x0p+0)) (f32.const nan)) -(assert_return (invoke "copysign" (f32.const nan) (f32.const -0x0p+0)) (f32.const -nan)) -(assert_return (invoke "copysign" (f32.const nan) (f32.const 0x0p+0)) (f32.const nan)) -(assert_return (invoke "copysign" (f32.const -nan) (f32.const -0x1p-149)) (f32.const -nan)) -(assert_return (invoke "copysign" (f32.const -nan) (f32.const 0x1p-149)) (f32.const nan)) -(assert_return (invoke "copysign" (f32.const nan) (f32.const -0x1p-149)) (f32.const -nan)) -(assert_return (invoke "copysign" (f32.const nan) (f32.const 0x1p-149)) (f32.const nan)) -(assert_return (invoke "copysign" (f32.const -nan) (f32.const -0x1p-126)) (f32.const -nan)) -(assert_return (invoke "copysign" (f32.const -nan) (f32.const 0x1p-126)) (f32.const nan)) -(assert_return (invoke "copysign" (f32.const nan) (f32.const -0x1p-126)) (f32.const -nan)) -(assert_return (invoke "copysign" (f32.const nan) (f32.const 0x1p-126)) (f32.const nan)) -(assert_return (invoke "copysign" (f32.const -nan) (f32.const -0x1p-1)) (f32.const -nan)) -(assert_return (invoke "copysign" (f32.const -nan) (f32.const 0x1p-1)) (f32.const nan)) -(assert_return (invoke "copysign" (f32.const nan) (f32.const -0x1p-1)) (f32.const -nan)) -(assert_return (invoke "copysign" (f32.const nan) (f32.const 0x1p-1)) (f32.const nan)) -(assert_return (invoke "copysign" (f32.const -nan) (f32.const -0x1p+0)) (f32.const -nan)) -(assert_return (invoke "copysign" (f32.const -nan) (f32.const 0x1p+0)) (f32.const nan)) -(assert_return (invoke "copysign" (f32.const nan) (f32.const -0x1p+0)) (f32.const -nan)) -(assert_return (invoke "copysign" (f32.const nan) (f32.const 0x1p+0)) (f32.const nan)) -(assert_return (invoke "copysign" (f32.const -nan) (f32.const -0x1.921fb6p+2)) (f32.const -nan)) -(assert_return (invoke "copysign" (f32.const -nan) (f32.const 0x1.921fb6p+2)) (f32.const nan)) -(assert_return (invoke "copysign" (f32.const nan) (f32.const -0x1.921fb6p+2)) (f32.const -nan)) -(assert_return (invoke "copysign" (f32.const nan) (f32.const 0x1.921fb6p+2)) (f32.const nan)) -(assert_return (invoke "copysign" (f32.const -nan) (f32.const -0x1.fffffep+127)) (f32.const -nan)) -(assert_return (invoke "copysign" (f32.const -nan) (f32.const 0x1.fffffep+127)) (f32.const nan)) -(assert_return (invoke "copysign" (f32.const nan) (f32.const -0x1.fffffep+127)) (f32.const -nan)) -(assert_return (invoke "copysign" (f32.const nan) (f32.const 0x1.fffffep+127)) (f32.const nan)) -(assert_return (invoke "copysign" (f32.const -nan) (f32.const -inf)) (f32.const -nan)) -(assert_return (invoke "copysign" (f32.const -nan) (f32.const inf)) (f32.const nan)) -(assert_return (invoke "copysign" (f32.const nan) (f32.const -inf)) (f32.const -nan)) -(assert_return (invoke "copysign" (f32.const nan) (f32.const inf)) (f32.const nan)) -(assert_return (invoke "copysign" (f32.const -nan) (f32.const -nan)) (f32.const -nan)) -(assert_return (invoke "copysign" (f32.const -nan) (f32.const nan)) (f32.const nan)) -(assert_return (invoke "copysign" (f32.const nan) (f32.const -nan)) (f32.const -nan)) -(assert_return (invoke "copysign" (f32.const nan) (f32.const nan)) (f32.const nan)) -(assert_return (invoke "abs" (f32.const -0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "abs" (f32.const 0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "abs" (f32.const -0x1p-149)) (f32.const 0x1p-149)) -(assert_return (invoke "abs" (f32.const 0x1p-149)) (f32.const 0x1p-149)) -(assert_return (invoke "abs" (f32.const -0x1p-126)) (f32.const 0x1p-126)) -(assert_return (invoke "abs" (f32.const 0x1p-126)) (f32.const 0x1p-126)) -(assert_return (invoke "abs" (f32.const -0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "abs" (f32.const 0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "abs" (f32.const -0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "abs" (f32.const 0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "abs" (f32.const -0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "abs" (f32.const 0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "abs" (f32.const -0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "abs" (f32.const 0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "abs" (f32.const -inf)) (f32.const inf)) -(assert_return (invoke "abs" (f32.const inf)) (f32.const inf)) -(assert_return (invoke "abs" (f32.const -nan)) (f32.const nan)) -(assert_return (invoke "abs" (f32.const nan)) (f32.const nan)) -(assert_return (invoke "neg" (f32.const -0x0p+0)) (f32.const 0x0p+0)) -(assert_return (invoke "neg" (f32.const 0x0p+0)) (f32.const -0x0p+0)) -(assert_return (invoke "neg" (f32.const -0x1p-149)) (f32.const 0x1p-149)) -(assert_return (invoke "neg" (f32.const 0x1p-149)) (f32.const -0x1p-149)) -(assert_return (invoke "neg" (f32.const -0x1p-126)) (f32.const 0x1p-126)) -(assert_return (invoke "neg" (f32.const 0x1p-126)) (f32.const -0x1p-126)) -(assert_return (invoke "neg" (f32.const -0x1p-1)) (f32.const 0x1p-1)) -(assert_return (invoke "neg" (f32.const 0x1p-1)) (f32.const -0x1p-1)) -(assert_return (invoke "neg" (f32.const -0x1p+0)) (f32.const 0x1p+0)) -(assert_return (invoke "neg" (f32.const 0x1p+0)) (f32.const -0x1p+0)) -(assert_return (invoke "neg" (f32.const -0x1.921fb6p+2)) (f32.const 0x1.921fb6p+2)) -(assert_return (invoke "neg" (f32.const 0x1.921fb6p+2)) (f32.const -0x1.921fb6p+2)) -(assert_return (invoke "neg" (f32.const -0x1.fffffep+127)) (f32.const 0x1.fffffep+127)) -(assert_return (invoke "neg" (f32.const 0x1.fffffep+127)) (f32.const -0x1.fffffep+127)) -(assert_return (invoke "neg" (f32.const -inf)) (f32.const inf)) -(assert_return (invoke "neg" (f32.const inf)) (f32.const -inf)) -(assert_return (invoke "neg" (f32.const -nan)) (f32.const nan)) -(assert_return (invoke "neg" (f32.const nan)) (f32.const -nan)) - - -;; Type check - -(assert_invalid (module (func (result f32) (f32.abs (i64.const 0)))) "type mismatch") -(assert_invalid (module (func (result f32) (f32.neg (i64.const 0)))) "type mismatch") diff --git a/tests/misc_testsuite/winch/f32_cmp.wast b/tests/misc_testsuite/winch/f32_cmp.wast deleted file mode 100644 index e01153feadbb..000000000000 --- a/tests/misc_testsuite/winch/f32_cmp.wast +++ /dev/null @@ -1,2412 +0,0 @@ -;; Test all the f32 comparison operators on major boundary values and all -;; special values. - -(module - (func (export "eq") (param $x f32) (param $y f32) (result i32) (f32.eq (local.get $x) (local.get $y))) - (func (export "ne") (param $x f32) (param $y f32) (result i32) (f32.ne (local.get $x) (local.get $y))) - (func (export "lt") (param $x f32) (param $y f32) (result i32) (f32.lt (local.get $x) (local.get $y))) - (func (export "le") (param $x f32) (param $y f32) (result i32) (f32.le (local.get $x) (local.get $y))) - (func (export "gt") (param $x f32) (param $y f32) (result i32) (f32.gt (local.get $x) (local.get $y))) - (func (export "ge") (param $x f32) (param $y f32) (result i32) (f32.ge (local.get $x) (local.get $y))) -) - -(assert_return (invoke "eq" (f32.const -0x0p+0) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "eq" (f32.const -0x0p+0) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "eq" (f32.const 0x0p+0) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "eq" (f32.const 0x0p+0) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "eq" (f32.const -0x0p+0) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x0p+0) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x0p+0) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x0p+0) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x0p+0) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x0p+0) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x0p+0) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x0p+0) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x0p+0) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x0p+0) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x0p+0) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x0p+0) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x0p+0) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x0p+0) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x0p+0) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x0p+0) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x0p+0) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x0p+0) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x0p+0) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x0p+0) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x0p+0) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x0p+0) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x0p+0) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x0p+0) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x0p+0) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x0p+0) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x0p+0) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x0p+0) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x0p+0) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x0p+0) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x0p+0) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x0p+0) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x0p+0) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x0p+0) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x0p+0) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x0p+0) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-149) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-149) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-149) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-149) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-149) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "eq" (f32.const -0x1p-149) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-149) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-149) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "eq" (f32.const -0x1p-149) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-149) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-149) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-149) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-149) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-149) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-149) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-149) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-149) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-149) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-149) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-149) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-149) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-149) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-149) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-149) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-149) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-149) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-149) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-149) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-149) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-149) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-149) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-149) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-149) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-149) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-149) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-149) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-149) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-149) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-149) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-149) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-126) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-126) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-126) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-126) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-126) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-126) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-126) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-126) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-126) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "eq" (f32.const -0x1p-126) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-126) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-126) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "eq" (f32.const -0x1p-126) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-126) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-126) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-126) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-126) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-126) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-126) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-126) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-126) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-126) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-126) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-126) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-126) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-126) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-126) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-126) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-126) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-126) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-126) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-126) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-126) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-126) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-126) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-126) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-126) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-126) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-126) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-126) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-1) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-1) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-1) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-1) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-1) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-1) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-1) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-1) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-1) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-1) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-1) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-1) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-1) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "eq" (f32.const -0x1p-1) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-1) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-1) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "eq" (f32.const -0x1p-1) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-1) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-1) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-1) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-1) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-1) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-1) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-1) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-1) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-1) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-1) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-1) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-1) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-1) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-1) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-1) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-1) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-1) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-1) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p-1) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-1) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-1) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-1) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p-1) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p+0) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p+0) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p+0) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p+0) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p+0) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p+0) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p+0) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p+0) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p+0) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p+0) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p+0) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p+0) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p+0) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p+0) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p+0) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p+0) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p+0) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "eq" (f32.const -0x1p+0) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p+0) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p+0) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "eq" (f32.const -0x1p+0) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p+0) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p+0) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p+0) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p+0) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p+0) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p+0) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p+0) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p+0) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p+0) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p+0) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p+0) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p+0) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p+0) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p+0) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1p+0) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p+0) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p+0) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p+0) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1p+0) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1.921fb6p+2) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1.921fb6p+2) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.921fb6p+2) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.921fb6p+2) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1.921fb6p+2) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1.921fb6p+2) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.921fb6p+2) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.921fb6p+2) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1.921fb6p+2) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "eq" (f32.const -0x1.921fb6p+2) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.921fb6p+2) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.921fb6p+2) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "eq" (f32.const -0x1.921fb6p+2) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1.921fb6p+2) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.921fb6p+2) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.921fb6p+2) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1.921fb6p+2) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1.921fb6p+2) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.921fb6p+2) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.921fb6p+2) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1.921fb6p+2) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1.921fb6p+2) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1.921fb6p+2) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1.921fb6p+2) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.921fb6p+2) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.921fb6p+2) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.921fb6p+2) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.921fb6p+2) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1.fffffep+127) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1.fffffep+127) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.fffffep+127) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.fffffep+127) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1.fffffep+127) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1.fffffep+127) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.fffffep+127) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.fffffep+127) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1.fffffep+127) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1.fffffep+127) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.fffffep+127) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.fffffep+127) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1.fffffep+127) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1.fffffep+127) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.fffffep+127) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.fffffep+127) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1.fffffep+127) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1.fffffep+127) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.fffffep+127) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.fffffep+127) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1.fffffep+127) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1.fffffep+127) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.fffffep+127) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.fffffep+127) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1.fffffep+127) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "eq" (f32.const -0x1.fffffep+127) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.fffffep+127) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.fffffep+127) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "eq" (f32.const -0x1.fffffep+127) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1.fffffep+127) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.fffffep+127) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.fffffep+127) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1.fffffep+127) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1.fffffep+127) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1.fffffep+127) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -0x1.fffffep+127) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.fffffep+127) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.fffffep+127) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.fffffep+127) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const 0x1.fffffep+127) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -inf) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -inf) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const inf) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const inf) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -inf) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -inf) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const inf) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const inf) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -inf) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -inf) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const inf) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const inf) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -inf) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -inf) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const inf) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const inf) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -inf) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -inf) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const inf) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const inf) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -inf) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -inf) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const inf) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const inf) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -inf) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -inf) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const inf) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const inf) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -inf) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "eq" (f32.const -inf) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const inf) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const inf) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "eq" (f32.const -inf) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -inf) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -inf) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -inf) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const inf) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const inf) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const inf) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const inf) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan:0x200000) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan:0x200000) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan:0x200000) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan:0x200000) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan:0x200000) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan:0x200000) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan:0x200000) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan:0x200000) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan:0x200000) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan:0x200000) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan:0x200000) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan:0x200000) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan:0x200000) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan:0x200000) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan:0x200000) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan:0x200000) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan:0x200000) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan:0x200000) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan:0x200000) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan:0x200000) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan:0x200000) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan:0x200000) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan:0x200000) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan:0x200000) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan:0x200000) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan:0x200000) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan:0x200000) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan:0x200000) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan:0x200000) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan:0x200000) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan:0x200000) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan:0x200000) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan:0x200000) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan:0x200000) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan:0x200000) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const -nan:0x200000) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan:0x200000) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan:0x200000) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan:0x200000) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "eq" (f32.const nan:0x200000) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ne" (f32.const -0x0p+0) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "ne" (f32.const -0x0p+0) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "ne" (f32.const 0x0p+0) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "ne" (f32.const 0x0p+0) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "ne" (f32.const -0x0p+0) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x0p+0) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x0p+0) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x0p+0) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x0p+0) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x0p+0) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x0p+0) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x0p+0) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x0p+0) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x0p+0) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x0p+0) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x0p+0) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x0p+0) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x0p+0) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x0p+0) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x0p+0) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x0p+0) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x0p+0) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x0p+0) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x0p+0) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x0p+0) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x0p+0) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x0p+0) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x0p+0) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x0p+0) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x0p+0) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x0p+0) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x0p+0) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x0p+0) (f32.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x0p+0) (f32.const -nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x0p+0) (f32.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x0p+0) (f32.const nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x0p+0) (f32.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x0p+0) (f32.const -nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x0p+0) (f32.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x0p+0) (f32.const nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-149) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-149) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-149) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-149) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-149) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "ne" (f32.const -0x1p-149) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-149) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-149) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "ne" (f32.const -0x1p-149) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-149) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-149) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-149) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-149) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-149) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-149) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-149) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-149) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-149) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-149) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-149) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-149) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-149) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-149) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-149) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-149) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-149) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-149) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-149) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-149) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-149) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-149) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-149) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-149) (f32.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-149) (f32.const -nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-149) (f32.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-149) (f32.const nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-149) (f32.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-149) (f32.const -nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-149) (f32.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-149) (f32.const nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-126) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-126) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-126) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-126) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-126) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-126) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-126) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-126) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-126) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "ne" (f32.const -0x1p-126) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-126) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-126) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "ne" (f32.const -0x1p-126) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-126) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-126) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-126) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-126) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-126) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-126) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-126) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-126) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-126) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-126) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-126) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-126) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-126) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-126) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-126) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-126) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-126) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-126) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-126) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-126) (f32.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-126) (f32.const -nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-126) (f32.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-126) (f32.const nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-126) (f32.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-126) (f32.const -nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-126) (f32.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-126) (f32.const nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-1) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-1) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-1) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-1) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-1) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-1) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-1) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-1) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-1) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-1) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-1) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-1) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-1) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "ne" (f32.const -0x1p-1) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-1) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-1) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "ne" (f32.const -0x1p-1) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-1) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-1) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-1) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-1) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-1) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-1) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-1) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-1) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-1) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-1) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-1) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-1) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-1) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-1) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-1) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-1) (f32.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-1) (f32.const -nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-1) (f32.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p-1) (f32.const nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-1) (f32.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-1) (f32.const -nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-1) (f32.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p-1) (f32.const nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p+0) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p+0) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p+0) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p+0) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p+0) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p+0) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p+0) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p+0) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p+0) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p+0) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p+0) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p+0) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p+0) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p+0) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p+0) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p+0) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p+0) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "ne" (f32.const -0x1p+0) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p+0) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p+0) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "ne" (f32.const -0x1p+0) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p+0) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p+0) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p+0) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p+0) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p+0) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p+0) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p+0) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p+0) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p+0) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p+0) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p+0) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p+0) (f32.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p+0) (f32.const -nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p+0) (f32.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1p+0) (f32.const nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p+0) (f32.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p+0) (f32.const -nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p+0) (f32.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1p+0) (f32.const nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1.921fb6p+2) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1.921fb6p+2) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.921fb6p+2) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.921fb6p+2) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1.921fb6p+2) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1.921fb6p+2) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.921fb6p+2) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.921fb6p+2) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1.921fb6p+2) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "ne" (f32.const -0x1.921fb6p+2) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.921fb6p+2) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.921fb6p+2) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "ne" (f32.const -0x1.921fb6p+2) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1.921fb6p+2) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.921fb6p+2) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.921fb6p+2) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1.921fb6p+2) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1.921fb6p+2) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.921fb6p+2) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.921fb6p+2) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1.921fb6p+2) (f32.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1.921fb6p+2) (f32.const -nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1.921fb6p+2) (f32.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1.921fb6p+2) (f32.const nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.921fb6p+2) (f32.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.921fb6p+2) (f32.const -nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.921fb6p+2) (f32.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.921fb6p+2) (f32.const nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1.fffffep+127) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1.fffffep+127) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.fffffep+127) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.fffffep+127) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1.fffffep+127) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1.fffffep+127) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.fffffep+127) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.fffffep+127) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1.fffffep+127) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1.fffffep+127) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.fffffep+127) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.fffffep+127) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1.fffffep+127) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1.fffffep+127) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.fffffep+127) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.fffffep+127) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1.fffffep+127) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1.fffffep+127) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.fffffep+127) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.fffffep+127) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1.fffffep+127) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1.fffffep+127) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.fffffep+127) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.fffffep+127) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1.fffffep+127) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "ne" (f32.const -0x1.fffffep+127) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.fffffep+127) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.fffffep+127) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "ne" (f32.const -0x1.fffffep+127) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1.fffffep+127) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.fffffep+127) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.fffffep+127) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1.fffffep+127) (f32.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1.fffffep+127) (f32.const -nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1.fffffep+127) (f32.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -0x1.fffffep+127) (f32.const nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.fffffep+127) (f32.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.fffffep+127) (f32.const -nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.fffffep+127) (f32.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const 0x1.fffffep+127) (f32.const nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -inf) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -inf) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const inf) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const inf) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -inf) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -inf) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const inf) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const inf) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -inf) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -inf) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const inf) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const inf) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -inf) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -inf) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const inf) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const inf) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -inf) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -inf) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const inf) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const inf) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -inf) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -inf) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const inf) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const inf) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -inf) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -inf) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const inf) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const inf) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -inf) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "ne" (f32.const -inf) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const inf) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const inf) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "ne" (f32.const -inf) (f32.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -inf) (f32.const -nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -inf) (f32.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -inf) (f32.const nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const inf) (f32.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const inf) (f32.const -nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const inf) (f32.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const inf) (f32.const nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan:0x200000) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan:0x200000) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan:0x200000) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan:0x200000) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan:0x200000) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan:0x200000) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan:0x200000) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan:0x200000) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan:0x200000) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan:0x200000) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan:0x200000) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan:0x200000) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan:0x200000) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan:0x200000) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan:0x200000) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan:0x200000) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan:0x200000) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan:0x200000) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan:0x200000) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan:0x200000) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan:0x200000) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan:0x200000) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan:0x200000) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan:0x200000) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan:0x200000) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan:0x200000) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan:0x200000) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan:0x200000) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan:0x200000) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan:0x200000) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan:0x200000) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan:0x200000) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan) (f32.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan:0x200000) (f32.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan) (f32.const -nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan:0x200000) (f32.const -nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan) (f32.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan:0x200000) (f32.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan) (f32.const nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const -nan:0x200000) (f32.const nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan) (f32.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan:0x200000) (f32.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan) (f32.const -nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan:0x200000) (f32.const -nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan) (f32.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan:0x200000) (f32.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan) (f32.const nan:0x200000)) (i32.const 1)) -(assert_return (invoke "ne" (f32.const nan:0x200000) (f32.const nan:0x200000)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x0p+0) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x0p+0) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x0p+0) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x0p+0) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x0p+0) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x0p+0) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x0p+0) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x0p+0) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x0p+0) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x0p+0) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x0p+0) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x0p+0) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x0p+0) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x0p+0) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x0p+0) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x0p+0) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x0p+0) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x0p+0) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x0p+0) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x0p+0) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x0p+0) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x0p+0) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x0p+0) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x0p+0) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x0p+0) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x0p+0) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x0p+0) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x0p+0) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x0p+0) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x0p+0) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x0p+0) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x0p+0) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x0p+0) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x0p+0) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x0p+0) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x0p+0) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x0p+0) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x0p+0) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x0p+0) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x0p+0) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-149) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1p-149) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1p-149) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p-149) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-149) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-149) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1p-149) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p-149) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-149) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-149) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1p-149) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p-149) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1p-149) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-149) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1p-149) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p-149) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1p-149) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-149) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1p-149) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p-149) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1p-149) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-149) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1p-149) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p-149) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1p-149) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-149) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1p-149) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p-149) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1p-149) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-149) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1p-149) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p-149) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1p-149) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-149) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-149) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-149) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p-149) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p-149) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p-149) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p-149) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-126) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1p-126) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1p-126) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p-126) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-126) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1p-126) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1p-126) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p-126) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-126) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-126) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1p-126) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p-126) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-126) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-126) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1p-126) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p-126) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1p-126) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-126) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1p-126) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p-126) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1p-126) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-126) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1p-126) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p-126) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1p-126) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-126) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1p-126) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p-126) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1p-126) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-126) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1p-126) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p-126) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1p-126) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-126) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-126) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-126) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p-126) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p-126) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p-126) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p-126) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-1) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1p-1) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1p-1) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p-1) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-1) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1p-1) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1p-1) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p-1) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-1) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1p-1) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1p-1) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p-1) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-1) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-1) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1p-1) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p-1) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-1) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-1) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1p-1) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p-1) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1p-1) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-1) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1p-1) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p-1) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1p-1) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-1) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1p-1) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p-1) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1p-1) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-1) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1p-1) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p-1) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1p-1) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-1) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-1) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p-1) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p-1) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p-1) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p-1) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p-1) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p+0) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1p+0) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1p+0) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p+0) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p+0) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1p+0) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1p+0) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p+0) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p+0) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1p+0) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1p+0) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p+0) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p+0) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1p+0) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1p+0) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p+0) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p+0) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p+0) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1p+0) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p+0) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p+0) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p+0) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1p+0) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p+0) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1p+0) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p+0) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1p+0) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p+0) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1p+0) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p+0) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1p+0) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p+0) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1p+0) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p+0) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p+0) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1p+0) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p+0) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p+0) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p+0) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1p+0) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1.921fb6p+2) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1.921fb6p+2) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1.921fb6p+2) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1.921fb6p+2) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1.921fb6p+2) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1.921fb6p+2) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1.921fb6p+2) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1.921fb6p+2) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1.921fb6p+2) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1.921fb6p+2) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1.921fb6p+2) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1.921fb6p+2) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1.921fb6p+2) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1.921fb6p+2) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1.921fb6p+2) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1.921fb6p+2) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1.921fb6p+2) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1.921fb6p+2) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1.921fb6p+2) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1.921fb6p+2) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1.921fb6p+2) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1.921fb6p+2) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1.921fb6p+2) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1.921fb6p+2) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1.921fb6p+2) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1.921fb6p+2) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1.921fb6p+2) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1.921fb6p+2) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1.fffffep+127) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1.fffffep+127) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1.fffffep+127) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1.fffffep+127) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1.fffffep+127) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1.fffffep+127) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1.fffffep+127) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1.fffffep+127) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1.fffffep+127) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1.fffffep+127) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1.fffffep+127) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1.fffffep+127) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1.fffffep+127) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1.fffffep+127) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1.fffffep+127) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1.fffffep+127) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1.fffffep+127) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1.fffffep+127) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1.fffffep+127) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1.fffffep+127) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1.fffffep+127) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1.fffffep+127) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1.fffffep+127) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1.fffffep+127) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1.fffffep+127) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1.fffffep+127) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1.fffffep+127) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1.fffffep+127) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1.fffffep+127) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1.fffffep+127) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const 0x1.fffffep+127) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1.fffffep+127) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -0x1.fffffep+127) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1.fffffep+127) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1.fffffep+127) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -0x1.fffffep+127) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1.fffffep+127) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1.fffffep+127) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1.fffffep+127) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const 0x1.fffffep+127) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -inf) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -inf) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const inf) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const inf) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -inf) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -inf) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const inf) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const inf) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -inf) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -inf) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const inf) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const inf) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -inf) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -inf) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const inf) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const inf) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -inf) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -inf) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const inf) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const inf) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -inf) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -inf) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const inf) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const inf) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -inf) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const -inf) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const inf) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const inf) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -inf) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -inf) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "lt" (f32.const inf) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const inf) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -inf) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -inf) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -inf) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -inf) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const inf) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const inf) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const inf) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const inf) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan:0x200000) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan:0x200000) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan:0x200000) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan:0x200000) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan:0x200000) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan:0x200000) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan:0x200000) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan:0x200000) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan:0x200000) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan:0x200000) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan:0x200000) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan:0x200000) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan:0x200000) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan:0x200000) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan:0x200000) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan:0x200000) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan:0x200000) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan:0x200000) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan:0x200000) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan:0x200000) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan:0x200000) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan:0x200000) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan:0x200000) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan:0x200000) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan:0x200000) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan:0x200000) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan:0x200000) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan:0x200000) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan:0x200000) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan:0x200000) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan:0x200000) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan:0x200000) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan:0x200000) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan:0x200000) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan:0x200000) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const -nan:0x200000) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan:0x200000) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan:0x200000) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan:0x200000) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "lt" (f32.const nan:0x200000) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x0p+0) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x0p+0) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x0p+0) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x0p+0) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x0p+0) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x0p+0) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x0p+0) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x0p+0) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x0p+0) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x0p+0) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x0p+0) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x0p+0) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x0p+0) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x0p+0) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x0p+0) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x0p+0) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x0p+0) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x0p+0) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x0p+0) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x0p+0) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x0p+0) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x0p+0) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x0p+0) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x0p+0) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x0p+0) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x0p+0) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x0p+0) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x0p+0) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x0p+0) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x0p+0) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x0p+0) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x0p+0) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x0p+0) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x0p+0) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x0p+0) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x0p+0) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x0p+0) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x0p+0) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x0p+0) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x0p+0) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p-149) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1p-149) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1p-149) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p-149) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p-149) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1p-149) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1p-149) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p-149) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1p-149) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p-149) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1p-149) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p-149) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1p-149) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p-149) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1p-149) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p-149) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1p-149) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p-149) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1p-149) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p-149) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1p-149) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p-149) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1p-149) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p-149) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1p-149) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p-149) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1p-149) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p-149) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1p-149) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p-149) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1p-149) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p-149) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1p-149) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p-149) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p-149) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p-149) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p-149) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p-149) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p-149) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p-149) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p-126) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1p-126) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1p-126) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p-126) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p-126) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1p-126) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1p-126) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p-126) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p-126) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1p-126) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1p-126) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p-126) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1p-126) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p-126) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1p-126) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p-126) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1p-126) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p-126) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1p-126) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p-126) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1p-126) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p-126) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1p-126) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p-126) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1p-126) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p-126) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1p-126) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p-126) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1p-126) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p-126) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1p-126) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p-126) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1p-126) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p-126) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p-126) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p-126) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p-126) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p-126) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p-126) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p-126) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p-1) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1p-1) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1p-1) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p-1) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p-1) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1p-1) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1p-1) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p-1) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p-1) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1p-1) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1p-1) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p-1) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p-1) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1p-1) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1p-1) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p-1) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1p-1) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p-1) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1p-1) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p-1) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1p-1) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p-1) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1p-1) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p-1) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1p-1) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p-1) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1p-1) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p-1) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1p-1) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p-1) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1p-1) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p-1) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1p-1) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p-1) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p-1) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p-1) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p-1) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p-1) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p-1) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p-1) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p+0) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1p+0) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1p+0) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p+0) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p+0) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1p+0) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1p+0) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p+0) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p+0) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1p+0) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1p+0) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p+0) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p+0) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1p+0) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1p+0) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p+0) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p+0) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1p+0) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1p+0) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p+0) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1p+0) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p+0) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1p+0) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p+0) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1p+0) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p+0) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1p+0) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p+0) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1p+0) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p+0) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1p+0) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p+0) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1p+0) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p+0) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p+0) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1p+0) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p+0) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p+0) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p+0) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1p+0) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1.921fb6p+2) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1.921fb6p+2) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1.921fb6p+2) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1.921fb6p+2) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1.921fb6p+2) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1.921fb6p+2) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1.921fb6p+2) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1.921fb6p+2) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1.921fb6p+2) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1.921fb6p+2) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1.921fb6p+2) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1.921fb6p+2) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1.921fb6p+2) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1.921fb6p+2) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1.921fb6p+2) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1.921fb6p+2) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1.921fb6p+2) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1.921fb6p+2) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1.921fb6p+2) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1.921fb6p+2) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1.921fb6p+2) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1.921fb6p+2) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1.921fb6p+2) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1.921fb6p+2) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1.921fb6p+2) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1.921fb6p+2) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1.921fb6p+2) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1.921fb6p+2) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1.fffffep+127) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1.fffffep+127) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1.fffffep+127) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1.fffffep+127) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1.fffffep+127) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1.fffffep+127) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1.fffffep+127) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1.fffffep+127) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1.fffffep+127) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1.fffffep+127) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1.fffffep+127) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1.fffffep+127) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1.fffffep+127) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1.fffffep+127) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1.fffffep+127) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1.fffffep+127) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1.fffffep+127) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1.fffffep+127) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1.fffffep+127) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1.fffffep+127) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1.fffffep+127) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1.fffffep+127) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1.fffffep+127) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1.fffffep+127) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1.fffffep+127) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1.fffffep+127) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1.fffffep+127) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1.fffffep+127) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1.fffffep+127) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1.fffffep+127) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "le" (f32.const 0x1.fffffep+127) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1.fffffep+127) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -0x1.fffffep+127) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1.fffffep+127) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1.fffffep+127) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -0x1.fffffep+127) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1.fffffep+127) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1.fffffep+127) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1.fffffep+127) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const 0x1.fffffep+127) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -inf) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -inf) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "le" (f32.const inf) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const inf) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -inf) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -inf) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "le" (f32.const inf) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "le" (f32.const inf) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -inf) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -inf) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "le" (f32.const inf) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "le" (f32.const inf) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -inf) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -inf) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "le" (f32.const inf) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f32.const inf) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -inf) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -inf) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "le" (f32.const inf) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const inf) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -inf) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -inf) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "le" (f32.const inf) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "le" (f32.const inf) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -inf) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -inf) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "le" (f32.const inf) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "le" (f32.const inf) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -inf) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -inf) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "le" (f32.const inf) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f32.const inf) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "le" (f32.const -inf) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -inf) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -inf) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -inf) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const inf) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const inf) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const inf) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const inf) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan:0x200000) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan:0x200000) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan:0x200000) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan:0x200000) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan:0x200000) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan:0x200000) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan:0x200000) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan:0x200000) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan:0x200000) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan:0x200000) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan:0x200000) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan:0x200000) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan:0x200000) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan:0x200000) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan:0x200000) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan:0x200000) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan:0x200000) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan:0x200000) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan:0x200000) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan:0x200000) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan:0x200000) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan:0x200000) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan:0x200000) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan:0x200000) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan:0x200000) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan:0x200000) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan:0x200000) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan:0x200000) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan:0x200000) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan:0x200000) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan:0x200000) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan:0x200000) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan:0x200000) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan:0x200000) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan:0x200000) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const -nan:0x200000) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan:0x200000) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan:0x200000) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan:0x200000) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "le" (f32.const nan:0x200000) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x0p+0) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x0p+0) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x0p+0) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x0p+0) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x0p+0) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x0p+0) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x0p+0) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x0p+0) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x0p+0) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x0p+0) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x0p+0) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x0p+0) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x0p+0) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x0p+0) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x0p+0) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x0p+0) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x0p+0) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x0p+0) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x0p+0) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x0p+0) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x0p+0) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x0p+0) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x0p+0) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x0p+0) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x0p+0) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x0p+0) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x0p+0) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x0p+0) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x0p+0) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x0p+0) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x0p+0) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x0p+0) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x0p+0) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x0p+0) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x0p+0) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x0p+0) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x0p+0) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x0p+0) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x0p+0) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x0p+0) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-149) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-149) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p-149) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1p-149) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1p-149) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-149) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p-149) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1p-149) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-149) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1p-149) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p-149) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1p-149) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-149) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1p-149) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p-149) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1p-149) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-149) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1p-149) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p-149) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1p-149) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-149) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1p-149) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p-149) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1p-149) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-149) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1p-149) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p-149) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1p-149) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-149) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1p-149) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p-149) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1p-149) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-149) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-149) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-149) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-149) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p-149) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p-149) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p-149) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p-149) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-126) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-126) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p-126) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1p-126) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1p-126) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-126) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p-126) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1p-126) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1p-126) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-126) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p-126) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1p-126) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-126) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1p-126) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p-126) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1p-126) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-126) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1p-126) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p-126) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1p-126) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-126) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1p-126) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p-126) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1p-126) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-126) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1p-126) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p-126) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1p-126) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-126) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1p-126) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p-126) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1p-126) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-126) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-126) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-126) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-126) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p-126) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p-126) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p-126) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p-126) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-1) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-1) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p-1) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1p-1) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1p-1) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-1) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p-1) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1p-1) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1p-1) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-1) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p-1) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1p-1) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1p-1) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-1) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p-1) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1p-1) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-1) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1p-1) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p-1) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1p-1) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-1) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1p-1) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p-1) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1p-1) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-1) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1p-1) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p-1) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1p-1) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-1) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1p-1) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p-1) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1p-1) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-1) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-1) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-1) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p-1) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p-1) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p-1) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p-1) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p-1) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p+0) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p+0) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p+0) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1p+0) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1p+0) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p+0) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p+0) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1p+0) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1p+0) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p+0) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p+0) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1p+0) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1p+0) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p+0) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p+0) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1p+0) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1p+0) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p+0) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p+0) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1p+0) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p+0) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1p+0) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p+0) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1p+0) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p+0) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1p+0) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p+0) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1p+0) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p+0) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1p+0) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p+0) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1p+0) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p+0) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p+0) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p+0) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1p+0) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p+0) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p+0) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p+0) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1p+0) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1.921fb6p+2) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1.921fb6p+2) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1.921fb6p+2) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1.921fb6p+2) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1.921fb6p+2) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1.921fb6p+2) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1.921fb6p+2) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1.921fb6p+2) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1.921fb6p+2) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1.921fb6p+2) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1.921fb6p+2) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1.921fb6p+2) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1.921fb6p+2) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1.921fb6p+2) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1.921fb6p+2) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1.921fb6p+2) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1.921fb6p+2) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1.921fb6p+2) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1.921fb6p+2) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1.921fb6p+2) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1.921fb6p+2) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1.921fb6p+2) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1.921fb6p+2) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1.921fb6p+2) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1.921fb6p+2) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1.921fb6p+2) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1.921fb6p+2) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1.921fb6p+2) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1.fffffep+127) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1.fffffep+127) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1.fffffep+127) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1.fffffep+127) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1.fffffep+127) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1.fffffep+127) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1.fffffep+127) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1.fffffep+127) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1.fffffep+127) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1.fffffep+127) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1.fffffep+127) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1.fffffep+127) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1.fffffep+127) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1.fffffep+127) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1.fffffep+127) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1.fffffep+127) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1.fffffep+127) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1.fffffep+127) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1.fffffep+127) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1.fffffep+127) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1.fffffep+127) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1.fffffep+127) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1.fffffep+127) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1.fffffep+127) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1.fffffep+127) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1.fffffep+127) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1.fffffep+127) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1.fffffep+127) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1.fffffep+127) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -0x1.fffffep+127) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1.fffffep+127) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const 0x1.fffffep+127) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1.fffffep+127) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1.fffffep+127) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1.fffffep+127) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -0x1.fffffep+127) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1.fffffep+127) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1.fffffep+127) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1.fffffep+127) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const 0x1.fffffep+127) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -inf) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -inf) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const inf) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const inf) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -inf) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -inf) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const inf) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const inf) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -inf) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -inf) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const inf) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const inf) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -inf) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -inf) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const inf) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const inf) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -inf) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -inf) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const inf) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const inf) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -inf) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -inf) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const inf) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const inf) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -inf) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -inf) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const inf) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const inf) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const -inf) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -inf) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const inf) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "gt" (f32.const inf) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -inf) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -inf) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -inf) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -inf) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const inf) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const inf) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const inf) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const inf) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan:0x200000) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan:0x200000) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan:0x200000) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan:0x200000) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan:0x200000) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan:0x200000) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan:0x200000) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan:0x200000) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan:0x200000) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan:0x200000) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan:0x200000) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan:0x200000) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan:0x200000) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan:0x200000) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan:0x200000) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan:0x200000) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan:0x200000) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan:0x200000) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan:0x200000) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan:0x200000) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan:0x200000) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan:0x200000) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan:0x200000) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan:0x200000) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan:0x200000) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan:0x200000) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan:0x200000) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan:0x200000) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan:0x200000) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan:0x200000) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan:0x200000) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan:0x200000) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan:0x200000) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan:0x200000) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan:0x200000) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const -nan:0x200000) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan:0x200000) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan:0x200000) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan:0x200000) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "gt" (f32.const nan:0x200000) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x0p+0) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x0p+0) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x0p+0) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x0p+0) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x0p+0) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x0p+0) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x0p+0) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x0p+0) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x0p+0) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x0p+0) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x0p+0) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x0p+0) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x0p+0) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x0p+0) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x0p+0) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x0p+0) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x0p+0) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x0p+0) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x0p+0) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x0p+0) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x0p+0) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x0p+0) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x0p+0) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x0p+0) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x0p+0) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x0p+0) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x0p+0) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x0p+0) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x0p+0) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x0p+0) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x0p+0) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x0p+0) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x0p+0) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x0p+0) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x0p+0) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x0p+0) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x0p+0) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x0p+0) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x0p+0) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x0p+0) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p-149) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p-149) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p-149) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1p-149) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1p-149) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1p-149) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p-149) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1p-149) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1p-149) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1p-149) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p-149) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1p-149) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p-149) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1p-149) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p-149) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1p-149) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p-149) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1p-149) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p-149) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1p-149) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p-149) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1p-149) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p-149) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1p-149) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p-149) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1p-149) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p-149) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1p-149) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p-149) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1p-149) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p-149) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1p-149) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p-149) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p-149) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p-149) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p-149) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p-149) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p-149) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p-149) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p-149) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p-126) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p-126) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p-126) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1p-126) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1p-126) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p-126) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p-126) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1p-126) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1p-126) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1p-126) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p-126) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1p-126) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1p-126) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1p-126) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p-126) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1p-126) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p-126) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1p-126) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p-126) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1p-126) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p-126) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1p-126) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p-126) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1p-126) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p-126) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1p-126) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p-126) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1p-126) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p-126) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1p-126) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p-126) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1p-126) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p-126) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p-126) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p-126) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p-126) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p-126) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p-126) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p-126) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p-126) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p-1) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p-1) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p-1) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1p-1) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1p-1) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p-1) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p-1) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1p-1) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1p-1) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p-1) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p-1) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1p-1) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1p-1) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1p-1) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p-1) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1p-1) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1p-1) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1p-1) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p-1) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1p-1) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p-1) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1p-1) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p-1) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1p-1) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p-1) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1p-1) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p-1) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1p-1) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p-1) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1p-1) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p-1) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1p-1) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p-1) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p-1) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p-1) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p-1) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p-1) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p-1) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p-1) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p-1) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p+0) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p+0) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p+0) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1p+0) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1p+0) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p+0) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p+0) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1p+0) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1p+0) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p+0) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p+0) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1p+0) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1p+0) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p+0) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p+0) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1p+0) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1p+0) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1p+0) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p+0) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1p+0) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1p+0) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1p+0) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p+0) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1p+0) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p+0) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1p+0) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p+0) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1p+0) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p+0) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1p+0) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p+0) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1p+0) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p+0) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p+0) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p+0) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1p+0) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p+0) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p+0) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p+0) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1p+0) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1.921fb6p+2) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1.921fb6p+2) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1.921fb6p+2) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1.921fb6p+2) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1.921fb6p+2) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1.921fb6p+2) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1.921fb6p+2) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1.921fb6p+2) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1.921fb6p+2) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1.921fb6p+2) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1.921fb6p+2) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1.921fb6p+2) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1.921fb6p+2) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1.921fb6p+2) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1.921fb6p+2) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1.921fb6p+2) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1.921fb6p+2) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1.921fb6p+2) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1.921fb6p+2) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1.921fb6p+2) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1.921fb6p+2) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1.921fb6p+2) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1.921fb6p+2) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1.921fb6p+2) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1.921fb6p+2) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1.921fb6p+2) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1.921fb6p+2) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1.921fb6p+2) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1.921fb6p+2) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1.921fb6p+2) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1.921fb6p+2) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1.921fb6p+2) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1.fffffep+127) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1.fffffep+127) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1.fffffep+127) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1.fffffep+127) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1.fffffep+127) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1.fffffep+127) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1.fffffep+127) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1.fffffep+127) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1.fffffep+127) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1.fffffep+127) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1.fffffep+127) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1.fffffep+127) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1.fffffep+127) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1.fffffep+127) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1.fffffep+127) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1.fffffep+127) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1.fffffep+127) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1.fffffep+127) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1.fffffep+127) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1.fffffep+127) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1.fffffep+127) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1.fffffep+127) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1.fffffep+127) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1.fffffep+127) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1.fffffep+127) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1.fffffep+127) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1.fffffep+127) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1.fffffep+127) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1.fffffep+127) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -0x1.fffffep+127) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1.fffffep+127) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const 0x1.fffffep+127) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1.fffffep+127) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1.fffffep+127) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1.fffffep+127) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -0x1.fffffep+127) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1.fffffep+127) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1.fffffep+127) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1.fffffep+127) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const 0x1.fffffep+127) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -inf) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -inf) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const inf) (f32.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const inf) (f32.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -inf) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -inf) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const inf) (f32.const -0x1p-149)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const inf) (f32.const 0x1p-149)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -inf) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -inf) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const inf) (f32.const -0x1p-126)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const inf) (f32.const 0x1p-126)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -inf) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -inf) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const inf) (f32.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const inf) (f32.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -inf) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -inf) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const inf) (f32.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const inf) (f32.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -inf) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -inf) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const inf) (f32.const -0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const inf) (f32.const 0x1.921fb6p+2)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -inf) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -inf) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const inf) (f32.const -0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const inf) (f32.const 0x1.fffffep+127)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -inf) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -inf) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const inf) (f32.const -inf)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const inf) (f32.const inf)) (i32.const 1)) -(assert_return (invoke "ge" (f32.const -inf) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -inf) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -inf) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -inf) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const inf) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const inf) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const inf) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const inf) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan:0x200000) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan:0x200000) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan:0x200000) (f32.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan:0x200000) (f32.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan:0x200000) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan:0x200000) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan:0x200000) (f32.const -0x1p-149)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan:0x200000) (f32.const 0x1p-149)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan:0x200000) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan:0x200000) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan:0x200000) (f32.const -0x1p-126)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan:0x200000) (f32.const 0x1p-126)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan:0x200000) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan:0x200000) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan:0x200000) (f32.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan:0x200000) (f32.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan:0x200000) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan:0x200000) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan:0x200000) (f32.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan:0x200000) (f32.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan:0x200000) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan:0x200000) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan:0x200000) (f32.const -0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan:0x200000) (f32.const 0x1.921fb6p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan:0x200000) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan:0x200000) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan:0x200000) (f32.const -0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan:0x200000) (f32.const 0x1.fffffep+127)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan:0x200000) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan:0x200000) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan:0x200000) (f32.const -inf)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan:0x200000) (f32.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan:0x200000) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan:0x200000) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan:0x200000) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const -nan:0x200000) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan:0x200000) (f32.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan:0x200000) (f32.const -nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan:0x200000) (f32.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan) (f32.const nan:0x200000)) (i32.const 0)) -(assert_return (invoke "ge" (f32.const nan:0x200000) (f32.const nan:0x200000)) (i32.const 0)) diff --git a/tests/misc_testsuite/winch/f64.wast b/tests/misc_testsuite/winch/f64.wast deleted file mode 100644 index 0654530abd72..000000000000 --- a/tests/misc_testsuite/winch/f64.wast +++ /dev/null @@ -1,2844 +0,0 @@ -;; f64, small exponent -(module (func (export "f") (result f64) (f64.const +0x1.000000000000080000000000p-600))) -(assert_return (invoke "f") (f64.const +0x1.0000000000000p-600)) -(module (func (export "f") (result f64) (f64.const -0x1.000000000000080000000000p-600))) -(assert_return (invoke "f") (f64.const -0x1.0000000000000p-600)) -(module (func (export "f") (result f64) (f64.const +0x1.000000000000080000000001p-600))) -(assert_return (invoke "f") (f64.const +0x1.0000000000001p-600)) -(module (func (export "f") (result f64) (f64.const -0x1.000000000000080000000001p-600))) -(assert_return (invoke "f") (f64.const -0x1.0000000000001p-600)) -(module (func (export "f") (result f64) (f64.const +0x1.0000000000000fffffffffffp-600))) -(assert_return (invoke "f") (f64.const +0x1.0000000000001p-600)) -(module (func (export "f") (result f64) (f64.const -0x1.0000000000000fffffffffffp-600))) -(assert_return (invoke "f") (f64.const -0x1.0000000000001p-600)) -(module (func (export "f") (result f64) (f64.const +0x1.000000000000100000000000p-600))) -(assert_return (invoke "f") (f64.const +0x1.0000000000001p-600)) -(module (func (export "f") (result f64) (f64.const -0x1.000000000000100000000000p-600))) -(assert_return (invoke "f") (f64.const -0x1.0000000000001p-600)) -(module (func (export "f") (result f64) (f64.const +0x1.000000000000100000000001p-600))) -(assert_return (invoke "f") (f64.const +0x1.0000000000001p-600)) -(module (func (export "f") (result f64) (f64.const -0x1.000000000000100000000001p-600))) -(assert_return (invoke "f") (f64.const -0x1.0000000000001p-600)) -(module (func (export "f") (result f64) (f64.const +0x1.00000000000017ffffffffffp-600))) -(assert_return (invoke "f") (f64.const +0x1.0000000000001p-600)) -(module (func (export "f") (result f64) (f64.const -0x1.00000000000017ffffffffffp-600))) -(assert_return (invoke "f") (f64.const -0x1.0000000000001p-600)) -(module (func (export "f") (result f64) (f64.const +0x1.000000000000180000000000p-600))) -(assert_return (invoke "f") (f64.const +0x1.0000000000002p-600)) -(module (func (export "f") (result f64) (f64.const -0x1.000000000000180000000000p-600))) -(assert_return (invoke "f") (f64.const -0x1.0000000000002p-600)) -(module (func (export "f") (result f64) (f64.const +0x1.000000000000180000000001p-600))) -(assert_return (invoke "f") (f64.const +0x1.0000000000002p-600)) -(module (func (export "f") (result f64) (f64.const -0x1.000000000000180000000001p-600))) -(assert_return (invoke "f") (f64.const -0x1.0000000000002p-600)) -(module (func (export "f") (result f64) (f64.const +0x1.0000000000001fffffffffffp-600))) -(assert_return (invoke "f") (f64.const +0x1.0000000000002p-600)) -(module (func (export "f") (result f64) (f64.const -0x1.0000000000001fffffffffffp-600))) -(assert_return (invoke "f") (f64.const -0x1.0000000000002p-600)) -(module (func (export "f") (result f64) (f64.const +0x1.000000000000200000000000p-600))) -(assert_return (invoke "f") (f64.const +0x1.0000000000002p-600)) -(module (func (export "f") (result f64) (f64.const -0x1.000000000000200000000000p-600))) -(assert_return (invoke "f") (f64.const -0x1.0000000000002p-600)) -(module (func (export "f") (result f64) (f64.const +0x1.000000000000200000000001p-600))) -(assert_return (invoke "f") (f64.const +0x1.0000000000002p-600)) -(module (func (export "f") (result f64) (f64.const -0x1.000000000000200000000001p-600))) -(assert_return (invoke "f") (f64.const -0x1.0000000000002p-600)) -(module (func (export "f") (result f64) (f64.const +0x1.00000000000027ffffffffffp-600))) -(assert_return (invoke "f") (f64.const +0x1.0000000000002p-600)) -(module (func (export "f") (result f64) (f64.const -0x1.00000000000027ffffffffffp-600))) -(assert_return (invoke "f") (f64.const -0x1.0000000000002p-600)) -(module (func (export "f") (result f64) (f64.const +0x1.000000000000280000000001p-600))) -(assert_return (invoke "f") (f64.const +0x1.0000000000003p-600)) -(module (func (export "f") (result f64) (f64.const -0x1.000000000000280000000001p-600))) -(assert_return (invoke "f") (f64.const -0x1.0000000000003p-600)) - -(module (func (export "f") (result f64) (f64.const +0x8000000.000000400000000000p-627))) -(assert_return (invoke "f") (f64.const +0x1.0000000000000p-600)) -(module (func (export "f") (result f64) (f64.const -0x8000000.000000400000000000p-627))) -(assert_return (invoke "f") (f64.const -0x1.0000000000000p-600)) -(module (func (export "f") (result f64) (f64.const +0x8000000.000000400000000001p-627))) -(assert_return (invoke "f") (f64.const +0x1.0000000000001p-600)) -(module (func (export "f") (result f64) (f64.const -0x8000000.000000400000000001p-627))) -(assert_return (invoke "f") (f64.const -0x1.0000000000001p-600)) -(module (func (export "f") (result f64) (f64.const +0x8000000.0000007fffffffffffp-627))) -(assert_return (invoke "f") (f64.const +0x1.0000000000001p-600)) -(module (func (export "f") (result f64) (f64.const -0x8000000.0000007fffffffffffp-627))) -(assert_return (invoke "f") (f64.const -0x1.0000000000001p-600)) -(module (func (export "f") (result f64) (f64.const +0x8000000.000000800000000000p-627))) -(assert_return (invoke "f") (f64.const +0x1.0000000000001p-600)) -(module (func (export "f") (result f64) (f64.const -0x8000000.000000800000000000p-627))) -(assert_return (invoke "f") (f64.const -0x1.0000000000001p-600)) -(module (func (export "f") (result f64) (f64.const +0x8000000.000000800000000001p-627))) -(assert_return (invoke "f") (f64.const +0x1.0000000000001p-600)) -(module (func (export "f") (result f64) (f64.const -0x8000000.000000800000000001p-627))) -(assert_return (invoke "f") (f64.const -0x1.0000000000001p-600)) -(module (func (export "f") (result f64) (f64.const +0x8000000.000000bfffffffffffp-627))) -(assert_return (invoke "f") (f64.const +0x1.0000000000001p-600)) -(module (func (export "f") (result f64) (f64.const -0x8000000.000000bfffffffffffp-627))) -(assert_return (invoke "f") (f64.const -0x1.0000000000001p-600)) -(module (func (export "f") (result f64) (f64.const +0x8000000.000000c00000000000p-627))) -(assert_return (invoke "f") (f64.const +0x1.0000000000002p-600)) -(module (func (export "f") (result f64) (f64.const -0x8000000.000000c00000000000p-627))) -(assert_return (invoke "f") (f64.const -0x1.0000000000002p-600)) -(module (func (export "f") (result f64) (f64.const +0x8000000.000000c00000000001p-627))) -(assert_return (invoke "f") (f64.const +0x1.0000000000002p-600)) -(module (func (export "f") (result f64) (f64.const -0x8000000.000000c00000000001p-627))) -(assert_return (invoke "f") (f64.const -0x1.0000000000002p-600)) -(module (func (export "f") (result f64) (f64.const +0x8000000.000000ffffffffffffp-627))) -(assert_return (invoke "f") (f64.const +0x1.0000000000002p-600)) -(module (func (export "f") (result f64) (f64.const -0x8000000.000000ffffffffffffp-627))) -(assert_return (invoke "f") (f64.const -0x1.0000000000002p-600)) -(module (func (export "f") (result f64) (f64.const +0x8000000.000001000000000000p-627))) -(assert_return (invoke "f") (f64.const +0x1.0000000000002p-600)) -(module (func (export "f") (result f64) (f64.const -0x8000000.000001000000000000p-627))) -(assert_return (invoke "f") (f64.const -0x1.0000000000002p-600)) -(module (func (export "f") (result f64) (f64.const +0x8000000.000001000000000001p-627))) -(assert_return (invoke "f") (f64.const +0x1.0000000000002p-600)) -(module (func (export "f") (result f64) (f64.const -0x8000000.000001000000000001p-627))) -(assert_return (invoke "f") (f64.const -0x1.0000000000002p-600)) -(module (func (export "f") (result f64) (f64.const +0x8000000.0000013fffffffffffp-627))) -(assert_return (invoke "f") (f64.const +0x1.0000000000002p-600)) -(module (func (export "f") (result f64) (f64.const -0x8000000.0000013fffffffffffp-627))) -(assert_return (invoke "f") (f64.const -0x1.0000000000002p-600)) -(module (func (export "f") (result f64) (f64.const +0x8000000.000001400000000001p-627))) -(assert_return (invoke "f") (f64.const +0x1.0000000000003p-600)) -(module (func (export "f") (result f64) (f64.const -0x8000000.000001400000000001p-627))) -(assert_return (invoke "f") (f64.const -0x1.0000000000003p-600)) - -(module (func (export "f") (result f64) (f64.const +5.3575430359313371995e+300))) -(assert_return (invoke "f") (f64.const +0x1.0000000000000p+999)) -(module (func (export "f") (result f64) (f64.const -5.3575430359313371995e+300))) -(assert_return (invoke "f") (f64.const -0x1.0000000000000p+999)) -(module (func (export "f") (result f64) (f64.const +5.3575430359313371996e+300))) -(assert_return (invoke "f") (f64.const +0x1.0000000000001p+999)) -(module (func (export "f") (result f64) (f64.const -5.3575430359313371996e+300))) -(assert_return (invoke "f") (f64.const -0x1.0000000000001p+999)) -(module (func (export "f") (result f64) (f64.const +5.3575430359313383891e+300))) -(assert_return (invoke "f") (f64.const +0x1.0000000000001p+999)) -(module (func (export "f") (result f64) (f64.const -5.3575430359313383891e+300))) -(assert_return (invoke "f") (f64.const -0x1.0000000000001p+999)) -(module (func (export "f") (result f64) (f64.const +5.3575430359313383892e+300))) -(assert_return (invoke "f") (f64.const +0x1.0000000000002p+999)) -(module (func (export "f") (result f64) (f64.const -5.3575430359313383892e+300))) -(assert_return (invoke "f") (f64.const -0x1.0000000000002p+999)) - -;; f64, large exponent -(module (func (export "f") (result f64) (f64.const +0x1.000000000000080000000000p+600))) -(assert_return (invoke "f") (f64.const +0x1.0000000000000p+600)) -(module (func (export "f") (result f64) (f64.const -0x1.000000000000080000000000p+600))) -(assert_return (invoke "f") (f64.const -0x1.0000000000000p+600)) -(module (func (export "f") (result f64) (f64.const +0x1.000000000000080000000001p+600))) -(assert_return (invoke "f") (f64.const +0x1.0000000000001p+600)) -(module (func (export "f") (result f64) (f64.const -0x1.000000000000080000000001p+600))) -(assert_return (invoke "f") (f64.const -0x1.0000000000001p+600)) -(module (func (export "f") (result f64) (f64.const +0x1.0000000000000fffffffffffp+600))) -(assert_return (invoke "f") (f64.const +0x1.0000000000001p+600)) -(module (func (export "f") (result f64) (f64.const -0x1.0000000000000fffffffffffp+600))) -(assert_return (invoke "f") (f64.const -0x1.0000000000001p+600)) -(module (func (export "f") (result f64) (f64.const +0x1.000000000000100000000000p+600))) -(assert_return (invoke "f") (f64.const +0x1.0000000000001p+600)) -(module (func (export "f") (result f64) (f64.const -0x1.000000000000100000000000p+600))) -(assert_return (invoke "f") (f64.const -0x1.0000000000001p+600)) -(module (func (export "f") (result f64) (f64.const +0x1.000000000000100000000001p+600))) -(assert_return (invoke "f") (f64.const +0x1.0000000000001p+600)) -(module (func (export "f") (result f64) (f64.const -0x1.000000000000100000000001p+600))) -(assert_return (invoke "f") (f64.const -0x1.0000000000001p+600)) -(module (func (export "f") (result f64) (f64.const +0x1.00000000000017ffffffffffp+600))) -(assert_return (invoke "f") (f64.const +0x1.0000000000001p+600)) -(module (func (export "f") (result f64) (f64.const -0x1.00000000000017ffffffffffp+600))) -(assert_return (invoke "f") (f64.const -0x1.0000000000001p+600)) -(module (func (export "f") (result f64) (f64.const +0x1.000000000000180000000000p+600))) -(assert_return (invoke "f") (f64.const +0x1.0000000000002p+600)) -(module (func (export "f") (result f64) (f64.const -0x1.000000000000180000000000p+600))) -(assert_return (invoke "f") (f64.const -0x1.0000000000002p+600)) -(module (func (export "f") (result f64) (f64.const +0x1.000000000000180000000001p+600))) -(assert_return (invoke "f") (f64.const +0x1.0000000000002p+600)) -(module (func (export "f") (result f64) (f64.const -0x1.000000000000180000000001p+600))) -(assert_return (invoke "f") (f64.const -0x1.0000000000002p+600)) -(module (func (export "f") (result f64) (f64.const +0x1.0000000000001fffffffffffp+600))) -(assert_return (invoke "f") (f64.const +0x1.0000000000002p+600)) -(module (func (export "f") (result f64) (f64.const -0x1.0000000000001fffffffffffp+600))) -(assert_return (invoke "f") (f64.const -0x1.0000000000002p+600)) -(module (func (export "f") (result f64) (f64.const +0x1.000000000000200000000000p+600))) -(assert_return (invoke "f") (f64.const +0x1.0000000000002p+600)) -(module (func (export "f") (result f64) (f64.const -0x1.000000000000200000000000p+600))) -(assert_return (invoke "f") (f64.const -0x1.0000000000002p+600)) -(module (func (export "f") (result f64) (f64.const +0x1.000000000000200000000001p+600))) -(assert_return (invoke "f") (f64.const +0x1.0000000000002p+600)) -(module (func (export "f") (result f64) (f64.const -0x1.000000000000200000000001p+600))) -(assert_return (invoke "f") (f64.const -0x1.0000000000002p+600)) -(module (func (export "f") (result f64) (f64.const +0x1.00000000000027ffffffffffp+600))) -(assert_return (invoke "f") (f64.const +0x1.0000000000002p+600)) -(module (func (export "f") (result f64) (f64.const -0x1.00000000000027ffffffffffp+600))) -(assert_return (invoke "f") (f64.const -0x1.0000000000002p+600)) -(module (func (export "f") (result f64) (f64.const +0x1.000000000000280000000000p+600))) -(assert_return (invoke "f") (f64.const +0x1.0000000000002p+600)) -(module (func (export "f") (result f64) (f64.const -0x1.000000000000280000000000p+600))) -(assert_return (invoke "f") (f64.const -0x1.0000000000002p+600)) -(module (func (export "f") (result f64) (f64.const +0x1.000000000000280000000001p+600))) -(assert_return (invoke "f") (f64.const +0x1.0000000000003p+600)) -(module (func (export "f") (result f64) (f64.const -0x1.000000000000280000000001p+600))) -(assert_return (invoke "f") (f64.const -0x1.0000000000003p+600)) - -(module (func (export "f") (result f64) (f64.const +0x2000000000000100000000000))) -(assert_return (invoke "f") (f64.const +0x1.0000000000000p+97)) -(module (func (export "f") (result f64) (f64.const -0x2000000000000100000000000))) -(assert_return (invoke "f") (f64.const -0x1.0000000000000p+97)) -(module (func (export "f") (result f64) (f64.const +0x2000000000000100000000001))) -(assert_return (invoke "f") (f64.const +0x1.0000000000001p+97)) -(module (func (export "f") (result f64) (f64.const -0x2000000000000100000000001))) -(assert_return (invoke "f") (f64.const -0x1.0000000000001p+97)) -(module (func (export "f") (result f64) (f64.const +0x20000000000001fffffffffff))) -(assert_return (invoke "f") (f64.const +0x1.0000000000001p+97)) -(module (func (export "f") (result f64) (f64.const -0x20000000000001fffffffffff))) -(assert_return (invoke "f") (f64.const -0x1.0000000000001p+97)) -(module (func (export "f") (result f64) (f64.const +0x2000000000000200000000000))) -(assert_return (invoke "f") (f64.const +0x1.0000000000001p+97)) -(module (func (export "f") (result f64) (f64.const -0x2000000000000200000000000))) -(assert_return (invoke "f") (f64.const -0x1.0000000000001p+97)) -(module (func (export "f") (result f64) (f64.const +0x2000000000000200000000001))) -(assert_return (invoke "f") (f64.const +0x1.0000000000001p+97)) -(module (func (export "f") (result f64) (f64.const -0x2000000000000200000000001))) -(assert_return (invoke "f") (f64.const -0x1.0000000000001p+97)) -(module (func (export "f") (result f64) (f64.const +0x20000000000002fffffffffff))) -(assert_return (invoke "f") (f64.const +0x1.0000000000001p+97)) -(module (func (export "f") (result f64) (f64.const -0x20000000000002fffffffffff))) -(assert_return (invoke "f") (f64.const -0x1.0000000000001p+97)) -(module (func (export "f") (result f64) (f64.const +0x2000000000000300000000000))) -(assert_return (invoke "f") (f64.const +0x1.0000000000002p+97)) -(module (func (export "f") (result f64) (f64.const -0x2000000000000300000000000))) -(assert_return (invoke "f") (f64.const -0x1.0000000000002p+97)) -(module (func (export "f") (result f64) (f64.const +0x2000000000000300000000001))) -(assert_return (invoke "f") (f64.const +0x1.0000000000002p+97)) -(module (func (export "f") (result f64) (f64.const -0x2000000000000300000000001))) -(assert_return (invoke "f") (f64.const -0x1.0000000000002p+97)) -(module (func (export "f") (result f64) (f64.const +0x20000000000003fffffffffff))) -(assert_return (invoke "f") (f64.const +0x1.0000000000002p+97)) -(module (func (export "f") (result f64) (f64.const -0x20000000000003fffffffffff))) -(assert_return (invoke "f") (f64.const -0x1.0000000000002p+97)) -(module (func (export "f") (result f64) (f64.const +0x2000000000000400000000000))) -(assert_return (invoke "f") (f64.const +0x1.0000000000002p+97)) -(module (func (export "f") (result f64) (f64.const -0x2000000000000400000000000))) -(assert_return (invoke "f") (f64.const -0x1.0000000000002p+97)) -(module (func (export "f") (result f64) (f64.const +0x2000000000000400000000001))) -(assert_return (invoke "f") (f64.const +0x1.0000000000002p+97)) -(module (func (export "f") (result f64) (f64.const -0x2000000000000400000000001))) -(assert_return (invoke "f") (f64.const -0x1.0000000000002p+97)) -(module (func (export "f") (result f64) (f64.const +0x20000000000004fffffffffff))) -(assert_return (invoke "f") (f64.const +0x1.0000000000002p+97)) -(module (func (export "f") (result f64) (f64.const -0x20000000000004fffffffffff))) -(assert_return (invoke "f") (f64.const -0x1.0000000000002p+97)) -(module (func (export "f") (result f64) (f64.const +0x2000000000000500000000000))) -(assert_return (invoke "f") (f64.const +0x1.0000000000002p+97)) -(module (func (export "f") (result f64) (f64.const -0x2000000000000500000000000))) -(assert_return (invoke "f") (f64.const -0x1.0000000000002p+97)) -(module (func (export "f") (result f64) (f64.const +0x2000000000000500000000001))) -(assert_return (invoke "f") (f64.const +0x1.0000000000003p+97)) -(module (func (export "f") (result f64) (f64.const -0x2000000000000500000000001))) -(assert_return (invoke "f") (f64.const -0x1.0000000000003p+97)) - -(module (func (export "f") (result f64) (f64.const +1152921504606847104))) -(assert_return (invoke "f") (f64.const +0x1.0000000000000p+60)) -(module (func (export "f") (result f64) (f64.const -1152921504606847104))) -(assert_return (invoke "f") (f64.const -0x1.0000000000000p+60)) -(module (func (export "f") (result f64) (f64.const +1152921504606847105))) -(assert_return (invoke "f") (f64.const +0x1.0000000000001p+60)) -(module (func (export "f") (result f64) (f64.const -1152921504606847105))) -(assert_return (invoke "f") (f64.const -0x1.0000000000001p+60)) -(module (func (export "f") (result f64) (f64.const +1152921504606847359))) -(assert_return (invoke "f") (f64.const +0x1.0000000000001p+60)) -(module (func (export "f") (result f64) (f64.const -1152921504606847359))) -(assert_return (invoke "f") (f64.const -0x1.0000000000001p+60)) -(module (func (export "f") (result f64) (f64.const +1152921504606847360))) -(assert_return (invoke "f") (f64.const +0x1.0000000000002p+60)) -(module (func (export "f") (result f64) (f64.const -1152921504606847360))) -(assert_return (invoke "f") (f64.const -0x1.0000000000002p+60)) - -;; f64, subnormal -(module (func (export "f") (result f64) (f64.const +0x0.000000000000080000000000p-1022))) -(assert_return (invoke "f") (f64.const +0x0.0000000000000p-1022)) -(module (func (export "f") (result f64) (f64.const -0x0.000000000000080000000000p-1022))) -(assert_return (invoke "f") (f64.const -0x0.0000000000000p-1022)) -(module (func (export "f") (result f64) (f64.const +0x0.000000000000080000000001p-1022))) -(assert_return (invoke "f") (f64.const +0x0.0000000000001p-1022)) -(module (func (export "f") (result f64) (f64.const -0x0.000000000000080000000001p-1022))) -(assert_return (invoke "f") (f64.const -0x0.0000000000001p-1022)) -(module (func (export "f") (result f64) (f64.const +0x0.0000000000000fffffffffffp-1022))) -(assert_return (invoke "f") (f64.const +0x0.0000000000001p-1022)) -(module (func (export "f") (result f64) (f64.const -0x0.0000000000000fffffffffffp-1022))) -(assert_return (invoke "f") (f64.const -0x0.0000000000001p-1022)) -(module (func (export "f") (result f64) (f64.const +0x0.000000000000100000000000p-1022))) -(assert_return (invoke "f") (f64.const +0x0.0000000000001p-1022)) -(module (func (export "f") (result f64) (f64.const -0x0.000000000000100000000000p-1022))) -(assert_return (invoke "f") (f64.const -0x0.0000000000001p-1022)) -(module (func (export "f") (result f64) (f64.const +0x0.000000000000100000000001p-1022))) -(assert_return (invoke "f") (f64.const +0x0.0000000000001p-1022)) -(module (func (export "f") (result f64) (f64.const -0x0.000000000000100000000001p-1022))) -(assert_return (invoke "f") (f64.const -0x0.0000000000001p-1022)) -(module (func (export "f") (result f64) (f64.const +0x0.00000000000017ffffffffffp-1022))) -(assert_return (invoke "f") (f64.const +0x0.0000000000001p-1022)) -(module (func (export "f") (result f64) (f64.const -0x0.00000000000017ffffffffffp-1022))) -(assert_return (invoke "f") (f64.const -0x0.0000000000001p-1022)) -(module (func (export "f") (result f64) (f64.const +0x0.000000000000180000000000p-1022))) -(assert_return (invoke "f") (f64.const +0x0.0000000000002p-1022)) -(module (func (export "f") (result f64) (f64.const -0x0.000000000000180000000000p-1022))) -(assert_return (invoke "f") (f64.const -0x0.0000000000002p-1022)) -(module (func (export "f") (result f64) (f64.const +0x0.000000000000180000000001p-1022))) -(assert_return (invoke "f") (f64.const +0x0.0000000000002p-1022)) -(module (func (export "f") (result f64) (f64.const -0x0.000000000000180000000001p-1022))) -(assert_return (invoke "f") (f64.const -0x0.0000000000002p-1022)) -(module (func (export "f") (result f64) (f64.const +0x0.0000000000001fffffffffffp-1022))) -(assert_return (invoke "f") (f64.const +0x0.0000000000002p-1022)) -(module (func (export "f") (result f64) (f64.const -0x0.0000000000001fffffffffffp-1022))) -(assert_return (invoke "f") (f64.const -0x0.0000000000002p-1022)) -(module (func (export "f") (result f64) (f64.const +0x0.000000000000200000000000p-1022))) -(assert_return (invoke "f") (f64.const +0x0.0000000000002p-1022)) -(module (func (export "f") (result f64) (f64.const -0x0.000000000000200000000000p-1022))) -(assert_return (invoke "f") (f64.const -0x0.0000000000002p-1022)) -(module (func (export "f") (result f64) (f64.const +0x0.000000000000200000000001p-1022))) -(assert_return (invoke "f") (f64.const +0x0.0000000000002p-1022)) -(module (func (export "f") (result f64) (f64.const -0x0.000000000000200000000001p-1022))) -(assert_return (invoke "f") (f64.const -0x0.0000000000002p-1022)) -(module (func (export "f") (result f64) (f64.const +0x0.00000000000027ffffffffffp-1022))) -(assert_return (invoke "f") (f64.const +0x0.0000000000002p-1022)) -(module (func (export "f") (result f64) (f64.const -0x0.00000000000027ffffffffffp-1022))) -(assert_return (invoke "f") (f64.const -0x0.0000000000002p-1022)) -(module (func (export "f") (result f64) (f64.const +0x0.000000000000280000000000p-1022))) -(assert_return (invoke "f") (f64.const +0x0.0000000000002p-1022)) -(module (func (export "f") (result f64) (f64.const -0x0.000000000000280000000000p-1022))) -(assert_return (invoke "f") (f64.const -0x0.0000000000002p-1022)) -(module (func (export "f") (result f64) (f64.const +0x1.000000000000280000000001p-1022))) -(assert_return (invoke "f") (f64.const +0x1.0000000000003p-1022)) -(module (func (export "f") (result f64) (f64.const -0x1.000000000000280000000001p-1022))) -(assert_return (invoke "f") (f64.const -0x1.0000000000003p-1022)) - -;; f64, round down at limit to infinity -(module (func (export "f") (result f64) (f64.const +0x1.fffffffffffff4p1023))) -(assert_return (invoke "f") (f64.const +0x1.fffffffffffffp1023)) -(module (func (export "f") (result f64) (f64.const -0x1.fffffffffffff4p1023))) -(assert_return (invoke "f") (f64.const -0x1.fffffffffffffp1023)) -(module (func (export "f") (result f64) (f64.const +0x1.fffffffffffff7ffffffp1023))) -(assert_return (invoke "f") (f64.const +0x1.fffffffffffffp1023)) -(module (func (export "f") (result f64) (f64.const -0x1.fffffffffffff7ffffffp1023))) -(assert_return (invoke "f") (f64.const -0x1.fffffffffffffp1023)) - -(module - (func $id-f64 (param f64) (result f64) (local.get 0)) - (func (export "type-first-f64") (result f64) (call $id-f64 (f64.const 1.64))) -) -(assert_return (invoke "type-first-f64") (f64.const 1.64)) - -(module - (func (export "add") (param $x f64) (param $y f64) (result f64) (f64.add (local.get $x) (local.get $y))) - (func (export "sub") (param $x f64) (param $y f64) (result f64) (f64.sub (local.get $x) (local.get $y))) - (func (export "mul") (param $x f64) (param $y f64) (result f64) (f64.mul (local.get $x) (local.get $y))) - (func (export "div") (param $x f64) (param $y f64) (result f64) (f64.div (local.get $x) (local.get $y))) - (func (export "sqrt") (param $x f64) (result f64) (f64.sqrt (local.get $x))) - (func (export "min") (param $x f64) (param $y f64) (result f64) (f64.min (local.get $x) (local.get $y))) - (func (export "max") (param $x f64) (param $y f64) (result f64) (f64.max (local.get $x) (local.get $y))) - (func (export "ceil") (param $x f64) (result f64) (f64.ceil (local.get $x))) - (func (export "floor") (param $x f64) (result f64) (f64.floor (local.get $x))) - (func (export "trunc") (param $x f64) (result f64) (f64.trunc (local.get $x))) - (func (export "nearest") (param $x f64) (result f64) (f64.nearest (local.get $x))) -) - -(assert_return (invoke "add" (f64.const -0x0p+0) (f64.const -0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "add" (f64.const -0x0p+0) (f64.const 0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "add" (f64.const 0x0p+0) (f64.const -0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "add" (f64.const 0x0p+0) (f64.const 0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "add" (f64.const -0x0p+0) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "add" (f64.const -0x0p+0) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "add" (f64.const 0x0p+0) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "add" (f64.const 0x0p+0) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "add" (f64.const -0x0p+0) (f64.const -0x1p-1022)) (f64.const -0x1p-1022)) -(assert_return (invoke "add" (f64.const -0x0p+0) (f64.const 0x1p-1022)) (f64.const 0x1p-1022)) -(assert_return (invoke "add" (f64.const 0x0p+0) (f64.const -0x1p-1022)) (f64.const -0x1p-1022)) -(assert_return (invoke "add" (f64.const 0x0p+0) (f64.const 0x1p-1022)) (f64.const 0x1p-1022)) -(assert_return (invoke "add" (f64.const -0x0p+0) (f64.const -0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "add" (f64.const -0x0p+0) (f64.const 0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "add" (f64.const 0x0p+0) (f64.const -0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "add" (f64.const 0x0p+0) (f64.const 0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "add" (f64.const -0x0p+0) (f64.const -0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "add" (f64.const -0x0p+0) (f64.const 0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "add" (f64.const 0x0p+0) (f64.const -0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "add" (f64.const 0x0p+0) (f64.const 0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "add" (f64.const -0x0p+0) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "add" (f64.const -0x0p+0) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "add" (f64.const 0x0p+0) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "add" (f64.const 0x0p+0) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "add" (f64.const -0x0p+0) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const -0x0p+0) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const 0x0p+0) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const 0x0p+0) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const -0x0p+0) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "add" (f64.const -0x0p+0) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "add" (f64.const 0x0p+0) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "add" (f64.const 0x0p+0) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "add" (f64.const -0x0p+0) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const -0x0p+0) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -0x0p+0) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const -0x0p+0) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const 0x0p+0) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const 0x0p+0) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const 0x0p+0) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const 0x0p+0) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -0x0.0000000000001p-1022) (f64.const -0x0p+0)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "add" (f64.const -0x0.0000000000001p-1022) (f64.const 0x0p+0)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "add" (f64.const 0x0.0000000000001p-1022) (f64.const -0x0p+0)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "add" (f64.const 0x0.0000000000001p-1022) (f64.const 0x0p+0)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "add" (f64.const -0x0.0000000000001p-1022) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0.0000000000002p-1022)) -(assert_return (invoke "add" (f64.const -0x0.0000000000001p-1022) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "add" (f64.const 0x0.0000000000001p-1022) (f64.const -0x0.0000000000001p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "add" (f64.const 0x0.0000000000001p-1022) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0.0000000000002p-1022)) -(assert_return (invoke "add" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p-1022)) (f64.const -0x1.0000000000001p-1022)) -(assert_return (invoke "add" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p-1022)) (f64.const 0x0.fffffffffffffp-1022)) -(assert_return (invoke "add" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p-1022)) (f64.const -0x0.fffffffffffffp-1022)) -(assert_return (invoke "add" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p-1022)) (f64.const 0x1.0000000000001p-1022)) -(assert_return (invoke "add" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "add" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "add" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "add" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "add" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "add" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "add" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "add" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "add" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "add" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "add" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "add" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "add" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const -0x0.0000000000001p-1022) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "add" (f64.const -0x0.0000000000001p-1022) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "add" (f64.const 0x0.0000000000001p-1022) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "add" (f64.const 0x0.0000000000001p-1022) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "add" (f64.const -0x0.0000000000001p-1022) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const -0x0.0000000000001p-1022) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -0x0.0000000000001p-1022) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const -0x0.0000000000001p-1022) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const 0x0.0000000000001p-1022) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const 0x0.0000000000001p-1022) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const 0x0.0000000000001p-1022) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const 0x0.0000000000001p-1022) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -0x1p-1022) (f64.const -0x0p+0)) (f64.const -0x1p-1022)) -(assert_return (invoke "add" (f64.const -0x1p-1022) (f64.const 0x0p+0)) (f64.const -0x1p-1022)) -(assert_return (invoke "add" (f64.const 0x1p-1022) (f64.const -0x0p+0)) (f64.const 0x1p-1022)) -(assert_return (invoke "add" (f64.const 0x1p-1022) (f64.const 0x0p+0)) (f64.const 0x1p-1022)) -(assert_return (invoke "add" (f64.const -0x1p-1022) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x1.0000000000001p-1022)) -(assert_return (invoke "add" (f64.const -0x1p-1022) (f64.const 0x0.0000000000001p-1022)) (f64.const -0x0.fffffffffffffp-1022)) -(assert_return (invoke "add" (f64.const 0x1p-1022) (f64.const -0x0.0000000000001p-1022)) (f64.const 0x0.fffffffffffffp-1022)) -(assert_return (invoke "add" (f64.const 0x1p-1022) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x1.0000000000001p-1022)) -(assert_return (invoke "add" (f64.const -0x1p-1022) (f64.const -0x1p-1022)) (f64.const -0x1p-1021)) -(assert_return (invoke "add" (f64.const -0x1p-1022) (f64.const 0x1p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "add" (f64.const 0x1p-1022) (f64.const -0x1p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "add" (f64.const 0x1p-1022) (f64.const 0x1p-1022)) (f64.const 0x1p-1021)) -(assert_return (invoke "add" (f64.const -0x1p-1022) (f64.const -0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "add" (f64.const -0x1p-1022) (f64.const 0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "add" (f64.const 0x1p-1022) (f64.const -0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "add" (f64.const 0x1p-1022) (f64.const 0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "add" (f64.const -0x1p-1022) (f64.const -0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "add" (f64.const -0x1p-1022) (f64.const 0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "add" (f64.const 0x1p-1022) (f64.const -0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "add" (f64.const 0x1p-1022) (f64.const 0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "add" (f64.const -0x1p-1022) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "add" (f64.const -0x1p-1022) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "add" (f64.const 0x1p-1022) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "add" (f64.const 0x1p-1022) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "add" (f64.const -0x1p-1022) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const -0x1p-1022) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const 0x1p-1022) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const 0x1p-1022) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const -0x1p-1022) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "add" (f64.const -0x1p-1022) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "add" (f64.const 0x1p-1022) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "add" (f64.const 0x1p-1022) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "add" (f64.const -0x1p-1022) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const -0x1p-1022) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -0x1p-1022) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const -0x1p-1022) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const 0x1p-1022) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const 0x1p-1022) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const 0x1p-1022) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const 0x1p-1022) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -0x1p-1) (f64.const -0x0p+0)) (f64.const -0x1p-1)) -(assert_return (invoke "add" (f64.const -0x1p-1) (f64.const 0x0p+0)) (f64.const -0x1p-1)) -(assert_return (invoke "add" (f64.const 0x1p-1) (f64.const -0x0p+0)) (f64.const 0x1p-1)) -(assert_return (invoke "add" (f64.const 0x1p-1) (f64.const 0x0p+0)) (f64.const 0x1p-1)) -(assert_return (invoke "add" (f64.const -0x1p-1) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x1p-1)) -(assert_return (invoke "add" (f64.const -0x1p-1) (f64.const 0x0.0000000000001p-1022)) (f64.const -0x1p-1)) -(assert_return (invoke "add" (f64.const 0x1p-1) (f64.const -0x0.0000000000001p-1022)) (f64.const 0x1p-1)) -(assert_return (invoke "add" (f64.const 0x1p-1) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x1p-1)) -(assert_return (invoke "add" (f64.const -0x1p-1) (f64.const -0x1p-1022)) (f64.const -0x1p-1)) -(assert_return (invoke "add" (f64.const -0x1p-1) (f64.const 0x1p-1022)) (f64.const -0x1p-1)) -(assert_return (invoke "add" (f64.const 0x1p-1) (f64.const -0x1p-1022)) (f64.const 0x1p-1)) -(assert_return (invoke "add" (f64.const 0x1p-1) (f64.const 0x1p-1022)) (f64.const 0x1p-1)) -(assert_return (invoke "add" (f64.const -0x1p-1) (f64.const -0x1p-1)) (f64.const -0x1p+0)) -(assert_return (invoke "add" (f64.const -0x1p-1) (f64.const 0x1p-1)) (f64.const 0x0p+0)) -(assert_return (invoke "add" (f64.const 0x1p-1) (f64.const -0x1p-1)) (f64.const 0x0p+0)) -(assert_return (invoke "add" (f64.const 0x1p-1) (f64.const 0x1p-1)) (f64.const 0x1p+0)) -(assert_return (invoke "add" (f64.const -0x1p-1) (f64.const -0x1p+0)) (f64.const -0x1.8p+0)) -(assert_return (invoke "add" (f64.const -0x1p-1) (f64.const 0x1p+0)) (f64.const 0x1p-1)) -(assert_return (invoke "add" (f64.const 0x1p-1) (f64.const -0x1p+0)) (f64.const -0x1p-1)) -(assert_return (invoke "add" (f64.const 0x1p-1) (f64.const 0x1p+0)) (f64.const 0x1.8p+0)) -(assert_return (invoke "add" (f64.const -0x1p-1) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.b21fb54442d18p+2)) -(assert_return (invoke "add" (f64.const -0x1p-1) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.721fb54442d18p+2)) -(assert_return (invoke "add" (f64.const 0x1p-1) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.721fb54442d18p+2)) -(assert_return (invoke "add" (f64.const 0x1p-1) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.b21fb54442d18p+2)) -(assert_return (invoke "add" (f64.const -0x1p-1) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const -0x1p-1) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const 0x1p-1) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const 0x1p-1) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const -0x1p-1) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "add" (f64.const -0x1p-1) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "add" (f64.const 0x1p-1) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "add" (f64.const 0x1p-1) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "add" (f64.const -0x1p-1) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const -0x1p-1) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -0x1p-1) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const -0x1p-1) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const 0x1p-1) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const 0x1p-1) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const 0x1p-1) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const 0x1p-1) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -0x1p+0) (f64.const -0x0p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "add" (f64.const -0x1p+0) (f64.const 0x0p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "add" (f64.const 0x1p+0) (f64.const -0x0p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "add" (f64.const 0x1p+0) (f64.const 0x0p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "add" (f64.const -0x1p+0) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x1p+0)) -(assert_return (invoke "add" (f64.const -0x1p+0) (f64.const 0x0.0000000000001p-1022)) (f64.const -0x1p+0)) -(assert_return (invoke "add" (f64.const 0x1p+0) (f64.const -0x0.0000000000001p-1022)) (f64.const 0x1p+0)) -(assert_return (invoke "add" (f64.const 0x1p+0) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x1p+0)) -(assert_return (invoke "add" (f64.const -0x1p+0) (f64.const -0x1p-1022)) (f64.const -0x1p+0)) -(assert_return (invoke "add" (f64.const -0x1p+0) (f64.const 0x1p-1022)) (f64.const -0x1p+0)) -(assert_return (invoke "add" (f64.const 0x1p+0) (f64.const -0x1p-1022)) (f64.const 0x1p+0)) -(assert_return (invoke "add" (f64.const 0x1p+0) (f64.const 0x1p-1022)) (f64.const 0x1p+0)) -(assert_return (invoke "add" (f64.const -0x1p+0) (f64.const -0x1p-1)) (f64.const -0x1.8p+0)) -(assert_return (invoke "add" (f64.const -0x1p+0) (f64.const 0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "add" (f64.const 0x1p+0) (f64.const -0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "add" (f64.const 0x1p+0) (f64.const 0x1p-1)) (f64.const 0x1.8p+0)) -(assert_return (invoke "add" (f64.const -0x1p+0) (f64.const -0x1p+0)) (f64.const -0x1p+1)) -(assert_return (invoke "add" (f64.const -0x1p+0) (f64.const 0x1p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "add" (f64.const 0x1p+0) (f64.const -0x1p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "add" (f64.const 0x1p+0) (f64.const 0x1p+0)) (f64.const 0x1p+1)) -(assert_return (invoke "add" (f64.const -0x1p+0) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.d21fb54442d18p+2)) -(assert_return (invoke "add" (f64.const -0x1p+0) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.521fb54442d18p+2)) -(assert_return (invoke "add" (f64.const 0x1p+0) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.521fb54442d18p+2)) -(assert_return (invoke "add" (f64.const 0x1p+0) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.d21fb54442d18p+2)) -(assert_return (invoke "add" (f64.const -0x1p+0) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const -0x1p+0) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const 0x1p+0) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const 0x1p+0) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const -0x1p+0) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "add" (f64.const -0x1p+0) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "add" (f64.const 0x1p+0) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "add" (f64.const 0x1p+0) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "add" (f64.const -0x1p+0) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const -0x1p+0) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -0x1p+0) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const -0x1p+0) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const 0x1p+0) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const 0x1p+0) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const 0x1p+0) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const 0x1p+0) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x0p+0)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "add" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x0p+0)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "add" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x0p+0)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "add" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x0p+0)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "add" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "add" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x0.0000000000001p-1022)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "add" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x0.0000000000001p-1022)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "add" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "add" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p-1022)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "add" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p-1022)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "add" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p-1022)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "add" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p-1022)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "add" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p-1)) (f64.const -0x1.b21fb54442d18p+2)) -(assert_return (invoke "add" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p-1)) (f64.const -0x1.721fb54442d18p+2)) -(assert_return (invoke "add" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p-1)) (f64.const 0x1.721fb54442d18p+2)) -(assert_return (invoke "add" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p-1)) (f64.const 0x1.b21fb54442d18p+2)) -(assert_return (invoke "add" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p+0)) (f64.const -0x1.d21fb54442d18p+2)) -(assert_return (invoke "add" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p+0)) (f64.const -0x1.521fb54442d18p+2)) -(assert_return (invoke "add" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p+0)) (f64.const 0x1.521fb54442d18p+2)) -(assert_return (invoke "add" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p+0)) (f64.const 0x1.d21fb54442d18p+2)) -(assert_return (invoke "add" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+3)) -(assert_return (invoke "add" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x0p+0)) -(assert_return (invoke "add" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x0p+0)) -(assert_return (invoke "add" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+3)) -(assert_return (invoke "add" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const -0x1.921fb54442d18p+2) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "add" (f64.const -0x1.921fb54442d18p+2) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "add" (f64.const 0x1.921fb54442d18p+2) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "add" (f64.const 0x1.921fb54442d18p+2) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "add" (f64.const -0x1.921fb54442d18p+2) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const -0x1.921fb54442d18p+2) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -0x1.921fb54442d18p+2) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const -0x1.921fb54442d18p+2) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const 0x1.921fb54442d18p+2) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const 0x1.921fb54442d18p+2) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const 0x1.921fb54442d18p+2) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const 0x1.921fb54442d18p+2) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x0p+0)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x0p+0)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x0p+0)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x0p+0)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x0.0000000000001p-1022)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x0.0000000000001p-1022)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p-1022)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p-1022)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p-1022)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p-1022)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p-1)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p-1)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p-1)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p-1)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p+0)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p+0)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p+0)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p+0)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1.921fb54442d18p+2)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "add" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -inf)) -(assert_return (invoke "add" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x0p+0)) -(assert_return (invoke "add" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1.fffffffffffffp+1023)) (f64.const 0x0p+0)) -(assert_return (invoke "add" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1.fffffffffffffp+1023)) (f64.const inf)) -(assert_return (invoke "add" (f64.const -0x1.fffffffffffffp+1023) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "add" (f64.const -0x1.fffffffffffffp+1023) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "add" (f64.const 0x1.fffffffffffffp+1023) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "add" (f64.const 0x1.fffffffffffffp+1023) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "add" (f64.const -0x1.fffffffffffffp+1023) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const -0x1.fffffffffffffp+1023) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -0x1.fffffffffffffp+1023) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const -0x1.fffffffffffffp+1023) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const 0x1.fffffffffffffp+1023) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const 0x1.fffffffffffffp+1023) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const 0x1.fffffffffffffp+1023) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const 0x1.fffffffffffffp+1023) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -inf) (f64.const -0x0p+0)) (f64.const -inf)) -(assert_return (invoke "add" (f64.const -inf) (f64.const 0x0p+0)) (f64.const -inf)) -(assert_return (invoke "add" (f64.const inf) (f64.const -0x0p+0)) (f64.const inf)) -(assert_return (invoke "add" (f64.const inf) (f64.const 0x0p+0)) (f64.const inf)) -(assert_return (invoke "add" (f64.const -inf) (f64.const -0x0.0000000000001p-1022)) (f64.const -inf)) -(assert_return (invoke "add" (f64.const -inf) (f64.const 0x0.0000000000001p-1022)) (f64.const -inf)) -(assert_return (invoke "add" (f64.const inf) (f64.const -0x0.0000000000001p-1022)) (f64.const inf)) -(assert_return (invoke "add" (f64.const inf) (f64.const 0x0.0000000000001p-1022)) (f64.const inf)) -(assert_return (invoke "add" (f64.const -inf) (f64.const -0x1p-1022)) (f64.const -inf)) -(assert_return (invoke "add" (f64.const -inf) (f64.const 0x1p-1022)) (f64.const -inf)) -(assert_return (invoke "add" (f64.const inf) (f64.const -0x1p-1022)) (f64.const inf)) -(assert_return (invoke "add" (f64.const inf) (f64.const 0x1p-1022)) (f64.const inf)) -(assert_return (invoke "add" (f64.const -inf) (f64.const -0x1p-1)) (f64.const -inf)) -(assert_return (invoke "add" (f64.const -inf) (f64.const 0x1p-1)) (f64.const -inf)) -(assert_return (invoke "add" (f64.const inf) (f64.const -0x1p-1)) (f64.const inf)) -(assert_return (invoke "add" (f64.const inf) (f64.const 0x1p-1)) (f64.const inf)) -(assert_return (invoke "add" (f64.const -inf) (f64.const -0x1p+0)) (f64.const -inf)) -(assert_return (invoke "add" (f64.const -inf) (f64.const 0x1p+0)) (f64.const -inf)) -(assert_return (invoke "add" (f64.const inf) (f64.const -0x1p+0)) (f64.const inf)) -(assert_return (invoke "add" (f64.const inf) (f64.const 0x1p+0)) (f64.const inf)) -(assert_return (invoke "add" (f64.const -inf) (f64.const -0x1.921fb54442d18p+2)) (f64.const -inf)) -(assert_return (invoke "add" (f64.const -inf) (f64.const 0x1.921fb54442d18p+2)) (f64.const -inf)) -(assert_return (invoke "add" (f64.const inf) (f64.const -0x1.921fb54442d18p+2)) (f64.const inf)) -(assert_return (invoke "add" (f64.const inf) (f64.const 0x1.921fb54442d18p+2)) (f64.const inf)) -(assert_return (invoke "add" (f64.const -inf) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -inf)) -(assert_return (invoke "add" (f64.const -inf) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -inf)) -(assert_return (invoke "add" (f64.const inf) (f64.const -0x1.fffffffffffffp+1023)) (f64.const inf)) -(assert_return (invoke "add" (f64.const inf) (f64.const 0x1.fffffffffffffp+1023)) (f64.const inf)) -(assert_return (invoke "add" (f64.const -inf) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "add" (f64.const -inf) (f64.const inf)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const inf) (f64.const -inf)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const inf) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "add" (f64.const -inf) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const -inf) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -inf) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const -inf) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const inf) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const inf) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const inf) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const inf) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -nan) (f64.const -0x0p+0)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const -nan:0x4000000000000) (f64.const -0x0p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -nan) (f64.const 0x0p+0)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const -nan:0x4000000000000) (f64.const 0x0p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const nan) (f64.const -0x0p+0)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const nan:0x4000000000000) (f64.const -0x0p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const nan) (f64.const 0x0p+0)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const nan:0x4000000000000) (f64.const 0x0p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -nan) (f64.const -0x0.0000000000001p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const -nan:0x4000000000000) (f64.const -0x0.0000000000001p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -nan) (f64.const 0x0.0000000000001p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const -nan:0x4000000000000) (f64.const 0x0.0000000000001p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const nan) (f64.const -0x0.0000000000001p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const nan:0x4000000000000) (f64.const -0x0.0000000000001p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const nan) (f64.const 0x0.0000000000001p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const nan:0x4000000000000) (f64.const 0x0.0000000000001p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -nan) (f64.const -0x1p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const -nan:0x4000000000000) (f64.const -0x1p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -nan) (f64.const 0x1p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const -nan:0x4000000000000) (f64.const 0x1p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const nan) (f64.const -0x1p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const nan:0x4000000000000) (f64.const -0x1p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const nan) (f64.const 0x1p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const nan:0x4000000000000) (f64.const 0x1p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -nan) (f64.const -0x1p-1)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const -nan:0x4000000000000) (f64.const -0x1p-1)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -nan) (f64.const 0x1p-1)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const -nan:0x4000000000000) (f64.const 0x1p-1)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const nan) (f64.const -0x1p-1)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const nan:0x4000000000000) (f64.const -0x1p-1)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const nan) (f64.const 0x1p-1)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const nan:0x4000000000000) (f64.const 0x1p-1)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -nan) (f64.const -0x1p+0)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const -nan:0x4000000000000) (f64.const -0x1p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -nan) (f64.const 0x1p+0)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const -nan:0x4000000000000) (f64.const 0x1p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const nan) (f64.const -0x1p+0)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const nan:0x4000000000000) (f64.const -0x1p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const nan) (f64.const 0x1p+0)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const nan:0x4000000000000) (f64.const 0x1p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -nan) (f64.const -0x1.921fb54442d18p+2)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const -nan:0x4000000000000) (f64.const -0x1.921fb54442d18p+2)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -nan) (f64.const 0x1.921fb54442d18p+2)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const -nan:0x4000000000000) (f64.const 0x1.921fb54442d18p+2)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const nan) (f64.const -0x1.921fb54442d18p+2)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const nan:0x4000000000000) (f64.const -0x1.921fb54442d18p+2)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const nan) (f64.const 0x1.921fb54442d18p+2)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const nan:0x4000000000000) (f64.const 0x1.921fb54442d18p+2)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -nan) (f64.const -0x1.fffffffffffffp+1023)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const -nan:0x4000000000000) (f64.const -0x1.fffffffffffffp+1023)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -nan) (f64.const 0x1.fffffffffffffp+1023)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const -nan:0x4000000000000) (f64.const 0x1.fffffffffffffp+1023)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const nan) (f64.const -0x1.fffffffffffffp+1023)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const nan:0x4000000000000) (f64.const -0x1.fffffffffffffp+1023)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const nan) (f64.const 0x1.fffffffffffffp+1023)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const nan:0x4000000000000) (f64.const 0x1.fffffffffffffp+1023)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -nan) (f64.const -inf)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const -nan:0x4000000000000) (f64.const -inf)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -nan) (f64.const inf)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const -nan:0x4000000000000) (f64.const inf)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const nan) (f64.const -inf)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const nan:0x4000000000000) (f64.const -inf)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const nan) (f64.const inf)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const nan:0x4000000000000) (f64.const inf)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -nan) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const -nan:0x4000000000000) (f64.const -nan)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -nan) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -nan:0x4000000000000) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -nan) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const -nan:0x4000000000000) (f64.const nan)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -nan) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const -nan:0x4000000000000) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const nan) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const nan:0x4000000000000) (f64.const -nan)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const nan) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const nan:0x4000000000000) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const nan) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "add" (f64.const nan:0x4000000000000) (f64.const nan)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const nan) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "add" (f64.const nan:0x4000000000000) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -0x0p+0) (f64.const -0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "sub" (f64.const -0x0p+0) (f64.const 0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "sub" (f64.const 0x0p+0) (f64.const -0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "sub" (f64.const 0x0p+0) (f64.const 0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "sub" (f64.const -0x0p+0) (f64.const -0x0.0000000000001p-1022)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "sub" (f64.const -0x0p+0) (f64.const 0x0.0000000000001p-1022)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "sub" (f64.const 0x0p+0) (f64.const -0x0.0000000000001p-1022)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "sub" (f64.const 0x0p+0) (f64.const 0x0.0000000000001p-1022)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "sub" (f64.const -0x0p+0) (f64.const -0x1p-1022)) (f64.const 0x1p-1022)) -(assert_return (invoke "sub" (f64.const -0x0p+0) (f64.const 0x1p-1022)) (f64.const -0x1p-1022)) -(assert_return (invoke "sub" (f64.const 0x0p+0) (f64.const -0x1p-1022)) (f64.const 0x1p-1022)) -(assert_return (invoke "sub" (f64.const 0x0p+0) (f64.const 0x1p-1022)) (f64.const -0x1p-1022)) -(assert_return (invoke "sub" (f64.const -0x0p+0) (f64.const -0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "sub" (f64.const -0x0p+0) (f64.const 0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "sub" (f64.const 0x0p+0) (f64.const -0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "sub" (f64.const 0x0p+0) (f64.const 0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "sub" (f64.const -0x0p+0) (f64.const -0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "sub" (f64.const -0x0p+0) (f64.const 0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "sub" (f64.const 0x0p+0) (f64.const -0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "sub" (f64.const 0x0p+0) (f64.const 0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "sub" (f64.const -0x0p+0) (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const -0x0p+0) (f64.const 0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const 0x0p+0) (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const 0x0p+0) (f64.const 0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const -0x0p+0) (f64.const -0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const -0x0p+0) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const 0x0p+0) (f64.const -0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const 0x0p+0) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const -0x0p+0) (f64.const -inf)) (f64.const inf)) -(assert_return (invoke "sub" (f64.const -0x0p+0) (f64.const inf)) (f64.const -inf)) -(assert_return (invoke "sub" (f64.const 0x0p+0) (f64.const -inf)) (f64.const inf)) -(assert_return (invoke "sub" (f64.const 0x0p+0) (f64.const inf)) (f64.const -inf)) -(assert_return (invoke "sub" (f64.const -0x0p+0) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const -0x0p+0) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -0x0p+0) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const -0x0p+0) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const 0x0p+0) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const 0x0p+0) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const 0x0p+0) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const 0x0p+0) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -0x0.0000000000001p-1022) (f64.const -0x0p+0)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "sub" (f64.const -0x0.0000000000001p-1022) (f64.const 0x0p+0)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "sub" (f64.const 0x0.0000000000001p-1022) (f64.const -0x0p+0)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "sub" (f64.const 0x0.0000000000001p-1022) (f64.const 0x0p+0)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "sub" (f64.const -0x0.0000000000001p-1022) (f64.const -0x0.0000000000001p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "sub" (f64.const -0x0.0000000000001p-1022) (f64.const 0x0.0000000000001p-1022)) (f64.const -0x0.0000000000002p-1022)) -(assert_return (invoke "sub" (f64.const 0x0.0000000000001p-1022) (f64.const -0x0.0000000000001p-1022)) (f64.const 0x0.0000000000002p-1022)) -(assert_return (invoke "sub" (f64.const 0x0.0000000000001p-1022) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "sub" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p-1022)) (f64.const 0x0.fffffffffffffp-1022)) -(assert_return (invoke "sub" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p-1022)) (f64.const -0x1.0000000000001p-1022)) -(assert_return (invoke "sub" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p-1022)) (f64.const 0x1.0000000000001p-1022)) -(assert_return (invoke "sub" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p-1022)) (f64.const -0x0.fffffffffffffp-1022)) -(assert_return (invoke "sub" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "sub" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "sub" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "sub" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "sub" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "sub" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "sub" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "sub" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "sub" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const -0x0.0000000000001p-1022) (f64.const -inf)) (f64.const inf)) -(assert_return (invoke "sub" (f64.const -0x0.0000000000001p-1022) (f64.const inf)) (f64.const -inf)) -(assert_return (invoke "sub" (f64.const 0x0.0000000000001p-1022) (f64.const -inf)) (f64.const inf)) -(assert_return (invoke "sub" (f64.const 0x0.0000000000001p-1022) (f64.const inf)) (f64.const -inf)) -(assert_return (invoke "sub" (f64.const -0x0.0000000000001p-1022) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const -0x0.0000000000001p-1022) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -0x0.0000000000001p-1022) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const -0x0.0000000000001p-1022) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const 0x0.0000000000001p-1022) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const 0x0.0000000000001p-1022) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const 0x0.0000000000001p-1022) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const 0x0.0000000000001p-1022) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -0x1p-1022) (f64.const -0x0p+0)) (f64.const -0x1p-1022)) -(assert_return (invoke "sub" (f64.const -0x1p-1022) (f64.const 0x0p+0)) (f64.const -0x1p-1022)) -(assert_return (invoke "sub" (f64.const 0x1p-1022) (f64.const -0x0p+0)) (f64.const 0x1p-1022)) -(assert_return (invoke "sub" (f64.const 0x1p-1022) (f64.const 0x0p+0)) (f64.const 0x1p-1022)) -(assert_return (invoke "sub" (f64.const -0x1p-1022) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0.fffffffffffffp-1022)) -(assert_return (invoke "sub" (f64.const -0x1p-1022) (f64.const 0x0.0000000000001p-1022)) (f64.const -0x1.0000000000001p-1022)) -(assert_return (invoke "sub" (f64.const 0x1p-1022) (f64.const -0x0.0000000000001p-1022)) (f64.const 0x1.0000000000001p-1022)) -(assert_return (invoke "sub" (f64.const 0x1p-1022) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0.fffffffffffffp-1022)) -(assert_return (invoke "sub" (f64.const -0x1p-1022) (f64.const -0x1p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "sub" (f64.const -0x1p-1022) (f64.const 0x1p-1022)) (f64.const -0x1p-1021)) -(assert_return (invoke "sub" (f64.const 0x1p-1022) (f64.const -0x1p-1022)) (f64.const 0x1p-1021)) -(assert_return (invoke "sub" (f64.const 0x1p-1022) (f64.const 0x1p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "sub" (f64.const -0x1p-1022) (f64.const -0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "sub" (f64.const -0x1p-1022) (f64.const 0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "sub" (f64.const 0x1p-1022) (f64.const -0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "sub" (f64.const 0x1p-1022) (f64.const 0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "sub" (f64.const -0x1p-1022) (f64.const -0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "sub" (f64.const -0x1p-1022) (f64.const 0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "sub" (f64.const 0x1p-1022) (f64.const -0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "sub" (f64.const 0x1p-1022) (f64.const 0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "sub" (f64.const -0x1p-1022) (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const -0x1p-1022) (f64.const 0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const 0x1p-1022) (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const 0x1p-1022) (f64.const 0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const -0x1p-1022) (f64.const -0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const -0x1p-1022) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const 0x1p-1022) (f64.const -0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const 0x1p-1022) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const -0x1p-1022) (f64.const -inf)) (f64.const inf)) -(assert_return (invoke "sub" (f64.const -0x1p-1022) (f64.const inf)) (f64.const -inf)) -(assert_return (invoke "sub" (f64.const 0x1p-1022) (f64.const -inf)) (f64.const inf)) -(assert_return (invoke "sub" (f64.const 0x1p-1022) (f64.const inf)) (f64.const -inf)) -(assert_return (invoke "sub" (f64.const -0x1p-1022) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const -0x1p-1022) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -0x1p-1022) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const -0x1p-1022) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const 0x1p-1022) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const 0x1p-1022) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const 0x1p-1022) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const 0x1p-1022) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -0x1p-1) (f64.const -0x0p+0)) (f64.const -0x1p-1)) -(assert_return (invoke "sub" (f64.const -0x1p-1) (f64.const 0x0p+0)) (f64.const -0x1p-1)) -(assert_return (invoke "sub" (f64.const 0x1p-1) (f64.const -0x0p+0)) (f64.const 0x1p-1)) -(assert_return (invoke "sub" (f64.const 0x1p-1) (f64.const 0x0p+0)) (f64.const 0x1p-1)) -(assert_return (invoke "sub" (f64.const -0x1p-1) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x1p-1)) -(assert_return (invoke "sub" (f64.const -0x1p-1) (f64.const 0x0.0000000000001p-1022)) (f64.const -0x1p-1)) -(assert_return (invoke "sub" (f64.const 0x1p-1) (f64.const -0x0.0000000000001p-1022)) (f64.const 0x1p-1)) -(assert_return (invoke "sub" (f64.const 0x1p-1) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x1p-1)) -(assert_return (invoke "sub" (f64.const -0x1p-1) (f64.const -0x1p-1022)) (f64.const -0x1p-1)) -(assert_return (invoke "sub" (f64.const -0x1p-1) (f64.const 0x1p-1022)) (f64.const -0x1p-1)) -(assert_return (invoke "sub" (f64.const 0x1p-1) (f64.const -0x1p-1022)) (f64.const 0x1p-1)) -(assert_return (invoke "sub" (f64.const 0x1p-1) (f64.const 0x1p-1022)) (f64.const 0x1p-1)) -(assert_return (invoke "sub" (f64.const -0x1p-1) (f64.const -0x1p-1)) (f64.const 0x0p+0)) -(assert_return (invoke "sub" (f64.const -0x1p-1) (f64.const 0x1p-1)) (f64.const -0x1p+0)) -(assert_return (invoke "sub" (f64.const 0x1p-1) (f64.const -0x1p-1)) (f64.const 0x1p+0)) -(assert_return (invoke "sub" (f64.const 0x1p-1) (f64.const 0x1p-1)) (f64.const 0x0p+0)) -(assert_return (invoke "sub" (f64.const -0x1p-1) (f64.const -0x1p+0)) (f64.const 0x1p-1)) -(assert_return (invoke "sub" (f64.const -0x1p-1) (f64.const 0x1p+0)) (f64.const -0x1.8p+0)) -(assert_return (invoke "sub" (f64.const 0x1p-1) (f64.const -0x1p+0)) (f64.const 0x1.8p+0)) -(assert_return (invoke "sub" (f64.const 0x1p-1) (f64.const 0x1p+0)) (f64.const -0x1p-1)) -(assert_return (invoke "sub" (f64.const -0x1p-1) (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x1.721fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const -0x1p-1) (f64.const 0x1.921fb54442d18p+2)) (f64.const -0x1.b21fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const 0x1p-1) (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x1.b21fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const 0x1p-1) (f64.const 0x1.921fb54442d18p+2)) (f64.const -0x1.721fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const -0x1p-1) (f64.const -0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const -0x1p-1) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const 0x1p-1) (f64.const -0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const 0x1p-1) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const -0x1p-1) (f64.const -inf)) (f64.const inf)) -(assert_return (invoke "sub" (f64.const -0x1p-1) (f64.const inf)) (f64.const -inf)) -(assert_return (invoke "sub" (f64.const 0x1p-1) (f64.const -inf)) (f64.const inf)) -(assert_return (invoke "sub" (f64.const 0x1p-1) (f64.const inf)) (f64.const -inf)) -(assert_return (invoke "sub" (f64.const -0x1p-1) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const -0x1p-1) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -0x1p-1) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const -0x1p-1) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const 0x1p-1) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const 0x1p-1) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const 0x1p-1) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const 0x1p-1) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -0x1p+0) (f64.const -0x0p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "sub" (f64.const -0x1p+0) (f64.const 0x0p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "sub" (f64.const 0x1p+0) (f64.const -0x0p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "sub" (f64.const 0x1p+0) (f64.const 0x0p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "sub" (f64.const -0x1p+0) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x1p+0)) -(assert_return (invoke "sub" (f64.const -0x1p+0) (f64.const 0x0.0000000000001p-1022)) (f64.const -0x1p+0)) -(assert_return (invoke "sub" (f64.const 0x1p+0) (f64.const -0x0.0000000000001p-1022)) (f64.const 0x1p+0)) -(assert_return (invoke "sub" (f64.const 0x1p+0) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x1p+0)) -(assert_return (invoke "sub" (f64.const -0x1p+0) (f64.const -0x1p-1022)) (f64.const -0x1p+0)) -(assert_return (invoke "sub" (f64.const -0x1p+0) (f64.const 0x1p-1022)) (f64.const -0x1p+0)) -(assert_return (invoke "sub" (f64.const 0x1p+0) (f64.const -0x1p-1022)) (f64.const 0x1p+0)) -(assert_return (invoke "sub" (f64.const 0x1p+0) (f64.const 0x1p-1022)) (f64.const 0x1p+0)) -(assert_return (invoke "sub" (f64.const -0x1p+0) (f64.const -0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "sub" (f64.const -0x1p+0) (f64.const 0x1p-1)) (f64.const -0x1.8p+0)) -(assert_return (invoke "sub" (f64.const 0x1p+0) (f64.const -0x1p-1)) (f64.const 0x1.8p+0)) -(assert_return (invoke "sub" (f64.const 0x1p+0) (f64.const 0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "sub" (f64.const -0x1p+0) (f64.const -0x1p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "sub" (f64.const -0x1p+0) (f64.const 0x1p+0)) (f64.const -0x1p+1)) -(assert_return (invoke "sub" (f64.const 0x1p+0) (f64.const -0x1p+0)) (f64.const 0x1p+1)) -(assert_return (invoke "sub" (f64.const 0x1p+0) (f64.const 0x1p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "sub" (f64.const -0x1p+0) (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x1.521fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const -0x1p+0) (f64.const 0x1.921fb54442d18p+2)) (f64.const -0x1.d21fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const 0x1p+0) (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x1.d21fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const 0x1p+0) (f64.const 0x1.921fb54442d18p+2)) (f64.const -0x1.521fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const -0x1p+0) (f64.const -0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const -0x1p+0) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const 0x1p+0) (f64.const -0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const 0x1p+0) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const -0x1p+0) (f64.const -inf)) (f64.const inf)) -(assert_return (invoke "sub" (f64.const -0x1p+0) (f64.const inf)) (f64.const -inf)) -(assert_return (invoke "sub" (f64.const 0x1p+0) (f64.const -inf)) (f64.const inf)) -(assert_return (invoke "sub" (f64.const 0x1p+0) (f64.const inf)) (f64.const -inf)) -(assert_return (invoke "sub" (f64.const -0x1p+0) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const -0x1p+0) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -0x1p+0) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const -0x1p+0) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const 0x1p+0) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const 0x1p+0) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const 0x1p+0) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const 0x1p+0) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x0p+0)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x0p+0)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x0p+0)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x0p+0)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x0.0000000000001p-1022)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x0.0000000000001p-1022)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p-1022)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p-1022)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p-1022)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p-1022)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p-1)) (f64.const -0x1.721fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p-1)) (f64.const -0x1.b21fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p-1)) (f64.const 0x1.b21fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p-1)) (f64.const 0x1.721fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p+0)) (f64.const -0x1.521fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p+0)) (f64.const -0x1.d21fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p+0)) (f64.const 0x1.d21fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p+0)) (f64.const 0x1.521fb54442d18p+2)) -(assert_return (invoke "sub" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x0p+0)) -(assert_return (invoke "sub" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+3)) -(assert_return (invoke "sub" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+3)) -(assert_return (invoke "sub" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x0p+0)) -(assert_return (invoke "sub" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const -0x1.921fb54442d18p+2) (f64.const -inf)) (f64.const inf)) -(assert_return (invoke "sub" (f64.const -0x1.921fb54442d18p+2) (f64.const inf)) (f64.const -inf)) -(assert_return (invoke "sub" (f64.const 0x1.921fb54442d18p+2) (f64.const -inf)) (f64.const inf)) -(assert_return (invoke "sub" (f64.const 0x1.921fb54442d18p+2) (f64.const inf)) (f64.const -inf)) -(assert_return (invoke "sub" (f64.const -0x1.921fb54442d18p+2) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const -0x1.921fb54442d18p+2) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -0x1.921fb54442d18p+2) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const -0x1.921fb54442d18p+2) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const 0x1.921fb54442d18p+2) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const 0x1.921fb54442d18p+2) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const 0x1.921fb54442d18p+2) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const 0x1.921fb54442d18p+2) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x0p+0)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x0p+0)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x0p+0)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x0p+0)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x0.0000000000001p-1022)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x0.0000000000001p-1022)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p-1022)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p-1022)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p-1022)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p-1022)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p-1)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p-1)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p-1)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p-1)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p+0)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p+0)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p+0)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p+0)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1.921fb54442d18p+2)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "sub" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1.fffffffffffffp+1023)) (f64.const 0x0p+0)) -(assert_return (invoke "sub" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -inf)) -(assert_return (invoke "sub" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1.fffffffffffffp+1023)) (f64.const inf)) -(assert_return (invoke "sub" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x0p+0)) -(assert_return (invoke "sub" (f64.const -0x1.fffffffffffffp+1023) (f64.const -inf)) (f64.const inf)) -(assert_return (invoke "sub" (f64.const -0x1.fffffffffffffp+1023) (f64.const inf)) (f64.const -inf)) -(assert_return (invoke "sub" (f64.const 0x1.fffffffffffffp+1023) (f64.const -inf)) (f64.const inf)) -(assert_return (invoke "sub" (f64.const 0x1.fffffffffffffp+1023) (f64.const inf)) (f64.const -inf)) -(assert_return (invoke "sub" (f64.const -0x1.fffffffffffffp+1023) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const -0x1.fffffffffffffp+1023) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -0x1.fffffffffffffp+1023) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const -0x1.fffffffffffffp+1023) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const 0x1.fffffffffffffp+1023) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const 0x1.fffffffffffffp+1023) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const 0x1.fffffffffffffp+1023) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const 0x1.fffffffffffffp+1023) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -inf) (f64.const -0x0p+0)) (f64.const -inf)) -(assert_return (invoke "sub" (f64.const -inf) (f64.const 0x0p+0)) (f64.const -inf)) -(assert_return (invoke "sub" (f64.const inf) (f64.const -0x0p+0)) (f64.const inf)) -(assert_return (invoke "sub" (f64.const inf) (f64.const 0x0p+0)) (f64.const inf)) -(assert_return (invoke "sub" (f64.const -inf) (f64.const -0x0.0000000000001p-1022)) (f64.const -inf)) -(assert_return (invoke "sub" (f64.const -inf) (f64.const 0x0.0000000000001p-1022)) (f64.const -inf)) -(assert_return (invoke "sub" (f64.const inf) (f64.const -0x0.0000000000001p-1022)) (f64.const inf)) -(assert_return (invoke "sub" (f64.const inf) (f64.const 0x0.0000000000001p-1022)) (f64.const inf)) -(assert_return (invoke "sub" (f64.const -inf) (f64.const -0x1p-1022)) (f64.const -inf)) -(assert_return (invoke "sub" (f64.const -inf) (f64.const 0x1p-1022)) (f64.const -inf)) -(assert_return (invoke "sub" (f64.const inf) (f64.const -0x1p-1022)) (f64.const inf)) -(assert_return (invoke "sub" (f64.const inf) (f64.const 0x1p-1022)) (f64.const inf)) -(assert_return (invoke "sub" (f64.const -inf) (f64.const -0x1p-1)) (f64.const -inf)) -(assert_return (invoke "sub" (f64.const -inf) (f64.const 0x1p-1)) (f64.const -inf)) -(assert_return (invoke "sub" (f64.const inf) (f64.const -0x1p-1)) (f64.const inf)) -(assert_return (invoke "sub" (f64.const inf) (f64.const 0x1p-1)) (f64.const inf)) -(assert_return (invoke "sub" (f64.const -inf) (f64.const -0x1p+0)) (f64.const -inf)) -(assert_return (invoke "sub" (f64.const -inf) (f64.const 0x1p+0)) (f64.const -inf)) -(assert_return (invoke "sub" (f64.const inf) (f64.const -0x1p+0)) (f64.const inf)) -(assert_return (invoke "sub" (f64.const inf) (f64.const 0x1p+0)) (f64.const inf)) -(assert_return (invoke "sub" (f64.const -inf) (f64.const -0x1.921fb54442d18p+2)) (f64.const -inf)) -(assert_return (invoke "sub" (f64.const -inf) (f64.const 0x1.921fb54442d18p+2)) (f64.const -inf)) -(assert_return (invoke "sub" (f64.const inf) (f64.const -0x1.921fb54442d18p+2)) (f64.const inf)) -(assert_return (invoke "sub" (f64.const inf) (f64.const 0x1.921fb54442d18p+2)) (f64.const inf)) -(assert_return (invoke "sub" (f64.const -inf) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -inf)) -(assert_return (invoke "sub" (f64.const -inf) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -inf)) -(assert_return (invoke "sub" (f64.const inf) (f64.const -0x1.fffffffffffffp+1023)) (f64.const inf)) -(assert_return (invoke "sub" (f64.const inf) (f64.const 0x1.fffffffffffffp+1023)) (f64.const inf)) -(assert_return (invoke "sub" (f64.const -inf) (f64.const -inf)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const -inf) (f64.const inf)) (f64.const -inf)) -(assert_return (invoke "sub" (f64.const inf) (f64.const -inf)) (f64.const inf)) -(assert_return (invoke "sub" (f64.const inf) (f64.const inf)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const -inf) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const -inf) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -inf) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const -inf) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const inf) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const inf) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const inf) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const inf) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -nan) (f64.const -0x0p+0)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const -nan:0x4000000000000) (f64.const -0x0p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -nan) (f64.const 0x0p+0)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const -nan:0x4000000000000) (f64.const 0x0p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const nan) (f64.const -0x0p+0)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const nan:0x4000000000000) (f64.const -0x0p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const nan) (f64.const 0x0p+0)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const nan:0x4000000000000) (f64.const 0x0p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -nan) (f64.const -0x0.0000000000001p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const -nan:0x4000000000000) (f64.const -0x0.0000000000001p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -nan) (f64.const 0x0.0000000000001p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const -nan:0x4000000000000) (f64.const 0x0.0000000000001p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const nan) (f64.const -0x0.0000000000001p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const nan:0x4000000000000) (f64.const -0x0.0000000000001p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const nan) (f64.const 0x0.0000000000001p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const nan:0x4000000000000) (f64.const 0x0.0000000000001p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -nan) (f64.const -0x1p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const -nan:0x4000000000000) (f64.const -0x1p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -nan) (f64.const 0x1p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const -nan:0x4000000000000) (f64.const 0x1p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const nan) (f64.const -0x1p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const nan:0x4000000000000) (f64.const -0x1p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const nan) (f64.const 0x1p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const nan:0x4000000000000) (f64.const 0x1p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -nan) (f64.const -0x1p-1)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const -nan:0x4000000000000) (f64.const -0x1p-1)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -nan) (f64.const 0x1p-1)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const -nan:0x4000000000000) (f64.const 0x1p-1)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const nan) (f64.const -0x1p-1)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const nan:0x4000000000000) (f64.const -0x1p-1)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const nan) (f64.const 0x1p-1)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const nan:0x4000000000000) (f64.const 0x1p-1)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -nan) (f64.const -0x1p+0)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const -nan:0x4000000000000) (f64.const -0x1p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -nan) (f64.const 0x1p+0)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const -nan:0x4000000000000) (f64.const 0x1p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const nan) (f64.const -0x1p+0)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const nan:0x4000000000000) (f64.const -0x1p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const nan) (f64.const 0x1p+0)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const nan:0x4000000000000) (f64.const 0x1p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -nan) (f64.const -0x1.921fb54442d18p+2)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const -nan:0x4000000000000) (f64.const -0x1.921fb54442d18p+2)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -nan) (f64.const 0x1.921fb54442d18p+2)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const -nan:0x4000000000000) (f64.const 0x1.921fb54442d18p+2)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const nan) (f64.const -0x1.921fb54442d18p+2)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const nan:0x4000000000000) (f64.const -0x1.921fb54442d18p+2)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const nan) (f64.const 0x1.921fb54442d18p+2)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const nan:0x4000000000000) (f64.const 0x1.921fb54442d18p+2)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -nan) (f64.const -0x1.fffffffffffffp+1023)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const -nan:0x4000000000000) (f64.const -0x1.fffffffffffffp+1023)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -nan) (f64.const 0x1.fffffffffffffp+1023)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const -nan:0x4000000000000) (f64.const 0x1.fffffffffffffp+1023)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const nan) (f64.const -0x1.fffffffffffffp+1023)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const nan:0x4000000000000) (f64.const -0x1.fffffffffffffp+1023)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const nan) (f64.const 0x1.fffffffffffffp+1023)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const nan:0x4000000000000) (f64.const 0x1.fffffffffffffp+1023)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -nan) (f64.const -inf)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const -nan:0x4000000000000) (f64.const -inf)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -nan) (f64.const inf)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const -nan:0x4000000000000) (f64.const inf)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const nan) (f64.const -inf)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const nan:0x4000000000000) (f64.const -inf)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const nan) (f64.const inf)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const nan:0x4000000000000) (f64.const inf)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -nan) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const -nan:0x4000000000000) (f64.const -nan)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -nan) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -nan:0x4000000000000) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -nan) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const -nan:0x4000000000000) (f64.const nan)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -nan) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const -nan:0x4000000000000) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const nan) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const nan:0x4000000000000) (f64.const -nan)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const nan) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const nan:0x4000000000000) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const nan) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "sub" (f64.const nan:0x4000000000000) (f64.const nan)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const nan) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sub" (f64.const nan:0x4000000000000) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -0x0p+0) (f64.const -0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x0p+0) (f64.const 0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x0p+0) (f64.const -0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x0p+0) (f64.const 0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x0p+0) (f64.const -0x0.0000000000001p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x0p+0) (f64.const 0x0.0000000000001p-1022)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x0p+0) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x0p+0) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x0p+0) (f64.const -0x1p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x0p+0) (f64.const 0x1p-1022)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x0p+0) (f64.const -0x1p-1022)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x0p+0) (f64.const 0x1p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x0p+0) (f64.const -0x1p-1)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x0p+0) (f64.const 0x1p-1)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x0p+0) (f64.const -0x1p-1)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x0p+0) (f64.const 0x1p-1)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x0p+0) (f64.const -0x1p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x0p+0) (f64.const 0x1p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x0p+0) (f64.const -0x1p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x0p+0) (f64.const 0x1p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x0p+0) (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x0p+0) (f64.const 0x1.921fb54442d18p+2)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x0p+0) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x0p+0) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x0p+0) (f64.const -0x1.fffffffffffffp+1023)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x0p+0) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x0p+0) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x0p+0) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x0p+0) (f64.const -inf)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -0x0p+0) (f64.const inf)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const 0x0p+0) (f64.const -inf)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const 0x0p+0) (f64.const inf)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -0x0p+0) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -0x0p+0) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -0x0p+0) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -0x0p+0) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const 0x0p+0) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const 0x0p+0) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const 0x0p+0) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const 0x0p+0) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -0x0.0000000000001p-1022) (f64.const -0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x0.0000000000001p-1022) (f64.const 0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x0.0000000000001p-1022) (f64.const -0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x0.0000000000001p-1022) (f64.const 0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x0.0000000000001p-1022) (f64.const -0x0.0000000000001p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x0.0000000000001p-1022) (f64.const 0x0.0000000000001p-1022)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x0.0000000000001p-1022) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x0.0000000000001p-1022) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p-1022)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p-1022)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p-1)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p-1)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p-1)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p-1)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p+0)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "mul" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p+0)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "mul" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p+0)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "mul" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p+0)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "mul" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x0.0000000000006p-1022)) -(assert_return (invoke "mul" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1.921fb54442d18p+2)) (f64.const -0x0.0000000000006p-1022)) -(assert_return (invoke "mul" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x0.0000000000006p-1022)) -(assert_return (invoke "mul" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x0.0000000000006p-1022)) -(assert_return (invoke "mul" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp-51)) -(assert_return (invoke "mul" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp-51)) -(assert_return (invoke "mul" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp-51)) -(assert_return (invoke "mul" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp-51)) -(assert_return (invoke "mul" (f64.const -0x0.0000000000001p-1022) (f64.const -inf)) (f64.const inf)) -(assert_return (invoke "mul" (f64.const -0x0.0000000000001p-1022) (f64.const inf)) (f64.const -inf)) -(assert_return (invoke "mul" (f64.const 0x0.0000000000001p-1022) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "mul" (f64.const 0x0.0000000000001p-1022) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "mul" (f64.const -0x0.0000000000001p-1022) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -0x0.0000000000001p-1022) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -0x0.0000000000001p-1022) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -0x0.0000000000001p-1022) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const 0x0.0000000000001p-1022) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const 0x0.0000000000001p-1022) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const 0x0.0000000000001p-1022) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const 0x0.0000000000001p-1022) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -0x1p-1022) (f64.const -0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x1p-1022) (f64.const 0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x1p-1022) (f64.const -0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x1p-1022) (f64.const 0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x1p-1022) (f64.const -0x0.0000000000001p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x1p-1022) (f64.const 0x0.0000000000001p-1022)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x1p-1022) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x1p-1022) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x1p-1022) (f64.const -0x1p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x1p-1022) (f64.const 0x1p-1022)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x1p-1022) (f64.const -0x1p-1022)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x1p-1022) (f64.const 0x1p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x1p-1022) (f64.const -0x1p-1)) (f64.const 0x0.8p-1022)) -(assert_return (invoke "mul" (f64.const -0x1p-1022) (f64.const 0x1p-1)) (f64.const -0x0.8p-1022)) -(assert_return (invoke "mul" (f64.const 0x1p-1022) (f64.const -0x1p-1)) (f64.const -0x0.8p-1022)) -(assert_return (invoke "mul" (f64.const 0x1p-1022) (f64.const 0x1p-1)) (f64.const 0x0.8p-1022)) -(assert_return (invoke "mul" (f64.const -0x1p-1022) (f64.const -0x1p+0)) (f64.const 0x1p-1022)) -(assert_return (invoke "mul" (f64.const -0x1p-1022) (f64.const 0x1p+0)) (f64.const -0x1p-1022)) -(assert_return (invoke "mul" (f64.const 0x1p-1022) (f64.const -0x1p+0)) (f64.const -0x1p-1022)) -(assert_return (invoke "mul" (f64.const 0x1p-1022) (f64.const 0x1p+0)) (f64.const 0x1p-1022)) -(assert_return (invoke "mul" (f64.const -0x1p-1022) (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p-1020)) -(assert_return (invoke "mul" (f64.const -0x1p-1022) (f64.const 0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p-1020)) -(assert_return (invoke "mul" (f64.const 0x1p-1022) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p-1020)) -(assert_return (invoke "mul" (f64.const 0x1p-1022) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p-1020)) -(assert_return (invoke "mul" (f64.const -0x1p-1022) (f64.const -0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1)) -(assert_return (invoke "mul" (f64.const -0x1p-1022) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1)) -(assert_return (invoke "mul" (f64.const 0x1p-1022) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1)) -(assert_return (invoke "mul" (f64.const 0x1p-1022) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1)) -(assert_return (invoke "mul" (f64.const -0x1p-1022) (f64.const -inf)) (f64.const inf)) -(assert_return (invoke "mul" (f64.const -0x1p-1022) (f64.const inf)) (f64.const -inf)) -(assert_return (invoke "mul" (f64.const 0x1p-1022) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "mul" (f64.const 0x1p-1022) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "mul" (f64.const -0x1p-1022) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -0x1p-1022) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -0x1p-1022) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -0x1p-1022) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const 0x1p-1022) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const 0x1p-1022) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const 0x1p-1022) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const 0x1p-1022) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -0x1p-1) (f64.const -0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x1p-1) (f64.const 0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x1p-1) (f64.const -0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x1p-1) (f64.const 0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x1p-1) (f64.const -0x0.0000000000001p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x1p-1) (f64.const 0x0.0000000000001p-1022)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x1p-1) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x1p-1) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x1p-1) (f64.const -0x1p-1022)) (f64.const 0x0.8p-1022)) -(assert_return (invoke "mul" (f64.const -0x1p-1) (f64.const 0x1p-1022)) (f64.const -0x0.8p-1022)) -(assert_return (invoke "mul" (f64.const 0x1p-1) (f64.const -0x1p-1022)) (f64.const -0x0.8p-1022)) -(assert_return (invoke "mul" (f64.const 0x1p-1) (f64.const 0x1p-1022)) (f64.const 0x0.8p-1022)) -(assert_return (invoke "mul" (f64.const -0x1p-1) (f64.const -0x1p-1)) (f64.const 0x1p-2)) -(assert_return (invoke "mul" (f64.const -0x1p-1) (f64.const 0x1p-1)) (f64.const -0x1p-2)) -(assert_return (invoke "mul" (f64.const 0x1p-1) (f64.const -0x1p-1)) (f64.const -0x1p-2)) -(assert_return (invoke "mul" (f64.const 0x1p-1) (f64.const 0x1p-1)) (f64.const 0x1p-2)) -(assert_return (invoke "mul" (f64.const -0x1p-1) (f64.const -0x1p+0)) (f64.const 0x1p-1)) -(assert_return (invoke "mul" (f64.const -0x1p-1) (f64.const 0x1p+0)) (f64.const -0x1p-1)) -(assert_return (invoke "mul" (f64.const 0x1p-1) (f64.const -0x1p+0)) (f64.const -0x1p-1)) -(assert_return (invoke "mul" (f64.const 0x1p-1) (f64.const 0x1p+0)) (f64.const 0x1p-1)) -(assert_return (invoke "mul" (f64.const -0x1p-1) (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+1)) -(assert_return (invoke "mul" (f64.const -0x1p-1) (f64.const 0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+1)) -(assert_return (invoke "mul" (f64.const 0x1p-1) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+1)) -(assert_return (invoke "mul" (f64.const 0x1p-1) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+1)) -(assert_return (invoke "mul" (f64.const -0x1p-1) (f64.const -0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1022)) -(assert_return (invoke "mul" (f64.const -0x1p-1) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1022)) -(assert_return (invoke "mul" (f64.const 0x1p-1) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1022)) -(assert_return (invoke "mul" (f64.const 0x1p-1) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1022)) -(assert_return (invoke "mul" (f64.const -0x1p-1) (f64.const -inf)) (f64.const inf)) -(assert_return (invoke "mul" (f64.const -0x1p-1) (f64.const inf)) (f64.const -inf)) -(assert_return (invoke "mul" (f64.const 0x1p-1) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "mul" (f64.const 0x1p-1) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "mul" (f64.const -0x1p-1) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -0x1p-1) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -0x1p-1) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -0x1p-1) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const 0x1p-1) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const 0x1p-1) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const 0x1p-1) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const 0x1p-1) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -0x1p+0) (f64.const -0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x1p+0) (f64.const 0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x1p+0) (f64.const -0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x1p+0) (f64.const 0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x1p+0) (f64.const -0x0.0000000000001p-1022)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "mul" (f64.const -0x1p+0) (f64.const 0x0.0000000000001p-1022)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "mul" (f64.const 0x1p+0) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "mul" (f64.const 0x1p+0) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "mul" (f64.const -0x1p+0) (f64.const -0x1p-1022)) (f64.const 0x1p-1022)) -(assert_return (invoke "mul" (f64.const -0x1p+0) (f64.const 0x1p-1022)) (f64.const -0x1p-1022)) -(assert_return (invoke "mul" (f64.const 0x1p+0) (f64.const -0x1p-1022)) (f64.const -0x1p-1022)) -(assert_return (invoke "mul" (f64.const 0x1p+0) (f64.const 0x1p-1022)) (f64.const 0x1p-1022)) -(assert_return (invoke "mul" (f64.const -0x1p+0) (f64.const -0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "mul" (f64.const -0x1p+0) (f64.const 0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "mul" (f64.const 0x1p+0) (f64.const -0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "mul" (f64.const 0x1p+0) (f64.const 0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "mul" (f64.const -0x1p+0) (f64.const -0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "mul" (f64.const -0x1p+0) (f64.const 0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "mul" (f64.const 0x1p+0) (f64.const -0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "mul" (f64.const 0x1p+0) (f64.const 0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "mul" (f64.const -0x1p+0) (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "mul" (f64.const -0x1p+0) (f64.const 0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "mul" (f64.const 0x1p+0) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "mul" (f64.const 0x1p+0) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "mul" (f64.const -0x1p+0) (f64.const -0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "mul" (f64.const -0x1p+0) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "mul" (f64.const 0x1p+0) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "mul" (f64.const 0x1p+0) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "mul" (f64.const -0x1p+0) (f64.const -inf)) (f64.const inf)) -(assert_return (invoke "mul" (f64.const -0x1p+0) (f64.const inf)) (f64.const -inf)) -(assert_return (invoke "mul" (f64.const 0x1p+0) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "mul" (f64.const 0x1p+0) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "mul" (f64.const -0x1p+0) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -0x1p+0) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -0x1p+0) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -0x1p+0) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const 0x1p+0) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const 0x1p+0) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const 0x1p+0) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const 0x1p+0) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x0.0000000000001p-1022)) (f64.const 0x0.0000000000006p-1022)) -(assert_return (invoke "mul" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x0.0000000000001p-1022)) (f64.const -0x0.0000000000006p-1022)) -(assert_return (invoke "mul" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0.0000000000006p-1022)) -(assert_return (invoke "mul" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0.0000000000006p-1022)) -(assert_return (invoke "mul" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p-1022)) (f64.const 0x1.921fb54442d18p-1020)) -(assert_return (invoke "mul" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p-1022)) (f64.const -0x1.921fb54442d18p-1020)) -(assert_return (invoke "mul" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p-1022)) (f64.const -0x1.921fb54442d18p-1020)) -(assert_return (invoke "mul" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p-1022)) (f64.const 0x1.921fb54442d18p-1020)) -(assert_return (invoke "mul" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p-1)) (f64.const 0x1.921fb54442d18p+1)) -(assert_return (invoke "mul" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p-1)) (f64.const -0x1.921fb54442d18p+1)) -(assert_return (invoke "mul" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p-1)) (f64.const -0x1.921fb54442d18p+1)) -(assert_return (invoke "mul" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p-1)) (f64.const 0x1.921fb54442d18p+1)) -(assert_return (invoke "mul" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p+0)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "mul" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p+0)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "mul" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p+0)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "mul" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p+0)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "mul" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x1.3bd3cc9be45dep+5)) -(assert_return (invoke "mul" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1.921fb54442d18p+2)) (f64.const -0x1.3bd3cc9be45dep+5)) -(assert_return (invoke "mul" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.3bd3cc9be45dep+5)) -(assert_return (invoke "mul" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.3bd3cc9be45dep+5)) -(assert_return (invoke "mul" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1.fffffffffffffp+1023)) (f64.const inf)) -(assert_return (invoke "mul" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -inf)) -(assert_return (invoke "mul" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -inf)) -(assert_return (invoke "mul" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1.fffffffffffffp+1023)) (f64.const inf)) -(assert_return (invoke "mul" (f64.const -0x1.921fb54442d18p+2) (f64.const -inf)) (f64.const inf)) -(assert_return (invoke "mul" (f64.const -0x1.921fb54442d18p+2) (f64.const inf)) (f64.const -inf)) -(assert_return (invoke "mul" (f64.const 0x1.921fb54442d18p+2) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "mul" (f64.const 0x1.921fb54442d18p+2) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "mul" (f64.const -0x1.921fb54442d18p+2) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -0x1.921fb54442d18p+2) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -0x1.921fb54442d18p+2) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -0x1.921fb54442d18p+2) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const 0x1.921fb54442d18p+2) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const 0x1.921fb54442d18p+2) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const 0x1.921fb54442d18p+2) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const 0x1.921fb54442d18p+2) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "mul" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "mul" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x0.0000000000001p-1022)) (f64.const 0x1.fffffffffffffp-51)) -(assert_return (invoke "mul" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x0.0000000000001p-1022)) (f64.const -0x1.fffffffffffffp-51)) -(assert_return (invoke "mul" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x1.fffffffffffffp-51)) -(assert_return (invoke "mul" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x1.fffffffffffffp-51)) -(assert_return (invoke "mul" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p-1022)) (f64.const 0x1.fffffffffffffp+1)) -(assert_return (invoke "mul" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p-1022)) (f64.const -0x1.fffffffffffffp+1)) -(assert_return (invoke "mul" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p-1022)) (f64.const -0x1.fffffffffffffp+1)) -(assert_return (invoke "mul" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p-1022)) (f64.const 0x1.fffffffffffffp+1)) -(assert_return (invoke "mul" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p-1)) (f64.const 0x1.fffffffffffffp+1022)) -(assert_return (invoke "mul" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p-1)) (f64.const -0x1.fffffffffffffp+1022)) -(assert_return (invoke "mul" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p-1)) (f64.const -0x1.fffffffffffffp+1022)) -(assert_return (invoke "mul" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p-1)) (f64.const 0x1.fffffffffffffp+1022)) -(assert_return (invoke "mul" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p+0)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "mul" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p+0)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "mul" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p+0)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "mul" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p+0)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "mul" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1.921fb54442d18p+2)) (f64.const inf)) -(assert_return (invoke "mul" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1.921fb54442d18p+2)) (f64.const -inf)) -(assert_return (invoke "mul" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1.921fb54442d18p+2)) (f64.const -inf)) -(assert_return (invoke "mul" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1.921fb54442d18p+2)) (f64.const inf)) -(assert_return (invoke "mul" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1.fffffffffffffp+1023)) (f64.const inf)) -(assert_return (invoke "mul" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -inf)) -(assert_return (invoke "mul" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -inf)) -(assert_return (invoke "mul" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1.fffffffffffffp+1023)) (f64.const inf)) -(assert_return (invoke "mul" (f64.const -0x1.fffffffffffffp+1023) (f64.const -inf)) (f64.const inf)) -(assert_return (invoke "mul" (f64.const -0x1.fffffffffffffp+1023) (f64.const inf)) (f64.const -inf)) -(assert_return (invoke "mul" (f64.const 0x1.fffffffffffffp+1023) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "mul" (f64.const 0x1.fffffffffffffp+1023) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "mul" (f64.const -0x1.fffffffffffffp+1023) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -0x1.fffffffffffffp+1023) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -0x1.fffffffffffffp+1023) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -0x1.fffffffffffffp+1023) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const 0x1.fffffffffffffp+1023) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const 0x1.fffffffffffffp+1023) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const 0x1.fffffffffffffp+1023) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const 0x1.fffffffffffffp+1023) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -inf) (f64.const -0x0p+0)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -inf) (f64.const 0x0p+0)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const inf) (f64.const -0x0p+0)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const inf) (f64.const 0x0p+0)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -inf) (f64.const -0x0.0000000000001p-1022)) (f64.const inf)) -(assert_return (invoke "mul" (f64.const -inf) (f64.const 0x0.0000000000001p-1022)) (f64.const -inf)) -(assert_return (invoke "mul" (f64.const inf) (f64.const -0x0.0000000000001p-1022)) (f64.const -inf)) -(assert_return (invoke "mul" (f64.const inf) (f64.const 0x0.0000000000001p-1022)) (f64.const inf)) -(assert_return (invoke "mul" (f64.const -inf) (f64.const -0x1p-1022)) (f64.const inf)) -(assert_return (invoke "mul" (f64.const -inf) (f64.const 0x1p-1022)) (f64.const -inf)) -(assert_return (invoke "mul" (f64.const inf) (f64.const -0x1p-1022)) (f64.const -inf)) -(assert_return (invoke "mul" (f64.const inf) (f64.const 0x1p-1022)) (f64.const inf)) -(assert_return (invoke "mul" (f64.const -inf) (f64.const -0x1p-1)) (f64.const inf)) -(assert_return (invoke "mul" (f64.const -inf) (f64.const 0x1p-1)) (f64.const -inf)) -(assert_return (invoke "mul" (f64.const inf) (f64.const -0x1p-1)) (f64.const -inf)) -(assert_return (invoke "mul" (f64.const inf) (f64.const 0x1p-1)) (f64.const inf)) -(assert_return (invoke "mul" (f64.const -inf) (f64.const -0x1p+0)) (f64.const inf)) -(assert_return (invoke "mul" (f64.const -inf) (f64.const 0x1p+0)) (f64.const -inf)) -(assert_return (invoke "mul" (f64.const inf) (f64.const -0x1p+0)) (f64.const -inf)) -(assert_return (invoke "mul" (f64.const inf) (f64.const 0x1p+0)) (f64.const inf)) -(assert_return (invoke "mul" (f64.const -inf) (f64.const -0x1.921fb54442d18p+2)) (f64.const inf)) -(assert_return (invoke "mul" (f64.const -inf) (f64.const 0x1.921fb54442d18p+2)) (f64.const -inf)) -(assert_return (invoke "mul" (f64.const inf) (f64.const -0x1.921fb54442d18p+2)) (f64.const -inf)) -(assert_return (invoke "mul" (f64.const inf) (f64.const 0x1.921fb54442d18p+2)) (f64.const inf)) -(assert_return (invoke "mul" (f64.const -inf) (f64.const -0x1.fffffffffffffp+1023)) (f64.const inf)) -(assert_return (invoke "mul" (f64.const -inf) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -inf)) -(assert_return (invoke "mul" (f64.const inf) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -inf)) -(assert_return (invoke "mul" (f64.const inf) (f64.const 0x1.fffffffffffffp+1023)) (f64.const inf)) -(assert_return (invoke "mul" (f64.const -inf) (f64.const -inf)) (f64.const inf)) -(assert_return (invoke "mul" (f64.const -inf) (f64.const inf)) (f64.const -inf)) -(assert_return (invoke "mul" (f64.const inf) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "mul" (f64.const inf) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "mul" (f64.const -inf) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -inf) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -inf) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -inf) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const inf) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const inf) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const inf) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const inf) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -nan) (f64.const -0x0p+0)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -nan:0x4000000000000) (f64.const -0x0p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -nan) (f64.const 0x0p+0)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -nan:0x4000000000000) (f64.const 0x0p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const nan) (f64.const -0x0p+0)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const nan:0x4000000000000) (f64.const -0x0p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const nan) (f64.const 0x0p+0)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const nan:0x4000000000000) (f64.const 0x0p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -nan) (f64.const -0x0.0000000000001p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -nan:0x4000000000000) (f64.const -0x0.0000000000001p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -nan) (f64.const 0x0.0000000000001p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -nan:0x4000000000000) (f64.const 0x0.0000000000001p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const nan) (f64.const -0x0.0000000000001p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const nan:0x4000000000000) (f64.const -0x0.0000000000001p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const nan) (f64.const 0x0.0000000000001p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const nan:0x4000000000000) (f64.const 0x0.0000000000001p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -nan) (f64.const -0x1p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -nan:0x4000000000000) (f64.const -0x1p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -nan) (f64.const 0x1p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -nan:0x4000000000000) (f64.const 0x1p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const nan) (f64.const -0x1p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const nan:0x4000000000000) (f64.const -0x1p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const nan) (f64.const 0x1p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const nan:0x4000000000000) (f64.const 0x1p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -nan) (f64.const -0x1p-1)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -nan:0x4000000000000) (f64.const -0x1p-1)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -nan) (f64.const 0x1p-1)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -nan:0x4000000000000) (f64.const 0x1p-1)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const nan) (f64.const -0x1p-1)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const nan:0x4000000000000) (f64.const -0x1p-1)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const nan) (f64.const 0x1p-1)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const nan:0x4000000000000) (f64.const 0x1p-1)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -nan) (f64.const -0x1p+0)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -nan:0x4000000000000) (f64.const -0x1p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -nan) (f64.const 0x1p+0)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -nan:0x4000000000000) (f64.const 0x1p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const nan) (f64.const -0x1p+0)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const nan:0x4000000000000) (f64.const -0x1p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const nan) (f64.const 0x1p+0)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const nan:0x4000000000000) (f64.const 0x1p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -nan) (f64.const -0x1.921fb54442d18p+2)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -nan:0x4000000000000) (f64.const -0x1.921fb54442d18p+2)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -nan) (f64.const 0x1.921fb54442d18p+2)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -nan:0x4000000000000) (f64.const 0x1.921fb54442d18p+2)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const nan) (f64.const -0x1.921fb54442d18p+2)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const nan:0x4000000000000) (f64.const -0x1.921fb54442d18p+2)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const nan) (f64.const 0x1.921fb54442d18p+2)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const nan:0x4000000000000) (f64.const 0x1.921fb54442d18p+2)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -nan) (f64.const -0x1.fffffffffffffp+1023)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -nan:0x4000000000000) (f64.const -0x1.fffffffffffffp+1023)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -nan) (f64.const 0x1.fffffffffffffp+1023)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -nan:0x4000000000000) (f64.const 0x1.fffffffffffffp+1023)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const nan) (f64.const -0x1.fffffffffffffp+1023)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const nan:0x4000000000000) (f64.const -0x1.fffffffffffffp+1023)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const nan) (f64.const 0x1.fffffffffffffp+1023)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const nan:0x4000000000000) (f64.const 0x1.fffffffffffffp+1023)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -nan) (f64.const -inf)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -nan:0x4000000000000) (f64.const -inf)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -nan) (f64.const inf)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -nan:0x4000000000000) (f64.const inf)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const nan) (f64.const -inf)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const nan:0x4000000000000) (f64.const -inf)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const nan) (f64.const inf)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const nan:0x4000000000000) (f64.const inf)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -nan) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -nan:0x4000000000000) (f64.const -nan)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -nan) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -nan:0x4000000000000) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -nan) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const -nan:0x4000000000000) (f64.const nan)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -nan) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const -nan:0x4000000000000) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const nan) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const nan:0x4000000000000) (f64.const -nan)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const nan) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const nan:0x4000000000000) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const nan) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "mul" (f64.const nan:0x4000000000000) (f64.const nan)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const nan) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "mul" (f64.const nan:0x4000000000000) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -0x0p+0) (f64.const -0x0p+0)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -0x0p+0) (f64.const 0x0p+0)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const 0x0p+0) (f64.const -0x0p+0)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const 0x0p+0) (f64.const 0x0p+0)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -0x0p+0) (f64.const -0x0.0000000000001p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "div" (f64.const -0x0p+0) (f64.const 0x0.0000000000001p-1022)) (f64.const -0x0p+0)) -(assert_return (invoke "div" (f64.const 0x0p+0) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0p+0)) -(assert_return (invoke "div" (f64.const 0x0p+0) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "div" (f64.const -0x0p+0) (f64.const -0x1p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "div" (f64.const -0x0p+0) (f64.const 0x1p-1022)) (f64.const -0x0p+0)) -(assert_return (invoke "div" (f64.const 0x0p+0) (f64.const -0x1p-1022)) (f64.const -0x0p+0)) -(assert_return (invoke "div" (f64.const 0x0p+0) (f64.const 0x1p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "div" (f64.const -0x0p+0) (f64.const -0x1p-1)) (f64.const 0x0p+0)) -(assert_return (invoke "div" (f64.const -0x0p+0) (f64.const 0x1p-1)) (f64.const -0x0p+0)) -(assert_return (invoke "div" (f64.const 0x0p+0) (f64.const -0x1p-1)) (f64.const -0x0p+0)) -(assert_return (invoke "div" (f64.const 0x0p+0) (f64.const 0x1p-1)) (f64.const 0x0p+0)) -(assert_return (invoke "div" (f64.const -0x0p+0) (f64.const -0x1p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "div" (f64.const -0x0p+0) (f64.const 0x1p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "div" (f64.const 0x0p+0) (f64.const -0x1p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "div" (f64.const 0x0p+0) (f64.const 0x1p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "div" (f64.const -0x0p+0) (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x0p+0)) -(assert_return (invoke "div" (f64.const -0x0p+0) (f64.const 0x1.921fb54442d18p+2)) (f64.const -0x0p+0)) -(assert_return (invoke "div" (f64.const 0x0p+0) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x0p+0)) -(assert_return (invoke "div" (f64.const 0x0p+0) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x0p+0)) -(assert_return (invoke "div" (f64.const -0x0p+0) (f64.const -0x1.fffffffffffffp+1023)) (f64.const 0x0p+0)) -(assert_return (invoke "div" (f64.const -0x0p+0) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -0x0p+0)) -(assert_return (invoke "div" (f64.const 0x0p+0) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x0p+0)) -(assert_return (invoke "div" (f64.const 0x0p+0) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x0p+0)) -(assert_return (invoke "div" (f64.const -0x0p+0) (f64.const -inf)) (f64.const 0x0p+0)) -(assert_return (invoke "div" (f64.const -0x0p+0) (f64.const inf)) (f64.const -0x0p+0)) -(assert_return (invoke "div" (f64.const 0x0p+0) (f64.const -inf)) (f64.const -0x0p+0)) -(assert_return (invoke "div" (f64.const 0x0p+0) (f64.const inf)) (f64.const 0x0p+0)) -(assert_return (invoke "div" (f64.const -0x0p+0) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -0x0p+0) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -0x0p+0) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -0x0p+0) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const 0x0p+0) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const 0x0p+0) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const 0x0p+0) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const 0x0p+0) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -0x0.0000000000001p-1022) (f64.const -0x0p+0)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -0x0.0000000000001p-1022) (f64.const 0x0p+0)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const 0x0.0000000000001p-1022) (f64.const -0x0p+0)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const 0x0.0000000000001p-1022) (f64.const 0x0p+0)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -0x0.0000000000001p-1022) (f64.const -0x0.0000000000001p-1022)) (f64.const 0x1p+0)) -(assert_return (invoke "div" (f64.const -0x0.0000000000001p-1022) (f64.const 0x0.0000000000001p-1022)) (f64.const -0x1p+0)) -(assert_return (invoke "div" (f64.const 0x0.0000000000001p-1022) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x1p+0)) -(assert_return (invoke "div" (f64.const 0x0.0000000000001p-1022) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x1p+0)) -(assert_return (invoke "div" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p-1022)) (f64.const 0x1p-52)) -(assert_return (invoke "div" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p-1022)) (f64.const -0x1p-52)) -(assert_return (invoke "div" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p-1022)) (f64.const -0x1p-52)) -(assert_return (invoke "div" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p-1022)) (f64.const 0x1p-52)) -(assert_return (invoke "div" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p-1)) (f64.const 0x0.0000000000002p-1022)) -(assert_return (invoke "div" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p-1)) (f64.const -0x0.0000000000002p-1022)) -(assert_return (invoke "div" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p-1)) (f64.const -0x0.0000000000002p-1022)) -(assert_return (invoke "div" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p-1)) (f64.const 0x0.0000000000002p-1022)) -(assert_return (invoke "div" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p+0)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "div" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p+0)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "div" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p+0)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "div" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p+0)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "div" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x0p+0)) -(assert_return (invoke "div" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1.921fb54442d18p+2)) (f64.const -0x0p+0)) -(assert_return (invoke "div" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x0p+0)) -(assert_return (invoke "div" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x0p+0)) -(assert_return (invoke "div" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1.fffffffffffffp+1023)) (f64.const 0x0p+0)) -(assert_return (invoke "div" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -0x0p+0)) -(assert_return (invoke "div" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x0p+0)) -(assert_return (invoke "div" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x0p+0)) -(assert_return (invoke "div" (f64.const -0x0.0000000000001p-1022) (f64.const -inf)) (f64.const 0x0p+0)) -(assert_return (invoke "div" (f64.const -0x0.0000000000001p-1022) (f64.const inf)) (f64.const -0x0p+0)) -(assert_return (invoke "div" (f64.const 0x0.0000000000001p-1022) (f64.const -inf)) (f64.const -0x0p+0)) -(assert_return (invoke "div" (f64.const 0x0.0000000000001p-1022) (f64.const inf)) (f64.const 0x0p+0)) -(assert_return (invoke "div" (f64.const -0x0.0000000000001p-1022) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -0x0.0000000000001p-1022) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -0x0.0000000000001p-1022) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -0x0.0000000000001p-1022) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const 0x0.0000000000001p-1022) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const 0x0.0000000000001p-1022) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const 0x0.0000000000001p-1022) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const 0x0.0000000000001p-1022) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -0x1p-1022) (f64.const -0x0p+0)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -0x1p-1022) (f64.const 0x0p+0)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const 0x1p-1022) (f64.const -0x0p+0)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const 0x1p-1022) (f64.const 0x0p+0)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -0x1p-1022) (f64.const -0x0.0000000000001p-1022)) (f64.const 0x1p+52)) -(assert_return (invoke "div" (f64.const -0x1p-1022) (f64.const 0x0.0000000000001p-1022)) (f64.const -0x1p+52)) -(assert_return (invoke "div" (f64.const 0x1p-1022) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x1p+52)) -(assert_return (invoke "div" (f64.const 0x1p-1022) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x1p+52)) -(assert_return (invoke "div" (f64.const -0x1p-1022) (f64.const -0x1p-1022)) (f64.const 0x1p+0)) -(assert_return (invoke "div" (f64.const -0x1p-1022) (f64.const 0x1p-1022)) (f64.const -0x1p+0)) -(assert_return (invoke "div" (f64.const 0x1p-1022) (f64.const -0x1p-1022)) (f64.const -0x1p+0)) -(assert_return (invoke "div" (f64.const 0x1p-1022) (f64.const 0x1p-1022)) (f64.const 0x1p+0)) -(assert_return (invoke "div" (f64.const -0x1p-1022) (f64.const -0x1p-1)) (f64.const 0x1p-1021)) -(assert_return (invoke "div" (f64.const -0x1p-1022) (f64.const 0x1p-1)) (f64.const -0x1p-1021)) -(assert_return (invoke "div" (f64.const 0x1p-1022) (f64.const -0x1p-1)) (f64.const -0x1p-1021)) -(assert_return (invoke "div" (f64.const 0x1p-1022) (f64.const 0x1p-1)) (f64.const 0x1p-1021)) -(assert_return (invoke "div" (f64.const -0x1p-1022) (f64.const -0x1p+0)) (f64.const 0x1p-1022)) -(assert_return (invoke "div" (f64.const -0x1p-1022) (f64.const 0x1p+0)) (f64.const -0x1p-1022)) -(assert_return (invoke "div" (f64.const 0x1p-1022) (f64.const -0x1p+0)) (f64.const -0x1p-1022)) -(assert_return (invoke "div" (f64.const 0x1p-1022) (f64.const 0x1p+0)) (f64.const 0x1p-1022)) -(assert_return (invoke "div" (f64.const -0x1p-1022) (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x0.28be60db9391p-1022)) -(assert_return (invoke "div" (f64.const -0x1p-1022) (f64.const 0x1.921fb54442d18p+2)) (f64.const -0x0.28be60db9391p-1022)) -(assert_return (invoke "div" (f64.const 0x1p-1022) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x0.28be60db9391p-1022)) -(assert_return (invoke "div" (f64.const 0x1p-1022) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x0.28be60db9391p-1022)) -(assert_return (invoke "div" (f64.const -0x1p-1022) (f64.const -0x1.fffffffffffffp+1023)) (f64.const 0x0p+0)) -(assert_return (invoke "div" (f64.const -0x1p-1022) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -0x0p+0)) -(assert_return (invoke "div" (f64.const 0x1p-1022) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x0p+0)) -(assert_return (invoke "div" (f64.const 0x1p-1022) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x0p+0)) -(assert_return (invoke "div" (f64.const -0x1p-1022) (f64.const -inf)) (f64.const 0x0p+0)) -(assert_return (invoke "div" (f64.const -0x1p-1022) (f64.const inf)) (f64.const -0x0p+0)) -(assert_return (invoke "div" (f64.const 0x1p-1022) (f64.const -inf)) (f64.const -0x0p+0)) -(assert_return (invoke "div" (f64.const 0x1p-1022) (f64.const inf)) (f64.const 0x0p+0)) -(assert_return (invoke "div" (f64.const -0x1p-1022) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -0x1p-1022) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -0x1p-1022) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -0x1p-1022) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const 0x1p-1022) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const 0x1p-1022) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const 0x1p-1022) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const 0x1p-1022) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -0x1p-1) (f64.const -0x0p+0)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -0x1p-1) (f64.const 0x0p+0)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const 0x1p-1) (f64.const -0x0p+0)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const 0x1p-1) (f64.const 0x0p+0)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -0x1p-1) (f64.const -0x0.0000000000001p-1022)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -0x1p-1) (f64.const 0x0.0000000000001p-1022)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const 0x1p-1) (f64.const -0x0.0000000000001p-1022)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const 0x1p-1) (f64.const 0x0.0000000000001p-1022)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -0x1p-1) (f64.const -0x1p-1022)) (f64.const 0x1p+1021)) -(assert_return (invoke "div" (f64.const -0x1p-1) (f64.const 0x1p-1022)) (f64.const -0x1p+1021)) -(assert_return (invoke "div" (f64.const 0x1p-1) (f64.const -0x1p-1022)) (f64.const -0x1p+1021)) -(assert_return (invoke "div" (f64.const 0x1p-1) (f64.const 0x1p-1022)) (f64.const 0x1p+1021)) -(assert_return (invoke "div" (f64.const -0x1p-1) (f64.const -0x1p-1)) (f64.const 0x1p+0)) -(assert_return (invoke "div" (f64.const -0x1p-1) (f64.const 0x1p-1)) (f64.const -0x1p+0)) -(assert_return (invoke "div" (f64.const 0x1p-1) (f64.const -0x1p-1)) (f64.const -0x1p+0)) -(assert_return (invoke "div" (f64.const 0x1p-1) (f64.const 0x1p-1)) (f64.const 0x1p+0)) -(assert_return (invoke "div" (f64.const -0x1p-1) (f64.const -0x1p+0)) (f64.const 0x1p-1)) -(assert_return (invoke "div" (f64.const -0x1p-1) (f64.const 0x1p+0)) (f64.const -0x1p-1)) -(assert_return (invoke "div" (f64.const 0x1p-1) (f64.const -0x1p+0)) (f64.const -0x1p-1)) -(assert_return (invoke "div" (f64.const 0x1p-1) (f64.const 0x1p+0)) (f64.const 0x1p-1)) -(assert_return (invoke "div" (f64.const -0x1p-1) (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x1.45f306dc9c883p-4)) -(assert_return (invoke "div" (f64.const -0x1p-1) (f64.const 0x1.921fb54442d18p+2)) (f64.const -0x1.45f306dc9c883p-4)) -(assert_return (invoke "div" (f64.const 0x1p-1) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.45f306dc9c883p-4)) -(assert_return (invoke "div" (f64.const 0x1p-1) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.45f306dc9c883p-4)) -(assert_return (invoke "div" (f64.const -0x1p-1) (f64.const -0x1.fffffffffffffp+1023)) (f64.const 0x0.2p-1022)) -(assert_return (invoke "div" (f64.const -0x1p-1) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -0x0.2p-1022)) -(assert_return (invoke "div" (f64.const 0x1p-1) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x0.2p-1022)) -(assert_return (invoke "div" (f64.const 0x1p-1) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x0.2p-1022)) -(assert_return (invoke "div" (f64.const -0x1p-1) (f64.const -inf)) (f64.const 0x0p+0)) -(assert_return (invoke "div" (f64.const -0x1p-1) (f64.const inf)) (f64.const -0x0p+0)) -(assert_return (invoke "div" (f64.const 0x1p-1) (f64.const -inf)) (f64.const -0x0p+0)) -(assert_return (invoke "div" (f64.const 0x1p-1) (f64.const inf)) (f64.const 0x0p+0)) -(assert_return (invoke "div" (f64.const -0x1p-1) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -0x1p-1) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -0x1p-1) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -0x1p-1) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const 0x1p-1) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const 0x1p-1) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const 0x1p-1) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const 0x1p-1) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -0x1p+0) (f64.const -0x0p+0)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -0x1p+0) (f64.const 0x0p+0)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const 0x1p+0) (f64.const -0x0p+0)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const 0x1p+0) (f64.const 0x0p+0)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -0x1p+0) (f64.const -0x0.0000000000001p-1022)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -0x1p+0) (f64.const 0x0.0000000000001p-1022)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const 0x1p+0) (f64.const -0x0.0000000000001p-1022)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const 0x1p+0) (f64.const 0x0.0000000000001p-1022)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -0x1p+0) (f64.const -0x1p-1022)) (f64.const 0x1p+1022)) -(assert_return (invoke "div" (f64.const -0x1p+0) (f64.const 0x1p-1022)) (f64.const -0x1p+1022)) -(assert_return (invoke "div" (f64.const 0x1p+0) (f64.const -0x1p-1022)) (f64.const -0x1p+1022)) -(assert_return (invoke "div" (f64.const 0x1p+0) (f64.const 0x1p-1022)) (f64.const 0x1p+1022)) -(assert_return (invoke "div" (f64.const -0x1p+0) (f64.const -0x1p-1)) (f64.const 0x1p+1)) -(assert_return (invoke "div" (f64.const -0x1p+0) (f64.const 0x1p-1)) (f64.const -0x1p+1)) -(assert_return (invoke "div" (f64.const 0x1p+0) (f64.const -0x1p-1)) (f64.const -0x1p+1)) -(assert_return (invoke "div" (f64.const 0x1p+0) (f64.const 0x1p-1)) (f64.const 0x1p+1)) -(assert_return (invoke "div" (f64.const -0x1p+0) (f64.const -0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "div" (f64.const -0x1p+0) (f64.const 0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "div" (f64.const 0x1p+0) (f64.const -0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "div" (f64.const 0x1p+0) (f64.const 0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "div" (f64.const -0x1p+0) (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x1.45f306dc9c883p-3)) -(assert_return (invoke "div" (f64.const -0x1p+0) (f64.const 0x1.921fb54442d18p+2)) (f64.const -0x1.45f306dc9c883p-3)) -(assert_return (invoke "div" (f64.const 0x1p+0) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.45f306dc9c883p-3)) -(assert_return (invoke "div" (f64.const 0x1p+0) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.45f306dc9c883p-3)) -(assert_return (invoke "div" (f64.const -0x1p+0) (f64.const -0x1.fffffffffffffp+1023)) (f64.const 0x0.4p-1022)) -(assert_return (invoke "div" (f64.const -0x1p+0) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -0x0.4p-1022)) -(assert_return (invoke "div" (f64.const 0x1p+0) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x0.4p-1022)) -(assert_return (invoke "div" (f64.const 0x1p+0) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x0.4p-1022)) -(assert_return (invoke "div" (f64.const -0x1p+0) (f64.const -inf)) (f64.const 0x0p+0)) -(assert_return (invoke "div" (f64.const -0x1p+0) (f64.const inf)) (f64.const -0x0p+0)) -(assert_return (invoke "div" (f64.const 0x1p+0) (f64.const -inf)) (f64.const -0x0p+0)) -(assert_return (invoke "div" (f64.const 0x1p+0) (f64.const inf)) (f64.const 0x0p+0)) -(assert_return (invoke "div" (f64.const -0x1p+0) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -0x1p+0) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -0x1p+0) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -0x1p+0) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const 0x1p+0) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const 0x1p+0) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const 0x1p+0) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const 0x1p+0) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x0p+0)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x0p+0)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x0p+0)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x0p+0)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x0.0000000000001p-1022)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x0.0000000000001p-1022)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x0.0000000000001p-1022)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x0.0000000000001p-1022)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p-1022)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p-1022)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p-1022)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p-1022)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p-1)) (f64.const 0x1.921fb54442d18p+3)) -(assert_return (invoke "div" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p-1)) (f64.const -0x1.921fb54442d18p+3)) -(assert_return (invoke "div" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p-1)) (f64.const -0x1.921fb54442d18p+3)) -(assert_return (invoke "div" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p-1)) (f64.const 0x1.921fb54442d18p+3)) -(assert_return (invoke "div" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p+0)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "div" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p+0)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "div" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p+0)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "div" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p+0)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "div" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x1p+0)) -(assert_return (invoke "div" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1.921fb54442d18p+2)) (f64.const -0x1p+0)) -(assert_return (invoke "div" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1p+0)) -(assert_return (invoke "div" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1p+0)) -(assert_return (invoke "div" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1.fffffffffffffp+1023)) (f64.const 0x1.921fb54442d19p-1022)) -(assert_return (invoke "div" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -0x1.921fb54442d19p-1022)) -(assert_return (invoke "div" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.921fb54442d19p-1022)) -(assert_return (invoke "div" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.921fb54442d19p-1022)) -(assert_return (invoke "div" (f64.const -0x1.921fb54442d18p+2) (f64.const -inf)) (f64.const 0x0p+0)) -(assert_return (invoke "div" (f64.const -0x1.921fb54442d18p+2) (f64.const inf)) (f64.const -0x0p+0)) -(assert_return (invoke "div" (f64.const 0x1.921fb54442d18p+2) (f64.const -inf)) (f64.const -0x0p+0)) -(assert_return (invoke "div" (f64.const 0x1.921fb54442d18p+2) (f64.const inf)) (f64.const 0x0p+0)) -(assert_return (invoke "div" (f64.const -0x1.921fb54442d18p+2) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -0x1.921fb54442d18p+2) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -0x1.921fb54442d18p+2) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -0x1.921fb54442d18p+2) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const 0x1.921fb54442d18p+2) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const 0x1.921fb54442d18p+2) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const 0x1.921fb54442d18p+2) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const 0x1.921fb54442d18p+2) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x0p+0)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x0p+0)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x0p+0)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x0p+0)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x0.0000000000001p-1022)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x0.0000000000001p-1022)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x0.0000000000001p-1022)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x0.0000000000001p-1022)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p-1022)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p-1022)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p-1022)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p-1022)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p-1)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p-1)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p-1)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p-1)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p+0)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "div" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p+0)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "div" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p+0)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "div" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p+0)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "div" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x1.45f306dc9c882p+1021)) -(assert_return (invoke "div" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1.921fb54442d18p+2)) (f64.const -0x1.45f306dc9c882p+1021)) -(assert_return (invoke "div" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.45f306dc9c882p+1021)) -(assert_return (invoke "div" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.45f306dc9c882p+1021)) -(assert_return (invoke "div" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1.fffffffffffffp+1023)) (f64.const 0x1p+0)) -(assert_return (invoke "div" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -0x1p+0)) -(assert_return (invoke "div" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1p+0)) -(assert_return (invoke "div" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1p+0)) -(assert_return (invoke "div" (f64.const -0x1.fffffffffffffp+1023) (f64.const -inf)) (f64.const 0x0p+0)) -(assert_return (invoke "div" (f64.const -0x1.fffffffffffffp+1023) (f64.const inf)) (f64.const -0x0p+0)) -(assert_return (invoke "div" (f64.const 0x1.fffffffffffffp+1023) (f64.const -inf)) (f64.const -0x0p+0)) -(assert_return (invoke "div" (f64.const 0x1.fffffffffffffp+1023) (f64.const inf)) (f64.const 0x0p+0)) -(assert_return (invoke "div" (f64.const -0x1.fffffffffffffp+1023) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -0x1.fffffffffffffp+1023) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -0x1.fffffffffffffp+1023) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -0x1.fffffffffffffp+1023) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const 0x1.fffffffffffffp+1023) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const 0x1.fffffffffffffp+1023) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const 0x1.fffffffffffffp+1023) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const 0x1.fffffffffffffp+1023) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -inf) (f64.const -0x0p+0)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -inf) (f64.const 0x0p+0)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const inf) (f64.const -0x0p+0)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const inf) (f64.const 0x0p+0)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -inf) (f64.const -0x0.0000000000001p-1022)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -inf) (f64.const 0x0.0000000000001p-1022)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const inf) (f64.const -0x0.0000000000001p-1022)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const inf) (f64.const 0x0.0000000000001p-1022)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -inf) (f64.const -0x1p-1022)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -inf) (f64.const 0x1p-1022)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const inf) (f64.const -0x1p-1022)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const inf) (f64.const 0x1p-1022)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -inf) (f64.const -0x1p-1)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -inf) (f64.const 0x1p-1)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const inf) (f64.const -0x1p-1)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const inf) (f64.const 0x1p-1)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -inf) (f64.const -0x1p+0)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -inf) (f64.const 0x1p+0)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const inf) (f64.const -0x1p+0)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const inf) (f64.const 0x1p+0)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -inf) (f64.const -0x1.921fb54442d18p+2)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -inf) (f64.const 0x1.921fb54442d18p+2)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const inf) (f64.const -0x1.921fb54442d18p+2)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const inf) (f64.const 0x1.921fb54442d18p+2)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -inf) (f64.const -0x1.fffffffffffffp+1023)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -inf) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const inf) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -inf)) -(assert_return (invoke "div" (f64.const inf) (f64.const 0x1.fffffffffffffp+1023)) (f64.const inf)) -(assert_return (invoke "div" (f64.const -inf) (f64.const -inf)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -inf) (f64.const inf)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const inf) (f64.const -inf)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const inf) (f64.const inf)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -inf) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -inf) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -inf) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -inf) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const inf) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const inf) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const inf) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const inf) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -nan) (f64.const -0x0p+0)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -nan:0x4000000000000) (f64.const -0x0p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -nan) (f64.const 0x0p+0)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -nan:0x4000000000000) (f64.const 0x0p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const nan) (f64.const -0x0p+0)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const nan:0x4000000000000) (f64.const -0x0p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const nan) (f64.const 0x0p+0)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const nan:0x4000000000000) (f64.const 0x0p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -nan) (f64.const -0x0.0000000000001p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -nan:0x4000000000000) (f64.const -0x0.0000000000001p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -nan) (f64.const 0x0.0000000000001p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -nan:0x4000000000000) (f64.const 0x0.0000000000001p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const nan) (f64.const -0x0.0000000000001p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const nan:0x4000000000000) (f64.const -0x0.0000000000001p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const nan) (f64.const 0x0.0000000000001p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const nan:0x4000000000000) (f64.const 0x0.0000000000001p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -nan) (f64.const -0x1p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -nan:0x4000000000000) (f64.const -0x1p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -nan) (f64.const 0x1p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -nan:0x4000000000000) (f64.const 0x1p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const nan) (f64.const -0x1p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const nan:0x4000000000000) (f64.const -0x1p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const nan) (f64.const 0x1p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const nan:0x4000000000000) (f64.const 0x1p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -nan) (f64.const -0x1p-1)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -nan:0x4000000000000) (f64.const -0x1p-1)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -nan) (f64.const 0x1p-1)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -nan:0x4000000000000) (f64.const 0x1p-1)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const nan) (f64.const -0x1p-1)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const nan:0x4000000000000) (f64.const -0x1p-1)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const nan) (f64.const 0x1p-1)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const nan:0x4000000000000) (f64.const 0x1p-1)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -nan) (f64.const -0x1p+0)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -nan:0x4000000000000) (f64.const -0x1p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -nan) (f64.const 0x1p+0)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -nan:0x4000000000000) (f64.const 0x1p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const nan) (f64.const -0x1p+0)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const nan:0x4000000000000) (f64.const -0x1p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const nan) (f64.const 0x1p+0)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const nan:0x4000000000000) (f64.const 0x1p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -nan) (f64.const -0x1.921fb54442d18p+2)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -nan:0x4000000000000) (f64.const -0x1.921fb54442d18p+2)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -nan) (f64.const 0x1.921fb54442d18p+2)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -nan:0x4000000000000) (f64.const 0x1.921fb54442d18p+2)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const nan) (f64.const -0x1.921fb54442d18p+2)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const nan:0x4000000000000) (f64.const -0x1.921fb54442d18p+2)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const nan) (f64.const 0x1.921fb54442d18p+2)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const nan:0x4000000000000) (f64.const 0x1.921fb54442d18p+2)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -nan) (f64.const -0x1.fffffffffffffp+1023)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -nan:0x4000000000000) (f64.const -0x1.fffffffffffffp+1023)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -nan) (f64.const 0x1.fffffffffffffp+1023)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -nan:0x4000000000000) (f64.const 0x1.fffffffffffffp+1023)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const nan) (f64.const -0x1.fffffffffffffp+1023)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const nan:0x4000000000000) (f64.const -0x1.fffffffffffffp+1023)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const nan) (f64.const 0x1.fffffffffffffp+1023)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const nan:0x4000000000000) (f64.const 0x1.fffffffffffffp+1023)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -nan) (f64.const -inf)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -nan:0x4000000000000) (f64.const -inf)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -nan) (f64.const inf)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -nan:0x4000000000000) (f64.const inf)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const nan) (f64.const -inf)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const nan:0x4000000000000) (f64.const -inf)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const nan) (f64.const inf)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const nan:0x4000000000000) (f64.const inf)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -nan) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -nan:0x4000000000000) (f64.const -nan)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -nan) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -nan:0x4000000000000) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -nan) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const -nan:0x4000000000000) (f64.const nan)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -nan) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const -nan:0x4000000000000) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const nan) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const nan:0x4000000000000) (f64.const -nan)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const nan) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const nan:0x4000000000000) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const nan) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "div" (f64.const nan:0x4000000000000) (f64.const nan)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const nan) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "div" (f64.const nan:0x4000000000000) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -0x0p+0) (f64.const -0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "min" (f64.const -0x0p+0) (f64.const 0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "min" (f64.const 0x0p+0) (f64.const -0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "min" (f64.const 0x0p+0) (f64.const 0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "min" (f64.const -0x0p+0) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "min" (f64.const -0x0p+0) (f64.const 0x0.0000000000001p-1022)) (f64.const -0x0p+0)) -(assert_return (invoke "min" (f64.const 0x0p+0) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "min" (f64.const 0x0p+0) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "min" (f64.const -0x0p+0) (f64.const -0x1p-1022)) (f64.const -0x1p-1022)) -(assert_return (invoke "min" (f64.const -0x0p+0) (f64.const 0x1p-1022)) (f64.const -0x0p+0)) -(assert_return (invoke "min" (f64.const 0x0p+0) (f64.const -0x1p-1022)) (f64.const -0x1p-1022)) -(assert_return (invoke "min" (f64.const 0x0p+0) (f64.const 0x1p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "min" (f64.const -0x0p+0) (f64.const -0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "min" (f64.const -0x0p+0) (f64.const 0x1p-1)) (f64.const -0x0p+0)) -(assert_return (invoke "min" (f64.const 0x0p+0) (f64.const -0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "min" (f64.const 0x0p+0) (f64.const 0x1p-1)) (f64.const 0x0p+0)) -(assert_return (invoke "min" (f64.const -0x0p+0) (f64.const -0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "min" (f64.const -0x0p+0) (f64.const 0x1p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "min" (f64.const 0x0p+0) (f64.const -0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "min" (f64.const 0x0p+0) (f64.const 0x1p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "min" (f64.const -0x0p+0) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "min" (f64.const -0x0p+0) (f64.const 0x1.921fb54442d18p+2)) (f64.const -0x0p+0)) -(assert_return (invoke "min" (f64.const 0x0p+0) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "min" (f64.const 0x0p+0) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x0p+0)) -(assert_return (invoke "min" (f64.const -0x0p+0) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "min" (f64.const -0x0p+0) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -0x0p+0)) -(assert_return (invoke "min" (f64.const 0x0p+0) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "min" (f64.const 0x0p+0) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x0p+0)) -(assert_return (invoke "min" (f64.const -0x0p+0) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "min" (f64.const -0x0p+0) (f64.const inf)) (f64.const -0x0p+0)) -(assert_return (invoke "min" (f64.const 0x0p+0) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "min" (f64.const 0x0p+0) (f64.const inf)) (f64.const 0x0p+0)) -(assert_return (invoke "min" (f64.const -0x0p+0) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const -0x0p+0) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -0x0p+0) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const -0x0p+0) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const 0x0p+0) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const 0x0p+0) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const 0x0p+0) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const 0x0p+0) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -0x0.0000000000001p-1022) (f64.const -0x0p+0)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "min" (f64.const -0x0.0000000000001p-1022) (f64.const 0x0p+0)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "min" (f64.const 0x0.0000000000001p-1022) (f64.const -0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "min" (f64.const 0x0.0000000000001p-1022) (f64.const 0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "min" (f64.const -0x0.0000000000001p-1022) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "min" (f64.const -0x0.0000000000001p-1022) (f64.const 0x0.0000000000001p-1022)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "min" (f64.const 0x0.0000000000001p-1022) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "min" (f64.const 0x0.0000000000001p-1022) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "min" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p-1022)) (f64.const -0x1p-1022)) -(assert_return (invoke "min" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p-1022)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "min" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p-1022)) (f64.const -0x1p-1022)) -(assert_return (invoke "min" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p-1022)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "min" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "min" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p-1)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "min" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "min" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p-1)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "min" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "min" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p+0)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "min" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "min" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p+0)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "min" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "min" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1.921fb54442d18p+2)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "min" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "min" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "min" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "min" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "min" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "min" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "min" (f64.const -0x0.0000000000001p-1022) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "min" (f64.const -0x0.0000000000001p-1022) (f64.const inf)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "min" (f64.const 0x0.0000000000001p-1022) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "min" (f64.const 0x0.0000000000001p-1022) (f64.const inf)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "min" (f64.const -0x0.0000000000001p-1022) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const -0x0.0000000000001p-1022) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -0x0.0000000000001p-1022) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const -0x0.0000000000001p-1022) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const 0x0.0000000000001p-1022) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const 0x0.0000000000001p-1022) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const 0x0.0000000000001p-1022) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const 0x0.0000000000001p-1022) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -0x1p-1022) (f64.const -0x0p+0)) (f64.const -0x1p-1022)) -(assert_return (invoke "min" (f64.const -0x1p-1022) (f64.const 0x0p+0)) (f64.const -0x1p-1022)) -(assert_return (invoke "min" (f64.const 0x1p-1022) (f64.const -0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "min" (f64.const 0x1p-1022) (f64.const 0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "min" (f64.const -0x1p-1022) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x1p-1022)) -(assert_return (invoke "min" (f64.const -0x1p-1022) (f64.const 0x0.0000000000001p-1022)) (f64.const -0x1p-1022)) -(assert_return (invoke "min" (f64.const 0x1p-1022) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "min" (f64.const 0x1p-1022) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "min" (f64.const -0x1p-1022) (f64.const -0x1p-1022)) (f64.const -0x1p-1022)) -(assert_return (invoke "min" (f64.const -0x1p-1022) (f64.const 0x1p-1022)) (f64.const -0x1p-1022)) -(assert_return (invoke "min" (f64.const 0x1p-1022) (f64.const -0x1p-1022)) (f64.const -0x1p-1022)) -(assert_return (invoke "min" (f64.const 0x1p-1022) (f64.const 0x1p-1022)) (f64.const 0x1p-1022)) -(assert_return (invoke "min" (f64.const -0x1p-1022) (f64.const -0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "min" (f64.const -0x1p-1022) (f64.const 0x1p-1)) (f64.const -0x1p-1022)) -(assert_return (invoke "min" (f64.const 0x1p-1022) (f64.const -0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "min" (f64.const 0x1p-1022) (f64.const 0x1p-1)) (f64.const 0x1p-1022)) -(assert_return (invoke "min" (f64.const -0x1p-1022) (f64.const -0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "min" (f64.const -0x1p-1022) (f64.const 0x1p+0)) (f64.const -0x1p-1022)) -(assert_return (invoke "min" (f64.const 0x1p-1022) (f64.const -0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "min" (f64.const 0x1p-1022) (f64.const 0x1p+0)) (f64.const 0x1p-1022)) -(assert_return (invoke "min" (f64.const -0x1p-1022) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "min" (f64.const -0x1p-1022) (f64.const 0x1.921fb54442d18p+2)) (f64.const -0x1p-1022)) -(assert_return (invoke "min" (f64.const 0x1p-1022) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "min" (f64.const 0x1p-1022) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1p-1022)) -(assert_return (invoke "min" (f64.const -0x1p-1022) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "min" (f64.const -0x1p-1022) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -0x1p-1022)) -(assert_return (invoke "min" (f64.const 0x1p-1022) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "min" (f64.const 0x1p-1022) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1p-1022)) -(assert_return (invoke "min" (f64.const -0x1p-1022) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "min" (f64.const -0x1p-1022) (f64.const inf)) (f64.const -0x1p-1022)) -(assert_return (invoke "min" (f64.const 0x1p-1022) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "min" (f64.const 0x1p-1022) (f64.const inf)) (f64.const 0x1p-1022)) -(assert_return (invoke "min" (f64.const -0x1p-1022) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const -0x1p-1022) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -0x1p-1022) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const -0x1p-1022) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const 0x1p-1022) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const 0x1p-1022) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const 0x1p-1022) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const 0x1p-1022) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -0x1p-1) (f64.const -0x0p+0)) (f64.const -0x1p-1)) -(assert_return (invoke "min" (f64.const -0x1p-1) (f64.const 0x0p+0)) (f64.const -0x1p-1)) -(assert_return (invoke "min" (f64.const 0x1p-1) (f64.const -0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "min" (f64.const 0x1p-1) (f64.const 0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "min" (f64.const -0x1p-1) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x1p-1)) -(assert_return (invoke "min" (f64.const -0x1p-1) (f64.const 0x0.0000000000001p-1022)) (f64.const -0x1p-1)) -(assert_return (invoke "min" (f64.const 0x1p-1) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "min" (f64.const 0x1p-1) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "min" (f64.const -0x1p-1) (f64.const -0x1p-1022)) (f64.const -0x1p-1)) -(assert_return (invoke "min" (f64.const -0x1p-1) (f64.const 0x1p-1022)) (f64.const -0x1p-1)) -(assert_return (invoke "min" (f64.const 0x1p-1) (f64.const -0x1p-1022)) (f64.const -0x1p-1022)) -(assert_return (invoke "min" (f64.const 0x1p-1) (f64.const 0x1p-1022)) (f64.const 0x1p-1022)) -(assert_return (invoke "min" (f64.const -0x1p-1) (f64.const -0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "min" (f64.const -0x1p-1) (f64.const 0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "min" (f64.const 0x1p-1) (f64.const -0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "min" (f64.const 0x1p-1) (f64.const 0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "min" (f64.const -0x1p-1) (f64.const -0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "min" (f64.const -0x1p-1) (f64.const 0x1p+0)) (f64.const -0x1p-1)) -(assert_return (invoke "min" (f64.const 0x1p-1) (f64.const -0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "min" (f64.const 0x1p-1) (f64.const 0x1p+0)) (f64.const 0x1p-1)) -(assert_return (invoke "min" (f64.const -0x1p-1) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "min" (f64.const -0x1p-1) (f64.const 0x1.921fb54442d18p+2)) (f64.const -0x1p-1)) -(assert_return (invoke "min" (f64.const 0x1p-1) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "min" (f64.const 0x1p-1) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1p-1)) -(assert_return (invoke "min" (f64.const -0x1p-1) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "min" (f64.const -0x1p-1) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -0x1p-1)) -(assert_return (invoke "min" (f64.const 0x1p-1) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "min" (f64.const 0x1p-1) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1p-1)) -(assert_return (invoke "min" (f64.const -0x1p-1) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "min" (f64.const -0x1p-1) (f64.const inf)) (f64.const -0x1p-1)) -(assert_return (invoke "min" (f64.const 0x1p-1) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "min" (f64.const 0x1p-1) (f64.const inf)) (f64.const 0x1p-1)) -(assert_return (invoke "min" (f64.const -0x1p-1) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const -0x1p-1) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -0x1p-1) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const -0x1p-1) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const 0x1p-1) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const 0x1p-1) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const 0x1p-1) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const 0x1p-1) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -0x1p+0) (f64.const -0x0p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "min" (f64.const -0x1p+0) (f64.const 0x0p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "min" (f64.const 0x1p+0) (f64.const -0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "min" (f64.const 0x1p+0) (f64.const 0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "min" (f64.const -0x1p+0) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x1p+0)) -(assert_return (invoke "min" (f64.const -0x1p+0) (f64.const 0x0.0000000000001p-1022)) (f64.const -0x1p+0)) -(assert_return (invoke "min" (f64.const 0x1p+0) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "min" (f64.const 0x1p+0) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "min" (f64.const -0x1p+0) (f64.const -0x1p-1022)) (f64.const -0x1p+0)) -(assert_return (invoke "min" (f64.const -0x1p+0) (f64.const 0x1p-1022)) (f64.const -0x1p+0)) -(assert_return (invoke "min" (f64.const 0x1p+0) (f64.const -0x1p-1022)) (f64.const -0x1p-1022)) -(assert_return (invoke "min" (f64.const 0x1p+0) (f64.const 0x1p-1022)) (f64.const 0x1p-1022)) -(assert_return (invoke "min" (f64.const -0x1p+0) (f64.const -0x1p-1)) (f64.const -0x1p+0)) -(assert_return (invoke "min" (f64.const -0x1p+0) (f64.const 0x1p-1)) (f64.const -0x1p+0)) -(assert_return (invoke "min" (f64.const 0x1p+0) (f64.const -0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "min" (f64.const 0x1p+0) (f64.const 0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "min" (f64.const -0x1p+0) (f64.const -0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "min" (f64.const -0x1p+0) (f64.const 0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "min" (f64.const 0x1p+0) (f64.const -0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "min" (f64.const 0x1p+0) (f64.const 0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "min" (f64.const -0x1p+0) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "min" (f64.const -0x1p+0) (f64.const 0x1.921fb54442d18p+2)) (f64.const -0x1p+0)) -(assert_return (invoke "min" (f64.const 0x1p+0) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "min" (f64.const 0x1p+0) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1p+0)) -(assert_return (invoke "min" (f64.const -0x1p+0) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "min" (f64.const -0x1p+0) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -0x1p+0)) -(assert_return (invoke "min" (f64.const 0x1p+0) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "min" (f64.const 0x1p+0) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1p+0)) -(assert_return (invoke "min" (f64.const -0x1p+0) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "min" (f64.const -0x1p+0) (f64.const inf)) (f64.const -0x1p+0)) -(assert_return (invoke "min" (f64.const 0x1p+0) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "min" (f64.const 0x1p+0) (f64.const inf)) (f64.const 0x1p+0)) -(assert_return (invoke "min" (f64.const -0x1p+0) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const -0x1p+0) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -0x1p+0) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const -0x1p+0) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const 0x1p+0) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const 0x1p+0) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const 0x1p+0) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const 0x1p+0) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x0p+0)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "min" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x0p+0)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "min" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "min" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "min" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "min" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x0.0000000000001p-1022)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "min" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "min" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "min" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p-1022)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "min" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p-1022)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "min" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p-1022)) (f64.const -0x1p-1022)) -(assert_return (invoke "min" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p-1022)) (f64.const 0x1p-1022)) -(assert_return (invoke "min" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p-1)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "min" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p-1)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "min" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "min" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "min" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p+0)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "min" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p+0)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "min" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "min" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "min" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "min" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "min" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "min" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "min" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "min" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "min" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "min" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "min" (f64.const -0x1.921fb54442d18p+2) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "min" (f64.const -0x1.921fb54442d18p+2) (f64.const inf)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "min" (f64.const 0x1.921fb54442d18p+2) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "min" (f64.const 0x1.921fb54442d18p+2) (f64.const inf)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "min" (f64.const -0x1.921fb54442d18p+2) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const -0x1.921fb54442d18p+2) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -0x1.921fb54442d18p+2) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const -0x1.921fb54442d18p+2) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const 0x1.921fb54442d18p+2) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const 0x1.921fb54442d18p+2) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const 0x1.921fb54442d18p+2) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const 0x1.921fb54442d18p+2) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x0p+0)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "min" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x0p+0)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "min" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "min" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "min" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "min" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x0.0000000000001p-1022)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "min" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "min" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "min" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p-1022)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "min" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p-1022)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "min" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p-1022)) (f64.const -0x1p-1022)) -(assert_return (invoke "min" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p-1022)) (f64.const 0x1p-1022)) -(assert_return (invoke "min" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p-1)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "min" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p-1)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "min" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "min" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "min" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p+0)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "min" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p+0)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "min" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "min" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "min" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "min" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1.921fb54442d18p+2)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "min" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "min" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "min" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "min" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "min" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "min" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "min" (f64.const -0x1.fffffffffffffp+1023) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "min" (f64.const -0x1.fffffffffffffp+1023) (f64.const inf)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "min" (f64.const 0x1.fffffffffffffp+1023) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "min" (f64.const 0x1.fffffffffffffp+1023) (f64.const inf)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "min" (f64.const -0x1.fffffffffffffp+1023) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const -0x1.fffffffffffffp+1023) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -0x1.fffffffffffffp+1023) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const -0x1.fffffffffffffp+1023) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const 0x1.fffffffffffffp+1023) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const 0x1.fffffffffffffp+1023) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const 0x1.fffffffffffffp+1023) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const 0x1.fffffffffffffp+1023) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -inf) (f64.const -0x0p+0)) (f64.const -inf)) -(assert_return (invoke "min" (f64.const -inf) (f64.const 0x0p+0)) (f64.const -inf)) -(assert_return (invoke "min" (f64.const inf) (f64.const -0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "min" (f64.const inf) (f64.const 0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "min" (f64.const -inf) (f64.const -0x0.0000000000001p-1022)) (f64.const -inf)) -(assert_return (invoke "min" (f64.const -inf) (f64.const 0x0.0000000000001p-1022)) (f64.const -inf)) -(assert_return (invoke "min" (f64.const inf) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "min" (f64.const inf) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "min" (f64.const -inf) (f64.const -0x1p-1022)) (f64.const -inf)) -(assert_return (invoke "min" (f64.const -inf) (f64.const 0x1p-1022)) (f64.const -inf)) -(assert_return (invoke "min" (f64.const inf) (f64.const -0x1p-1022)) (f64.const -0x1p-1022)) -(assert_return (invoke "min" (f64.const inf) (f64.const 0x1p-1022)) (f64.const 0x1p-1022)) -(assert_return (invoke "min" (f64.const -inf) (f64.const -0x1p-1)) (f64.const -inf)) -(assert_return (invoke "min" (f64.const -inf) (f64.const 0x1p-1)) (f64.const -inf)) -(assert_return (invoke "min" (f64.const inf) (f64.const -0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "min" (f64.const inf) (f64.const 0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "min" (f64.const -inf) (f64.const -0x1p+0)) (f64.const -inf)) -(assert_return (invoke "min" (f64.const -inf) (f64.const 0x1p+0)) (f64.const -inf)) -(assert_return (invoke "min" (f64.const inf) (f64.const -0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "min" (f64.const inf) (f64.const 0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "min" (f64.const -inf) (f64.const -0x1.921fb54442d18p+2)) (f64.const -inf)) -(assert_return (invoke "min" (f64.const -inf) (f64.const 0x1.921fb54442d18p+2)) (f64.const -inf)) -(assert_return (invoke "min" (f64.const inf) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "min" (f64.const inf) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "min" (f64.const -inf) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -inf)) -(assert_return (invoke "min" (f64.const -inf) (f64.const 0x1.fffffffffffffp+1023)) (f64.const -inf)) -(assert_return (invoke "min" (f64.const inf) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "min" (f64.const inf) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "min" (f64.const -inf) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "min" (f64.const -inf) (f64.const inf)) (f64.const -inf)) -(assert_return (invoke "min" (f64.const inf) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "min" (f64.const inf) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "min" (f64.const -inf) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const -inf) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -inf) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const -inf) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const inf) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const inf) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const inf) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const inf) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -nan) (f64.const -0x0p+0)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const -nan:0x4000000000000) (f64.const -0x0p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -nan) (f64.const 0x0p+0)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const -nan:0x4000000000000) (f64.const 0x0p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const nan) (f64.const -0x0p+0)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const nan:0x4000000000000) (f64.const -0x0p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const nan) (f64.const 0x0p+0)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const nan:0x4000000000000) (f64.const 0x0p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -nan) (f64.const -0x0.0000000000001p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const -nan:0x4000000000000) (f64.const -0x0.0000000000001p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -nan) (f64.const 0x0.0000000000001p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const -nan:0x4000000000000) (f64.const 0x0.0000000000001p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const nan) (f64.const -0x0.0000000000001p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const nan:0x4000000000000) (f64.const -0x0.0000000000001p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const nan) (f64.const 0x0.0000000000001p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const nan:0x4000000000000) (f64.const 0x0.0000000000001p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -nan) (f64.const -0x1p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const -nan:0x4000000000000) (f64.const -0x1p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -nan) (f64.const 0x1p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const -nan:0x4000000000000) (f64.const 0x1p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const nan) (f64.const -0x1p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const nan:0x4000000000000) (f64.const -0x1p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const nan) (f64.const 0x1p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const nan:0x4000000000000) (f64.const 0x1p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -nan) (f64.const -0x1p-1)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const -nan:0x4000000000000) (f64.const -0x1p-1)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -nan) (f64.const 0x1p-1)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const -nan:0x4000000000000) (f64.const 0x1p-1)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const nan) (f64.const -0x1p-1)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const nan:0x4000000000000) (f64.const -0x1p-1)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const nan) (f64.const 0x1p-1)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const nan:0x4000000000000) (f64.const 0x1p-1)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -nan) (f64.const -0x1p+0)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const -nan:0x4000000000000) (f64.const -0x1p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -nan) (f64.const 0x1p+0)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const -nan:0x4000000000000) (f64.const 0x1p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const nan) (f64.const -0x1p+0)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const nan:0x4000000000000) (f64.const -0x1p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const nan) (f64.const 0x1p+0)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const nan:0x4000000000000) (f64.const 0x1p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -nan) (f64.const -0x1.921fb54442d18p+2)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const -nan:0x4000000000000) (f64.const -0x1.921fb54442d18p+2)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -nan) (f64.const 0x1.921fb54442d18p+2)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const -nan:0x4000000000000) (f64.const 0x1.921fb54442d18p+2)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const nan) (f64.const -0x1.921fb54442d18p+2)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const nan:0x4000000000000) (f64.const -0x1.921fb54442d18p+2)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const nan) (f64.const 0x1.921fb54442d18p+2)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const nan:0x4000000000000) (f64.const 0x1.921fb54442d18p+2)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -nan) (f64.const -0x1.fffffffffffffp+1023)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const -nan:0x4000000000000) (f64.const -0x1.fffffffffffffp+1023)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -nan) (f64.const 0x1.fffffffffffffp+1023)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const -nan:0x4000000000000) (f64.const 0x1.fffffffffffffp+1023)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const nan) (f64.const -0x1.fffffffffffffp+1023)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const nan:0x4000000000000) (f64.const -0x1.fffffffffffffp+1023)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const nan) (f64.const 0x1.fffffffffffffp+1023)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const nan:0x4000000000000) (f64.const 0x1.fffffffffffffp+1023)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -nan) (f64.const -inf)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const -nan:0x4000000000000) (f64.const -inf)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -nan) (f64.const inf)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const -nan:0x4000000000000) (f64.const inf)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const nan) (f64.const -inf)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const nan:0x4000000000000) (f64.const -inf)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const nan) (f64.const inf)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const nan:0x4000000000000) (f64.const inf)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -nan) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const -nan:0x4000000000000) (f64.const -nan)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -nan) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -nan:0x4000000000000) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -nan) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const -nan:0x4000000000000) (f64.const nan)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -nan) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const -nan:0x4000000000000) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const nan) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const nan:0x4000000000000) (f64.const -nan)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const nan) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const nan:0x4000000000000) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const nan) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "min" (f64.const nan:0x4000000000000) (f64.const nan)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const nan) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "min" (f64.const nan:0x4000000000000) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -0x0p+0) (f64.const -0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "max" (f64.const -0x0p+0) (f64.const 0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "max" (f64.const 0x0p+0) (f64.const -0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "max" (f64.const 0x0p+0) (f64.const 0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "max" (f64.const -0x0p+0) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0p+0)) -(assert_return (invoke "max" (f64.const -0x0p+0) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "max" (f64.const 0x0p+0) (f64.const -0x0.0000000000001p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "max" (f64.const 0x0p+0) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "max" (f64.const -0x0p+0) (f64.const -0x1p-1022)) (f64.const -0x0p+0)) -(assert_return (invoke "max" (f64.const -0x0p+0) (f64.const 0x1p-1022)) (f64.const 0x1p-1022)) -(assert_return (invoke "max" (f64.const 0x0p+0) (f64.const -0x1p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "max" (f64.const 0x0p+0) (f64.const 0x1p-1022)) (f64.const 0x1p-1022)) -(assert_return (invoke "max" (f64.const -0x0p+0) (f64.const -0x1p-1)) (f64.const -0x0p+0)) -(assert_return (invoke "max" (f64.const -0x0p+0) (f64.const 0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "max" (f64.const 0x0p+0) (f64.const -0x1p-1)) (f64.const 0x0p+0)) -(assert_return (invoke "max" (f64.const 0x0p+0) (f64.const 0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "max" (f64.const -0x0p+0) (f64.const -0x1p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "max" (f64.const -0x0p+0) (f64.const 0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "max" (f64.const 0x0p+0) (f64.const -0x1p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "max" (f64.const 0x0p+0) (f64.const 0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "max" (f64.const -0x0p+0) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x0p+0)) -(assert_return (invoke "max" (f64.const -0x0p+0) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "max" (f64.const 0x0p+0) (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x0p+0)) -(assert_return (invoke "max" (f64.const 0x0p+0) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "max" (f64.const -0x0p+0) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x0p+0)) -(assert_return (invoke "max" (f64.const -0x0p+0) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "max" (f64.const 0x0p+0) (f64.const -0x1.fffffffffffffp+1023)) (f64.const 0x0p+0)) -(assert_return (invoke "max" (f64.const 0x0p+0) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "max" (f64.const -0x0p+0) (f64.const -inf)) (f64.const -0x0p+0)) -(assert_return (invoke "max" (f64.const -0x0p+0) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "max" (f64.const 0x0p+0) (f64.const -inf)) (f64.const 0x0p+0)) -(assert_return (invoke "max" (f64.const 0x0p+0) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "max" (f64.const -0x0p+0) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const -0x0p+0) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -0x0p+0) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const -0x0p+0) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const 0x0p+0) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const 0x0p+0) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const 0x0p+0) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const 0x0p+0) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -0x0.0000000000001p-1022) (f64.const -0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "max" (f64.const -0x0.0000000000001p-1022) (f64.const 0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "max" (f64.const 0x0.0000000000001p-1022) (f64.const -0x0p+0)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "max" (f64.const 0x0.0000000000001p-1022) (f64.const 0x0p+0)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "max" (f64.const -0x0.0000000000001p-1022) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "max" (f64.const -0x0.0000000000001p-1022) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "max" (f64.const 0x0.0000000000001p-1022) (f64.const -0x0.0000000000001p-1022)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "max" (f64.const 0x0.0000000000001p-1022) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "max" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p-1022)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "max" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p-1022)) (f64.const 0x1p-1022)) -(assert_return (invoke "max" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p-1022)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "max" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p-1022)) (f64.const 0x1p-1022)) -(assert_return (invoke "max" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p-1)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "max" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "max" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p-1)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "max" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "max" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p+0)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "max" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "max" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p+0)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "max" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "max" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "max" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "max" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "max" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "max" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "max" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "max" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1.fffffffffffffp+1023)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "max" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "max" (f64.const -0x0.0000000000001p-1022) (f64.const -inf)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "max" (f64.const -0x0.0000000000001p-1022) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "max" (f64.const 0x0.0000000000001p-1022) (f64.const -inf)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "max" (f64.const 0x0.0000000000001p-1022) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "max" (f64.const -0x0.0000000000001p-1022) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const -0x0.0000000000001p-1022) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -0x0.0000000000001p-1022) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const -0x0.0000000000001p-1022) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const 0x0.0000000000001p-1022) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const 0x0.0000000000001p-1022) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const 0x0.0000000000001p-1022) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const 0x0.0000000000001p-1022) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -0x1p-1022) (f64.const -0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "max" (f64.const -0x1p-1022) (f64.const 0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "max" (f64.const 0x1p-1022) (f64.const -0x0p+0)) (f64.const 0x1p-1022)) -(assert_return (invoke "max" (f64.const 0x1p-1022) (f64.const 0x0p+0)) (f64.const 0x1p-1022)) -(assert_return (invoke "max" (f64.const -0x1p-1022) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "max" (f64.const -0x1p-1022) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "max" (f64.const 0x1p-1022) (f64.const -0x0.0000000000001p-1022)) (f64.const 0x1p-1022)) -(assert_return (invoke "max" (f64.const 0x1p-1022) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x1p-1022)) -(assert_return (invoke "max" (f64.const -0x1p-1022) (f64.const -0x1p-1022)) (f64.const -0x1p-1022)) -(assert_return (invoke "max" (f64.const -0x1p-1022) (f64.const 0x1p-1022)) (f64.const 0x1p-1022)) -(assert_return (invoke "max" (f64.const 0x1p-1022) (f64.const -0x1p-1022)) (f64.const 0x1p-1022)) -(assert_return (invoke "max" (f64.const 0x1p-1022) (f64.const 0x1p-1022)) (f64.const 0x1p-1022)) -(assert_return (invoke "max" (f64.const -0x1p-1022) (f64.const -0x1p-1)) (f64.const -0x1p-1022)) -(assert_return (invoke "max" (f64.const -0x1p-1022) (f64.const 0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "max" (f64.const 0x1p-1022) (f64.const -0x1p-1)) (f64.const 0x1p-1022)) -(assert_return (invoke "max" (f64.const 0x1p-1022) (f64.const 0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "max" (f64.const -0x1p-1022) (f64.const -0x1p+0)) (f64.const -0x1p-1022)) -(assert_return (invoke "max" (f64.const -0x1p-1022) (f64.const 0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "max" (f64.const 0x1p-1022) (f64.const -0x1p+0)) (f64.const 0x1p-1022)) -(assert_return (invoke "max" (f64.const 0x1p-1022) (f64.const 0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "max" (f64.const -0x1p-1022) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1p-1022)) -(assert_return (invoke "max" (f64.const -0x1p-1022) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "max" (f64.const 0x1p-1022) (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x1p-1022)) -(assert_return (invoke "max" (f64.const 0x1p-1022) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "max" (f64.const -0x1p-1022) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1p-1022)) -(assert_return (invoke "max" (f64.const -0x1p-1022) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "max" (f64.const 0x1p-1022) (f64.const -0x1.fffffffffffffp+1023)) (f64.const 0x1p-1022)) -(assert_return (invoke "max" (f64.const 0x1p-1022) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "max" (f64.const -0x1p-1022) (f64.const -inf)) (f64.const -0x1p-1022)) -(assert_return (invoke "max" (f64.const -0x1p-1022) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "max" (f64.const 0x1p-1022) (f64.const -inf)) (f64.const 0x1p-1022)) -(assert_return (invoke "max" (f64.const 0x1p-1022) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "max" (f64.const -0x1p-1022) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const -0x1p-1022) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -0x1p-1022) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const -0x1p-1022) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const 0x1p-1022) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const 0x1p-1022) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const 0x1p-1022) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const 0x1p-1022) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -0x1p-1) (f64.const -0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "max" (f64.const -0x1p-1) (f64.const 0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "max" (f64.const 0x1p-1) (f64.const -0x0p+0)) (f64.const 0x1p-1)) -(assert_return (invoke "max" (f64.const 0x1p-1) (f64.const 0x0p+0)) (f64.const 0x1p-1)) -(assert_return (invoke "max" (f64.const -0x1p-1) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "max" (f64.const -0x1p-1) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "max" (f64.const 0x1p-1) (f64.const -0x0.0000000000001p-1022)) (f64.const 0x1p-1)) -(assert_return (invoke "max" (f64.const 0x1p-1) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x1p-1)) -(assert_return (invoke "max" (f64.const -0x1p-1) (f64.const -0x1p-1022)) (f64.const -0x1p-1022)) -(assert_return (invoke "max" (f64.const -0x1p-1) (f64.const 0x1p-1022)) (f64.const 0x1p-1022)) -(assert_return (invoke "max" (f64.const 0x1p-1) (f64.const -0x1p-1022)) (f64.const 0x1p-1)) -(assert_return (invoke "max" (f64.const 0x1p-1) (f64.const 0x1p-1022)) (f64.const 0x1p-1)) -(assert_return (invoke "max" (f64.const -0x1p-1) (f64.const -0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "max" (f64.const -0x1p-1) (f64.const 0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "max" (f64.const 0x1p-1) (f64.const -0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "max" (f64.const 0x1p-1) (f64.const 0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "max" (f64.const -0x1p-1) (f64.const -0x1p+0)) (f64.const -0x1p-1)) -(assert_return (invoke "max" (f64.const -0x1p-1) (f64.const 0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "max" (f64.const 0x1p-1) (f64.const -0x1p+0)) (f64.const 0x1p-1)) -(assert_return (invoke "max" (f64.const 0x1p-1) (f64.const 0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "max" (f64.const -0x1p-1) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1p-1)) -(assert_return (invoke "max" (f64.const -0x1p-1) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "max" (f64.const 0x1p-1) (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x1p-1)) -(assert_return (invoke "max" (f64.const 0x1p-1) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "max" (f64.const -0x1p-1) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1p-1)) -(assert_return (invoke "max" (f64.const -0x1p-1) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "max" (f64.const 0x1p-1) (f64.const -0x1.fffffffffffffp+1023)) (f64.const 0x1p-1)) -(assert_return (invoke "max" (f64.const 0x1p-1) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "max" (f64.const -0x1p-1) (f64.const -inf)) (f64.const -0x1p-1)) -(assert_return (invoke "max" (f64.const -0x1p-1) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "max" (f64.const 0x1p-1) (f64.const -inf)) (f64.const 0x1p-1)) -(assert_return (invoke "max" (f64.const 0x1p-1) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "max" (f64.const -0x1p-1) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const -0x1p-1) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -0x1p-1) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const -0x1p-1) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const 0x1p-1) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const 0x1p-1) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const 0x1p-1) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const 0x1p-1) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -0x1p+0) (f64.const -0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "max" (f64.const -0x1p+0) (f64.const 0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "max" (f64.const 0x1p+0) (f64.const -0x0p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "max" (f64.const 0x1p+0) (f64.const 0x0p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "max" (f64.const -0x1p+0) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "max" (f64.const -0x1p+0) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "max" (f64.const 0x1p+0) (f64.const -0x0.0000000000001p-1022)) (f64.const 0x1p+0)) -(assert_return (invoke "max" (f64.const 0x1p+0) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x1p+0)) -(assert_return (invoke "max" (f64.const -0x1p+0) (f64.const -0x1p-1022)) (f64.const -0x1p-1022)) -(assert_return (invoke "max" (f64.const -0x1p+0) (f64.const 0x1p-1022)) (f64.const 0x1p-1022)) -(assert_return (invoke "max" (f64.const 0x1p+0) (f64.const -0x1p-1022)) (f64.const 0x1p+0)) -(assert_return (invoke "max" (f64.const 0x1p+0) (f64.const 0x1p-1022)) (f64.const 0x1p+0)) -(assert_return (invoke "max" (f64.const -0x1p+0) (f64.const -0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "max" (f64.const -0x1p+0) (f64.const 0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "max" (f64.const 0x1p+0) (f64.const -0x1p-1)) (f64.const 0x1p+0)) -(assert_return (invoke "max" (f64.const 0x1p+0) (f64.const 0x1p-1)) (f64.const 0x1p+0)) -(assert_return (invoke "max" (f64.const -0x1p+0) (f64.const -0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "max" (f64.const -0x1p+0) (f64.const 0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "max" (f64.const 0x1p+0) (f64.const -0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "max" (f64.const 0x1p+0) (f64.const 0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "max" (f64.const -0x1p+0) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1p+0)) -(assert_return (invoke "max" (f64.const -0x1p+0) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "max" (f64.const 0x1p+0) (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x1p+0)) -(assert_return (invoke "max" (f64.const 0x1p+0) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "max" (f64.const -0x1p+0) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1p+0)) -(assert_return (invoke "max" (f64.const -0x1p+0) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "max" (f64.const 0x1p+0) (f64.const -0x1.fffffffffffffp+1023)) (f64.const 0x1p+0)) -(assert_return (invoke "max" (f64.const 0x1p+0) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "max" (f64.const -0x1p+0) (f64.const -inf)) (f64.const -0x1p+0)) -(assert_return (invoke "max" (f64.const -0x1p+0) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "max" (f64.const 0x1p+0) (f64.const -inf)) (f64.const 0x1p+0)) -(assert_return (invoke "max" (f64.const 0x1p+0) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "max" (f64.const -0x1p+0) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const -0x1p+0) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -0x1p+0) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const -0x1p+0) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const 0x1p+0) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const 0x1p+0) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const 0x1p+0) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const 0x1p+0) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "max" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "max" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x0p+0)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "max" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x0p+0)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "max" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "max" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "max" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x0.0000000000001p-1022)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "max" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "max" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p-1022)) (f64.const -0x1p-1022)) -(assert_return (invoke "max" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p-1022)) (f64.const 0x1p-1022)) -(assert_return (invoke "max" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p-1022)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "max" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p-1022)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "max" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "max" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "max" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p-1)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "max" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p-1)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "max" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "max" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "max" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p+0)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "max" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p+0)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "max" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "max" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "max" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "max" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "max" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "max" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "max" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1.fffffffffffffp+1023)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "max" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "max" (f64.const -0x1.921fb54442d18p+2) (f64.const -inf)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "max" (f64.const -0x1.921fb54442d18p+2) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "max" (f64.const 0x1.921fb54442d18p+2) (f64.const -inf)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "max" (f64.const 0x1.921fb54442d18p+2) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "max" (f64.const -0x1.921fb54442d18p+2) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const -0x1.921fb54442d18p+2) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -0x1.921fb54442d18p+2) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const -0x1.921fb54442d18p+2) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const 0x1.921fb54442d18p+2) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const 0x1.921fb54442d18p+2) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const 0x1.921fb54442d18p+2) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const 0x1.921fb54442d18p+2) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "max" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "max" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x0p+0)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "max" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x0p+0)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "max" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "max" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "max" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x0.0000000000001p-1022)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "max" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "max" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p-1022)) (f64.const -0x1p-1022)) -(assert_return (invoke "max" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p-1022)) (f64.const 0x1p-1022)) -(assert_return (invoke "max" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p-1022)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "max" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p-1022)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "max" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "max" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "max" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p-1)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "max" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p-1)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "max" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "max" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "max" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p+0)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "max" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p+0)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "max" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "max" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "max" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "max" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "max" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "max" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "max" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "max" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "max" (f64.const -0x1.fffffffffffffp+1023) (f64.const -inf)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "max" (f64.const -0x1.fffffffffffffp+1023) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "max" (f64.const 0x1.fffffffffffffp+1023) (f64.const -inf)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "max" (f64.const 0x1.fffffffffffffp+1023) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "max" (f64.const -0x1.fffffffffffffp+1023) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const -0x1.fffffffffffffp+1023) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -0x1.fffffffffffffp+1023) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const -0x1.fffffffffffffp+1023) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const 0x1.fffffffffffffp+1023) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const 0x1.fffffffffffffp+1023) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const 0x1.fffffffffffffp+1023) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const 0x1.fffffffffffffp+1023) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -inf) (f64.const -0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "max" (f64.const -inf) (f64.const 0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "max" (f64.const inf) (f64.const -0x0p+0)) (f64.const inf)) -(assert_return (invoke "max" (f64.const inf) (f64.const 0x0p+0)) (f64.const inf)) -(assert_return (invoke "max" (f64.const -inf) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "max" (f64.const -inf) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "max" (f64.const inf) (f64.const -0x0.0000000000001p-1022)) (f64.const inf)) -(assert_return (invoke "max" (f64.const inf) (f64.const 0x0.0000000000001p-1022)) (f64.const inf)) -(assert_return (invoke "max" (f64.const -inf) (f64.const -0x1p-1022)) (f64.const -0x1p-1022)) -(assert_return (invoke "max" (f64.const -inf) (f64.const 0x1p-1022)) (f64.const 0x1p-1022)) -(assert_return (invoke "max" (f64.const inf) (f64.const -0x1p-1022)) (f64.const inf)) -(assert_return (invoke "max" (f64.const inf) (f64.const 0x1p-1022)) (f64.const inf)) -(assert_return (invoke "max" (f64.const -inf) (f64.const -0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "max" (f64.const -inf) (f64.const 0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "max" (f64.const inf) (f64.const -0x1p-1)) (f64.const inf)) -(assert_return (invoke "max" (f64.const inf) (f64.const 0x1p-1)) (f64.const inf)) -(assert_return (invoke "max" (f64.const -inf) (f64.const -0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "max" (f64.const -inf) (f64.const 0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "max" (f64.const inf) (f64.const -0x1p+0)) (f64.const inf)) -(assert_return (invoke "max" (f64.const inf) (f64.const 0x1p+0)) (f64.const inf)) -(assert_return (invoke "max" (f64.const -inf) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "max" (f64.const -inf) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "max" (f64.const inf) (f64.const -0x1.921fb54442d18p+2)) (f64.const inf)) -(assert_return (invoke "max" (f64.const inf) (f64.const 0x1.921fb54442d18p+2)) (f64.const inf)) -(assert_return (invoke "max" (f64.const -inf) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "max" (f64.const -inf) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "max" (f64.const inf) (f64.const -0x1.fffffffffffffp+1023)) (f64.const inf)) -(assert_return (invoke "max" (f64.const inf) (f64.const 0x1.fffffffffffffp+1023)) (f64.const inf)) -(assert_return (invoke "max" (f64.const -inf) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "max" (f64.const -inf) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "max" (f64.const inf) (f64.const -inf)) (f64.const inf)) -(assert_return (invoke "max" (f64.const inf) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "max" (f64.const -inf) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const -inf) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -inf) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const -inf) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const inf) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const inf) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const inf) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const inf) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -nan) (f64.const -0x0p+0)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const -nan:0x4000000000000) (f64.const -0x0p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -nan) (f64.const 0x0p+0)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const -nan:0x4000000000000) (f64.const 0x0p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const nan) (f64.const -0x0p+0)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const nan:0x4000000000000) (f64.const -0x0p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const nan) (f64.const 0x0p+0)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const nan:0x4000000000000) (f64.const 0x0p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -nan) (f64.const -0x0.0000000000001p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const -nan:0x4000000000000) (f64.const -0x0.0000000000001p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -nan) (f64.const 0x0.0000000000001p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const -nan:0x4000000000000) (f64.const 0x0.0000000000001p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const nan) (f64.const -0x0.0000000000001p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const nan:0x4000000000000) (f64.const -0x0.0000000000001p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const nan) (f64.const 0x0.0000000000001p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const nan:0x4000000000000) (f64.const 0x0.0000000000001p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -nan) (f64.const -0x1p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const -nan:0x4000000000000) (f64.const -0x1p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -nan) (f64.const 0x1p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const -nan:0x4000000000000) (f64.const 0x1p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const nan) (f64.const -0x1p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const nan:0x4000000000000) (f64.const -0x1p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const nan) (f64.const 0x1p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const nan:0x4000000000000) (f64.const 0x1p-1022)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -nan) (f64.const -0x1p-1)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const -nan:0x4000000000000) (f64.const -0x1p-1)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -nan) (f64.const 0x1p-1)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const -nan:0x4000000000000) (f64.const 0x1p-1)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const nan) (f64.const -0x1p-1)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const nan:0x4000000000000) (f64.const -0x1p-1)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const nan) (f64.const 0x1p-1)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const nan:0x4000000000000) (f64.const 0x1p-1)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -nan) (f64.const -0x1p+0)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const -nan:0x4000000000000) (f64.const -0x1p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -nan) (f64.const 0x1p+0)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const -nan:0x4000000000000) (f64.const 0x1p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const nan) (f64.const -0x1p+0)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const nan:0x4000000000000) (f64.const -0x1p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const nan) (f64.const 0x1p+0)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const nan:0x4000000000000) (f64.const 0x1p+0)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -nan) (f64.const -0x1.921fb54442d18p+2)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const -nan:0x4000000000000) (f64.const -0x1.921fb54442d18p+2)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -nan) (f64.const 0x1.921fb54442d18p+2)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const -nan:0x4000000000000) (f64.const 0x1.921fb54442d18p+2)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const nan) (f64.const -0x1.921fb54442d18p+2)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const nan:0x4000000000000) (f64.const -0x1.921fb54442d18p+2)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const nan) (f64.const 0x1.921fb54442d18p+2)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const nan:0x4000000000000) (f64.const 0x1.921fb54442d18p+2)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -nan) (f64.const -0x1.fffffffffffffp+1023)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const -nan:0x4000000000000) (f64.const -0x1.fffffffffffffp+1023)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -nan) (f64.const 0x1.fffffffffffffp+1023)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const -nan:0x4000000000000) (f64.const 0x1.fffffffffffffp+1023)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const nan) (f64.const -0x1.fffffffffffffp+1023)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const nan:0x4000000000000) (f64.const -0x1.fffffffffffffp+1023)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const nan) (f64.const 0x1.fffffffffffffp+1023)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const nan:0x4000000000000) (f64.const 0x1.fffffffffffffp+1023)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -nan) (f64.const -inf)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const -nan:0x4000000000000) (f64.const -inf)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -nan) (f64.const inf)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const -nan:0x4000000000000) (f64.const inf)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const nan) (f64.const -inf)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const nan:0x4000000000000) (f64.const -inf)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const nan) (f64.const inf)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const nan:0x4000000000000) (f64.const inf)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -nan) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const -nan:0x4000000000000) (f64.const -nan)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -nan) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -nan:0x4000000000000) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -nan) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const -nan:0x4000000000000) (f64.const nan)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -nan) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const -nan:0x4000000000000) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const nan) (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const nan:0x4000000000000) (f64.const -nan)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const nan) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const nan:0x4000000000000) (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const nan) (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "max" (f64.const nan:0x4000000000000) (f64.const nan)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const nan) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "max" (f64.const nan:0x4000000000000) (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sqrt" (f64.const -0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "sqrt" (f64.const 0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "sqrt" (f64.const -0x0.0000000000001p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "sqrt" (f64.const 0x0.0000000000001p-1022)) (f64.const 0x1p-537)) -(assert_return (invoke "sqrt" (f64.const -0x1p-1022)) (f64.const nan:canonical)) -(assert_return (invoke "sqrt" (f64.const 0x1p-1022)) (f64.const 0x1p-511)) -(assert_return (invoke "sqrt" (f64.const -0x1p-1)) (f64.const nan:canonical)) -(assert_return (invoke "sqrt" (f64.const 0x1p-1)) (f64.const 0x1.6a09e667f3bcdp-1)) -(assert_return (invoke "sqrt" (f64.const -0x1p+0)) (f64.const nan:canonical)) -(assert_return (invoke "sqrt" (f64.const 0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "sqrt" (f64.const -0x1.921fb54442d18p+2)) (f64.const nan:canonical)) -(assert_return (invoke "sqrt" (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.40d931ff62705p+1)) -(assert_return (invoke "sqrt" (f64.const -0x1.fffffffffffffp+1023)) (f64.const nan:canonical)) -(assert_return (invoke "sqrt" (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+511)) -(assert_return (invoke "sqrt" (f64.const -inf)) (f64.const nan:canonical)) -(assert_return (invoke "sqrt" (f64.const inf)) (f64.const inf)) -(assert_return (invoke "sqrt" (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "sqrt" (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "sqrt" (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "sqrt" (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "floor" (f64.const -0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "floor" (f64.const 0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "floor" (f64.const -0x0.0000000000001p-1022)) (f64.const -0x1p+0)) -(assert_return (invoke "floor" (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "floor" (f64.const -0x1p-1022)) (f64.const -0x1p+0)) -(assert_return (invoke "floor" (f64.const 0x1p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "floor" (f64.const -0x1p-1)) (f64.const -0x1p+0)) -(assert_return (invoke "floor" (f64.const 0x1p-1)) (f64.const 0x0p+0)) -(assert_return (invoke "floor" (f64.const -0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "floor" (f64.const 0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "floor" (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.cp+2)) -(assert_return (invoke "floor" (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.8p+2)) -(assert_return (invoke "floor" (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "floor" (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "floor" (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "floor" (f64.const inf)) (f64.const inf)) -(assert_return (invoke "floor" (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "floor" (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "floor" (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "floor" (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "ceil" (f64.const -0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "ceil" (f64.const 0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "ceil" (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0p+0)) -(assert_return (invoke "ceil" (f64.const 0x0.0000000000001p-1022)) (f64.const 0x1p+0)) -(assert_return (invoke "ceil" (f64.const -0x1p-1022)) (f64.const -0x0p+0)) -(assert_return (invoke "ceil" (f64.const 0x1p-1022)) (f64.const 0x1p+0)) -(assert_return (invoke "ceil" (f64.const -0x1p-1)) (f64.const -0x0p+0)) -(assert_return (invoke "ceil" (f64.const 0x1p-1)) (f64.const 0x1p+0)) -(assert_return (invoke "ceil" (f64.const -0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "ceil" (f64.const 0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "ceil" (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.8p+2)) -(assert_return (invoke "ceil" (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.cp+2)) -(assert_return (invoke "ceil" (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "ceil" (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "ceil" (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "ceil" (f64.const inf)) (f64.const inf)) -(assert_return (invoke "ceil" (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "ceil" (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "ceil" (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "ceil" (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "trunc" (f64.const -0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "trunc" (f64.const 0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "trunc" (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0p+0)) -(assert_return (invoke "trunc" (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "trunc" (f64.const -0x1p-1022)) (f64.const -0x0p+0)) -(assert_return (invoke "trunc" (f64.const 0x1p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "trunc" (f64.const -0x1p-1)) (f64.const -0x0p+0)) -(assert_return (invoke "trunc" (f64.const 0x1p-1)) (f64.const 0x0p+0)) -(assert_return (invoke "trunc" (f64.const -0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "trunc" (f64.const 0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "trunc" (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.8p+2)) -(assert_return (invoke "trunc" (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.8p+2)) -(assert_return (invoke "trunc" (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "trunc" (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "trunc" (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "trunc" (f64.const inf)) (f64.const inf)) -(assert_return (invoke "trunc" (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "trunc" (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "trunc" (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "trunc" (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "nearest" (f64.const -0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "nearest" (f64.const 0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "nearest" (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0p+0)) -(assert_return (invoke "nearest" (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "nearest" (f64.const -0x1p-1022)) (f64.const -0x0p+0)) -(assert_return (invoke "nearest" (f64.const 0x1p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "nearest" (f64.const -0x1p-1)) (f64.const -0x0p+0)) -(assert_return (invoke "nearest" (f64.const 0x1p-1)) (f64.const 0x0p+0)) -(assert_return (invoke "nearest" (f64.const -0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "nearest" (f64.const 0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "nearest" (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.8p+2)) -(assert_return (invoke "nearest" (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.8p+2)) -(assert_return (invoke "nearest" (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "nearest" (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "nearest" (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "nearest" (f64.const inf)) (f64.const inf)) -(assert_return (invoke "nearest" (f64.const -nan)) (f64.const nan:canonical)) -(assert_return (invoke "nearest" (f64.const -nan:0x4000000000000)) (f64.const nan:arithmetic)) -(assert_return (invoke "nearest" (f64.const nan)) (f64.const nan:canonical)) -(assert_return (invoke "nearest" (f64.const nan:0x4000000000000)) (f64.const nan:arithmetic)) diff --git a/tests/misc_testsuite/winch/f64_bitwise.wast b/tests/misc_testsuite/winch/f64_bitwise.wast deleted file mode 100644 index b9f491e8e4c4..000000000000 --- a/tests/misc_testsuite/winch/f64_bitwise.wast +++ /dev/null @@ -1,375 +0,0 @@ -;; Test all the f64 bitwise operators on major boundary values and all special -;; values. - -(module - (func (export "abs") (param $x f64) (result f64) (f64.abs (local.get $x))) - (func (export "neg") (param $x f64) (result f64) (f64.neg (local.get $x))) - (func (export "copysign") (param $x f64) (param $y f64) (result f64) (f64.copysign (local.get $x) (local.get $y))) -) - -(assert_return (invoke "copysign" (f64.const -0x0p+0) (f64.const -0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "copysign" (f64.const -0x0p+0) (f64.const 0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "copysign" (f64.const 0x0p+0) (f64.const -0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "copysign" (f64.const 0x0p+0) (f64.const 0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "copysign" (f64.const -0x0p+0) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0p+0)) -(assert_return (invoke "copysign" (f64.const -0x0p+0) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "copysign" (f64.const 0x0p+0) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0p+0)) -(assert_return (invoke "copysign" (f64.const 0x0p+0) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "copysign" (f64.const -0x0p+0) (f64.const -0x1p-1022)) (f64.const -0x0p+0)) -(assert_return (invoke "copysign" (f64.const -0x0p+0) (f64.const 0x1p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "copysign" (f64.const 0x0p+0) (f64.const -0x1p-1022)) (f64.const -0x0p+0)) -(assert_return (invoke "copysign" (f64.const 0x0p+0) (f64.const 0x1p-1022)) (f64.const 0x0p+0)) -(assert_return (invoke "copysign" (f64.const -0x0p+0) (f64.const -0x1p-1)) (f64.const -0x0p+0)) -(assert_return (invoke "copysign" (f64.const -0x0p+0) (f64.const 0x1p-1)) (f64.const 0x0p+0)) -(assert_return (invoke "copysign" (f64.const 0x0p+0) (f64.const -0x1p-1)) (f64.const -0x0p+0)) -(assert_return (invoke "copysign" (f64.const 0x0p+0) (f64.const 0x1p-1)) (f64.const 0x0p+0)) -(assert_return (invoke "copysign" (f64.const -0x0p+0) (f64.const -0x1p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "copysign" (f64.const -0x0p+0) (f64.const 0x1p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "copysign" (f64.const 0x0p+0) (f64.const -0x1p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "copysign" (f64.const 0x0p+0) (f64.const 0x1p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "copysign" (f64.const -0x0p+0) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x0p+0)) -(assert_return (invoke "copysign" (f64.const -0x0p+0) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x0p+0)) -(assert_return (invoke "copysign" (f64.const 0x0p+0) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x0p+0)) -(assert_return (invoke "copysign" (f64.const 0x0p+0) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x0p+0)) -(assert_return (invoke "copysign" (f64.const -0x0p+0) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x0p+0)) -(assert_return (invoke "copysign" (f64.const -0x0p+0) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x0p+0)) -(assert_return (invoke "copysign" (f64.const 0x0p+0) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x0p+0)) -(assert_return (invoke "copysign" (f64.const 0x0p+0) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x0p+0)) -(assert_return (invoke "copysign" (f64.const -0x0p+0) (f64.const -inf)) (f64.const -0x0p+0)) -(assert_return (invoke "copysign" (f64.const -0x0p+0) (f64.const inf)) (f64.const 0x0p+0)) -(assert_return (invoke "copysign" (f64.const 0x0p+0) (f64.const -inf)) (f64.const -0x0p+0)) -(assert_return (invoke "copysign" (f64.const 0x0p+0) (f64.const inf)) (f64.const 0x0p+0)) -(assert_return (invoke "copysign" (f64.const -0x0p+0) (f64.const -nan)) (f64.const -0x0p+0)) -(assert_return (invoke "copysign" (f64.const -0x0p+0) (f64.const nan)) (f64.const 0x0p+0)) -(assert_return (invoke "copysign" (f64.const 0x0p+0) (f64.const -nan)) (f64.const -0x0p+0)) -(assert_return (invoke "copysign" (f64.const 0x0p+0) (f64.const nan)) (f64.const 0x0p+0)) -(assert_return (invoke "copysign" (f64.const -0x0.0000000000001p-1022) (f64.const -0x0p+0)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "copysign" (f64.const -0x0.0000000000001p-1022) (f64.const 0x0p+0)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "copysign" (f64.const 0x0.0000000000001p-1022) (f64.const -0x0p+0)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "copysign" (f64.const 0x0.0000000000001p-1022) (f64.const 0x0p+0)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "copysign" (f64.const -0x0.0000000000001p-1022) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "copysign" (f64.const -0x0.0000000000001p-1022) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "copysign" (f64.const 0x0.0000000000001p-1022) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "copysign" (f64.const 0x0.0000000000001p-1022) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "copysign" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p-1022)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "copysign" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p-1022)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "copysign" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p-1022)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "copysign" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p-1022)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "copysign" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p-1)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "copysign" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p-1)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "copysign" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p-1)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "copysign" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p-1)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "copysign" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p+0)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "copysign" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p+0)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "copysign" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p+0)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "copysign" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p+0)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "copysign" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "copysign" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "copysign" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "copysign" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "copysign" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "copysign" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "copysign" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "copysign" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "copysign" (f64.const -0x0.0000000000001p-1022) (f64.const -inf)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "copysign" (f64.const -0x0.0000000000001p-1022) (f64.const inf)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "copysign" (f64.const 0x0.0000000000001p-1022) (f64.const -inf)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "copysign" (f64.const 0x0.0000000000001p-1022) (f64.const inf)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "copysign" (f64.const -0x0.0000000000001p-1022) (f64.const -nan)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "copysign" (f64.const -0x0.0000000000001p-1022) (f64.const nan)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "copysign" (f64.const 0x0.0000000000001p-1022) (f64.const -nan)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "copysign" (f64.const 0x0.0000000000001p-1022) (f64.const nan)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "copysign" (f64.const -0x1p-1022) (f64.const -0x0p+0)) (f64.const -0x1p-1022)) -(assert_return (invoke "copysign" (f64.const -0x1p-1022) (f64.const 0x0p+0)) (f64.const 0x1p-1022)) -(assert_return (invoke "copysign" (f64.const 0x1p-1022) (f64.const -0x0p+0)) (f64.const -0x1p-1022)) -(assert_return (invoke "copysign" (f64.const 0x1p-1022) (f64.const 0x0p+0)) (f64.const 0x1p-1022)) -(assert_return (invoke "copysign" (f64.const -0x1p-1022) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x1p-1022)) -(assert_return (invoke "copysign" (f64.const -0x1p-1022) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x1p-1022)) -(assert_return (invoke "copysign" (f64.const 0x1p-1022) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x1p-1022)) -(assert_return (invoke "copysign" (f64.const 0x1p-1022) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x1p-1022)) -(assert_return (invoke "copysign" (f64.const -0x1p-1022) (f64.const -0x1p-1022)) (f64.const -0x1p-1022)) -(assert_return (invoke "copysign" (f64.const -0x1p-1022) (f64.const 0x1p-1022)) (f64.const 0x1p-1022)) -(assert_return (invoke "copysign" (f64.const 0x1p-1022) (f64.const -0x1p-1022)) (f64.const -0x1p-1022)) -(assert_return (invoke "copysign" (f64.const 0x1p-1022) (f64.const 0x1p-1022)) (f64.const 0x1p-1022)) -(assert_return (invoke "copysign" (f64.const -0x1p-1022) (f64.const -0x1p-1)) (f64.const -0x1p-1022)) -(assert_return (invoke "copysign" (f64.const -0x1p-1022) (f64.const 0x1p-1)) (f64.const 0x1p-1022)) -(assert_return (invoke "copysign" (f64.const 0x1p-1022) (f64.const -0x1p-1)) (f64.const -0x1p-1022)) -(assert_return (invoke "copysign" (f64.const 0x1p-1022) (f64.const 0x1p-1)) (f64.const 0x1p-1022)) -(assert_return (invoke "copysign" (f64.const -0x1p-1022) (f64.const -0x1p+0)) (f64.const -0x1p-1022)) -(assert_return (invoke "copysign" (f64.const -0x1p-1022) (f64.const 0x1p+0)) (f64.const 0x1p-1022)) -(assert_return (invoke "copysign" (f64.const 0x1p-1022) (f64.const -0x1p+0)) (f64.const -0x1p-1022)) -(assert_return (invoke "copysign" (f64.const 0x1p-1022) (f64.const 0x1p+0)) (f64.const 0x1p-1022)) -(assert_return (invoke "copysign" (f64.const -0x1p-1022) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1p-1022)) -(assert_return (invoke "copysign" (f64.const -0x1p-1022) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1p-1022)) -(assert_return (invoke "copysign" (f64.const 0x1p-1022) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1p-1022)) -(assert_return (invoke "copysign" (f64.const 0x1p-1022) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1p-1022)) -(assert_return (invoke "copysign" (f64.const -0x1p-1022) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1p-1022)) -(assert_return (invoke "copysign" (f64.const -0x1p-1022) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1p-1022)) -(assert_return (invoke "copysign" (f64.const 0x1p-1022) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1p-1022)) -(assert_return (invoke "copysign" (f64.const 0x1p-1022) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1p-1022)) -(assert_return (invoke "copysign" (f64.const -0x1p-1022) (f64.const -inf)) (f64.const -0x1p-1022)) -(assert_return (invoke "copysign" (f64.const -0x1p-1022) (f64.const inf)) (f64.const 0x1p-1022)) -(assert_return (invoke "copysign" (f64.const 0x1p-1022) (f64.const -inf)) (f64.const -0x1p-1022)) -(assert_return (invoke "copysign" (f64.const 0x1p-1022) (f64.const inf)) (f64.const 0x1p-1022)) -(assert_return (invoke "copysign" (f64.const -0x1p-1022) (f64.const -nan)) (f64.const -0x1p-1022)) -(assert_return (invoke "copysign" (f64.const -0x1p-1022) (f64.const nan)) (f64.const 0x1p-1022)) -(assert_return (invoke "copysign" (f64.const 0x1p-1022) (f64.const -nan)) (f64.const -0x1p-1022)) -(assert_return (invoke "copysign" (f64.const 0x1p-1022) (f64.const nan)) (f64.const 0x1p-1022)) -(assert_return (invoke "copysign" (f64.const -0x1p-1) (f64.const -0x0p+0)) (f64.const -0x1p-1)) -(assert_return (invoke "copysign" (f64.const -0x1p-1) (f64.const 0x0p+0)) (f64.const 0x1p-1)) -(assert_return (invoke "copysign" (f64.const 0x1p-1) (f64.const -0x0p+0)) (f64.const -0x1p-1)) -(assert_return (invoke "copysign" (f64.const 0x1p-1) (f64.const 0x0p+0)) (f64.const 0x1p-1)) -(assert_return (invoke "copysign" (f64.const -0x1p-1) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x1p-1)) -(assert_return (invoke "copysign" (f64.const -0x1p-1) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x1p-1)) -(assert_return (invoke "copysign" (f64.const 0x1p-1) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x1p-1)) -(assert_return (invoke "copysign" (f64.const 0x1p-1) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x1p-1)) -(assert_return (invoke "copysign" (f64.const -0x1p-1) (f64.const -0x1p-1022)) (f64.const -0x1p-1)) -(assert_return (invoke "copysign" (f64.const -0x1p-1) (f64.const 0x1p-1022)) (f64.const 0x1p-1)) -(assert_return (invoke "copysign" (f64.const 0x1p-1) (f64.const -0x1p-1022)) (f64.const -0x1p-1)) -(assert_return (invoke "copysign" (f64.const 0x1p-1) (f64.const 0x1p-1022)) (f64.const 0x1p-1)) -(assert_return (invoke "copysign" (f64.const -0x1p-1) (f64.const -0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "copysign" (f64.const -0x1p-1) (f64.const 0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "copysign" (f64.const 0x1p-1) (f64.const -0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "copysign" (f64.const 0x1p-1) (f64.const 0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "copysign" (f64.const -0x1p-1) (f64.const -0x1p+0)) (f64.const -0x1p-1)) -(assert_return (invoke "copysign" (f64.const -0x1p-1) (f64.const 0x1p+0)) (f64.const 0x1p-1)) -(assert_return (invoke "copysign" (f64.const 0x1p-1) (f64.const -0x1p+0)) (f64.const -0x1p-1)) -(assert_return (invoke "copysign" (f64.const 0x1p-1) (f64.const 0x1p+0)) (f64.const 0x1p-1)) -(assert_return (invoke "copysign" (f64.const -0x1p-1) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1p-1)) -(assert_return (invoke "copysign" (f64.const -0x1p-1) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1p-1)) -(assert_return (invoke "copysign" (f64.const 0x1p-1) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1p-1)) -(assert_return (invoke "copysign" (f64.const 0x1p-1) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1p-1)) -(assert_return (invoke "copysign" (f64.const -0x1p-1) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1p-1)) -(assert_return (invoke "copysign" (f64.const -0x1p-1) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1p-1)) -(assert_return (invoke "copysign" (f64.const 0x1p-1) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1p-1)) -(assert_return (invoke "copysign" (f64.const 0x1p-1) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1p-1)) -(assert_return (invoke "copysign" (f64.const -0x1p-1) (f64.const -inf)) (f64.const -0x1p-1)) -(assert_return (invoke "copysign" (f64.const -0x1p-1) (f64.const inf)) (f64.const 0x1p-1)) -(assert_return (invoke "copysign" (f64.const 0x1p-1) (f64.const -inf)) (f64.const -0x1p-1)) -(assert_return (invoke "copysign" (f64.const 0x1p-1) (f64.const inf)) (f64.const 0x1p-1)) -(assert_return (invoke "copysign" (f64.const -0x1p-1) (f64.const -nan)) (f64.const -0x1p-1)) -(assert_return (invoke "copysign" (f64.const -0x1p-1) (f64.const nan)) (f64.const 0x1p-1)) -(assert_return (invoke "copysign" (f64.const 0x1p-1) (f64.const -nan)) (f64.const -0x1p-1)) -(assert_return (invoke "copysign" (f64.const 0x1p-1) (f64.const nan)) (f64.const 0x1p-1)) -(assert_return (invoke "copysign" (f64.const -0x1p+0) (f64.const -0x0p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "copysign" (f64.const -0x1p+0) (f64.const 0x0p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "copysign" (f64.const 0x1p+0) (f64.const -0x0p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "copysign" (f64.const 0x1p+0) (f64.const 0x0p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "copysign" (f64.const -0x1p+0) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x1p+0)) -(assert_return (invoke "copysign" (f64.const -0x1p+0) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x1p+0)) -(assert_return (invoke "copysign" (f64.const 0x1p+0) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x1p+0)) -(assert_return (invoke "copysign" (f64.const 0x1p+0) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x1p+0)) -(assert_return (invoke "copysign" (f64.const -0x1p+0) (f64.const -0x1p-1022)) (f64.const -0x1p+0)) -(assert_return (invoke "copysign" (f64.const -0x1p+0) (f64.const 0x1p-1022)) (f64.const 0x1p+0)) -(assert_return (invoke "copysign" (f64.const 0x1p+0) (f64.const -0x1p-1022)) (f64.const -0x1p+0)) -(assert_return (invoke "copysign" (f64.const 0x1p+0) (f64.const 0x1p-1022)) (f64.const 0x1p+0)) -(assert_return (invoke "copysign" (f64.const -0x1p+0) (f64.const -0x1p-1)) (f64.const -0x1p+0)) -(assert_return (invoke "copysign" (f64.const -0x1p+0) (f64.const 0x1p-1)) (f64.const 0x1p+0)) -(assert_return (invoke "copysign" (f64.const 0x1p+0) (f64.const -0x1p-1)) (f64.const -0x1p+0)) -(assert_return (invoke "copysign" (f64.const 0x1p+0) (f64.const 0x1p-1)) (f64.const 0x1p+0)) -(assert_return (invoke "copysign" (f64.const -0x1p+0) (f64.const -0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "copysign" (f64.const -0x1p+0) (f64.const 0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "copysign" (f64.const 0x1p+0) (f64.const -0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "copysign" (f64.const 0x1p+0) (f64.const 0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "copysign" (f64.const -0x1p+0) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1p+0)) -(assert_return (invoke "copysign" (f64.const -0x1p+0) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1p+0)) -(assert_return (invoke "copysign" (f64.const 0x1p+0) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1p+0)) -(assert_return (invoke "copysign" (f64.const 0x1p+0) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1p+0)) -(assert_return (invoke "copysign" (f64.const -0x1p+0) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1p+0)) -(assert_return (invoke "copysign" (f64.const -0x1p+0) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1p+0)) -(assert_return (invoke "copysign" (f64.const 0x1p+0) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1p+0)) -(assert_return (invoke "copysign" (f64.const 0x1p+0) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1p+0)) -(assert_return (invoke "copysign" (f64.const -0x1p+0) (f64.const -inf)) (f64.const -0x1p+0)) -(assert_return (invoke "copysign" (f64.const -0x1p+0) (f64.const inf)) (f64.const 0x1p+0)) -(assert_return (invoke "copysign" (f64.const 0x1p+0) (f64.const -inf)) (f64.const -0x1p+0)) -(assert_return (invoke "copysign" (f64.const 0x1p+0) (f64.const inf)) (f64.const 0x1p+0)) -(assert_return (invoke "copysign" (f64.const -0x1p+0) (f64.const -nan)) (f64.const -0x1p+0)) -(assert_return (invoke "copysign" (f64.const -0x1p+0) (f64.const nan)) (f64.const 0x1p+0)) -(assert_return (invoke "copysign" (f64.const 0x1p+0) (f64.const -nan)) (f64.const -0x1p+0)) -(assert_return (invoke "copysign" (f64.const 0x1p+0) (f64.const nan)) (f64.const 0x1p+0)) -(assert_return (invoke "copysign" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x0p+0)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "copysign" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x0p+0)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "copysign" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x0p+0)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "copysign" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x0p+0)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "copysign" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "copysign" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "copysign" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "copysign" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "copysign" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p-1022)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "copysign" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p-1022)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "copysign" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p-1022)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "copysign" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p-1022)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "copysign" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p-1)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "copysign" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p-1)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "copysign" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p-1)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "copysign" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p-1)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "copysign" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p+0)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "copysign" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p+0)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "copysign" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p+0)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "copysign" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p+0)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "copysign" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "copysign" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "copysign" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "copysign" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "copysign" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "copysign" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "copysign" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "copysign" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "copysign" (f64.const -0x1.921fb54442d18p+2) (f64.const -inf)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "copysign" (f64.const -0x1.921fb54442d18p+2) (f64.const inf)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "copysign" (f64.const 0x1.921fb54442d18p+2) (f64.const -inf)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "copysign" (f64.const 0x1.921fb54442d18p+2) (f64.const inf)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "copysign" (f64.const -0x1.921fb54442d18p+2) (f64.const -nan)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "copysign" (f64.const -0x1.921fb54442d18p+2) (f64.const nan)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "copysign" (f64.const 0x1.921fb54442d18p+2) (f64.const -nan)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "copysign" (f64.const 0x1.921fb54442d18p+2) (f64.const nan)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "copysign" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x0p+0)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "copysign" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x0p+0)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "copysign" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x0p+0)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "copysign" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x0p+0)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "copysign" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "copysign" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "copysign" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x0.0000000000001p-1022)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "copysign" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x0.0000000000001p-1022)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "copysign" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p-1022)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "copysign" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p-1022)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "copysign" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p-1022)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "copysign" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p-1022)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "copysign" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p-1)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "copysign" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p-1)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "copysign" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p-1)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "copysign" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p-1)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "copysign" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p+0)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "copysign" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p+0)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "copysign" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p+0)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "copysign" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p+0)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "copysign" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "copysign" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "copysign" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1.921fb54442d18p+2)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "copysign" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "copysign" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "copysign" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "copysign" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "copysign" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "copysign" (f64.const -0x1.fffffffffffffp+1023) (f64.const -inf)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "copysign" (f64.const -0x1.fffffffffffffp+1023) (f64.const inf)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "copysign" (f64.const 0x1.fffffffffffffp+1023) (f64.const -inf)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "copysign" (f64.const 0x1.fffffffffffffp+1023) (f64.const inf)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "copysign" (f64.const -0x1.fffffffffffffp+1023) (f64.const -nan)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "copysign" (f64.const -0x1.fffffffffffffp+1023) (f64.const nan)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "copysign" (f64.const 0x1.fffffffffffffp+1023) (f64.const -nan)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "copysign" (f64.const 0x1.fffffffffffffp+1023) (f64.const nan)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "copysign" (f64.const -inf) (f64.const -0x0p+0)) (f64.const -inf)) -(assert_return (invoke "copysign" (f64.const -inf) (f64.const 0x0p+0)) (f64.const inf)) -(assert_return (invoke "copysign" (f64.const inf) (f64.const -0x0p+0)) (f64.const -inf)) -(assert_return (invoke "copysign" (f64.const inf) (f64.const 0x0p+0)) (f64.const inf)) -(assert_return (invoke "copysign" (f64.const -inf) (f64.const -0x0.0000000000001p-1022)) (f64.const -inf)) -(assert_return (invoke "copysign" (f64.const -inf) (f64.const 0x0.0000000000001p-1022)) (f64.const inf)) -(assert_return (invoke "copysign" (f64.const inf) (f64.const -0x0.0000000000001p-1022)) (f64.const -inf)) -(assert_return (invoke "copysign" (f64.const inf) (f64.const 0x0.0000000000001p-1022)) (f64.const inf)) -(assert_return (invoke "copysign" (f64.const -inf) (f64.const -0x1p-1022)) (f64.const -inf)) -(assert_return (invoke "copysign" (f64.const -inf) (f64.const 0x1p-1022)) (f64.const inf)) -(assert_return (invoke "copysign" (f64.const inf) (f64.const -0x1p-1022)) (f64.const -inf)) -(assert_return (invoke "copysign" (f64.const inf) (f64.const 0x1p-1022)) (f64.const inf)) -(assert_return (invoke "copysign" (f64.const -inf) (f64.const -0x1p-1)) (f64.const -inf)) -(assert_return (invoke "copysign" (f64.const -inf) (f64.const 0x1p-1)) (f64.const inf)) -(assert_return (invoke "copysign" (f64.const inf) (f64.const -0x1p-1)) (f64.const -inf)) -(assert_return (invoke "copysign" (f64.const inf) (f64.const 0x1p-1)) (f64.const inf)) -(assert_return (invoke "copysign" (f64.const -inf) (f64.const -0x1p+0)) (f64.const -inf)) -(assert_return (invoke "copysign" (f64.const -inf) (f64.const 0x1p+0)) (f64.const inf)) -(assert_return (invoke "copysign" (f64.const inf) (f64.const -0x1p+0)) (f64.const -inf)) -(assert_return (invoke "copysign" (f64.const inf) (f64.const 0x1p+0)) (f64.const inf)) -(assert_return (invoke "copysign" (f64.const -inf) (f64.const -0x1.921fb54442d18p+2)) (f64.const -inf)) -(assert_return (invoke "copysign" (f64.const -inf) (f64.const 0x1.921fb54442d18p+2)) (f64.const inf)) -(assert_return (invoke "copysign" (f64.const inf) (f64.const -0x1.921fb54442d18p+2)) (f64.const -inf)) -(assert_return (invoke "copysign" (f64.const inf) (f64.const 0x1.921fb54442d18p+2)) (f64.const inf)) -(assert_return (invoke "copysign" (f64.const -inf) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -inf)) -(assert_return (invoke "copysign" (f64.const -inf) (f64.const 0x1.fffffffffffffp+1023)) (f64.const inf)) -(assert_return (invoke "copysign" (f64.const inf) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -inf)) -(assert_return (invoke "copysign" (f64.const inf) (f64.const 0x1.fffffffffffffp+1023)) (f64.const inf)) -(assert_return (invoke "copysign" (f64.const -inf) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "copysign" (f64.const -inf) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "copysign" (f64.const inf) (f64.const -inf)) (f64.const -inf)) -(assert_return (invoke "copysign" (f64.const inf) (f64.const inf)) (f64.const inf)) -(assert_return (invoke "copysign" (f64.const -inf) (f64.const -nan)) (f64.const -inf)) -(assert_return (invoke "copysign" (f64.const -inf) (f64.const nan)) (f64.const inf)) -(assert_return (invoke "copysign" (f64.const inf) (f64.const -nan)) (f64.const -inf)) -(assert_return (invoke "copysign" (f64.const inf) (f64.const nan)) (f64.const inf)) -(assert_return (invoke "copysign" (f64.const -nan) (f64.const -0x0p+0)) (f64.const -nan)) -(assert_return (invoke "copysign" (f64.const -nan) (f64.const 0x0p+0)) (f64.const nan)) -(assert_return (invoke "copysign" (f64.const nan) (f64.const -0x0p+0)) (f64.const -nan)) -(assert_return (invoke "copysign" (f64.const nan) (f64.const 0x0p+0)) (f64.const nan)) -(assert_return (invoke "copysign" (f64.const -nan) (f64.const -0x0.0000000000001p-1022)) (f64.const -nan)) -(assert_return (invoke "copysign" (f64.const -nan) (f64.const 0x0.0000000000001p-1022)) (f64.const nan)) -(assert_return (invoke "copysign" (f64.const nan) (f64.const -0x0.0000000000001p-1022)) (f64.const -nan)) -(assert_return (invoke "copysign" (f64.const nan) (f64.const 0x0.0000000000001p-1022)) (f64.const nan)) -(assert_return (invoke "copysign" (f64.const -nan) (f64.const -0x1p-1022)) (f64.const -nan)) -(assert_return (invoke "copysign" (f64.const -nan) (f64.const 0x1p-1022)) (f64.const nan)) -(assert_return (invoke "copysign" (f64.const nan) (f64.const -0x1p-1022)) (f64.const -nan)) -(assert_return (invoke "copysign" (f64.const nan) (f64.const 0x1p-1022)) (f64.const nan)) -(assert_return (invoke "copysign" (f64.const -nan) (f64.const -0x1p-1)) (f64.const -nan)) -(assert_return (invoke "copysign" (f64.const -nan) (f64.const 0x1p-1)) (f64.const nan)) -(assert_return (invoke "copysign" (f64.const nan) (f64.const -0x1p-1)) (f64.const -nan)) -(assert_return (invoke "copysign" (f64.const nan) (f64.const 0x1p-1)) (f64.const nan)) -(assert_return (invoke "copysign" (f64.const -nan) (f64.const -0x1p+0)) (f64.const -nan)) -(assert_return (invoke "copysign" (f64.const -nan) (f64.const 0x1p+0)) (f64.const nan)) -(assert_return (invoke "copysign" (f64.const nan) (f64.const -0x1p+0)) (f64.const -nan)) -(assert_return (invoke "copysign" (f64.const nan) (f64.const 0x1p+0)) (f64.const nan)) -(assert_return (invoke "copysign" (f64.const -nan) (f64.const -0x1.921fb54442d18p+2)) (f64.const -nan)) -(assert_return (invoke "copysign" (f64.const -nan) (f64.const 0x1.921fb54442d18p+2)) (f64.const nan)) -(assert_return (invoke "copysign" (f64.const nan) (f64.const -0x1.921fb54442d18p+2)) (f64.const -nan)) -(assert_return (invoke "copysign" (f64.const nan) (f64.const 0x1.921fb54442d18p+2)) (f64.const nan)) -(assert_return (invoke "copysign" (f64.const -nan) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -nan)) -(assert_return (invoke "copysign" (f64.const -nan) (f64.const 0x1.fffffffffffffp+1023)) (f64.const nan)) -(assert_return (invoke "copysign" (f64.const nan) (f64.const -0x1.fffffffffffffp+1023)) (f64.const -nan)) -(assert_return (invoke "copysign" (f64.const nan) (f64.const 0x1.fffffffffffffp+1023)) (f64.const nan)) -(assert_return (invoke "copysign" (f64.const -nan) (f64.const -inf)) (f64.const -nan)) -(assert_return (invoke "copysign" (f64.const -nan) (f64.const inf)) (f64.const nan)) -(assert_return (invoke "copysign" (f64.const nan) (f64.const -inf)) (f64.const -nan)) -(assert_return (invoke "copysign" (f64.const nan) (f64.const inf)) (f64.const nan)) -(assert_return (invoke "copysign" (f64.const -nan) (f64.const -nan)) (f64.const -nan)) -(assert_return (invoke "copysign" (f64.const -nan) (f64.const nan)) (f64.const nan)) -(assert_return (invoke "copysign" (f64.const nan) (f64.const -nan)) (f64.const -nan)) -(assert_return (invoke "copysign" (f64.const nan) (f64.const nan)) (f64.const nan)) -(assert_return (invoke "abs" (f64.const -0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "abs" (f64.const 0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "abs" (f64.const -0x0.0000000000001p-1022)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "abs" (f64.const 0x0.0000000000001p-1022)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "abs" (f64.const -0x1p-1022)) (f64.const 0x1p-1022)) -(assert_return (invoke "abs" (f64.const 0x1p-1022)) (f64.const 0x1p-1022)) -(assert_return (invoke "abs" (f64.const -0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "abs" (f64.const 0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "abs" (f64.const -0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "abs" (f64.const 0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "abs" (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "abs" (f64.const 0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "abs" (f64.const -0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "abs" (f64.const 0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "abs" (f64.const -inf)) (f64.const inf)) -(assert_return (invoke "abs" (f64.const inf)) (f64.const inf)) -(assert_return (invoke "abs" (f64.const -nan)) (f64.const nan)) -(assert_return (invoke "abs" (f64.const nan)) (f64.const nan)) -(assert_return (invoke "neg" (f64.const -0x0p+0)) (f64.const 0x0p+0)) -(assert_return (invoke "neg" (f64.const 0x0p+0)) (f64.const -0x0p+0)) -(assert_return (invoke "neg" (f64.const -0x0.0000000000001p-1022)) (f64.const 0x0.0000000000001p-1022)) -(assert_return (invoke "neg" (f64.const 0x0.0000000000001p-1022)) (f64.const -0x0.0000000000001p-1022)) -(assert_return (invoke "neg" (f64.const -0x1p-1022)) (f64.const 0x1p-1022)) -(assert_return (invoke "neg" (f64.const 0x1p-1022)) (f64.const -0x1p-1022)) -(assert_return (invoke "neg" (f64.const -0x1p-1)) (f64.const 0x1p-1)) -(assert_return (invoke "neg" (f64.const 0x1p-1)) (f64.const -0x1p-1)) -(assert_return (invoke "neg" (f64.const -0x1p+0)) (f64.const 0x1p+0)) -(assert_return (invoke "neg" (f64.const 0x1p+0)) (f64.const -0x1p+0)) -(assert_return (invoke "neg" (f64.const -0x1.921fb54442d18p+2)) (f64.const 0x1.921fb54442d18p+2)) -(assert_return (invoke "neg" (f64.const 0x1.921fb54442d18p+2)) (f64.const -0x1.921fb54442d18p+2)) -(assert_return (invoke "neg" (f64.const -0x1.fffffffffffffp+1023)) (f64.const 0x1.fffffffffffffp+1023)) -(assert_return (invoke "neg" (f64.const 0x1.fffffffffffffp+1023)) (f64.const -0x1.fffffffffffffp+1023)) -(assert_return (invoke "neg" (f64.const -inf)) (f64.const inf)) -(assert_return (invoke "neg" (f64.const inf)) (f64.const -inf)) -(assert_return (invoke "neg" (f64.const -nan)) (f64.const nan)) -(assert_return (invoke "neg" (f64.const nan)) (f64.const -nan)) - - -;; Type check - -(assert_invalid (module (func (result f64) (f64.abs (i64.const 0)))) "type mismatch") -(assert_invalid (module (func (result f64) (f64.neg (i64.const 0)))) "type mismatch") diff --git a/tests/misc_testsuite/winch/f64_cmp.wast b/tests/misc_testsuite/winch/f64_cmp.wast deleted file mode 100644 index 9cb378cd8c49..000000000000 --- a/tests/misc_testsuite/winch/f64_cmp.wast +++ /dev/null @@ -1,2412 +0,0 @@ -;; Test all the f64 comparison operators on major boundary values and all -;; special values. - -(module - (func (export "eq") (param $x f64) (param $y f64) (result i32) (f64.eq (local.get $x) (local.get $y))) - (func (export "ne") (param $x f64) (param $y f64) (result i32) (f64.ne (local.get $x) (local.get $y))) - (func (export "lt") (param $x f64) (param $y f64) (result i32) (f64.lt (local.get $x) (local.get $y))) - (func (export "le") (param $x f64) (param $y f64) (result i32) (f64.le (local.get $x) (local.get $y))) - (func (export "gt") (param $x f64) (param $y f64) (result i32) (f64.gt (local.get $x) (local.get $y))) - (func (export "ge") (param $x f64) (param $y f64) (result i32) (f64.ge (local.get $x) (local.get $y))) -) - -(assert_return (invoke "eq" (f64.const -0x0p+0) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "eq" (f64.const -0x0p+0) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "eq" (f64.const 0x0p+0) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "eq" (f64.const 0x0p+0) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "eq" (f64.const -0x0p+0) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x0p+0) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0p+0) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0p+0) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x0p+0) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x0p+0) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0p+0) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0p+0) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x0p+0) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x0p+0) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0p+0) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0p+0) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x0p+0) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x0p+0) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0p+0) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0p+0) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x0p+0) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x0p+0) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0p+0) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0p+0) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x0p+0) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x0p+0) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0p+0) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0p+0) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x0p+0) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x0p+0) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0p+0) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0p+0) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x0p+0) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x0p+0) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x0p+0) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x0p+0) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0p+0) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0p+0) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0p+0) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0p+0) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x0.0000000000001p-1022) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x0.0000000000001p-1022) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0.0000000000001p-1022) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0.0000000000001p-1022) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x0.0000000000001p-1022) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "eq" (f64.const -0x0.0000000000001p-1022) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0.0000000000001p-1022) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0.0000000000001p-1022) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "eq" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x0.0000000000001p-1022) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x0.0000000000001p-1022) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0.0000000000001p-1022) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0.0000000000001p-1022) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x0.0000000000001p-1022) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x0.0000000000001p-1022) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x0.0000000000001p-1022) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x0.0000000000001p-1022) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0.0000000000001p-1022) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0.0000000000001p-1022) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0.0000000000001p-1022) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x0.0000000000001p-1022) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p-1022) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p-1022) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1022) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1022) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p-1022) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p-1022) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1022) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1022) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p-1022) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "eq" (f64.const -0x1p-1022) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1022) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1022) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "eq" (f64.const -0x1p-1022) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p-1022) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1022) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1022) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p-1022) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p-1022) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1022) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1022) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p-1022) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p-1022) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1022) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1022) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p-1022) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p-1022) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1022) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1022) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p-1022) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p-1022) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1022) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1022) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p-1022) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p-1022) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p-1022) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p-1022) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1022) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1022) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1022) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1022) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p-1) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p-1) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p-1) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p-1) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p-1) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p-1) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p-1) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "eq" (f64.const -0x1p-1) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "eq" (f64.const -0x1p-1) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p-1) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p-1) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p-1) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p-1) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p-1) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p-1) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p-1) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p-1) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p-1) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p-1) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p-1) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p-1) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p+0) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p+0) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p+0) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p+0) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p+0) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p+0) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p+0) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p+0) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p+0) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p+0) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p+0) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p+0) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p+0) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p+0) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p+0) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p+0) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p+0) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "eq" (f64.const -0x1p+0) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p+0) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p+0) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "eq" (f64.const -0x1p+0) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p+0) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p+0) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p+0) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p+0) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p+0) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p+0) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p+0) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p+0) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p+0) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p+0) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p+0) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p+0) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p+0) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p+0) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1p+0) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p+0) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p+0) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p+0) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1p+0) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "eq" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "eq" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1.921fb54442d18p+2) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1.921fb54442d18p+2) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.921fb54442d18p+2) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.921fb54442d18p+2) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1.921fb54442d18p+2) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1.921fb54442d18p+2) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1.921fb54442d18p+2) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1.921fb54442d18p+2) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.921fb54442d18p+2) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.921fb54442d18p+2) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.921fb54442d18p+2) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.921fb54442d18p+2) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "eq" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "eq" (f64.const -0x1.fffffffffffffp+1023) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1.fffffffffffffp+1023) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.fffffffffffffp+1023) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.fffffffffffffp+1023) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1.fffffffffffffp+1023) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1.fffffffffffffp+1023) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1.fffffffffffffp+1023) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -0x1.fffffffffffffp+1023) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.fffffffffffffp+1023) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.fffffffffffffp+1023) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.fffffffffffffp+1023) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const 0x1.fffffffffffffp+1023) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -inf) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -inf) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const inf) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const inf) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -inf) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -inf) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const inf) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const inf) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -inf) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -inf) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const inf) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const inf) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -inf) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -inf) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const inf) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const inf) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -inf) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -inf) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const inf) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const inf) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -inf) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -inf) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const inf) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const inf) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -inf) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -inf) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const inf) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const inf) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -inf) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "eq" (f64.const -inf) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const inf) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const inf) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "eq" (f64.const -inf) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -inf) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -inf) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -inf) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const inf) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const inf) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const inf) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const inf) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan:0x4000000000000) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan:0x4000000000000) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan:0x4000000000000) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan:0x4000000000000) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan:0x4000000000000) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan:0x4000000000000) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan:0x4000000000000) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan:0x4000000000000) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan:0x4000000000000) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan:0x4000000000000) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan:0x4000000000000) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan:0x4000000000000) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan:0x4000000000000) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan:0x4000000000000) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan:0x4000000000000) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan:0x4000000000000) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan:0x4000000000000) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan:0x4000000000000) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan:0x4000000000000) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan:0x4000000000000) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan:0x4000000000000) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan:0x4000000000000) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan:0x4000000000000) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan:0x4000000000000) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan:0x4000000000000) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan:0x4000000000000) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan:0x4000000000000) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan:0x4000000000000) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan:0x4000000000000) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan:0x4000000000000) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan:0x4000000000000) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan:0x4000000000000) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan:0x4000000000000) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan:0x4000000000000) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan:0x4000000000000) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const -nan:0x4000000000000) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan:0x4000000000000) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan:0x4000000000000) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan:0x4000000000000) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (f64.const nan:0x4000000000000) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ne" (f64.const -0x0p+0) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "ne" (f64.const -0x0p+0) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "ne" (f64.const 0x0p+0) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "ne" (f64.const 0x0p+0) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "ne" (f64.const -0x0p+0) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x0p+0) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0p+0) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0p+0) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x0p+0) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x0p+0) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0p+0) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0p+0) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x0p+0) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x0p+0) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0p+0) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0p+0) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x0p+0) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x0p+0) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0p+0) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0p+0) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x0p+0) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x0p+0) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0p+0) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0p+0) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x0p+0) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x0p+0) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0p+0) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0p+0) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x0p+0) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x0p+0) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0p+0) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0p+0) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x0p+0) (f64.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x0p+0) (f64.const -nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x0p+0) (f64.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x0p+0) (f64.const nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0p+0) (f64.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0p+0) (f64.const -nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0p+0) (f64.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0p+0) (f64.const nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x0.0000000000001p-1022) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x0.0000000000001p-1022) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0.0000000000001p-1022) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0.0000000000001p-1022) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x0.0000000000001p-1022) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "ne" (f64.const -0x0.0000000000001p-1022) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0.0000000000001p-1022) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0.0000000000001p-1022) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "ne" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x0.0000000000001p-1022) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x0.0000000000001p-1022) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0.0000000000001p-1022) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0.0000000000001p-1022) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x0.0000000000001p-1022) (f64.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x0.0000000000001p-1022) (f64.const -nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x0.0000000000001p-1022) (f64.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x0.0000000000001p-1022) (f64.const nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0.0000000000001p-1022) (f64.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0.0000000000001p-1022) (f64.const -nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0.0000000000001p-1022) (f64.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x0.0000000000001p-1022) (f64.const nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p-1022) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p-1022) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1022) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1022) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p-1022) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p-1022) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1022) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1022) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p-1022) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "ne" (f64.const -0x1p-1022) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1022) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1022) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "ne" (f64.const -0x1p-1022) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p-1022) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1022) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1022) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p-1022) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p-1022) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1022) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1022) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p-1022) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p-1022) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1022) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1022) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p-1022) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p-1022) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1022) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1022) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p-1022) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p-1022) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1022) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1022) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p-1022) (f64.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p-1022) (f64.const -nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p-1022) (f64.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p-1022) (f64.const nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1022) (f64.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1022) (f64.const -nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1022) (f64.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1022) (f64.const nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p-1) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p-1) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p-1) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p-1) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p-1) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p-1) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p-1) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "ne" (f64.const -0x1p-1) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "ne" (f64.const -0x1p-1) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p-1) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p-1) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p-1) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p-1) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p-1) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p-1) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p-1) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p-1) (f64.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p-1) (f64.const -nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p-1) (f64.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p-1) (f64.const nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1) (f64.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1) (f64.const -nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1) (f64.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p-1) (f64.const nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p+0) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p+0) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p+0) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p+0) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p+0) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p+0) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p+0) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p+0) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p+0) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p+0) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p+0) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p+0) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p+0) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p+0) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p+0) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p+0) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p+0) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "ne" (f64.const -0x1p+0) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p+0) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p+0) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "ne" (f64.const -0x1p+0) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p+0) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p+0) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p+0) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p+0) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p+0) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p+0) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p+0) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p+0) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p+0) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p+0) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p+0) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p+0) (f64.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p+0) (f64.const -nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p+0) (f64.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1p+0) (f64.const nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p+0) (f64.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p+0) (f64.const -nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p+0) (f64.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1p+0) (f64.const nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "ne" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "ne" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1.921fb54442d18p+2) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1.921fb54442d18p+2) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.921fb54442d18p+2) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.921fb54442d18p+2) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1.921fb54442d18p+2) (f64.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1.921fb54442d18p+2) (f64.const -nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1.921fb54442d18p+2) (f64.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1.921fb54442d18p+2) (f64.const nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.921fb54442d18p+2) (f64.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.921fb54442d18p+2) (f64.const -nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.921fb54442d18p+2) (f64.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.921fb54442d18p+2) (f64.const nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "ne" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "ne" (f64.const -0x1.fffffffffffffp+1023) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1.fffffffffffffp+1023) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.fffffffffffffp+1023) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.fffffffffffffp+1023) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1.fffffffffffffp+1023) (f64.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1.fffffffffffffp+1023) (f64.const -nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1.fffffffffffffp+1023) (f64.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -0x1.fffffffffffffp+1023) (f64.const nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.fffffffffffffp+1023) (f64.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.fffffffffffffp+1023) (f64.const -nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.fffffffffffffp+1023) (f64.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const 0x1.fffffffffffffp+1023) (f64.const nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -inf) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -inf) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const inf) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const inf) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -inf) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -inf) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const inf) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const inf) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -inf) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -inf) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const inf) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const inf) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -inf) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -inf) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const inf) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const inf) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -inf) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -inf) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const inf) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const inf) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -inf) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -inf) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const inf) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const inf) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -inf) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -inf) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const inf) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const inf) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -inf) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "ne" (f64.const -inf) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const inf) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const inf) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "ne" (f64.const -inf) (f64.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -inf) (f64.const -nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -inf) (f64.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -inf) (f64.const nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const inf) (f64.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const inf) (f64.const -nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const inf) (f64.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const inf) (f64.const nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan:0x4000000000000) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan:0x4000000000000) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan:0x4000000000000) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan:0x4000000000000) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan:0x4000000000000) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan:0x4000000000000) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan:0x4000000000000) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan:0x4000000000000) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan:0x4000000000000) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan:0x4000000000000) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan:0x4000000000000) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan:0x4000000000000) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan:0x4000000000000) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan:0x4000000000000) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan:0x4000000000000) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan:0x4000000000000) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan:0x4000000000000) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan:0x4000000000000) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan:0x4000000000000) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan:0x4000000000000) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan:0x4000000000000) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan:0x4000000000000) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan:0x4000000000000) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan:0x4000000000000) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan:0x4000000000000) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan:0x4000000000000) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan:0x4000000000000) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan:0x4000000000000) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan:0x4000000000000) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan:0x4000000000000) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan:0x4000000000000) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan:0x4000000000000) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan) (f64.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan:0x4000000000000) (f64.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan) (f64.const -nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan:0x4000000000000) (f64.const -nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan) (f64.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan:0x4000000000000) (f64.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan) (f64.const nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const -nan:0x4000000000000) (f64.const nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan) (f64.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan:0x4000000000000) (f64.const -nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan) (f64.const -nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan:0x4000000000000) (f64.const -nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan) (f64.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan:0x4000000000000) (f64.const nan)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan) (f64.const nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (f64.const nan:0x4000000000000) (f64.const nan:0x4000000000000)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x0p+0) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x0p+0) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x0p+0) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x0p+0) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x0p+0) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x0p+0) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x0p+0) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x0p+0) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x0p+0) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x0p+0) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x0p+0) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x0p+0) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x0p+0) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x0p+0) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x0p+0) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x0p+0) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x0p+0) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x0p+0) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x0p+0) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x0p+0) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x0p+0) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x0p+0) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x0p+0) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x0p+0) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x0p+0) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x0p+0) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x0p+0) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x0p+0) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x0p+0) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x0p+0) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x0p+0) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x0p+0) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x0p+0) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x0p+0) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x0p+0) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x0p+0) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x0p+0) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x0p+0) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x0p+0) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x0p+0) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x0.0000000000001p-1022) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x0.0000000000001p-1022) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x0.0000000000001p-1022) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x0.0000000000001p-1022) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x0.0000000000001p-1022) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x0.0000000000001p-1022) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x0.0000000000001p-1022) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x0.0000000000001p-1022) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x0.0000000000001p-1022) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x0.0000000000001p-1022) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x0.0000000000001p-1022) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x0.0000000000001p-1022) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x0.0000000000001p-1022) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x0.0000000000001p-1022) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x0.0000000000001p-1022) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x0.0000000000001p-1022) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x0.0000000000001p-1022) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x0.0000000000001p-1022) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x0.0000000000001p-1022) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x0.0000000000001p-1022) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p-1022) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x1p-1022) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1p-1022) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1p-1022) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p-1022) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x1p-1022) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1p-1022) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1p-1022) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p-1022) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p-1022) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1p-1022) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1p-1022) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p-1022) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p-1022) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1p-1022) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1p-1022) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x1p-1022) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p-1022) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1p-1022) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1p-1022) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x1p-1022) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p-1022) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1p-1022) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1p-1022) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x1p-1022) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p-1022) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1p-1022) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1p-1022) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x1p-1022) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p-1022) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1p-1022) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1p-1022) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x1p-1022) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p-1022) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p-1022) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p-1022) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1p-1022) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1p-1022) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1p-1022) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1p-1022) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p-1) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x1p-1) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1p-1) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1p-1) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p-1) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x1p-1) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1p-1) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1p-1) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p-1) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x1p-1) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1p-1) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1p-1) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p-1) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p-1) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1p-1) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1p-1) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p-1) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p-1) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1p-1) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1p-1) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x1p-1) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p-1) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1p-1) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1p-1) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x1p-1) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p-1) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1p-1) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1p-1) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x1p-1) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p-1) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1p-1) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1p-1) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x1p-1) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p-1) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p-1) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p-1) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1p-1) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1p-1) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1p-1) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1p-1) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p+0) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x1p+0) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1p+0) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1p+0) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p+0) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x1p+0) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1p+0) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1p+0) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p+0) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x1p+0) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1p+0) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1p+0) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p+0) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x1p+0) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1p+0) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1p+0) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p+0) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p+0) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1p+0) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1p+0) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p+0) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p+0) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1p+0) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1p+0) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x1p+0) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p+0) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1p+0) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1p+0) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x1p+0) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p+0) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1p+0) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1p+0) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x1p+0) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p+0) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p+0) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1p+0) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1p+0) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1p+0) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1p+0) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1p+0) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x1.921fb54442d18p+2) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1.921fb54442d18p+2) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1.921fb54442d18p+2) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1.921fb54442d18p+2) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x1.921fb54442d18p+2) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1.921fb54442d18p+2) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1.921fb54442d18p+2) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1.921fb54442d18p+2) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1.921fb54442d18p+2) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1.921fb54442d18p+2) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1.921fb54442d18p+2) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1.921fb54442d18p+2) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1.fffffffffffffp+1023) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1.fffffffffffffp+1023) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const 0x1.fffffffffffffp+1023) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1.fffffffffffffp+1023) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -0x1.fffffffffffffp+1023) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1.fffffffffffffp+1023) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1.fffffffffffffp+1023) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -0x1.fffffffffffffp+1023) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1.fffffffffffffp+1023) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1.fffffffffffffp+1023) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1.fffffffffffffp+1023) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const 0x1.fffffffffffffp+1023) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -inf) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -inf) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const inf) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const inf) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -inf) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -inf) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const inf) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const inf) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -inf) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -inf) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const inf) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const inf) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -inf) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -inf) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const inf) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const inf) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -inf) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -inf) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const inf) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const inf) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -inf) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -inf) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const inf) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const inf) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -inf) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const -inf) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const inf) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const inf) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -inf) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -inf) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "lt" (f64.const inf) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const inf) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -inf) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -inf) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -inf) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -inf) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const inf) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const inf) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const inf) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const inf) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan:0x4000000000000) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan:0x4000000000000) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan:0x4000000000000) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan:0x4000000000000) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan:0x4000000000000) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan:0x4000000000000) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan:0x4000000000000) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan:0x4000000000000) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan:0x4000000000000) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan:0x4000000000000) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan:0x4000000000000) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan:0x4000000000000) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan:0x4000000000000) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan:0x4000000000000) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan:0x4000000000000) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan:0x4000000000000) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan:0x4000000000000) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan:0x4000000000000) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan:0x4000000000000) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan:0x4000000000000) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan:0x4000000000000) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan:0x4000000000000) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan:0x4000000000000) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan:0x4000000000000) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan:0x4000000000000) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan:0x4000000000000) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan:0x4000000000000) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan:0x4000000000000) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan:0x4000000000000) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan:0x4000000000000) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan:0x4000000000000) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan:0x4000000000000) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan:0x4000000000000) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan:0x4000000000000) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan:0x4000000000000) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const -nan:0x4000000000000) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan:0x4000000000000) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan:0x4000000000000) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan:0x4000000000000) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "lt" (f64.const nan:0x4000000000000) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x0p+0) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x0p+0) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x0p+0) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x0p+0) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x0p+0) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x0p+0) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x0p+0) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x0p+0) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x0p+0) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x0p+0) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x0p+0) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x0p+0) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x0p+0) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x0p+0) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x0p+0) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x0p+0) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x0p+0) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x0p+0) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x0p+0) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x0p+0) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x0p+0) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x0p+0) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x0p+0) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x0p+0) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x0p+0) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x0p+0) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x0p+0) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x0p+0) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x0p+0) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x0p+0) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x0p+0) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x0p+0) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x0p+0) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x0p+0) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x0p+0) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x0p+0) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x0p+0) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x0p+0) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x0p+0) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x0p+0) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x0.0000000000001p-1022) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x0.0000000000001p-1022) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x0.0000000000001p-1022) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x0.0000000000001p-1022) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x0.0000000000001p-1022) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x0.0000000000001p-1022) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x0.0000000000001p-1022) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x0.0000000000001p-1022) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x0.0000000000001p-1022) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x0.0000000000001p-1022) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x0.0000000000001p-1022) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x0.0000000000001p-1022) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x0.0000000000001p-1022) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x0.0000000000001p-1022) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x0.0000000000001p-1022) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x0.0000000000001p-1022) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x0.0000000000001p-1022) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x0.0000000000001p-1022) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x0.0000000000001p-1022) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x0.0000000000001p-1022) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1p-1022) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1p-1022) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1p-1022) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1p-1022) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1p-1022) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1p-1022) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1p-1022) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1p-1022) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1p-1022) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1p-1022) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1p-1022) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1p-1022) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1p-1022) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1p-1022) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1p-1022) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1p-1022) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1p-1022) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1p-1022) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1p-1022) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1p-1022) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1p-1022) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1p-1022) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1p-1022) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1p-1022) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1p-1022) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1p-1022) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1p-1022) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1p-1022) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1p-1022) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1p-1022) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1p-1022) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1p-1022) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1p-1022) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1p-1022) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1p-1022) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1p-1022) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1p-1022) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1p-1022) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1p-1022) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1p-1022) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1p-1) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1p-1) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1p-1) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1p-1) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1p-1) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1p-1) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1p-1) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1p-1) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1p-1) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1p-1) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1p-1) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1p-1) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1p-1) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1p-1) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1p-1) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1p-1) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1p-1) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1p-1) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1p-1) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1p-1) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1p-1) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1p-1) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1p-1) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1p-1) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1p-1) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1p-1) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1p-1) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1p-1) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1p-1) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1p-1) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1p-1) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1p-1) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1p-1) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1p-1) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1p-1) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1p-1) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1p-1) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1p-1) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1p-1) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1p-1) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1p+0) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1p+0) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1p+0) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1p+0) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1p+0) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1p+0) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1p+0) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1p+0) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1p+0) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1p+0) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1p+0) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1p+0) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1p+0) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1p+0) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1p+0) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1p+0) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1p+0) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1p+0) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1p+0) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1p+0) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1p+0) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1p+0) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1p+0) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1p+0) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1p+0) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1p+0) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1p+0) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1p+0) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1p+0) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1p+0) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1p+0) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1p+0) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1p+0) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1p+0) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1p+0) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1p+0) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1p+0) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1p+0) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1p+0) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1p+0) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1.921fb54442d18p+2) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1.921fb54442d18p+2) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1.921fb54442d18p+2) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1.921fb54442d18p+2) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1.921fb54442d18p+2) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1.921fb54442d18p+2) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1.921fb54442d18p+2) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1.921fb54442d18p+2) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1.921fb54442d18p+2) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1.921fb54442d18p+2) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1.921fb54442d18p+2) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1.921fb54442d18p+2) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1.fffffffffffffp+1023) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1.fffffffffffffp+1023) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "le" (f64.const 0x1.fffffffffffffp+1023) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1.fffffffffffffp+1023) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -0x1.fffffffffffffp+1023) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1.fffffffffffffp+1023) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1.fffffffffffffp+1023) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -0x1.fffffffffffffp+1023) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1.fffffffffffffp+1023) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1.fffffffffffffp+1023) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1.fffffffffffffp+1023) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const 0x1.fffffffffffffp+1023) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -inf) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -inf) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "le" (f64.const inf) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const inf) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -inf) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -inf) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "le" (f64.const inf) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const inf) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -inf) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -inf) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "le" (f64.const inf) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const inf) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -inf) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -inf) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "le" (f64.const inf) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f64.const inf) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -inf) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -inf) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "le" (f64.const inf) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const inf) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -inf) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -inf) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "le" (f64.const inf) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "le" (f64.const inf) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -inf) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -inf) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "le" (f64.const inf) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "le" (f64.const inf) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -inf) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -inf) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "le" (f64.const inf) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f64.const inf) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "le" (f64.const -inf) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -inf) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -inf) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -inf) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const inf) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const inf) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const inf) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const inf) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan:0x4000000000000) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan:0x4000000000000) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan:0x4000000000000) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan:0x4000000000000) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan:0x4000000000000) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan:0x4000000000000) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan:0x4000000000000) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan:0x4000000000000) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan:0x4000000000000) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan:0x4000000000000) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan:0x4000000000000) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan:0x4000000000000) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan:0x4000000000000) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan:0x4000000000000) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan:0x4000000000000) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan:0x4000000000000) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan:0x4000000000000) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan:0x4000000000000) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan:0x4000000000000) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan:0x4000000000000) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan:0x4000000000000) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan:0x4000000000000) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan:0x4000000000000) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan:0x4000000000000) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan:0x4000000000000) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan:0x4000000000000) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan:0x4000000000000) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan:0x4000000000000) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan:0x4000000000000) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan:0x4000000000000) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan:0x4000000000000) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan:0x4000000000000) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan:0x4000000000000) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan:0x4000000000000) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan:0x4000000000000) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const -nan:0x4000000000000) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan:0x4000000000000) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan:0x4000000000000) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan:0x4000000000000) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "le" (f64.const nan:0x4000000000000) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x0p+0) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x0p+0) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x0p+0) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x0p+0) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x0p+0) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x0p+0) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x0p+0) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x0p+0) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x0p+0) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x0p+0) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x0p+0) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x0p+0) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x0p+0) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x0p+0) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x0p+0) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x0p+0) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x0p+0) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x0p+0) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x0p+0) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x0p+0) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x0p+0) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x0p+0) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x0p+0) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x0p+0) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x0p+0) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x0p+0) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x0p+0) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x0p+0) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x0p+0) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x0p+0) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x0p+0) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x0p+0) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x0p+0) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x0p+0) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x0p+0) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x0p+0) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x0p+0) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x0p+0) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x0p+0) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x0p+0) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x0.0000000000001p-1022) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x0.0000000000001p-1022) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x0.0000000000001p-1022) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x0.0000000000001p-1022) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x0.0000000000001p-1022) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x0.0000000000001p-1022) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x0.0000000000001p-1022) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x0.0000000000001p-1022) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x0.0000000000001p-1022) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x0.0000000000001p-1022) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x0.0000000000001p-1022) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x0.0000000000001p-1022) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x0.0000000000001p-1022) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x0.0000000000001p-1022) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x0.0000000000001p-1022) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x0.0000000000001p-1022) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x0.0000000000001p-1022) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x0.0000000000001p-1022) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x0.0000000000001p-1022) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x0.0000000000001p-1022) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p-1022) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p-1022) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1p-1022) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1p-1022) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x1p-1022) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p-1022) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1p-1022) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1p-1022) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x1p-1022) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p-1022) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1p-1022) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1p-1022) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p-1022) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x1p-1022) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1p-1022) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1p-1022) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p-1022) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x1p-1022) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1p-1022) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1p-1022) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p-1022) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x1p-1022) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1p-1022) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1p-1022) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p-1022) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x1p-1022) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1p-1022) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1p-1022) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p-1022) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x1p-1022) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1p-1022) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1p-1022) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p-1022) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p-1022) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p-1022) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p-1022) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1p-1022) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1p-1022) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1p-1022) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1p-1022) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p-1) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p-1) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1p-1) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1p-1) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x1p-1) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p-1) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1p-1) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1p-1) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x1p-1) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p-1) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1p-1) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1p-1) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x1p-1) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p-1) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1p-1) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1p-1) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p-1) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x1p-1) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1p-1) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1p-1) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p-1) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x1p-1) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1p-1) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1p-1) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p-1) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x1p-1) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1p-1) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1p-1) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p-1) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x1p-1) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1p-1) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1p-1) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p-1) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p-1) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p-1) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p-1) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1p-1) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1p-1) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1p-1) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1p-1) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p+0) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p+0) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1p+0) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1p+0) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x1p+0) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p+0) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1p+0) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1p+0) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x1p+0) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p+0) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1p+0) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1p+0) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x1p+0) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p+0) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1p+0) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1p+0) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x1p+0) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p+0) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1p+0) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1p+0) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p+0) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x1p+0) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1p+0) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1p+0) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p+0) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x1p+0) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1p+0) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1p+0) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p+0) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x1p+0) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1p+0) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1p+0) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p+0) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p+0) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p+0) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1p+0) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1p+0) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1p+0) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1p+0) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1p+0) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1.921fb54442d18p+2) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x1.921fb54442d18p+2) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1.921fb54442d18p+2) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1.921fb54442d18p+2) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1.921fb54442d18p+2) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1.921fb54442d18p+2) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1.921fb54442d18p+2) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1.921fb54442d18p+2) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1.921fb54442d18p+2) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1.921fb54442d18p+2) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1.921fb54442d18p+2) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1.921fb54442d18p+2) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1.fffffffffffffp+1023) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -0x1.fffffffffffffp+1023) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1.fffffffffffffp+1023) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const 0x1.fffffffffffffp+1023) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1.fffffffffffffp+1023) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1.fffffffffffffp+1023) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1.fffffffffffffp+1023) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -0x1.fffffffffffffp+1023) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1.fffffffffffffp+1023) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1.fffffffffffffp+1023) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1.fffffffffffffp+1023) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const 0x1.fffffffffffffp+1023) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -inf) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -inf) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const inf) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const inf) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -inf) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -inf) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const inf) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const inf) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -inf) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -inf) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const inf) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const inf) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -inf) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -inf) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const inf) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const inf) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -inf) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -inf) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const inf) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const inf) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -inf) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -inf) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const inf) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const inf) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -inf) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -inf) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const inf) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const inf) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const -inf) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -inf) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const inf) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "gt" (f64.const inf) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -inf) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -inf) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -inf) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -inf) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const inf) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const inf) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const inf) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const inf) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan:0x4000000000000) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan:0x4000000000000) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan:0x4000000000000) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan:0x4000000000000) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan:0x4000000000000) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan:0x4000000000000) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan:0x4000000000000) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan:0x4000000000000) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan:0x4000000000000) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan:0x4000000000000) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan:0x4000000000000) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan:0x4000000000000) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan:0x4000000000000) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan:0x4000000000000) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan:0x4000000000000) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan:0x4000000000000) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan:0x4000000000000) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan:0x4000000000000) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan:0x4000000000000) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan:0x4000000000000) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan:0x4000000000000) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan:0x4000000000000) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan:0x4000000000000) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan:0x4000000000000) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan:0x4000000000000) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan:0x4000000000000) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan:0x4000000000000) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan:0x4000000000000) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan:0x4000000000000) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan:0x4000000000000) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan:0x4000000000000) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan:0x4000000000000) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan:0x4000000000000) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan:0x4000000000000) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan:0x4000000000000) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const -nan:0x4000000000000) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan:0x4000000000000) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan:0x4000000000000) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan:0x4000000000000) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "gt" (f64.const nan:0x4000000000000) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x0p+0) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x0p+0) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x0p+0) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x0p+0) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x0p+0) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x0p+0) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x0p+0) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x0p+0) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x0p+0) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x0p+0) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x0p+0) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x0p+0) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x0p+0) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x0p+0) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x0p+0) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x0p+0) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x0p+0) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x0p+0) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x0p+0) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x0p+0) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x0p+0) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x0p+0) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x0p+0) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x0p+0) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x0p+0) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x0p+0) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x0p+0) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x0p+0) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x0p+0) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x0p+0) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x0p+0) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x0p+0) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x0p+0) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x0p+0) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x0p+0) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x0p+0) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x0p+0) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x0p+0) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x0p+0) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x0p+0) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x0.0000000000001p-1022) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x0.0000000000001p-1022) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x0.0000000000001p-1022) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x0.0000000000001p-1022) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x0.0000000000001p-1022) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x0.0000000000001p-1022) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x0.0000000000001p-1022) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x0.0000000000001p-1022) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x0.0000000000001p-1022) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x0.0000000000001p-1022) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x0.0000000000001p-1022) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x0.0000000000001p-1022) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x0.0000000000001p-1022) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x0.0000000000001p-1022) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x0.0000000000001p-1022) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x0.0000000000001p-1022) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x0.0000000000001p-1022) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x0.0000000000001p-1022) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x0.0000000000001p-1022) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x0.0000000000001p-1022) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x0.0000000000001p-1022) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x0.0000000000001p-1022) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x0.0000000000001p-1022) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x0.0000000000001p-1022) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1p-1022) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1p-1022) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1p-1022) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1p-1022) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1p-1022) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1p-1022) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1p-1022) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1p-1022) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1p-1022) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1p-1022) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1p-1022) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1p-1022) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1p-1022) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1p-1022) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1p-1022) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1p-1022) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1p-1022) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1p-1022) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1p-1022) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1p-1022) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1p-1022) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1p-1022) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1p-1022) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1p-1022) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1p-1022) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1p-1022) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1p-1022) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1p-1022) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1p-1022) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1p-1022) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1p-1022) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1p-1022) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1p-1022) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1p-1022) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1p-1022) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1p-1022) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1p-1022) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1p-1022) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1p-1022) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1p-1022) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1p-1) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1p-1) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1p-1) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1p-1) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1p-1) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1p-1) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1p-1) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1p-1) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1p-1) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1p-1) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1p-1) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1p-1) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1p-1) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1p-1) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1p-1) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1p-1) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1p-1) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1p-1) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1p-1) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1p-1) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1p-1) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1p-1) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1p-1) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1p-1) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1p-1) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1p-1) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1p-1) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1p-1) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1p-1) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1p-1) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1p-1) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1p-1) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1p-1) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1p-1) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1p-1) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1p-1) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1p-1) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1p-1) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1p-1) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1p-1) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1p+0) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1p+0) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1p+0) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1p+0) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1p+0) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1p+0) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1p+0) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1p+0) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1p+0) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1p+0) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1p+0) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1p+0) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1p+0) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1p+0) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1p+0) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1p+0) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1p+0) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1p+0) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1p+0) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1p+0) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1p+0) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1p+0) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1p+0) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1p+0) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1p+0) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1p+0) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1p+0) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1p+0) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1p+0) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1p+0) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1p+0) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1p+0) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1p+0) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1p+0) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1p+0) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1p+0) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1p+0) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1p+0) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1p+0) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1p+0) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1.921fb54442d18p+2) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1.921fb54442d18p+2) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1.921fb54442d18p+2) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1.921fb54442d18p+2) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1.921fb54442d18p+2) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1.921fb54442d18p+2) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1.921fb54442d18p+2) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1.921fb54442d18p+2) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1.921fb54442d18p+2) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1.921fb54442d18p+2) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1.921fb54442d18p+2) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1.921fb54442d18p+2) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1.921fb54442d18p+2) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1.921fb54442d18p+2) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1.921fb54442d18p+2) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1.921fb54442d18p+2) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1.fffffffffffffp+1023) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1.fffffffffffffp+1023) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1.fffffffffffffp+1023) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1.fffffffffffffp+1023) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1.fffffffffffffp+1023) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -0x1.fffffffffffffp+1023) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1.fffffffffffffp+1023) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const 0x1.fffffffffffffp+1023) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1.fffffffffffffp+1023) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1.fffffffffffffp+1023) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1.fffffffffffffp+1023) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -0x1.fffffffffffffp+1023) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1.fffffffffffffp+1023) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1.fffffffffffffp+1023) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1.fffffffffffffp+1023) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const 0x1.fffffffffffffp+1023) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -inf) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -inf) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const inf) (f64.const -0x0p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const inf) (f64.const 0x0p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -inf) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -inf) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const inf) (f64.const -0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const inf) (f64.const 0x0.0000000000001p-1022)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -inf) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -inf) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const inf) (f64.const -0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const inf) (f64.const 0x1p-1022)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -inf) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -inf) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const inf) (f64.const -0x1p-1)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const inf) (f64.const 0x1p-1)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -inf) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -inf) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const inf) (f64.const -0x1p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const inf) (f64.const 0x1p+0)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -inf) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -inf) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const inf) (f64.const -0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const inf) (f64.const 0x1.921fb54442d18p+2)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -inf) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -inf) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const inf) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const inf) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -inf) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -inf) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const inf) (f64.const -inf)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const inf) (f64.const inf)) (i32.const 1)) -(assert_return (invoke "ge" (f64.const -inf) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -inf) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -inf) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -inf) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const inf) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const inf) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const inf) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const inf) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan:0x4000000000000) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan:0x4000000000000) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan:0x4000000000000) (f64.const -0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan:0x4000000000000) (f64.const 0x0p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan:0x4000000000000) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan:0x4000000000000) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan:0x4000000000000) (f64.const -0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan:0x4000000000000) (f64.const 0x0.0000000000001p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan:0x4000000000000) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan:0x4000000000000) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan:0x4000000000000) (f64.const -0x1p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan:0x4000000000000) (f64.const 0x1p-1022)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan:0x4000000000000) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan:0x4000000000000) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan:0x4000000000000) (f64.const -0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan:0x4000000000000) (f64.const 0x1p-1)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan:0x4000000000000) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan:0x4000000000000) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan:0x4000000000000) (f64.const -0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan:0x4000000000000) (f64.const 0x1p+0)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan:0x4000000000000) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan:0x4000000000000) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan:0x4000000000000) (f64.const -0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan:0x4000000000000) (f64.const 0x1.921fb54442d18p+2)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan:0x4000000000000) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan:0x4000000000000) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan:0x4000000000000) (f64.const -0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan:0x4000000000000) (f64.const 0x1.fffffffffffffp+1023)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan:0x4000000000000) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan:0x4000000000000) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan:0x4000000000000) (f64.const -inf)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan:0x4000000000000) (f64.const inf)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan:0x4000000000000) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan:0x4000000000000) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan:0x4000000000000) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const -nan:0x4000000000000) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan:0x4000000000000) (f64.const -nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan:0x4000000000000) (f64.const -nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan:0x4000000000000) (f64.const nan)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan) (f64.const nan:0x4000000000000)) (i32.const 0)) -(assert_return (invoke "ge" (f64.const nan:0x4000000000000) (f64.const nan:0x4000000000000)) (i32.const 0)) diff --git a/tests/misc_testsuite/winch/globals.wast b/tests/misc_testsuite/winch/global.wast similarity index 93% rename from tests/misc_testsuite/winch/globals.wast rename to tests/misc_testsuite/winch/global.wast index 46131b526636..7f7ad15fb895 100644 --- a/tests/misc_testsuite/winch/globals.wast +++ b/tests/misc_testsuite/winch/global.wast @@ -138,8 +138,19 @@ (global.get 0) (i32.const 1) ) ) + + (func (export "as-store-first") + (global.get $x) (i32.const 1) (i32.store) + ) + (func (export "as-store-last") + (i32.const 0) (global.get $x) (i32.store) + ) + (func (export "as-load-operand") (result i32) + (i32.load (global.get $x)) + ) ) + (assert_return (invoke "get-a") (i32.const -2)) (assert_return (invoke "get-b") (i64.const -5)) (assert_return (invoke "get-x") (i32.const -12)) @@ -192,3 +203,7 @@ (assert_return (invoke "as-br_table-first") (i32.const 6)) (assert_return (invoke "as-br_table-last") (i32.const 2)) + +(assert_return (invoke "as-store-first")) +(assert_return (invoke "as-store-last")) +(assert_return (invoke "as-load-operand") (i32.const 1)) diff --git a/tests/misc_testsuite/winch/i32.wast b/tests/misc_testsuite/winch/i32.wast deleted file mode 100644 index 8a06d0914500..000000000000 --- a/tests/misc_testsuite/winch/i32.wast +++ /dev/null @@ -1,422 +0,0 @@ -;; i32 operations - -(module - (func (export "add") (param $x i32) (param $y i32) (result i32) (i32.add (local.get $x) (local.get $y))) - (func (export "sub") (param $x i32) (param $y i32) (result i32) (i32.sub (local.get $x) (local.get $y))) - (func (export "mul") (param $x i32) (param $y i32) (result i32) (i32.mul (local.get $x) (local.get $y))) - (func (export "div_s") (param $x i32) (param $y i32) (result i32) (i32.div_s (local.get $x) (local.get $y))) - (func (export "div_u") (param $x i32) (param $y i32) (result i32) (i32.div_u (local.get $x) (local.get $y))) - (func (export "rem_s") (param $x i32) (param $y i32) (result i32) (i32.rem_s (local.get $x) (local.get $y))) - (func (export "rem_u") (param $x i32) (param $y i32) (result i32) (i32.rem_u (local.get $x) (local.get $y))) - (func (export "and") (param $x i32) (param $y i32) (result i32) (i32.and (local.get $x) (local.get $y))) - (func (export "or") (param $x i32) (param $y i32) (result i32) (i32.or (local.get $x) (local.get $y))) - (func (export "xor") (param $x i32) (param $y i32) (result i32) (i32.xor (local.get $x) (local.get $y))) - (func (export "shl") (param $x i32) (param $y i32) (result i32) (i32.shl (local.get $x) (local.get $y))) - (func (export "shr_s") (param $x i32) (param $y i32) (result i32) (i32.shr_s (local.get $x) (local.get $y))) - (func (export "shr_u") (param $x i32) (param $y i32) (result i32) (i32.shr_u (local.get $x) (local.get $y))) - (func (export "rotl") (param $x i32) (param $y i32) (result i32) (i32.rotl (local.get $x) (local.get $y))) - (func (export "rotr") (param $x i32) (param $y i32) (result i32) (i32.rotr (local.get $x) (local.get $y))) - (func (export "clz") (param $x i32) (result i32) (i32.clz (local.get $x))) - (func (export "ctz") (param $x i32) (result i32) (i32.ctz (local.get $x))) - (func (export "popcnt") (param $x i32) (result i32) (i32.popcnt (local.get $x))) - (func (export "eqz") (param $x i32) (result i32) (i32.eqz (local.get $x))) - (func (export "eq") (param $x i32) (param $y i32) (result i32) (i32.eq (local.get $x) (local.get $y))) - (func (export "ne") (param $x i32) (param $y i32) (result i32) (i32.ne (local.get $x) (local.get $y))) - (func (export "lt_s") (param $x i32) (param $y i32) (result i32) (i32.lt_s (local.get $x) (local.get $y))) - (func (export "lt_u") (param $x i32) (param $y i32) (result i32) (i32.lt_u (local.get $x) (local.get $y))) - (func (export "le_s") (param $x i32) (param $y i32) (result i32) (i32.le_s (local.get $x) (local.get $y))) - (func (export "le_u") (param $x i32) (param $y i32) (result i32) (i32.le_u (local.get $x) (local.get $y))) - (func (export "gt_s") (param $x i32) (param $y i32) (result i32) (i32.gt_s (local.get $x) (local.get $y))) - (func (export "gt_u") (param $x i32) (param $y i32) (result i32) (i32.gt_u (local.get $x) (local.get $y))) - (func (export "ge_s") (param $x i32) (param $y i32) (result i32) (i32.ge_s (local.get $x) (local.get $y))) - (func (export "ge_u") (param $x i32) (param $y i32) (result i32) (i32.ge_u (local.get $x) (local.get $y))) -) - -(assert_return (invoke "add" (i32.const 1) (i32.const 1)) (i32.const 2)) -(assert_return (invoke "add" (i32.const 1) (i32.const 0)) (i32.const 1)) -(assert_return (invoke "add" (i32.const -1) (i32.const -1)) (i32.const -2)) -(assert_return (invoke "add" (i32.const -1) (i32.const 1)) (i32.const 0)) -(assert_return (invoke "add" (i32.const 0x7fffffff) (i32.const 1)) (i32.const 0x80000000)) -(assert_return (invoke "add" (i32.const 0x80000000) (i32.const -1)) (i32.const 0x7fffffff)) -(assert_return (invoke "add" (i32.const 0x80000000) (i32.const 0x80000000)) (i32.const 0)) -(assert_return (invoke "add" (i32.const 0x3fffffff) (i32.const 1)) (i32.const 0x40000000)) - -(assert_return (invoke "sub" (i32.const 1) (i32.const 1)) (i32.const 0)) -(assert_return (invoke "sub" (i32.const 1) (i32.const 0)) (i32.const 1)) -(assert_return (invoke "sub" (i32.const -1) (i32.const -1)) (i32.const 0)) -(assert_return (invoke "sub" (i32.const 0x7fffffff) (i32.const -1)) (i32.const 0x80000000)) -(assert_return (invoke "sub" (i32.const 0x80000000) (i32.const 1)) (i32.const 0x7fffffff)) -(assert_return (invoke "sub" (i32.const 0x80000000) (i32.const 0x80000000)) (i32.const 0)) -(assert_return (invoke "sub" (i32.const 0x3fffffff) (i32.const -1)) (i32.const 0x40000000)) - -(assert_return (invoke "mul" (i32.const 1) (i32.const 1)) (i32.const 1)) -(assert_return (invoke "mul" (i32.const 1) (i32.const 0)) (i32.const 0)) -(assert_return (invoke "mul" (i32.const -1) (i32.const -1)) (i32.const 1)) -(assert_return (invoke "mul" (i32.const 0x10000000) (i32.const 4096)) (i32.const 0)) -(assert_return (invoke "mul" (i32.const 0x80000000) (i32.const 0)) (i32.const 0)) -(assert_return (invoke "mul" (i32.const 0x80000000) (i32.const -1)) (i32.const 0x80000000)) -(assert_return (invoke "mul" (i32.const 0x7fffffff) (i32.const -1)) (i32.const 0x80000001)) -(assert_return (invoke "mul" (i32.const 0x01234567) (i32.const 0x76543210)) (i32.const 0x358e7470)) -(assert_return (invoke "mul" (i32.const 0x7fffffff) (i32.const 0x7fffffff)) (i32.const 1)) - -(assert_trap (invoke "div_s" (i32.const 1) (i32.const 0)) "integer divide by zero") -(assert_trap (invoke "div_s" (i32.const 0) (i32.const 0)) "integer divide by zero") -(assert_trap (invoke "div_s" (i32.const 0x80000000) (i32.const -1)) "integer overflow") -(assert_trap (invoke "div_s" (i32.const 0x80000000) (i32.const 0)) "integer divide by zero") -(assert_return (invoke "div_s" (i32.const 1) (i32.const 1)) (i32.const 1)) -(assert_return (invoke "div_s" (i32.const 0) (i32.const 1)) (i32.const 0)) -(assert_return (invoke "div_s" (i32.const 0) (i32.const -1)) (i32.const 0)) -(assert_return (invoke "div_s" (i32.const -1) (i32.const -1)) (i32.const 1)) -(assert_return (invoke "div_s" (i32.const 0x80000000) (i32.const 2)) (i32.const 0xc0000000)) -(assert_return (invoke "div_s" (i32.const 0x80000001) (i32.const 1000)) (i32.const 0xffdf3b65)) -(assert_return (invoke "div_s" (i32.const 5) (i32.const 2)) (i32.const 2)) -(assert_return (invoke "div_s" (i32.const -5) (i32.const 2)) (i32.const -2)) -(assert_return (invoke "div_s" (i32.const 5) (i32.const -2)) (i32.const -2)) -(assert_return (invoke "div_s" (i32.const -5) (i32.const -2)) (i32.const 2)) -(assert_return (invoke "div_s" (i32.const 7) (i32.const 3)) (i32.const 2)) -(assert_return (invoke "div_s" (i32.const -7) (i32.const 3)) (i32.const -2)) -(assert_return (invoke "div_s" (i32.const 7) (i32.const -3)) (i32.const -2)) -(assert_return (invoke "div_s" (i32.const -7) (i32.const -3)) (i32.const 2)) -(assert_return (invoke "div_s" (i32.const 11) (i32.const 5)) (i32.const 2)) -(assert_return (invoke "div_s" (i32.const 17) (i32.const 7)) (i32.const 2)) - -(assert_trap (invoke "div_u" (i32.const 1) (i32.const 0)) "integer divide by zero") -(assert_trap (invoke "div_u" (i32.const 0) (i32.const 0)) "integer divide by zero") -(assert_return (invoke "div_u" (i32.const 1) (i32.const 1)) (i32.const 1)) -(assert_return (invoke "div_u" (i32.const 0) (i32.const 1)) (i32.const 0)) -(assert_return (invoke "div_u" (i32.const -1) (i32.const -1)) (i32.const 1)) -(assert_return (invoke "div_u" (i32.const 0x80000000) (i32.const -1)) (i32.const 0)) -(assert_return (invoke "div_u" (i32.const 0x80000000) (i32.const 2)) (i32.const 0x40000000)) -(assert_return (invoke "div_u" (i32.const 0x8ff00ff0) (i32.const 0x10001)) (i32.const 0x8fef)) -(assert_return (invoke "div_u" (i32.const 0x80000001) (i32.const 1000)) (i32.const 0x20c49b)) -(assert_return (invoke "div_u" (i32.const 5) (i32.const 2)) (i32.const 2)) -(assert_return (invoke "div_u" (i32.const -5) (i32.const 2)) (i32.const 0x7ffffffd)) -(assert_return (invoke "div_u" (i32.const 5) (i32.const -2)) (i32.const 0)) -(assert_return (invoke "div_u" (i32.const -5) (i32.const -2)) (i32.const 0)) -(assert_return (invoke "div_u" (i32.const 7) (i32.const 3)) (i32.const 2)) -(assert_return (invoke "div_u" (i32.const 11) (i32.const 5)) (i32.const 2)) -(assert_return (invoke "div_u" (i32.const 17) (i32.const 7)) (i32.const 2)) - -(assert_trap (invoke "rem_s" (i32.const 1) (i32.const 0)) "integer divide by zero") -(assert_trap (invoke "rem_s" (i32.const 0) (i32.const 0)) "integer divide by zero") -(assert_return (invoke "rem_s" (i32.const 0x7fffffff) (i32.const -1)) (i32.const 0)) -(assert_return (invoke "rem_s" (i32.const 1) (i32.const 1)) (i32.const 0)) -(assert_return (invoke "rem_s" (i32.const 0) (i32.const 1)) (i32.const 0)) -(assert_return (invoke "rem_s" (i32.const 0) (i32.const -1)) (i32.const 0)) -(assert_return (invoke "rem_s" (i32.const -1) (i32.const -1)) (i32.const 0)) -(assert_return (invoke "rem_s" (i32.const 0x80000000) (i32.const -1)) (i32.const 0)) -(assert_return (invoke "rem_s" (i32.const 0x80000000) (i32.const 2)) (i32.const 0)) -(assert_return (invoke "rem_s" (i32.const 0x80000001) (i32.const 1000)) (i32.const -647)) -(assert_return (invoke "rem_s" (i32.const 5) (i32.const 2)) (i32.const 1)) -(assert_return (invoke "rem_s" (i32.const -5) (i32.const 2)) (i32.const -1)) -(assert_return (invoke "rem_s" (i32.const 5) (i32.const -2)) (i32.const 1)) -(assert_return (invoke "rem_s" (i32.const -5) (i32.const -2)) (i32.const -1)) -(assert_return (invoke "rem_s" (i32.const 7) (i32.const 3)) (i32.const 1)) -(assert_return (invoke "rem_s" (i32.const -7) (i32.const 3)) (i32.const -1)) -(assert_return (invoke "rem_s" (i32.const 7) (i32.const -3)) (i32.const 1)) -(assert_return (invoke "rem_s" (i32.const -7) (i32.const -3)) (i32.const -1)) -(assert_return (invoke "rem_s" (i32.const 11) (i32.const 5)) (i32.const 1)) -(assert_return (invoke "rem_s" (i32.const 17) (i32.const 7)) (i32.const 3)) - -(assert_trap (invoke "rem_u" (i32.const 1) (i32.const 0)) "integer divide by zero") -(assert_trap (invoke "rem_u" (i32.const 0) (i32.const 0)) "integer divide by zero") -(assert_return (invoke "rem_u" (i32.const 1) (i32.const 1)) (i32.const 0)) -(assert_return (invoke "rem_u" (i32.const 0) (i32.const 1)) (i32.const 0)) -(assert_return (invoke "rem_u" (i32.const -1) (i32.const -1)) (i32.const 0)) -(assert_return (invoke "rem_u" (i32.const 0x80000000) (i32.const -1)) (i32.const 0x80000000)) -(assert_return (invoke "rem_u" (i32.const 0x80000000) (i32.const 2)) (i32.const 0)) -(assert_return (invoke "rem_u" (i32.const 0x8ff00ff0) (i32.const 0x10001)) (i32.const 0x8001)) -(assert_return (invoke "rem_u" (i32.const 0x80000001) (i32.const 1000)) (i32.const 649)) -(assert_return (invoke "rem_u" (i32.const 5) (i32.const 2)) (i32.const 1)) -(assert_return (invoke "rem_u" (i32.const -5) (i32.const 2)) (i32.const 1)) -(assert_return (invoke "rem_u" (i32.const 5) (i32.const -2)) (i32.const 5)) -(assert_return (invoke "rem_u" (i32.const -5) (i32.const -2)) (i32.const -5)) -(assert_return (invoke "rem_u" (i32.const 7) (i32.const 3)) (i32.const 1)) -(assert_return (invoke "rem_u" (i32.const 11) (i32.const 5)) (i32.const 1)) -(assert_return (invoke "rem_u" (i32.const 17) (i32.const 7)) (i32.const 3)) - -(assert_return (invoke "and" (i32.const 1) (i32.const 0)) (i32.const 0)) -(assert_return (invoke "and" (i32.const 0) (i32.const 1)) (i32.const 0)) -(assert_return (invoke "and" (i32.const 1) (i32.const 1)) (i32.const 1)) -(assert_return (invoke "and" (i32.const 0) (i32.const 0)) (i32.const 0)) -(assert_return (invoke "and" (i32.const 0x7fffffff) (i32.const 0x80000000)) (i32.const 0)) -(assert_return (invoke "and" (i32.const 0x7fffffff) (i32.const -1)) (i32.const 0x7fffffff)) -(assert_return (invoke "and" (i32.const 0xf0f0ffff) (i32.const 0xfffff0f0)) (i32.const 0xf0f0f0f0)) -(assert_return (invoke "and" (i32.const 0xffffffff) (i32.const 0xffffffff)) (i32.const 0xffffffff)) - -(assert_return (invoke "or" (i32.const 1) (i32.const 0)) (i32.const 1)) -(assert_return (invoke "or" (i32.const 0) (i32.const 1)) (i32.const 1)) -(assert_return (invoke "or" (i32.const 1) (i32.const 1)) (i32.const 1)) -(assert_return (invoke "or" (i32.const 0) (i32.const 0)) (i32.const 0)) -(assert_return (invoke "or" (i32.const 0x7fffffff) (i32.const 0x80000000)) (i32.const -1)) -(assert_return (invoke "or" (i32.const 0x80000000) (i32.const 0)) (i32.const 0x80000000)) -(assert_return (invoke "or" (i32.const 0xf0f0ffff) (i32.const 0xfffff0f0)) (i32.const 0xffffffff)) -(assert_return (invoke "or" (i32.const 0xffffffff) (i32.const 0xffffffff)) (i32.const 0xffffffff)) - -(assert_return (invoke "xor" (i32.const 1) (i32.const 0)) (i32.const 1)) -(assert_return (invoke "xor" (i32.const 0) (i32.const 1)) (i32.const 1)) -(assert_return (invoke "xor" (i32.const 1) (i32.const 1)) (i32.const 0)) -(assert_return (invoke "xor" (i32.const 0) (i32.const 0)) (i32.const 0)) -(assert_return (invoke "xor" (i32.const 0x7fffffff) (i32.const 0x80000000)) (i32.const -1)) -(assert_return (invoke "xor" (i32.const 0x80000000) (i32.const 0)) (i32.const 0x80000000)) -(assert_return (invoke "xor" (i32.const -1) (i32.const 0x80000000)) (i32.const 0x7fffffff)) -(assert_return (invoke "xor" (i32.const -1) (i32.const 0x7fffffff)) (i32.const 0x80000000)) -(assert_return (invoke "xor" (i32.const 0xf0f0ffff) (i32.const 0xfffff0f0)) (i32.const 0x0f0f0f0f)) -(assert_return (invoke "xor" (i32.const 0xffffffff) (i32.const 0xffffffff)) (i32.const 0)) - -(assert_return (invoke "shl" (i32.const 1) (i32.const 1)) (i32.const 2)) -(assert_return (invoke "shl" (i32.const 1) (i32.const 0)) (i32.const 1)) -(assert_return (invoke "shl" (i32.const 0x7fffffff) (i32.const 1)) (i32.const 0xfffffffe)) -(assert_return (invoke "shl" (i32.const 0xffffffff) (i32.const 1)) (i32.const 0xfffffffe)) -(assert_return (invoke "shl" (i32.const 0x80000000) (i32.const 1)) (i32.const 0)) -(assert_return (invoke "shl" (i32.const 0x40000000) (i32.const 1)) (i32.const 0x80000000)) -(assert_return (invoke "shl" (i32.const 1) (i32.const 31)) (i32.const 0x80000000)) -(assert_return (invoke "shl" (i32.const 1) (i32.const 32)) (i32.const 1)) -(assert_return (invoke "shl" (i32.const 1) (i32.const 33)) (i32.const 2)) -(assert_return (invoke "shl" (i32.const 1) (i32.const -1)) (i32.const 0x80000000)) -(assert_return (invoke "shl" (i32.const 1) (i32.const 0x7fffffff)) (i32.const 0x80000000)) - -(assert_return (invoke "shr_s" (i32.const 1) (i32.const 1)) (i32.const 0)) -(assert_return (invoke "shr_s" (i32.const 1) (i32.const 0)) (i32.const 1)) -(assert_return (invoke "shr_s" (i32.const -1) (i32.const 1)) (i32.const -1)) -(assert_return (invoke "shr_s" (i32.const 0x7fffffff) (i32.const 1)) (i32.const 0x3fffffff)) -(assert_return (invoke "shr_s" (i32.const 0x80000000) (i32.const 1)) (i32.const 0xc0000000)) -(assert_return (invoke "shr_s" (i32.const 0x40000000) (i32.const 1)) (i32.const 0x20000000)) -(assert_return (invoke "shr_s" (i32.const 1) (i32.const 32)) (i32.const 1)) -(assert_return (invoke "shr_s" (i32.const 1) (i32.const 33)) (i32.const 0)) -(assert_return (invoke "shr_s" (i32.const 1) (i32.const -1)) (i32.const 0)) -(assert_return (invoke "shr_s" (i32.const 1) (i32.const 0x7fffffff)) (i32.const 0)) -(assert_return (invoke "shr_s" (i32.const 1) (i32.const 0x80000000)) (i32.const 1)) -(assert_return (invoke "shr_s" (i32.const 0x80000000) (i32.const 31)) (i32.const -1)) -(assert_return (invoke "shr_s" (i32.const -1) (i32.const 32)) (i32.const -1)) -(assert_return (invoke "shr_s" (i32.const -1) (i32.const 33)) (i32.const -1)) -(assert_return (invoke "shr_s" (i32.const -1) (i32.const -1)) (i32.const -1)) -(assert_return (invoke "shr_s" (i32.const -1) (i32.const 0x7fffffff)) (i32.const -1)) -(assert_return (invoke "shr_s" (i32.const -1) (i32.const 0x80000000)) (i32.const -1)) - -(assert_return (invoke "shr_u" (i32.const 1) (i32.const 1)) (i32.const 0)) -(assert_return (invoke "shr_u" (i32.const 1) (i32.const 0)) (i32.const 1)) -(assert_return (invoke "shr_u" (i32.const -1) (i32.const 1)) (i32.const 0x7fffffff)) -(assert_return (invoke "shr_u" (i32.const 0x7fffffff) (i32.const 1)) (i32.const 0x3fffffff)) -(assert_return (invoke "shr_u" (i32.const 0x80000000) (i32.const 1)) (i32.const 0x40000000)) -(assert_return (invoke "shr_u" (i32.const 0x40000000) (i32.const 1)) (i32.const 0x20000000)) -(assert_return (invoke "shr_u" (i32.const 1) (i32.const 32)) (i32.const 1)) -(assert_return (invoke "shr_u" (i32.const 1) (i32.const 33)) (i32.const 0)) -(assert_return (invoke "shr_u" (i32.const 1) (i32.const -1)) (i32.const 0)) -(assert_return (invoke "shr_u" (i32.const 1) (i32.const 0x7fffffff)) (i32.const 0)) -(assert_return (invoke "shr_u" (i32.const 1) (i32.const 0x80000000)) (i32.const 1)) -(assert_return (invoke "shr_u" (i32.const 0x80000000) (i32.const 31)) (i32.const 1)) -(assert_return (invoke "shr_u" (i32.const -1) (i32.const 32)) (i32.const -1)) -(assert_return (invoke "shr_u" (i32.const -1) (i32.const 33)) (i32.const 0x7fffffff)) -(assert_return (invoke "shr_u" (i32.const -1) (i32.const -1)) (i32.const 1)) -(assert_return (invoke "shr_u" (i32.const -1) (i32.const 0x7fffffff)) (i32.const 1)) -(assert_return (invoke "shr_u" (i32.const -1) (i32.const 0x80000000)) (i32.const -1)) - -(assert_return (invoke "rotl" (i32.const 1) (i32.const 1)) (i32.const 2)) -(assert_return (invoke "rotl" (i32.const 1) (i32.const 0)) (i32.const 1)) -(assert_return (invoke "rotl" (i32.const -1) (i32.const 1)) (i32.const -1)) -(assert_return (invoke "rotl" (i32.const 1) (i32.const 32)) (i32.const 1)) -(assert_return (invoke "rotl" (i32.const 0xabcd9876) (i32.const 1)) (i32.const 0x579b30ed)) -(assert_return (invoke "rotl" (i32.const 0xfe00dc00) (i32.const 4)) (i32.const 0xe00dc00f)) -(assert_return (invoke "rotl" (i32.const 0xb0c1d2e3) (i32.const 5)) (i32.const 0x183a5c76)) -(assert_return (invoke "rotl" (i32.const 0x00008000) (i32.const 37)) (i32.const 0x00100000)) -(assert_return (invoke "rotl" (i32.const 0xb0c1d2e3) (i32.const 0xff05)) (i32.const 0x183a5c76)) -(assert_return (invoke "rotl" (i32.const 0x769abcdf) (i32.const 0xffffffed)) (i32.const 0x579beed3)) -(assert_return (invoke "rotl" (i32.const 0x769abcdf) (i32.const 0x8000000d)) (i32.const 0x579beed3)) -(assert_return (invoke "rotl" (i32.const 1) (i32.const 31)) (i32.const 0x80000000)) -(assert_return (invoke "rotl" (i32.const 0x80000000) (i32.const 1)) (i32.const 1)) - -(assert_return (invoke "rotr" (i32.const 1) (i32.const 1)) (i32.const 0x80000000)) -(assert_return (invoke "rotr" (i32.const 1) (i32.const 0)) (i32.const 1)) -(assert_return (invoke "rotr" (i32.const -1) (i32.const 1)) (i32.const -1)) -(assert_return (invoke "rotr" (i32.const 1) (i32.const 32)) (i32.const 1)) -(assert_return (invoke "rotr" (i32.const 0xff00cc00) (i32.const 1)) (i32.const 0x7f806600)) -(assert_return (invoke "rotr" (i32.const 0x00080000) (i32.const 4)) (i32.const 0x00008000)) -(assert_return (invoke "rotr" (i32.const 0xb0c1d2e3) (i32.const 5)) (i32.const 0x1d860e97)) -(assert_return (invoke "rotr" (i32.const 0x00008000) (i32.const 37)) (i32.const 0x00000400)) -(assert_return (invoke "rotr" (i32.const 0xb0c1d2e3) (i32.const 0xff05)) (i32.const 0x1d860e97)) -(assert_return (invoke "rotr" (i32.const 0x769abcdf) (i32.const 0xffffffed)) (i32.const 0xe6fbb4d5)) -(assert_return (invoke "rotr" (i32.const 0x769abcdf) (i32.const 0x8000000d)) (i32.const 0xe6fbb4d5)) -(assert_return (invoke "rotr" (i32.const 1) (i32.const 31)) (i32.const 2)) -(assert_return (invoke "rotr" (i32.const 0x80000000) (i32.const 31)) (i32.const 1)) - -(assert_return (invoke "clz" (i32.const 0xffffffff)) (i32.const 0)) -(assert_return (invoke "clz" (i32.const 0)) (i32.const 32)) -(assert_return (invoke "clz" (i32.const 0x00008000)) (i32.const 16)) -(assert_return (invoke "clz" (i32.const 0xff)) (i32.const 24)) -(assert_return (invoke "clz" (i32.const 0x80000000)) (i32.const 0)) -(assert_return (invoke "clz" (i32.const 1)) (i32.const 31)) -(assert_return (invoke "clz" (i32.const 2)) (i32.const 30)) -(assert_return (invoke "clz" (i32.const 0x7fffffff)) (i32.const 1)) - -(assert_return (invoke "ctz" (i32.const -1)) (i32.const 0)) -(assert_return (invoke "ctz" (i32.const 0)) (i32.const 32)) -(assert_return (invoke "ctz" (i32.const 0x00008000)) (i32.const 15)) -(assert_return (invoke "ctz" (i32.const 0x00010000)) (i32.const 16)) -(assert_return (invoke "ctz" (i32.const 0x80000000)) (i32.const 31)) -(assert_return (invoke "ctz" (i32.const 0x7fffffff)) (i32.const 0)) - -(assert_return (invoke "popcnt" (i32.const -1)) (i32.const 32)) -(assert_return (invoke "popcnt" (i32.const 0)) (i32.const 0)) -(assert_return (invoke "popcnt" (i32.const 0x00008000)) (i32.const 1)) -(assert_return (invoke "popcnt" (i32.const 0x80008000)) (i32.const 2)) -(assert_return (invoke "popcnt" (i32.const 0x7fffffff)) (i32.const 31)) -(assert_return (invoke "popcnt" (i32.const 0xAAAAAAAA)) (i32.const 16)) -(assert_return (invoke "popcnt" (i32.const 0x55555555)) (i32.const 16)) -(assert_return (invoke "popcnt" (i32.const 0xDEADBEEF)) (i32.const 24)) - -(assert_return (invoke "eqz" (i32.const 0)) (i32.const 1)) -(assert_return (invoke "eqz" (i32.const 1)) (i32.const 0)) -(assert_return (invoke "eqz" (i32.const 0x80000000)) (i32.const 0)) -(assert_return (invoke "eqz" (i32.const 0x7fffffff)) (i32.const 0)) -(assert_return (invoke "eqz" (i32.const 0xffffffff)) (i32.const 0)) - -(assert_return (invoke "eq" (i32.const 0) (i32.const 0)) (i32.const 1)) -(assert_return (invoke "eq" (i32.const 1) (i32.const 1)) (i32.const 1)) -(assert_return (invoke "eq" (i32.const -1) (i32.const 1)) (i32.const 0)) -(assert_return (invoke "eq" (i32.const 0x80000000) (i32.const 0x80000000)) (i32.const 1)) -(assert_return (invoke "eq" (i32.const 0x7fffffff) (i32.const 0x7fffffff)) (i32.const 1)) -(assert_return (invoke "eq" (i32.const -1) (i32.const -1)) (i32.const 1)) -(assert_return (invoke "eq" (i32.const 1) (i32.const 0)) (i32.const 0)) -(assert_return (invoke "eq" (i32.const 0) (i32.const 1)) (i32.const 0)) -(assert_return (invoke "eq" (i32.const 0x80000000) (i32.const 0)) (i32.const 0)) -(assert_return (invoke "eq" (i32.const 0) (i32.const 0x80000000)) (i32.const 0)) -(assert_return (invoke "eq" (i32.const 0x80000000) (i32.const -1)) (i32.const 0)) -(assert_return (invoke "eq" (i32.const -1) (i32.const 0x80000000)) (i32.const 0)) -(assert_return (invoke "eq" (i32.const 0x80000000) (i32.const 0x7fffffff)) (i32.const 0)) -(assert_return (invoke "eq" (i32.const 0x7fffffff) (i32.const 0x80000000)) (i32.const 0)) - -(assert_return (invoke "ne" (i32.const 0) (i32.const 0)) (i32.const 0)) -(assert_return (invoke "ne" (i32.const 1) (i32.const 1)) (i32.const 0)) -(assert_return (invoke "ne" (i32.const -1) (i32.const 1)) (i32.const 1)) -(assert_return (invoke "ne" (i32.const 0x80000000) (i32.const 0x80000000)) (i32.const 0)) -(assert_return (invoke "ne" (i32.const 0x7fffffff) (i32.const 0x7fffffff)) (i32.const 0)) -(assert_return (invoke "ne" (i32.const -1) (i32.const -1)) (i32.const 0)) -(assert_return (invoke "ne" (i32.const 1) (i32.const 0)) (i32.const 1)) -(assert_return (invoke "ne" (i32.const 0) (i32.const 1)) (i32.const 1)) -(assert_return (invoke "ne" (i32.const 0x80000000) (i32.const 0)) (i32.const 1)) -(assert_return (invoke "ne" (i32.const 0) (i32.const 0x80000000)) (i32.const 1)) -(assert_return (invoke "ne" (i32.const 0x80000000) (i32.const -1)) (i32.const 1)) -(assert_return (invoke "ne" (i32.const -1) (i32.const 0x80000000)) (i32.const 1)) -(assert_return (invoke "ne" (i32.const 0x80000000) (i32.const 0x7fffffff)) (i32.const 1)) -(assert_return (invoke "ne" (i32.const 0x7fffffff) (i32.const 0x80000000)) (i32.const 1)) - -(assert_return (invoke "lt_s" (i32.const 0) (i32.const 0)) (i32.const 0)) -(assert_return (invoke "lt_s" (i32.const 1) (i32.const 1)) (i32.const 0)) -(assert_return (invoke "lt_s" (i32.const -1) (i32.const 1)) (i32.const 1)) -(assert_return (invoke "lt_s" (i32.const 0x80000000) (i32.const 0x80000000)) (i32.const 0)) -(assert_return (invoke "lt_s" (i32.const 0x7fffffff) (i32.const 0x7fffffff)) (i32.const 0)) -(assert_return (invoke "lt_s" (i32.const -1) (i32.const -1)) (i32.const 0)) -(assert_return (invoke "lt_s" (i32.const 1) (i32.const 0)) (i32.const 0)) -(assert_return (invoke "lt_s" (i32.const 0) (i32.const 1)) (i32.const 1)) -(assert_return (invoke "lt_s" (i32.const 0x80000000) (i32.const 0)) (i32.const 1)) -(assert_return (invoke "lt_s" (i32.const 0) (i32.const 0x80000000)) (i32.const 0)) -(assert_return (invoke "lt_s" (i32.const 0x80000000) (i32.const -1)) (i32.const 1)) -(assert_return (invoke "lt_s" (i32.const -1) (i32.const 0x80000000)) (i32.const 0)) -(assert_return (invoke "lt_s" (i32.const 0x80000000) (i32.const 0x7fffffff)) (i32.const 1)) -(assert_return (invoke "lt_s" (i32.const 0x7fffffff) (i32.const 0x80000000)) (i32.const 0)) - -(assert_return (invoke "lt_u" (i32.const 0) (i32.const 0)) (i32.const 0)) -(assert_return (invoke "lt_u" (i32.const 1) (i32.const 1)) (i32.const 0)) -(assert_return (invoke "lt_u" (i32.const -1) (i32.const 1)) (i32.const 0)) -(assert_return (invoke "lt_u" (i32.const 0x80000000) (i32.const 0x80000000)) (i32.const 0)) -(assert_return (invoke "lt_u" (i32.const 0x7fffffff) (i32.const 0x7fffffff)) (i32.const 0)) -(assert_return (invoke "lt_u" (i32.const -1) (i32.const -1)) (i32.const 0)) -(assert_return (invoke "lt_u" (i32.const 1) (i32.const 0)) (i32.const 0)) -(assert_return (invoke "lt_u" (i32.const 0) (i32.const 1)) (i32.const 1)) -(assert_return (invoke "lt_u" (i32.const 0x80000000) (i32.const 0)) (i32.const 0)) -(assert_return (invoke "lt_u" (i32.const 0) (i32.const 0x80000000)) (i32.const 1)) -(assert_return (invoke "lt_u" (i32.const 0x80000000) (i32.const -1)) (i32.const 1)) -(assert_return (invoke "lt_u" (i32.const -1) (i32.const 0x80000000)) (i32.const 0)) -(assert_return (invoke "lt_u" (i32.const 0x80000000) (i32.const 0x7fffffff)) (i32.const 0)) -(assert_return (invoke "lt_u" (i32.const 0x7fffffff) (i32.const 0x80000000)) (i32.const 1)) - -(assert_return (invoke "le_s" (i32.const 0) (i32.const 0)) (i32.const 1)) -(assert_return (invoke "le_s" (i32.const 1) (i32.const 1)) (i32.const 1)) -(assert_return (invoke "le_s" (i32.const -1) (i32.const 1)) (i32.const 1)) -(assert_return (invoke "le_s" (i32.const 0x80000000) (i32.const 0x80000000)) (i32.const 1)) -(assert_return (invoke "le_s" (i32.const 0x7fffffff) (i32.const 0x7fffffff)) (i32.const 1)) -(assert_return (invoke "le_s" (i32.const -1) (i32.const -1)) (i32.const 1)) -(assert_return (invoke "le_s" (i32.const 1) (i32.const 0)) (i32.const 0)) -(assert_return (invoke "le_s" (i32.const 0) (i32.const 1)) (i32.const 1)) -(assert_return (invoke "le_s" (i32.const 0x80000000) (i32.const 0)) (i32.const 1)) -(assert_return (invoke "le_s" (i32.const 0) (i32.const 0x80000000)) (i32.const 0)) -(assert_return (invoke "le_s" (i32.const 0x80000000) (i32.const -1)) (i32.const 1)) -(assert_return (invoke "le_s" (i32.const -1) (i32.const 0x80000000)) (i32.const 0)) -(assert_return (invoke "le_s" (i32.const 0x80000000) (i32.const 0x7fffffff)) (i32.const 1)) -(assert_return (invoke "le_s" (i32.const 0x7fffffff) (i32.const 0x80000000)) (i32.const 0)) - -(assert_return (invoke "le_u" (i32.const 0) (i32.const 0)) (i32.const 1)) -(assert_return (invoke "le_u" (i32.const 1) (i32.const 1)) (i32.const 1)) -(assert_return (invoke "le_u" (i32.const -1) (i32.const 1)) (i32.const 0)) -(assert_return (invoke "le_u" (i32.const 0x80000000) (i32.const 0x80000000)) (i32.const 1)) -(assert_return (invoke "le_u" (i32.const 0x7fffffff) (i32.const 0x7fffffff)) (i32.const 1)) -(assert_return (invoke "le_u" (i32.const -1) (i32.const -1)) (i32.const 1)) -(assert_return (invoke "le_u" (i32.const 1) (i32.const 0)) (i32.const 0)) -(assert_return (invoke "le_u" (i32.const 0) (i32.const 1)) (i32.const 1)) -(assert_return (invoke "le_u" (i32.const 0x80000000) (i32.const 0)) (i32.const 0)) -(assert_return (invoke "le_u" (i32.const 0) (i32.const 0x80000000)) (i32.const 1)) -(assert_return (invoke "le_u" (i32.const 0x80000000) (i32.const -1)) (i32.const 1)) -(assert_return (invoke "le_u" (i32.const -1) (i32.const 0x80000000)) (i32.const 0)) -(assert_return (invoke "le_u" (i32.const 0x80000000) (i32.const 0x7fffffff)) (i32.const 0)) -(assert_return (invoke "le_u" (i32.const 0x7fffffff) (i32.const 0x80000000)) (i32.const 1)) - -(assert_return (invoke "gt_s" (i32.const 0) (i32.const 0)) (i32.const 0)) -(assert_return (invoke "gt_s" (i32.const 1) (i32.const 1)) (i32.const 0)) -(assert_return (invoke "gt_s" (i32.const -1) (i32.const 1)) (i32.const 0)) -(assert_return (invoke "gt_s" (i32.const 0x80000000) (i32.const 0x80000000)) (i32.const 0)) -(assert_return (invoke "gt_s" (i32.const 0x7fffffff) (i32.const 0x7fffffff)) (i32.const 0)) -(assert_return (invoke "gt_s" (i32.const -1) (i32.const -1)) (i32.const 0)) -(assert_return (invoke "gt_s" (i32.const 1) (i32.const 0)) (i32.const 1)) -(assert_return (invoke "gt_s" (i32.const 0) (i32.const 1)) (i32.const 0)) -(assert_return (invoke "gt_s" (i32.const 0x80000000) (i32.const 0)) (i32.const 0)) -(assert_return (invoke "gt_s" (i32.const 0) (i32.const 0x80000000)) (i32.const 1)) -(assert_return (invoke "gt_s" (i32.const 0x80000000) (i32.const -1)) (i32.const 0)) -(assert_return (invoke "gt_s" (i32.const -1) (i32.const 0x80000000)) (i32.const 1)) -(assert_return (invoke "gt_s" (i32.const 0x80000000) (i32.const 0x7fffffff)) (i32.const 0)) -(assert_return (invoke "gt_s" (i32.const 0x7fffffff) (i32.const 0x80000000)) (i32.const 1)) - -(assert_return (invoke "gt_u" (i32.const 0) (i32.const 0)) (i32.const 0)) -(assert_return (invoke "gt_u" (i32.const 1) (i32.const 1)) (i32.const 0)) -(assert_return (invoke "gt_u" (i32.const -1) (i32.const 1)) (i32.const 1)) -(assert_return (invoke "gt_u" (i32.const 0x80000000) (i32.const 0x80000000)) (i32.const 0)) -(assert_return (invoke "gt_u" (i32.const 0x7fffffff) (i32.const 0x7fffffff)) (i32.const 0)) -(assert_return (invoke "gt_u" (i32.const -1) (i32.const -1)) (i32.const 0)) -(assert_return (invoke "gt_u" (i32.const 1) (i32.const 0)) (i32.const 1)) -(assert_return (invoke "gt_u" (i32.const 0) (i32.const 1)) (i32.const 0)) -(assert_return (invoke "gt_u" (i32.const 0x80000000) (i32.const 0)) (i32.const 1)) -(assert_return (invoke "gt_u" (i32.const 0) (i32.const 0x80000000)) (i32.const 0)) -(assert_return (invoke "gt_u" (i32.const 0x80000000) (i32.const -1)) (i32.const 0)) -(assert_return (invoke "gt_u" (i32.const -1) (i32.const 0x80000000)) (i32.const 1)) -(assert_return (invoke "gt_u" (i32.const 0x80000000) (i32.const 0x7fffffff)) (i32.const 1)) -(assert_return (invoke "gt_u" (i32.const 0x7fffffff) (i32.const 0x80000000)) (i32.const 0)) - -(assert_return (invoke "ge_s" (i32.const 0) (i32.const 0)) (i32.const 1)) -(assert_return (invoke "ge_s" (i32.const 1) (i32.const 1)) (i32.const 1)) -(assert_return (invoke "ge_s" (i32.const -1) (i32.const 1)) (i32.const 0)) -(assert_return (invoke "ge_s" (i32.const 0x80000000) (i32.const 0x80000000)) (i32.const 1)) -(assert_return (invoke "ge_s" (i32.const 0x7fffffff) (i32.const 0x7fffffff)) (i32.const 1)) -(assert_return (invoke "ge_s" (i32.const -1) (i32.const -1)) (i32.const 1)) -(assert_return (invoke "ge_s" (i32.const 1) (i32.const 0)) (i32.const 1)) -(assert_return (invoke "ge_s" (i32.const 0) (i32.const 1)) (i32.const 0)) -(assert_return (invoke "ge_s" (i32.const 0x80000000) (i32.const 0)) (i32.const 0)) -(assert_return (invoke "ge_s" (i32.const 0) (i32.const 0x80000000)) (i32.const 1)) -(assert_return (invoke "ge_s" (i32.const 0x80000000) (i32.const -1)) (i32.const 0)) -(assert_return (invoke "ge_s" (i32.const -1) (i32.const 0x80000000)) (i32.const 1)) -(assert_return (invoke "ge_s" (i32.const 0x80000000) (i32.const 0x7fffffff)) (i32.const 0)) -(assert_return (invoke "ge_s" (i32.const 0x7fffffff) (i32.const 0x80000000)) (i32.const 1)) - -(assert_return (invoke "ge_u" (i32.const 0) (i32.const 0)) (i32.const 1)) -(assert_return (invoke "ge_u" (i32.const 1) (i32.const 1)) (i32.const 1)) -(assert_return (invoke "ge_u" (i32.const -1) (i32.const 1)) (i32.const 1)) -(assert_return (invoke "ge_u" (i32.const 0x80000000) (i32.const 0x80000000)) (i32.const 1)) -(assert_return (invoke "ge_u" (i32.const 0x7fffffff) (i32.const 0x7fffffff)) (i32.const 1)) -(assert_return (invoke "ge_u" (i32.const -1) (i32.const -1)) (i32.const 1)) -(assert_return (invoke "ge_u" (i32.const 1) (i32.const 0)) (i32.const 1)) -(assert_return (invoke "ge_u" (i32.const 0) (i32.const 1)) (i32.const 0)) -(assert_return (invoke "ge_u" (i32.const 0x80000000) (i32.const 0)) (i32.const 1)) -(assert_return (invoke "ge_u" (i32.const 0) (i32.const 0x80000000)) (i32.const 0)) -(assert_return (invoke "ge_u" (i32.const 0x80000000) (i32.const -1)) (i32.const 0)) -(assert_return (invoke "ge_u" (i32.const -1) (i32.const 0x80000000)) (i32.const 1)) -(assert_return (invoke "ge_u" (i32.const 0x80000000) (i32.const 0x7fffffff)) (i32.const 1)) -(assert_return (invoke "ge_u" (i32.const 0x7fffffff) (i32.const 0x80000000)) (i32.const 0)) diff --git a/tests/misc_testsuite/winch/i64.wast b/tests/misc_testsuite/winch/i64.wast deleted file mode 100644 index 1783c61782d1..000000000000 --- a/tests/misc_testsuite/winch/i64.wast +++ /dev/null @@ -1,422 +0,0 @@ -;; i64 operations - -(module - (func (export "add") (param $x i64) (param $y i64) (result i64) (i64.add (local.get $x) (local.get $y))) - (func (export "sub") (param $x i64) (param $y i64) (result i64) (i64.sub (local.get $x) (local.get $y))) - (func (export "mul") (param $x i64) (param $y i64) (result i64) (i64.mul (local.get $x) (local.get $y))) - (func (export "div_s") (param $x i64) (param $y i64) (result i64) (i64.div_s (local.get $x) (local.get $y))) - (func (export "div_u") (param $x i64) (param $y i64) (result i64) (i64.div_u (local.get $x) (local.get $y))) - (func (export "rem_s") (param $x i64) (param $y i64) (result i64) (i64.rem_s (local.get $x) (local.get $y))) - (func (export "rem_u") (param $x i64) (param $y i64) (result i64) (i64.rem_u (local.get $x) (local.get $y))) - (func (export "and") (param $x i64) (param $y i64) (result i64) (i64.and (local.get $x) (local.get $y))) - (func (export "or") (param $x i64) (param $y i64) (result i64) (i64.or (local.get $x) (local.get $y))) - (func (export "xor") (param $x i64) (param $y i64) (result i64) (i64.xor (local.get $x) (local.get $y))) - (func (export "shl") (param $x i64) (param $y i64) (result i64) (i64.shl (local.get $x) (local.get $y))) - (func (export "shr_s") (param $x i64) (param $y i64) (result i64) (i64.shr_s (local.get $x) (local.get $y))) - (func (export "shr_u") (param $x i64) (param $y i64) (result i64) (i64.shr_u (local.get $x) (local.get $y))) - (func (export "rotl") (param $x i64) (param $y i64) (result i64) (i64.rotl (local.get $x) (local.get $y))) - (func (export "rotr") (param $x i64) (param $y i64) (result i64) (i64.rotr (local.get $x) (local.get $y))) - (func (export "clz") (param $x i64) (result i64) (i64.clz (local.get $x))) - (func (export "ctz") (param $x i64) (result i64) (i64.ctz (local.get $x))) - (func (export "popcnt") (param $x i64) (result i64) (i64.popcnt (local.get $x))) - (func (export "eqz") (param $x i64) (result i32) (i64.eqz (local.get $x))) - (func (export "eq") (param $x i64) (param $y i64) (result i32) (i64.eq (local.get $x) (local.get $y))) - (func (export "ne") (param $x i64) (param $y i64) (result i32) (i64.ne (local.get $x) (local.get $y))) - (func (export "lt_s") (param $x i64) (param $y i64) (result i32) (i64.lt_s (local.get $x) (local.get $y))) - (func (export "lt_u") (param $x i64) (param $y i64) (result i32) (i64.lt_u (local.get $x) (local.get $y))) - (func (export "le_s") (param $x i64) (param $y i64) (result i32) (i64.le_s (local.get $x) (local.get $y))) - (func (export "le_u") (param $x i64) (param $y i64) (result i32) (i64.le_u (local.get $x) (local.get $y))) - (func (export "gt_s") (param $x i64) (param $y i64) (result i32) (i64.gt_s (local.get $x) (local.get $y))) - (func (export "gt_u") (param $x i64) (param $y i64) (result i32) (i64.gt_u (local.get $x) (local.get $y))) - (func (export "ge_s") (param $x i64) (param $y i64) (result i32) (i64.ge_s (local.get $x) (local.get $y))) - (func (export "ge_u") (param $x i64) (param $y i64) (result i32) (i64.ge_u (local.get $x) (local.get $y))) -) - -(assert_return (invoke "add" (i64.const 1) (i64.const 1)) (i64.const 2)) -(assert_return (invoke "add" (i64.const 1) (i64.const 0)) (i64.const 1)) -(assert_return (invoke "add" (i64.const -1) (i64.const -1)) (i64.const -2)) -(assert_return (invoke "add" (i64.const -1) (i64.const 1)) (i64.const 0)) -(assert_return (invoke "add" (i64.const 0x7fffffffffffffff) (i64.const 1)) (i64.const 0x8000000000000000)) -(assert_return (invoke "add" (i64.const 0x8000000000000000) (i64.const -1)) (i64.const 0x7fffffffffffffff)) -(assert_return (invoke "add" (i64.const 0x8000000000000000) (i64.const 0x8000000000000000)) (i64.const 0)) -(assert_return (invoke "add" (i64.const 0x3fffffff) (i64.const 1)) (i64.const 0x40000000)) - -(assert_return (invoke "sub" (i64.const 1) (i64.const 1)) (i64.const 0)) -(assert_return (invoke "sub" (i64.const 1) (i64.const 0)) (i64.const 1)) -(assert_return (invoke "sub" (i64.const -1) (i64.const -1)) (i64.const 0)) -(assert_return (invoke "sub" (i64.const 0x7fffffffffffffff) (i64.const -1)) (i64.const 0x8000000000000000)) -(assert_return (invoke "sub" (i64.const 0x8000000000000000) (i64.const 1)) (i64.const 0x7fffffffffffffff)) -(assert_return (invoke "sub" (i64.const 0x8000000000000000) (i64.const 0x8000000000000000)) (i64.const 0)) -(assert_return (invoke "sub" (i64.const 0x3fffffff) (i64.const -1)) (i64.const 0x40000000)) - -(assert_return (invoke "mul" (i64.const 1) (i64.const 1)) (i64.const 1)) -(assert_return (invoke "mul" (i64.const 1) (i64.const 0)) (i64.const 0)) -(assert_return (invoke "mul" (i64.const -1) (i64.const -1)) (i64.const 1)) -(assert_return (invoke "mul" (i64.const 0x1000000000000000) (i64.const 4096)) (i64.const 0)) -(assert_return (invoke "mul" (i64.const 0x8000000000000000) (i64.const 0)) (i64.const 0)) -(assert_return (invoke "mul" (i64.const 0x8000000000000000) (i64.const -1)) (i64.const 0x8000000000000000)) -(assert_return (invoke "mul" (i64.const 0x7fffffffffffffff) (i64.const -1)) (i64.const 0x8000000000000001)) -(assert_return (invoke "mul" (i64.const 0x0123456789abcdef) (i64.const 0xfedcba9876543210)) (i64.const 0x2236d88fe5618cf0)) -(assert_return (invoke "mul" (i64.const 0x7fffffffffffffff) (i64.const 0x7fffffffffffffff)) (i64.const 1)) - -(assert_trap (invoke "div_s" (i64.const 1) (i64.const 0)) "integer divide by zero") -(assert_trap (invoke "div_s" (i64.const 0) (i64.const 0)) "integer divide by zero") -(assert_trap (invoke "div_s" (i64.const 0x8000000000000000) (i64.const -1)) "integer overflow") -(assert_trap (invoke "div_s" (i64.const 0x8000000000000000) (i64.const 0)) "integer divide by zero") -(assert_return (invoke "div_s" (i64.const 1) (i64.const 1)) (i64.const 1)) -(assert_return (invoke "div_s" (i64.const 0) (i64.const 1)) (i64.const 0)) -(assert_return (invoke "div_s" (i64.const 0) (i64.const -1)) (i64.const 0)) -(assert_return (invoke "div_s" (i64.const -1) (i64.const -1)) (i64.const 1)) -(assert_return (invoke "div_s" (i64.const 0x8000000000000000) (i64.const 2)) (i64.const 0xc000000000000000)) -(assert_return (invoke "div_s" (i64.const 0x8000000000000001) (i64.const 1000)) (i64.const 0xffdf3b645a1cac09)) -(assert_return (invoke "div_s" (i64.const 5) (i64.const 2)) (i64.const 2)) -(assert_return (invoke "div_s" (i64.const -5) (i64.const 2)) (i64.const -2)) -(assert_return (invoke "div_s" (i64.const 5) (i64.const -2)) (i64.const -2)) -(assert_return (invoke "div_s" (i64.const -5) (i64.const -2)) (i64.const 2)) -(assert_return (invoke "div_s" (i64.const 7) (i64.const 3)) (i64.const 2)) -(assert_return (invoke "div_s" (i64.const -7) (i64.const 3)) (i64.const -2)) -(assert_return (invoke "div_s" (i64.const 7) (i64.const -3)) (i64.const -2)) -(assert_return (invoke "div_s" (i64.const -7) (i64.const -3)) (i64.const 2)) -(assert_return (invoke "div_s" (i64.const 11) (i64.const 5)) (i64.const 2)) -(assert_return (invoke "div_s" (i64.const 17) (i64.const 7)) (i64.const 2)) - -(assert_trap (invoke "div_u" (i64.const 1) (i64.const 0)) "integer divide by zero") -(assert_trap (invoke "div_u" (i64.const 0) (i64.const 0)) "integer divide by zero") -(assert_return (invoke "div_u" (i64.const 1) (i64.const 1)) (i64.const 1)) -(assert_return (invoke "div_u" (i64.const 0) (i64.const 1)) (i64.const 0)) -(assert_return (invoke "div_u" (i64.const -1) (i64.const -1)) (i64.const 1)) -(assert_return (invoke "div_u" (i64.const 0x8000000000000000) (i64.const -1)) (i64.const 0)) -(assert_return (invoke "div_u" (i64.const 0x8000000000000000) (i64.const 2)) (i64.const 0x4000000000000000)) -(assert_return (invoke "div_u" (i64.const 0x8ff00ff00ff00ff0) (i64.const 0x100000001)) (i64.const 0x8ff00fef)) -(assert_return (invoke "div_u" (i64.const 0x8000000000000001) (i64.const 1000)) (i64.const 0x20c49ba5e353f7)) -(assert_return (invoke "div_u" (i64.const 5) (i64.const 2)) (i64.const 2)) -(assert_return (invoke "div_u" (i64.const -5) (i64.const 2)) (i64.const 0x7ffffffffffffffd)) -(assert_return (invoke "div_u" (i64.const 5) (i64.const -2)) (i64.const 0)) -(assert_return (invoke "div_u" (i64.const -5) (i64.const -2)) (i64.const 0)) -(assert_return (invoke "div_u" (i64.const 7) (i64.const 3)) (i64.const 2)) -(assert_return (invoke "div_u" (i64.const 11) (i64.const 5)) (i64.const 2)) -(assert_return (invoke "div_u" (i64.const 17) (i64.const 7)) (i64.const 2)) - -(assert_trap (invoke "rem_s" (i64.const 1) (i64.const 0)) "integer divide by zero") -(assert_trap (invoke "rem_s" (i64.const 0) (i64.const 0)) "integer divide by zero") -(assert_return (invoke "rem_s" (i64.const 0x7fffffffffffffff) (i64.const -1)) (i64.const 0)) -(assert_return (invoke "rem_s" (i64.const 1) (i64.const 1)) (i64.const 0)) -(assert_return (invoke "rem_s" (i64.const 0) (i64.const 1)) (i64.const 0)) -(assert_return (invoke "rem_s" (i64.const 0) (i64.const -1)) (i64.const 0)) -(assert_return (invoke "rem_s" (i64.const -1) (i64.const -1)) (i64.const 0)) -(assert_return (invoke "rem_s" (i64.const 0x8000000000000000) (i64.const -1)) (i64.const 0)) -(assert_return (invoke "rem_s" (i64.const 0x8000000000000000) (i64.const 2)) (i64.const 0)) -(assert_return (invoke "rem_s" (i64.const 0x8000000000000001) (i64.const 1000)) (i64.const -807)) -(assert_return (invoke "rem_s" (i64.const 5) (i64.const 2)) (i64.const 1)) -(assert_return (invoke "rem_s" (i64.const -5) (i64.const 2)) (i64.const -1)) -(assert_return (invoke "rem_s" (i64.const 5) (i64.const -2)) (i64.const 1)) -(assert_return (invoke "rem_s" (i64.const -5) (i64.const -2)) (i64.const -1)) -(assert_return (invoke "rem_s" (i64.const 7) (i64.const 3)) (i64.const 1)) -(assert_return (invoke "rem_s" (i64.const -7) (i64.const 3)) (i64.const -1)) -(assert_return (invoke "rem_s" (i64.const 7) (i64.const -3)) (i64.const 1)) -(assert_return (invoke "rem_s" (i64.const -7) (i64.const -3)) (i64.const -1)) -(assert_return (invoke "rem_s" (i64.const 11) (i64.const 5)) (i64.const 1)) -(assert_return (invoke "rem_s" (i64.const 17) (i64.const 7)) (i64.const 3)) - -(assert_trap (invoke "rem_u" (i64.const 1) (i64.const 0)) "integer divide by zero") -(assert_trap (invoke "rem_u" (i64.const 0) (i64.const 0)) "integer divide by zero") -(assert_return (invoke "rem_u" (i64.const 1) (i64.const 1)) (i64.const 0)) -(assert_return (invoke "rem_u" (i64.const 0) (i64.const 1)) (i64.const 0)) -(assert_return (invoke "rem_u" (i64.const -1) (i64.const -1)) (i64.const 0)) -(assert_return (invoke "rem_u" (i64.const 0x8000000000000000) (i64.const -1)) (i64.const 0x8000000000000000)) -(assert_return (invoke "rem_u" (i64.const 0x8000000000000000) (i64.const 2)) (i64.const 0)) -(assert_return (invoke "rem_u" (i64.const 0x8ff00ff00ff00ff0) (i64.const 0x100000001)) (i64.const 0x80000001)) -(assert_return (invoke "rem_u" (i64.const 0x8000000000000001) (i64.const 1000)) (i64.const 809)) -(assert_return (invoke "rem_u" (i64.const 5) (i64.const 2)) (i64.const 1)) -(assert_return (invoke "rem_u" (i64.const -5) (i64.const 2)) (i64.const 1)) -(assert_return (invoke "rem_u" (i64.const 5) (i64.const -2)) (i64.const 5)) -(assert_return (invoke "rem_u" (i64.const -5) (i64.const -2)) (i64.const -5)) -(assert_return (invoke "rem_u" (i64.const 7) (i64.const 3)) (i64.const 1)) -(assert_return (invoke "rem_u" (i64.const 11) (i64.const 5)) (i64.const 1)) -(assert_return (invoke "rem_u" (i64.const 17) (i64.const 7)) (i64.const 3)) - -(assert_return (invoke "and" (i64.const 1) (i64.const 0)) (i64.const 0)) -(assert_return (invoke "and" (i64.const 0) (i64.const 1)) (i64.const 0)) -(assert_return (invoke "and" (i64.const 1) (i64.const 1)) (i64.const 1)) -(assert_return (invoke "and" (i64.const 0) (i64.const 0)) (i64.const 0)) -(assert_return (invoke "and" (i64.const 0x7fffffffffffffff) (i64.const 0x8000000000000000)) (i64.const 0)) -(assert_return (invoke "and" (i64.const 0x7fffffffffffffff) (i64.const -1)) (i64.const 0x7fffffffffffffff)) -(assert_return (invoke "and" (i64.const 0xf0f0ffff) (i64.const 0xfffff0f0)) (i64.const 0xf0f0f0f0)) -(assert_return (invoke "and" (i64.const 0xffffffffffffffff) (i64.const 0xffffffffffffffff)) (i64.const 0xffffffffffffffff)) - -(assert_return (invoke "or" (i64.const 1) (i64.const 0)) (i64.const 1)) -(assert_return (invoke "or" (i64.const 0) (i64.const 1)) (i64.const 1)) -(assert_return (invoke "or" (i64.const 1) (i64.const 1)) (i64.const 1)) -(assert_return (invoke "or" (i64.const 0) (i64.const 0)) (i64.const 0)) -(assert_return (invoke "or" (i64.const 0x7fffffffffffffff) (i64.const 0x8000000000000000)) (i64.const -1)) -(assert_return (invoke "or" (i64.const 0x8000000000000000) (i64.const 0)) (i64.const 0x8000000000000000)) -(assert_return (invoke "or" (i64.const 0xf0f0ffff) (i64.const 0xfffff0f0)) (i64.const 0xffffffff)) -(assert_return (invoke "or" (i64.const 0xffffffffffffffff) (i64.const 0xffffffffffffffff)) (i64.const 0xffffffffffffffff)) - -(assert_return (invoke "xor" (i64.const 1) (i64.const 0)) (i64.const 1)) -(assert_return (invoke "xor" (i64.const 0) (i64.const 1)) (i64.const 1)) -(assert_return (invoke "xor" (i64.const 1) (i64.const 1)) (i64.const 0)) -(assert_return (invoke "xor" (i64.const 0) (i64.const 0)) (i64.const 0)) -(assert_return (invoke "xor" (i64.const 0x7fffffffffffffff) (i64.const 0x8000000000000000)) (i64.const -1)) -(assert_return (invoke "xor" (i64.const 0x8000000000000000) (i64.const 0)) (i64.const 0x8000000000000000)) -(assert_return (invoke "xor" (i64.const -1) (i64.const 0x8000000000000000)) (i64.const 0x7fffffffffffffff)) -(assert_return (invoke "xor" (i64.const -1) (i64.const 0x7fffffffffffffff)) (i64.const 0x8000000000000000)) -(assert_return (invoke "xor" (i64.const 0xf0f0ffff) (i64.const 0xfffff0f0)) (i64.const 0x0f0f0f0f)) -(assert_return (invoke "xor" (i64.const 0xffffffffffffffff) (i64.const 0xffffffffffffffff)) (i64.const 0)) - -(assert_return (invoke "shl" (i64.const 1) (i64.const 1)) (i64.const 2)) -(assert_return (invoke "shl" (i64.const 1) (i64.const 0)) (i64.const 1)) -(assert_return (invoke "shl" (i64.const 0x7fffffffffffffff) (i64.const 1)) (i64.const 0xfffffffffffffffe)) -(assert_return (invoke "shl" (i64.const 0xffffffffffffffff) (i64.const 1)) (i64.const 0xfffffffffffffffe)) -(assert_return (invoke "shl" (i64.const 0x8000000000000000) (i64.const 1)) (i64.const 0)) -(assert_return (invoke "shl" (i64.const 0x4000000000000000) (i64.const 1)) (i64.const 0x8000000000000000)) -(assert_return (invoke "shl" (i64.const 1) (i64.const 63)) (i64.const 0x8000000000000000)) -(assert_return (invoke "shl" (i64.const 1) (i64.const 64)) (i64.const 1)) -(assert_return (invoke "shl" (i64.const 1) (i64.const 65)) (i64.const 2)) -(assert_return (invoke "shl" (i64.const 1) (i64.const -1)) (i64.const 0x8000000000000000)) -(assert_return (invoke "shl" (i64.const 1) (i64.const 0x7fffffffffffffff)) (i64.const 0x8000000000000000)) - -(assert_return (invoke "shr_s" (i64.const 1) (i64.const 1)) (i64.const 0)) -(assert_return (invoke "shr_s" (i64.const 1) (i64.const 0)) (i64.const 1)) -(assert_return (invoke "shr_s" (i64.const -1) (i64.const 1)) (i64.const -1)) -(assert_return (invoke "shr_s" (i64.const 0x7fffffffffffffff) (i64.const 1)) (i64.const 0x3fffffffffffffff)) -(assert_return (invoke "shr_s" (i64.const 0x8000000000000000) (i64.const 1)) (i64.const 0xc000000000000000)) -(assert_return (invoke "shr_s" (i64.const 0x4000000000000000) (i64.const 1)) (i64.const 0x2000000000000000)) -(assert_return (invoke "shr_s" (i64.const 1) (i64.const 64)) (i64.const 1)) -(assert_return (invoke "shr_s" (i64.const 1) (i64.const 65)) (i64.const 0)) -(assert_return (invoke "shr_s" (i64.const 1) (i64.const -1)) (i64.const 0)) -(assert_return (invoke "shr_s" (i64.const 1) (i64.const 0x7fffffffffffffff)) (i64.const 0)) -(assert_return (invoke "shr_s" (i64.const 1) (i64.const 0x8000000000000000)) (i64.const 1)) -(assert_return (invoke "shr_s" (i64.const 0x8000000000000000) (i64.const 63)) (i64.const -1)) -(assert_return (invoke "shr_s" (i64.const -1) (i64.const 64)) (i64.const -1)) -(assert_return (invoke "shr_s" (i64.const -1) (i64.const 65)) (i64.const -1)) -(assert_return (invoke "shr_s" (i64.const -1) (i64.const -1)) (i64.const -1)) -(assert_return (invoke "shr_s" (i64.const -1) (i64.const 0x7fffffffffffffff)) (i64.const -1)) -(assert_return (invoke "shr_s" (i64.const -1) (i64.const 0x8000000000000000)) (i64.const -1)) - -(assert_return (invoke "shr_u" (i64.const 1) (i64.const 1)) (i64.const 0)) -(assert_return (invoke "shr_u" (i64.const 1) (i64.const 0)) (i64.const 1)) -(assert_return (invoke "shr_u" (i64.const -1) (i64.const 1)) (i64.const 0x7fffffffffffffff)) -(assert_return (invoke "shr_u" (i64.const 0x7fffffffffffffff) (i64.const 1)) (i64.const 0x3fffffffffffffff)) -(assert_return (invoke "shr_u" (i64.const 0x8000000000000000) (i64.const 1)) (i64.const 0x4000000000000000)) -(assert_return (invoke "shr_u" (i64.const 0x4000000000000000) (i64.const 1)) (i64.const 0x2000000000000000)) -(assert_return (invoke "shr_u" (i64.const 1) (i64.const 64)) (i64.const 1)) -(assert_return (invoke "shr_u" (i64.const 1) (i64.const 65)) (i64.const 0)) -(assert_return (invoke "shr_u" (i64.const 1) (i64.const -1)) (i64.const 0)) -(assert_return (invoke "shr_u" (i64.const 1) (i64.const 0x7fffffffffffffff)) (i64.const 0)) -(assert_return (invoke "shr_u" (i64.const 1) (i64.const 0x8000000000000000)) (i64.const 1)) -(assert_return (invoke "shr_u" (i64.const 0x8000000000000000) (i64.const 63)) (i64.const 1)) -(assert_return (invoke "shr_u" (i64.const -1) (i64.const 64)) (i64.const -1)) -(assert_return (invoke "shr_u" (i64.const -1) (i64.const 65)) (i64.const 0x7fffffffffffffff)) -(assert_return (invoke "shr_u" (i64.const -1) (i64.const -1)) (i64.const 1)) -(assert_return (invoke "shr_u" (i64.const -1) (i64.const 0x7fffffffffffffff)) (i64.const 1)) -(assert_return (invoke "shr_u" (i64.const -1) (i64.const 0x8000000000000000)) (i64.const -1)) - -(assert_return (invoke "rotl" (i64.const 1) (i64.const 1)) (i64.const 2)) -(assert_return (invoke "rotl" (i64.const 1) (i64.const 0)) (i64.const 1)) -(assert_return (invoke "rotl" (i64.const -1) (i64.const 1)) (i64.const -1)) -(assert_return (invoke "rotl" (i64.const 1) (i64.const 64)) (i64.const 1)) -(assert_return (invoke "rotl" (i64.const 0xabcd987602468ace) (i64.const 1)) (i64.const 0x579b30ec048d159d)) -(assert_return (invoke "rotl" (i64.const 0xfe000000dc000000) (i64.const 4)) (i64.const 0xe000000dc000000f)) -(assert_return (invoke "rotl" (i64.const 0xabcd1234ef567809) (i64.const 53)) (i64.const 0x013579a2469deacf)) -(assert_return (invoke "rotl" (i64.const 0xabd1234ef567809c) (i64.const 63)) (i64.const 0x55e891a77ab3c04e)) -(assert_return (invoke "rotl" (i64.const 0xabcd1234ef567809) (i64.const 0xf5)) (i64.const 0x013579a2469deacf)) -(assert_return (invoke "rotl" (i64.const 0xabcd7294ef567809) (i64.const 0xffffffffffffffed)) (i64.const 0xcf013579ae529dea)) -(assert_return (invoke "rotl" (i64.const 0xabd1234ef567809c) (i64.const 0x800000000000003f)) (i64.const 0x55e891a77ab3c04e)) -(assert_return (invoke "rotl" (i64.const 1) (i64.const 63)) (i64.const 0x8000000000000000)) -(assert_return (invoke "rotl" (i64.const 0x8000000000000000) (i64.const 1)) (i64.const 1)) - -(assert_return (invoke "rotr" (i64.const 1) (i64.const 1)) (i64.const 0x8000000000000000)) -(assert_return (invoke "rotr" (i64.const 1) (i64.const 0)) (i64.const 1)) -(assert_return (invoke "rotr" (i64.const -1) (i64.const 1)) (i64.const -1)) -(assert_return (invoke "rotr" (i64.const 1) (i64.const 64)) (i64.const 1)) -(assert_return (invoke "rotr" (i64.const 0xabcd987602468ace) (i64.const 1)) (i64.const 0x55e6cc3b01234567)) -(assert_return (invoke "rotr" (i64.const 0xfe000000dc000000) (i64.const 4)) (i64.const 0x0fe000000dc00000)) -(assert_return (invoke "rotr" (i64.const 0xabcd1234ef567809) (i64.const 53)) (i64.const 0x6891a77ab3c04d5e)) -(assert_return (invoke "rotr" (i64.const 0xabd1234ef567809c) (i64.const 63)) (i64.const 0x57a2469deacf0139)) -(assert_return (invoke "rotr" (i64.const 0xabcd1234ef567809) (i64.const 0xf5)) (i64.const 0x6891a77ab3c04d5e)) -(assert_return (invoke "rotr" (i64.const 0xabcd7294ef567809) (i64.const 0xffffffffffffffed)) (i64.const 0x94a77ab3c04d5e6b)) -(assert_return (invoke "rotr" (i64.const 0xabd1234ef567809c) (i64.const 0x800000000000003f)) (i64.const 0x57a2469deacf0139)) -(assert_return (invoke "rotr" (i64.const 1) (i64.const 63)) (i64.const 2)) -(assert_return (invoke "rotr" (i64.const 0x8000000000000000) (i64.const 63)) (i64.const 1)) - -(assert_return (invoke "clz" (i64.const 0xffffffffffffffff)) (i64.const 0)) -(assert_return (invoke "clz" (i64.const 0)) (i64.const 64)) -(assert_return (invoke "clz" (i64.const 0x00008000)) (i64.const 48)) -(assert_return (invoke "clz" (i64.const 0xff)) (i64.const 56)) -(assert_return (invoke "clz" (i64.const 0x8000000000000000)) (i64.const 0)) -(assert_return (invoke "clz" (i64.const 1)) (i64.const 63)) -(assert_return (invoke "clz" (i64.const 2)) (i64.const 62)) -(assert_return (invoke "clz" (i64.const 0x7fffffffffffffff)) (i64.const 1)) - -(assert_return (invoke "ctz" (i64.const -1)) (i64.const 0)) -(assert_return (invoke "ctz" (i64.const 0)) (i64.const 64)) -(assert_return (invoke "ctz" (i64.const 0x00008000)) (i64.const 15)) -(assert_return (invoke "ctz" (i64.const 0x00010000)) (i64.const 16)) -(assert_return (invoke "ctz" (i64.const 0x8000000000000000)) (i64.const 63)) -(assert_return (invoke "ctz" (i64.const 0x7fffffffffffffff)) (i64.const 0)) - -(assert_return (invoke "popcnt" (i64.const -1)) (i64.const 64)) -(assert_return (invoke "popcnt" (i64.const 0)) (i64.const 0)) -(assert_return (invoke "popcnt" (i64.const 0x00008000)) (i64.const 1)) -(assert_return (invoke "popcnt" (i64.const 0x8000800080008000)) (i64.const 4)) -(assert_return (invoke "popcnt" (i64.const 0x7fffffffffffffff)) (i64.const 63)) -(assert_return (invoke "popcnt" (i64.const 0xAAAAAAAA55555555)) (i64.const 32)) -(assert_return (invoke "popcnt" (i64.const 0x99999999AAAAAAAA)) (i64.const 32)) -(assert_return (invoke "popcnt" (i64.const 0xDEADBEEFDEADBEEF)) (i64.const 48)) - -(assert_return (invoke "eqz" (i64.const 0)) (i32.const 1)) -(assert_return (invoke "eqz" (i64.const 1)) (i32.const 0)) -(assert_return (invoke "eqz" (i64.const 0x8000000000000000)) (i32.const 0)) -(assert_return (invoke "eqz" (i64.const 0x7fffffffffffffff)) (i32.const 0)) -(assert_return (invoke "eqz" (i64.const 0xffffffffffffffff)) (i32.const 0)) - -(assert_return (invoke "eq" (i64.const 0) (i64.const 0)) (i32.const 1)) -(assert_return (invoke "eq" (i64.const 1) (i64.const 1)) (i32.const 1)) -(assert_return (invoke "eq" (i64.const -1) (i64.const 1)) (i32.const 0)) -(assert_return (invoke "eq" (i64.const 0x8000000000000000) (i64.const 0x8000000000000000)) (i32.const 1)) -(assert_return (invoke "eq" (i64.const 0x7fffffffffffffff) (i64.const 0x7fffffffffffffff)) (i32.const 1)) -(assert_return (invoke "eq" (i64.const -1) (i64.const -1)) (i32.const 1)) -(assert_return (invoke "eq" (i64.const 1) (i64.const 0)) (i32.const 0)) -(assert_return (invoke "eq" (i64.const 0) (i64.const 1)) (i32.const 0)) -(assert_return (invoke "eq" (i64.const 0x8000000000000000) (i64.const 0)) (i32.const 0)) -(assert_return (invoke "eq" (i64.const 0) (i64.const 0x8000000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (i64.const 0x8000000000000000) (i64.const -1)) (i32.const 0)) -(assert_return (invoke "eq" (i64.const -1) (i64.const 0x8000000000000000)) (i32.const 0)) -(assert_return (invoke "eq" (i64.const 0x8000000000000000) (i64.const 0x7fffffffffffffff)) (i32.const 0)) -(assert_return (invoke "eq" (i64.const 0x7fffffffffffffff) (i64.const 0x8000000000000000)) (i32.const 0)) - -(assert_return (invoke "ne" (i64.const 0) (i64.const 0)) (i32.const 0)) -(assert_return (invoke "ne" (i64.const 1) (i64.const 1)) (i32.const 0)) -(assert_return (invoke "ne" (i64.const -1) (i64.const 1)) (i32.const 1)) -(assert_return (invoke "ne" (i64.const 0x8000000000000000) (i64.const 0x8000000000000000)) (i32.const 0)) -(assert_return (invoke "ne" (i64.const 0x7fffffffffffffff) (i64.const 0x7fffffffffffffff)) (i32.const 0)) -(assert_return (invoke "ne" (i64.const -1) (i64.const -1)) (i32.const 0)) -(assert_return (invoke "ne" (i64.const 1) (i64.const 0)) (i32.const 1)) -(assert_return (invoke "ne" (i64.const 0) (i64.const 1)) (i32.const 1)) -(assert_return (invoke "ne" (i64.const 0x8000000000000000) (i64.const 0)) (i32.const 1)) -(assert_return (invoke "ne" (i64.const 0) (i64.const 0x8000000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (i64.const 0x8000000000000000) (i64.const -1)) (i32.const 1)) -(assert_return (invoke "ne" (i64.const -1) (i64.const 0x8000000000000000)) (i32.const 1)) -(assert_return (invoke "ne" (i64.const 0x8000000000000000) (i64.const 0x7fffffffffffffff)) (i32.const 1)) -(assert_return (invoke "ne" (i64.const 0x7fffffffffffffff) (i64.const 0x8000000000000000)) (i32.const 1)) - -(assert_return (invoke "lt_s" (i64.const 0) (i64.const 0)) (i32.const 0)) -(assert_return (invoke "lt_s" (i64.const 1) (i64.const 1)) (i32.const 0)) -(assert_return (invoke "lt_s" (i64.const -1) (i64.const 1)) (i32.const 1)) -(assert_return (invoke "lt_s" (i64.const 0x8000000000000000) (i64.const 0x8000000000000000)) (i32.const 0)) -(assert_return (invoke "lt_s" (i64.const 0x7fffffffffffffff) (i64.const 0x7fffffffffffffff)) (i32.const 0)) -(assert_return (invoke "lt_s" (i64.const -1) (i64.const -1)) (i32.const 0)) -(assert_return (invoke "lt_s" (i64.const 1) (i64.const 0)) (i32.const 0)) -(assert_return (invoke "lt_s" (i64.const 0) (i64.const 1)) (i32.const 1)) -(assert_return (invoke "lt_s" (i64.const 0x8000000000000000) (i64.const 0)) (i32.const 1)) -(assert_return (invoke "lt_s" (i64.const 0) (i64.const 0x8000000000000000)) (i32.const 0)) -(assert_return (invoke "lt_s" (i64.const 0x8000000000000000) (i64.const -1)) (i32.const 1)) -(assert_return (invoke "lt_s" (i64.const -1) (i64.const 0x8000000000000000)) (i32.const 0)) -(assert_return (invoke "lt_s" (i64.const 0x8000000000000000) (i64.const 0x7fffffffffffffff)) (i32.const 1)) -(assert_return (invoke "lt_s" (i64.const 0x7fffffffffffffff) (i64.const 0x8000000000000000)) (i32.const 0)) - -(assert_return (invoke "lt_u" (i64.const 0) (i64.const 0)) (i32.const 0)) -(assert_return (invoke "lt_u" (i64.const 1) (i64.const 1)) (i32.const 0)) -(assert_return (invoke "lt_u" (i64.const -1) (i64.const 1)) (i32.const 0)) -(assert_return (invoke "lt_u" (i64.const 0x8000000000000000) (i64.const 0x8000000000000000)) (i32.const 0)) -(assert_return (invoke "lt_u" (i64.const 0x7fffffffffffffff) (i64.const 0x7fffffffffffffff)) (i32.const 0)) -(assert_return (invoke "lt_u" (i64.const -1) (i64.const -1)) (i32.const 0)) -(assert_return (invoke "lt_u" (i64.const 1) (i64.const 0)) (i32.const 0)) -(assert_return (invoke "lt_u" (i64.const 0) (i64.const 1)) (i32.const 1)) -(assert_return (invoke "lt_u" (i64.const 0x8000000000000000) (i64.const 0)) (i32.const 0)) -(assert_return (invoke "lt_u" (i64.const 0) (i64.const 0x8000000000000000)) (i32.const 1)) -(assert_return (invoke "lt_u" (i64.const 0x8000000000000000) (i64.const -1)) (i32.const 1)) -(assert_return (invoke "lt_u" (i64.const -1) (i64.const 0x8000000000000000)) (i32.const 0)) -(assert_return (invoke "lt_u" (i64.const 0x8000000000000000) (i64.const 0x7fffffffffffffff)) (i32.const 0)) -(assert_return (invoke "lt_u" (i64.const 0x7fffffffffffffff) (i64.const 0x8000000000000000)) (i32.const 1)) - -(assert_return (invoke "le_s" (i64.const 0) (i64.const 0)) (i32.const 1)) -(assert_return (invoke "le_s" (i64.const 1) (i64.const 1)) (i32.const 1)) -(assert_return (invoke "le_s" (i64.const -1) (i64.const 1)) (i32.const 1)) -(assert_return (invoke "le_s" (i64.const 0x8000000000000000) (i64.const 0x8000000000000000)) (i32.const 1)) -(assert_return (invoke "le_s" (i64.const 0x7fffffffffffffff) (i64.const 0x7fffffffffffffff)) (i32.const 1)) -(assert_return (invoke "le_s" (i64.const -1) (i64.const -1)) (i32.const 1)) -(assert_return (invoke "le_s" (i64.const 1) (i64.const 0)) (i32.const 0)) -(assert_return (invoke "le_s" (i64.const 0) (i64.const 1)) (i32.const 1)) -(assert_return (invoke "le_s" (i64.const 0x8000000000000000) (i64.const 0)) (i32.const 1)) -(assert_return (invoke "le_s" (i64.const 0) (i64.const 0x8000000000000000)) (i32.const 0)) -(assert_return (invoke "le_s" (i64.const 0x8000000000000000) (i64.const -1)) (i32.const 1)) -(assert_return (invoke "le_s" (i64.const -1) (i64.const 0x8000000000000000)) (i32.const 0)) -(assert_return (invoke "le_s" (i64.const 0x8000000000000000) (i64.const 0x7fffffffffffffff)) (i32.const 1)) -(assert_return (invoke "le_s" (i64.const 0x7fffffffffffffff) (i64.const 0x8000000000000000)) (i32.const 0)) - -(assert_return (invoke "le_u" (i64.const 0) (i64.const 0)) (i32.const 1)) -(assert_return (invoke "le_u" (i64.const 1) (i64.const 1)) (i32.const 1)) -(assert_return (invoke "le_u" (i64.const -1) (i64.const 1)) (i32.const 0)) -(assert_return (invoke "le_u" (i64.const 0x8000000000000000) (i64.const 0x8000000000000000)) (i32.const 1)) -(assert_return (invoke "le_u" (i64.const 0x7fffffffffffffff) (i64.const 0x7fffffffffffffff)) (i32.const 1)) -(assert_return (invoke "le_u" (i64.const -1) (i64.const -1)) (i32.const 1)) -(assert_return (invoke "le_u" (i64.const 1) (i64.const 0)) (i32.const 0)) -(assert_return (invoke "le_u" (i64.const 0) (i64.const 1)) (i32.const 1)) -(assert_return (invoke "le_u" (i64.const 0x8000000000000000) (i64.const 0)) (i32.const 0)) -(assert_return (invoke "le_u" (i64.const 0) (i64.const 0x8000000000000000)) (i32.const 1)) -(assert_return (invoke "le_u" (i64.const 0x8000000000000000) (i64.const -1)) (i32.const 1)) -(assert_return (invoke "le_u" (i64.const -1) (i64.const 0x8000000000000000)) (i32.const 0)) -(assert_return (invoke "le_u" (i64.const 0x8000000000000000) (i64.const 0x7fffffffffffffff)) (i32.const 0)) -(assert_return (invoke "le_u" (i64.const 0x7fffffffffffffff) (i64.const 0x8000000000000000)) (i32.const 1)) - -(assert_return (invoke "gt_s" (i64.const 0) (i64.const 0)) (i32.const 0)) -(assert_return (invoke "gt_s" (i64.const 1) (i64.const 1)) (i32.const 0)) -(assert_return (invoke "gt_s" (i64.const -1) (i64.const 1)) (i32.const 0)) -(assert_return (invoke "gt_s" (i64.const 0x8000000000000000) (i64.const 0x8000000000000000)) (i32.const 0)) -(assert_return (invoke "gt_s" (i64.const 0x7fffffffffffffff) (i64.const 0x7fffffffffffffff)) (i32.const 0)) -(assert_return (invoke "gt_s" (i64.const -1) (i64.const -1)) (i32.const 0)) -(assert_return (invoke "gt_s" (i64.const 1) (i64.const 0)) (i32.const 1)) -(assert_return (invoke "gt_s" (i64.const 0) (i64.const 1)) (i32.const 0)) -(assert_return (invoke "gt_s" (i64.const 0x8000000000000000) (i64.const 0)) (i32.const 0)) -(assert_return (invoke "gt_s" (i64.const 0) (i64.const 0x8000000000000000)) (i32.const 1)) -(assert_return (invoke "gt_s" (i64.const 0x8000000000000000) (i64.const -1)) (i32.const 0)) -(assert_return (invoke "gt_s" (i64.const -1) (i64.const 0x8000000000000000)) (i32.const 1)) -(assert_return (invoke "gt_s" (i64.const 0x8000000000000000) (i64.const 0x7fffffffffffffff)) (i32.const 0)) -(assert_return (invoke "gt_s" (i64.const 0x7fffffffffffffff) (i64.const 0x8000000000000000)) (i32.const 1)) - -(assert_return (invoke "gt_u" (i64.const 0) (i64.const 0)) (i32.const 0)) -(assert_return (invoke "gt_u" (i64.const 1) (i64.const 1)) (i32.const 0)) -(assert_return (invoke "gt_u" (i64.const -1) (i64.const 1)) (i32.const 1)) -(assert_return (invoke "gt_u" (i64.const 0x8000000000000000) (i64.const 0x8000000000000000)) (i32.const 0)) -(assert_return (invoke "gt_u" (i64.const 0x7fffffffffffffff) (i64.const 0x7fffffffffffffff)) (i32.const 0)) -(assert_return (invoke "gt_u" (i64.const -1) (i64.const -1)) (i32.const 0)) -(assert_return (invoke "gt_u" (i64.const 1) (i64.const 0)) (i32.const 1)) -(assert_return (invoke "gt_u" (i64.const 0) (i64.const 1)) (i32.const 0)) -(assert_return (invoke "gt_u" (i64.const 0x8000000000000000) (i64.const 0)) (i32.const 1)) -(assert_return (invoke "gt_u" (i64.const 0) (i64.const 0x8000000000000000)) (i32.const 0)) -(assert_return (invoke "gt_u" (i64.const 0x8000000000000000) (i64.const -1)) (i32.const 0)) -(assert_return (invoke "gt_u" (i64.const -1) (i64.const 0x8000000000000000)) (i32.const 1)) -(assert_return (invoke "gt_u" (i64.const 0x8000000000000000) (i64.const 0x7fffffffffffffff)) (i32.const 1)) -(assert_return (invoke "gt_u" (i64.const 0x7fffffffffffffff) (i64.const 0x8000000000000000)) (i32.const 0)) - -(assert_return (invoke "ge_s" (i64.const 0) (i64.const 0)) (i32.const 1)) -(assert_return (invoke "ge_s" (i64.const 1) (i64.const 1)) (i32.const 1)) -(assert_return (invoke "ge_s" (i64.const -1) (i64.const 1)) (i32.const 0)) -(assert_return (invoke "ge_s" (i64.const 0x8000000000000000) (i64.const 0x8000000000000000)) (i32.const 1)) -(assert_return (invoke "ge_s" (i64.const 0x7fffffffffffffff) (i64.const 0x7fffffffffffffff)) (i32.const 1)) -(assert_return (invoke "ge_s" (i64.const -1) (i64.const -1)) (i32.const 1)) -(assert_return (invoke "ge_s" (i64.const 1) (i64.const 0)) (i32.const 1)) -(assert_return (invoke "ge_s" (i64.const 0) (i64.const 1)) (i32.const 0)) -(assert_return (invoke "ge_s" (i64.const 0x8000000000000000) (i64.const 0)) (i32.const 0)) -(assert_return (invoke "ge_s" (i64.const 0) (i64.const 0x8000000000000000)) (i32.const 1)) -(assert_return (invoke "ge_s" (i64.const 0x8000000000000000) (i64.const -1)) (i32.const 0)) -(assert_return (invoke "ge_s" (i64.const -1) (i64.const 0x8000000000000000)) (i32.const 1)) -(assert_return (invoke "ge_s" (i64.const 0x8000000000000000) (i64.const 0x7fffffffffffffff)) (i32.const 0)) -(assert_return (invoke "ge_s" (i64.const 0x7fffffffffffffff) (i64.const 0x8000000000000000)) (i32.const 1)) - -(assert_return (invoke "ge_u" (i64.const 0) (i64.const 0)) (i32.const 1)) -(assert_return (invoke "ge_u" (i64.const 1) (i64.const 1)) (i32.const 1)) -(assert_return (invoke "ge_u" (i64.const -1) (i64.const 1)) (i32.const 1)) -(assert_return (invoke "ge_u" (i64.const 0x8000000000000000) (i64.const 0x8000000000000000)) (i32.const 1)) -(assert_return (invoke "ge_u" (i64.const 0x7fffffffffffffff) (i64.const 0x7fffffffffffffff)) (i32.const 1)) -(assert_return (invoke "ge_u" (i64.const -1) (i64.const -1)) (i32.const 1)) -(assert_return (invoke "ge_u" (i64.const 1) (i64.const 0)) (i32.const 1)) -(assert_return (invoke "ge_u" (i64.const 0) (i64.const 1)) (i32.const 0)) -(assert_return (invoke "ge_u" (i64.const 0x8000000000000000) (i64.const 0)) (i32.const 1)) -(assert_return (invoke "ge_u" (i64.const 0) (i64.const 0x8000000000000000)) (i32.const 0)) -(assert_return (invoke "ge_u" (i64.const 0x8000000000000000) (i64.const -1)) (i32.const 0)) -(assert_return (invoke "ge_u" (i64.const -1) (i64.const 0x8000000000000000)) (i32.const 1)) -(assert_return (invoke "ge_u" (i64.const 0x8000000000000000) (i64.const 0x7fffffffffffffff)) (i32.const 1)) -(assert_return (invoke "ge_u" (i64.const 0x7fffffffffffffff) (i64.const 0x8000000000000000)) (i32.const 0)) diff --git a/tests/misc_testsuite/winch/if.wast b/tests/misc_testsuite/winch/if.wast deleted file mode 100644 index 8f67dd9b673e..000000000000 --- a/tests/misc_testsuite/winch/if.wast +++ /dev/null @@ -1,316 +0,0 @@ -;; Test `if` operator - -(module - ;; Auxiliary definition - (memory 1) - - (func $dummy) - - (func (export "empty") (param i32) - (if (local.get 0) (then)) - (if (local.get 0) (then) (else)) - (if $l (local.get 0) (then)) - (if $l (local.get 0) (then) (else)) - ) - - (func (export "singular") (param i32) (result i32) - (if (local.get 0) (then (nop))) - (if (local.get 0) (then (nop)) (else (nop))) - (if (result i32) (local.get 0) (then (i32.const 7)) (else (i32.const 8))) - ) - - (func (export "nested") (param i32 i32) (result i32) - (if (result i32) (local.get 0) - (then - (if (local.get 1) (then (call $dummy) (block) (nop))) - (if (local.get 1) (then) (else (call $dummy) (block) (nop))) - (if (result i32) (local.get 1) - (then (call $dummy) (i32.const 9)) - (else (call $dummy) (i32.const 10)) - ) - ) - (else - (if (local.get 1) (then (call $dummy) (block) (nop))) - (if (local.get 1) (then) (else (call $dummy) (block) (nop))) - (if (result i32) (local.get 1) - (then (call $dummy) (i32.const 10)) - (else (call $dummy) (i32.const 11)) - ) - ) - ) - ) - - (func (export "as-loop-first") (param i32) (result i32) - (loop (result i32) - (if (result i32) (local.get 0) - (then (call $dummy) (i32.const 1)) - (else (call $dummy) (i32.const 0)) - ) - (call $dummy) (call $dummy) - ) - ) - (func (export "as-loop-mid") (param i32) (result i32) - (loop (result i32) - (call $dummy) - (if (result i32) (local.get 0) - (then (call $dummy) (i32.const 1)) - (else (call $dummy) (i32.const 0)) - ) - (call $dummy) - ) - ) - (func (export "as-loop-last") (param i32) (result i32) - (loop (result i32) - (call $dummy) (call $dummy) - (if (result i32) (local.get 0) - (then (call $dummy) (i32.const 1)) - (else (call $dummy) (i32.const 0)) - ) - ) - ) - - (func (export "as-if-condition") (param i32) (result i32) - (if (result i32) - (if (result i32) (local.get 0) - (then (i32.const 1)) (else (i32.const 0)) - ) - (then (call $dummy) (i32.const 2)) - (else (call $dummy) (i32.const 3)) - ) - ) - - (func (export "as-br_if-first") (param i32) (result i32) - (block (result i32) - (br_if 0 - (if (result i32) (local.get 0) - (then (call $dummy) (i32.const 1)) - (else (call $dummy) (i32.const 0)) - ) - (i32.const 2) - ) - (return (i32.const 3)) - ) - ) - (func (export "as-br_if-last") (param i32) (result i32) - (block (result i32) - (br_if 0 - (i32.const 2) - (if (result i32) (local.get 0) - (then (call $dummy) (i32.const 1)) - (else (call $dummy) (i32.const 0)) - ) - ) - (return (i32.const 3)) - ) - ) - - (func $f (param i32) (result i32) (local.get 0)) - - (func (export "as-call-value") (param i32) (result i32) - (call $f - (if (result i32) (local.get 0) - (then (i32.const 1)) - (else (i32.const 0)) - ) - ) - ) - (func (export "as-return-value") (param i32) (result i32) - (if (result i32) (local.get 0) - (then (i32.const 1)) - (else (i32.const 0))) - (return) - ) - (func (export "as-drop-operand") (param i32) - (drop - (if (result i32) (local.get 0) - (then (i32.const 1)) - (else (i32.const 0)) - ) - ) - ) - (func (export "as-br-value") (param i32) (result i32) - (block (result i32) - (br 0 - (if (result i32) (local.get 0) - (then (i32.const 1)) - (else (i32.const 0)) - ) - ) - ) - ) - (func (export "as-local.set-value") (param i32) (result i32) - (local i32) - (local.set 0 - (if (result i32) (local.get 0) - (then (i32.const 1)) - (else (i32.const 0)) - ) - ) - (local.get 0) - ) - (func (export "as-unary-operand") (param i32) (result i32) - (i32.ctz - (if (result i32) (local.get 0) - (then (call $dummy) (i32.const 13)) - (else (call $dummy) (i32.const -13)) - ) - ) - ) - (func (export "as-binary-operand") (param i32 i32) (result i32) - (i32.mul - (if (result i32) (local.get 0) - (then (call $dummy) (i32.const 3)) - (else (call $dummy) (i32.const -3)) - ) - (if (result i32) (local.get 1) - (then (call $dummy) (i32.const 4)) - (else (call $dummy) (i32.const -5)) - ) - ) - ) - (func (export "as-test-operand") (param i32) (result i32) - (i32.eqz - (if (result i32) (local.get 0) - (then (call $dummy) (i32.const 13)) - (else (call $dummy) (i32.const 0)) - ) - ) - ) - - (func (export "break-value") (param i32) (result i32) - (if (result i32) (local.get 0) - (then (br 0 (i32.const 18)) (i32.const 19)) - (else (br 0 (i32.const 21)) (i32.const 20)) - ) - ) - - (func (export "effects") (param i32) (result i32) - (local i32) - (if - (block (result i32) (local.set 1 (i32.const 1)) (local.get 0)) - (then - (local.set 1 (i32.mul (local.get 1) (i32.const 3))) - (local.set 1 (i32.sub (local.get 1) (i32.const 5))) - (local.set 1 (i32.mul (local.get 1) (i32.const 7))) - (br 0) - (local.set 1 (i32.mul (local.get 1) (i32.const 100))) - ) - (else - (local.set 1 (i32.mul (local.get 1) (i32.const 5))) - (local.set 1 (i32.sub (local.get 1) (i32.const 7))) - (local.set 1 (i32.mul (local.get 1) (i32.const 3))) - (br 0) - (local.set 1 (i32.mul (local.get 1) (i32.const 1000))) - ) - ) - (local.get 1) - ) - - (func (export "as-br_table-first") (param i32) (result i32) - (block (result i32) - (if (result i32) (local.get 0) - (then (call $dummy) (i32.const 1)) - (else (call $dummy) (i32.const 0)) - ) - (i32.const 2) - (br_table 0 0) - ) - ) - (func (export "as-br_table-last") (param i32) (result i32) - (block (result i32) - (i32.const 2) - (if (result i32) (local.get 0) - (then (call $dummy) (i32.const 1)) - (else (call $dummy) (i32.const 0)) - ) - (br_table 0 0) - ) - ) - - (func (export "break-bare") (result i32) - (if (i32.const 1) (then (br 0) (unreachable))) - (if (i32.const 1) (then (br 0) (unreachable)) (else (unreachable))) - (if (i32.const 0) (then (unreachable)) (else (br 0) (unreachable))) - (if (i32.const 1) (then (br_if 0 (i32.const 1)) (unreachable))) - (if (i32.const 1) (then (br_if 0 (i32.const 1)) (unreachable)) (else (unreachable))) - (if (i32.const 0) (then (unreachable)) (else (br_if 0 (i32.const 1)) (unreachable))) - (if (i32.const 1) (then (br_table 0 (i32.const 0)) (unreachable))) - (if (i32.const 1) (then (br_table 0 (i32.const 0)) (unreachable)) (else (unreachable))) - (if (i32.const 0) (then (unreachable)) (else (br_table 0 (i32.const 0)) (unreachable))) - (i32.const 19) - ) -) - -(assert_return (invoke "empty" (i32.const 0))) -(assert_return (invoke "empty" (i32.const 1))) -(assert_return (invoke "empty" (i32.const 100))) -(assert_return (invoke "empty" (i32.const -2))) - -(assert_return (invoke "singular" (i32.const 0)) (i32.const 8)) -(assert_return (invoke "singular" (i32.const 1)) (i32.const 7)) -(assert_return (invoke "singular" (i32.const 10)) (i32.const 7)) -(assert_return (invoke "singular" (i32.const -10)) (i32.const 7)) - -(assert_return (invoke "nested" (i32.const 0) (i32.const 0)) (i32.const 11)) -(assert_return (invoke "nested" (i32.const 1) (i32.const 0)) (i32.const 10)) -(assert_return (invoke "nested" (i32.const 0) (i32.const 1)) (i32.const 10)) -(assert_return (invoke "nested" (i32.const 3) (i32.const 2)) (i32.const 9)) -(assert_return (invoke "nested" (i32.const 0) (i32.const -100)) (i32.const 10)) -(assert_return (invoke "nested" (i32.const 10) (i32.const 10)) (i32.const 9)) -(assert_return (invoke "nested" (i32.const 0) (i32.const -1)) (i32.const 10)) -(assert_return (invoke "nested" (i32.const -111) (i32.const -2)) (i32.const 9)) - -(assert_return (invoke "as-loop-first" (i32.const 0)) (i32.const 0)) -(assert_return (invoke "as-loop-first" (i32.const 1)) (i32.const 1)) -(assert_return (invoke "as-loop-mid" (i32.const 0)) (i32.const 0)) -(assert_return (invoke "as-loop-mid" (i32.const 1)) (i32.const 1)) -(assert_return (invoke "as-loop-last" (i32.const 0)) (i32.const 0)) -(assert_return (invoke "as-loop-last" (i32.const 1)) (i32.const 1)) - -(assert_return (invoke "as-if-condition" (i32.const 0)) (i32.const 3)) -(assert_return (invoke "as-if-condition" (i32.const 1)) (i32.const 2)) - -(assert_return (invoke "as-br_if-first" (i32.const 0)) (i32.const 0)) -(assert_return (invoke "as-br_if-first" (i32.const 1)) (i32.const 1)) -(assert_return (invoke "as-br_if-last" (i32.const 0)) (i32.const 3)) -(assert_return (invoke "as-br_if-last" (i32.const 1)) (i32.const 2)) - -(assert_return (invoke "as-call-value" (i32.const 0)) (i32.const 0)) -(assert_return (invoke "as-call-value" (i32.const 1)) (i32.const 1)) - -(assert_return (invoke "as-return-value" (i32.const 0)) (i32.const 0)) -(assert_return (invoke "as-return-value" (i32.const 1)) (i32.const 1)) - -(assert_return (invoke "as-br-value" (i32.const 0)) (i32.const 0)) -(assert_return (invoke "as-br-value" (i32.const 1)) (i32.const 1)) - -(assert_return (invoke "as-local.set-value" (i32.const 0)) (i32.const 0)) -(assert_return (invoke "as-local.set-value" (i32.const 1)) (i32.const 1)) - -(assert_return (invoke "as-unary-operand" (i32.const 0)) (i32.const 0)) -(assert_return (invoke "as-unary-operand" (i32.const 1)) (i32.const 0)) -(assert_return (invoke "as-unary-operand" (i32.const -1)) (i32.const 0)) - -(assert_return (invoke "as-binary-operand" (i32.const 0) (i32.const 0)) (i32.const 15)) -(assert_return (invoke "as-binary-operand" (i32.const 0) (i32.const 1)) (i32.const -12)) -(assert_return (invoke "as-binary-operand" (i32.const 1) (i32.const 0)) (i32.const -15)) -(assert_return (invoke "as-binary-operand" (i32.const 1) (i32.const 1)) (i32.const 12)) - -(assert_return (invoke "as-test-operand" (i32.const 0)) (i32.const 1)) -(assert_return (invoke "as-test-operand" (i32.const 1)) (i32.const 0)) - -(assert_return (invoke "break-value" (i32.const 1)) (i32.const 18)) -(assert_return (invoke "break-value" (i32.const 0)) (i32.const 21)) - -(assert_return (invoke "effects" (i32.const 1)) (i32.const -14)) -(assert_return (invoke "effects" (i32.const 0)) (i32.const -6)) - -(assert_return (invoke "as-drop-operand" (i32.const 0))) -(assert_return (invoke "as-drop-operand" (i32.const 1))) - -(assert_return (invoke "as-br_table-first" (i32.const 0)) (i32.const 0)) -(assert_return (invoke "as-br_table-first" (i32.const 1)) (i32.const 1)) -(assert_return (invoke "as-br_table-last" (i32.const 0)) (i32.const 2)) -(assert_return (invoke "as-br_table-last" (i32.const 1)) (i32.const 2)) - -(assert_return (invoke "break-bare") (i32.const 19)) diff --git a/tests/misc_testsuite/winch/local_get.wast b/tests/misc_testsuite/winch/local_get.wast deleted file mode 100644 index 16e06113def5..000000000000 --- a/tests/misc_testsuite/winch/local_get.wast +++ /dev/null @@ -1,103 +0,0 @@ -;; Test `local.get` operator - -(module - ;; Typing - - (func (export "type-local-i32") (result i32) (local i32) (local.get 0)) - (func (export "type-local-i64") (result i64) (local i64) (local.get 0)) - (func (export "type-local-f32") (result f32) (local f32) (local.get 0)) - (func (export "type-local-f64") (result f64) (local f64) (local.get 0)) - - (func (export "type-param-i32") (param i32) (result i32) (local.get 0)) - (func (export "type-param-i64") (param i64) (result i64) (local.get 0)) - (func (export "type-param-f32") (param f32) (result f32) (local.get 0)) - (func (export "type-param-f64") (param f64) (result f64) (local.get 0)) - - (func (export "type-mixed") (param i64 f32 f64 i32 i32) - (local f32 i64 i64 f64) - (drop (i64.eqz (local.get 0))) - (drop (f32.neg (local.get 1))) - (drop (f64.neg (local.get 2))) - (drop (i32.eqz (local.get 3))) - (drop (i32.eqz (local.get 4))) - (drop (f32.neg (local.get 5))) - (drop (i64.eqz (local.get 6))) - (drop (i64.eqz (local.get 7))) - (drop (f64.neg (local.get 8))) - ) - - - ;; As parameter of control constructs and instructions - - (func (export "as-block-value") (param i32) (result i32) - (block (result i32) (local.get 0)) - ) - (func (export "as-loop-value") (param i32) (result i32) - (loop (result i32) (local.get 0)) - ) - (func (export "as-br-value") (param i32) (result i32) - (block (result i32) (br 0 (local.get 0))) - ) - (func (export "as-br_if-value") (param i32) (result i32) - (block $l0 (result i32) (br_if $l0 (local.get 0) (i32.const 1))) - ) - - (func (export "as-br_if-value-cond") (param i32) (result i32) - (block (result i32) - (br_if 0 (local.get 0) (local.get 0)) - ) - ) - (func (export "as-br_table-value") (param i32) (result i32) - (block - (block - (block - (br_table 0 1 2 (local.get 0)) - (return (i32.const 0)) - ) - (return (i32.const 1)) - ) - (return (i32.const 2)) - ) - (i32.const 3) - ) - - (func (export "as-return-value") (param i32) (result i32) - (return (local.get 0)) - ) - - (func (export "as-if-then") (param i32) (result i32) - (if (result i32) (local.get 0) (then (local.get 0)) (else (i32.const 0))) - ) - (func (export "as-if-else") (param i32) (result i32) - (if (result i32) (local.get 0) (then (i32.const 1)) (else (local.get 0))) - ) -) - -(assert_return (invoke "type-local-i32") (i32.const 0)) -(assert_return (invoke "type-local-i64") (i64.const 0)) -(assert_return (invoke "type-local-f32") (f32.const 0)) -(assert_return (invoke "type-local-f64") (f64.const 0)) - -(assert_return (invoke "type-param-i32" (i32.const 2)) (i32.const 2)) -(assert_return (invoke "type-param-i64" (i64.const 3)) (i64.const 3)) -(assert_return (invoke "type-param-f32" (f32.const 4.4)) (f32.const 4.4)) -(assert_return (invoke "type-param-f64" (f64.const 5.5)) (f64.const 5.5)) - -(assert_return (invoke "as-block-value" (i32.const 6)) (i32.const 6)) -(assert_return (invoke "as-loop-value" (i32.const 7)) (i32.const 7)) - -(assert_return (invoke "as-br-value" (i32.const 8)) (i32.const 8)) -(assert_return (invoke "as-br_if-value" (i32.const 9)) (i32.const 9)) -(assert_return (invoke "as-br_if-value-cond" (i32.const 10)) (i32.const 10)) -(assert_return (invoke "as-br_table-value" (i32.const 1)) (i32.const 2)) - -(assert_return (invoke "as-return-value" (i32.const 0)) (i32.const 0)) - -(assert_return (invoke "as-if-then" (i32.const 1)) (i32.const 1)) -(assert_return (invoke "as-if-else" (i32.const 0)) (i32.const 0)) - -(assert_return - (invoke "type-mixed" - (i64.const 1) (f32.const 2.2) (f64.const 3.3) (i32.const 4) (i32.const 5) - ) -) diff --git a/tests/misc_testsuite/winch/local_set.wast b/tests/misc_testsuite/winch/local_set.wast deleted file mode 100644 index f368f7bf368f..000000000000 --- a/tests/misc_testsuite/winch/local_set.wast +++ /dev/null @@ -1,97 +0,0 @@ -;; Test `local.set` operator - -(module - ;; Typing - - (func (export "type-local-i32") (local i32) (local.set 0 (i32.const 0))) - (func (export "type-local-i64") (local i64) (local.set 0 (i64.const 0))) - (func (export "type-local-f32") (local f32) (local.set 0 (f32.const 0))) - (func (export "type-local-f64") (local f64) (local.set 0 (f64.const 0))) - - (func (export "type-param-i32") (param i32) (local.set 0 (i32.const 10))) - (func (export "type-param-i64") (param i64) (local.set 0 (i64.const 11))) - (func (export "type-param-f32") (param f32) (local.set 0 (f32.const 11.1))) - (func (export "type-param-f64") (param f64) (local.set 0 (f64.const 12.2))) - - (func (export "type-mixed") (param i64 f32 f64 i32 i32) (local f32 i64 i64 f64) - (local.set 0 (i64.const 0)) - (local.set 1 (f32.const 0)) - (local.set 2 (f64.const 0)) - (local.set 3 (i32.const 0)) - (local.set 4 (i32.const 0)) - (local.set 5 (f32.const 0)) - (local.set 6 (i64.const 0)) - (local.set 7 (i64.const 0)) - (local.set 8 (f64.const 0)) - ) - - ;; As parameter of control constructs and instructions - - (func (export "as-block-value") (param i32) - (block (local.set 0 (i32.const 1))) - ) - (func (export "as-loop-value") (param i32) - (loop (local.set 0 (i32.const 3))) - ) - - (func (export "as-br-value") (param i32) - (block (br 0 (local.set 0 (i32.const 9)))) - ) - (func (export "as-br_if-value") (param i32) - (block - (br_if 0 (local.set 0 (i32.const 8)) (i32.const 1)) - ) - ) - (func (export "as-br_if-value-cond") (param i32) - (block - (br_if 0 (i32.const 6) (local.set 0 (i32.const 9))) - ) - ) - (func (export "as-br_table-value") (param i32) - (block - (br_table 0 (local.set 0 (i32.const 10)) (i32.const 1)) - ) - ) - - (func (export "as-return-value") (param i32) - (return (local.set 0 (i32.const 7))) - ) - - (func (export "as-if-then") (param i32) - (if (local.get 0) (then (local.set 0 (i32.const 3)))) - ) - (func (export "as-if-else") (param i32) - (if (local.get 0) (then) (else (local.set 0 (i32.const 1)))) - ) -) - -(assert_return (invoke "type-local-i32")) -(assert_return (invoke "type-local-i64")) -(assert_return (invoke "type-local-f32")) -(assert_return (invoke "type-local-f64")) - -(assert_return (invoke "type-param-i32" (i32.const 2))) -(assert_return (invoke "type-param-i64" (i64.const 3))) -(assert_return (invoke "type-param-f32" (f32.const 4.4))) -(assert_return (invoke "type-param-f64" (f64.const 5.5))) - -(assert_return (invoke "as-block-value" (i32.const 0))) -(assert_return (invoke "as-loop-value" (i32.const 0))) - -(assert_return (invoke "as-br-value" (i32.const 0))) -(assert_return (invoke "as-br_if-value" (i32.const 0))) -(assert_return (invoke "as-br_if-value-cond" (i32.const 0))) -(assert_return (invoke "as-br_table-value" (i32.const 0))) - -(assert_return (invoke "as-return-value" (i32.const 0))) - -(assert_return (invoke "as-if-then" (i32.const 1))) -(assert_return (invoke "as-if-else" (i32.const 0))) - -(assert_return - (invoke "type-mixed" - (i64.const 1) (f32.const 2.2) (f64.const 3.3) (i32.const 4) (i32.const 5) - ) -) - - diff --git a/tests/misc_testsuite/winch/local_tee.wast b/tests/misc_testsuite/winch/local_tee.wast deleted file mode 100644 index 68c9d4194426..000000000000 --- a/tests/misc_testsuite/winch/local_tee.wast +++ /dev/null @@ -1,174 +0,0 @@ -;; Test `local.tee` operator - -(module - ;; Typing - - (func (export "type-local-i32") (result i32) (local i32) (local.tee 0 (i32.const 0))) - (func (export "type-local-i64") (result i64) (local i64) (local.tee 0 (i64.const 0))) - (func (export "type-local-f32") (result f32) (local f32) (local.tee 0 (f32.const 0))) - (func (export "type-local-f64") (result f64) (local f64) (local.tee 0 (f64.const 0))) - - (func (export "type-param-i32") (param i32) (result i32) (local.tee 0 (i32.const 10))) - (func (export "type-param-i64") (param i64) (result i64) (local.tee 0 (i64.const 11))) - (func (export "type-param-f32") (param f32) (result f32) (local.tee 0 (f32.const 11.1))) - (func (export "type-param-f64") (param f64) (result f64) (local.tee 0 (f64.const 12.2))) - - (func $dummy) - - (func (export "as-block-first") (param i32) (result i32) - (block (result i32) (local.tee 0 (i32.const 1)) (call $dummy)) - ) - (func (export "as-block-mid") (param i32) (result i32) - (block (result i32) (call $dummy) (local.tee 0 (i32.const 1)) (call $dummy)) - ) - (func (export "as-block-last") (param i32) (result i32) - (block (result i32) (call $dummy) (call $dummy) (local.tee 0 (i32.const 1))) - ) - - (func (export "as-loop-first") (param i32) (result i32) - (loop (result i32) (local.tee 0 (i32.const 3)) (call $dummy)) - ) - (func (export "as-loop-mid") (param i32) (result i32) - (loop (result i32) (call $dummy) (local.tee 0 (i32.const 4)) (call $dummy)) - ) - (func (export "as-loop-last") (param i32) (result i32) - (loop (result i32) (call $dummy) (call $dummy) (local.tee 0 (i32.const 5))) - ) - - (func (export "as-br-value") (param i32) (result i32) - (block (result i32) (br 0 (local.tee 0 (i32.const 9)))) - ) - - (func (export "as-br_if-cond") (param i32) - (block (br_if 0 (local.tee 0 (i32.const 1)))) - ) - - (func (export "as-br_if-value") (param i32) (result i32) - (block (result i32) - (drop (br_if 0 (local.tee 0 (i32.const 8)) (i32.const 1))) (i32.const 7) - ) - ) - - (func (export "as-br_if-value-cond") (param i32) (result i32) - (block (result i32) - (drop (br_if 0 (i32.const 6) (local.tee 0 (i32.const 9)))) (i32.const 7) - ) - ) - - (func (export "as-return-value") (param i32) (result i32) - (return (local.tee 0 (i32.const 7))) - ) - - (func (export "as-if-cond") (param i32) (result i32) - (if (result i32) (local.tee 0 (i32.const 2)) - (then (i32.const 0)) (else (i32.const 1)) - ) - ) - (func (export "as-if-then") (param i32) (result i32) - (if (result i32) (local.get 0) - (then (local.tee 0 (i32.const 3))) (else (local.get 0)) - ) - ) - (func (export "as-if-else") (param i32) (result i32) - (if (result i32) (local.get 0) - (then (local.get 0)) (else (local.tee 0 (i32.const 4))) - ) - ) - - (func $f (param i32 i32 i32) (result i32) (i32.const -1)) - (func (export "as-call-first") (param i32) (result i32) - (call $f (local.tee 0 (i32.const 12)) (i32.const 2) (i32.const 3)) - ) - (func (export "as-call-mid") (param i32) (result i32) - (call $f (i32.const 1) (local.tee 0 (i32.const 13)) (i32.const 3)) - ) - (func (export "as-call-last") (param i32) (result i32) - (call $f (i32.const 1) (i32.const 2) (local.tee 0 (i32.const 14))) - ) - - (func (export "as-local.set-value") (local i32) - (local.set 0 (local.tee 0 (i32.const 1))) - ) - (func (export "as-local.tee-value") (param i32) (result i32) - (local.tee 0 (local.tee 0 (i32.const 1))) - ) - - (func (export "as-binary-left") (param i32) (result i32) - (i32.add (local.tee 0 (i32.const 3)) (i32.const 10)) - ) - (func (export "as-binary-right") (param i32) (result i32) - (i32.sub (i32.const 10) (local.tee 0 (i32.const 4))) - ) - - (func (export "as-test-operand") (param i32) (result i32) - (i32.eqz (local.tee 0 (i32.const 0))) - ) - - (func (export "as-compare-left") (param i32) (result i32) - (i32.le_s (local.tee 0 (i32.const 43)) (i32.const 10)) - ) - (func (export "as-compare-right") (param i32) (result i32) - (i32.ne (i32.const 10) (local.tee 0 (i32.const 42))) - ) - - (func (export "as-br_table-index") (param i32) - (block (br_table 0 0 0 (local.tee 0 (i32.const 0)))) - ) - (func (export "as-br_table-value") (param i32) (result i32) - (block (result i32) - (br_table 0 0 0 (local.tee 0 (i32.const 10)) (i32.const 1)) (i32.const 7) - ) - ) - (func (export "as-br_table-value-index") (param i32) (result i32) - (block (result i32) - (br_table 0 0 (i32.const 6) (local.tee 0 (i32.const 11))) (i32.const 7) - ) - ) -) - -(assert_return (invoke "type-local-i32") (i32.const 0)) -(assert_return (invoke "type-local-i64") (i64.const 0)) -(assert_return (invoke "type-local-f32") (f32.const 0)) -(assert_return (invoke "type-local-f64") (f64.const 0)) - -(assert_return (invoke "type-param-i32" (i32.const 2)) (i32.const 10)) -(assert_return (invoke "type-param-i64" (i64.const 3)) (i64.const 11)) -(assert_return (invoke "type-param-f32" (f32.const 4.4)) (f32.const 11.1)) -(assert_return (invoke "type-param-f64" (f64.const 5.5)) (f64.const 12.2)) - -(assert_return (invoke "as-block-first" (i32.const 0)) (i32.const 1)) -(assert_return (invoke "as-block-mid" (i32.const 0)) (i32.const 1)) -(assert_return (invoke "as-block-last" (i32.const 0)) (i32.const 1)) - -(assert_return (invoke "as-loop-first" (i32.const 0)) (i32.const 3)) -(assert_return (invoke "as-loop-mid" (i32.const 0)) (i32.const 4)) -(assert_return (invoke "as-loop-last" (i32.const 0)) (i32.const 5)) - -(assert_return (invoke "as-br-value" (i32.const 0)) (i32.const 9)) - -(assert_return (invoke "as-br_if-cond" (i32.const 0))) -(assert_return (invoke "as-br_if-value" (i32.const 0)) (i32.const 8)) -(assert_return (invoke "as-br_if-value-cond" (i32.const 0)) (i32.const 6)) - -(assert_return (invoke "as-return-value" (i32.const 0)) (i32.const 7)) - -(assert_return (invoke "as-if-cond" (i32.const 0)) (i32.const 0)) -(assert_return (invoke "as-if-then" (i32.const 1)) (i32.const 3)) -(assert_return (invoke "as-if-else" (i32.const 0)) (i32.const 4)) - -(assert_return (invoke "as-call-first" (i32.const 0)) (i32.const -1)) -(assert_return (invoke "as-call-mid" (i32.const 0)) (i32.const -1)) -(assert_return (invoke "as-call-last" (i32.const 0)) (i32.const -1)) - -(assert_return (invoke "as-local.set-value")) -(assert_return (invoke "as-local.tee-value" (i32.const 0)) (i32.const 1)) - -(assert_return (invoke "as-binary-left" (i32.const 0)) (i32.const 13)) -(assert_return (invoke "as-binary-right" (i32.const 0)) (i32.const 6)) -(assert_return (invoke "as-test-operand" (i32.const 0)) (i32.const 1)) -(assert_return (invoke "as-compare-left" (i32.const 0)) (i32.const 0)) -(assert_return (invoke "as-compare-right" (i32.const 0)) (i32.const 1)) - -(assert_return (invoke "as-br_table-index" (i32.const 0))) -(assert_return (invoke "as-br_table-value" (i32.const 0)) (i32.const 10)) -(assert_return (invoke "as-br_table-value-index" (i32.const 0)) (i32.const 6)) diff --git a/tests/misc_testsuite/winch/loop.wast b/tests/misc_testsuite/winch/loop.wast deleted file mode 100644 index 71cd6e752ee2..000000000000 --- a/tests/misc_testsuite/winch/loop.wast +++ /dev/null @@ -1,237 +0,0 @@ -;; Test `loop` opcode - -(module - (memory 1) - - (func $dummy) - - (func (export "empty") - (loop) - (loop $l) - ) - - (func (export "singular") (result i32) - (loop (nop)) - (loop (result i32) (i32.const 7)) - ) - - - (func (export "nested") (result i32) - (loop (result i32) - (loop (call $dummy) (block) (nop)) - (loop (result i32) (call $dummy) (i32.const 9)) - ) - ) - - (func (export "as-br_table-first") (result i32) - (block (result i32) (loop (result i32) (i32.const 1)) (i32.const 2) (br_table 0 0)) - ) - (func (export "as-br_table-last") (result i32) - (block (result i32) (i32.const 2) (loop (result i32) (i32.const 1)) (br_table 0 0)) - ) - - (func (export "break-repeated") (result i32) - (block (result i32) - (loop (result i32) - (br 1 (i32.const 18)) - (br 1 (i32.const 19)) - (drop (br_if 1 (i32.const 20) (i32.const 0))) - (drop (br_if 1 (i32.const 20) (i32.const 1))) - (br 1 (i32.const 21)) - (br_table 1 (i32.const 22) (i32.const 0)) - (br_table 1 1 1 (i32.const 23) (i32.const 1)) - (i32.const 21) - ) - ) - ) - - (func (export "break-bare") (result i32) - (block (loop (br 1) (br 0) (unreachable))) - (block (loop (br_if 1 (i32.const 1)) (unreachable))) - (block (loop (br_table 1 (i32.const 0)) (unreachable))) - (block (loop (br_table 1 1 1 (i32.const 1)) (unreachable))) - (i32.const 19) - ) - - (func (export "deep") (result i32) - (loop (result i32) (block (result i32) - (loop (result i32) (block (result i32) - (loop (result i32) (block (result i32) - (loop (result i32) (block (result i32) - (loop (result i32) (block (result i32) - (loop (result i32) (block (result i32) - (loop (result i32) (block (result i32) - (loop (result i32) (block (result i32) - (loop (result i32) (block (result i32) - (loop (result i32) (block (result i32) - (loop (result i32) (block (result i32) - (loop (result i32) (block (result i32) - (loop (result i32) (block (result i32) - (loop (result i32) (block (result i32) - (loop (result i32) (block (result i32) - (loop (result i32) (block (result i32) - (loop (result i32) (block (result i32) - (loop (result i32) (block (result i32) - (loop (result i32) (block (result i32) - (loop (result i32) (block (result i32) - (call $dummy) (i32.const 150) - )) - )) - )) - )) - )) - )) - )) - )) - )) - )) - )) - )) - )) - )) - )) - )) - )) - )) - )) - )) - ) - - (func (export "as-if-condition") - (loop (result i32) (i32.const 1)) (if (then (call $dummy))) - ) - (func (export "as-if-then") (result i32) - (if (result i32) (i32.const 1) (then (loop (result i32) (i32.const 1))) (else (i32.const 2))) - ) - (func (export "as-if-else") (result i32) - (if (result i32) (i32.const 1) (then (i32.const 2)) (else (loop (result i32) (i32.const 1)))) - ) - - (func (export "as-br_if-first") (result i32) - (block (result i32) (br_if 0 (loop (result i32) (i32.const 1)) (i32.const 2))) - ) - (func (export "as-br_if-last") (result i32) - (block (result i32) (br_if 0 (i32.const 2) (loop (result i32) (i32.const 1)))) - ) - - (func $f (param i32) (result i32) (local.get 0)) - - (func (export "as-call-value") (result i32) - (call $f (loop (result i32) (i32.const 1))) - ) - (func (export "as-return-value") (result i32) - (loop (result i32) (i32.const 1)) (return) - ) - (func (export "as-drop-operand") - (drop (loop (result i32) (i32.const 1))) - ) - (func (export "as-br-value") (result i32) - (block (result i32) (br 0 (loop (result i32) (i32.const 1)))) - ) - (func (export "as-local.set-value") (result i32) - (local i32) (local.set 0 (loop (result i32) (i32.const 1))) (local.get 0) - ) - - (func (export "as-unary-operand") (result i32) - (i32.ctz (loop (result i32) (call $dummy) (i32.const 13))) - ) - (func (export "as-binary-operand") (result i32) - (i32.mul - (loop (result i32) (call $dummy) (i32.const 3)) - (loop (result i32) (call $dummy) (i32.const 4)) - ) - ) - (func (export "as-test-operand") (result i32) - (i32.eqz (loop (result i32) (call $dummy) (i32.const 13))) - ) - - (func (export "break-inner") (result i32) - (local i32) - (local.set 0 (i32.const 0)) - (local.set 0 (i32.add (local.get 0) (block (result i32) (loop (result i32) (block (result i32) (br 2 (i32.const 0x1))))))) - (local.set 0 (i32.add (local.get 0) (block (result i32) (loop (result i32) (loop (result i32) (br 2 (i32.const 0x2))))))) - (local.set 0 (i32.add (local.get 0) (block (result i32) (loop (result i32) (block (result i32) (loop (result i32) (br 1 (i32.const 0x4)))))))) - (local.set 0 (i32.add (local.get 0) (block (result i32) (loop (result i32) (i32.ctz (br 1 (i32.const 0x8))))))) - (local.set 0 (i32.add (local.get 0) (block (result i32) (loop (result i32) (i32.ctz (loop (result i32) (br 2 (i32.const 0x10)))))))) - (local.get 0) - ) - - (func $fx (export "effects") (result i32) - (local i32) - (block - (loop - (local.set 0 (i32.const 1)) - (local.set 0 (i32.mul (local.get 0) (i32.const 3))) - (local.set 0 (i32.sub (local.get 0) (i32.const 5))) - (local.set 0 (i32.mul (local.get 0) (i32.const 7))) - (br 1) - (local.set 0 (i32.mul (local.get 0) (i32.const 100))) - ) - ) - (i32.eq (local.get 0) (i32.const -14)) - ) - - (func (export "while") (param i64) (result i64) - (local i64) - (local.set 1 (i64.const 1)) - (block - (loop - (br_if 1 (i64.eqz (local.get 0))) - (local.set 1 (i64.mul (local.get 0) (local.get 1))) - (local.set 0 (i64.sub (local.get 0) (i64.const 1))) - (br 0) - ) - ) - (local.get 1) - ) - - (func (export "for") (param i64) (result i64) - (local i64 i64) - (local.set 1 (i64.const 1)) - (local.set 2 (i64.const 2)) - (block - (loop - (br_if 1 (i64.gt_u (local.get 2) (local.get 0))) - (local.set 1 (i64.mul (local.get 1) (local.get 2))) - (local.set 2 (i64.add (local.get 2) (i64.const 1))) - (br 0) - ) - ) - (local.get 1) - ) -) - -(assert_return (invoke "empty")) -(assert_return (invoke "singular") (i32.const 7)) -(assert_return (invoke "nested") (i32.const 9)) -(assert_return (invoke "deep") (i32.const 150)) -(assert_return (invoke "as-if-condition")) -(assert_return (invoke "as-if-then") (i32.const 1)) -(assert_return (invoke "as-if-else") (i32.const 2)) -(assert_return (invoke "as-br_if-first") (i32.const 1)) -(assert_return (invoke "as-br_if-last") (i32.const 2)) -(assert_return (invoke "as-call-value") (i32.const 1)) -(assert_return (invoke "as-drop-operand")) -(assert_return (invoke "as-return-value") (i32.const 1)) -(assert_return (invoke "as-br-value") (i32.const 1)) -(assert_return (invoke "as-local.set-value") (i32.const 1)) -(assert_return (invoke "as-unary-operand") (i32.const 0)) -(assert_return (invoke "as-binary-operand") (i32.const 12)) -(assert_return (invoke "as-test-operand") (i32.const 0)) -(assert_return (invoke "break-inner") (i32.const 0x1f)) -(assert_return (invoke "effects") (i32.const 1)) -(assert_return (invoke "while" (i64.const 0)) (i64.const 1)) -(assert_return (invoke "while" (i64.const 1)) (i64.const 1)) -(assert_return (invoke "while" (i64.const 2)) (i64.const 2)) -(assert_return (invoke "while" (i64.const 3)) (i64.const 6)) -(assert_return (invoke "while" (i64.const 5)) (i64.const 120)) -(assert_return (invoke "while" (i64.const 20)) (i64.const 2432902008176640000)) -(assert_return (invoke "for" (i64.const 0)) (i64.const 1)) -(assert_return (invoke "for" (i64.const 1)) (i64.const 1)) -(assert_return (invoke "for" (i64.const 2)) (i64.const 2)) -(assert_return (invoke "for" (i64.const 3)) (i64.const 6)) -(assert_return (invoke "for" (i64.const 5)) (i64.const 120)) -(assert_return (invoke "for" (i64.const 20)) (i64.const 2432902008176640000)) - -(assert_return (invoke "break-bare") (i32.const 19)) -(assert_return (invoke "break-repeated") (i32.const 18)) diff --git a/tests/misc_testsuite/winch/misc.wast b/tests/misc_testsuite/winch/misc.wast new file mode 100644 index 000000000000..31f5098d4c98 --- /dev/null +++ b/tests/misc_testsuite/winch/misc.wast @@ -0,0 +1,14 @@ +;; Additional run tests for Winch not covered in the official spec test suite. + +(module + (func (export "br-table-ensure-sp") (result i32) + (block (result i32) + (i32.const 0) + ) + (i32.const 0) + (i32.const 0) + (br_table 0) + ) +) + +(assert_return (invoke "br-table-ensure-sp") (i32.const 0)) diff --git a/tests/misc_testsuite/winch/select.wast b/tests/misc_testsuite/winch/select.wast index 4b52094f358e..2abc9a43ac47 100644 --- a/tests/misc_testsuite/winch/select.wast +++ b/tests/misc_testsuite/winch/select.wast @@ -112,6 +112,15 @@ (i32.ne (i32.const 1) (select (i32.const 0) (i32.const 1) (local.get 0))) ) ) + (func (export "as-load-operand") (param i32) (result i32) + (i32.load (select (i32.const 0) (i32.const 4) (local.get 0))) + ) + (func (export "as-store-first") (param i32) + (select (i32.const 0) (i32.const 4) (local.get 0)) (i32.const 1) (i32.store) + ) + (func (export "as-store-last") (param i32) + (i32.const 8) (select (i32.const 1) (i32.const 2) (local.get 0)) (i32.store) + ) ) (assert_return (invoke "select-i32" (i32.const 1) (i32.const 2) (i32.const 1)) (i32.const 1)) @@ -198,3 +207,11 @@ (assert_return (invoke "as-br_table-first" (i32.const 1)) (i32.const 2)) (assert_return (invoke "as-br_table-last" (i32.const 0)) (i32.const 2)) (assert_return (invoke "as-br_table-last" (i32.const 1)) (i32.const 2)) + +(assert_return (invoke "as-store-first" (i32.const 0))) +(assert_return (invoke "as-store-first" (i32.const 1))) +(assert_return (invoke "as-store-last" (i32.const 0))) +(assert_return (invoke "as-store-last" (i32.const 1))) +(assert_return (invoke "as-load-operand" (i32.const 0)) (i32.const 1)) +(assert_return (invoke "as-load-operand" (i32.const 1)) (i32.const 1)) + diff --git a/tests/zkasm/run-tests-zkasm.js b/tests/zkasm/run-tests-zkasm.js index 77ade2d25ea5..228b1595f005 100644 --- a/tests/zkasm/run-tests-zkasm.js +++ b/tests/zkasm/run-tests-zkasm.js @@ -30,6 +30,13 @@ function value_to_json(key, value) { return value; } +/** + * Executes zkASM stored in files. Expects the following positional command line arguments: + * + * @param {string} path - The file or a directory to search for zkASM files. + * @param {string} [outFile] - If provided, results are written to this file. Otherwise they are + * printed to stdout. + */ async function main() { // Compile pil const cmPols = await compilePil(); @@ -76,7 +83,12 @@ async function compilePil() { return newCommitPolsArray(pil); } -// Get all zkasm test files +/** + * Returns the path of all zkasm test files in `pathZkasm`. + * + * @param {string} pathZkasm + * @returns {string[]} + */ function getTestFiles(pathZkasm) { if (!fs.existsSync(pathZkasm)) { return []; @@ -94,7 +106,10 @@ function getTestFiles(pathZkasm) { return filesNames.map((fileName) => path.join(pathZkasm, fileName)); } -// returns true if test succeed and false if test failed +/** + * @returns {Object} Which indicates if the test run succeeded or failed. Contains additional data + * related to the test run. + */ async function runTest(pathTest, cmPols) { // Compile rom const configZkasm = { diff --git a/winch/Cargo.toml b/winch/Cargo.toml index cf83b27d1b37..b50224762520 100644 --- a/winch/Cargo.toml +++ b/winch/Cargo.toml @@ -7,6 +7,9 @@ repository = "https://github.com/bytecodealliance/wasmtime" publish = false edition.workspace = true +[lints] +workspace = true + [[bin]] name = "winch-tools" path = "src/main.rs" diff --git a/winch/codegen/Cargo.toml b/winch/codegen/Cargo.toml index 42d183855b4c..fe73476559f6 100644 --- a/winch/codegen/Cargo.toml +++ b/winch/codegen/Cargo.toml @@ -4,9 +4,12 @@ name = "winch-codegen" description = "Winch code generation library" license = "Apache-2.0 WITH LLVM-exception" repository = "https://github.com/bytecodealliance/wasmtime" -version = "0.14.0" +version = "0.17.0" edition.workspace = true +[lints] +workspace = true + [dependencies] wasmparser = { workspace = true } smallvec = { workspace = true } @@ -16,7 +19,7 @@ target-lexicon = { workspace = true, features = ["std"] } # mostly to have access to `PReg`s and the calling convention. # In the next iteration we'll factor out the common bits so that they can be consumed # by Cranelift and Winch. -cranelift-codegen = { workspace = true } +cranelift-codegen = { workspace = true, features = ["unwind"] } regalloc2 = { workspace = true } gimli = { workspace = true } wasmtime-environ = { workspace = true } diff --git a/winch/codegen/src/abi/local.rs b/winch/codegen/src/abi/local.rs index 2240c6b73347..829fe009a411 100644 --- a/winch/codegen/src/abi/local.rs +++ b/winch/codegen/src/abi/local.rs @@ -1,4 +1,4 @@ -use wasmtime_environ::WasmType; +use wasmtime_environ::WasmValType; /// Base register used to address the local slot. /// @@ -31,7 +31,7 @@ pub(crate) struct LocalSlot { /// The offset of the local slot. pub offset: u32, /// The type contained by this local slot. - pub ty: WasmType, + pub ty: WasmValType, /// Base register associated to this local slot. base: Base, } @@ -39,7 +39,7 @@ pub(crate) struct LocalSlot { impl LocalSlot { /// Creates a local slot for a function defined local or /// for a spilled argument register. - pub fn new(ty: WasmType, offset: u32) -> Self { + pub fn new(ty: WasmValType, offset: u32) -> Self { Self { ty, offset, @@ -50,7 +50,7 @@ impl LocalSlot { /// Int32 shortcut for `new`. pub fn i32(offset: u32) -> Self { Self { - ty: WasmType::I32, + ty: WasmValType::I32, offset, base: Base::SP, } @@ -59,14 +59,14 @@ impl LocalSlot { /// Int64 shortcut for `new`. pub fn i64(offset: u32) -> Self { Self { - ty: WasmType::I64, + ty: WasmValType::I64, offset, base: Base::SP, } } /// Creates a local slot for a stack function argument. - pub fn stack_arg(ty: WasmType, offset: u32) -> Self { + pub fn stack_arg(ty: WasmValType, offset: u32) -> Self { Self { ty, offset, diff --git a/winch/codegen/src/abi/mod.rs b/winch/codegen/src/abi/mod.rs index 719c241fb7b7..0c39976f7b89 100644 --- a/winch/codegen/src/abi/mod.rs +++ b/winch/codegen/src/abi/mod.rs @@ -1,5 +1,3 @@ -//! This module provides all the necessary building blocks for -//! implementing ISA specific ABIs. //! //! # Default ABI //! @@ -49,7 +47,7 @@ use crate::masm::{OperandSize, SPOffset}; use smallvec::SmallVec; use std::collections::HashSet; use std::ops::{Add, BitAnd, Not, Sub}; -use wasmtime_environ::{WasmFuncType, WasmType}; +use wasmtime_environ::{WasmFuncType, WasmHeapType, WasmRefType, WasmValType}; pub(crate) mod local; pub(crate) use local::*; @@ -83,17 +81,20 @@ pub(crate) trait ABI { fn sig(wasm_sig: &WasmFuncType, call_conv: &CallingConvention) -> ABISig; /// Construct an ABI signature from WasmType params and returns. - fn sig_from(params: &[WasmType], returns: &[WasmType], call_conv: &CallingConvention) - -> ABISig; + fn sig_from( + params: &[WasmValType], + returns: &[WasmValType], + call_conv: &CallingConvention, + ) -> ABISig; /// Construct [`ABIResults`] from a slice of [`WasmType`]. - fn abi_results(returns: &[WasmType], call_conv: &CallingConvention) -> ABIResults; + fn abi_results(returns: &[WasmValType], call_conv: &CallingConvention) -> ABIResults; /// Returns the number of bits in a word. - fn word_bits() -> u32; + fn word_bits() -> u8; /// Returns the number of bytes in a word. - fn word_bytes() -> u32 { + fn word_bytes() -> u8 { Self::word_bits() / 8 } @@ -104,10 +105,15 @@ pub(crate) trait ABI { fn float_scratch_reg() -> Reg; /// Returns the designated scratch register for the given [WasmType]. - fn scratch_for(ty: &WasmType) -> Reg { + fn scratch_for(ty: &WasmValType) -> Reg { match ty { - WasmType::I32 | WasmType::I64 => Self::scratch_reg(), - WasmType::F32 | WasmType::F64 => Self::float_scratch_reg(), + WasmValType::I32 + | WasmValType::I64 + | WasmValType::Ref(WasmRefType { + heap_type: WasmHeapType::Func, + .. + }) => Self::scratch_reg(), + WasmValType::F32 | WasmValType::F64 => Self::float_scratch_reg(), _ => unimplemented!(), } } @@ -127,10 +133,13 @@ pub(crate) trait ABI { fn callee_saved_regs(call_conv: &CallingConvention) -> SmallVec<[(Reg, OperandSize); 18]>; /// The size, in bytes, of each stack slot used for stack parameter passing. - fn stack_slot_size() -> u32; + fn stack_slot_size() -> u8; /// Returns the size in bytes of the given [`WasmType`]. - fn sizeof(ty: &WasmType) -> u32; + fn sizeof(ty: &WasmValType) -> u8; + + /// Returns the size in bits of the given [`WasmType`]. + fn sizeof_bits(ty: &WasmValType) -> u8; } /// ABI-specific representation of function argument or result. @@ -139,7 +148,7 @@ pub enum ABIOperand { /// A register [`ABIOperand`]. Reg { /// The type of the [`ABIOperand`]. - ty: WasmType, + ty: WasmValType, /// Register holding the [`ABIOperand`]. reg: Reg, /// The size of the [`ABIOperand`], in bytes. @@ -148,7 +157,7 @@ pub enum ABIOperand { /// A stack [`ABIOperand`]. Stack { /// The type of the [`ABIOperand`]. - ty: WasmType, + ty: WasmValType, /// Offset of the operand referenced through FP by the callee and /// through SP by the caller. offset: u32, @@ -159,12 +168,12 @@ pub enum ABIOperand { impl ABIOperand { /// Allocate a new register [`ABIOperand`]. - pub fn reg(reg: Reg, ty: WasmType, size: u32) -> Self { + pub fn reg(reg: Reg, ty: WasmValType, size: u32) -> Self { Self::Reg { reg, ty, size } } /// Allocate a new stack [`ABIOperand`]. - pub fn stack_offset(offset: u32, ty: WasmType, size: u32) -> Self { + pub fn stack_offset(offset: u32, ty: WasmValType, size: u32) -> Self { Self::Stack { ty, offset, size } } @@ -196,7 +205,7 @@ impl ABIOperand { } /// Get the type associated to this [`ABIOperand`]. - pub fn ty(&self) -> WasmType { + pub fn ty(&self) -> WasmValType { match *self { ABIOperand::Reg { ty, .. } | ABIOperand::Stack { ty, .. } => ty, } @@ -227,11 +236,25 @@ impl Default for ABIOperands { /// Machine stack location of the stack results. #[derive(Debug, Copy, Clone)] pub(crate) enum RetArea { - /// Addressed from SP at the given offset. + /// Addressed from the stack pointer at the given offset. SP(SPOffset), /// The address of the results base is stored at a particular, /// well known [LocalSlot]. Slot(LocalSlot), + /// The return area cannot be fully resolved ahead-of-time. + /// If there are results on the stack, this is the default state to which + /// all return areas get initialized to until they can be fully resolved to + /// either a [RetArea::SP] or [RetArea::Slot]. + /// + /// This allows a more explicit differentiation between the existence of + /// a return area versus no return area at all. + Uninit, +} + +impl Default for RetArea { + fn default() -> Self { + Self::Uninit + } } impl RetArea { @@ -255,6 +278,22 @@ impl RetArea { _ => unreachable!(), } } + + /// Returns true if the return area is addressed via the stack pointer. + pub fn is_sp(&self) -> bool { + match self { + Self::SP(_) => true, + _ => false, + } + } + + /// Returns true if the return area is uninitiliazed. + pub fn is_uninit(&self) -> bool { + match self { + Self::Uninit => true, + _ => false, + } + } } /// ABI-specific representation of an [`ABISig`]. @@ -262,33 +301,8 @@ impl RetArea { pub(crate) struct ABIResults { /// The result operands. operands: ABIOperands, -} - -/// Data about the [`ABIResults`]. -/// This struct is meant to be used once the [`ABIResults`] can be -/// materialized to a particular location in the machine stack, -/// if any. -#[derive(Debug, Clone)] -pub(crate) struct ABIResultsData { - /// The results. - pub results: ABIResults, - /// The return pointer, if any. - pub ret_area: Option, -} - -impl ABIResultsData { - /// Create a [`ABIResultsData`] without a stack results base. - pub fn wrap(results: ABIResults) -> Self { - Self { - results, - ret_area: None, - } - } - - /// Unwraps the stack results base. - pub fn unwrap_ret_area(&self) -> &RetArea { - self.ret_area.as_ref().unwrap() - } + /// The return area, if there are results on the stack. + ret_area: Option, } impl ABIResults { @@ -299,9 +313,9 @@ impl ABIResults { /// representation, according to the calling convention. In the case of /// results, one result is stored in registers and the rest at particular /// offsets in the stack. - pub fn from(returns: &[WasmType], call_conv: &CallingConvention, mut map: F) -> Self + pub fn from(returns: &[WasmValType], call_conv: &CallingConvention, mut map: F) -> Self where - F: FnMut(&WasmType, u32) -> (ABIOperand, u32), + F: FnMut(&WasmValType, u32) -> (ABIOperand, u32), { if returns.len() == 0 { return Self::default(); @@ -352,7 +366,8 @@ impl ABIResults { /// Create a new [`ABIResults`] from [`ABIOperands`]. pub fn new(operands: ABIOperands) -> Self { - Self { operands } + let ret_area = (operands.bytes > 0).then(|| RetArea::default()); + Self { operands, ret_area } } /// Returns a reference to a [HashSet], which includes @@ -371,6 +386,11 @@ impl ABIResults { self.operands.inner.len() } + /// Returns the length of results on the stack. + pub fn stack_operands_len(&self) -> usize { + self.operands().len() - self.regs().len() + } + /// Get the [`ABIOperand`] result in the nth position. #[cfg(test)] pub fn get(&self, n: usize) -> Option<&ABIOperand> { @@ -395,9 +415,28 @@ impl ABIResults { /// Returns true if the [`ABIResults`] require space on the machine stack /// for results. - pub fn has_stack_results(&self) -> bool { + pub fn on_stack(&self) -> bool { self.operands.bytes > 0 } + + /// Set the return area of the signature. + /// + /// # Panics + /// + /// This function will panic if trying to set a return area if there are + /// no results on the stack or if trying to set an uninitialize return area. + /// This method must only be used when the return area can be fully + /// materialized. + pub fn set_ret_area(&mut self, area: RetArea) { + debug_assert!(self.on_stack()); + debug_assert!(!area.is_uninit()); + self.ret_area = Some(area); + } + + /// Returns a reference to the return area, if any. + pub fn ret_area(&self) -> Option<&RetArea> { + self.ret_area.as_ref() + } } /// ABI-specific representation of an [`ABISig`]. @@ -419,13 +458,13 @@ impl ABIParams { /// params, multiple params may be passed in registers and the rest on the /// stack depending on the calling convention. pub fn from( - params: &[WasmType], + params: &[WasmValType], initial_bytes: u32, needs_stack_results: bool, mut map: F, ) -> Self where - F: FnMut(&WasmType, u32) -> (ABIOperand, u32), + F: FnMut(&WasmValType, u32) -> (ABIOperand, u32), { if params.len() == 0 && !needs_stack_results { return Self::with_bytes(initial_bytes); @@ -452,7 +491,7 @@ impl ABIParams { }, ); - let ptr_type = ptr_type_from_ptr_size(::word_bytes() as u8); + let ptr_type = ptr_type_from_ptr_size(::word_bytes()); // Handle stack results by specifying an extra, implicit last argument. if needs_stack_results { let (operand, bytes) = map(&ptr_type, stack_bytes); @@ -582,7 +621,7 @@ impl ABISig { /// Returns true if the signature has results on the stack. pub fn has_stack_results(&self) -> bool { - self.results.has_stack_results() + self.results.on_stack() } } diff --git a/winch/codegen/src/codegen/bounds.rs b/winch/codegen/src/codegen/bounds.rs new file mode 100644 index 000000000000..b788da731d28 --- /dev/null +++ b/winch/codegen/src/codegen/bounds.rs @@ -0,0 +1,220 @@ +//! Exposes heap bounds checks functionality for WebAssembly. +//! Bounds checks in WebAssembly are critical for safety, so extreme caution is +//! recommended when working on this area of Winch. +use super::env::{HeapData, HeapStyle}; +use crate::{ + abi::ABI, + codegen::CodeGenContext, + isa::reg::Reg, + masm::{IntCmpKind, MacroAssembler, OperandSize, RegImm, TrapCode}, + stack::TypedReg, +}; + +/// A newtype to represent an immediate offset argument for a heap access. +#[derive(Debug, Copy, Clone)] +pub(crate) struct ImmOffset(u32); + +impl ImmOffset { + /// Construct an [ImmOffset] from a u32. + pub fn from_u32(raw: u32) -> Self { + Self(raw) + } + + /// Return the underlying u32 value. + pub fn as_u32(&self) -> u32 { + self.0 + } +} + +/// An enum to represent the heap bounds. +#[derive(Debug, Copy, Clone)] +pub(crate) enum Bounds { + /// Static, known ahead-of-time. + Static(u64), + /// Dynamic. Loaded at runtime. + Dynamic(TypedReg), +} + +impl Bounds { + /// Construct a [Bounds] from a [TypedReg]. + pub fn from_typed_reg(tr: TypedReg) -> Self { + Self::Dynamic(tr) + } + + /// Construct a [Bounds] from a u64. + pub fn from_u64(raw: u64) -> Self { + Self::Static(raw) + } + + /// Return the underlying [TypedReg] value. + pub fn as_typed_reg(&self) -> TypedReg { + match self { + Self::Dynamic(tr) => *tr, + _ => panic!(), + } + } + + /// Return the underlying u64 value. + pub fn as_u64(&self) -> u64 { + match self { + Self::Static(v) => *v, + _ => panic!(), + } + } +} + +/// A newtype to represent a heap access index via a [TypedReg]. +#[derive(Debug, Copy, Clone)] +pub(crate) struct Index(TypedReg); + +impl Index { + /// Construct an [Index] from a [TypedReg]. + pub fn from_typed_reg(tr: TypedReg) -> Self { + Self(tr) + } + + /// Return the underlying + pub fn as_typed_reg(&self) -> TypedReg { + self.0 + } +} + +/// Loads the bounds of the dynamic heap. +pub(crate) fn load_dynamic_heap_bounds( + context: &mut CodeGenContext, + masm: &mut M, + heap: &HeapData, + ptr_size: OperandSize, +) -> Bounds +where + M: MacroAssembler, +{ + let dst = context.any_gpr(masm); + match (heap.max_size, &heap.style) { + // Constant size, no need to perform a load. + (Some(max_size), HeapStyle::Dynamic) if heap.min_size == max_size => { + masm.mov(RegImm::i64(max_size as i64), dst, ptr_size) + } + (_, HeapStyle::Dynamic) => { + let scratch = ::scratch_reg(); + let base = if let Some(offset) = heap.import_from { + let addr = masm.address_at_vmctx(offset); + masm.load_ptr(addr, scratch); + scratch + } else { + ::vmctx_reg() + }; + let addr = masm.address_at_reg(base, heap.current_length_offset); + masm.load_ptr(addr, dst); + } + (_, HeapStyle::Static { .. }) => unreachable!("Loading dynamic bounds of a static heap"), + } + + Bounds::from_typed_reg(TypedReg::new(heap.ty, dst)) +} + +/// This function ensures the following: +/// * The immediate offset and memory access size fit in a single u64. Given: +/// that the memory access size is a `u8`, we must guarantee that the immediate +/// offset will fit in a `u32`, making the result of their addition fit in a u64 +/// and overflow safe. +/// * Adjust the base index to account for the immediate offset via an unsigned +/// addition and check for overflow in case the previous condition is not met. +#[inline] +pub(crate) fn ensure_index_and_offset( + masm: &mut M, + index: Index, + offset: u64, + ptr_size: OperandSize, +) -> ImmOffset { + match u32::try_from(offset) { + // If the immediate offset fits in a u32, then we simply return. + Ok(offs) => ImmOffset::from_u32(offs), + // Else we adjust the index to be index = index + offset, including an + // overflow check, and return 0 as the offset. + Err(_) => { + masm.checked_uadd( + index.as_typed_reg().into(), + index.as_typed_reg().into(), + RegImm::i64(offset as i64), + ptr_size, + TrapCode::HeapOutOfBounds, + ); + + ImmOffset::from_u32(0) + } + } +} + +/// Performs the out-of-bounds check and returns the heap address if the access +/// criteria is in bounds. +pub(crate) fn load_heap_addr_checked( + masm: &mut M, + context: &mut CodeGenContext, + ptr_size: OperandSize, + heap: &HeapData, + enable_spectre_mitigation: bool, + bounds: Bounds, + index: Index, + offset: ImmOffset, + mut emit_check_condition: F, +) -> Reg +where + M: MacroAssembler, + F: FnMut(&mut M, Bounds, Index) -> IntCmpKind, +{ + let cmp_kind = emit_check_condition(masm, bounds, index); + + masm.trapif(cmp_kind, TrapCode::HeapOutOfBounds); + let addr = context.any_gpr(masm); + + load_heap_addr_unchecked(masm, heap, index, offset, addr, ptr_size); + if !enable_spectre_mitigation { + addr + } else { + // Conditionally assign 0 to the register holding the base address if + // the comparison kind is met. + let tmp = context.any_gpr(masm); + masm.mov(RegImm::i64(0), tmp, ptr_size); + let cmp_kind = emit_check_condition(masm, bounds, index); + masm.cmov(tmp, addr, cmp_kind, ptr_size); + context.free_reg(tmp); + addr + } +} + +/// Load the requested heap address into the specified destination register. +/// This function doesn't perform any bounds checks and assumes the caller +/// performed the right checks. +pub(crate) fn load_heap_addr_unchecked( + masm: &mut M, + heap: &HeapData, + index: Index, + offset: ImmOffset, + dst: Reg, + ptr_size: OperandSize, +) where + M: MacroAssembler, +{ + let base = if let Some(offset) = heap.import_from { + // If the WebAssembly memory is imported, load the address into + // the scratch register. + let scratch = ::scratch_reg(); + masm.load_ptr(masm.address_at_vmctx(offset), scratch); + scratch + } else { + // Else if the WebAssembly memory is defined in the current module, + // simply use the `VMContext` as the base for subsequent operations. + ::vmctx_reg() + }; + + // Load the base of the memory into the `addr` register. + masm.load_ptr(masm.address_at_reg(base, heap.offset), dst); + // Start by adding the index to the heap base addr. + let index_reg = index.as_typed_reg().reg; + masm.add(dst, dst, index_reg.into(), ptr_size); + + if offset.as_u32() > 0 { + masm.add(dst, dst, RegImm::i64(offset.as_u32() as i64), ptr_size); + } +} diff --git a/winch/codegen/src/codegen/builtin.rs b/winch/codegen/src/codegen/builtin.rs index 2293afc615fa..0294c2ffe265 100644 --- a/winch/codegen/src/codegen/builtin.rs +++ b/winch/codegen/src/codegen/builtin.rs @@ -7,7 +7,7 @@ use crate::{ }; use cranelift_codegen::ir::LibCall; use std::sync::Arc; -use wasmtime_environ::{BuiltinFunctionIndex, PtrSize, VMOffsets, WasmType}; +use wasmtime_environ::{BuiltinFunctionIndex, PtrSize, VMOffsets, WasmValType}; #[derive(Copy, Clone)] pub(crate) enum BuiltinType { @@ -73,7 +73,7 @@ macro_rules! declare_function_sig { /// The target pointer size. ptr_size: u8, /// The target pointer type, as a WebAssembly type. - ptr_type: WasmType, + ptr_type: WasmValType, /// The builtin functions base relative to the VMContext. base: u32, /// F32 Ceil. @@ -121,31 +121,31 @@ macro_rules! declare_function_sig { } } - fn pointer(&self) -> WasmType { + fn pointer(&self) -> WasmValType { self.ptr_type } - fn vmctx(&self) -> WasmType { + fn vmctx(&self) -> WasmValType { self.pointer() } - fn i32(&self) -> WasmType { - WasmType::I32 + fn i32(&self) -> WasmValType { + WasmValType::I32 } - fn f32(&self) -> WasmType { - WasmType::F32 + fn f32(&self) -> WasmValType { + WasmValType::F32 } - fn f64(&self) -> WasmType { - WasmType::F64 + fn f64(&self) -> WasmValType { + WasmValType::F64 } - fn i64(&self) -> WasmType { - WasmType::I64 + fn i64(&self) -> WasmValType { + WasmValType::I64 } - fn reference(&self) -> WasmType { + fn reference(&self) -> WasmValType { self.pointer() } diff --git a/winch/codegen/src/codegen/call.rs b/winch/codegen/src/codegen/call.rs index ba5e9f103950..8ae5d89a6a61 100644 --- a/winch/codegen/src/codegen/call.rs +++ b/winch/codegen/src/codegen/call.rs @@ -7,32 +7,29 @@ //! //! 1. [`Callee`] resolution. //! 2. Mapping of the [`Callee`] to the [`CalleeKind`]. -//! 3. Calculation of the stack space consumed by the call. +//! 3. Spilling the value stack. //! 4. Calculate the return area, for 1+ results. //! 5. Emission. //! 6. Stack space cleanup. //! -//! The stack space consumed by the function call; that is, -//! the sum of: +//! The stack space consumed by the function call is the amount +//! of space used by any memory entries in the value stack present +//! at the callsite (after spilling the value stack), that will be +//! used as arguments for the function call. Any memory values in the +//! value stack that are needed as part of the function +//! arguments will be consumed by the function call (either by +//! assigning those values to a register or by storing those +//! values in a memory location if the callee argument is on +//! the stack). +//! This could also be done when assigning arguments every time a +//! memory entry needs to be assigned to a particular location, +//! but doing so will emit more instructions (e.g. a pop per +//! argument that needs to be assigned); it's more efficient to +//! calculate the space used by those memory values and reclaim it +//! at once when cleaning up the stack after the call has been +//! emitted. //! -//! 1. The amount of stack space created by saving any live -//! registers at the callsite. -//! 2. The amount of space used by any memory entries in the value -//! stack present at the callsite, that will be used as -//! arguments for the function call. Any memory values in the -//! value stack that are needed as part of the function -//! arguments, will be consumed by the function call (either by -//! assigning those values to a register or by storing those -//! values to a memory location if the callee argument is on -//! the stack), so we track that stack space to reclaim it once -//! the function call has ended. This could also be done in -//! when assigning arguments everytime a memory entry needs to be assigned -//! to a particular location, but doing so, will incur in more -//! instructions (e.g. a pop per argument that needs to be -//! assigned); it's more efficient to track the space needed by -//! those memory values and reclaim it at once. -//! -//! The machine stack throghout the function call is as follows: +//! The machine stack throughout the function call is as follows: //! ┌──────────────────────────────────────────────────┐ //! │ │ //! │ 1 │ @@ -41,18 +38,18 @@ //! │ are used as function arguments. │ //! │ │ //! ├──────────────────────────────────────────────────┤ ---> The Wasm value stack at this point in time would look like: -//! │ │ [ Reg | Reg | Mem(offset) | Mem(offset) ] +//! │ │ [ Mem(offset) | Mem(offset) | Local(index) | Local(index) ] //! │ 2 │ -//! │ Stack space created by saving │ -//! │ any live registers at the callsite. │ +//! │ Stack space created by spilling locals and | +//! │ registers at the callsite. │ //! │ │ //! │ │ //! ├─────────────────────────────────────────────────┬┤ ---> The Wasm value stack at this point in time would look like: //! │ │ [ Mem(offset) | Mem(offset) | Mem(offset) | Mem(offset) ] //! │ │ Assuming that the callee takes 4 arguments, we calculate -//! │ │ 2 spilled registers + 2 memory values; all of which will be used -//! │ Stack space allocated for │ as arguments to the call via `assign_args`, thus the memory they represent is -//! │ the callee function arguments in the stack; │ is considered to be consumed by the call. +//! │ │ 4 memory values; all of which will be used as arguments to +//! │ Stack space allocated for │ the call via `assign_args`, thus the sum of the size of the +//! │ the callee function arguments in the stack; │ memory they represent is considered to be consumed by the call. //! │ represented by `arg_stack_space` │ //! │ │ //! │ │ @@ -60,18 +57,19 @@ //! └──────────────────────────────────────────────────┘ ------> Stack pointer when emitting the call use crate::{ - abi::{ABIOperand, ABIResultsData, ABISig, RetArea, ABI}, + abi::{ABIOperand, ABISig, RetArea, ABI}, codegen::{ ptr_type_from_ptr_size, BuiltinFunction, BuiltinType, Callee, CalleeInfo, CodeGenContext, TypedReg, }, - masm::{CalleeKind, MacroAssembler, OperandSize, SPOffset}, + masm::{CalleeKind, MacroAssembler, MemMoveDirection, OperandSize, SPOffset}, reg::Reg, + stack::Val, CallingConvention, }; use smallvec::SmallVec; use std::borrow::Cow; -use wasmtime_environ::{PtrSize, VMOffsets, WasmType}; +use wasmtime_environ::{PtrSize, VMOffsets, WasmValType}; /// All the information needed to emit a function call. #[derive(Copy, Clone)] @@ -81,10 +79,10 @@ impl FnCall { /// Orchestrates the emission of a function call: /// 1. Resolves the [`Callee`] through the given callback. /// 2. Maps the resolved [`Callee`] to the [`CalleeKind`]. - /// 3. Saves any live registers and calculates the stack space consumed - /// by the function call. + /// 3. Spills the value stack. /// 4. Creates the stack space needed for the return area. /// 5. Emits the call. + /// 6. Cleans up the stack space. pub fn emit( masm: &mut M, context: &mut CodeGenContext, @@ -94,15 +92,14 @@ impl FnCall { { let callee = resolve(context); let ptr_type = ptr_type_from_ptr_size(context.vmoffsets.ptr.size()); - let sig = Self::get_sig::(&callee, ptr_type); - let sig = sig.as_ref(); - let kind = Self::map(&context.vmoffsets, &callee, sig, context, masm); + let mut sig = Self::get_sig::(&callee, ptr_type); + let kind = Self::map(&context.vmoffsets, &callee, sig.as_ref(), context, masm); - let call_stack_space = Self::save(context, masm, &sig); + context.spill(masm); let ret_area = Self::make_ret_area(&sig, masm); let arg_stack_space = sig.params_stack_size(); let reserved_stack = masm.call(arg_stack_space, |masm| { - Self::assign(sig, ret_area.as_ref(), context, masm); + Self::assign(sig.as_ref(), ret_area.as_ref(), context, masm); kind }); @@ -111,30 +108,27 @@ impl FnCall { _ => {} } - Self::cleanup( - sig, - reserved_stack, - call_stack_space, - ret_area, - masm, - context, - ); + Self::cleanup(&mut sig, reserved_stack, ret_area, masm, context); } /// Calculates the return area for the callee, if any. fn make_ret_area(callee_sig: &ABISig, masm: &mut M) -> Option { - callee_sig.results.has_stack_results().then(|| { - masm.reserve_stack(callee_sig.results_stack_size()); - RetArea::sp(masm.sp_offset()) + callee_sig.has_stack_results().then(|| { + let base = masm.sp_offset().as_u32(); + let end = base + callee_sig.results_stack_size(); + if end > base { + masm.reserve_stack(end - base); + } + RetArea::sp(SPOffset::from_u32(end)) }) } /// Derive the [`ABISig`] for a particular [`Callee`]. - fn get_sig(callee: &Callee, ptr_type: WasmType) -> Cow<'_, ABISig> { + fn get_sig(callee: &Callee, ptr_type: WasmValType) -> Cow<'_, ABISig> { match callee { Callee::Builtin(info) => Cow::Borrowed(info.sig()), Callee::Import(info) => { - let mut params: SmallVec<[WasmType; 6]> = + let mut params: SmallVec<[WasmValType; 6]> = SmallVec::with_capacity(info.ty.params().len() + 2); params.extend_from_slice(&[ptr_type, ptr_type]); params.extend_from_slice(info.ty.params()); @@ -306,56 +300,11 @@ impl FnCall { } } - /// Save any live registers prior to emitting the call. - // - // Here we perform a "spill" of the register entries - // in the Wasm value stack, we also count any memory - // values that will be used used as part of the callee - // arguments. Saving the live registers is done by - // emitting push operations for every `Reg` entry in - // the Wasm value stack. We do this to be compliant - // with Winch's internal ABI, in which all registers - // are treated as caller-saved. For more details, see - // [ABI]. - // - // The next few lines, partition the value stack into - // two sections: - // +------------------+--+--- (Stack top) - // | | | - // | | | 1. The top `n` elements, which are used for - // | | | function arguments; for which we save any - // | | | live registers, keeping track of the amount of registers - // +------------------+ | saved plus the amount of memory values consumed by the function call; - // | | | with this information we can later reclaim the space used by the function call. - // | | | - // +------------------+--+--- - // | | | 2. The rest of the items in the stack, for which - // | | | we only save any live registers. - // | | | - // +------------------+ | - fn save(context: &mut CodeGenContext, masm: &mut M, sig: &ABISig) -> u32 { - let callee_params = &sig.params_without_retptr(); - let stack = &context.stack; - match callee_params.len() { - 0 => { - let _ = context.save_live_registers_and_calculate_sizeof(masm, ..); - 0u32 - } - _ => { - assert!(stack.len() >= callee_params.len()); - let partition = stack.len().checked_sub(callee_params.len()).unwrap_or(0); - let _ = context.save_live_registers_and_calculate_sizeof(masm, 0..partition); - context.save_live_registers_and_calculate_sizeof(masm, partition..) - } - } - } - /// Cleanup stack space, handle multiple results, and free registers after /// emitting the call. fn cleanup( - sig: &ABISig, + sig: &mut Cow<'_, ABISig>, reserved_space: u32, - stack_consumed: u32, ret_area: Option, masm: &mut M, context: &mut CodeGenContext, @@ -364,6 +313,16 @@ impl FnCall { // which was allocated last. masm.free_stack(reserved_space); + // Drop params from value stack and calculate amount of machine stack + // space they consumed. + let mut stack_consumed = 0; + context.drop_last(sig.params.len_without_retptr(), |_regalloc, v| { + debug_assert!(v.is_mem() || v.is_const()); + if let Val::Memory(mem) = v { + stack_consumed += mem.slot.size; + } + }); + if let Some(ret_area) = ret_area { if stack_consumed > 0 { // Perform a memory move, by shuffling the result area to @@ -374,39 +333,29 @@ impl FnCall { let result_bytes = sig.results_stack_size(); debug_assert!(sp.as_u32() >= stack_consumed + result_bytes); let dst = SPOffset::from_u32(sp.as_u32() - stack_consumed); - masm.memmove(sp, dst, result_bytes); + masm.memmove(sp, dst, result_bytes, MemMoveDirection::LowToHigh); } }; // Free the bytes consumed by the call. masm.free_stack(stack_consumed); - // Only account for registers given that any memory entries - // consumed by the call (assigned to a register or to a stack - // slot) were freed by the previous call to - // `masm.free_stack`, so we only care about dropping them - // here. - // - // NOTE / TODO there's probably a path to getting rid of - // `save_live_registers_and_calculate_sizeof` and - // `call_stack_space`, making it a bit more obvious what's - // happening here. We could: - // - // * Modify the `spill` implementation so that it takes a - // filtering callback, to control which values the caller is - // interested in saving (e.g. save all if no function is provided) - // * Rely on the new implementation of `drop_last` to calcuate - // the stack memory entries consumed by the call and then free - // the calculated stack space. - context.drop_last(sig.params.len_without_retptr(), |regalloc, v| { - if v.is_reg() { - regalloc.free(v.unwrap_reg().into()); + if let Some(area) = ret_area { + debug_assert!(!area.is_uninit()); + if stack_consumed > 0 { + sig.to_mut() + .results + .set_ret_area(RetArea::sp(masm.sp_offset())); + } else { + // If theres a return area, and no memory was adjusted + // (memmoved), the offsets should be equal. + debug_assert_eq!(area.unwrap_sp(), masm.sp_offset()); + sig.to_mut().results.set_ret_area(area); } - }); - - let mut results_data = ABIResultsData::wrap(sig.results.clone()); - results_data.ret_area = ret_area; + } - context.push_abi_results(&results_data, masm); + context.push_abi_results(&sig.results, masm, |results, _, _| { + results.ret_area().copied() + }); } } diff --git a/winch/codegen/src/codegen/context.rs b/winch/codegen/src/codegen/context.rs index 8521630d1e42..7d62780670e6 100644 --- a/winch/codegen/src/codegen/context.rs +++ b/winch/codegen/src/codegen/context.rs @@ -1,8 +1,8 @@ -use wasmtime_environ::{VMOffsets, WasmHeapType, WasmType}; +use wasmtime_environ::{VMOffsets, WasmHeapType, WasmValType}; -use super::{CodeGen, ControlStackFrame}; +use super::ControlStackFrame; use crate::{ - abi::{ABIOperand, ABIResultsData, RetArea, ABI}, + abi::{ABIOperand, ABIResults, RetArea, ABI}, codegen::BuiltinFunctions, frame::Frame, isa::reg::RegClass, @@ -11,7 +11,6 @@ use crate::{ regalloc::RegAlloc, stack::{Stack, TypedReg, Val}, }; -use std::ops::RangeBounds; /// The code generation context. /// The code generation context is made up of three @@ -71,8 +70,8 @@ impl<'a, 'builtins> CodeGenContext<'a, 'builtins> { } /// Allocate a register for the given WebAssembly type. - pub fn reg_for_type(&mut self, ty: WasmType, masm: &mut M) -> Reg { - use WasmType::*; + pub fn reg_for_type(&mut self, ty: WasmValType, masm: &mut M) -> Reg { + use WasmValType::*; match ty { I32 | I64 => self.reg_for_class(RegClass::Int, masm), F32 | F64 => self.reg_for_class(RegClass::Float, masm), @@ -98,6 +97,12 @@ impl<'a, 'builtins> CodeGenContext<'a, 'builtins> { self.reg_for_class(RegClass::Int, masm) } + /// Convenience wrapper around `CodeGenContext::reg_for_class`, to + /// request the next available floating point register. + pub fn any_fpr(&mut self, masm: &mut M) -> Reg { + self.reg_for_class(RegClass::Float, masm) + } + /// Executes the provided function, guaranteeing that the specified set of /// registers, if any, remain unallocatable throughout the function's /// execution. @@ -157,7 +162,7 @@ impl<'a, 'builtins> CodeGenContext<'a, 'builtins> { if val.is_mem() { let mem = val.unwrap_mem(); - debug_assert!(mem.slot.offset.as_u32() == masm.sp_offset().as_u32()); + debug_assert_eq!(mem.slot.offset.as_u32(), masm.sp_offset().as_u32()); masm.pop(reg, val.ty().into()); } else { self.move_val_to_reg(&val, reg, masm); @@ -171,7 +176,7 @@ impl<'a, 'builtins> CodeGenContext<'a, 'builtins> { } /// Pops the value stack top and stores it at the specified address. - fn pop_to_addr(&mut self, masm: &mut M, addr: M::Address) { + pub fn pop_to_addr(&mut self, masm: &mut M, addr: M::Address) { let val = self.stack.pop().expect("a value at stack top"); let size: OperandSize = val.ty().into(); match val { @@ -216,7 +221,7 @@ impl<'a, 'builtins> CodeGenContext<'a, 'builtins> { .get_local(local.index) .unwrap_or_else(|| panic!("invalid local at index = {}", local.index)); let addr = masm.local_address(&slot); - masm.load(addr, dst, slot.ty.into()); + masm.load(addr, dst, size); } Val::Memory(mem) => { let addr = masm.address_from_sp(mem.slot.offset); @@ -226,25 +231,29 @@ impl<'a, 'builtins> CodeGenContext<'a, 'builtins> { } /// Prepares arguments for emitting a unary operation. + /// + /// The `emit` function returns the `TypedReg` to put on the value stack. pub fn unop(&mut self, masm: &mut M, size: OperandSize, emit: &mut F) where - F: FnMut(&mut M, Reg, OperandSize), + F: FnMut(&mut M, Reg, OperandSize) -> TypedReg, M: MacroAssembler, { let typed_reg = self.pop_to_reg(masm, None); - emit(masm, typed_reg.reg, size); - self.stack.push(typed_reg.into()); + let dst = emit(masm, typed_reg.reg, size); + self.stack.push(dst.into()); } /// Prepares arguments for emitting a binary operation. + /// + /// The `emit` function returns the `TypedReg` to put on the value stack. pub fn binop(&mut self, masm: &mut M, size: OperandSize, mut emit: F) where - F: FnMut(&mut M, Reg, Reg, OperandSize), + F: FnMut(&mut M, Reg, Reg, OperandSize) -> TypedReg, M: MacroAssembler, { let src = self.pop_to_reg(masm, None); let dst = self.pop_to_reg(masm, None); - emit(masm, dst.reg, src.reg.into(), size); + let dst = emit(masm, dst.reg, src.reg.into(), size); self.free_reg(src); self.stack.push(dst.into()); } @@ -265,15 +274,17 @@ impl<'a, 'builtins> CodeGenContext<'a, 'builtins> { let dst = match size { OperandSize::S32 => TypedReg::i32(dst), OperandSize::S64 => TypedReg::i64(dst), - OperandSize::S128 => unreachable!(), + OperandSize::S8 | OperandSize::S16 | OperandSize::S128 => unreachable!(), }; self.stack.push(dst.into()); } /// Prepares arguments for emitting an i32 binary operation. + /// + /// The `emit` function returns the `TypedReg` to put on the value stack. pub fn i32_binop(&mut self, masm: &mut M, mut emit: F) where - F: FnMut(&mut M, Reg, RegImm, OperandSize), + F: FnMut(&mut M, Reg, RegImm, OperandSize) -> TypedReg, M: MacroAssembler, { let top = self.stack.peek().expect("value at stack top"); @@ -284,8 +295,8 @@ impl<'a, 'builtins> CodeGenContext<'a, 'builtins> { .pop_i32_const() .expect("i32 const value at stack top"); let typed_reg = self.pop_to_reg(masm, None); - emit(masm, typed_reg.reg, RegImm::i32(val), OperandSize::S32); - self.stack.push(typed_reg.into()); + let dst = emit(masm, typed_reg.reg, RegImm::i32(val), OperandSize::S32); + self.stack.push(dst.into()); } else { self.binop(masm, OperandSize::S32, |masm, dst, src, size| { emit(masm, dst, src.into(), size) @@ -294,9 +305,11 @@ impl<'a, 'builtins> CodeGenContext<'a, 'builtins> { } /// Prepares arguments for emitting an i64 binary operation. + /// + /// The `emit` function returns the `TypedReg` to put on the value stack. pub fn i64_binop(&mut self, masm: &mut M, mut emit: F) where - F: FnMut(&mut M, Reg, RegImm, OperandSize), + F: FnMut(&mut M, Reg, RegImm, OperandSize) -> TypedReg, M: MacroAssembler, { let top = self.stack.peek().expect("value at stack top"); @@ -306,42 +319,55 @@ impl<'a, 'builtins> CodeGenContext<'a, 'builtins> { .pop_i64_const() .expect("i64 const value at stack top"); let typed_reg = self.pop_to_reg(masm, None); - emit(masm, typed_reg.reg, RegImm::i64(val), OperandSize::S64); - self.stack.push(typed_reg.into()); + let dst = emit(masm, typed_reg.reg, RegImm::i64(val), OperandSize::S64); + self.stack.push(dst.into()); } else { self.binop(masm, OperandSize::S64, |masm, dst, src, size| { emit(masm, dst, src.into(), size) }); - } + }; } - /// Saves any live registers in the value stack in a particular - /// range defined by the caller. This is a specialization of the - /// spill function; made available for cases in which spilling - /// locals is not required, like for example for function calls in - /// which locals are not reachable by the callee. - /// - /// Returns the size in bytes of the specified range. - pub fn save_live_registers_and_calculate_sizeof(&mut self, masm: &mut M, range: R) -> u32 + /// Prepares arguments for emitting a convert operation. + pub fn convert_op(&mut self, masm: &mut M, dst_ty: WasmValType, mut emit: F) where - R: RangeBounds, + F: FnMut(&mut M, Reg, Reg, OperandSize), M: MacroAssembler, { - let mut size = 0u32; - for v in self.stack.inner_mut().range_mut(range) { - match v { - Val::Reg(TypedReg { reg, ty }) => { - let slot = masm.push(*reg, (*ty).into()); - self.regalloc.free(*reg); - *v = Val::mem(*ty, slot); - size += slot.size - } - Val::Memory(mem) => size += mem.slot.size, - _ => {} - } - } + let src = self.pop_to_reg(masm, None); + let dst = self.reg_for_type(dst_ty, masm); + let dst_size = match dst_ty { + WasmValType::I32 => OperandSize::S32, + WasmValType::I64 => OperandSize::S64, + WasmValType::F32 => OperandSize::S32, + WasmValType::F64 => OperandSize::S64, + WasmValType::V128 => unreachable!(), + WasmValType::Ref(_) => unreachable!(), + }; - size + emit(masm, dst, src.into(), dst_size); + + self.free_reg(src); + self.stack.push(TypedReg::new(dst_ty, dst).into()); + } + + /// Prepares arguments for emitting a convert operation with a temporary + /// register. + pub fn convert_op_with_tmp_reg( + &mut self, + masm: &mut M, + dst_ty: WasmValType, + tmp_reg_class: RegClass, + mut emit: F, + ) where + F: FnMut(&mut M, Reg, Reg, Reg, OperandSize), + M: MacroAssembler, + { + let tmp_gpr = self.reg_for_class(tmp_reg_class, masm); + self.convert_op(masm, dst_ty, |masm, dst, src, dst_size| { + emit(masm, dst, src, tmp_gpr, dst_size); + }); + self.free_reg(tmp_gpr); } /// Drops the last `n` elements of the stack, calling the provided @@ -355,10 +381,10 @@ impl<'a, 'builtins> CodeGenContext<'a, 'builtins> { let len = self.stack.len(); assert!(last <= len); let truncate = self.stack.len() - last; - let stack_mut = &mut self.stack.inner_mut(); + let stack_mut = self.stack.inner_mut(); // Invoke the callback in top-to-bottom order. - for v in stack_mut.range(truncate..).rev() { + for v in stack_mut[truncate..].into_iter().rev() { f(&mut self.regalloc, v) } stack_mut.truncate(truncate); @@ -385,27 +411,28 @@ impl<'a, 'builtins> CodeGenContext<'a, 'builtins> { M: MacroAssembler, F: FnMut(&mut M, &mut Self, &mut ControlStackFrame), { - let (target_value_stack, target_sp) = dest.base_stack_len_and_sp(); + let state = dest.stack_state(); + let target_offset = state.target_offset; + let base_offset = state.base_offset; // Invariant: The SP, must be greater or equal to the target // SP, given that we haven't popped any results by this point // yet. But it may happen in the callback. - assert!(masm.sp_offset().as_u32() >= target_sp.as_u32()); + assert!(masm.sp_offset().as_u32() >= base_offset.as_u32()); f(masm, self, dest); - // The following snippet, pops the stack pointer and value stack to - // ensure that it is correctly placed according to the expectations of - // the destination branch. + // The following snippet, pops the stack pointer to ensure that it + // is correctly placed according to the expectations of the destination + // branch. // // This is done in the context of unconditional jumps, as the machine - // stack and value stack might be left unbalanced at the jump site, due - // to register spills or extra values in the value stack. Note that in - // some cases the stack pointer offset might be already less than or - // equal to the original stack pointer offset registered when entering - // the destination control stack frame, which effectively means that - // when reaching the jump site no extra space was allocated similar to - // what would happen in a fall through in which we assume that the - // program has allocated and deallocated the right amount of stack - // space. + // stack might be left unbalanced at the jump site, due to register + // spills. Note that in some cases the stack pointer offset might be + // already less than or equal to the original stack pointer offset + // registered when entering the destination control stack frame, which + // effectively means that when reaching the jump site no extra space was + // allocated similar to what would happen in a fall through in which we + // assume that the program has allocated and deallocated the right + // amount of stack space. // // More generally speaking the current stack pointer will be less than // the original stack pointer offset in cases in which the top value in @@ -413,79 +440,43 @@ impl<'a, 'builtins> CodeGenContext<'a, 'builtins> { // return location according to the ABI (a register for single value // returns and a memory slot for 1+ returns). This could happen in the // callback invocation above if the callback invokes - // `CodeGenContext::pop_abi_results` (e.g. `br` instruction). - CodeGen::reset_stack(self, masm, target_value_stack, target_sp); + // `ControlStackFrame::pop_abi_results` (e.g. `br` instruction). + // + // After an unconditional jump, the compiler will enter in an + // unreachable state; instead of immediately truncating the value stack + // to the expected length of the destination branch, we let the + // reachability analysis code decide what should happen with the length + // of the value stack once reachability is actually restored. At that + // point, the right stack pointer offset will also be restored, which + // should match the contents of the value stack. + masm.ensure_sp_for_jump(target_offset); dest.set_as_target(); masm.jmp(*dest.label()); self.reachable = false; } - /// A combination of [Self::pop_abi_results] and [Self::push_abi_results] - /// to be used on conditional branches: br_if and br_table. - pub fn top_abi_results(&mut self, result: &ABIResultsData, masm: &mut M) { - self.pop_abi_results(result, masm); - self.push_abi_results(result, masm); - } - - /// Handles the emission of the ABI result. This function is used at the end - /// of a block or function to pop the results from the value stack into the - /// corresponding ABI result location. - pub fn pop_abi_results(&mut self, data: &ABIResultsData, masm: &mut M) { - let retptr = data - .results - .has_stack_results() - .then(|| match data.unwrap_ret_area() { - RetArea::Slot(slot) => { - let base = self - .without::<_, M, _>(data.results.regs(), masm, |cx, masm| cx.any_gpr(masm)); - let local_addr = masm.local_address(slot); - masm.load_ptr(local_addr, base); - Some(base) - } - _ => None, - }) - .flatten(); - - // Results are popped in reverse order, starting from registers, continuing - // to memory values in order to maintain the value stack ordering invariant. - // See comments in [ABIResults] for more details. - for operand in data.results.operands().iter().rev() { - match operand { - ABIOperand::Reg { reg, .. } => { - let TypedReg { reg, .. } = self.pop_to_reg(masm, Some(*reg)); - self.free_reg(reg); - } - ABIOperand::Stack { offset, .. } => { - let addr = match data.unwrap_ret_area() { - RetArea::SP(base) => { - let slot_offset = base.as_u32() - *offset; - masm.address_from_sp(SPOffset::from_u32(slot_offset)) - } - RetArea::Slot(_) => masm.address_at_reg(retptr.unwrap(), *offset), - }; - - self.pop_to_addr(masm, addr); - } - } - } - - if let Some(reg) = retptr { - self.free_reg(reg); - } - } + /// Push the ABI representation of the results stack. + pub fn push_abi_results( + &mut self, + results: &ABIResults, + masm: &mut M, + mut calculate_ret_area: F, + ) where + M: MacroAssembler, + F: FnMut(&ABIResults, &mut CodeGenContext, &mut M) -> Option, + { + let area = results + .on_stack() + .then(|| calculate_ret_area(&results, self, masm).unwrap()); - /// Push ABI results into the value stack. This function is used at the end - /// of a block or after a function call to push the corresponding ABI - /// results into the value stack. - pub fn push_abi_results(&mut self, data: &ABIResultsData, masm: &mut M) { - for operand in data.results.operands().iter() { + for operand in results.operands().iter() { match operand { ABIOperand::Reg { reg, ty, .. } => { assert!(self.regalloc.reg_available(*reg)); let typed_reg = TypedReg::new(*ty, self.reg(*reg, masm)); self.stack.push(typed_reg.into()); } - ABIOperand::Stack { ty, offset, size } => match data.unwrap_ret_area() { + ABIOperand::Stack { ty, offset, size } => match area.unwrap() { RetArea::SP(sp_offset) => { let slot = StackSlot::new(SPOffset::from_u32(sp_offset.as_u32() - offset), *size); @@ -501,6 +492,19 @@ impl<'a, 'builtins> CodeGenContext<'a, 'builtins> { } } + /// Truncates the value stack to the specified target. + /// This function is intended to only be used when restoring the code + /// generation's reachability state, when handling an unreachable end or + /// else. + pub fn truncate_stack_to(&mut self, target: usize) { + if self.stack.len() > target { + self.drop_last(self.stack.len() - target, |regalloc, val| match val { + Val::Reg(tr) => regalloc.free(tr.reg), + _ => {} + }); + } + } + /// Spill locals and registers to memory. // TODO: optimize the spill range; // At any point in the program, the stack might already contain memory diff --git a/winch/codegen/src/codegen/control.rs b/winch/codegen/src/codegen/control.rs index ae07d9556599..12da9b5248a1 100644 --- a/winch/codegen/src/codegen/control.rs +++ b/winch/codegen/src/codegen/control.rs @@ -1,39 +1,196 @@ //! Data structures for control flow emission. //! -//! As of the current implementation, Winch doesn't offer support for the -//! multi-value proposal, which in the context of control flow constructs it -//! means that blocks don't take any params and produce 0 or 1 return. The -//! intention is to implement support for multi-value across the compiler, when -//! that time comes, here are some general changes that will be needed for -//! control flow: -//! -//! * Consider having a copy of the block params on the side, and push them when -//! encountering an else or duplicate the block params upfront. If no else is -//! present, clean the extra copies from the stack. -//! -//! * Eagerly load the block params. Params can flow "downward" as the block -//! results in the case of an empty then or else block: -//! (module -//! (func (export "params") (param i32) (result i32) -//! (i32.const 2) -//! (if (param i32) (result i32) (local.get 0) -//! (then)) -//! (i32.const 3) -//! (i32.add) -//! ) -//! -//! As a future optimization, we could perform a look ahead to the next -//! instruction when reaching any of the comparison instructions. If the next -//! instruction is a control instruction, we could avoid emitting +//! Winch currently doesn't apply any sort of optimizations to control flow, but +//! as a future optimization, for starters, we could perform a look ahead to the +//! next instruction when reaching any of the comparison instructions. If the +//! next instruction is a control instruction, we could avoid emitting //! a [`crate::masm::MacroAssembler::cmp_with_set`] and instead emit //! a conditional jump inline when emitting the control flow instruction. -use super::{CodeGenContext, MacroAssembler, OperandSize}; +use super::{CodeGenContext, OperandSize, Reg, TypedReg}; use crate::{ - abi::ABIResultsData, - codegen::env::BlockTypeInfo, - masm::{IntCmpKind, SPOffset}, + abi::{ABIOperand, ABIResults, ABISig, RetArea, ABI}, + masm::{IntCmpKind, MacroAssembler, MemMoveDirection, RegImm, SPOffset}, + stack::Val, + CallingConvention, }; use cranelift_codegen::MachLabel; +use wasmtime_environ::{WasmFuncType, WasmValType}; + +/// Categorization of the type of the block. +#[derive(Debug, Clone)] +pub(crate) enum BlockType { + /// Doesn't produce or consume any values. + Void, + /// Produces a single value. + Single(WasmValType), + /// Consumes multiple values and produces multiple values. + Func(WasmFuncType), + /// An already resolved ABI signature. + ABISig(ABISig), +} + +/// Holds all the information about the signature of the block. +#[derive(Debug, Clone)] +pub(crate) struct BlockSig { + /// The type of the block. + pub ty: BlockType, + /// ABI representation of the results of the block. + results: Option, + /// ABI representation of the params of the block interpreted as results. + params: Option, +} + +impl BlockSig { + /// Create a new [BlockSig]. + pub fn new(ty: BlockType) -> Self { + Self { + ty, + results: None, + params: None, + } + } + + /// Create a new [BlockSig] from an [ABISig]. + pub fn from_sig(sig: ABISig) -> Self { + Self { + ty: BlockType::sig(sig), + results: None, + params: None, + } + } + + /// Return the ABI representation of the results of the block. + /// This method will lazily initialize the results if not present. + pub fn results(&mut self) -> &mut ABIResults + where + M: MacroAssembler, + { + if self.ty.is_sig() { + return match &mut self.ty { + BlockType::ABISig(sig) => &mut sig.results, + _ => unreachable!(), + }; + } + + if self.results.is_some() { + return self.results.as_mut().unwrap(); + } + + let results = match &self.ty { + BlockType::Void => ::abi_results(&[], &CallingConvention::Default), + BlockType::Single(ty) => { + ::abi_results(&[*ty], &CallingConvention::Default) + } + BlockType::Func(f) => { + ::abi_results(f.returns(), &CallingConvention::Default) + } + BlockType::ABISig(_) => unreachable!(), + }; + + self.results = Some(results); + self.results.as_mut().unwrap() + } + + /// Construct an ABI result representation of the params of the block. + /// This is needed for loops and for handling cases in which params flow as + /// the block's results, i.e. in the presence of an empty then or else. + pub fn params(&mut self) -> &mut ABIResults + where + M: MacroAssembler, + { + if self.params.is_some() { + return self.params.as_mut().unwrap(); + } + + let params_as_results = match &self.ty { + BlockType::Void | BlockType::Single(_) => { + ::abi_results(&[], &CallingConvention::Default) + } + BlockType::Func(f) => { + ::abi_results(f.params(), &CallingConvention::Default) + } + // Once we have created a block type from a known signature, we + // can't modify its meaning. This should only be used for the + // function body block, in which case there's no need for treating + // params as results. + BlockType::ABISig(_) => unreachable!(), + }; + + self.params = Some(params_as_results); + self.params.as_mut().unwrap() + } + + /// Returns the signature param count. + pub fn param_count(&self) -> usize { + match &self.ty { + BlockType::Void | BlockType::Single(_) => 0, + BlockType::Func(f) => f.params().len(), + BlockType::ABISig(sig) => sig.params_without_retptr().len(), + } + } + + /// Returns the signature return count. + pub fn return_count(&self) -> usize { + match &self.ty { + BlockType::Void => 0, + BlockType::Single(_) => 1, + BlockType::Func(f) => f.returns().len(), + BlockType::ABISig(sig) => sig.results().len(), + } + } +} + +impl BlockType { + /// Create a [BlockType::Void]. + pub fn void() -> Self { + Self::Void + } + + /// Create a [BlockType::Single] from the given [WasmType]. + pub fn single(ty: WasmValType) -> Self { + Self::Single(ty) + } + + /// Create a [BlockType::Func] from the given [WasmFuncType]. + pub fn func(ty: WasmFuncType) -> Self { + Self::Func(ty) + } + + /// Create a [BlockType::ABISig]. + pub fn sig(sig: ABISig) -> Self { + Self::ABISig(sig) + } + + /// Returns true if the type of the block is [BlockType::ABISig]. + pub fn is_sig(&self) -> bool { + match self { + Self::ABISig(_) => true, + _ => false, + } + } +} + +/// The expected value and machine stack state when entering and exiting the block. +#[derive(Debug, Default, Copy, Clone)] +pub(crate) struct StackState { + /// The base stack pointer offset. + /// This offset is set when entering the block, after saving any live + /// registers and locals. + /// It is calcuated by substracting the size, in bytes, of any block params + /// to the current stack pointer offset. + pub base_offset: SPOffset, + /// The target stack pointer offset. + /// This offset is calculated by adding the size of the stack results + /// to the base stack pointer offset. + pub target_offset: SPOffset, + /// The base length of the value stack when entering the block. + /// Which is the current length of the value stack minus any block parameters. + pub base_len: usize, + /// The target length of the value stack when exiting the block. + /// Calculate by adding the number of results to the base value stack + /// length. + pub target_len: usize, +} /// Holds the all the metdata to support the emission /// of control flow instructions. @@ -44,42 +201,30 @@ pub(crate) enum ControlStackFrame { cont: MachLabel, /// The exit label of the block. exit: MachLabel, - /// Data about the block's results. - results_data: ABIResultsData, - /// Information about the parameters and returns of the block. - block_type_info: BlockTypeInfo, - /// The length of the value stack at the beginning of the If. - base_stack_len: usize, - /// The stack pointer offset at the beginning of the If. - base_sp: SPOffset, + /// The signature of the block. + sig: BlockSig, + /// The stack state of the block. + stack_state: StackState, /// Local reachability state when entering the block. reachable: bool, }, Else { /// The exit label of the block. exit: MachLabel, - /// Data about the block's results. - results_data: ABIResultsData, - /// Information about the parameters and returns of the block. - block_type_info: BlockTypeInfo, - /// The length of the value stack at the beginning of the Else. - base_stack_len: usize, - /// The stack pointer offset at the beginning of the Else. - base_sp: SPOffset, + /// The signature of the block. + sig: BlockSig, + /// The stack state of the block. + stack_state: StackState, /// Local reachability state when entering the block. reachable: bool, }, Block { /// The block exit label. exit: MachLabel, - /// The length of the value stack at the beginning of the block. - base_stack_len: usize, - /// Data about the block's results. - results_data: ABIResultsData, - /// Information about the parameters and returns of the block. - block_type_info: BlockTypeInfo, - /// The stack pointer offset at the beginning of the Block. - base_sp: SPOffset, + /// The signature of the block. + sig: BlockSig, + /// The stack state of the block. + stack_state: StackState, /// Exit state of the block. /// /// This flag is used to dertermine if a block is a branch @@ -90,69 +235,43 @@ pub(crate) enum ControlStackFrame { Loop { /// The start of the Loop. head: MachLabel, - /// The length of the value stack at the beginning of the Loop. - base_stack_len: usize, - /// The stack pointer offset at the beginning of the Loop. - base_sp: SPOffset, - /// Information about the parameters and returns of the block. - block_type_info: BlockTypeInfo, + /// The stack state of the block. + stack_state: StackState, + /// The signature of the block. + sig: BlockSig, }, } impl ControlStackFrame { /// Returns [`ControlStackFrame`] for an if. pub fn r#if( - results_data: ABIResultsData, - block_type_info: BlockTypeInfo, + sig: BlockSig, masm: &mut M, context: &mut CodeGenContext, ) -> Self { let mut control = Self::If { cont: masm.get_label(), exit: masm.get_label(), - results_data, - block_type_info, + sig, reachable: context.reachable, - base_stack_len: 0, - base_sp: SPOffset::from_u32(0), + stack_state: Default::default(), }; control.emit(masm, context); control } - /// Creates a block that represents the base - /// block for the function body. - pub fn function_body_block( - results_data: ABIResultsData, - block_type_info: BlockTypeInfo, - masm: &mut M, - context: &mut CodeGenContext, - ) -> Self { - Self::Block { - base_stack_len: context.stack.len(), - results_data, - block_type_info, - is_branch_target: false, - exit: masm.get_label(), - base_sp: masm.sp_offset(), - } - } - /// Returns [`ControlStackFrame`] for a block. pub fn block( - results_data: ABIResultsData, - block_type_info: BlockTypeInfo, + sig: BlockSig, masm: &mut M, context: &mut CodeGenContext, ) -> Self { let mut control = Self::Block { - base_stack_len: 0, - results_data, - block_type_info, + sig, is_branch_target: false, exit: masm.get_label(), - base_sp: SPOffset::from_u32(0), + stack_state: Default::default(), }; control.emit(masm, context); @@ -161,15 +280,14 @@ impl ControlStackFrame { /// Returns [`ControlStackFrame`] for a loop. pub fn r#loop( - block_type_info: BlockTypeInfo, + sig: BlockSig, masm: &mut M, context: &mut CodeGenContext, ) -> Self { let mut control = Self::Loop { - base_stack_len: 0, - block_type_info, + stack_state: Default::default(), + sig, head: masm.get_label(), - base_sp: SPOffset::from_u32(0), }; control.emit(masm, context); @@ -177,49 +295,123 @@ impl ControlStackFrame { } fn init(&mut self, masm: &mut M, context: &mut CodeGenContext) { - assert!(self.block_type_info().param_count == 0); - assert!(self.block_type_info().result_count < 2); - // Save any live registers and locals. - context.spill(masm); - self.set_base_stack_len(context.stack.len()); - self.set_base_sp(masm.sp_offset()); - } - - fn set_base_stack_len(&mut self, len: usize) { - use ControlStackFrame::*; + self.calculate_stack_state(context, masm); + // If the block has stack results, immediately resolve the return area + // base. + if self.results::().on_stack() { + let results_base = self.stack_state().target_offset; + self.results::().set_ret_area(RetArea::sp(results_base)); + } - match self { - If { base_stack_len, .. } - | Block { base_stack_len, .. } - | Loop { base_stack_len, .. } => *base_stack_len = len, - _ => {} + if self.is_if() || self.is_loop() { + // Preemptively handle block params as results so that the params + // are correctly placed in memory. This is especially + // important for control flow joins with empty blocks: + // + //(module + // (func (export "params") (param i32) (result i32) + // (i32.const 2) + // (if (param i32) (result i32) (local.get 0) + // (then)) + // (i32.const 3) + // (i32.add) + // ) + //) + let base_offset = self.stack_state().base_offset; + if self.params::().on_stack() { + let offset = base_offset.as_u32() + self.params::().size(); + self.params::() + .set_ret_area(RetArea::sp(SPOffset::from_u32(offset))); + } + Self::top_abi_results_impl( + self.params::(), + context, + masm, + |params: &ABIResults, _, _| params.ret_area().copied(), + ); } } - fn set_base_sp(&mut self, base: SPOffset) { + /// Calculates the [StackState] of the block. + fn calculate_stack_state( + &mut self, + context: &mut CodeGenContext, + masm: &mut M, + ) { use ControlStackFrame::*; + let sig = self.sig(); + // If the block type contains a full [ABISig], do not take into account + // the params, since these are the params of the function that is + // currently being compiled and the value stack doesn't currently + // contain any values anyway. + let param_count = if sig.ty.is_sig() { + 0 + } else { + sig.param_count() + }; + let return_count = sig.return_count(); + debug_assert!(context.stack.len() >= param_count); + let results_size = self.results::().size(); + + // Save any live registers and locals. + context.spill(masm); + + let base_len = context.stack.len() - param_count; + let stack_consumed = context.stack.sizeof(param_count); + let current_sp = masm.sp_offset(); + let base_offset = SPOffset::from_u32(current_sp.as_u32() - stack_consumed); match self { - If { base_sp, .. } | Block { base_sp, .. } | Loop { base_sp, .. } => *base_sp = base, + If { stack_state, .. } | Block { stack_state, .. } | Loop { stack_state, .. } => { + stack_state.base_offset = base_offset; + stack_state.base_len = base_len; + stack_state.target_offset = SPOffset::from_u32(base_offset.as_u32() + results_size); + stack_state.target_len = base_len + return_count; + } _ => {} } } - fn block_type_info(&mut self) -> &BlockTypeInfo { + /// This function ensures that the state of the -- machine and value -- + /// stack is the right one when reaching a control frame branch in which + /// reachability is restored or when reaching the end of a function in an + /// unreachable state. This function is intended to be called when handling + /// an unreachable else or end. + // + /// This function will truncate the value stack to the the base length of + /// the control frame and will also set the stack pointer offset to reflect + /// the offset expected by the target branch. + /// + // NB: This method is assumed to be called *before* pushing any block + // results to the value stack, so that any excess values are cleaned up. + pub fn ensure_stack_state( + &mut self, + masm: &mut M, + context: &mut CodeGenContext, + ) { + let state = self.stack_state(); + // This assumes that at jump sites, the machine stack poiter will be + // adjusted to match the expectations of the target branch (e.g. + // `target_offset`); after performing the jump, the MacroAssembler + // implementation will soft-reset the stack pointer offset to its + // original offset, ensure that other parts of the program have access + // to the right offset, this is especially important in conditional + // branches. + // When restoring reachability we ensure that the MacroAssembler offset + // is set to match the expectations of the target branch, similar to how + // the machine stack pointer was adjusted at jump sites. + masm.reset_stack_pointer(state.target_offset); + // We use the base length, because this function is assumed to be called + // *before* pushing any results to the value stack. This way, any excess + // values will be discarded. + context.truncate_stack_to(state.base_len); + } + + /// Return the type information of the block. + pub fn sig(&self) -> &BlockSig { use ControlStackFrame::*; match self { - If { - block_type_info, .. - } - | Else { - block_type_info, .. - } - | Loop { - block_type_info, .. - } - | Block { - block_type_info, .. - } => block_type_info, + If { sig, .. } | Else { sig, .. } | Loop { sig, .. } | Block { sig, .. } => sig, } } @@ -234,7 +426,13 @@ impl ControlStackFrame { match *self { If { cont, .. } => { // Pop the condition value. - let top = context.pop_to_reg(masm, None); + // Because in the case of Self::If, Self::init, will top the + // branch params, we exclude any result registers from being + // used as the branch test. + let top = + context.without::<_, _, _>(self.params::().regs(), masm, |cx, masm| { + cx.pop_to_reg(masm, None) + }); self.init(masm, context); masm.branch( IntCmpKind::Eq, @@ -257,57 +455,53 @@ impl ControlStackFrame { /// Handles the else branch if the current control stack frame is /// [`ControlStackFrame::If`]. pub fn emit_else(&mut self, masm: &mut M, context: &mut CodeGenContext) { - use ControlStackFrame::*; - match self { - If { - results_data, - base_stack_len, - exit, - block_type_info, - .. - } => { - assert!( - (*base_stack_len + block_type_info.result_count - block_type_info.param_count) - == context.stack.len() - ); - // Before emitting an unconditional jump to the exit branch, - // we handle the result of the if-then block. - context.pop_abi_results(results_data, masm); - // Before binding the else branch, we emit the jump to the end - // label. - masm.jmp(*exit); - // Bind the else branch. - self.bind_else(masm, context.reachable); - } - _ => unreachable!(), - } + debug_assert!(self.is_if()); + let state = self.stack_state(); + + debug_assert_eq!(state.target_len, context.stack.len()); + self.pop_abi_results(context, masm, |results, _, _| results.ret_area().copied()); + masm.jmp(*self.exit_label().unwrap()); + self.bind_else(masm, context); } /// Binds the else branch label and converts `self` to /// [`ControlStackFrame::Else`]. - pub fn bind_else(&mut self, masm: &mut M, reachable: bool) { + pub fn bind_else(&mut self, masm: &mut M, context: &mut CodeGenContext) { use ControlStackFrame::*; match self { If { cont, - results_data, - block_type_info, - base_stack_len, - base_sp, + sig, + stack_state, exit, .. } => { // Bind the else branch. masm.bind(*cont); + // Push the abi results to the value stack, so that they are + // used as params for the else branch. At the beginning of the + // if block, any params are preemptively resolved as results; + // when reaching the else all params are already materialized as + // stack results. As part of ensuring the right state when + // entering the else branch, the following snippet also soft + // resets the stack pointer so that it matches the expectations + // of the else branch: the stack pointer is expected to be at + // the base stack pointer, plus the params stack size in bytes. + let params_size = sig.params::().size(); + context.push_abi_results::(sig.params::(), masm, |params, _, _| { + params.ret_area().copied() + }); + masm.reset_stack_pointer(SPOffset::from_u32( + stack_state.base_offset.as_u32() + params_size, + )); + // Update the stack control frame with an else control frame. *self = ControlStackFrame::Else { exit: *exit, - base_stack_len: *base_stack_len, - reachable, - base_sp: *base_sp, - results_data: results_data.clone(), - block_type_info: *block_type_info, + stack_state: *stack_state, + reachable: context.reachable, + sig: sig.clone(), }; } _ => unreachable!(), @@ -318,52 +512,22 @@ impl ControlStackFrame { pub fn emit_end(&mut self, masm: &mut M, context: &mut CodeGenContext) { use ControlStackFrame::*; match self { - If { - results_data, - base_stack_len, - block_type_info, - .. - } - | Else { - results_data, - base_stack_len, - block_type_info, - .. - } - | Block { - results_data, - base_stack_len, - block_type_info, - .. - } => { - assert!( - (*base_stack_len + block_type_info.result_count - block_type_info.param_count) - == context.stack.len() - ); + If { stack_state, .. } | Else { stack_state, .. } | Block { stack_state, .. } => { + debug_assert_eq!(stack_state.target_len, context.stack.len()); // Before binding the exit label, we handle the block results. - context.pop_abi_results(results_data, masm); + self.pop_abi_results(context, masm, |results, _, _| results.ret_area().copied()); self.bind_end(masm, context); } - Loop { - block_type_info, - base_stack_len, - .. - } => { - assert!( - (*base_stack_len + block_type_info.result_count - block_type_info.param_count) - == context.stack.len() - ); + Loop { stack_state, .. } => { + debug_assert_eq!(stack_state.target_len, context.stack.len()); } } } /// Binds the exit label of the current control stack frame and pushes the /// ABI results to the value stack. - pub fn bind_end(&self, masm: &mut M, context: &mut CodeGenContext) { - // Push the results to the value stack. - if let Some(data) = self.results() { - context.push_abi_results(data, masm); - } + pub fn bind_end(&mut self, masm: &mut M, context: &mut CodeGenContext) { + self.push_abi_results(context, masm); self.bind_exit_label(masm); } @@ -419,17 +583,344 @@ impl ControlStackFrame { /// Returns [`crate::abi::ABIResults`] of the control stack frame /// block. - pub fn results(&self) -> Option<&ABIResultsData> { + pub fn results(&mut self) -> &mut ABIResults + where + M: MacroAssembler, + { use ControlStackFrame::*; match self { - If { results_data, .. } | Else { results_data, .. } | Block { results_data, .. } => { - Some(results_data) + If { sig, .. } | Else { sig, .. } | Block { sig, .. } => sig.results::(), + Loop { sig, .. } => sig.params::(), + } + } + + /// Returns the block params interpreted as [crate::abi::ABIResults]. + pub fn params(&mut self) -> &mut ABIResults + where + M: MacroAssembler, + { + use ControlStackFrame::*; + match self { + If { sig, .. } | Else { sig, .. } | Block { sig, .. } | Loop { sig, .. } => { + sig.params::() } - Loop { .. } => None, } } + /// Orchestrates how blocks results are handled. + /// Results are handled in reverse order, starting from register results + /// continuing to memory values. This guarantees that the stack ordering + /// invariant is maintained. See [ABIResults] for more details. + /// + /// This function will iterate through each result and invoke the provided + /// callback if there are results on the stack. + /// + /// Calculating the return area involves ensuring that there's enough stack + /// space to store the block's results. To make the process of handling + /// multiple results easier, this function will save all live registers and + /// locals right after handling any register results. This will ensure that + /// the top `n` values in the value stack are correctly placed in the memory + /// locations corresponding to multiple stack results. Once the iteration + /// over all the results is done, the stack result area of the block will be + /// updated. + pub fn pop_abi_results( + &mut self, + context: &mut CodeGenContext, + masm: &mut M, + calculate_ret_area: F, + ) where + M: MacroAssembler, + F: FnMut(&ABIResults, &mut CodeGenContext, &mut M) -> Option, + { + Self::pop_abi_results_impl(self.results::(), context, masm, calculate_ret_area) + } + + /// Shared implementation for poppping the ABI results. + /// This is needed because, in some cases, params must be interpreted and + /// used as the results of the block. When emitting code at control flow + /// joins, the block params are interpreted as results, to ensure that they + /// can correctly "flow" as the results of the block. This is especially + /// important in the presence of empty then, else and loop blocks. This + /// interpretation is an internal detail of the control module, and having + /// a shared implementation allows the caller to decide how the + /// results should be interpreted. + pub fn pop_abi_results_impl( + results: &mut ABIResults, + context: &mut CodeGenContext, + masm: &mut M, + mut calculate_ret_area: F, + ) where + M: MacroAssembler, + F: FnMut(&ABIResults, &mut CodeGenContext, &mut M) -> Option, + { + let mut iter = results.operands().iter().rev().peekable(); + + while let Some(ABIOperand::Reg { reg, .. }) = iter.peek() { + let TypedReg { reg, .. } = context.pop_to_reg(masm, Some(*reg)); + context.free_reg(reg); + iter.next().unwrap(); + } + + let ret_area = calculate_ret_area(results, context, masm); + + let retptr = Self::maybe_load_retptr(ret_area.as_ref(), &results, context, masm); + if let Some(area) = ret_area { + if area.is_sp() { + Self::ensure_ret_area(&area, context, masm); + } + } + + if let Some(retptr) = retptr { + while let Some(ABIOperand::Stack { offset, .. }) = iter.peek() { + let addr = masm.address_at_reg(retptr, *offset); + context.pop_to_addr(masm, addr); + iter.next().unwrap(); + } + context.free_reg(retptr); + } + + if let Some(area) = ret_area { + if area.is_sp() { + Self::adjust_stack_results(area, results, context, masm); + } + } + } + + /// Convenience wrapper around [CodeGenContext::push_abi_results] using the + /// results of the current frame. + fn push_abi_results(&mut self, context: &mut CodeGenContext, masm: &mut M) + where + M: MacroAssembler, + { + context.push_abi_results(self.results::(), masm, |results, _, _| { + results.ret_area().copied() + }) + } + + /// Preemptively handles the ABI results of the current frame. + /// This function is meant to be used when emitting control flow with joins, + /// in which it's not possible to know at compile time which branch will be + /// taken. + pub fn top_abi_results( + &mut self, + context: &mut CodeGenContext, + masm: &mut M, + calculate_ret_area: F, + ) where + M: MacroAssembler, + F: FnMut(&ABIResults, &mut CodeGenContext, &mut M) -> Option, + { + Self::top_abi_results_impl::(self.results::(), context, masm, calculate_ret_area) + } + + /// Internal implementation of [Self::top_abi_results]. + /// See [Self::pop_abi_results_impl] on why an internal implementation is + /// needed. + fn top_abi_results_impl( + results: &mut ABIResults, + context: &mut CodeGenContext, + masm: &mut M, + mut calculate_ret_area: F, + ) where + M: MacroAssembler, + F: FnMut(&ABIResults, &mut CodeGenContext, &mut M) -> Option, + { + let mut area = None; + Self::pop_abi_results_impl::(results, context, masm, |r, context, masm| { + area = calculate_ret_area(r, context, masm); + area + }); + // Use the previously calculated area to ensure that the ret area is + // kept in sync between both operations. + context.push_abi_results::(results, masm, |_, _, _| area); + } + + // If the results on the stack are handled via the stack pointer, ensure + // that the stack results are correctly located. In general, since values in + // the value stack are spilled when exiting the block, the top `n` entries + // in the value stack, representing the `n` stack results of the block are + // almost correctly located. However, since constants are not + // spilled, their presence complicate block exits. For this reason, the + // last step for finalizing multiple block results involves: + // * Scanning the value stack from oldest to newest memory values and + // calculating the source and destination of each value, if the source + // is closer to the stack pointer (greater) than the destination, + // perform a memory move of the bytes to its destination, else stop, + // because the memory values are in place. + // * Scanning the value stack from newest to oldest and calculating the + // source and destination of each value, if the source is closer to the + // frame pointer (less) than the destination, perform a memory move of + // the bytes to its destination, else stop, because the memory values + // are in place. + // * Lastly, iterate over the top `n` elements of the value stack which + // and spill any constant values, placing them in their respective + // memory location. + // + // The implementation in Winch is inspired by how this is handled in + // SpiderMonkey's WebAssembly Baseline Compiler: + // https://wingolog.org/archives/2020/04/03/multi-value-webassembly-in-firefox-from-1-to-n + fn adjust_stack_results( + ret_area: RetArea, + results: &ABIResults, + context: &mut CodeGenContext, + masm: &mut M, + ) where + M: MacroAssembler, + { + debug_assert!(ret_area.is_sp()); + let results_offset = ret_area.unwrap_sp(); + + // Start iterating from memory values that are closer to the + // frame pointer (oldest entries first). + for (i, operand) in results.operands().iter().enumerate() { + if operand.is_reg() { + break; + } + + let value_index = (context.stack.len() - results.stack_operands_len()) + i; + let val = context.stack.inner()[value_index]; + + match (val, operand) { + (Val::Memory(mem), ABIOperand::Stack { offset, size, .. }) => { + let dst = results_offset.as_u32() - *offset; + let src = mem.slot.offset; + + // Values are moved from lower (SP) to higher (FP) + // addresses. + if src.as_u32() <= dst { + break; + } + + masm.memmove( + src, + SPOffset::from_u32(dst), + *size, + MemMoveDirection::LowToHigh, + ); + } + _ => {} + } + } + + // Start iterating from memory values that are closer to the + // stack pointer (newest entries first). + for (i, operand) in results + .operands() + .iter() + .rev() + // Skip any register results. + .skip(results.regs().len()) + .enumerate() + { + let value_index = context.stack.len() - i - 1; + let val = context.stack.inner()[value_index]; + match (val, operand) { + (Val::Memory(mem), ABIOperand::Stack { offset, size, .. }) => { + let dst = results_offset.as_u32() - *offset; + let src = mem.slot.offset; + + // Values are moved from higher (FP) to lower (SP) + // addresses. + if src.as_u32() >= dst { + break; + } + + masm.memmove( + src, + SPOffset::from_u32(dst), + *size, + MemMoveDirection::HighToLow, + ); + } + _ => {} + } + } + + // Finally store any constants in the value stack in their respective + // locations. + for operand in results + .operands() + .iter() + .take(results.stack_operands_len()) + .rev() + { + // If we want to do this, we should start from newest, essentially from top to + // bottom in the iteration of the operands. + match (operand, context.stack.peek().unwrap()) { + (ABIOperand::Stack { ty, offset, .. }, Val::I32(v)) => { + let addr = + masm.address_from_sp(SPOffset::from_u32(results_offset.as_u32() - *offset)); + masm.store(RegImm::i32(*v), addr, (*ty).into()); + } + (ABIOperand::Stack { ty, offset, .. }, Val::I64(v)) => { + let addr = + masm.address_from_sp(SPOffset::from_u32(results_offset.as_u32() - *offset)); + masm.store(RegImm::i64(*v), addr, (*ty).into()); + } + (ABIOperand::Stack { ty, offset, .. }, Val::F32(v)) => { + let addr = + masm.address_from_sp(SPOffset::from_u32(results_offset.as_u32() - *offset)); + masm.store(RegImm::f32(v.bits()), addr, (*ty).into()); + } + (ABIOperand::Stack { ty, offset, .. }, Val::F64(v)) => { + let addr = + masm.address_from_sp(SPOffset::from_u32(results_offset.as_u32() - *offset)); + masm.store(RegImm::f64(v.bits()), addr, (*ty).into()); + } + (_, v) => debug_assert!(v.is_mem()), + } + + let _ = context.stack.pop().unwrap(); + } + + // Adjust any excess stack space: the stack space after handling the + // block's results should be the exact amount needed by the return area. + debug_assert!(masm.sp_offset().as_u32() >= results_offset.as_u32()); + masm.free_stack(masm.sp_offset().as_u32() - results_offset.as_u32()); + } + + /// Ensures that there is enough space for return values on the stack. + /// This function is called at the end of all blocks and when branching from + /// within blocks. + fn ensure_ret_area(ret_area: &RetArea, context: &mut CodeGenContext, masm: &mut M) + where + M: MacroAssembler, + { + debug_assert!(ret_area.is_sp()); + // Save any live registers and locals when exiting the block to ensure + // that the respective values are correctly located in memory. + // See [Self::adjust_stack_results] for more details. + context.spill(masm); + if ret_area.unwrap_sp() > masm.sp_offset() { + masm.reserve_stack(ret_area.unwrap_sp().as_u32() - masm.sp_offset().as_u32()) + } + } + + /// Loads the return pointer, if it exists, into the next available register. + fn maybe_load_retptr( + ret_area: Option<&RetArea>, + results: &ABIResults, + context: &mut CodeGenContext, + masm: &mut M, + ) -> Option + where + M: MacroAssembler, + { + ret_area + .map(|area| match area { + RetArea::Slot(slot) => { + let base = context + .without::<_, M, _>(results.regs(), masm, |cx, masm| cx.any_gpr(masm)); + let local_addr = masm.local_address(&slot); + masm.load_ptr(local_addr, base); + Some(base) + } + _ => None, + }) + .flatten() + } + /// This function is used at the end of unreachable code handling /// to determine if the reachability status should be updated. pub fn is_next_sequence_reachable(&self) -> bool { @@ -452,38 +943,30 @@ impl ControlStackFrame { } } - /// Returns the value stack length and stack pointer offset of the - /// control frame registered at entry. - pub fn base_stack_len_and_sp(&self) -> (usize, SPOffset) { + /// Returns a reference to the [StackState] of the block. + pub fn stack_state(&self) -> &StackState { use ControlStackFrame::*; match self { - If { - base_sp, - base_stack_len, - .. - } - | Else { - base_sp, - base_stack_len, - .. - } - | Block { - base_sp, - base_stack_len, - .. - } - | Loop { - base_sp, - base_stack_len, - .. - } => (*base_stack_len, *base_sp), + If { stack_state, .. } + | Else { stack_state, .. } + | Block { stack_state, .. } + | Loop { stack_state, .. } => stack_state, } } - /// Resolves how to handle results when the current frame is a - /// jump target Notably in the case of loops we don't take into - /// account the frame's results. - pub fn as_target_results(&self) -> Option<&ABIResultsData> { - self.results() + /// Returns true if the current frame is [ControlStackFrame::If]. + pub fn is_if(&self) -> bool { + match self { + Self::If { .. } => true, + _ => false, + } + } + + /// Returns true if the current frame is [ControlStackFrame::Loop]. + pub fn is_loop(&self) -> bool { + match self { + Self::Loop { .. } => true, + _ => false, + } } } diff --git a/winch/codegen/src/codegen/env.rs b/winch/codegen/src/codegen/env.rs index 77be7b924ba2..3c1bdf2c0521 100644 --- a/winch/codegen/src/codegen/env.rs +++ b/winch/codegen/src/codegen/env.rs @@ -1,7 +1,6 @@ use crate::{ - abi::{ABIResults, ABIResultsData}, - codegen::{BuiltinFunction, OperandSize, ABI}, - CallingConvention, + codegen::{control, BlockSig, BuiltinFunction, OperandSize}, + isa::TargetIsa, }; use std::collections::{ hash_map::Entry::{Occupied, Vacant}, @@ -9,8 +8,9 @@ use std::collections::{ }; use wasmparser::BlockType; use wasmtime_environ::{ - FuncIndex, GlobalIndex, ModuleTranslation, ModuleTypes, PtrSize, TableIndex, TablePlan, - TypeConvert, TypeIndex, VMOffsets, WasmFuncType, WasmType, + FuncIndex, GlobalIndex, MemoryIndex, MemoryPlan, MemoryStyle, ModuleTranslation, + ModuleTypesBuilder, PtrSize, TableIndex, TablePlan, TypeConvert, TypeIndex, VMOffsets, + WasmFuncType, WasmHeapType, WasmValType, WASM_PAGE_SIZE, }; /// Table metadata. @@ -20,15 +20,56 @@ pub struct TableData { pub offset: u32, /// The offset to the current elements field. pub current_elems_offset: u32, - /// If the table is imported, return the base - /// offset of the `from` field in `VMTableImport`. - pub base: Option, + /// If the table is imported, this field contains the offset to locate the + /// base of the table data. + pub import_from: Option, /// The size of the table elements. pub(crate) element_size: OperandSize, /// The size of the current elements field. pub(crate) current_elements_size: OperandSize, } +/// Style of the heap. +#[derive(Debug, Copy, Clone)] +pub enum HeapStyle { + /// Static heap, which has a fixed address. + Static { + /// The heap bound in bytes, not including the bytes for the offset + /// guard pages. + bound: u64, + }, + /// Dynamic heap, which can be relocated to a different address when grown. + /// The bounds are calculated at runtime on every access. + Dynamic, +} + +/// Heap metadata. +/// +/// Heaps represent a WebAssembly linear memory. +#[derive(Debug, Copy, Clone)] +pub struct HeapData { + /// The offset to the base of the heap. + /// Relative to the VMContext pointer if the WebAssembly memory is locally + /// defined. Else this is relative to the location of the imported WebAssembly + /// memory location. + pub offset: u32, + /// The offset to the current length field. + pub current_length_offset: u32, + /// If the WebAssembly memory is imported, this field contains the offset to locate the + /// base of the heap. + pub import_from: Option, + /// The memory type (32 or 64). + pub ty: WasmValType, + /// The style of the heap. + pub style: HeapStyle, + /// The guaranteed minimum size, in bytes. + pub min_size: u64, + /// The maximum heap size in bytes. + pub max_size: Option, + /// Size in bytes of the offset guard pages, located after the heap bounds. + pub offset_guard_size: u64, +} + /// A function callee. /// It categorizes how the callee should be treated /// when performing the call. @@ -54,34 +95,6 @@ pub struct CalleeInfo { pub index: FuncIndex, } -/// Holds information about a block's param and return count. -#[derive(Default, Debug, Copy, Clone)] -pub(crate) struct BlockTypeInfo { - /// Parameter count. - pub param_count: usize, - /// Result count. - pub result_count: usize, -} - -impl BlockTypeInfo { - /// Creates a [`BlockTypeInfo`] with one result. - pub fn with_single_result() -> Self { - Self { - param_count: 0, - result_count: 1, - } - } - - /// Creates a new [`BlockTypeInfo`] with the given param and result - /// count. - pub fn new(params: usize, results: usize) -> Self { - Self { - param_count: params, - result_count: results, - } - } -} - /// The function environment. /// /// Contains all information about the module and runtime that is accessible to @@ -92,14 +105,18 @@ pub struct FuncEnv<'a, 'translation: 'a, 'data: 'translation, P: PtrSize> { /// Metadata about the translation process of a WebAssembly module. pub translation: &'translation ModuleTranslation<'data>, /// The module's function types. - pub types: &'translation ModuleTypes, + pub types: &'translation ModuleTypesBuilder, /// Track resolved table information. resolved_tables: HashMap, + /// Track resolved heap information. + resolved_heaps: HashMap, + /// Whether or not to enable Spectre mitigation on heap bounds checks. + heap_access_spectre_mitigation: bool, } -pub fn ptr_type_from_ptr_size(size: u8) -> WasmType { +pub fn ptr_type_from_ptr_size(size: u8) -> WasmValType { (size == 8) - .then(|| WasmType::I64) + .then(|| WasmValType::I64) .unwrap_or_else(|| unimplemented!("Support for non-64-bit architectures")) } @@ -108,18 +125,21 @@ impl<'a, 'translation, 'data, P: PtrSize> FuncEnv<'a, 'translation, 'data, P> { pub fn new( vmoffsets: &'a VMOffsets

, translation: &'translation ModuleTranslation<'data>, - types: &'translation ModuleTypes, + types: &'translation ModuleTypesBuilder, + isa: &dyn TargetIsa, ) -> Self { Self { vmoffsets, translation, types, resolved_tables: HashMap::new(), + resolved_heaps: HashMap::new(), + heap_access_spectre_mitigation: isa.flags().enable_heap_access_spectre_mitigation(), } } /// Derive the [`WasmType`] from the pointer size. - pub(crate) fn ptr_type(&self) -> WasmType { + pub(crate) fn ptr_type(&self) -> WasmValType { ptr_type_from_ptr_size(self.ptr_size()) } @@ -139,7 +159,7 @@ impl<'a, 'translation, 'data, P: PtrSize> FuncEnv<'a, 'translation, 'data, P> { pub fn callee_from_index(&self, idx: FuncIndex) -> Callee { let types = &self.translation.get_types(); let ty = types[types.core_function_at(idx.as_u32())].unwrap_func(); - let ty = self.translation.module.convert_func_type(ty); + let ty = self.convert_func_type(ty); let import = self.translation.module.is_imported_function(idx); let info = CalleeInfo { ty, index: idx }; @@ -151,47 +171,26 @@ impl<'a, 'translation, 'data, P: PtrSize> FuncEnv<'a, 'translation, 'data, P> { } } - pub(crate) fn resolve_block_type_info(&self, ty: BlockType) -> BlockTypeInfo { + /// Converts a [wasmparser::BlockType] into a [BlockSig]. + pub(crate) fn resolve_block_sig(&self, ty: BlockType) -> BlockSig { use BlockType::*; match ty { - Empty => BlockTypeInfo::default(), - Type(_) => BlockTypeInfo::with_single_result(), - FuncType(idx) => { - let sig_index = - self.translation.module.types[TypeIndex::from_u32(idx)].unwrap_function(); - let sig = &self.types[sig_index]; - BlockTypeInfo::new(sig.params().len(), sig.returns().len()) - } - } - } - - /// Resolves the type of the block in terms of [`wasmtime_environ::WasmType`]. - // TODO:: - // Profile this operation and if proven to be significantly expensive, - // intern ABIResultsData instead of recreating it every time. - pub(crate) fn resolve_block_results_data(&self, blockty: BlockType) -> ABIResultsData { - use BlockType::*; - match blockty { - Empty => ABIResultsData::wrap(ABIResults::default()), + Empty => BlockSig::new(control::BlockType::void()), Type(ty) => { - let ty = self.translation.module.convert_valtype(ty); - let results = ::abi_results(&[ty], &CallingConvention::Default); - ABIResultsData::wrap(results) + let ty = self.convert_valtype(ty); + BlockSig::new(control::BlockType::single(ty)) } FuncType(idx) => { let sig_index = self.translation.module.types[TypeIndex::from_u32(idx)].unwrap_function(); - let results = ::abi_results( - &self.types[sig_index].returns(), - &CallingConvention::Default, - ); - ABIResultsData::wrap(results) + let sig = &self.types[sig_index]; + BlockSig::new(control::BlockType::func(sig.clone())) } } } /// Resolves the type and offset of a global at the given index. - pub fn resolve_global_type_and_offset(&self, index: GlobalIndex) -> (WasmType, u32) { + pub fn resolve_global_type_and_offset(&self, index: GlobalIndex) -> (WasmValType, u32) { let ty = self.translation.module.globals[index].wasm_ty; let offset = match self.translation.module.defined_global_index(index) { Some(defined_index) => self.vmoffsets.vmctx_vmglobal_definition(defined_index), @@ -222,7 +221,7 @@ impl<'a, 'translation, 'data, P: PtrSize> FuncEnv<'a, 'translation, 'data, P> { }; *entry.insert(TableData { - base: from_offset, + import_from: from_offset, offset: base_offset, current_elems_offset, element_size: OperandSize::from_bytes(self.vmoffsets.ptr.size()), @@ -234,8 +233,111 @@ impl<'a, 'translation, 'data, P: PtrSize> FuncEnv<'a, 'translation, 'data, P> { } } + /// Resolve a [HeapData] from a [MemoryIndex]. + // TODO: (@saulecabrera) + // Handle shared memories when implementing support for Wasm Threads. + pub fn resolve_heap(&mut self, index: MemoryIndex) -> HeapData { + match self.resolved_heaps.entry(index) { + Occupied(entry) => *entry.get(), + Vacant(entry) => { + let (import_from, base_offset, current_length_offset) = + match self.translation.module.defined_memory_index(index) { + Some(defined) => { + let owned = self.translation.module.owned_memory_index(defined); + ( + None, + self.vmoffsets.vmctx_vmmemory_definition_base(owned), + self.vmoffsets + .vmctx_vmmemory_definition_current_length(owned), + ) + } + None => ( + Some(self.vmoffsets.vmctx_vmmemory_import_from(index)), + self.vmoffsets.ptr.vmmemory_definition_base().into(), + self.vmoffsets + .ptr + .vmmemory_definition_current_length() + .into(), + ), + }; + + let plan = &self.translation.module.memory_plans[index]; + let (min_size, max_size) = heap_limits(&plan); + let (style, offset_guard_size) = heap_style_and_offset_guard_size(&plan); + + *entry.insert(HeapData { + offset: base_offset, + import_from, + current_length_offset, + style, + ty: if plan.memory.memory64 { + // TODO: Add support for 64-bit memories. + unimplemented!("memory64") + } else { + WasmValType::I32 + }, + min_size, + max_size, + offset_guard_size, + }) + } + } + } + /// Get a [`TablePlan`] from a [`TableIndex`]. pub fn table_plan(&mut self, index: TableIndex) -> &TablePlan { &self.translation.module.table_plans[index] } + + /// Returns true if Spectre mitigations are enabled for heap bounds check. + pub fn heap_access_spectre_mitigation(&self) -> bool { + self.heap_access_spectre_mitigation + } +} + +impl TypeConvert for FuncEnv<'_, '_, '_, P> { + fn lookup_heap_type(&self, idx: wasmparser::UnpackedIndex) -> WasmHeapType { + wasmtime_environ::WasmparserTypeConverter { + module: &self.translation.module, + types: self.types, + } + .lookup_heap_type(idx) + } +} + +fn heap_style_and_offset_guard_size(plan: &MemoryPlan) -> (HeapStyle, u64) { + match plan { + MemoryPlan { + style: MemoryStyle::Static { bound }, + offset_guard_size, + .. + } => ( + HeapStyle::Static { + bound: bound * u64::from(WASM_PAGE_SIZE), + }, + *offset_guard_size, + ), + + MemoryPlan { + style: MemoryStyle::Dynamic { .. }, + offset_guard_size, + .. + } => (HeapStyle::Dynamic, *offset_guard_size), + } +} + +fn heap_limits(plan: &MemoryPlan) -> (u64, Option) { + ( + plan.memory + .minimum + .checked_mul(u64::from(WASM_PAGE_SIZE)) + .unwrap_or_else(|| { + // 2^64 as a minimum doesn't fin in a 64 bit integer. + // So in this case, the minimum is clamped to u64::MAX. + u64::MAX + }), + plan.memory + .maximum + .and_then(|max| max.checked_mul(u64::from(WASM_PAGE_SIZE))), + ) } diff --git a/winch/codegen/src/codegen/mod.rs b/winch/codegen/src/codegen/mod.rs index 4999aec67ae8..210179bc146e 100644 --- a/winch/codegen/src/codegen/mod.rs +++ b/winch/codegen/src/codegen/mod.rs @@ -1,14 +1,18 @@ use crate::{ - abi::{ABIOperand, ABIResultsData, ABISig, RetArea, ABI}, - codegen::BlockTypeInfo, + abi::{ABIOperand, ABISig, RetArea, ABI}, + codegen::BlockSig, isa::reg::Reg, - masm::{IntCmpKind, MacroAssembler, OperandSize, RegImm, SPOffset, TrapCode}, - stack::{TypedReg, Val}, + masm::{ExtendKind, IntCmpKind, MacroAssembler, OperandSize, RegImm, SPOffset, TrapCode}, + stack::TypedReg, }; use anyhow::Result; use smallvec::SmallVec; -use wasmparser::{BinaryReader, FuncValidator, Operator, ValidatorResources, VisitOperator}; -use wasmtime_environ::{PtrSize, TableIndex, TypeIndex, WasmHeapType, WasmType, FUNCREF_MASK}; +use wasmparser::{ + BinaryReader, FuncValidator, MemArg, Operator, ValidatorResources, VisitOperator, +}; +use wasmtime_environ::{ + MemoryIndex, PtrSize, TableIndex, TypeIndex, WasmHeapType, WasmValType, FUNCREF_MASK, +}; mod context; pub(crate) use context::*; @@ -20,6 +24,9 @@ mod control; pub(crate) use control::*; mod builtin; pub use builtin::*; +pub(crate) mod bounds; + +use bounds::{Bounds, ImmOffset, Index}; /// The code generation abstraction. pub(crate) struct CodeGen<'a, 'translation: 'a, 'data: 'translation, M> @@ -27,7 +34,7 @@ where M: MacroAssembler, { /// The ABI-specific representation of the function signature, excluding results. - sig: ABISig, + pub sig: ABISig, /// The code generation context. pub context: CodeGenContext<'a, 'translation>, @@ -76,29 +83,32 @@ where Ok(()) } - // TODO stack checks fn emit_start(&mut self) -> Result<()> { self.masm.prologue(); self.masm.reserve_stack(self.context.frame.locals_size); - // If the function has multiple returns, assign the corresponding base. - let mut results_data = ABIResultsData::wrap(self.sig.results.clone()); - if self.sig.params.has_retptr() { - results_data.ret_area = - Some(RetArea::slot(self.context.frame.results_base_slot.unwrap())); - } + // Check for stack overflow after reserving space, so that we get the most up-to-date view + // of the stack pointer. This assumes that no writes to the stack occur in `reserve_stack`. + self.masm.check_stack(); + // Once we have emitted the epilogue and reserved stack space for the locals, we push the // base control flow block. - self.control_frames - .push(ControlStackFrame::function_body_block( - results_data, - BlockTypeInfo::new( - self.sig.params_without_retptr().len(), - self.sig.results.len(), - ), - self.masm, - &mut self.context, - )); + self.control_frames.push(ControlStackFrame::block( + BlockSig::from_sig(self.sig.clone()), + self.masm, + &mut self.context, + )); + + // Set the return area of the results *after* initializing the block. In + // the function body block case, we'll treat the results as any other + // case, addressed from the stack pointer, and when ending the function + // the return area will be set to the return pointer. + if self.sig.params.has_retptr() { + self.sig + .results + .set_ret_area(RetArea::slot(self.context.frame.results_base_slot.unwrap())); + } + Ok(()) } @@ -111,83 +121,32 @@ where /// are not visited. pub fn handle_unreachable_else(&mut self) { let frame = self.control_frames.last_mut().unwrap(); - match frame { - ControlStackFrame::If { - reachable, - base_stack_len, - base_sp, - .. - } => { - if *reachable { - // We entered an unreachable state when compiling the - // if-then branch, but if the `if` was reachable at - // entry, the if-else branch will be reachable. - self.context.reachable = true; - // Reset the stack to the original length and offset. - Self::reset_stack(&mut self.context, self.masm, *base_stack_len, *base_sp); - frame.bind_else(self.masm, self.context.reachable); - } - } - _ => unreachable!(), + debug_assert!(frame.is_if()); + if frame.is_next_sequence_reachable() { + // We entered an unreachable state when compiling the + // if-then branch, but if the `if` was reachable at + // entry, the if-else branch will be reachable. + self.context.reachable = true; + frame.ensure_stack_state(self.masm, &mut self.context); + frame.bind_else(self.masm, &mut self.context); } } pub fn handle_unreachable_end(&mut self) { - let frame = self.control_frames.pop().unwrap(); + let mut frame = self.control_frames.pop().unwrap(); // We just popped the outermost block. let is_outermost = self.control_frames.len() == 0; + if frame.is_next_sequence_reachable() { self.context.reachable = true; - - let (value_stack_len, target_sp) = frame.base_stack_len_and_sp(); - // Reset the stack to the original length and offset. - Self::reset_stack(&mut self.context, self.masm, value_stack_len, target_sp); - // If the current frame is the outermost frame, which corresponds to the - // current function's body, only bind the exit label as we don't need to - // push any more values to the value stack, else perform the entire `bind_end` - // process, which involves pushing results to the value stack. - if is_outermost { - frame.bind_exit_label(self.masm); - } else { - frame.bind_end(self.masm, &mut self.context); - } + frame.ensure_stack_state(self.masm, &mut self.context); + frame.bind_end(self.masm, &mut self.context); } else if is_outermost { // If we reach the end of the function in an unreachable // state, perform the necessary cleanup to leave the stack // and SP in the expected state. The compiler can enter // in this state through an infinite loop. - let (value_stack_len, target_sp) = frame.base_stack_len_and_sp(); - Self::reset_stack(&mut self.context, self.masm, value_stack_len, target_sp); - } - } - - /// Helper function to reset value and stack pointer to the given length and stack pointer - /// offset respectively. This function is only used when restoring the code generation's - /// reachabiliy state when handling an unreachable `end` or `else`. - pub fn reset_stack( - context: &mut CodeGenContext, - masm: &mut M, - target_stack_len: usize, - target_sp: SPOffset, - ) { - // `CodeGenContext::reset_stack` only gets called when - // handling unreachable end or unreachable else, so we only - // care about freeing any registers in the provided range. - let mut bytes_freed = 0; - if target_stack_len < context.stack.len() { - context.drop_last( - context.stack.len() - target_stack_len, - |regalloc, val| match val { - Val::Reg(tr) => regalloc.free(tr.reg), - Val::Memory(m) => bytes_freed += m.slot.size, - _ => {} - }, - ); - } - if masm.sp_offset().as_u32() > target_sp.as_u32() { - let bytes = masm.sp_offset().as_u32() - target_sp.as_u32(); - assert!(bytes_freed == bytes); - masm.free_stack(bytes); + frame.ensure_stack_state(self.masm, &mut self.context); } } @@ -288,14 +247,14 @@ where /// Emits a a series of instructions that will type check a function reference call. pub fn emit_typecheck_funcref(&mut self, funcref_ptr: Reg, type_index: TypeIndex) { let ptr_size: OperandSize = self.env.ptr_type().into(); - let sig_index_bytes = self.env.vmoffsets.size_of_vmshared_signature_index(); + let sig_index_bytes = self.env.vmoffsets.size_of_vmshared_type_index(); let sig_size = OperandSize::from_bytes(sig_index_bytes); let sig_index = self.env.translation.module.types[type_index].unwrap_function(); let sig_offset = sig_index .as_u32() .checked_mul(sig_index_bytes.into()) .unwrap(); - let signatures_base_offset = self.env.vmoffsets.vmctx_signature_ids_array(); + let signatures_base_offset = self.env.vmoffsets.vmctx_type_ids_array(); let scratch = ::scratch_reg(); let funcref_sig_offset = self.env.vmoffsets.ptr.vm_func_ref_type_index(); @@ -331,13 +290,31 @@ where /// Emit the usual function end instruction sequence. fn emit_end(&mut self) -> Result<()> { - assert!(self.context.stack.len() == 0); + // The implicit body block is treated a normal block (it pushes results + // to the stack); so when reaching the end, we pop them taking as + // reference the current function's signature. + let base = SPOffset::from_u32(self.context.frame.locals_size); + if self.context.reachable { + ControlStackFrame::pop_abi_results_impl( + &mut self.sig.results, + &mut self.context, + self.masm, + |results, _, _| results.ret_area().copied(), + ); + } else { + // If we reach the end of the function in a unreachable code state, + // simly truncate to the the expected values. + // The compiler could enter in this state through an infinite loop. + self.context.truncate_stack_to(0); + self.masm.reset_stack_pointer(base); + } + debug_assert_eq!(self.context.stack.len(), 0); self.masm.epilogue(self.context.frame.locals_size); Ok(()) } fn spill_register_arguments(&mut self) { - use WasmType::*; + use WasmValType::*; self.sig // Skip the results base param if any; [Self::emit_body], // will handle spilling the results base param if it's in a register. @@ -460,6 +437,204 @@ where self.masm.bind(cont); } + + /// Emits a series of instructions to bounds check and calculate the address + /// of the given WebAssembly memory. + /// This function returns a register containing the requested address. + /// + /// In essence, when computing the heap address for a WebAssembly load or + /// store instruction the objective is to ensure that such access is safe, + /// but also to perform the least amount of checks, and rely on the system to + /// detect illegal memory accesses where applicable. + /// + /// Winch follows almost the same principles as Cranelift when it comes to + /// bounds checks, for a more detailed explanation refer to + /// [cranelift_wasm::code_translator::prepare_addr]. + /// + /// Winch implementation differs in that, it defaults to the general case + /// for dynamic heaps rather than optimizing for doing the least amount of + /// work possible at runtime, this is done to align with Winch's principle + /// of doing the least amount of work possible at compile time. For static + /// heaps, Winch does a bit more of work, given that some of the cases that + /// are checked against, can benefit compilation times, like for example, + /// detecting an out of bouds access at compile time. + pub fn emit_compute_heap_address( + &mut self, + memarg: &MemArg, + access_size: OperandSize, + ) -> Option { + let ptr_size: OperandSize = self.env.ptr_type().into(); + let enable_spectre_mitigation = self.env.heap_access_spectre_mitigation(); + let add_offset_and_access_size = |offset: ImmOffset, access_size: OperandSize| { + (access_size.bytes() as u64) + (offset.as_u32() as u64) + }; + + let memory_index = MemoryIndex::from_u32(memarg.memory); + let heap = self.env.resolve_heap(memory_index); + let index = Index::from_typed_reg(self.context.pop_to_reg(self.masm, None)); + let offset = bounds::ensure_index_and_offset(self.masm, index, memarg.offset, ptr_size); + let offset_with_access_size = add_offset_and_access_size(offset, access_size); + + let addr = match heap.style { + // == Dynamic Heaps == + + // Account for the general case for dynamic memories. The access is + // out of bounds if: + // * index + offset + access_size overflows + // OR + // * index + offset + access_size > bound + HeapStyle::Dynamic => { + let bounds = + bounds::load_dynamic_heap_bounds(&mut self.context, self.masm, &heap, ptr_size); + + let index_reg = index.as_typed_reg().reg; + // Perform + // index = index + offset + access_size, trapping if the + // addition overflows. + self.masm.checked_uadd( + index_reg, + index_reg, + RegImm::i64(offset_with_access_size as i64), + ptr_size, + TrapCode::HeapOutOfBounds, + ); + + let addr = bounds::load_heap_addr_checked( + self.masm, + &mut self.context, + ptr_size, + &heap, + enable_spectre_mitigation, + bounds, + index, + offset, + |masm, bounds, index| { + let index_reg = index.as_typed_reg().reg; + let bounds_reg = bounds.as_typed_reg().reg; + masm.cmp(bounds_reg.into(), index_reg.into(), heap.ty.into()); + IntCmpKind::GtU + }, + ); + self.context.free_reg(bounds.as_typed_reg().reg); + Some(addr) + } + + // == Static Heaps == + + // Detect at compile time if the access is out of bounds. + // Doing so will put the compiler in an unreachable code state, + // optimizing the work that the compiler has to do until the + // reachability is restored or when reaching the end of the + // function. + HeapStyle::Static { bound } if offset_with_access_size > bound => { + self.masm.trap(TrapCode::HeapOutOfBounds); + self.context.reachable = false; + None + } + + // Account for the case in which we can completely elide the bounds + // checks. + // + // This case, makes use of the fact that if a memory access uses + // a 32-bit index, then we be certain that + // + // index <= u32::MAX + // + // Therfore if any 32-bit index access occurs in the region + // represented by + // + // bound + guard_size - (offset + access_size) + // + // We are certain that it's in bounds or that the underlying virtual + // memory subsystem will report an illegal access at runtime. + // + // Note: + // + // * bound - (offset + access_size) cannot wrap, because it's checked + // in the condition above. + // * bound + heap.offset_guard_size is guaranteed to not overflow if + // the heap configuration is correct, given that it's address must + // fit in 64-bits. + // * If the heap type is 32-bits, the offset is at most u32::MAX, so + // no adjustment is needed as part of + // [bounds::ensure_index_and_offset]. + HeapStyle::Static { bound } + if heap.ty == WasmValType::I32 + && u64::from(u32::MAX) + <= u64::from(bound) + u64::from(heap.offset_guard_size) + - offset_with_access_size => + { + let addr = self.context.any_gpr(self.masm); + bounds::load_heap_addr_unchecked(self.masm, &heap, index, offset, addr, ptr_size); + Some(addr) + } + + // Account for the general case of static memories. The access is out + // of bounds if: + // + // index > bound - (offset + access_size) + // + // bound - (offset + access_size) cannot wrap, because we already + // checked that (offset + access_size) > bound, above. + HeapStyle::Static { bound } => { + let bounds = Bounds::from_u64(bound); + let addr = bounds::load_heap_addr_checked( + self.masm, + &mut self.context, + ptr_size, + &heap, + enable_spectre_mitigation, + bounds, + index, + offset, + |masm, bounds, index| { + let adjusted_bounds = bounds.as_u64() - offset_with_access_size; + let index_reg = index.as_typed_reg().reg; + masm.cmp(RegImm::i64(adjusted_bounds as i64), index_reg, ptr_size); + IntCmpKind::GtU + }, + ); + Some(addr) + } + }; + + self.context.free_reg(index.as_typed_reg().reg); + addr + } + + /// Emit a WebAssembly load. + pub fn emit_wasm_load( + &mut self, + arg: &MemArg, + ty: WasmValType, + size: OperandSize, + sextend: Option, + ) { + if let Some(addr) = self.emit_compute_heap_address(&arg, size) { + let dst = match ty { + WasmValType::I32 | WasmValType::I64 => self.context.any_gpr(self.masm), + WasmValType::F32 | WasmValType::F64 => self.context.any_fpr(self.masm), + _ => unreachable!(), + }; + + let src = self.masm.address_at_reg(addr, 0); + self.masm.wasm_load(src, dst, size, sextend); + self.context.stack.push(TypedReg::new(ty, dst).into()); + self.context.free_reg(addr); + } + } + + /// Emit a WebAssembly store. + pub fn emit_wasm_store(&mut self, arg: &MemArg, size: OperandSize) { + let src = self.context.pop_to_reg(self.masm, None); + if let Some(addr) = self.emit_compute_heap_address(&arg, size) { + self.masm + .wasm_store(src.reg.into(), self.masm.address_at_reg(addr, 0), size); + + self.context.free_reg(addr); + self.context.free_reg(src); + } + } } /// Returns the index of the [`ControlStackFrame`] for the given diff --git a/winch/codegen/src/frame/mod.rs b/winch/codegen/src/frame/mod.rs index e05a71fe397f..2c1b931375de 100644 --- a/winch/codegen/src/frame/mod.rs +++ b/winch/codegen/src/frame/mod.rs @@ -6,7 +6,7 @@ use anyhow::Result; use smallvec::SmallVec; use std::ops::Range; use wasmparser::{BinaryReader, FuncValidator, ValidatorResources}; -use wasmtime_environ::{ModuleTranslation, TypeConvert, WasmType}; +use wasmtime_environ::{TypeConvert, WasmValType}; // TODO: // SpiderMonkey's implementation uses 16; @@ -36,11 +36,11 @@ pub(crate) struct DefinedLocals { impl DefinedLocals { /// Compute the local slots for a Wasm function. pub fn new( - translation: &ModuleTranslation<'_>, + types: &impl TypeConvert, reader: &mut BinaryReader<'_>, validator: &mut FuncValidator, ) -> Result { - let mut next_stack = 0; + let mut next_stack: u32 = 0; // The first 32 bits of a Wasm binary function describe the number of locals. let local_count = reader.read_var_u32()?; let mut slots: Locals = Default::default(); @@ -51,10 +51,10 @@ impl DefinedLocals { let ty = reader.read()?; validator.define_locals(position, count, ty)?; - let ty = translation.module.convert_valtype(ty); + let ty = types.convert_valtype(ty); for _ in 0..count { let ty_size = ::sizeof(&ty); - next_stack = align_to(next_stack, ty_size) + ty_size; + next_stack = align_to(next_stack, ty_size as u32) + (ty_size as u32); slots.push(LocalSlot::new(ty, next_stack)); } } @@ -102,7 +102,7 @@ impl Frame { ); // Align the locals to add a slot for the VMContext pointer. - let ptr_size = ::word_bytes(); + let ptr_size = ::word_bytes() as u32; let vmctx_offset = align_to(defined_locals_start + defined_locals.stack_size, ptr_size) + ptr_size; @@ -154,7 +154,7 @@ impl Frame { &self, index: u32, masm: &mut M, - ) -> (WasmType, M::Address) { + ) -> (WasmValType, M::Address) { self.get_local(index) .map(|slot| (slot.ty, masm.local_address(slot))) .unwrap_or_else(|| panic!("Invalid local slot: {}", index)) diff --git a/winch/codegen/src/isa/aarch64/abi.rs b/winch/codegen/src/isa/aarch64/abi.rs index 4102e029c79d..3e4bdea17a05 100644 --- a/winch/codegen/src/isa/aarch64/abi.rs +++ b/winch/codegen/src/isa/aarch64/abi.rs @@ -3,7 +3,7 @@ use crate::abi::{align_to, ABIOperand, ABIParams, ABIResults, ABISig, ParamsOrRe use crate::isa::{reg::Reg, CallingConvention}; use crate::masm::OperandSize; use smallvec::SmallVec; -use wasmtime_environ::{WasmFuncType, WasmHeapType, WasmType}; +use wasmtime_environ::{WasmFuncType, WasmHeapType, WasmValType}; #[derive(Default)] pub(crate) struct Aarch64ABI; @@ -79,7 +79,7 @@ impl ABI for Aarch64ABI { 8 } - fn word_bits() -> u32 { + fn word_bits() -> u8 { 64 } @@ -88,32 +88,28 @@ impl ABI for Aarch64ABI { } fn sig_from( - params: &[WasmType], - returns: &[WasmType], + params: &[WasmValType], + returns: &[WasmValType], call_conv: &CallingConvention, ) -> ABISig { assert!(call_conv.is_apple_aarch64() || call_conv.is_default()); let mut params_index_env = RegIndexEnv::default(); let results = Self::abi_results(returns, call_conv); - let params = ABIParams::from::<_, Self>( - params, - 0, - results.has_stack_results(), - |ty, stack_offset| { + let params = + ABIParams::from::<_, Self>(params, 0, results.on_stack(), |ty, stack_offset| { Self::to_abi_operand( ty, stack_offset, &mut params_index_env, ParamsOrReturns::Params, ) - }, - ); + }); ABISig::new(params, results) } - fn abi_results(returns: &[WasmType], call_conv: &CallingConvention) -> ABIResults { + fn abi_results(returns: &[WasmValType], call_conv: &CallingConvention) -> ABIResults { assert!(call_conv.is_apple_aarch64() || call_conv.is_default()); let mut returns_index_env = RegIndexEnv::with_limit(1); @@ -151,54 +147,62 @@ impl ABI for Aarch64ABI { regs::callee_saved() } - fn stack_slot_size() -> u32 { + fn stack_slot_size() -> u8 { Self::word_bytes() } - fn sizeof(ty: &WasmType) -> u32 { + fn sizeof(ty: &WasmValType) -> u8 { match ty { - WasmType::Ref(rt) => match rt.heap_type { + WasmValType::Ref(rt) => match rt.heap_type { WasmHeapType::Func => Self::word_bytes(), ht => unimplemented!("Support for WasmHeapType: {ht}"), }, - WasmType::F64 | WasmType::I64 => Self::word_bytes(), - WasmType::F32 | WasmType::I32 => Self::word_bytes() / 2, + WasmValType::F64 | WasmValType::I64 => Self::word_bytes(), + WasmValType::F32 | WasmValType::I32 => Self::word_bytes() / 2, ty => unimplemented!("Support for WasmType: {ty}"), } } + + fn sizeof_bits(ty: &WasmValType) -> u8 { + Self::sizeof(ty) * 8 + } } impl Aarch64ABI { fn to_abi_operand( - wasm_arg: &WasmType, + wasm_arg: &WasmValType, stack_offset: u32, index_env: &mut RegIndexEnv, params_or_returns: ParamsOrReturns, ) -> (ABIOperand, u32) { let (reg, ty) = match wasm_arg { - ty @ (WasmType::I32 | WasmType::I64) => (index_env.next_xreg().map(regs::xreg), ty), + ty @ (WasmValType::I32 | WasmValType::I64) => { + (index_env.next_xreg().map(regs::xreg), ty) + } - ty @ (WasmType::F32 | WasmType::F64) => (index_env.next_vreg().map(regs::vreg), ty), + ty @ (WasmValType::F32 | WasmValType::F64) => { + (index_env.next_vreg().map(regs::vreg), ty) + } ty => unreachable!("Unsupported argument type {:?}", ty), }; let ty_size = ::sizeof(wasm_arg); let default = || { - let arg = ABIOperand::stack_offset(stack_offset, *ty, ty_size); + let arg = ABIOperand::stack_offset(stack_offset, *ty, ty_size as u32); let slot_size = Self::stack_slot_size(); // Stack slots for parameters are aligned to a fixed slot size, // in the case of Aarch64, 8 bytes. // Stack slots for returns are type-size aligned. let next_stack = if params_or_returns == ParamsOrReturns::Params { - align_to(stack_offset, slot_size) + slot_size + align_to(stack_offset, slot_size as u32) + (slot_size as u32) } else { - align_to(stack_offset, ty_size) + ty_size + align_to(stack_offset, ty_size as u32) + (ty_size as u32) }; (arg, next_stack) }; reg.map_or_else(default, |reg| { - (ABIOperand::reg(reg, *ty, ty_size), stack_offset) + (ABIOperand::reg(reg, *ty, ty_size as u32), stack_offset) }) } } @@ -214,7 +218,7 @@ mod tests { }; use wasmtime_environ::{ WasmFuncType, - WasmType::{self, *}, + WasmValType::{self, *}, }; #[test] @@ -291,7 +295,7 @@ mod tests { match_reg_arg(params.get(8).unwrap(), F64, regs::vreg(5)); } - fn match_reg_arg(abi_arg: &ABIOperand, expected_ty: WasmType, expected_reg: Reg) { + fn match_reg_arg(abi_arg: &ABIOperand, expected_ty: WasmValType, expected_reg: Reg) { match abi_arg { &ABIOperand::Reg { reg, ty, .. } => { assert_eq!(reg, expected_reg); @@ -301,7 +305,7 @@ mod tests { } } - fn match_stack_arg(abi_arg: &ABIOperand, expected_ty: WasmType, expected_offset: u32) { + fn match_stack_arg(abi_arg: &ABIOperand, expected_ty: WasmValType, expected_offset: u32) { match abi_arg { &ABIOperand::Stack { offset, ty, .. } => { assert_eq!(offset, expected_offset); diff --git a/winch/codegen/src/isa/aarch64/masm.rs b/winch/codegen/src/isa/aarch64/masm.rs index 0ec71ec7881a..c10f8f1006a4 100644 --- a/winch/codegen/src/isa/aarch64/masm.rs +++ b/winch/codegen/src/isa/aarch64/masm.rs @@ -1,11 +1,12 @@ use super::{abi::Aarch64ABI, address::Address, asm::Assembler, regs}; use crate::{ abi::{self, local::LocalSlot}, - codegen::{ptr_type_from_ptr_size, CodeGenContext, TableData}, + codegen::{ptr_type_from_ptr_size, CodeGenContext, HeapData, TableData}, isa::reg::Reg, masm::{ - CalleeKind, DivKind, FloatCmpKind, Imm as I, IntCmpKind, MacroAssembler as Masm, - OperandSize, RegImm, RemKind, RoundingMode, SPOffset, ShiftKind, StackSlot, TrapCode, + CalleeKind, DivKind, ExtendKind, FloatCmpKind, Imm as I, IntCmpKind, + MacroAssembler as Masm, OperandSize, RegImm, RemKind, RoundingMode, SPOffset, ShiftKind, + StackSlot, TrapCode, TruncKind, }, }; use cranelift_codegen::{settings, Final, MachBufferFinalized, MachLabel}; @@ -48,6 +49,10 @@ impl Masm for MacroAssembler { self.move_sp_to_shadow_sp(); } + fn check_stack(&mut self) { + // TODO: Implement when we have more complete assembler support. + } + fn epilogue(&mut self, locals_size: u32) { assert!(self.sp_offset == locals_size); @@ -115,6 +120,10 @@ impl Masm for MacroAssembler { todo!() } + fn memory_size(&mut self, _heap_data: &HeapData, _context: &mut CodeGenContext) { + todo!() + } + fn address_from_sp(&self, _offset: SPOffset) -> Self::Address { todo!() } @@ -149,6 +158,10 @@ impl Masm for MacroAssembler { self.asm.str(src, dst, size); } + fn wasm_store(&mut self, _src: Reg, _dst: Self::Address, _size: OperandSize) { + todo!() + } + fn call( &mut self, _stack_args_size: u32, @@ -165,6 +178,16 @@ impl Masm for MacroAssembler { todo!() } + fn wasm_load( + &mut self, + _src: Self::Address, + _dst: Reg, + _size: OperandSize, + _kind: Option, + ) { + todo!() + } + fn load_addr(&mut self, _src: Self::Address, _dst: Reg, _size: OperandSize) { todo!() } @@ -191,7 +214,7 @@ impl Masm for MacroAssembler { }; let scratch = regs::scratch(); - self.asm.load_constant(imm as u64, scratch); + self.asm.load_constant(imm, scratch); self.asm.mov_rr(scratch, rd, size); } (RegImm::Reg(rs), rd) => { @@ -222,6 +245,17 @@ impl Masm for MacroAssembler { } } + fn checked_uadd( + &mut self, + _dst: Reg, + _lhs: Reg, + _rhs: RegImm, + _size: OperandSize, + _trap: TrapCode, + ) { + todo!() + } + fn sub(&mut self, dst: Reg, lhs: Reg, rhs: RegImm, size: OperandSize) { match (rhs, lhs, dst) { (RegImm::Imm(v), rn, rd) => { @@ -339,15 +373,75 @@ impl Masm for MacroAssembler { todo!() } + fn signed_truncate( + &mut self, + _src: Reg, + _dst: Reg, + _src_size: OperandSize, + _dst_size: OperandSize, + _kind: TruncKind, + ) { + todo!() + } + + fn unsigned_truncate( + &mut self, + _src: Reg, + _dst: Reg, + _tmp_fpr: Reg, + _src_size: OperandSize, + _dst_size: OperandSize, + _kind: TruncKind, + ) { + todo!() + } + + fn signed_convert( + &mut self, + _src: Reg, + _dst: Reg, + _src_size: OperandSize, + _dst_size: OperandSize, + ) { + todo!() + } + + fn unsigned_convert( + &mut self, + _src: Reg, + _dst: Reg, + _tmp_gpr: Reg, + _src_size: OperandSize, + _dst_size: OperandSize, + ) { + todo!() + } + + fn reinterpret_float_as_int(&mut self, _src: Reg, _dst: Reg, _size: OperandSize) { + todo!() + } + + fn reinterpret_int_as_float(&mut self, _src: Reg, _dst: Reg, _size: OperandSize) { + todo!() + } + + fn demote(&mut self, _src: Reg, _dst: Reg) { + todo!() + } + + fn promote(&mut self, _src: Reg, _dst: Reg) { + todo!() + } + fn push(&mut self, reg: Reg, _size: OperandSize) -> StackSlot { let size = ::word_bytes(); - self.reserve_stack(size); + self.reserve_stack(size as u32); let address = Address::from_shadow_sp(size as i64); self.asm.str(reg, address, OperandSize::S64); StackSlot { offset: SPOffset::from_u32(self.sp_offset), - size, + size: size as u32, } } @@ -382,6 +476,14 @@ impl Masm for MacroAssembler { todo!() } + fn wrap(&mut self, _src: Reg, _dst: Reg) { + todo!() + } + + fn extend(&mut self, _src: Reg, _dst: Reg, _kind: ExtendKind) { + todo!() + } + fn get_label(&mut self) -> MachLabel { self.asm.get_label() } @@ -414,6 +516,10 @@ impl Masm for MacroAssembler { todo!() } + fn trap(&mut self, _code: TrapCode) { + todo!() + } + fn trapz(&mut self, _src: Reg, _code: TrapCode) { todo!() } diff --git a/winch/codegen/src/isa/aarch64/mod.rs b/winch/codegen/src/isa/aarch64/mod.rs index 34459b7c8bd7..f66215107f52 100644 --- a/winch/codegen/src/isa/aarch64/mod.rs +++ b/winch/codegen/src/isa/aarch64/mod.rs @@ -17,7 +17,7 @@ use cranelift_codegen::{MachTextSectionBuilder, TextSectionBuilder}; use masm::MacroAssembler as Aarch64Masm; use target_lexicon::Triple; use wasmparser::{FuncValidator, FunctionBody, ValidatorResources}; -use wasmtime_environ::{ModuleTranslation, ModuleTypes, VMOffsets, WasmFuncType}; +use wasmtime_environ::{ModuleTranslation, ModuleTypesBuilder, VMOffsets, WasmFuncType}; mod abi; mod address; @@ -87,7 +87,7 @@ impl TargetIsa for Aarch64 { sig: &WasmFuncType, body: &FunctionBody, translation: &ModuleTranslation, - types: &ModuleTypes, + types: &ModuleTypesBuilder, builtins: &mut BuiltinFunctions, validator: &mut FuncValidator, ) -> Result> { @@ -98,8 +98,8 @@ impl TargetIsa for Aarch64 { let stack = Stack::new(); let abi_sig = abi::Aarch64ABI::sig(sig, &CallingConvention::Default); - let defined_locals = - DefinedLocals::new::(translation, &mut body, validator)?; + let env = FuncEnv::new(&vmoffsets, translation, types, self); + let defined_locals = DefinedLocals::new::(&env, &mut body, validator)?; let frame = Frame::new::(&abi_sig, &defined_locals)?; let gpr = RegBitSet::int( ALL_GPR.into(), @@ -110,7 +110,6 @@ impl TargetIsa for Aarch64 { let fpr = RegBitSet::float(0, 0, usize::try_from(MAX_FPR).unwrap()); let regalloc = RegAlloc::from(gpr, fpr); let codegen_context = CodeGenContext::new(regalloc, stack, frame, builtins, &vmoffsets); - let env = FuncEnv::new(&vmoffsets, translation, types); let mut codegen = CodeGen::new(&mut masm, codegen_context, env, abi_sig); codegen.emit(&mut body, validator)?; @@ -135,4 +134,12 @@ impl TargetIsa for Aarch64 { ) -> Result> { todo!() } + + fn emit_unwind_info( + &self, + _result: &MachBufferFinalized, + _kind: cranelift_codegen::isa::unwind::UnwindInfoKind, + ) -> Result> { + todo!() + } } diff --git a/winch/codegen/src/isa/mod.rs b/winch/codegen/src/isa/mod.rs index 480a5608478d..2579840d9069 100644 --- a/winch/codegen/src/isa/mod.rs +++ b/winch/codegen/src/isa/mod.rs @@ -1,6 +1,7 @@ use crate::{BuiltinFunctions, TrampolineKind}; use anyhow::{anyhow, Result}; use core::fmt::Formatter; +use cranelift_codegen::isa::unwind::{UnwindInfo, UnwindInfoKind}; use cranelift_codegen::isa::{CallConv, IsaBuilder}; use cranelift_codegen::settings; use cranelift_codegen::{Final, MachBufferFinalized, TextSectionBuilder}; @@ -10,7 +11,7 @@ use std::{ }; use target_lexicon::{Architecture, Triple}; use wasmparser::{FuncValidator, FunctionBody, ValidatorResources}; -use wasmtime_environ::{ModuleTranslation, ModuleTypes, WasmFuncType}; +use wasmtime_environ::{ModuleTranslation, ModuleTypesBuilder, WasmFuncType}; #[cfg(feature = "x64")] pub(crate) mod x64; @@ -158,7 +159,7 @@ pub trait TargetIsa: Send + Sync { sig: &WasmFuncType, body: &FunctionBody, translation: &ModuleTranslation, - types: &ModuleTypes, + types: &ModuleTypesBuilder, builtins: &mut BuiltinFunctions, validator: &mut FuncValidator, ) -> Result>; @@ -184,6 +185,12 @@ pub trait TargetIsa: Send + Sync { self.triple().endianness().unwrap() } + fn emit_unwind_info( + &self, + _result: &MachBufferFinalized, + _kind: UnwindInfoKind, + ) -> Result>; + /// See `cranelift_codegen::isa::TargetIsa::create_systemv_cie`. fn create_systemv_cie(&self) -> Option { // By default, an ISA cannot create a System V CIE. diff --git a/winch/codegen/src/isa/reg.rs b/winch/codegen/src/isa/reg.rs index 0a96df3293be..bfdcdb8fc973 100644 --- a/winch/codegen/src/isa/reg.rs +++ b/winch/codegen/src/isa/reg.rs @@ -1,5 +1,6 @@ -use regalloc2::PReg; +use cranelift_codegen::RealReg; pub use regalloc2::RegClass; +use regalloc2::{PReg, VReg}; /// A newtype abstraction on top of a physical register. // @@ -71,3 +72,15 @@ impl std::fmt::Debug for Reg { write!(f, "{}", self.0) } } + +impl Into for Reg { + fn into(self) -> VReg { + VReg::new(self.inner().index(), self.class()) + } +} + +impl Into for Reg { + fn into(self) -> RealReg { + Into::::into(self).into() + } +} diff --git a/winch/codegen/src/isa/x64/abi.rs b/winch/codegen/src/isa/x64/abi.rs index b32b3fefbbb7..81c37b8845ac 100644 --- a/winch/codegen/src/isa/x64/abi.rs +++ b/winch/codegen/src/isa/x64/abi.rs @@ -5,7 +5,7 @@ use crate::{ masm::OperandSize, }; use smallvec::SmallVec; -use wasmtime_environ::{WasmFuncType, WasmHeapType, WasmType}; +use wasmtime_environ::{WasmFuncType, WasmHeapType, WasmValType}; /// Helper environment to track argument-register /// assignment in x64. @@ -93,13 +93,13 @@ impl ABI for X64ABI { 8 } - fn word_bits() -> u32 { + fn word_bits() -> u8 { 64 } fn sig_from( - params: &[WasmType], - returns: &[WasmType], + params: &[WasmValType], + returns: &[WasmValType], call_conv: &CallingConvention, ) -> ABISig { assert!(call_conv.is_fastcall() || call_conv.is_systemv() || call_conv.is_default()); @@ -118,7 +118,7 @@ impl ABI for X64ABI { let params = ABIParams::from::<_, Self>( params, params_stack_offset, - results.has_stack_results(), + results.on_stack(), |ty, stack_offset| { Self::to_abi_operand( ty, @@ -137,7 +137,7 @@ impl ABI for X64ABI { Self::sig_from(wasm_sig.params(), wasm_sig.returns(), call_conv) } - fn abi_results(returns: &[WasmType], call_conv: &CallingConvention) -> ABIResults { + fn abi_results(returns: &[WasmValType], call_conv: &CallingConvention) -> ABIResults { // Use absolute count for results given that for Winch's // default CallingConvention only one register is used for results // independent of the register class. This also aligns with how @@ -178,33 +178,37 @@ impl ABI for X64ABI { regs::callee_saved(call_conv) } - fn stack_slot_size() -> u32 { + fn stack_slot_size() -> u8 { Self::word_bytes() } - fn sizeof(ty: &WasmType) -> u32 { + fn sizeof(ty: &WasmValType) -> u8 { match ty { - WasmType::Ref(rt) => match rt.heap_type { + WasmValType::Ref(rt) => match rt.heap_type { WasmHeapType::Func => Self::word_bytes(), ht => unimplemented!("Support for WasmHeapType: {ht}"), }, - WasmType::F64 | WasmType::I64 => Self::word_bytes(), - WasmType::F32 | WasmType::I32 => Self::word_bytes() / 2, + WasmValType::F64 | WasmValType::I64 => Self::word_bytes(), + WasmValType::F32 | WasmValType::I32 => Self::word_bytes() / 2, ty => unimplemented!("Support for WasmType: {ty}"), } } + + fn sizeof_bits(ty: &WasmValType) -> u8 { + Self::sizeof(ty) * 8 + } } impl X64ABI { fn to_abi_operand( - wasm_arg: &WasmType, + wasm_arg: &WasmValType, stack_offset: u32, index_env: &mut RegIndexEnv, call_conv: &CallingConvention, params_or_returns: ParamsOrReturns, ) -> (ABIOperand, u32) { let (reg, ty) = match wasm_arg { - ty @ WasmType::Ref(rt) => match rt.heap_type { + ty @ WasmValType::Ref(rt) => match rt.heap_type { WasmHeapType::Func => ( Self::int_reg_for(index_env.next_gpr(), call_conv, params_or_returns), ty, @@ -212,12 +216,12 @@ impl X64ABI { ht => unimplemented!("Support for WasmHeapType: {ht}"), }, - ty @ (WasmType::I32 | WasmType::I64) => ( + ty @ (WasmValType::I32 | WasmValType::I64) => ( Self::int_reg_for(index_env.next_gpr(), call_conv, params_or_returns), ty, ), - ty @ (WasmType::F32 | WasmType::F64) => ( + ty @ (WasmValType::F32 | WasmValType::F64) => ( Self::float_reg_for(index_env.next_fpr(), call_conv, params_or_returns), ty, ), @@ -227,21 +231,28 @@ impl X64ABI { let ty_size = ::sizeof(wasm_arg); let default = || { - let arg = ABIOperand::stack_offset(stack_offset, *ty, ty_size); + let arg = ABIOperand::stack_offset(stack_offset, *ty, ty_size as u32); let slot_size = Self::stack_slot_size(); // Stack slots for parameters are aligned to a fixed slot size, // in the case of x64, 8 bytes. // Stack slots for returns are type-size aligned. let next_stack = if params_or_returns == ParamsOrReturns::Params { - align_to(stack_offset, slot_size) + slot_size + align_to(stack_offset, slot_size as u32) + (slot_size as u32) } else { - align_to(stack_offset, ty_size) + ty_size + // For the default calling convention, we don't type-size align, + // given that results on the stack must match spills generated + // from within the compiler, which are not type-size aligned. + if call_conv.is_default() { + stack_offset + (ty_size as u32) + } else { + align_to(stack_offset, ty_size as u32) + (ty_size as u32) + } }; (arg, next_stack) }; reg.map_or_else(default, |reg| { - (ABIOperand::reg(reg, *ty, ty_size), stack_offset) + (ABIOperand::reg(reg, *ty, ty_size as u32), stack_offset) }) } @@ -326,7 +337,7 @@ mod tests { }; use wasmtime_environ::{ WasmFuncType, - WasmType::{self, *}, + WasmValType::{self, *}, }; #[test] @@ -501,7 +512,7 @@ mod tests { } #[cfg(test)] - fn match_reg_arg(abi_arg: &ABIOperand, expected_ty: WasmType, expected_reg: Reg) { + fn match_reg_arg(abi_arg: &ABIOperand, expected_ty: WasmValType, expected_reg: Reg) { match abi_arg { &ABIOperand::Reg { reg, ty, .. } => { assert_eq!(reg, expected_reg); @@ -512,7 +523,7 @@ mod tests { } #[cfg(test)] - fn match_stack_arg(abi_arg: &ABIOperand, expected_ty: WasmType, expected_offset: u32) { + fn match_stack_arg(abi_arg: &ABIOperand, expected_ty: WasmValType, expected_offset: u32) { match abi_arg { &ABIOperand::Stack { offset, ty, .. } => { assert_eq!(offset, expected_offset); diff --git a/winch/codegen/src/isa/x64/asm.rs b/winch/codegen/src/isa/x64/asm.rs index f4ce1be6d40e..b03c63783d3b 100644 --- a/winch/codegen/src/isa/x64/asm.rs +++ b/winch/codegen/src/isa/x64/asm.rs @@ -2,12 +2,15 @@ use crate::{ isa::reg::Reg, - masm::{DivKind, IntCmpKind, OperandSize, RemKind, RoundingMode, ShiftKind}, + masm::{DivKind, ExtendKind, IntCmpKind, OperandSize, RemKind, RoundingMode, ShiftKind}, }; use cranelift_codegen::{ entity::EntityRef, - ir::{types, ConstantPool, ExternalName, LibCall, Opcode, TrapCode, UserExternalNameRef}, + ir::{ + types, ConstantPool, ExternalName, LibCall, MemFlags, Opcode, TrapCode, UserExternalNameRef, + }, isa::{ + unwind::UnwindInst, x64::{ args::{ self, AluRmiROpcode, Amode, CmpOpcode, DivSignedness, ExtMode, FromWritableReg, @@ -87,6 +90,8 @@ impl From for Xmm { impl From for args::OperandSize { fn from(size: OperandSize) -> Self { match size { + OperandSize::S8 => Self::Size8, + OperandSize::S16 => Self::Size16, OperandSize::S32 => Self::Size32, OperandSize::S64 => Self::Size64, s => panic!("Invalid operand size {:?}", s), @@ -132,6 +137,34 @@ impl From for CraneliftShiftKind { } } +impl From for ExtMode { + fn from(value: ExtendKind) -> Self { + match value { + ExtendKind::I64ExtendI32S | ExtendKind::I64ExtendI32U | ExtendKind::I64Extend32S => { + ExtMode::LQ + } + ExtendKind::I32Extend8S => ExtMode::BL, + ExtendKind::I32Extend16S => ExtMode::WL, + ExtendKind::I64Extend8S => ExtMode::BQ, + ExtendKind::I64Extend16S => ExtMode::WQ, + } + } +} + +impl From for Option { + // Helper for cases in which it's known that the widening must be + // to quadword. + fn from(value: OperandSize) -> Self { + use OperandSize::*; + match value { + S128 | S64 => None, + S8 => Some(ExtMode::BQ), + S16 => Some(ExtMode::WQ), + S32 => Some(ExtMode::LQ), + } + } +} + /// Low level assembler implementation for x64. pub(crate) struct Assembler { /// The machine instruction buffer. @@ -190,19 +223,21 @@ impl Assembler { pool: &mut ConstantPool, constants: &mut VCodeConstants, buffer: &mut MachBuffer, + memflags: MemFlags, ) -> SyntheticAmode { match addr { Address::Offset { base, offset } => { - SyntheticAmode::real(Amode::imm_reg(*offset as i32, (*base).into())) + let amode = Amode::imm_reg(*offset as i32, (*base).into()).with_flags(memflags); + SyntheticAmode::real(amode) } Address::Const(c) => { // Defer the creation of the // `SyntheticAmode::ConstantOffset` addressing mode // until the address is referenced by an actual - // instrunction. + // instruction. let constant_data = pool.get(*c); let data = VCodeConstantData::Pool(*c, constant_data.clone()); - // If the constaant data is not marked as used, it will be + // If the constant data is not marked as used, it will be // inserted, therefore, it needs to be registered. let needs_registration = !constants.pool_uses(&data); let constant = constants.insert(VCodeConstantData::Pool(*c, constant_data.clone())); @@ -215,6 +250,11 @@ impl Assembler { } } + /// Emit an unwind instruction. + pub fn emit_unwind_inst(&mut self, inst: UnwindInst) { + self.emit(Inst::Unwind { inst }) + } + /// Push register. pub fn push_r(&mut self, reg: Reg) { self.emit(Inst::Push64 { src: reg.into() }); @@ -244,10 +284,15 @@ impl Assembler { } /// Register-to-memory move. - pub fn mov_rm(&mut self, src: Reg, addr: &Address, size: OperandSize) { + pub fn mov_rm(&mut self, src: Reg, addr: &Address, size: OperandSize, flags: MemFlags) { assert!(addr.is_offset()); - let dst = - Self::to_synthetic_amode(addr, &mut self.pool, &mut self.constants, &mut self.buffer); + let dst = Self::to_synthetic_amode( + addr, + &mut self.pool, + &mut self.constants, + &mut self.buffer, + flags, + ); self.emit(Inst::MovRM { size: size.into(), src: src.into(), @@ -256,10 +301,15 @@ impl Assembler { } /// Immediate-to-memory move. - pub fn mov_im(&mut self, src: i32, addr: &Address, size: OperandSize) { + pub fn mov_im(&mut self, src: i32, addr: &Address, size: OperandSize, flags: MemFlags) { assert!(addr.is_offset()); - let dst = - Self::to_synthetic_amode(addr, &mut self.pool, &mut self.constants, &mut self.buffer); + let dst = Self::to_synthetic_amode( + addr, + &mut self.pool, + &mut self.constants, + &mut self.buffer, + flags, + ); self.emit(Inst::MovImmM { size: size.into(), simm32: src, @@ -279,28 +329,73 @@ impl Assembler { }); } - /// Memory-to-register load. - pub fn mov_mr(&mut self, addr: &Address, dst: Reg, size: OperandSize) { - use OperandSize::S64; - - let src = - Self::to_synthetic_amode(addr, &mut self.pool, &mut self.constants, &mut self.buffer); + /// Zero-extend memory-to-register load. + pub fn movzx_mr(&mut self, addr: &Address, dst: Reg, ext: Option, memflags: MemFlags) { + let src = Self::to_synthetic_amode( + addr, + &mut self.pool, + &mut self.constants, + &mut self.buffer, + memflags, + ); - if size == S64 { - self.emit(Inst::Mov64MR { - src, - dst: dst.into(), - }); - } else { + if let Some(ext) = ext { let reg_mem = RegMem::mem(src); self.emit(Inst::MovzxRmR { - ext_mode: ExtMode::LQ, + ext_mode: ext, src: GprMem::new(reg_mem).expect("valid memory address"), dst: dst.into(), }); + } else { + self.emit(Inst::Mov64MR { + src, + dst: dst.into(), + }); } } + // Sign-extend memory-to-register load. + pub fn movsx_mr( + &mut self, + addr: &Address, + dst: Reg, + ext: impl Into, + memflags: MemFlags, + ) { + let src = Self::to_synthetic_amode( + addr, + &mut self.pool, + &mut self.constants, + &mut self.buffer, + memflags, + ); + + let reg_mem = RegMem::mem(src); + self.emit(Inst::MovsxRmR { + ext_mode: ext.into(), + src: GprMem::new(reg_mem).expect("valid memory address"), + dst: dst.into(), + }) + } + + /// Register-to-register move with zero extension. + pub fn movzx_rr(&mut self, src: Reg, dst: Reg, kind: ExtendKind) { + self.emit(Inst::MovzxRmR { + ext_mode: kind.into(), + src: src.into(), + dst: dst.into(), + }) + } + + /// Register-to-register move with sign extension. + pub fn movsx_rr(&mut self, src: Reg, dst: Reg, kind: ExtendKind) { + self.emit(Inst::MovsxRmR { + ext_mode: kind.into(), + src: src.into(), + dst: dst.into(), + }); + } + /// Integer register conditional move. pub fn cmov(&mut self, src: Reg, dst: Reg, cc: IntCmpKind, size: OperandSize) { self.emit(Inst::Cmove { @@ -321,6 +416,7 @@ impl Assembler { S32 => SseOpcode::Movaps, S64 => SseOpcode::Movapd, S128 => SseOpcode::Movdqa, + S8 | S16 => unreachable!(), }; self.emit(Inst::XmmUnaryRmRUnaligned { @@ -331,7 +427,7 @@ impl Assembler { } /// Single and double precision floating point load. - pub fn xmm_mov_mr(&mut self, src: &Address, dst: Reg, size: OperandSize) { + pub fn xmm_mov_mr(&mut self, src: &Address, dst: Reg, size: OperandSize, flags: MemFlags) { use OperandSize::*; assert!(dst.is_float()); @@ -339,10 +435,16 @@ impl Assembler { S32 => SseOpcode::Movss, S64 => SseOpcode::Movsd, S128 => SseOpcode::Movdqu, + S16 | S8 => unreachable!(), }; - let src = - Self::to_synthetic_amode(src, &mut self.pool, &mut self.constants, &mut self.buffer); + let src = Self::to_synthetic_amode( + src, + &mut self.pool, + &mut self.constants, + &mut self.buffer, + flags, + ); self.emit(Inst::XmmUnaryRmRUnaligned { op, src: XmmMem::new(RegMem::mem(src)).expect("valid xmm unaligned"), @@ -351,7 +453,7 @@ impl Assembler { } /// Single and double precision floating point store. - pub fn xmm_mov_rm(&mut self, src: Reg, dst: &Address, size: OperandSize) { + pub fn xmm_mov_rm(&mut self, src: Reg, dst: &Address, size: OperandSize, flags: MemFlags) { use OperandSize::*; assert!(src.is_float()); @@ -360,10 +462,16 @@ impl Assembler { S32 => SseOpcode::Movss, S64 => SseOpcode::Movsd, S128 => SseOpcode::Movdqu, + S16 | S8 => unreachable!(), }; - let dst = - Self::to_synthetic_amode(dst, &mut self.pool, &mut self.constants, &mut self.buffer); + let dst = Self::to_synthetic_amode( + dst, + &mut self.pool, + &mut self.constants, + &mut self.buffer, + flags, + ); self.emit(Inst::XmmMovRM { op, src: src.into(), @@ -378,6 +486,7 @@ impl Assembler { OperandSize::S64 => types::F64, // Move the entire 128 bits via movdqa. OperandSize::S128 => types::I128, + OperandSize::S8 | OperandSize::S16 => unreachable!(), }; self.emit(Inst::XmmCmove { @@ -440,7 +549,7 @@ impl Assembler { let op = match size { OperandSize::S32 => SseOpcode::Andps, OperandSize::S64 => SseOpcode::Andpd, - OperandSize::S128 => unreachable!(), + OperandSize::S8 | OperandSize::S16 | OperandSize::S128 => unreachable!(), }; self.emit(Inst::XmmRmR { @@ -456,7 +565,7 @@ impl Assembler { let op = match size { OperandSize::S32 => SseOpcode::Andnps, OperandSize::S64 => SseOpcode::Andnpd, - OperandSize::S128 => unreachable!(), + OperandSize::S8 | OperandSize::S16 | OperandSize::S128 => unreachable!(), }; self.emit(Inst::XmmRmR { @@ -471,7 +580,7 @@ impl Assembler { let op = match size { OperandSize::S32 => SseOpcode::Movd, OperandSize::S64 => SseOpcode::Movq, - OperandSize::S128 => unreachable!(), + OperandSize::S8 | OperandSize::S16 | OperandSize::S128 => unreachable!(), }; self.emit(Inst::GprToXmm { @@ -482,6 +591,129 @@ impl Assembler { }) } + pub fn xmm_to_gpr(&mut self, src: Reg, dst: Reg, size: OperandSize) { + let op = match size { + OperandSize::S32 => SseOpcode::Movd, + OperandSize::S64 => SseOpcode::Movq, + OperandSize::S8 | OperandSize::S16 | OperandSize::S128 => unreachable!(), + }; + + self.emit(Inst::XmmToGpr { + op, + src: src.into(), + dst: dst.into(), + dst_size: size.into(), + }); + } + + /// Convert float to signed int. + pub fn cvt_float_to_sint_seq( + &mut self, + src: Reg, + dst: Reg, + tmp_gpr: Reg, + tmp_xmm: Reg, + src_size: OperandSize, + dst_size: OperandSize, + saturating: bool, + ) { + self.emit(Inst::CvtFloatToSintSeq { + dst_size: dst_size.into(), + src_size: src_size.into(), + is_saturating: saturating, + src: src.into(), + dst: dst.into(), + tmp_gpr: tmp_gpr.into(), + tmp_xmm: tmp_xmm.into(), + }); + } + + /// Convert float to unsigned int. + pub fn cvt_float_to_uint_seq( + &mut self, + src: Reg, + dst: Reg, + tmp_gpr: Reg, + tmp_xmm: Reg, + tmp_xmm2: Reg, + src_size: OperandSize, + dst_size: OperandSize, + saturating: bool, + ) { + self.emit(Inst::CvtFloatToUintSeq { + dst_size: dst_size.into(), + src_size: src_size.into(), + is_saturating: saturating, + src: src.into(), + dst: dst.into(), + tmp_gpr: tmp_gpr.into(), + tmp_xmm: tmp_xmm.into(), + tmp_xmm2: tmp_xmm2.into(), + }); + } + + /// Convert signed int to float. + pub fn cvt_sint_to_float( + &mut self, + src: Reg, + dst: Reg, + src_size: OperandSize, + dst_size: OperandSize, + ) { + let op = match dst_size { + OperandSize::S32 => SseOpcode::Cvtsi2ss, + OperandSize::S64 => SseOpcode::Cvtsi2sd, + OperandSize::S16 | OperandSize::S8 | OperandSize::S128 => unreachable!(), + }; + self.emit(Inst::CvtIntToFloat { + op, + src1: dst.into(), + src2: src.into(), + dst: dst.into(), + src2_size: src_size.into(), + }); + } + + /// Convert unsigned 64-bit int to float. + pub fn cvt_uint64_to_float_seq( + &mut self, + src: Reg, + dst: Reg, + tmp_gpr1: Reg, + tmp_gpr2: Reg, + dst_size: OperandSize, + ) { + self.emit(Inst::CvtUint64ToFloatSeq { + dst_size: dst_size.into(), + src: src.into(), + dst: dst.into(), + tmp_gpr1: tmp_gpr1.into(), + tmp_gpr2: tmp_gpr2.into(), + }); + } + + /// Change precision of float. + pub fn cvt_float_to_float( + &mut self, + src: Reg, + dst: Reg, + src_size: OperandSize, + dst_size: OperandSize, + ) { + let op = match (src_size, dst_size) { + (OperandSize::S32, OperandSize::S64) => SseOpcode::Cvtss2sd, + (OperandSize::S64, OperandSize::S32) => SseOpcode::Cvtsd2ss, + _ => unimplemented!(), + }; + + self.emit(Inst::XmmRmRUnaligned { + op, + src2: Xmm::new(src.into()).expect("valid xmm unaligned").into(), + src1: dst.into(), + dst: dst.into(), + }); + } + pub fn or_rr(&mut self, src: Reg, dst: Reg, size: OperandSize) { self.emit(Inst::AluRmiR { size: size.into(), @@ -508,7 +740,7 @@ impl Assembler { let op = match size { OperandSize::S32 => SseOpcode::Orps, OperandSize::S64 => SseOpcode::Orpd, - OperandSize::S128 => unreachable!(), + OperandSize::S8 | OperandSize::S16 | OperandSize::S128 => unreachable!(), }; self.emit(Inst::XmmRmR { @@ -547,7 +779,7 @@ impl Assembler { let op = match size { OperandSize::S32 => SseOpcode::Xorps, OperandSize::S64 => SseOpcode::Xorpd, - OperandSize::S128 => unreachable!(), + OperandSize::S8 | OperandSize::S16 | OperandSize::S128 => unreachable!(), }; self.emit(Inst::XmmRmR { @@ -696,22 +928,18 @@ impl Assembler { /// Multiply immediate and register. pub fn mul_ir(&mut self, imm: i32, dst: Reg, size: OperandSize) { - let imm = RegMemImm::imm(imm as u32); - - self.emit(Inst::AluRmiR { + self.emit(Inst::IMulImm { size: size.into(), - op: AluRmiROpcode::Mul, src1: dst.into(), - src2: GprMemImm::new(imm).expect("valid immediate"), + src2: imm, dst: dst.into(), }); } /// Multiply register and register. pub fn mul_rr(&mut self, src: Reg, dst: Reg, size: OperandSize) { - self.emit(Inst::AluRmiR { + self.emit(Inst::IMul { size: size.into(), - op: AluRmiROpcode::Mul, src1: dst.into(), src2: src.into(), dst: dst.into(), @@ -768,7 +996,7 @@ impl Assembler { let op = match size { OperandSize::S32 => SseOpcode::Ucomiss, OperandSize::S64 => SseOpcode::Ucomisd, - OperandSize::S128 => unreachable!(), + OperandSize::S8 | OperandSize::S16 | OperandSize::S128 => unreachable!(), }; self.emit(Inst::XmmCmpRmR { @@ -894,7 +1122,7 @@ impl Assembler { let op = match size { OperandSize::S32 => SseOpcode::Addss, OperandSize::S64 => SseOpcode::Addsd, - OperandSize::S128 => unreachable!(), + OperandSize::S8 | OperandSize::S16 | OperandSize::S128 => unreachable!(), }; self.emit(Inst::XmmRmRUnaligned { @@ -910,7 +1138,7 @@ impl Assembler { let op = match size { OperandSize::S32 => SseOpcode::Subss, OperandSize::S64 => SseOpcode::Subsd, - OperandSize::S128 => unreachable!(), + OperandSize::S8 | OperandSize::S16 | OperandSize::S128 => unreachable!(), }; self.emit(Inst::XmmRmRUnaligned { @@ -926,7 +1154,7 @@ impl Assembler { let op = match size { OperandSize::S32 => SseOpcode::Mulss, OperandSize::S64 => SseOpcode::Mulsd, - OperandSize::S128 => unreachable!(), + OperandSize::S8 | OperandSize::S16 | OperandSize::S128 => unreachable!(), }; self.emit(Inst::XmmRmRUnaligned { @@ -942,7 +1170,7 @@ impl Assembler { let op = match size { OperandSize::S32 => SseOpcode::Divss, OperandSize::S64 => SseOpcode::Divsd, - OperandSize::S128 => unreachable!(), + OperandSize::S8 | OperandSize::S16 | OperandSize::S128 => unreachable!(), }; self.emit(Inst::XmmRmRUnaligned { @@ -981,7 +1209,7 @@ impl Assembler { let op = match size { OperandSize::S32 => SseOpcode::Roundss, OperandSize::S64 => SseOpcode::Roundsd, - OperandSize::S128 => unreachable!(), + OperandSize::S8 | OperandSize::S16 | OperandSize::S128 => unreachable!(), }; let imm: u8 = match mode { @@ -1003,12 +1231,13 @@ impl Assembler { let op = match size { OperandSize::S32 => SseOpcode::Sqrtss, OperandSize::S64 => SseOpcode::Sqrtsd, - OperandSize::S128 => unreachable!(), + OperandSize::S8 | OperandSize::S16 | OperandSize::S128 => unreachable!(), }; - self.emit(Inst::XmmUnaryRmR { + self.emit(Inst::XmmRmR { op, - src: Xmm::from(src).into(), + src2: Xmm::from(src).into(), + src1: dst.into(), dst: dst.into(), }) } @@ -1097,7 +1326,7 @@ impl Assembler { } /// Conditional trap. - pub fn trapif(&mut self, cc: IntCmpKind, trap_code: TrapCode) { + pub fn trapif(&mut self, cc: impl Into, trap_code: TrapCode) { self.emit(Inst::TrapIf { cc: cc.into(), trap_code, @@ -1106,8 +1335,13 @@ impl Assembler { /// Load effective address. pub fn lea(&mut self, addr: &Address, dst: Reg, size: OperandSize) { - let addr = - Self::to_synthetic_amode(addr, &mut self.pool, &mut self.constants, &mut self.buffer); + let addr = Self::to_synthetic_amode( + addr, + &mut self.pool, + &mut self.constants, + &mut self.buffer, + MemFlags::trusted(), + ); self.emit(Inst::LoadEffectiveAddress { addr, dst: dst.into(), diff --git a/winch/codegen/src/isa/x64/masm.rs b/winch/codegen/src/isa/x64/masm.rs index b18340c06292..433dfb651045 100644 --- a/winch/codegen/src/isa/x64/masm.rs +++ b/winch/codegen/src/isa/x64/masm.rs @@ -6,8 +6,8 @@ use super::{ }; use crate::masm::{ - DivKind, FloatCmpKind, Imm as I, IntCmpKind, MacroAssembler as Masm, OperandSize, RegImm, - RemKind, RoundingMode, ShiftKind, TrapCode, + DivKind, ExtendKind, FloatCmpKind, Imm as I, IntCmpKind, MacroAssembler as Masm, OperandSize, + RegImm, RemKind, RoundingMode, ShiftKind, TrapCode, TruncKind, TRUSTED_FLAGS, UNTRUSTED_FLAGS, }; use crate::{ abi::ABI, @@ -16,7 +16,7 @@ use crate::{ }; use crate::{ abi::{self, align_to, calculate_frame_adjustment, LocalSlot}, - codegen::{ptr_type_from_ptr_size, Callee, CodeGenContext, FnCall, TableData}, + codegen::{ptr_type_from_ptr_size, Callee, CodeGenContext, FnCall, HeapData, TableData}, stack::Val, }; use crate::{ @@ -24,10 +24,16 @@ use crate::{ masm::CalleeKind, }; use cranelift_codegen::{ - isa::x64::settings as x64_settings, settings, Final, MachBufferFinalized, MachLabel, + ir::MemFlags, + isa::unwind::UnwindInst, + isa::x64::{ + args::{ExtMode, CC}, + settings as x64_settings, + }, + settings, Final, MachBufferFinalized, MachLabel, }; -use wasmtime_environ::PtrSize; +use wasmtime_environ::{PtrSize, WasmValType, WASM_PAGE_SIZE}; /// x64 MacroAssembler. pub(crate) struct MacroAssembler { @@ -53,14 +59,49 @@ impl Masm for MacroAssembler { let stack_pointer = rsp(); self.asm.push_r(frame_pointer); + + if self.shared_flags.unwind_info() { + self.asm.emit_unwind_inst(UnwindInst::PushFrameRegs { + offset_upward_to_caller_sp: Self::ABI::arg_base_offset().try_into().unwrap(), + }) + } + self.asm .mov_rr(stack_pointer, frame_pointer, OperandSize::S64); + + if self.shared_flags.unwind_info() { + self.asm.emit_unwind_inst(UnwindInst::DefineNewFrame { + offset_upward_to_caller_sp: Self::ABI::arg_base_offset().try_into().unwrap(), + + // Clobbers appear directly after the RET and FP if they're present. As we just + // pushed the frame pointer, the offset to the clobbers will be `0`. + offset_downward_to_clobbers: 0, + }) + } + } + + fn check_stack(&mut self) { + let ptr_size: u8 = self.ptr_size.bytes().try_into().unwrap(); + let scratch = regs::scratch(); + + self.load_ptr( + self.address_at_vmctx(ptr_size.vmcontext_runtime_limits().into()), + scratch, + ); + + self.load_ptr( + Address::offset(scratch, ptr_size.vmruntime_limits_stack_limit().into()), + scratch, + ); + + self.asm.cmp_rr(regs::rsp(), scratch, self.ptr_size); + self.asm.trapif(IntCmpKind::GtU, TrapCode::StackOverflow); } fn push(&mut self, reg: Reg, size: OperandSize) -> StackSlot { let bytes = match (reg.class(), size) { (RegClass::Int, OperandSize::S64) => { - let word_bytes = ::word_bytes(); + let word_bytes = ::word_bytes() as u32; self.asm.push_r(reg); self.increment_sp(word_bytes); word_bytes @@ -69,7 +110,8 @@ impl Masm for MacroAssembler { let bytes = size.bytes(); self.reserve_stack(bytes); let sp_offset = SPOffset::from_u32(self.sp_offset); - self.asm.mov_rm(reg, &self.address_from_sp(sp_offset), size); + self.asm + .mov_rm(reg, &self.address_from_sp(sp_offset), size, TRUSTED_FLAGS); bytes } (RegClass::Float, _) => { @@ -77,7 +119,7 @@ impl Masm for MacroAssembler { self.reserve_stack(bytes); let sp_offset = SPOffset::from_u32(self.sp_offset); self.asm - .xmm_mov_rm(reg, &self.address_from_sp(sp_offset), size); + .xmm_mov_rm(reg, &self.address_from_sp(sp_offset), size, TRUSTED_FLAGS); bytes } _ => unreachable!(), @@ -89,6 +131,19 @@ impl Masm for MacroAssembler { } } + fn save(&mut self, clobber_offset: u32, reg: Reg, size: OperandSize) -> StackSlot { + let slot = self.push(reg, size); + + if self.shared_flags.unwind_info() { + self.asm.emit_unwind_inst(UnwindInst::SaveReg { + clobber_offset, + reg: reg.into(), + }); + } + + slot + } + fn reserve_stack(&mut self, bytes: u32) { if bytes == 0 { return; @@ -137,12 +192,16 @@ impl Masm for MacroAssembler { let bound = context.any_gpr(self); let tmp = context.any_gpr(self); - if let Some(offset) = table_data.base { + if let Some(offset) = table_data.import_from { // If the table data declares a particular offset base, // load the address into a register to further use it as // the table address. - self.asm - .mov_mr(&self.address_at_vmctx(offset), ptr_base, self.ptr_size); + self.asm.movzx_mr( + &self.address_at_vmctx(offset), + ptr_base, + self.ptr_size.into(), + TRUSTED_FLAGS, + ); } else { // Else, simply move the vmctx register into the addr register as // the base to calculate the table address. @@ -152,7 +211,8 @@ impl Masm for MacroAssembler { // OOB check. let bound_addr = self.address_at_reg(ptr_base, table_data.current_elems_offset); let bound_size = table_data.current_elements_size; - self.asm.mov_mr(&bound_addr, bound, bound_size); + self.asm + .movzx_mr(&bound_addr, bound, bound_size.into(), TRUSTED_FLAGS); self.asm.cmp_rr(bound, index, bound_size); self.asm.trapif(IntCmpKind::GeU, TrapCode::TableOutOfBounds); @@ -166,10 +226,11 @@ impl Masm for MacroAssembler { scratch, table_data.element_size, ); - self.asm.mov_mr( + self.asm.movzx_mr( &self.address_at_reg(ptr_base, table_data.offset), ptr_base, - self.ptr_size, + self.ptr_size.into(), + TRUSTED_FLAGS, ); // Copy the value of the table base into a temporary register // so that we can use it later in case of a misspeculation. @@ -192,20 +253,71 @@ impl Masm for MacroAssembler { let scratch = regs::scratch(); let size = context.any_gpr(self); - if let Some(offset) = table_data.base { - self.asm - .mov_mr(&self.address_at_vmctx(offset), scratch, self.ptr_size); + if let Some(offset) = table_data.import_from { + self.asm.movzx_mr( + &self.address_at_vmctx(offset), + scratch, + self.ptr_size.into(), + TRUSTED_FLAGS, + ); } else { self.asm.mov_rr(vmctx, scratch, self.ptr_size); }; let size_addr = Address::offset(scratch, table_data.current_elems_offset); - self.asm - .mov_mr(&size_addr, size, table_data.current_elements_size); + self.asm.movzx_mr( + &size_addr, + size, + table_data.current_elements_size.into(), + TRUSTED_FLAGS, + ); context.stack.push(TypedReg::i32(size).into()); } + fn memory_size(&mut self, heap_data: &HeapData, context: &mut CodeGenContext) { + let size_reg = context.any_gpr(self); + let scratch = regs::scratch(); + let vmctx = ::vmctx_reg(); + + let base = if let Some(offset) = heap_data.import_from { + self.asm.movzx_mr( + &self.address_at_vmctx(offset), + scratch, + self.ptr_size.into(), + TRUSTED_FLAGS, + ); + scratch + } else { + vmctx + }; + + let size_addr = Address::offset(base, heap_data.current_length_offset); + self.asm + .movzx_mr(&size_addr, size_reg, self.ptr_size.into(), TRUSTED_FLAGS); + // Prepare the stack to emit a shift to get the size in pages rather + // than in bytes. + context + .stack + .push(TypedReg::new(heap_data.ty, size_reg).into()); + + // Since the page size is a power-of-two, verify that 2^16, equals the + // defined constant. This is mostly a safeguard in case the constant + // value ever changes. + let pow = 16; + debug_assert_eq!(2u32.pow(pow), WASM_PAGE_SIZE); + + // Ensure that the constant is correctly typed according to the heap + // type to reduce register pressure when emitting the shift operation. + match heap_data.ty { + WasmValType::I32 => context.stack.push(Val::i32(pow as i32)), + WasmValType::I64 => context.stack.push(Val::i64(pow as i64)), + _ => unreachable!(), + } + + self.shift(context, ShiftKind::ShrU, heap_data.ty.into()); + } + fn address_from_sp(&self, offset: SPOffset) -> Self::Address { Address::offset(regs::rsp(), self.sp_offset - offset.as_u32()) } @@ -223,39 +335,11 @@ impl Masm for MacroAssembler { } fn store(&mut self, src: RegImm, dst: Address, size: OperandSize) { - let scratch = ::scratch_reg(); - let float_scratch = ::float_scratch_reg(); - match src { - RegImm::Imm(imm) => match imm { - I::I32(v) => self.asm.mov_im(v as i32, &dst, size), - I::I64(v) => match v.try_into() { - Ok(v) => self.asm.mov_im(v, &dst, size), - Err(_) => { - // If the immediate doesn't sign extend, use a scratch - // register. - self.asm.mov_ir(v, scratch, size); - self.asm.mov_rm(scratch, &dst, size); - } - }, - I::F32(v) => { - let addr = self.asm.add_constant(v.to_le_bytes().as_slice()); - self.asm.xmm_mov_mr(&addr, float_scratch, size); - self.asm.xmm_mov_rm(float_scratch, &dst, size); - } - I::F64(v) => { - let addr = self.asm.add_constant(v.to_le_bytes().as_slice()); - self.asm.xmm_mov_mr(&addr, float_scratch, size); - self.asm.xmm_mov_rm(float_scratch, &dst, size); - } - }, - RegImm::Reg(reg) => { - if reg.is_int() { - self.asm.mov_rm(reg, &dst, size); - } else { - self.asm.xmm_mov_rm(reg, &dst, size); - } - } - } + self.store_impl(src, dst, size, TRUSTED_FLAGS); + } + + fn wasm_store(&mut self, src: Reg, dst: Self::Address, size: OperandSize) { + self.store_impl(src.into(), dst, size, UNTRUSTED_FLAGS); } fn pop(&mut self, dst: Reg, size: OperandSize) { @@ -263,16 +347,16 @@ impl Masm for MacroAssembler { match (dst.class(), size) { (RegClass::Int, OperandSize::S32) => { let addr = self.address_from_sp(current_sp); - self.asm.mov_mr(&addr, dst, size); + self.asm.movzx_mr(&addr, dst, size.into(), TRUSTED_FLAGS); self.free_stack(size.bytes()); } (RegClass::Int, OperandSize::S64) => { self.asm.pop_r(dst); - self.decrement_sp(::word_bytes()); + self.decrement_sp(::word_bytes() as u32); } (RegClass::Float, _) => { let addr = self.address_from_sp(current_sp); - self.asm.xmm_mov_mr(&addr, dst, size); + self.asm.xmm_mov_mr(&addr, dst, size, TRUSTED_FLAGS); self.free_stack(size.bytes()); } _ => unreachable!(), @@ -308,10 +392,20 @@ impl Masm for MacroAssembler { } fn load(&mut self, src: Address, dst: Reg, size: OperandSize) { - if dst.is_int() { - self.asm.mov_mr(&src, dst, size); + self.load_impl::(src, dst, size, TRUSTED_FLAGS); + } + + fn wasm_load( + &mut self, + src: Self::Address, + dst: Reg, + size: OperandSize, + kind: Option, + ) { + if let Some(ext) = kind { + self.asm.movsx_mr(&src, dst, ext, UNTRUSTED_FLAGS); } else { - self.asm.xmm_mov_mr(&src, dst, size); + self.load_impl::(src, dst, size, UNTRUSTED_FLAGS) } } @@ -332,14 +426,14 @@ impl Masm for MacroAssembler { }, (RegImm::Imm(imm), dst) => match imm { I::I32(v) => self.asm.mov_ir(v as u64, dst, size), - I::I64(v) => self.asm.mov_ir(v as u64, dst, size), + I::I64(v) => self.asm.mov_ir(v, dst, size), I::F32(v) => { let addr = self.asm.add_constant(v.to_le_bytes().as_slice()); - self.asm.xmm_mov_mr(&addr, dst, size); + self.asm.xmm_mov_mr(&addr, dst, size, TRUSTED_FLAGS); } I::F64(v) => { let addr = self.asm.add_constant(v.to_le_bytes().as_slice()); - self.asm.xmm_mov_mr(&addr, dst, size); + self.asm.xmm_mov_mr(&addr, dst, size, TRUSTED_FLAGS); } }, } @@ -372,6 +466,11 @@ impl Masm for MacroAssembler { } } + fn checked_uadd(&mut self, dst: Reg, lhs: Reg, rhs: RegImm, size: OperandSize, trap: TrapCode) { + self.add(dst, lhs, rhs, size); + self.asm.trapif(CC::B, trap); + } + fn sub(&mut self, dst: Reg, lhs: Reg, rhs: RegImm, size: OperandSize) { Self::ensure_two_argument_form(&dst, &lhs); match (rhs, dst) { @@ -447,7 +546,7 @@ impl Masm for MacroAssembler { let sign_mask = match size { OperandSize::S32 => I::I32(0x80000000), OperandSize::S64 => I::I64(0x8000000000000000), - OperandSize::S128 => unreachable!(), + OperandSize::S8 | OperandSize::S16 | OperandSize::S128 => unreachable!(), }; self.load_constant(&sign_mask, scratch_gpr, size); self.asm.gpr_to_xmm(scratch_gpr, scratch_xmm, size); @@ -469,7 +568,7 @@ impl Masm for MacroAssembler { let mask = match size { OperandSize::S32 => I::I32(0x80000000), OperandSize::S64 => I::I64(0x8000000000000000), - OperandSize::S128 => unreachable!(), + OperandSize::S8 | OperandSize::S16 | OperandSize::S128 => unreachable!(), }; let scratch_gpr = regs::scratch(); self.load_constant(&mask, scratch_gpr, size); @@ -483,7 +582,7 @@ impl Masm for MacroAssembler { let mask = match size { OperandSize::S32 => I::I32(0x7fffffff), OperandSize::S64 => I::I64(0x7fffffffffffffff), - OperandSize::S128 => unreachable!(), + OperandSize::S128 | OperandSize::S16 | OperandSize::S8 => unreachable!(), }; let scratch_gpr = regs::scratch(); self.load_constant(&mask, scratch_gpr, size); @@ -672,7 +771,7 @@ impl Masm for MacroAssembler { } fn epilogue(&mut self, locals_size: u32) { - assert!(self.sp_offset == locals_size); + assert_eq!(self.sp_offset, locals_size); let rsp = rsp(); if locals_size > 0 { @@ -773,7 +872,7 @@ impl Masm for MacroAssembler { self.asm.bsr(src.into(), dst.into(), size); self.asm.setcc(IntCmpKind::Ne, scratch.into()); self.asm.neg(dst, dst, size); - self.asm.add_ir(size.num_bits(), dst, size); + self.asm.add_ir(size.num_bits() as i32, dst, size); self.asm.sub_rr(scratch, dst, size); } } @@ -904,10 +1003,105 @@ impl Masm for MacroAssembler { } } + fn wrap(&mut self, src: Reg, dst: Reg) { + self.asm.mov_rr(src.into(), dst.into(), OperandSize::S32); + } + + fn extend(&mut self, src: Reg, dst: Reg, kind: ExtendKind) { + if let ExtendKind::I64ExtendI32U = kind { + self.asm.movzx_rr(src, dst, kind); + } else { + self.asm.movsx_rr(src, dst, kind); + } + } + + fn signed_truncate( + &mut self, + src: Reg, + dst: Reg, + src_size: OperandSize, + dst_size: OperandSize, + kind: TruncKind, + ) { + self.asm.cvt_float_to_sint_seq( + src, + dst, + regs::scratch(), + regs::scratch_xmm(), + src_size, + dst_size, + kind.is_checked(), + ); + } + + fn unsigned_truncate( + &mut self, + src: Reg, + dst: Reg, + tmp_fpr: Reg, + src_size: OperandSize, + dst_size: OperandSize, + kind: TruncKind, + ) { + self.asm.cvt_float_to_uint_seq( + src, + dst, + regs::scratch(), + regs::scratch_xmm(), + tmp_fpr, + src_size, + dst_size, + kind.is_checked(), + ); + } + + fn signed_convert(&mut self, src: Reg, dst: Reg, src_size: OperandSize, dst_size: OperandSize) { + self.asm.cvt_sint_to_float(src, dst, src_size, dst_size); + } + + fn unsigned_convert( + &mut self, + src: Reg, + dst: Reg, + tmp_gpr: Reg, + src_size: OperandSize, + dst_size: OperandSize, + ) { + // Need to convert unsigned uint32 to uint64 for conversion instruction sequence. + if let OperandSize::S32 = src_size { + self.extend(src, src, ExtendKind::I64ExtendI32U); + } + + self.asm + .cvt_uint64_to_float_seq(src, dst, regs::scratch(), tmp_gpr, dst_size); + } + + fn reinterpret_float_as_int(&mut self, src: Reg, dst: Reg, size: OperandSize) { + self.asm.xmm_to_gpr(src, dst, size); + } + + fn reinterpret_int_as_float(&mut self, src: Reg, dst: Reg, size: OperandSize) { + self.asm.gpr_to_xmm(src.into(), dst, size); + } + + fn demote(&mut self, src: Reg, dst: Reg) { + self.asm + .cvt_float_to_float(src.into(), dst.into(), OperandSize::S64, OperandSize::S32); + } + + fn promote(&mut self, src: Reg, dst: Reg) { + self.asm + .cvt_float_to_float(src.into(), dst.into(), OperandSize::S32, OperandSize::S64); + } + fn unreachable(&mut self) { self.asm.trap(TrapCode::UnreachableCodeReached) } + fn trap(&mut self, code: TrapCode) { + self.asm.trap(code); + } + fn trapif(&mut self, cc: IntCmpKind, code: TrapCode) { self.asm.trapif(cc, code); } @@ -944,12 +1138,14 @@ impl MacroAssembler { shared_flags: settings::Flags, isa_flags: x64_settings::Flags, ) -> Self { + let ptr_type: WasmValType = ptr_type_from_ptr_size(ptr_size.size()).into(); + Self { sp_offset: 0, asm: Assembler::new(shared_flags.clone(), isa_flags.clone()), flags: isa_flags, shared_flags, - ptr_size: ptr_type_from_ptr_size(ptr_size.size()).into(), + ptr_size: ptr_type.into(), } } @@ -975,6 +1171,70 @@ impl MacroAssembler { } } + /// A common implemenation for zero-extend stack loads. + fn load_impl(&mut self, src: Address, dst: Reg, size: OperandSize, flags: MemFlags) + where + M: Masm, + { + if dst.is_int() { + let access_bits = size.num_bits() as u16; + + let ext_mode = match access_bits { + 8 => Some(ExtMode::BQ), + 16 => Some(ExtMode::WQ), + 32 => Some(ExtMode::LQ), + _ => None, + }; + + self.asm.movzx_mr(&src, dst, ext_mode, flags); + } else { + self.asm.xmm_mov_mr(&src, dst, size, flags); + } + } + + /// A common implemenation for stack stores. + fn store_impl(&mut self, src: RegImm, dst: Address, size: OperandSize, flags: MemFlags) { + let scratch = ::ABI::scratch_reg(); + let float_scratch = ::ABI::float_scratch_reg(); + match src { + RegImm::Imm(imm) => match imm { + I::I32(v) => self.asm.mov_im(v as i32, &dst, size, flags), + I::I64(v) => match v.try_into() { + Ok(v) => self.asm.mov_im(v, &dst, size, flags), + Err(_) => { + // If the immediate doesn't sign extend, use a scratch + // register. + self.asm.mov_ir(v, scratch, size); + self.asm.mov_rm(scratch, &dst, size, flags); + } + }, + I::F32(v) => { + let addr = self.asm.add_constant(v.to_le_bytes().as_slice()); + // Always trusted, since we are loading the constant from + // the constant pool. + self.asm + .xmm_mov_mr(&addr, float_scratch, size, MemFlags::trusted()); + self.asm.xmm_mov_rm(float_scratch, &dst, size, flags); + } + I::F64(v) => { + let addr = self.asm.add_constant(v.to_le_bytes().as_slice()); + // Similar to above, always trusted since we are loading the + // constant from the constant pool. + self.asm + .xmm_mov_mr(&addr, float_scratch, size, MemFlags::trusted()); + self.asm.xmm_mov_rm(float_scratch, &dst, size, flags); + } + }, + RegImm::Reg(reg) => { + if reg.is_int() { + self.asm.mov_rm(reg, &dst, size, flags); + } else { + self.asm.xmm_mov_rm(reg, &dst, size, flags); + } + } + } + } + fn handle_invalid_operand_combination(src: impl Into, dst: impl Into) -> T { panic!( "Invalid operand combination; src={:?}, dst={:?}", diff --git a/winch/codegen/src/isa/x64/mod.rs b/winch/codegen/src/isa/x64/mod.rs index b6dd7ec6436a..59ecc31e2314 100644 --- a/winch/codegen/src/isa/x64/mod.rs +++ b/winch/codegen/src/isa/x64/mod.rs @@ -19,7 +19,7 @@ use cranelift_codegen::{isa::x64::settings as x64_settings, Final, MachBufferFin use cranelift_codegen::{MachTextSectionBuilder, TextSectionBuilder}; use target_lexicon::Triple; use wasmparser::{FuncValidator, FunctionBody, ValidatorResources}; -use wasmtime_environ::{ModuleTranslation, ModuleTypes, VMOffsets, WasmFuncType}; +use wasmtime_environ::{ModuleTranslation, ModuleTypesBuilder, VMOffsets, WasmFuncType}; use self::regs::{ALL_FPR, ALL_GPR, MAX_FPR, MAX_GPR, NON_ALLOCATABLE_FPR, NON_ALLOCATABLE_GPR}; @@ -91,7 +91,7 @@ impl TargetIsa for X64 { sig: &WasmFuncType, body: &FunctionBody, translation: &ModuleTranslation, - types: &ModuleTypes, + types: &ModuleTypesBuilder, builtins: &mut BuiltinFunctions, validator: &mut FuncValidator, ) -> Result> { @@ -107,7 +107,8 @@ impl TargetIsa for X64 { let stack = Stack::new(); let abi_sig = abi::X64ABI::sig(sig, &CallingConvention::Default); - let defined_locals = DefinedLocals::new::(translation, &mut body, validator)?; + let env = FuncEnv::new(&vmoffsets, translation, types, self); + let defined_locals = DefinedLocals::new::(&env, &mut body, validator)?; let frame = Frame::new::(&abi_sig, &defined_locals)?; let gpr = RegBitSet::int( ALL_GPR.into(), @@ -121,7 +122,6 @@ impl TargetIsa for X64 { ); let regalloc = RegAlloc::from(gpr, fpr); - let env = FuncEnv::new(&vmoffsets, translation, types); let codegen_context = CodeGenContext::new(regalloc, stack, frame, builtins, &vmoffsets); let mut codegen = CodeGen::new(&mut masm, codegen_context, env, abi_sig); @@ -169,4 +169,16 @@ impl TargetIsa for X64 { Ok(masm.finalize()) } + + fn emit_unwind_info( + &self, + buffer: &MachBufferFinalized, + kind: cranelift_codegen::isa::unwind::UnwindInfoKind, + ) -> Result> { + Ok(cranelift_codegen::isa::x64::emit_unwind_info(buffer, kind)?) + } + + fn create_systemv_cie(&self) -> Option { + Some(cranelift_codegen::isa::x64::create_cie()) + } } diff --git a/winch/codegen/src/masm.rs b/winch/codegen/src/masm.rs index c225320dc6c7..b3dd603f0c7f 100644 --- a/winch/codegen/src/masm.rs +++ b/winch/codegen/src/masm.rs @@ -1,7 +1,10 @@ use crate::abi::{self, align_to, LocalSlot}; -use crate::codegen::{ptr_type_from_ptr_size, CodeGenContext, TableData}; +use crate::codegen::{CodeGenContext, HeapData, TableData}; use crate::isa::reg::Reg; -use cranelift_codegen::{ir::LibCall, Final, MachBufferFinalized, MachLabel}; +use cranelift_codegen::{ + ir::{Endianness, LibCall, MemFlags}, + Final, MachBufferFinalized, MachLabel, +}; use std::{fmt::Debug, ops::Range}; use wasmtime_environ::PtrSize; @@ -23,8 +26,40 @@ pub(crate) enum RemKind { Unsigned, } +/// The direction to perform the memory move. +#[derive(Debug, Clone, Eq, PartialEq)] +pub(crate) enum MemMoveDirection { + /// From high memory addresses to low memory addresses. + /// Invariant: the source location is closer to the FP than the destination + /// location, which will be closer to the SP. + HighToLow, + /// From low memory addresses to high memory addresses. + /// Invariant: the source location is closer to the SP than the destination + /// location, which will be closer to the FP. + LowToHigh, +} + +/// Classifies how to treat float-to-int conversions. +#[derive(Debug, Copy, Clone, Eq, PartialEq)] +pub(crate) enum TruncKind { + /// Saturating conversion. If the source value is greater than the maximum + /// value of the destination type, the result is clamped to the + /// destination maximum value. + Checked, + /// An exception is raised if the source value is greater than the maximum + /// value of the destination type. + Unchecked, +} + +impl TruncKind { + /// Returns true if the truncation kind is checked. + pub(crate) fn is_checked(&self) -> bool { + *self == TruncKind::Checked + } +} + /// Representation of the stack pointer offset. -#[derive(Copy, Clone, Eq, PartialEq, Debug)] +#[derive(Copy, Clone, Eq, PartialEq, Debug, PartialOrd, Ord, Default)] pub struct SPOffset(u32); impl SPOffset { @@ -114,9 +149,33 @@ pub(crate) enum ShiftKind { Rotr, } +/// Kinds of extends in WebAssembly. Each MacroAssembler implementation +/// is responsible for emitting the correct sequence of instructions when +/// lowering to machine code. +pub(crate) enum ExtendKind { + /// Sign extends i32 to i64. + I64ExtendI32S, + /// Zero extends i32 to i64. + I64ExtendI32U, + // Sign extends the 8 least significant bits to 32 bits. + I32Extend8S, + // Sign extends the 16 least significant bits to 32 bits. + I32Extend16S, + /// Sign extends the 8 least significant bits to 64 bits. + I64Extend8S, + /// Sign extends the 16 least significant bits to 64 bits. + I64Extend16S, + /// Sign extends the 32 least significant bits to 64 bits. + I64Extend32S, +} + /// Operand size, in bits. #[derive(Copy, Debug, Clone, Eq, PartialEq)] pub(crate) enum OperandSize { + /// 8 bits. + S8, + /// 16 bits. + S16, /// 32 bits. S32, /// 64 bits. @@ -127,8 +186,10 @@ pub(crate) enum OperandSize { impl OperandSize { /// The number of bits in the operand. - pub fn num_bits(&self) -> i32 { + pub fn num_bits(&self) -> u8 { match self { + OperandSize::S8 => 8, + OperandSize::S16 => 16, OperandSize::S32 => 32, OperandSize::S64 => 64, OperandSize::S128 => 128, @@ -138,6 +199,8 @@ impl OperandSize { /// The number of bytes in the operand. pub fn bytes(&self) -> u32 { match self { + Self::S8 => 1, + Self::S16 => 2, Self::S32 => 4, Self::S64 => 8, Self::S128 => 16, @@ -147,6 +210,8 @@ impl OperandSize { /// The binary logarithm of the number of bits in the operand. pub fn log2(&self) -> u8 { match self { + OperandSize::S8 => 3, + OperandSize::S16 => 4, OperandSize::S32 => 5, OperandSize::S64 => 6, OperandSize::S128 => 7, @@ -293,6 +358,14 @@ pub enum RoundingMode { Zero, } +/// Memory flags for trusted loads/stores. +pub const TRUSTED_FLAGS: MemFlags = MemFlags::trusted(); + +/// Flags used for WebAssembly loads / stores. +/// Untrusted by default so we don't set `no_trap`. +/// We also ensure that the endianess is the right one for WebAssembly. +pub const UNTRUSTED_FLAGS: MemFlags = MemFlags::new().with_endianness(Endianness::Little); + /// Generic MacroAssembler interface used by the code generation. /// /// The MacroAssembler trait aims to expose an interface, high-level enough, @@ -324,6 +397,9 @@ pub(crate) trait MacroAssembler { /// Emit the function prologue. fn prologue(&mut self); + /// Emit a stack check. + fn check_stack(&mut self); + /// Emit the function epilogue. fn epilogue(&mut self, locals_size: u32); @@ -355,6 +431,9 @@ pub(crate) trait MacroAssembler { /// Retrieves the size of the table, pushing the result to the value stack. fn table_size(&mut self, table_data: &TableData, context: &mut CodeGenContext); + /// Retrieves the size of the memory, pushing the result to the value stack. + fn memory_size(&mut self, heap_data: &HeapData, context: &mut CodeGenContext); + /// Constructs an address with an offset that is relative to the /// current position of the stack pointer (e.g. [sp + (sp_offset - /// offset)]. @@ -382,9 +461,39 @@ pub(crate) trait MacroAssembler { /// Perform a stack store. fn store(&mut self, src: RegImm, dst: Self::Address, size: OperandSize); - /// Perform a stack load. + /// Alias for `MacroAssembler::store` with the operand size corresponding + /// to the pointer size of the target. + fn store_ptr(&mut self, src: Reg, dst: Self::Address); + + /// Perform a WebAssembly store. + /// A WebAssebly store introduces several additional invariants compared to + /// [Self::store], more precisely, it can implicitly trap, in certain + /// circumstances, even if explicit bounds checks are elided, in that sense, + /// we consider this type of load as untrusted. It can also differ with + /// regards to the endianess depending on the target ISA. For this reason, + /// [Self::wasm_store], should be explicitly used when emitting WebAssembly + /// stores. + fn wasm_store(&mut self, src: Reg, dst: Self::Address, size: OperandSize); + + /// Perform a zero-extended stack load. fn load(&mut self, src: Self::Address, dst: Reg, size: OperandSize); + /// Perform a WebAssembly load. + /// A WebAssebly load introduces several additional invariants compared to + /// [Self::load], more precisely, it can implicitly trap, in certain + /// circumstances, even if explicit bounds checks are elided, in that sense, + /// we consider this type of load as untrusted. It can also differ with + /// regards to the endianess depending on the target ISA. For this reason, + /// [Self::wasm_load], should be explicitly used when emitting WebAssembly + /// loads. + fn wasm_load( + &mut self, + src: Self::Address, + dst: Reg, + size: OperandSize, + kind: Option, + ); + /// Alias for `MacroAssembler::load` with the operand size corresponding /// to the pointer size of the target. fn load_ptr(&mut self, src: Self::Address, dst: Reg); @@ -392,10 +501,6 @@ pub(crate) trait MacroAssembler { /// Loads the effective address into destination. fn load_addr(&mut self, _src: Self::Address, _dst: Reg, _size: OperandSize); - /// Alias for `MacroAssembler::store` with the operand size corresponding - /// to the pointer size of the target. - fn store_ptr(&mut self, src: Reg, dst: Self::Address); - /// Pop a value from the machine stack into the given register. fn pop(&mut self, dst: Reg, size: OperandSize); @@ -407,32 +512,30 @@ pub(crate) trait MacroAssembler { /// Performs a memory move of bytes from src to dest. /// Bytes are moved in blocks of 8 bytes, where possible. - fn memmove(&mut self, src: SPOffset, dst: SPOffset, bytes: u32) { - debug_assert!(dst.as_u32() < src.as_u32()); + fn memmove(&mut self, src: SPOffset, dst: SPOffset, bytes: u32, direction: MemMoveDirection) { + match direction { + MemMoveDirection::LowToHigh => debug_assert!(dst.as_u32() < src.as_u32()), + MemMoveDirection::HighToLow => debug_assert!(dst.as_u32() > src.as_u32()), + } // At least 4 byte aligned. debug_assert!(bytes % 4 == 0); let mut remaining = bytes; let word_bytes = ::word_bytes(); let scratch = ::scratch_reg(); - let ptr_size: OperandSize = ptr_type_from_ptr_size(word_bytes as u8).into(); let mut dst_offs = dst.as_u32() - bytes; let mut src_offs = src.as_u32() - bytes; + let word_bytes = word_bytes as u32; while remaining >= word_bytes { remaining -= word_bytes; dst_offs += word_bytes; src_offs += word_bytes; - self.load( - self.address_from_sp(SPOffset::from_u32(src_offs)), - scratch, - ptr_size, - ); - self.store( + self.load_ptr(self.address_from_sp(SPOffset::from_u32(src_offs)), scratch); + self.store_ptr( scratch.into(), self.address_from_sp(SPOffset::from_u32(dst_offs)), - ptr_size, ); } @@ -459,6 +562,10 @@ pub(crate) trait MacroAssembler { /// Perform add operation. fn add(&mut self, dst: Reg, lhs: Reg, rhs: RegImm, size: OperandSize); + /// Perform a checked unsigned integer addition, emitting the provided trap + /// if the addition overflows. + fn checked_uadd(&mut self, dst: Reg, lhs: Reg, rhs: RegImm, size: OperandSize, trap: TrapCode); + /// Perform subtraction operation. fn sub(&mut self, dst: Reg, lhs: Reg, rhs: RegImm, size: OperandSize); @@ -580,13 +687,69 @@ pub(crate) trait MacroAssembler { /// this will emit multiple instructions if the `has_popcnt` flag is false. fn popcnt(&mut self, context: &mut CodeGenContext, size: OperandSize); + /// Converts an i64 to an i32 by discarding the high 32 bits. + fn wrap(&mut self, src: Reg, dst: Reg); + + /// Extends an integer of a given size to a larger size. + fn extend(&mut self, src: Reg, dst: Reg, kind: ExtendKind); + + /// Emits one or more instructions to perform a signed truncation of a + /// float into an integer. + fn signed_truncate( + &mut self, + src: Reg, + dst: Reg, + src_size: OperandSize, + dst_size: OperandSize, + kind: TruncKind, + ); + + /// Emits one or more instructions to perform an unsigned truncation of a + /// float into an integer. + fn unsigned_truncate( + &mut self, + src: Reg, + dst: Reg, + tmp_fpr: Reg, + src_size: OperandSize, + dst_size: OperandSize, + kind: TruncKind, + ); + + /// Emits one or more instructions to perform a signed convert of an + /// integer into a float. + fn signed_convert(&mut self, src: Reg, dst: Reg, src_size: OperandSize, dst_size: OperandSize); + + /// Emits one or more instructions to perform an unsigned convert of an + /// integer into a float. + fn unsigned_convert( + &mut self, + src: Reg, + dst: Reg, + tmp_gpr: Reg, + src_size: OperandSize, + dst_size: OperandSize, + ); + + /// Reinterpret a float as an integer. + fn reinterpret_float_as_int(&mut self, src: Reg, dst: Reg, size: OperandSize); + + /// Reinterpret an integer as a float. + fn reinterpret_int_as_float(&mut self, src: Reg, dst: Reg, size: OperandSize); + + /// Demote an f64 to an f32. + fn demote(&mut self, src: Reg, dst: Reg); + + /// Promote an f32 to an f64. + fn promote(&mut self, src: Reg, dst: Reg); + /// Zero a given memory range. /// /// The default implementation divides the given memory range /// into word-sized slots. Then it unrolls a series of store /// instructions, effectively assigning zero to each slot. fn zero_mem_range(&mut self, mem: &Range) { - let word_size = ::word_bytes(); + let word_size = ::word_bytes() as u32; if mem.is_empty() { return; } @@ -658,9 +821,32 @@ pub(crate) trait MacroAssembler { /// Emit an unreachable code trap. fn unreachable(&mut self); + /// Emit an unconditional trap. + fn trap(&mut self, code: TrapCode); + /// Traps if the condition code is met. fn trapif(&mut self, cc: IntCmpKind, code: TrapCode); /// Trap if the source register is zero. fn trapz(&mut self, src: Reg, code: TrapCode); + + /// Ensures that the stack pointer is correctly positioned before an unconditional + /// jump according to the requirements of the destination target. + fn ensure_sp_for_jump(&mut self, target: SPOffset) { + let bytes = self + .sp_offset() + .as_u32() + .checked_sub(target.as_u32()) + .unwrap_or(0); + if bytes > 0 { + self.free_stack(bytes); + } + } + + /// Save the value of this register to the stack. By default this is the same as pushing the + /// register, however it's present in the [`MacroAssembler`] trait to ensure that it's possible + /// to add unwind info for register saves in backends. + fn save(&mut self, _off: u32, src: Reg, size: OperandSize) -> StackSlot { + self.push(src, size) + } } diff --git a/winch/codegen/src/stack.rs b/winch/codegen/src/stack.rs index 776cfae37b26..5e3cde00b274 100644 --- a/winch/codegen/src/stack.rs +++ b/winch/codegen/src/stack.rs @@ -1,7 +1,6 @@ use crate::{isa::reg::Reg, masm::StackSlot}; -use std::collections::VecDeque; use wasmparser::{Ieee32, Ieee64}; -use wasmtime_environ::WasmType; +use wasmtime_environ::WasmValType; /// A typed register value used to track register values in the value /// stack. @@ -10,19 +9,19 @@ pub struct TypedReg { /// The physical register. pub reg: Reg, /// The type associated to the physical register. - pub ty: WasmType, + pub ty: WasmValType, } impl TypedReg { /// Create a new [`TypedReg`]. - pub fn new(ty: WasmType, reg: Reg) -> Self { + pub fn new(ty: WasmValType, reg: Reg) -> Self { Self { ty, reg } } /// Create an i64 [`TypedReg`]. pub fn i64(reg: Reg) -> Self { Self { - ty: WasmType::I64, + ty: WasmValType::I64, reg, } } @@ -30,7 +29,23 @@ impl TypedReg { /// Create an i32 [`TypedReg`]. pub fn i32(reg: Reg) -> Self { Self { - ty: WasmType::I32, + ty: WasmValType::I32, + reg, + } + } + + /// Create an f64 [`TypedReg`]. + pub fn f64(reg: Reg) -> Self { + Self { + ty: WasmValType::F64, + reg, + } + } + + /// Create an f32 [`TypedReg`]. + pub fn f32(reg: Reg) -> Self { + Self { + ty: WasmValType::F32, reg, } } @@ -48,14 +63,14 @@ pub struct Local { /// The index of the local. pub index: u32, /// The type of the local. - pub ty: WasmType, + pub ty: WasmValType, } /// A memory value. #[derive(Debug, Eq, PartialEq, Copy, Clone)] pub struct Memory { /// The type associated with the memory offset. - pub ty: WasmType, + pub ty: WasmValType, /// The stack slot corresponding to the memory value. pub slot: StackSlot, } @@ -125,17 +140,17 @@ impl Val { } /// Create a new Reg value. - pub fn reg(reg: Reg, ty: WasmType) -> Self { + pub fn reg(reg: Reg, ty: WasmValType) -> Self { Self::Reg(TypedReg { reg, ty }) } /// Create a new Local value. - pub fn local(index: u32, ty: WasmType) -> Self { + pub fn local(index: u32, ty: WasmValType) -> Self { Self::Local(Local { index, ty }) } /// Create a Memory value. - pub fn mem(ty: WasmType, slot: StackSlot) -> Self { + pub fn mem(ty: WasmValType, slot: StackSlot) -> Self { Self::Memory(Memory { ty, slot }) } @@ -155,6 +170,14 @@ impl Val { } } + /// Check whether the value is a constant. + pub fn is_const(&self) -> bool { + match *self { + Val::I32(_) | Val::I64(_) | Val::F32(_) | Val::F64(_) => true, + _ => false, + } + } + /// Check whether the value is local with a particular index. pub fn is_local_at_index(&self, index: u32) -> bool { match *self { @@ -221,12 +244,12 @@ impl Val { } /// Get the type of the value. - pub fn ty(&self) -> WasmType { + pub fn ty(&self) -> WasmValType { match self { - Val::I32(_) => WasmType::I32, - Val::I64(_) => WasmType::I64, - Val::F32(_) => WasmType::F32, - Val::F64(_) => WasmType::F64, + Val::I32(_) => WasmValType::I32, + Val::I64(_) => WasmValType::I64, + Val::F32(_) => WasmValType::F32, + Val::F64(_) => WasmValType::F64, Val::Reg(r) => r.ty, Val::Memory(m) => m.ty, Val::Local(l) => l.ty, @@ -237,7 +260,7 @@ impl Val { /// The shadow stack used for compilation. #[derive(Default, Debug)] pub(crate) struct Stack { - inner: VecDeque, + inner: Vec, } impl Stack { @@ -290,12 +313,12 @@ impl Stack { /// Push a value to the stack. pub fn push(&mut self, val: Val) { - self.inner.push_back(val); + self.inner.push(val); } /// Peek into the top in the stack. pub fn peek(&self) -> Option<&Val> { - self.inner.back() + self.inner.last() } /// Returns an iterator referencing the last n items of the stack, @@ -305,29 +328,12 @@ impl Stack { assert!(n <= len); let partition = len - n; - self.inner.range(partition..) - } - - /// Duplicates the top `n` elements of the stack. - // Will be needed for control flow, it's just not integrated yet. - #[allow(dead_code)] - pub fn dup(&mut self, n: usize) { - let len = self.len(); - assert!(n <= len); - let partition = len - n; - - if n > 0 { - for e in partition..len { - if let Some(v) = self.inner.get(e) { - self.push(*v) - } - } - } + self.inner[partition..].into_iter() } /// Pops the top element of the stack, if any. pub fn pop(&mut self) -> Option { - self.inner.pop_back() + self.inner.pop() } /// Pops the element at the top of the stack if it is an i32 const; @@ -369,16 +375,33 @@ impl Stack { } /// Get a mutable reference to the inner stack representation. - pub fn inner_mut(&mut self) -> &mut VecDeque { + pub fn inner_mut(&mut self) -> &mut Vec { &mut self.inner } + + /// Get a reference to the inner stack representation. + pub fn inner(&self) -> &Vec { + &self.inner + } + + /// Calculates the size of, in bytes, of the top n [Memory] entries + /// in the value stack. + pub fn sizeof(&self, top: usize) -> u32 { + self.peekn(top).fold(0, |acc, v| { + if v.is_mem() { + acc + v.unwrap_mem().slot.size + } else { + acc + } + }) + } } #[cfg(test)] mod tests { use super::{Stack, Val}; use crate::isa::reg::Reg; - use wasmtime_environ::WasmType; + use wasmtime_environ::WasmValType; #[test] fn test_pop_i32_const() { @@ -386,7 +409,7 @@ mod tests { stack.push(Val::i32(33i32)); assert_eq!(33, stack.pop_i32_const().unwrap()); - stack.push(Val::local(10, WasmType::I32)); + stack.push(Val::local(10, WasmValType::I32)); assert!(stack.pop_i32_const().is_none()); } @@ -394,7 +417,7 @@ mod tests { fn test_pop_reg() { let mut stack = Stack::new(); let reg = Reg::int(2usize); - stack.push(Val::reg(reg, WasmType::I32)); + stack.push(Val::reg(reg, WasmValType::I32)); stack.push(Val::i32(4)); assert_eq!(None, stack.pop_reg()); @@ -406,8 +429,8 @@ mod tests { fn test_pop_named_reg() { let mut stack = Stack::new(); let reg = Reg::int(2usize); - stack.push(Val::reg(reg, WasmType::I32)); - stack.push(Val::reg(Reg::int(4), WasmType::I32)); + stack.push(Val::reg(reg, WasmValType::I32)); + stack.push(Val::reg(Reg::int(4), WasmValType::I32)); assert_eq!(None, stack.pop_named_reg(reg)); let _ = stack.pop().unwrap(); diff --git a/winch/codegen/src/trampoline.rs b/winch/codegen/src/trampoline.rs index bb2f399bda95..515373415bad 100644 --- a/winch/codegen/src/trampoline.rs +++ b/winch/codegen/src/trampoline.rs @@ -9,9 +9,6 @@ // loading/storing the VM context pointer. The real value of the operand size // and VM context type should be derived from the ABI's pointer size. This is // going to be relevant once 32-bit architectures are supported. -// -// TODO: Are guardrails needed for params/results? Especially when dealing -// with the array calling convention. use crate::{ abi::{ABIOperand, ABIParams, ABISig, RetArea, ABI}, codegen::ptr_type_from_ptr_size, @@ -22,7 +19,7 @@ use crate::{ use anyhow::{anyhow, Result}; use smallvec::SmallVec; use std::mem; -use wasmtime_environ::{FuncIndex, PtrSize, WasmFuncType, WasmType}; +use wasmtime_environ::{FuncIndex, PtrSize, WasmFuncType, WasmValType}; /// The supported trampoline kinds. /// See @@ -63,7 +60,7 @@ where /// The pointer size of the current ISA. pointer_size: M::Ptr, /// WasmType representation of the pointer size. - pointer_type: WasmType, + pointer_type: WasmValType, } impl<'a, M> Trampoline<'a, M> @@ -148,15 +145,12 @@ where // Move the val ptr back into the scratch register so we can // load the return values. let val_ptr_offset = offsets[2]; - self.masm.load( - self.masm.address_from_sp(val_ptr_offset), - self.scratch_reg, - OperandSize::S64, - ); + self.masm + .load_ptr(self.masm.address_from_sp(val_ptr_offset), self.scratch_reg); self.store_results_to_array(&wasm_sig, ret_area.as_ref()); - if wasm_sig.results.has_stack_results() { + if wasm_sig.has_stack_results() { self.masm.free_stack(wasm_sig.results.size()); } @@ -183,7 +177,8 @@ where } _ => unreachable!(), }; - self.masm.load(addr, self.alloc_scratch_reg, (*ty).into()); + let size: OperandSize = (*ty).into(); + self.masm.load(addr, self.alloc_scratch_reg, size); self.masm.store( self.alloc_scratch_reg.into(), self.masm.address_at_reg(self.scratch_reg, value_offset), @@ -240,7 +235,7 @@ where self.masm.free_stack(reserved_stack); self.forward_results(&wasm_sig, &native_sig, ret_area.as_ref(), offsets.last()); - if wasm_sig.results.has_stack_results() { + if wasm_sig.has_stack_results() { self.masm.free_stack(wasm_sig.results.size()); } self.epilogue_with_callee_saved_restore(spill_size); @@ -250,7 +245,7 @@ where /// Creates the return area in the caller's frame. fn make_ret_area(&mut self, sig: &ABISig) -> Option { - sig.results.has_stack_results().then(|| { + sig.has_stack_results().then(|| { self.masm.reserve_stack(sig.results.size()); let offs = self.masm.sp_offset(); RetArea::sp(offs) @@ -291,18 +286,20 @@ where let results_spill = self.spill(callee_sig.results()); let mut spill_offsets_iter = results_spill.0.iter(); - let caller_retptr = caller_sig.results.has_stack_results().then(|| { + let caller_retptr = caller_sig.has_stack_results().then(|| { let fp = ::fp_reg(); let arg_base: u32 = ::arg_base_offset().into(); match caller_sig.params.unwrap_results_area_operand() { ABIOperand::Reg { ty, .. } => { let addr = self.masm.address_from_sp(*caller_retptr_offset.unwrap()); - self.masm.load(addr, self.scratch_reg, (*ty).into()); + let size: OperandSize = (*ty).into(); + self.masm.load(addr, self.scratch_reg, size); self.scratch_reg } ABIOperand::Stack { ty, offset, .. } => { + let size: OperandSize = (*ty).into(); let addr = self.masm.address_at_reg(fp, arg_base + offset); - self.masm.load(addr, self.scratch_reg, (*ty).into()); + self.masm.load(addr, self.scratch_reg, size); self.scratch_reg } } @@ -314,10 +311,11 @@ where match (callee_operand, caller_operand) { (ABIOperand::Reg { ty, .. }, ABIOperand::Stack { offset, .. }) => { let reg_offset = spill_offsets_iter.next().unwrap(); + let size: OperandSize = (*ty).into(); self.masm.load( self.masm.address_from_sp(*reg_offset), self.alloc_scratch_reg, - (*ty).into(), + size, ); self.masm.store( self.alloc_scratch_reg.into(), @@ -337,8 +335,9 @@ where let slot_offset = base.as_u32() - *offset; self.masm.address_from_sp(SPOffset::from_u32(slot_offset)) }; + let size: OperandSize = (*ty).into(); - self.masm.load(addr, self.alloc_scratch_reg, (*ty).into()); + self.masm.load(addr, self.alloc_scratch_reg, size); self.masm.store( self.alloc_scratch_reg.into(), self.masm @@ -357,11 +356,8 @@ where } (ABIOperand::Reg { ty, .. }, ABIOperand::Reg { reg: dst, .. }) => { let spill_offset = spill_offsets_iter.next().unwrap(); - self.masm.load( - self.masm.address_from_sp(*spill_offset), - (*dst).into(), - (*ty).into(), - ); + self.masm + .load(self.masm.address_from_sp(*spill_offset), *dst, (*ty).into()); } } } @@ -418,7 +414,7 @@ where let body_offset = self.pointer_size.vmnative_call_host_func_context_func_ref() + self.pointer_size.vm_func_ref_native_call(); let callee_addr = masm.address_at_reg(self.alloc_scratch_reg, body_offset.into()); - masm.load(callee_addr, self.scratch_reg, OperandSize::S64); + masm.load_ptr(callee_addr, self.scratch_reg); CalleeKind::Indirect(self.scratch_reg) }); @@ -426,7 +422,7 @@ where self.masm.free_stack(reserved_stack); self.forward_results(&native_sig, &wasm_sig, ret_area.as_ref(), offsets.last()); - if native_sig.results.has_stack_results() { + if native_sig.has_stack_results() { self.masm.free_stack(native_sig.results.size()); } @@ -464,7 +460,8 @@ where (ABIOperand::Stack { ty, offset, .. }, ABIOperand::Reg { .. }) => { let spill_offset = caller_stack_offsets[offset_index]; let addr = masm.address_from_sp(spill_offset); - masm.load(addr, scratch, (*ty).into()); + let size: OperandSize = (*ty).into(); + masm.load(addr, scratch, size); let arg_addr = masm.address_at_sp(SPOffset::from_u32(*offset)); masm.store(scratch.into(), arg_addr, (*ty).into()); @@ -498,7 +495,7 @@ where } /// Get the type of the caller and callee VM contexts. - fn callee_and_caller_vmctx_types(&self) -> SmallVec<[WasmType; 2]> { + fn callee_and_caller_vmctx_types(&self) -> SmallVec<[WasmValType; 2]> { std::iter::repeat(self.pointer_type).take(2).collect() } @@ -663,7 +660,7 @@ where ptr: &impl PtrSize, ) { let sp = ::sp_reg(); - masm.load(vm_runtime_limits_addr, scratch, OperandSize::S64); + masm.load_ptr(vm_runtime_limits_addr, scratch); let addr = masm.address_at_reg(scratch, ptr.vmruntime_limits_last_wasm_entry_sp().into()); masm.store(sp.into(), addr, OperandSize::S64); } @@ -675,7 +672,7 @@ where alloc_scratch: Reg, ptr: &impl PtrSize, ) { - masm.load(vm_runtime_limits_addr, alloc_scratch, OperandSize::S64); + masm.load_ptr(vm_runtime_limits_addr, alloc_scratch); let last_wasm_exit_fp_addr = masm.address_at_reg( alloc_scratch, ptr.vmruntime_limits_last_wasm_exit_fp().into(), @@ -688,13 +685,13 @@ where // Handle the frame pointer. let fp = ::fp_reg(); let fp_addr = masm.address_at_reg(fp, 0); - masm.load(fp_addr, scratch, OperandSize::S64); + masm.load_ptr(fp_addr, scratch); masm.store(scratch.into(), last_wasm_exit_fp_addr, OperandSize::S64); // Handle the return address. let ret_addr_offset = ::ret_addr_offset(); let ret_addr = masm.address_at_reg(fp, ret_addr_offset.into()); - masm.load(ret_addr, scratch, OperandSize::S64); + masm.load_ptr(ret_addr, scratch); masm.store(scratch.into(), last_wasm_exit_pc_addr, OperandSize::S64); } @@ -708,8 +705,10 @@ where fn prologue_with_callee_saved(&mut self) { self.masm.prologue(); // Save any callee-saved registers. + let mut off = 0; for (r, s) in &self.callee_saved_regs { - self.masm.push(*r, *s); + let slot = self.masm.save(off, *r, *s); + off += slot.size; } } diff --git a/winch/codegen/src/visitor.rs b/winch/codegen/src/visitor.rs index 3b133dfeb35d..d52b2a49e7db 100644 --- a/winch/codegen/src/visitor.rs +++ b/winch/codegen/src/visitor.rs @@ -4,20 +4,20 @@ //! which validates and dispatches to the corresponding //! machine code emitter. -use crate::abi::ABI; +use crate::abi::{RetArea, ABI}; use crate::codegen::{control_index, Callee, CodeGen, ControlStackFrame, FnCall}; use crate::masm::{ - DivKind, FloatCmpKind, IntCmpKind, MacroAssembler, OperandSize, RegImm, RemKind, RoundingMode, - ShiftKind, + DivKind, ExtendKind, FloatCmpKind, IntCmpKind, MacroAssembler, MemMoveDirection, OperandSize, + RegImm, RemKind, RoundingMode, SPOffset, ShiftKind, TruncKind, }; use crate::stack::{TypedReg, Val}; use cranelift_codegen::ir::TrapCode; +use regalloc2::RegClass; use smallvec::SmallVec; -use wasmparser::BrTable; -use wasmparser::{BlockType, Ieee32, Ieee64, VisitOperator}; +use wasmparser::{BlockType, BrTable, Ieee32, Ieee64, MemArg, VisitOperator}; use wasmtime_environ::{ - FuncIndex, GlobalIndex, TableIndex, TableStyle, TypeIndex, WasmHeapType, WasmType, - FUNCREF_INIT_BIT, + FuncIndex, GlobalIndex, MemoryIndex, TableIndex, TableStyle, TypeIndex, WasmHeapType, + WasmValType, FUNCREF_INIT_BIT, }; /// A macro to define unsupported WebAssembly operators. @@ -85,6 +85,18 @@ macro_rules! def_unsupported { (emit F64Le $($rest:tt)*) => {}; (emit F32Ge $($rest:tt)*) => {}; (emit F64Ge $($rest:tt)*) => {}; + (emit F32ConvertI32S $($rest:tt)*) => {}; + (emit F32ConvertI32U $($rest:tt)*) => {}; + (emit F32ConvertI64S $($rest:tt)*) => {}; + (emit F32ConvertI64U $($rest:tt)*) => {}; + (emit F64ConvertI32S $($rest:tt)*) => {}; + (emit F64ConvertI32U $($rest:tt)*) => {}; + (emit F64ConvertI64S $($rest:tt)*) => {}; + (emit F64ConvertI64U $($rest:tt)*) => {}; + (emit F32ReinterpretI32 $($rest:tt)*) => {}; + (emit F64ReinterpretI64 $($rest:tt)*) => {}; + (emit F32DemoteF64 $($rest:tt)*) => {}; + (emit F64PromoteF32 $($rest:tt)*) => {}; (emit I32Add $($rest:tt)*) => {}; (emit I64Add $($rest:tt)*) => {}; (emit I32Sub $($rest:tt)*) => {}; @@ -143,6 +155,24 @@ macro_rules! def_unsupported { (emit I64Ctz $($rest:tt)*) => {}; (emit I32Popcnt $($rest:tt)*) => {}; (emit I64Popcnt $($rest:tt)*) => {}; + (emit I32WrapI64 $($rest:tt)*) => {}; + (emit I64ExtendI32S $($rest:tt)*) => {}; + (emit I64ExtendI32U $($rest:tt)*) => {}; + (emit I32Extend8S $($rest:tt)*) => {}; + (emit I32Extend16S $($rest:tt)*) => {}; + (emit I64Extend8S $($rest:tt)*) => {}; + (emit I64Extend16S $($rest:tt)*) => {}; + (emit I64Extend32S $($rest:tt)*) => {}; + (emit I32TruncF32S $($rest:tt)*) => {}; + (emit I32TruncF32U $($rest:tt)*) => {}; + (emit I32TruncF64S $($rest:tt)*) => {}; + (emit I32TruncF64U $($rest:tt)*) => {}; + (emit I64TruncF32S $($rest:tt)*) => {}; + (emit I64TruncF32U $($rest:tt)*) => {}; + (emit I64TruncF64S $($rest:tt)*) => {}; + (emit I64TruncF64U $($rest:tt)*) => {}; + (emit I32ReinterpretF32 $($rest:tt)*) => {}; + (emit I64ReinterpretF64 $($rest:tt)*) => {}; (emit LocalGet $($rest:tt)*) => {}; (emit LocalSet $($rest:tt)*) => {}; (emit Call $($rest:tt)*) => {}; @@ -171,6 +201,45 @@ macro_rules! def_unsupported { (emit TableSize $($rest:tt)*) => {}; (emit TableFill $($rest:tt)*) => {}; (emit ElemDrop $($rest:tt)*) => {}; + (emit MemoryInit $($rest:tt)*) => {}; + (emit MemoryCopy $($rest:tt)*) => {}; + (emit DataDrop $($rest:tt)*) => {}; + (emit MemoryFill $($rest:tt)*) => {}; + (emit MemorySize $($rest:tt)*) => {}; + (emit MemoryGrow $($rest:tt)*) => {}; + (emit I32Load $($rest:tt)*) => {}; + (emit I32Load8S $($rest:tt)*) => {}; + (emit I32Load8U $($rest:tt)*) => {}; + (emit I32Load16S $($rest:tt)*) => {}; + (emit I32Load16U $($rest:tt)*) => {}; + (emit I64Load8S $($rest:tt)*) => {}; + (emit I64Load8U $($rest:tt)*) => {}; + (emit I64Load16S $($rest:tt)*) => {}; + (emit I64Load16U $($rest:tt)*) => {}; + (emit I64Load32S $($rest:tt)*) => {}; + (emit I64Load32U $($rest:tt)*) => {}; + (emit I64Load $($rest:tt)*) => {}; + (emit I32Store $($rest:tt)*) => {}; + (emit I32Store $($rest:tt)*) => {}; + (emit I32Store8 $($rest:tt)*) => {}; + (emit I32Store16 $($rest:tt)*) => {}; + (emit I64Store $($rest:tt)*) => {}; + (emit I64Store8 $($rest:tt)*) => {}; + (emit I64Store16 $($rest:tt)*) => {}; + (emit I64Store32 $($rest:tt)*) => {}; + (emit F32Load $($rest:tt)*) => {}; + (emit F32Store $($rest:tt)*) => {}; + (emit F64Load $($rest:tt)*) => {}; + (emit F64Store $($rest:tt)*) => {}; + (emit I32TruncSatF32S $($rest:tt)*) => {}; + (emit I32TruncSatF32U $($rest:tt)*) => {}; + (emit I32TruncSatF64S $($rest:tt)*) => {}; + (emit I32TruncSatF64U $($rest:tt)*) => {}; + (emit I64TruncSatF32S $($rest:tt)*) => {}; + (emit I64TruncSatF32U $($rest:tt)*) => {}; + (emit I64TruncSatF64S $($rest:tt)*) => {}; + (emit I64TruncSatF64U $($rest:tt)*) => {}; + (emit $unsupported:tt $($rest:tt)*) => {$($rest)*}; } @@ -203,6 +272,7 @@ where OperandSize::S32, &mut |masm: &mut M, dst, src, size| { masm.float_add(dst, dst, src, size); + TypedReg::f32(dst) }, ); } @@ -213,6 +283,7 @@ where OperandSize::S64, &mut |masm: &mut M, dst, src, size| { masm.float_add(dst, dst, src, size); + TypedReg::f64(dst) }, ); } @@ -223,6 +294,7 @@ where OperandSize::S32, &mut |masm: &mut M, dst, src, size| { masm.float_sub(dst, dst, src, size); + TypedReg::f32(dst) }, ); } @@ -233,6 +305,7 @@ where OperandSize::S64, &mut |masm: &mut M, dst, src, size| { masm.float_sub(dst, dst, src, size); + TypedReg::f64(dst) }, ); } @@ -243,6 +316,7 @@ where OperandSize::S32, &mut |masm: &mut M, dst, src, size| { masm.float_mul(dst, dst, src, size); + TypedReg::f32(dst) }, ); } @@ -253,6 +327,7 @@ where OperandSize::S64, &mut |masm: &mut M, dst, src, size| { masm.float_mul(dst, dst, src, size); + TypedReg::f64(dst) }, ); } @@ -263,6 +338,7 @@ where OperandSize::S32, &mut |masm: &mut M, dst, src, size| { masm.float_div(dst, dst, src, size); + TypedReg::f32(dst) }, ); } @@ -273,6 +349,7 @@ where OperandSize::S64, &mut |masm: &mut M, dst, src, size| { masm.float_div(dst, dst, src, size); + TypedReg::f64(dst) }, ); } @@ -283,6 +360,7 @@ where OperandSize::S32, &mut |masm: &mut M, dst, src, size| { masm.float_min(dst, dst, src, size); + TypedReg::f32(dst) }, ); } @@ -293,6 +371,7 @@ where OperandSize::S64, &mut |masm: &mut M, dst, src, size| { masm.float_min(dst, dst, src, size); + TypedReg::f64(dst) }, ); } @@ -303,6 +382,7 @@ where OperandSize::S32, &mut |masm: &mut M, dst, src, size| { masm.float_max(dst, dst, src, size); + TypedReg::f32(dst) }, ); } @@ -313,6 +393,7 @@ where OperandSize::S64, &mut |masm: &mut M, dst, src, size| { masm.float_max(dst, dst, src, size); + TypedReg::f64(dst) }, ); } @@ -323,6 +404,7 @@ where OperandSize::S32, &mut |masm: &mut M, dst, src, size| { masm.float_copysign(dst, dst, src, size); + TypedReg::f32(dst) }, ); } @@ -333,6 +415,7 @@ where OperandSize::S64, &mut |masm: &mut M, dst, src, size| { masm.float_copysign(dst, dst, src, size); + TypedReg::f64(dst) }, ); } @@ -341,6 +424,7 @@ where self.context .unop(self.masm, OperandSize::S32, &mut |masm, reg, size| { masm.float_abs(reg, size); + TypedReg::f32(reg) }); } @@ -348,6 +432,7 @@ where self.context .unop(self.masm, OperandSize::S64, &mut |masm, reg, size| { masm.float_abs(reg, size); + TypedReg::f64(reg) }); } @@ -355,6 +440,7 @@ where self.context .unop(self.masm, OperandSize::S32, &mut |masm, reg, size| { masm.float_neg(reg, size); + TypedReg::f32(reg) }); } @@ -362,6 +448,7 @@ where self.context .unop(self.masm, OperandSize::S64, &mut |masm, reg, size| { masm.float_neg(reg, size); + TypedReg::f64(reg) }); } @@ -409,6 +496,7 @@ where self.context .unop(self.masm, OperandSize::S32, &mut |masm, reg, size| { masm.float_sqrt(reg, reg, size); + TypedReg::f32(reg) }); } @@ -416,6 +504,7 @@ where self.context .unop(self.masm, OperandSize::S64, &mut |masm, reg, size| { masm.float_sqrt(reg, reg, size); + TypedReg::f64(reg) }); } @@ -539,39 +628,147 @@ where ); } + fn visit_f32_convert_i32_s(&mut self) { + self.context + .convert_op(self.masm, WasmValType::F32, |masm, dst, src, dst_size| { + masm.signed_convert(src, dst, OperandSize::S32, dst_size); + }); + } + + fn visit_f32_convert_i32_u(&mut self) { + self.context.convert_op_with_tmp_reg( + self.masm, + WasmValType::F32, + RegClass::Int, + |masm, dst, src, tmp_gpr, dst_size| { + masm.unsigned_convert(src, dst, tmp_gpr, OperandSize::S32, dst_size); + }, + ); + } + + fn visit_f32_convert_i64_s(&mut self) { + self.context + .convert_op(self.masm, WasmValType::F32, |masm, dst, src, dst_size| { + masm.signed_convert(src, dst, OperandSize::S64, dst_size); + }); + } + + fn visit_f32_convert_i64_u(&mut self) { + self.context.convert_op_with_tmp_reg( + self.masm, + WasmValType::F32, + RegClass::Int, + |masm, dst, src, tmp_gpr, dst_size| { + masm.unsigned_convert(src, dst, tmp_gpr, OperandSize::S64, dst_size); + }, + ); + } + + fn visit_f64_convert_i32_s(&mut self) { + self.context + .convert_op(self.masm, WasmValType::F64, |masm, dst, src, dst_size| { + masm.signed_convert(src, dst, OperandSize::S32, dst_size); + }); + } + + fn visit_f64_convert_i32_u(&mut self) { + self.context.convert_op_with_tmp_reg( + self.masm, + WasmValType::F64, + RegClass::Int, + |masm, dst, src, tmp_gpr, dst_size| { + masm.unsigned_convert(src, dst, tmp_gpr, OperandSize::S32, dst_size); + }, + ); + } + + fn visit_f64_convert_i64_s(&mut self) { + self.context + .convert_op(self.masm, WasmValType::F64, |masm, dst, src, dst_size| { + masm.signed_convert(src, dst, OperandSize::S64, dst_size); + }); + } + + fn visit_f64_convert_i64_u(&mut self) { + self.context.convert_op_with_tmp_reg( + self.masm, + WasmValType::F64, + RegClass::Int, + |masm, dst, src, tmp_gpr, dst_size| { + masm.unsigned_convert(src, dst, tmp_gpr, OperandSize::S64, dst_size); + }, + ); + } + + fn visit_f32_reinterpret_i32(&mut self) { + self.context + .convert_op(self.masm, WasmValType::F32, |masm, dst, src, size| { + masm.reinterpret_int_as_float(src.into(), dst, size); + }); + } + + fn visit_f64_reinterpret_i64(&mut self) { + self.context + .convert_op(self.masm, WasmValType::F64, |masm, dst, src, size| { + masm.reinterpret_int_as_float(src.into(), dst, size); + }); + } + + fn visit_f32_demote_f64(&mut self) { + self.context + .unop(self.masm, OperandSize::S64, &mut |masm, reg, _size| { + masm.demote(reg, reg); + TypedReg::f32(reg) + }); + } + + fn visit_f64_promote_f32(&mut self) { + self.context + .unop(self.masm, OperandSize::S32, &mut |masm, reg, _size| { + masm.promote(reg, reg); + TypedReg::f64(reg) + }); + } + fn visit_i32_add(&mut self) { self.context.i32_binop(self.masm, |masm, dst, src, size| { masm.add(dst, dst, src, size); + TypedReg::i32(dst) }); } fn visit_i64_add(&mut self) { self.context.i64_binop(self.masm, |masm, dst, src, size| { masm.add(dst, dst, src, size); + TypedReg::i64(dst) }); } fn visit_i32_sub(&mut self) { self.context.i32_binop(self.masm, |masm, dst, src, size| { masm.sub(dst, dst, src, size); + TypedReg::i32(dst) }); } fn visit_i64_sub(&mut self) { self.context.i64_binop(self.masm, |masm, dst, src, size| { masm.sub(dst, dst, src, size); + TypedReg::i64(dst) }); } fn visit_i32_mul(&mut self) { self.context.i32_binop(self.masm, |masm, dst, src, size| { masm.mul(dst, dst, src, size); + TypedReg::i32(dst) }); } fn visit_i64_mul(&mut self) { self.context.i64_binop(self.masm, |masm, dst, src, size| { masm.mul(dst, dst, src, size); + TypedReg::i64(dst) }); } @@ -716,6 +913,7 @@ where self.context.unop(self.masm, S32, &mut |masm, reg, size| { masm.cmp_with_set(RegImm::i32(0), reg.into(), IntCmpKind::Eq, size); + TypedReg::i32(reg) }); } @@ -724,6 +922,7 @@ where self.context.unop(self.masm, S64, &mut |masm, reg, size| { masm.cmp_with_set(RegImm::i64(0), reg.into(), IntCmpKind::Eq, size); + TypedReg::i32(reg) // Return value for `i64.eqz` is an `i32`. }); } @@ -732,6 +931,7 @@ where self.context.unop(self.masm, S32, &mut |masm, reg, size| { masm.clz(reg, reg, size); + TypedReg::i32(reg) }); } @@ -740,6 +940,7 @@ where self.context.unop(self.masm, S64, &mut |masm, reg, size| { masm.clz(reg, reg, size); + TypedReg::i64(reg) }); } @@ -748,6 +949,7 @@ where self.context.unop(self.masm, S32, &mut |masm, reg, size| { masm.ctz(reg, reg, size); + TypedReg::i32(reg) }); } @@ -756,42 +958,49 @@ where self.context.unop(self.masm, S64, &mut |masm, reg, size| { masm.ctz(reg, reg, size); + TypedReg::i64(reg) }); } fn visit_i32_and(&mut self) { self.context.i32_binop(self.masm, |masm, dst, src, size| { masm.and(dst, dst, src, size); + TypedReg::i32(dst) }); } fn visit_i64_and(&mut self) { self.context.i64_binop(self.masm, |masm, dst, src, size| { masm.and(dst, dst, src, size); + TypedReg::i64(dst) }); } fn visit_i32_or(&mut self) { self.context.i32_binop(self.masm, |masm, dst, src, size| { masm.or(dst, dst, src, size); + TypedReg::i32(dst) }); } fn visit_i64_or(&mut self) { self.context.i64_binop(self.masm, |masm, dst, src, size| { masm.or(dst, dst, src, size); + TypedReg::i64(dst) }); } fn visit_i32_xor(&mut self) { self.context.i32_binop(self.masm, |masm, dst, src, size| { masm.xor(dst, dst, src, size); + TypedReg::i32(dst) }); } fn visit_i64_xor(&mut self) { self.context.i64_binop(self.masm, |masm, dst, src, size| { masm.xor(dst, dst, src, size); + TypedReg::i64(dst) }); } @@ -870,19 +1079,7 @@ where self.handle_unreachable_end(); } else { let mut control = self.control_frames.pop().unwrap(); - let is_outermost = self.control_frames.len() == 0; - // If it's not the outermost control stack frame, emit the the full "end" sequence, - // which involves, popping results from the value stack, pushing results back to the - // value stack and binding the exit label. - // Else, pop values from the value stack and bind the exit label. - if !is_outermost { - control.emit_end(self.masm, &mut self.context); - } else { - if let Some(data) = control.results() { - self.context.pop_abi_results(data, self.masm); - } - control.bind_exit_label(self.masm); - } + control.emit_end(self.masm, &mut self.context); } } @@ -897,8 +1094,182 @@ where self.masm.popcnt(&mut self.context, S64); } + fn visit_i32_wrap_i64(&mut self) { + use OperandSize::*; + + self.context.unop(self.masm, S64, &mut |masm, reg, _size| { + masm.wrap(reg, reg); + TypedReg::i32(reg) + }); + } + + fn visit_i64_extend_i32_s(&mut self) { + use OperandSize::*; + + self.context.unop(self.masm, S32, &mut |masm, reg, _size| { + masm.extend(reg, reg, ExtendKind::I64ExtendI32S); + TypedReg::i64(reg) + }); + } + + fn visit_i64_extend_i32_u(&mut self) { + use OperandSize::*; + + self.context.unop(self.masm, S32, &mut |masm, reg, _size| { + masm.extend(reg, reg, ExtendKind::I64ExtendI32U); + TypedReg::i64(reg) + }); + } + + fn visit_i32_extend8_s(&mut self) { + use OperandSize::*; + + self.context.unop(self.masm, S32, &mut |masm, reg, _size| { + masm.extend(reg, reg, ExtendKind::I32Extend8S); + TypedReg::i32(reg) + }); + } + + fn visit_i32_extend16_s(&mut self) { + use OperandSize::*; + + self.context.unop(self.masm, S32, &mut |masm, reg, _size| { + masm.extend(reg, reg, ExtendKind::I32Extend16S); + TypedReg::i32(reg) + }); + } + + fn visit_i64_extend8_s(&mut self) { + use OperandSize::*; + + self.context.unop(self.masm, S64, &mut |masm, reg, _size| { + masm.extend(reg, reg, ExtendKind::I64Extend8S); + TypedReg::i64(reg) + }); + } + + fn visit_i64_extend16_s(&mut self) { + use OperandSize::*; + + self.context.unop(self.masm, S64, &mut |masm, reg, _size| { + masm.extend(reg, reg, ExtendKind::I64Extend16S); + TypedReg::i64(reg) + }); + } + + fn visit_i64_extend32_s(&mut self) { + use OperandSize::*; + + self.context.unop(self.masm, S64, &mut |masm, reg, _size| { + masm.extend(reg, reg, ExtendKind::I64Extend32S); + TypedReg::i64(reg) + }); + } + + fn visit_i32_trunc_f32_s(&mut self) { + use OperandSize::*; + + self.context + .convert_op(self.masm, WasmValType::I32, |masm, dst, src, dst_size| { + masm.signed_truncate(src, dst, S32, dst_size, TruncKind::Unchecked); + }); + } + + fn visit_i32_trunc_f32_u(&mut self) { + use OperandSize::*; + + self.context.convert_op_with_tmp_reg( + self.masm, + WasmValType::I32, + RegClass::Float, + |masm, dst, src, tmp_fpr, dst_size| { + masm.unsigned_truncate(src, dst, tmp_fpr, S32, dst_size, TruncKind::Unchecked); + }, + ); + } + + fn visit_i32_trunc_f64_s(&mut self) { + use OperandSize::*; + + self.context + .convert_op(self.masm, WasmValType::I32, |masm, dst, src, dst_size| { + masm.signed_truncate(src, dst, S64, dst_size, TruncKind::Unchecked); + }); + } + + fn visit_i32_trunc_f64_u(&mut self) { + use OperandSize::*; + + self.context.convert_op_with_tmp_reg( + self.masm, + WasmValType::I32, + RegClass::Float, + |masm, dst, src, tmp_fpr, dst_size| { + masm.unsigned_truncate(src, dst, tmp_fpr, S64, dst_size, TruncKind::Unchecked); + }, + ); + } + + fn visit_i64_trunc_f32_s(&mut self) { + use OperandSize::*; + + self.context + .convert_op(self.masm, WasmValType::I64, |masm, dst, src, dst_size| { + masm.signed_truncate(src, dst, S32, dst_size, TruncKind::Unchecked); + }); + } + + fn visit_i64_trunc_f32_u(&mut self) { + use OperandSize::*; + + self.context.convert_op_with_tmp_reg( + self.masm, + WasmValType::I64, + RegClass::Float, + |masm, dst, src, tmp_fpr, dst_size| { + masm.unsigned_truncate(src, dst, tmp_fpr, S32, dst_size, TruncKind::Unchecked); + }, + ); + } + + fn visit_i64_trunc_f64_s(&mut self) { + use OperandSize::*; + + self.context + .convert_op(self.masm, WasmValType::I64, |masm, dst, src, dst_size| { + masm.signed_truncate(src, dst, S64, dst_size, TruncKind::Unchecked); + }); + } + + fn visit_i64_trunc_f64_u(&mut self) { + use OperandSize::*; + + self.context.convert_op_with_tmp_reg( + self.masm, + WasmValType::I64, + RegClass::Float, + |masm, dst, src, tmp_fpr, dst_size| { + masm.unsigned_truncate(src, dst, tmp_fpr, S64, dst_size, TruncKind::Unchecked); + }, + ); + } + + fn visit_i32_reinterpret_f32(&mut self) { + self.context + .convert_op(self.masm, WasmValType::I32, |masm, dst, src, size| { + masm.reinterpret_float_as_int(src.into(), dst, size); + }); + } + + fn visit_i64_reinterpret_f64(&mut self) { + self.context + .convert_op(self.masm, WasmValType::I64, |masm, dst, src, size| { + masm.reinterpret_float_as_int(src.into(), dst, size); + }); + } + fn visit_local_get(&mut self, index: u32) { - use WasmType::*; + use WasmValType::*; let context = &mut self.context; let slot = context .frame @@ -925,6 +1296,14 @@ where } fn visit_call_indirect(&mut self, type_index: u32, table_index: u32, _: u8) { + // Spill now because `emit_lazy_init_funcref` and the `FnCall::emit` + // invocations will both trigger spills since they both call functions. + // However, the machine instructions for the spill emitted by + // `emit_lazy_funcref` will be jumped over if the funcref was previously + // initialized which may result in the machine stack becoming + // unbalanced. + self.context.spill(self.masm); + let type_index = TypeIndex::from_u32(type_index); let table_index = TableIndex::from_u32(table_index); @@ -1113,12 +1492,102 @@ where }); } + fn visit_memory_init(&mut self, data_index: u32, mem: u32) { + debug_assert!(self.context.stack.len() >= 3); + let ptr_type = self.env.ptr_type(); + let at = self.context.stack.len() - 3; + let vmctx = TypedReg::new(ptr_type, ::vmctx_reg()); + self.context.stack.insert_many( + at, + [ + vmctx.into(), + mem.try_into().unwrap(), + data_index.try_into().unwrap(), + ], + ); + FnCall::emit::(self.masm, &mut self.context, |cx| { + Callee::Builtin(cx.builtins.memory_init::()) + }); + } + + fn visit_memory_copy(&mut self, dst_mem: u32, src_mem: u32) { + // At this point, the stack is expected to contain: + // [ dst_offset, src_offset, len ] + // The following code inserts the missing params, so that stack contains: + // [ vmctx, dst_mem, dst_offset, src_mem, src_offset, len ] + // Which is the order expected by the builtin function. + debug_assert!(self.context.stack.len() >= 3); + let ptr_type = self.env.ptr_type(); + let vmctx = TypedReg::new(ptr_type, ::vmctx_reg()); + let at = self.context.stack.len() - 2; + self.context + .stack + .insert_many(at, [src_mem.try_into().unwrap()]); + + // One element was inserted above, so instead of 3, we use 4. + let at = self.context.stack.len() - 4; + self.context + .stack + .insert_many(at, [vmctx.into(), dst_mem.try_into().unwrap()]); + + FnCall::emit::(self.masm, &mut self.context, |cx| { + Callee::Builtin(cx.builtins.memory_copy::()) + }); + } + + fn visit_memory_fill(&mut self, mem: u32) { + debug_assert!(self.context.stack.len() >= 3); + let ptr_type = self.env.ptr_type(); + let vmctx = TypedReg::new(ptr_type, ::vmctx_reg()); + let at = self.context.stack.len() - 3; + + self.context + .stack + .insert_many(at, [vmctx.into(), mem.try_into().unwrap()]); + + FnCall::emit::(self.masm, &mut self.context, |cx| { + Callee::Builtin(cx.builtins.memory_fill::()) + }); + } + + fn visit_memory_size(&mut self, mem: u32, _: u8) { + let heap = self.env.resolve_heap(MemoryIndex::from_u32(mem)); + self.masm.memory_size(&heap, &mut self.context); + } + + fn visit_memory_grow(&mut self, mem: u32, _: u8) { + debug_assert!(self.context.stack.len() >= 1); + let ptr_type = self.env.ptr_type(); + let vmctx = TypedReg::new(ptr_type, ::vmctx_reg()); + let at = self.context.stack.len() - 1; + // The stack at this point contains: [ delta ] + // The desired state is + // [ vmctx, delta, index ] + self.context.stack.insert_many(at, [vmctx.into()]); + self.context.stack.extend([mem.try_into().unwrap()]); + + FnCall::emit::(self.masm, &mut self.context, |cx| { + Callee::Builtin(cx.builtins.memory32_grow::()) + }); + } + + fn visit_data_drop(&mut self, data_index: u32) { + let ptr_type = self.env.ptr_type(); + let vmctx = TypedReg::new(ptr_type, ::vmctx_reg()); + self.context + .stack + .extend([vmctx.into(), data_index.try_into().unwrap()]); + + FnCall::emit::(self.masm, &mut self.context, |cx| { + Callee::Builtin(cx.builtins.data_drop::()) + }); + } + fn visit_nop(&mut self) {} fn visit_if(&mut self, blockty: BlockType) { self.control_frames.push(ControlStackFrame::r#if( - self.env.resolve_block_results_data::(blockty), - self.env.resolve_block_type_info(blockty), + self.env.resolve_block_sig(blockty), self.masm, &mut self.context, )); @@ -1138,8 +1607,7 @@ where fn visit_block(&mut self, blockty: BlockType) { self.control_frames.push(ControlStackFrame::block( - self.env.resolve_block_results_data::(blockty), - self.env.resolve_block_type_info(blockty), + self.env.resolve_block_sig(blockty), self.masm, &mut self.context, )); @@ -1147,7 +1615,7 @@ where fn visit_loop(&mut self, blockty: BlockType) { self.control_frames.push(ControlStackFrame::r#loop( - self.env.resolve_block_type_info(blockty), + self.env.resolve_block_sig(blockty), self.masm, &mut self.context, )); @@ -1158,9 +1626,8 @@ where let frame = &mut self.control_frames[index]; self.context .unconditional_jump(frame, self.masm, |masm, cx, frame| { - if let Some(r) = frame.as_target_results() { - cx.pop_abi_results(r, masm); - } + frame + .pop_abi_results::(cx, masm, |results, _, _| results.ret_area().copied()); }); } @@ -1169,26 +1636,65 @@ where let frame = &mut self.control_frames[index]; frame.set_as_target(); - let top = if let Some(data) = frame.as_target_results() { + let top = { let top = self.context.without::( - data.results.regs(), + frame.results::().regs(), self.masm, |ctx, masm| ctx.pop_to_reg(masm, None), ); - self.context.top_abi_results(data, self.masm); + frame.top_abi_results::( + &mut self.context, + self.masm, + |results, context, masm| { + // In the case of `br_if` theres a possibility that we'll + // exit early from the block or falltrough, for + // a falltrough, we cannot rely on the pre-computed return area; + // it must be recalculated so that any values that are + // generated are correctly placed near the current stack + // pointer. + results.on_stack().then(|| { + let stack_consumed = context.stack.sizeof(results.stack_operands_len()); + let base = masm.sp_offset().as_u32() - stack_consumed; + let offs = base + results.size(); + RetArea::sp(SPOffset::from_u32(offs)) + }) + }, + ); top + }; + + // Emit instructions to balance the machine stack if the frame has + // a different offset. + let current_sp_offset = self.masm.sp_offset(); + let results_size = frame.results::().size(); + let state = frame.stack_state(); + let (label, cmp, needs_cleanup) = if current_sp_offset > state.target_offset { + (self.masm.get_label(), IntCmpKind::Eq, true) } else { - self.context.pop_to_reg(self.masm, None) + (*frame.label(), IntCmpKind::Ne, false) }; - self.masm.branch( - IntCmpKind::Ne, - top.reg.into(), - top.reg.into(), - *frame.label(), - OperandSize::S32, - ); + self.masm + .branch(cmp, top.reg.into(), top.reg.into(), label, OperandSize::S32); self.context.free_reg(top); + + if needs_cleanup { + // Emit instructions to balance the stack and jump if not falling + // through. + self.masm.memmove( + current_sp_offset, + state.target_offset, + results_size, + MemMoveDirection::LowToHigh, + ); + self.masm.ensure_sp_for_jump(state.target_offset); + self.masm.jmp(*frame.label()); + + // Restore sp_offset to what it was for falling through and emit + // fallthrough label. + self.masm.reset_stack_pointer(current_sp_offset); + self.masm.bind(label); + } } fn visit_br_table(&mut self, targets: BrTable<'a>) { @@ -1200,27 +1706,30 @@ where let labels: SmallVec<[_; 5]> = (0..len).map(|_| self.masm.get_label()).collect(); let default_index = control_index(targets.default(), self.control_frames.len()); - let default_result = self.control_frames[default_index].as_target_results(); + let default_frame = &mut self.control_frames[default_index]; + let default_result = default_frame.results::(); - let (index, tmp) = if let Some(data) = default_result { + let (index, tmp) = { let index_and_tmp = self.context.without::<(TypedReg, _), M, _>( - data.results.regs(), + default_result.regs(), self.masm, |cx, masm| (cx.pop_to_reg(masm, None), cx.any_gpr(masm)), ); // Materialize any constants or locals into their result representation, // so that when reachability is restored, they are correctly located. - self.context.top_abi_results(data, self.masm); + default_frame.top_abi_results::(&mut self.context, self.masm, |results, _, _| { + results.ret_area().copied() + }); index_and_tmp - } else { - ( - self.context.pop_to_reg(self.masm, None), - self.context.any_gpr(self.masm), - ) }; self.masm.jmp_table(&labels, index.into(), tmp); + // Save the original stack pointer offset; we will reset the stack + // pointer to this offset after jumping to each of the targets. Each + // jump might adjust the stack according to the base offset of the + // target. + let current_sp = self.masm.sp_offset(); for (t, l) in targets .targets() @@ -1230,14 +1739,26 @@ where { let control_index = control_index(t.unwrap(), self.control_frames.len()); let frame = &mut self.control_frames[control_index]; + // Reset the stack pointer to its original offset. This is needed + // because each jump will potentially adjust the stack pointer + // according to the base offset of the target. + self.masm.reset_stack_pointer(current_sp); // NB: We don't perform any result handling as it was // already taken care of above before jumping to the // jump table. self.masm.bind(*l); + // Ensure that the stack pointer is correctly positioned before + // jumping to the jump table code. + let state = frame.stack_state(); + self.masm.ensure_sp_for_jump(state.target_offset); self.masm.jmp(*frame.label()); frame.set_as_target(); } + // Finally reset the stack pointer to the original location. + // The reachability analysis, will ensure it's correctly located + // once reachability is restored. + self.masm.reset_stack_pointer(current_sp); self.context.reachable = false; self.context.free_reg(index.reg); self.context.free_reg(tmp); @@ -1251,9 +1772,8 @@ where let outermost = &mut self.control_frames[0]; self.context .unconditional_jump(outermost, self.masm, |masm, cx, frame| { - if let Some(data) = frame.as_target_results() { - cx.pop_abi_results(data, masm); - } + frame + .pop_abi_results::(cx, masm, |results, _, _| results.ret_area().copied()); }); } @@ -1316,6 +1836,211 @@ where self.context.free_reg(cond); } + fn visit_i32_load(&mut self, memarg: MemArg) { + self.emit_wasm_load(&memarg, WasmValType::I32, OperandSize::S32, None); + } + + fn visit_i32_load8_s(&mut self, memarg: MemArg) { + self.emit_wasm_load( + &memarg, + WasmValType::I32, + OperandSize::S8, + Some(ExtendKind::I32Extend8S), + ); + } + + fn visit_i32_load8_u(&mut self, memarg: MemArg) { + self.emit_wasm_load(&memarg, WasmValType::I32, OperandSize::S8, None); + } + + fn visit_i32_load16_s(&mut self, memarg: MemArg) { + self.emit_wasm_load( + &memarg, + WasmValType::I32, + OperandSize::S16, + Some(ExtendKind::I32Extend16S), + ) + } + + fn visit_i32_load16_u(&mut self, memarg: MemArg) { + self.emit_wasm_load(&memarg, WasmValType::I32, OperandSize::S16, None) + } + + fn visit_i32_store(&mut self, memarg: MemArg) { + self.emit_wasm_store(&memarg, OperandSize::S32); + } + + fn visit_i32_store8(&mut self, memarg: MemArg) { + self.emit_wasm_store(&memarg, OperandSize::S8) + } + + fn visit_i32_store16(&mut self, memarg: MemArg) { + self.emit_wasm_store(&memarg, OperandSize::S16) + } + + fn visit_i64_load8_s(&mut self, memarg: MemArg) { + self.emit_wasm_load( + &memarg, + WasmValType::I64, + OperandSize::S8, + Some(ExtendKind::I64Extend8S), + ) + } + + fn visit_i64_load8_u(&mut self, memarg: MemArg) { + self.emit_wasm_load(&memarg, WasmValType::I64, OperandSize::S8, None) + } + + fn visit_i64_load16_u(&mut self, memarg: MemArg) { + self.emit_wasm_load(&memarg, WasmValType::I64, OperandSize::S16, None) + } + + fn visit_i64_load16_s(&mut self, memarg: MemArg) { + self.emit_wasm_load( + &memarg, + WasmValType::I64, + OperandSize::S16, + Some(ExtendKind::I64Extend16S), + ) + } + + fn visit_i64_load32_u(&mut self, memarg: MemArg) { + self.emit_wasm_load(&memarg, WasmValType::I64, OperandSize::S32, None) + } + + fn visit_i64_load32_s(&mut self, memarg: MemArg) { + self.emit_wasm_load( + &memarg, + WasmValType::I64, + OperandSize::S32, + Some(ExtendKind::I64Extend32S), + ) + } + + fn visit_i64_load(&mut self, memarg: MemArg) { + self.emit_wasm_load(&memarg, WasmValType::I64, OperandSize::S64, None) + } + + fn visit_i64_store(&mut self, memarg: MemArg) -> Self::Output { + self.emit_wasm_store(&memarg, OperandSize::S64) + } + + fn visit_i64_store8(&mut self, memarg: MemArg) -> Self::Output { + self.emit_wasm_store(&memarg, OperandSize::S8) + } + + fn visit_i64_store16(&mut self, memarg: MemArg) -> Self::Output { + self.emit_wasm_store(&memarg, OperandSize::S16) + } + + fn visit_i64_store32(&mut self, memarg: MemArg) -> Self::Output { + self.emit_wasm_store(&memarg, OperandSize::S32) + } + + fn visit_f32_load(&mut self, memarg: MemArg) { + self.emit_wasm_load(&memarg, WasmValType::F32, OperandSize::S32, None) + } + + fn visit_f32_store(&mut self, memarg: MemArg) { + self.emit_wasm_store(&memarg, OperandSize::S32) + } + + fn visit_f64_load(&mut self, memarg: MemArg) { + self.emit_wasm_load(&memarg, WasmValType::F64, OperandSize::S64, None) + } + + fn visit_f64_store(&mut self, memarg: MemArg) { + self.emit_wasm_store(&memarg, OperandSize::S64) + } + + fn visit_i32_trunc_sat_f32_s(&mut self) { + use OperandSize::*; + + self.context + .convert_op(self.masm, WasmValType::I32, |masm, dst, src, dst_size| { + masm.signed_truncate(src, dst, S32, dst_size, TruncKind::Checked); + }); + } + + fn visit_i32_trunc_sat_f32_u(&mut self) { + use OperandSize::*; + + self.context.convert_op_with_tmp_reg( + self.masm, + WasmValType::I32, + RegClass::Float, + |masm, dst, src, tmp_fpr, dst_size| { + masm.unsigned_truncate(src, dst, tmp_fpr, S32, dst_size, TruncKind::Checked); + }, + ); + } + + fn visit_i32_trunc_sat_f64_s(&mut self) { + use OperandSize::*; + + self.context + .convert_op(self.masm, WasmValType::I32, |masm, dst, src, dst_size| { + masm.signed_truncate(src, dst, S64, dst_size, TruncKind::Checked); + }); + } + + fn visit_i32_trunc_sat_f64_u(&mut self) { + use OperandSize::*; + + self.context.convert_op_with_tmp_reg( + self.masm, + WasmValType::I32, + RegClass::Float, + |masm, dst, src, tmp_fpr, dst_size| { + masm.unsigned_truncate(src, dst, tmp_fpr, S64, dst_size, TruncKind::Checked); + }, + ); + } + + fn visit_i64_trunc_sat_f32_s(&mut self) { + use OperandSize::*; + + self.context + .convert_op(self.masm, WasmValType::I64, |masm, dst, src, dst_size| { + masm.signed_truncate(src, dst, S32, dst_size, TruncKind::Checked); + }); + } + + fn visit_i64_trunc_sat_f32_u(&mut self) { + use OperandSize::*; + + self.context.convert_op_with_tmp_reg( + self.masm, + WasmValType::I64, + RegClass::Float, + |masm, dst, src, tmp_fpr, dst_size| { + masm.unsigned_truncate(src, dst, tmp_fpr, S32, dst_size, TruncKind::Checked); + }, + ); + } + + fn visit_i64_trunc_sat_f64_s(&mut self) { + use OperandSize::*; + + self.context + .convert_op(self.masm, WasmValType::I64, |masm, dst, src, dst_size| { + masm.signed_truncate(src, dst, S64, dst_size, TruncKind::Checked); + }); + } + + fn visit_i64_trunc_sat_f64_u(&mut self) { + use OperandSize::*; + + self.context.convert_op_with_tmp_reg( + self.masm, + WasmValType::I64, + RegClass::Float, + |masm, dst, src, tmp_fpr, dst_size| { + masm.unsigned_truncate(src, dst, tmp_fpr, S64, dst_size, TruncKind::Checked); + }, + ); + } + wasmparser::for_each_operator!(def_unsupported); } @@ -1326,6 +2051,7 @@ where fn cmp_i32s(&mut self, kind: IntCmpKind) { self.context.i32_binop(self.masm, |masm, dst, src, size| { masm.cmp_with_set(src, dst, kind, size); + TypedReg::i32(dst) }); } @@ -1333,16 +2059,17 @@ where self.context .i64_binop(self.masm, move |masm, dst, src, size| { masm.cmp_with_set(src, dst, kind, size); + TypedReg::i32(dst) // Return value for comparisons is an `i32`. }); } } -impl From for OperandSize { - fn from(ty: WasmType) -> OperandSize { +impl From for OperandSize { + fn from(ty: WasmValType) -> OperandSize { match ty { - WasmType::I32 | WasmType::F32 => OperandSize::S32, - WasmType::I64 | WasmType::F64 => OperandSize::S64, - WasmType::Ref(rt) => { + WasmValType::I32 | WasmValType::F32 => OperandSize::S32, + WasmValType::I64 | WasmValType::F64 => OperandSize::S64, + WasmValType::Ref(rt) => { match rt.heap_type { // TODO: Harcoded size, assuming 64-bit support only. Once // Wasmtime supports 32-bit architectures, this will need @@ -1352,7 +2079,7 @@ impl From for OperandSize { t => unimplemented!("Support for WasmHeapType: {t}"), } } - ty => unimplemented!("Support for WasmType {ty}"), + ty => unimplemented!("Support for WasmValType {ty}"), } } } diff --git a/winch/filetests/Cargo.toml b/winch/filetests/Cargo.toml index 94e51b866e8b..1de596fea757 100644 --- a/winch/filetests/Cargo.toml +++ b/winch/filetests/Cargo.toml @@ -8,6 +8,9 @@ version = "0.0.0" publish = false edition.workspace = true +[lints] +workspace = true + [dependencies] winch-test-macros = {workspace = true} target-lexicon = { workspace = true } @@ -21,3 +24,4 @@ serde = { workspace = true } serde_derive = { workspace = true } cranelift-codegen = { workspace = true } capstone = { workspace = true } +wasmparser = { workspace = true } diff --git a/winch/filetests/filetests/aarch64/i32_add/const.wat b/winch/filetests/filetests/aarch64/i32_add/const.wat index 0d6b402a1684..6a632c1d6708 100644 --- a/winch/filetests/filetests/aarch64/i32_add/const.wat +++ b/winch/filetests/filetests/aarch64/i32_add/const.wat @@ -7,16 +7,16 @@ (i32.add) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: 500180d2 mov x16, #0xa -;; 1c: e003102a mov w0, w16 -;; 20: 00500011 add w0, w0, #0x14 -;; 24: ff230091 add sp, sp, #8 -;; 28: fc030091 mov x28, sp -;; 2c: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 30: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; 500180d2 mov x16, #0xa +;; e003102a mov w0, w16 +;; 00500011 add w0, w0, #0x14 +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i32_add/locals.wat b/winch/filetests/filetests/aarch64/i32_add/locals.wat index 26d69e246acb..4a5a4102852b 100644 --- a/winch/filetests/filetests/aarch64/i32_add/locals.wat +++ b/winch/filetests/filetests/aarch64/i32_add/locals.wat @@ -16,25 +16,25 @@ i32.add ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff4300d1 sub sp, sp, #0x10 -;; 10: fc030091 mov x28, sp -;; 14: 100080d2 mov x16, #0 -;; 18: 908300f8 stur x16, [x28, #8] -;; 1c: 890300f8 stur x9, [x28] -;; 20: 500180d2 mov x16, #0xa -;; 24: e003102a mov w0, w16 -;; 28: 80c300b8 stur w0, [x28, #0xc] -;; 2c: 900280d2 mov x16, #0x14 -;; 30: e003102a mov w0, w16 -;; 34: 808300b8 stur w0, [x28, #8] -;; 38: 808340b8 ldur w0, [x28, #8] -;; 3c: 81c340b8 ldur w1, [x28, #0xc] -;; 40: 2160200b add w1, w1, w0, uxtx -;; 44: e003012a mov w0, w1 -;; 48: ff430091 add sp, sp, #0x10 -;; 4c: fc030091 mov x28, sp -;; 50: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 54: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff4300d1 sub sp, sp, #0x10 +;; fc030091 mov x28, sp +;; 100080d2 mov x16, #0 +;; 908300f8 stur x16, [x28, #8] +;; 890300f8 stur x9, [x28] +;; 500180d2 mov x16, #0xa +;; e003102a mov w0, w16 +;; 80c300b8 stur w0, [x28, #0xc] +;; 900280d2 mov x16, #0x14 +;; e003102a mov w0, w16 +;; 808300b8 stur w0, [x28, #8] +;; 808340b8 ldur w0, [x28, #8] +;; 81c340b8 ldur w1, [x28, #0xc] +;; 2160200b add w1, w1, w0, uxtx +;; e003012a mov w0, w1 +;; ff430091 add sp, sp, #0x10 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i32_add/max.wat b/winch/filetests/filetests/aarch64/i32_add/max.wat index aa28ee1c4eff..c59efbd6a776 100644 --- a/winch/filetests/filetests/aarch64/i32_add/max.wat +++ b/winch/filetests/filetests/aarch64/i32_add/max.wat @@ -6,16 +6,16 @@ (i32.add) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: f07b40b2 orr x16, xzr, #0x7fffffff -;; 1c: e003102a mov w0, w16 -;; 20: 00040011 add w0, w0, #1 -;; 24: ff230091 add sp, sp, #8 -;; 28: fc030091 mov x28, sp -;; 2c: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 30: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; f07b40b2 orr x16, xzr, #0x7fffffff +;; e003102a mov w0, w16 +;; 00040011 add w0, w0, #1 +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i32_add/max_one.wat b/winch/filetests/filetests/aarch64/i32_add/max_one.wat index 2ac6afbcab92..94e784060c5d 100644 --- a/winch/filetests/filetests/aarch64/i32_add/max_one.wat +++ b/winch/filetests/filetests/aarch64/i32_add/max_one.wat @@ -7,17 +7,17 @@ (i32.add) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: 1000b0d2 mov x16, #0x80000000 -;; 1c: e003102a mov w0, w16 -;; 20: f07f40b2 orr x16, xzr, #0xffffffff -;; 24: 0060300b add w0, w0, w16, uxtx -;; 28: ff230091 add sp, sp, #8 -;; 2c: fc030091 mov x28, sp -;; 30: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 34: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; 1000b0d2 mov x16, #0x80000000 +;; e003102a mov w0, w16 +;; f07f40b2 orr x16, xzr, #0xffffffff +;; 0060300b add w0, w0, w16, uxtx +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i32_add/mixed.wat b/winch/filetests/filetests/aarch64/i32_add/mixed.wat index e9819e450df9..1ba12b3560af 100644 --- a/winch/filetests/filetests/aarch64/i32_add/mixed.wat +++ b/winch/filetests/filetests/aarch64/i32_add/mixed.wat @@ -7,16 +7,16 @@ (i32.add) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: f07f40b2 orr x16, xzr, #0xffffffff -;; 1c: e003102a mov w0, w16 -;; 20: 00040011 add w0, w0, #1 -;; 24: ff230091 add sp, sp, #8 -;; 28: fc030091 mov x28, sp -;; 2c: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 30: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; f07f40b2 orr x16, xzr, #0xffffffff +;; e003102a mov w0, w16 +;; 00040011 add w0, w0, #1 +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i32_add/params.wat b/winch/filetests/filetests/aarch64/i32_add/params.wat index 00b010b76829..93d1335b7eae 100644 --- a/winch/filetests/filetests/aarch64/i32_add/params.wat +++ b/winch/filetests/filetests/aarch64/i32_add/params.wat @@ -7,19 +7,19 @@ (i32.add) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff4300d1 sub sp, sp, #0x10 -;; 10: fc030091 mov x28, sp -;; 14: 80c300b8 stur w0, [x28, #0xc] -;; 18: 818300b8 stur w1, [x28, #8] -;; 1c: 890300f8 stur x9, [x28] -;; 20: 808340b8 ldur w0, [x28, #8] -;; 24: 81c340b8 ldur w1, [x28, #0xc] -;; 28: 2160200b add w1, w1, w0, uxtx -;; 2c: e003012a mov w0, w1 -;; 30: ff430091 add sp, sp, #0x10 -;; 34: fc030091 mov x28, sp -;; 38: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 3c: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff4300d1 sub sp, sp, #0x10 +;; fc030091 mov x28, sp +;; 80c300b8 stur w0, [x28, #0xc] +;; 818300b8 stur w1, [x28, #8] +;; 890300f8 stur x9, [x28] +;; 808340b8 ldur w0, [x28, #8] +;; 81c340b8 ldur w1, [x28, #0xc] +;; 2160200b add w1, w1, w0, uxtx +;; e003012a mov w0, w1 +;; ff430091 add sp, sp, #0x10 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i32_add/signed.wat b/winch/filetests/filetests/aarch64/i32_add/signed.wat index 3f92531adca8..9ca41aa79727 100644 --- a/winch/filetests/filetests/aarch64/i32_add/signed.wat +++ b/winch/filetests/filetests/aarch64/i32_add/signed.wat @@ -7,17 +7,17 @@ (i32.add) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: f07f40b2 orr x16, xzr, #0xffffffff -;; 1c: e003102a mov w0, w16 -;; 20: f07f40b2 orr x16, xzr, #0xffffffff -;; 24: 0060300b add w0, w0, w16, uxtx -;; 28: ff230091 add sp, sp, #8 -;; 2c: fc030091 mov x28, sp -;; 30: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 34: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; f07f40b2 orr x16, xzr, #0xffffffff +;; e003102a mov w0, w16 +;; f07f40b2 orr x16, xzr, #0xffffffff +;; 0060300b add w0, w0, w16, uxtx +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i32_add/unsigned_with_zero.wat b/winch/filetests/filetests/aarch64/i32_add/unsigned_with_zero.wat index 21bbc5eb2c32..7015e5ef2746 100644 --- a/winch/filetests/filetests/aarch64/i32_add/unsigned_with_zero.wat +++ b/winch/filetests/filetests/aarch64/i32_add/unsigned_with_zero.wat @@ -7,16 +7,16 @@ (i32.add) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: 300080d2 mov x16, #1 -;; 1c: e003102a mov w0, w16 -;; 20: 00000011 add w0, w0, #0 -;; 24: ff230091 add sp, sp, #8 -;; 28: fc030091 mov x28, sp -;; 2c: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 30: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; 300080d2 mov x16, #1 +;; e003102a mov w0, w16 +;; 00000011 add w0, w0, #0 +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i32_mul/const.wat b/winch/filetests/filetests/aarch64/i32_mul/const.wat index 7081ddaf4486..2123d262ac98 100644 --- a/winch/filetests/filetests/aarch64/i32_mul/const.wat +++ b/winch/filetests/filetests/aarch64/i32_mul/const.wat @@ -7,17 +7,17 @@ (i32.mul) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: 500180d2 mov x16, #0xa -;; 1c: e003102a mov w0, w16 -;; 20: 900280d2 mov x16, #0x14 -;; 24: 007c101b mul w0, w0, w16 -;; 28: ff230091 add sp, sp, #8 -;; 2c: fc030091 mov x28, sp -;; 30: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 34: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; 500180d2 mov x16, #0xa +;; e003102a mov w0, w16 +;; 900280d2 mov x16, #0x14 +;; 007c101b mul w0, w0, w16 +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i32_mul/locals.wat b/winch/filetests/filetests/aarch64/i32_mul/locals.wat index 2b21c1413ab1..22433c270c68 100644 --- a/winch/filetests/filetests/aarch64/i32_mul/locals.wat +++ b/winch/filetests/filetests/aarch64/i32_mul/locals.wat @@ -16,25 +16,25 @@ i32.mul ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff4300d1 sub sp, sp, #0x10 -;; 10: fc030091 mov x28, sp -;; 14: 100080d2 mov x16, #0 -;; 18: 908300f8 stur x16, [x28, #8] -;; 1c: 890300f8 stur x9, [x28] -;; 20: 500180d2 mov x16, #0xa -;; 24: e003102a mov w0, w16 -;; 28: 80c300b8 stur w0, [x28, #0xc] -;; 2c: 900280d2 mov x16, #0x14 -;; 30: e003102a mov w0, w16 -;; 34: 808300b8 stur w0, [x28, #8] -;; 38: 808340b8 ldur w0, [x28, #8] -;; 3c: 81c340b8 ldur w1, [x28, #0xc] -;; 40: 217c001b mul w1, w1, w0 -;; 44: e003012a mov w0, w1 -;; 48: ff430091 add sp, sp, #0x10 -;; 4c: fc030091 mov x28, sp -;; 50: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 54: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff4300d1 sub sp, sp, #0x10 +;; fc030091 mov x28, sp +;; 100080d2 mov x16, #0 +;; 908300f8 stur x16, [x28, #8] +;; 890300f8 stur x9, [x28] +;; 500180d2 mov x16, #0xa +;; e003102a mov w0, w16 +;; 80c300b8 stur w0, [x28, #0xc] +;; 900280d2 mov x16, #0x14 +;; e003102a mov w0, w16 +;; 808300b8 stur w0, [x28, #8] +;; 808340b8 ldur w0, [x28, #8] +;; 81c340b8 ldur w1, [x28, #0xc] +;; 217c001b mul w1, w1, w0 +;; e003012a mov w0, w1 +;; ff430091 add sp, sp, #0x10 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i32_mul/max.wat b/winch/filetests/filetests/aarch64/i32_mul/max.wat index 28243041d81e..0636475bbd71 100644 --- a/winch/filetests/filetests/aarch64/i32_mul/max.wat +++ b/winch/filetests/filetests/aarch64/i32_mul/max.wat @@ -7,17 +7,17 @@ (i32.mul) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: f07b40b2 orr x16, xzr, #0x7fffffff -;; 1c: e003102a mov w0, w16 -;; 20: f07f40b2 orr x16, xzr, #0xffffffff -;; 24: 007c101b mul w0, w0, w16 -;; 28: ff230091 add sp, sp, #8 -;; 2c: fc030091 mov x28, sp -;; 30: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 34: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; f07b40b2 orr x16, xzr, #0x7fffffff +;; e003102a mov w0, w16 +;; f07f40b2 orr x16, xzr, #0xffffffff +;; 007c101b mul w0, w0, w16 +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i32_mul/max_one.wat b/winch/filetests/filetests/aarch64/i32_mul/max_one.wat index e8c9316183bd..860984ea43da 100644 --- a/winch/filetests/filetests/aarch64/i32_mul/max_one.wat +++ b/winch/filetests/filetests/aarch64/i32_mul/max_one.wat @@ -7,17 +7,17 @@ (i32.mul) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: 1000b0d2 mov x16, #0x80000000 -;; 1c: e003102a mov w0, w16 -;; 20: f07f40b2 orr x16, xzr, #0xffffffff -;; 24: 007c101b mul w0, w0, w16 -;; 28: ff230091 add sp, sp, #8 -;; 2c: fc030091 mov x28, sp -;; 30: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 34: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; 1000b0d2 mov x16, #0x80000000 +;; e003102a mov w0, w16 +;; f07f40b2 orr x16, xzr, #0xffffffff +;; 007c101b mul w0, w0, w16 +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i32_mul/mixed.wat b/winch/filetests/filetests/aarch64/i32_mul/mixed.wat index dc6c1ea4a887..07e38743135b 100644 --- a/winch/filetests/filetests/aarch64/i32_mul/mixed.wat +++ b/winch/filetests/filetests/aarch64/i32_mul/mixed.wat @@ -7,17 +7,17 @@ (i32.mul) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: f07f40b2 orr x16, xzr, #0xffffffff -;; 1c: e003102a mov w0, w16 -;; 20: 300080d2 mov x16, #1 -;; 24: 007c101b mul w0, w0, w16 -;; 28: ff230091 add sp, sp, #8 -;; 2c: fc030091 mov x28, sp -;; 30: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 34: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; f07f40b2 orr x16, xzr, #0xffffffff +;; e003102a mov w0, w16 +;; 300080d2 mov x16, #1 +;; 007c101b mul w0, w0, w16 +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i32_mul/params.wat b/winch/filetests/filetests/aarch64/i32_mul/params.wat index d9dff7ede1cc..fd2ead6bb470 100644 --- a/winch/filetests/filetests/aarch64/i32_mul/params.wat +++ b/winch/filetests/filetests/aarch64/i32_mul/params.wat @@ -7,19 +7,19 @@ (i32.mul) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff4300d1 sub sp, sp, #0x10 -;; 10: fc030091 mov x28, sp -;; 14: 80c300b8 stur w0, [x28, #0xc] -;; 18: 818300b8 stur w1, [x28, #8] -;; 1c: 890300f8 stur x9, [x28] -;; 20: 808340b8 ldur w0, [x28, #8] -;; 24: 81c340b8 ldur w1, [x28, #0xc] -;; 28: 217c001b mul w1, w1, w0 -;; 2c: e003012a mov w0, w1 -;; 30: ff430091 add sp, sp, #0x10 -;; 34: fc030091 mov x28, sp -;; 38: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 3c: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff4300d1 sub sp, sp, #0x10 +;; fc030091 mov x28, sp +;; 80c300b8 stur w0, [x28, #0xc] +;; 818300b8 stur w1, [x28, #8] +;; 890300f8 stur x9, [x28] +;; 808340b8 ldur w0, [x28, #8] +;; 81c340b8 ldur w1, [x28, #0xc] +;; 217c001b mul w1, w1, w0 +;; e003012a mov w0, w1 +;; ff430091 add sp, sp, #0x10 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i32_mul/signed.wat b/winch/filetests/filetests/aarch64/i32_mul/signed.wat index 1f1e1cff663b..78ed0894e6bd 100644 --- a/winch/filetests/filetests/aarch64/i32_mul/signed.wat +++ b/winch/filetests/filetests/aarch64/i32_mul/signed.wat @@ -7,17 +7,17 @@ (i32.mul) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: f07f40b2 orr x16, xzr, #0xffffffff -;; 1c: e003102a mov w0, w16 -;; 20: f07f40b2 orr x16, xzr, #0xffffffff -;; 24: 007c101b mul w0, w0, w16 -;; 28: ff230091 add sp, sp, #8 -;; 2c: fc030091 mov x28, sp -;; 30: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 34: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; f07f40b2 orr x16, xzr, #0xffffffff +;; e003102a mov w0, w16 +;; f07f40b2 orr x16, xzr, #0xffffffff +;; 007c101b mul w0, w0, w16 +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i32_mul/unsigned_with_zero.wat b/winch/filetests/filetests/aarch64/i32_mul/unsigned_with_zero.wat index dd4aabe6d231..e7f352fa7163 100644 --- a/winch/filetests/filetests/aarch64/i32_mul/unsigned_with_zero.wat +++ b/winch/filetests/filetests/aarch64/i32_mul/unsigned_with_zero.wat @@ -7,17 +7,17 @@ (i32.mul) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: 300080d2 mov x16, #1 -;; 1c: e003102a mov w0, w16 -;; 20: 100080d2 mov x16, #0 -;; 24: 007c101b mul w0, w0, w16 -;; 28: ff230091 add sp, sp, #8 -;; 2c: fc030091 mov x28, sp -;; 30: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 34: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; 300080d2 mov x16, #1 +;; e003102a mov w0, w16 +;; 100080d2 mov x16, #0 +;; 007c101b mul w0, w0, w16 +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i32_sub/const.wat b/winch/filetests/filetests/aarch64/i32_sub/const.wat index 38c1aefe208a..71d199c0ecb6 100644 --- a/winch/filetests/filetests/aarch64/i32_sub/const.wat +++ b/winch/filetests/filetests/aarch64/i32_sub/const.wat @@ -7,16 +7,16 @@ (i32.sub) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: 500180d2 mov x16, #0xa -;; 1c: e003102a mov w0, w16 -;; 20: 00500051 sub w0, w0, #0x14 -;; 24: ff230091 add sp, sp, #8 -;; 28: fc030091 mov x28, sp -;; 2c: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 30: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; 500180d2 mov x16, #0xa +;; e003102a mov w0, w16 +;; 00500051 sub w0, w0, #0x14 +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i32_sub/locals.wat b/winch/filetests/filetests/aarch64/i32_sub/locals.wat index 1af753fc4b53..6e54580bcc27 100644 --- a/winch/filetests/filetests/aarch64/i32_sub/locals.wat +++ b/winch/filetests/filetests/aarch64/i32_sub/locals.wat @@ -16,25 +16,25 @@ i32.sub ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff4300d1 sub sp, sp, #0x10 -;; 10: fc030091 mov x28, sp -;; 14: 100080d2 mov x16, #0 -;; 18: 908300f8 stur x16, [x28, #8] -;; 1c: 890300f8 stur x9, [x28] -;; 20: 500180d2 mov x16, #0xa -;; 24: e003102a mov w0, w16 -;; 28: 80c300b8 stur w0, [x28, #0xc] -;; 2c: 900280d2 mov x16, #0x14 -;; 30: e003102a mov w0, w16 -;; 34: 808300b8 stur w0, [x28, #8] -;; 38: 808340b8 ldur w0, [x28, #8] -;; 3c: 81c340b8 ldur w1, [x28, #0xc] -;; 40: 2160204b sub w1, w1, w0, uxtx -;; 44: e003012a mov w0, w1 -;; 48: ff430091 add sp, sp, #0x10 -;; 4c: fc030091 mov x28, sp -;; 50: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 54: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff4300d1 sub sp, sp, #0x10 +;; fc030091 mov x28, sp +;; 100080d2 mov x16, #0 +;; 908300f8 stur x16, [x28, #8] +;; 890300f8 stur x9, [x28] +;; 500180d2 mov x16, #0xa +;; e003102a mov w0, w16 +;; 80c300b8 stur w0, [x28, #0xc] +;; 900280d2 mov x16, #0x14 +;; e003102a mov w0, w16 +;; 808300b8 stur w0, [x28, #8] +;; 808340b8 ldur w0, [x28, #8] +;; 81c340b8 ldur w1, [x28, #0xc] +;; 2160204b sub w1, w1, w0, uxtx +;; e003012a mov w0, w1 +;; ff430091 add sp, sp, #0x10 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i32_sub/max.wat b/winch/filetests/filetests/aarch64/i32_sub/max.wat index 75e061ff5124..454e78037322 100644 --- a/winch/filetests/filetests/aarch64/i32_sub/max.wat +++ b/winch/filetests/filetests/aarch64/i32_sub/max.wat @@ -6,17 +6,17 @@ (i32.sub) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: f07b40b2 orr x16, xzr, #0x7fffffff -;; 1c: e003102a mov w0, w16 -;; 20: f07f40b2 orr x16, xzr, #0xffffffff -;; 24: 0060304b sub w0, w0, w16, uxtx -;; 28: ff230091 add sp, sp, #8 -;; 2c: fc030091 mov x28, sp -;; 30: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 34: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; f07b40b2 orr x16, xzr, #0x7fffffff +;; e003102a mov w0, w16 +;; f07f40b2 orr x16, xzr, #0xffffffff +;; 0060304b sub w0, w0, w16, uxtx +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i32_sub/max_one.wat b/winch/filetests/filetests/aarch64/i32_sub/max_one.wat index fe9a1440c121..a42494c1b557 100644 --- a/winch/filetests/filetests/aarch64/i32_sub/max_one.wat +++ b/winch/filetests/filetests/aarch64/i32_sub/max_one.wat @@ -7,16 +7,16 @@ (i32.sub) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: 1000b0d2 mov x16, #0x80000000 -;; 1c: e003102a mov w0, w16 -;; 20: 00040051 sub w0, w0, #1 -;; 24: ff230091 add sp, sp, #8 -;; 28: fc030091 mov x28, sp -;; 2c: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 30: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; 1000b0d2 mov x16, #0x80000000 +;; e003102a mov w0, w16 +;; 00040051 sub w0, w0, #1 +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i32_sub/mixed.wat b/winch/filetests/filetests/aarch64/i32_sub/mixed.wat index 68f42a2ca013..99817755615e 100644 --- a/winch/filetests/filetests/aarch64/i32_sub/mixed.wat +++ b/winch/filetests/filetests/aarch64/i32_sub/mixed.wat @@ -7,16 +7,16 @@ (i32.sub) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: f07f40b2 orr x16, xzr, #0xffffffff -;; 1c: e003102a mov w0, w16 -;; 20: 00040051 sub w0, w0, #1 -;; 24: ff230091 add sp, sp, #8 -;; 28: fc030091 mov x28, sp -;; 2c: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 30: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; f07f40b2 orr x16, xzr, #0xffffffff +;; e003102a mov w0, w16 +;; 00040051 sub w0, w0, #1 +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i32_sub/params.wat b/winch/filetests/filetests/aarch64/i32_sub/params.wat index ebe91ea52d95..f30ada72cd84 100644 --- a/winch/filetests/filetests/aarch64/i32_sub/params.wat +++ b/winch/filetests/filetests/aarch64/i32_sub/params.wat @@ -7,19 +7,19 @@ (i32.sub) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff4300d1 sub sp, sp, #0x10 -;; 10: fc030091 mov x28, sp -;; 14: 80c300b8 stur w0, [x28, #0xc] -;; 18: 818300b8 stur w1, [x28, #8] -;; 1c: 890300f8 stur x9, [x28] -;; 20: 808340b8 ldur w0, [x28, #8] -;; 24: 81c340b8 ldur w1, [x28, #0xc] -;; 28: 2160204b sub w1, w1, w0, uxtx -;; 2c: e003012a mov w0, w1 -;; 30: ff430091 add sp, sp, #0x10 -;; 34: fc030091 mov x28, sp -;; 38: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 3c: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff4300d1 sub sp, sp, #0x10 +;; fc030091 mov x28, sp +;; 80c300b8 stur w0, [x28, #0xc] +;; 818300b8 stur w1, [x28, #8] +;; 890300f8 stur x9, [x28] +;; 808340b8 ldur w0, [x28, #8] +;; 81c340b8 ldur w1, [x28, #0xc] +;; 2160204b sub w1, w1, w0, uxtx +;; e003012a mov w0, w1 +;; ff430091 add sp, sp, #0x10 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i32_sub/signed.wat b/winch/filetests/filetests/aarch64/i32_sub/signed.wat index d54e87a526e8..75cbc5e465cc 100644 --- a/winch/filetests/filetests/aarch64/i32_sub/signed.wat +++ b/winch/filetests/filetests/aarch64/i32_sub/signed.wat @@ -7,17 +7,17 @@ (i32.sub) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: f07f40b2 orr x16, xzr, #0xffffffff -;; 1c: e003102a mov w0, w16 -;; 20: f07f40b2 orr x16, xzr, #0xffffffff -;; 24: 0060304b sub w0, w0, w16, uxtx -;; 28: ff230091 add sp, sp, #8 -;; 2c: fc030091 mov x28, sp -;; 30: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 34: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; f07f40b2 orr x16, xzr, #0xffffffff +;; e003102a mov w0, w16 +;; f07f40b2 orr x16, xzr, #0xffffffff +;; 0060304b sub w0, w0, w16, uxtx +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i32_sub/unsigned_with_zero.wat b/winch/filetests/filetests/aarch64/i32_sub/unsigned_with_zero.wat index 2a06f9089ae5..219c1b97248d 100644 --- a/winch/filetests/filetests/aarch64/i32_sub/unsigned_with_zero.wat +++ b/winch/filetests/filetests/aarch64/i32_sub/unsigned_with_zero.wat @@ -7,16 +7,16 @@ (i32.sub) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: 300080d2 mov x16, #1 -;; 1c: e003102a mov w0, w16 -;; 20: 00000051 sub w0, w0, #0 -;; 24: ff230091 add sp, sp, #8 -;; 28: fc030091 mov x28, sp -;; 2c: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 30: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; 300080d2 mov x16, #1 +;; e003102a mov w0, w16 +;; 00000051 sub w0, w0, #0 +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i64_add/const.wat b/winch/filetests/filetests/aarch64/i64_add/const.wat index 8e48719b4021..6e969770b912 100644 --- a/winch/filetests/filetests/aarch64/i64_add/const.wat +++ b/winch/filetests/filetests/aarch64/i64_add/const.wat @@ -7,16 +7,16 @@ (i64.add) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: 500180d2 mov x16, #0xa -;; 1c: e00310aa mov x0, x16 -;; 20: 00500091 add x0, x0, #0x14 -;; 24: ff230091 add sp, sp, #8 -;; 28: fc030091 mov x28, sp -;; 2c: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 30: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; 500180d2 mov x16, #0xa +;; e00310aa mov x0, x16 +;; 00500091 add x0, x0, #0x14 +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i64_add/locals.wat b/winch/filetests/filetests/aarch64/i64_add/locals.wat index c972bf80b47b..8174615ed6e8 100644 --- a/winch/filetests/filetests/aarch64/i64_add/locals.wat +++ b/winch/filetests/filetests/aarch64/i64_add/locals.wat @@ -16,26 +16,26 @@ i64.add ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff6300d1 sub sp, sp, #0x18 -;; 10: fc030091 mov x28, sp -;; 14: 100080d2 mov x16, #0 -;; 18: 900301f8 stur x16, [x28, #0x10] -;; 1c: 908300f8 stur x16, [x28, #8] -;; 20: 890300f8 stur x9, [x28] -;; 24: 500180d2 mov x16, #0xa -;; 28: e00310aa mov x0, x16 -;; 2c: 800301f8 stur x0, [x28, #0x10] -;; 30: 900280d2 mov x16, #0x14 -;; 34: e00310aa mov x0, x16 -;; 38: 808300f8 stur x0, [x28, #8] -;; 3c: 808340f8 ldur x0, [x28, #8] -;; 40: 810341f8 ldur x1, [x28, #0x10] -;; 44: 2160208b add x1, x1, x0, uxtx -;; 48: e00301aa mov x0, x1 -;; 4c: ff630091 add sp, sp, #0x18 -;; 50: fc030091 mov x28, sp -;; 54: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 58: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff6300d1 sub sp, sp, #0x18 +;; fc030091 mov x28, sp +;; 100080d2 mov x16, #0 +;; 900301f8 stur x16, [x28, #0x10] +;; 908300f8 stur x16, [x28, #8] +;; 890300f8 stur x9, [x28] +;; 500180d2 mov x16, #0xa +;; e00310aa mov x0, x16 +;; 800301f8 stur x0, [x28, #0x10] +;; 900280d2 mov x16, #0x14 +;; e00310aa mov x0, x16 +;; 808300f8 stur x0, [x28, #8] +;; 808340f8 ldur x0, [x28, #8] +;; 810341f8 ldur x1, [x28, #0x10] +;; 2160208b add x1, x1, x0, uxtx +;; e00301aa mov x0, x1 +;; ff630091 add sp, sp, #0x18 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i64_add/max.wat b/winch/filetests/filetests/aarch64/i64_add/max.wat index 0050d305b44d..85921123008a 100644 --- a/winch/filetests/filetests/aarch64/i64_add/max.wat +++ b/winch/filetests/filetests/aarch64/i64_add/max.wat @@ -6,17 +6,17 @@ (i64.add) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: 300080d2 mov x16, #1 -;; 1c: e00310aa mov x0, x16 -;; 20: 1000f092 mov x16, #0x7fffffffffffffff -;; 24: 0060308b add x0, x0, x16, uxtx -;; 28: ff230091 add sp, sp, #8 -;; 2c: fc030091 mov x28, sp -;; 30: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 34: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; 300080d2 mov x16, #1 +;; e00310aa mov x0, x16 +;; 1000f092 mov x16, #0x7fffffffffffffff +;; 0060308b add x0, x0, x16, uxtx +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i64_add/max_one.wat b/winch/filetests/filetests/aarch64/i64_add/max_one.wat index d96f87f1da82..da9fbced92bd 100644 --- a/winch/filetests/filetests/aarch64/i64_add/max_one.wat +++ b/winch/filetests/filetests/aarch64/i64_add/max_one.wat @@ -7,17 +7,17 @@ (i64.add) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: 1000f0d2 mov x16, #-0x8000000000000000 -;; 1c: e00310aa mov x0, x16 -;; 20: 10008092 mov x16, #-1 -;; 24: 0060308b add x0, x0, x16, uxtx -;; 28: ff230091 add sp, sp, #8 -;; 2c: fc030091 mov x28, sp -;; 30: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 34: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; 1000f0d2 mov x16, #-0x8000000000000000 +;; e00310aa mov x0, x16 +;; 10008092 mov x16, #-1 +;; 0060308b add x0, x0, x16, uxtx +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i64_add/mixed.wat b/winch/filetests/filetests/aarch64/i64_add/mixed.wat index 630527270b61..324a80a60ac9 100644 --- a/winch/filetests/filetests/aarch64/i64_add/mixed.wat +++ b/winch/filetests/filetests/aarch64/i64_add/mixed.wat @@ -7,16 +7,16 @@ (i64.add) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: 10008092 mov x16, #-1 -;; 1c: e00310aa mov x0, x16 -;; 20: 00040091 add x0, x0, #1 -;; 24: ff230091 add sp, sp, #8 -;; 28: fc030091 mov x28, sp -;; 2c: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 30: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; 10008092 mov x16, #-1 +;; e00310aa mov x0, x16 +;; 00040091 add x0, x0, #1 +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i64_add/params.wat b/winch/filetests/filetests/aarch64/i64_add/params.wat index f12c204ee55d..a1173c076b77 100644 --- a/winch/filetests/filetests/aarch64/i64_add/params.wat +++ b/winch/filetests/filetests/aarch64/i64_add/params.wat @@ -7,19 +7,19 @@ (i64.add) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff6300d1 sub sp, sp, #0x18 -;; 10: fc030091 mov x28, sp -;; 14: 800301f8 stur x0, [x28, #0x10] -;; 18: 818300f8 stur x1, [x28, #8] -;; 1c: 890300f8 stur x9, [x28] -;; 20: 808340f8 ldur x0, [x28, #8] -;; 24: 810341f8 ldur x1, [x28, #0x10] -;; 28: 2160208b add x1, x1, x0, uxtx -;; 2c: e00301aa mov x0, x1 -;; 30: ff630091 add sp, sp, #0x18 -;; 34: fc030091 mov x28, sp -;; 38: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 3c: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff6300d1 sub sp, sp, #0x18 +;; fc030091 mov x28, sp +;; 800301f8 stur x0, [x28, #0x10] +;; 818300f8 stur x1, [x28, #8] +;; 890300f8 stur x9, [x28] +;; 808340f8 ldur x0, [x28, #8] +;; 810341f8 ldur x1, [x28, #0x10] +;; 2160208b add x1, x1, x0, uxtx +;; e00301aa mov x0, x1 +;; ff630091 add sp, sp, #0x18 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i64_add/signed.wat b/winch/filetests/filetests/aarch64/i64_add/signed.wat index 6e3dae7fa6dc..45b7be417187 100644 --- a/winch/filetests/filetests/aarch64/i64_add/signed.wat +++ b/winch/filetests/filetests/aarch64/i64_add/signed.wat @@ -7,17 +7,17 @@ (i64.add) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: 10008092 mov x16, #-1 -;; 1c: e00310aa mov x0, x16 -;; 20: 10008092 mov x16, #-1 -;; 24: 0060308b add x0, x0, x16, uxtx -;; 28: ff230091 add sp, sp, #8 -;; 2c: fc030091 mov x28, sp -;; 30: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 34: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; 10008092 mov x16, #-1 +;; e00310aa mov x0, x16 +;; 10008092 mov x16, #-1 +;; 0060308b add x0, x0, x16, uxtx +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i64_add/unsigned_with_zero.wat b/winch/filetests/filetests/aarch64/i64_add/unsigned_with_zero.wat index 2e3bcfee1987..f0c9782428d4 100644 --- a/winch/filetests/filetests/aarch64/i64_add/unsigned_with_zero.wat +++ b/winch/filetests/filetests/aarch64/i64_add/unsigned_with_zero.wat @@ -7,16 +7,16 @@ (i64.add) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: 300080d2 mov x16, #1 -;; 1c: e00310aa mov x0, x16 -;; 20: 00000091 add x0, x0, #0 -;; 24: ff230091 add sp, sp, #8 -;; 28: fc030091 mov x28, sp -;; 2c: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 30: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; 300080d2 mov x16, #1 +;; e00310aa mov x0, x16 +;; 00000091 add x0, x0, #0 +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i64_mul/const.wat b/winch/filetests/filetests/aarch64/i64_mul/const.wat index 9ac1b0c24f0d..aefa644222f5 100644 --- a/winch/filetests/filetests/aarch64/i64_mul/const.wat +++ b/winch/filetests/filetests/aarch64/i64_mul/const.wat @@ -7,17 +7,17 @@ (i64.mul) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: 500180d2 mov x16, #0xa -;; 1c: e00310aa mov x0, x16 -;; 20: 900280d2 mov x16, #0x14 -;; 24: 007c109b mul x0, x0, x16 -;; 28: ff230091 add sp, sp, #8 -;; 2c: fc030091 mov x28, sp -;; 30: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 34: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; 500180d2 mov x16, #0xa +;; e00310aa mov x0, x16 +;; 900280d2 mov x16, #0x14 +;; 007c109b mul x0, x0, x16 +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i64_mul/locals.wat b/winch/filetests/filetests/aarch64/i64_mul/locals.wat index 1e9d5b36580f..4e68719623d9 100644 --- a/winch/filetests/filetests/aarch64/i64_mul/locals.wat +++ b/winch/filetests/filetests/aarch64/i64_mul/locals.wat @@ -16,26 +16,26 @@ i64.mul ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff6300d1 sub sp, sp, #0x18 -;; 10: fc030091 mov x28, sp -;; 14: 100080d2 mov x16, #0 -;; 18: 900301f8 stur x16, [x28, #0x10] -;; 1c: 908300f8 stur x16, [x28, #8] -;; 20: 890300f8 stur x9, [x28] -;; 24: 500180d2 mov x16, #0xa -;; 28: e00310aa mov x0, x16 -;; 2c: 800301f8 stur x0, [x28, #0x10] -;; 30: 900280d2 mov x16, #0x14 -;; 34: e00310aa mov x0, x16 -;; 38: 808300f8 stur x0, [x28, #8] -;; 3c: 808340f8 ldur x0, [x28, #8] -;; 40: 810341f8 ldur x1, [x28, #0x10] -;; 44: 217c009b mul x1, x1, x0 -;; 48: e00301aa mov x0, x1 -;; 4c: ff630091 add sp, sp, #0x18 -;; 50: fc030091 mov x28, sp -;; 54: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 58: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff6300d1 sub sp, sp, #0x18 +;; fc030091 mov x28, sp +;; 100080d2 mov x16, #0 +;; 900301f8 stur x16, [x28, #0x10] +;; 908300f8 stur x16, [x28, #8] +;; 890300f8 stur x9, [x28] +;; 500180d2 mov x16, #0xa +;; e00310aa mov x0, x16 +;; 800301f8 stur x0, [x28, #0x10] +;; 900280d2 mov x16, #0x14 +;; e00310aa mov x0, x16 +;; 808300f8 stur x0, [x28, #8] +;; 808340f8 ldur x0, [x28, #8] +;; 810341f8 ldur x1, [x28, #0x10] +;; 217c009b mul x1, x1, x0 +;; e00301aa mov x0, x1 +;; ff630091 add sp, sp, #0x18 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i64_mul/max.wat b/winch/filetests/filetests/aarch64/i64_mul/max.wat index 4d654f0b683f..41f91cb15525 100644 --- a/winch/filetests/filetests/aarch64/i64_mul/max.wat +++ b/winch/filetests/filetests/aarch64/i64_mul/max.wat @@ -6,17 +6,17 @@ (i64.mul) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: 1000f092 mov x16, #0x7fffffffffffffff -;; 1c: e00310aa mov x0, x16 -;; 20: 10008092 mov x16, #-1 -;; 24: 007c109b mul x0, x0, x16 -;; 28: ff230091 add sp, sp, #8 -;; 2c: fc030091 mov x28, sp -;; 30: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 34: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; 1000f092 mov x16, #0x7fffffffffffffff +;; e00310aa mov x0, x16 +;; 10008092 mov x16, #-1 +;; 007c109b mul x0, x0, x16 +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i64_mul/max_one.wat b/winch/filetests/filetests/aarch64/i64_mul/max_one.wat index df0221f80ea3..2eaa76ce3055 100644 --- a/winch/filetests/filetests/aarch64/i64_mul/max_one.wat +++ b/winch/filetests/filetests/aarch64/i64_mul/max_one.wat @@ -7,17 +7,17 @@ (i64.mul) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: 1000f0d2 mov x16, #-0x8000000000000000 -;; 1c: e00310aa mov x0, x16 -;; 20: 10008092 mov x16, #-1 -;; 24: 007c109b mul x0, x0, x16 -;; 28: ff230091 add sp, sp, #8 -;; 2c: fc030091 mov x28, sp -;; 30: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 34: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; 1000f0d2 mov x16, #-0x8000000000000000 +;; e00310aa mov x0, x16 +;; 10008092 mov x16, #-1 +;; 007c109b mul x0, x0, x16 +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i64_mul/mixed.wat b/winch/filetests/filetests/aarch64/i64_mul/mixed.wat index d3499b42ae87..4ef2c2a261d8 100644 --- a/winch/filetests/filetests/aarch64/i64_mul/mixed.wat +++ b/winch/filetests/filetests/aarch64/i64_mul/mixed.wat @@ -7,17 +7,17 @@ (i64.mul) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: 10008092 mov x16, #-1 -;; 1c: e00310aa mov x0, x16 -;; 20: 300080d2 mov x16, #1 -;; 24: 007c109b mul x0, x0, x16 -;; 28: ff230091 add sp, sp, #8 -;; 2c: fc030091 mov x28, sp -;; 30: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 34: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; 10008092 mov x16, #-1 +;; e00310aa mov x0, x16 +;; 300080d2 mov x16, #1 +;; 007c109b mul x0, x0, x16 +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i64_mul/params.wat b/winch/filetests/filetests/aarch64/i64_mul/params.wat index f64707afcd8e..f902742516bd 100644 --- a/winch/filetests/filetests/aarch64/i64_mul/params.wat +++ b/winch/filetests/filetests/aarch64/i64_mul/params.wat @@ -7,19 +7,19 @@ (i64.mul) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff6300d1 sub sp, sp, #0x18 -;; 10: fc030091 mov x28, sp -;; 14: 800301f8 stur x0, [x28, #0x10] -;; 18: 818300f8 stur x1, [x28, #8] -;; 1c: 890300f8 stur x9, [x28] -;; 20: 808340f8 ldur x0, [x28, #8] -;; 24: 810341f8 ldur x1, [x28, #0x10] -;; 28: 217c009b mul x1, x1, x0 -;; 2c: e00301aa mov x0, x1 -;; 30: ff630091 add sp, sp, #0x18 -;; 34: fc030091 mov x28, sp -;; 38: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 3c: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff6300d1 sub sp, sp, #0x18 +;; fc030091 mov x28, sp +;; 800301f8 stur x0, [x28, #0x10] +;; 818300f8 stur x1, [x28, #8] +;; 890300f8 stur x9, [x28] +;; 808340f8 ldur x0, [x28, #8] +;; 810341f8 ldur x1, [x28, #0x10] +;; 217c009b mul x1, x1, x0 +;; e00301aa mov x0, x1 +;; ff630091 add sp, sp, #0x18 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i64_mul/signed.wat b/winch/filetests/filetests/aarch64/i64_mul/signed.wat index 000c56863c4f..c52600d989fe 100644 --- a/winch/filetests/filetests/aarch64/i64_mul/signed.wat +++ b/winch/filetests/filetests/aarch64/i64_mul/signed.wat @@ -7,17 +7,17 @@ (i64.mul) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: 10008092 mov x16, #-1 -;; 1c: e00310aa mov x0, x16 -;; 20: 10008092 mov x16, #-1 -;; 24: 007c109b mul x0, x0, x16 -;; 28: ff230091 add sp, sp, #8 -;; 2c: fc030091 mov x28, sp -;; 30: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 34: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; 10008092 mov x16, #-1 +;; e00310aa mov x0, x16 +;; 10008092 mov x16, #-1 +;; 007c109b mul x0, x0, x16 +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i64_mul/unsigned_with_zero.wat b/winch/filetests/filetests/aarch64/i64_mul/unsigned_with_zero.wat index 887db36f08f9..9f80cebbf18b 100644 --- a/winch/filetests/filetests/aarch64/i64_mul/unsigned_with_zero.wat +++ b/winch/filetests/filetests/aarch64/i64_mul/unsigned_with_zero.wat @@ -7,17 +7,17 @@ (i64.mul) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: 300080d2 mov x16, #1 -;; 1c: e00310aa mov x0, x16 -;; 20: 100080d2 mov x16, #0 -;; 24: 007c109b mul x0, x0, x16 -;; 28: ff230091 add sp, sp, #8 -;; 2c: fc030091 mov x28, sp -;; 30: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 34: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; 300080d2 mov x16, #1 +;; e00310aa mov x0, x16 +;; 100080d2 mov x16, #0 +;; 007c109b mul x0, x0, x16 +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i64_sub/const.wat b/winch/filetests/filetests/aarch64/i64_sub/const.wat index 8921be4f66a6..be4f018d3db6 100644 --- a/winch/filetests/filetests/aarch64/i64_sub/const.wat +++ b/winch/filetests/filetests/aarch64/i64_sub/const.wat @@ -7,16 +7,16 @@ (i64.sub) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: 500180d2 mov x16, #0xa -;; 1c: e00310aa mov x0, x16 -;; 20: 005000d1 sub x0, x0, #0x14 -;; 24: ff230091 add sp, sp, #8 -;; 28: fc030091 mov x28, sp -;; 2c: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 30: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; 500180d2 mov x16, #0xa +;; e00310aa mov x0, x16 +;; 005000d1 sub x0, x0, #0x14 +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i64_sub/locals.wat b/winch/filetests/filetests/aarch64/i64_sub/locals.wat index b9093cd61e5c..ec93d32767a0 100644 --- a/winch/filetests/filetests/aarch64/i64_sub/locals.wat +++ b/winch/filetests/filetests/aarch64/i64_sub/locals.wat @@ -16,26 +16,26 @@ i64.sub ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff6300d1 sub sp, sp, #0x18 -;; 10: fc030091 mov x28, sp -;; 14: 100080d2 mov x16, #0 -;; 18: 900301f8 stur x16, [x28, #0x10] -;; 1c: 908300f8 stur x16, [x28, #8] -;; 20: 890300f8 stur x9, [x28] -;; 24: 500180d2 mov x16, #0xa -;; 28: e00310aa mov x0, x16 -;; 2c: 800301f8 stur x0, [x28, #0x10] -;; 30: 900280d2 mov x16, #0x14 -;; 34: e00310aa mov x0, x16 -;; 38: 808300f8 stur x0, [x28, #8] -;; 3c: 808340f8 ldur x0, [x28, #8] -;; 40: 810341f8 ldur x1, [x28, #0x10] -;; 44: 216020cb sub x1, x1, x0, uxtx -;; 48: e00301aa mov x0, x1 -;; 4c: ff630091 add sp, sp, #0x18 -;; 50: fc030091 mov x28, sp -;; 54: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 58: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff6300d1 sub sp, sp, #0x18 +;; fc030091 mov x28, sp +;; 100080d2 mov x16, #0 +;; 900301f8 stur x16, [x28, #0x10] +;; 908300f8 stur x16, [x28, #8] +;; 890300f8 stur x9, [x28] +;; 500180d2 mov x16, #0xa +;; e00310aa mov x0, x16 +;; 800301f8 stur x0, [x28, #0x10] +;; 900280d2 mov x16, #0x14 +;; e00310aa mov x0, x16 +;; 808300f8 stur x0, [x28, #8] +;; 808340f8 ldur x0, [x28, #8] +;; 810341f8 ldur x1, [x28, #0x10] +;; 216020cb sub x1, x1, x0, uxtx +;; e00301aa mov x0, x1 +;; ff630091 add sp, sp, #0x18 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i64_sub/max.wat b/winch/filetests/filetests/aarch64/i64_sub/max.wat index 21aaa8b3ffb5..76d642905483 100644 --- a/winch/filetests/filetests/aarch64/i64_sub/max.wat +++ b/winch/filetests/filetests/aarch64/i64_sub/max.wat @@ -6,17 +6,17 @@ (i64.sub) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: 1000f092 mov x16, #0x7fffffffffffffff -;; 1c: e00310aa mov x0, x16 -;; 20: 10008092 mov x16, #-1 -;; 24: 006030cb sub x0, x0, x16, uxtx -;; 28: ff230091 add sp, sp, #8 -;; 2c: fc030091 mov x28, sp -;; 30: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 34: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; 1000f092 mov x16, #0x7fffffffffffffff +;; e00310aa mov x0, x16 +;; 10008092 mov x16, #-1 +;; 006030cb sub x0, x0, x16, uxtx +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i64_sub/max_one.wat b/winch/filetests/filetests/aarch64/i64_sub/max_one.wat index ec4e23e2b257..36fb2f7a1d8c 100644 --- a/winch/filetests/filetests/aarch64/i64_sub/max_one.wat +++ b/winch/filetests/filetests/aarch64/i64_sub/max_one.wat @@ -7,16 +7,16 @@ (i64.sub) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: 1000f0d2 mov x16, #-0x8000000000000000 -;; 1c: e00310aa mov x0, x16 -;; 20: 000400d1 sub x0, x0, #1 -;; 24: ff230091 add sp, sp, #8 -;; 28: fc030091 mov x28, sp -;; 2c: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 30: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; 1000f0d2 mov x16, #-0x8000000000000000 +;; e00310aa mov x0, x16 +;; 000400d1 sub x0, x0, #1 +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i64_sub/mixed.wat b/winch/filetests/filetests/aarch64/i64_sub/mixed.wat index de223c78b870..ae06566e26ea 100644 --- a/winch/filetests/filetests/aarch64/i64_sub/mixed.wat +++ b/winch/filetests/filetests/aarch64/i64_sub/mixed.wat @@ -7,16 +7,16 @@ (i64.sub) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: 10008092 mov x16, #-1 -;; 1c: e00310aa mov x0, x16 -;; 20: 000400d1 sub x0, x0, #1 -;; 24: ff230091 add sp, sp, #8 -;; 28: fc030091 mov x28, sp -;; 2c: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 30: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; 10008092 mov x16, #-1 +;; e00310aa mov x0, x16 +;; 000400d1 sub x0, x0, #1 +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i64_sub/params.wat b/winch/filetests/filetests/aarch64/i64_sub/params.wat index df3509b0b82b..30560c7c4d06 100644 --- a/winch/filetests/filetests/aarch64/i64_sub/params.wat +++ b/winch/filetests/filetests/aarch64/i64_sub/params.wat @@ -7,19 +7,19 @@ (i64.sub) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff6300d1 sub sp, sp, #0x18 -;; 10: fc030091 mov x28, sp -;; 14: 800301f8 stur x0, [x28, #0x10] -;; 18: 818300f8 stur x1, [x28, #8] -;; 1c: 890300f8 stur x9, [x28] -;; 20: 808340f8 ldur x0, [x28, #8] -;; 24: 810341f8 ldur x1, [x28, #0x10] -;; 28: 216020cb sub x1, x1, x0, uxtx -;; 2c: e00301aa mov x0, x1 -;; 30: ff630091 add sp, sp, #0x18 -;; 34: fc030091 mov x28, sp -;; 38: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 3c: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff6300d1 sub sp, sp, #0x18 +;; fc030091 mov x28, sp +;; 800301f8 stur x0, [x28, #0x10] +;; 818300f8 stur x1, [x28, #8] +;; 890300f8 stur x9, [x28] +;; 808340f8 ldur x0, [x28, #8] +;; 810341f8 ldur x1, [x28, #0x10] +;; 216020cb sub x1, x1, x0, uxtx +;; e00301aa mov x0, x1 +;; ff630091 add sp, sp, #0x18 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i64_sub/signed.wat b/winch/filetests/filetests/aarch64/i64_sub/signed.wat index 65ffc66c3082..6fd70be787cd 100644 --- a/winch/filetests/filetests/aarch64/i64_sub/signed.wat +++ b/winch/filetests/filetests/aarch64/i64_sub/signed.wat @@ -7,17 +7,17 @@ (i64.sub) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: 10008092 mov x16, #-1 -;; 1c: e00310aa mov x0, x16 -;; 20: 10008092 mov x16, #-1 -;; 24: 006030cb sub x0, x0, x16, uxtx -;; 28: ff230091 add sp, sp, #8 -;; 2c: fc030091 mov x28, sp -;; 30: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 34: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; 10008092 mov x16, #-1 +;; e00310aa mov x0, x16 +;; 10008092 mov x16, #-1 +;; 006030cb sub x0, x0, x16, uxtx +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/i64_sub/unsigned_with_zero.wat b/winch/filetests/filetests/aarch64/i64_sub/unsigned_with_zero.wat index 35d2acf1427b..a2e977fe1a13 100644 --- a/winch/filetests/filetests/aarch64/i64_sub/unsigned_with_zero.wat +++ b/winch/filetests/filetests/aarch64/i64_sub/unsigned_with_zero.wat @@ -7,16 +7,16 @@ (i64.sub) ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: 300080d2 mov x16, #1 -;; 1c: e00310aa mov x0, x16 -;; 20: 000000d1 sub x0, x0, #0 -;; 24: ff230091 add sp, sp, #8 -;; 28: fc030091 mov x28, sp -;; 2c: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 30: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; 300080d2 mov x16, #1 +;; e00310aa mov x0, x16 +;; 000000d1 sub x0, x0, #0 +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/aarch64/nop/nop.wat b/winch/filetests/filetests/aarch64/nop/nop.wat index c1f0d0755511..fa28e83bc2df 100644 --- a/winch/filetests/filetests/aarch64/nop/nop.wat +++ b/winch/filetests/filetests/aarch64/nop/nop.wat @@ -5,13 +5,13 @@ nop ) ) -;; 0: fd7bbfa9 stp x29, x30, [sp, #-0x10]! -;; 4: fd030091 mov x29, sp -;; 8: fc030091 mov x28, sp -;; c: ff2300d1 sub sp, sp, #8 -;; 10: fc030091 mov x28, sp -;; 14: 890300f8 stur x9, [x28] -;; 18: ff230091 add sp, sp, #8 -;; 1c: fc030091 mov x28, sp -;; 20: fd7bc1a8 ldp x29, x30, [sp], #0x10 -;; 24: c0035fd6 ret +;; fd7bbfa9 stp x29, x30, [sp, #-0x10]! +;; fd030091 mov x29, sp +;; fc030091 mov x28, sp +;; ff2300d1 sub sp, sp, #8 +;; fc030091 mov x28, sp +;; 890300f8 stur x9, [x28] +;; ff230091 add sp, sp, #8 +;; fc030091 mov x28, sp +;; fd7bc1a8 ldp x29, x30, [sp], #0x10 +;; c0035fd6 ret diff --git a/winch/filetests/filetests/x64/block/as_if_cond.wat b/winch/filetests/filetests/x64/block/as_if_cond.wat index e53df8ed817f..ed2ec28ae837 100644 --- a/winch/filetests/filetests/x64/block/as_if_cond.wat +++ b/winch/filetests/filetests/x64/block/as_if_cond.wat @@ -7,24 +7,34 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b801000000 mov eax, 1 -;; 11: 85c0 test eax, eax -;; 13: 0f840d000000 je 0x26 -;; 19: 4883ec08 sub rsp, 8 -;; 1d: e800000000 call 0x22 -;; 22: 4883c408 add rsp, 8 -;; 26: 4883c408 add rsp, 8 -;; 2a: 5d pop rbp -;; 2b: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8724000000 ja 0x3c +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 85c0 test eax, eax +;; 0f840d000000 je 0x36 +;; 29: 4883ec08 sub rsp, 8 +;; e800000000 call 0x32 +;; 4883c408 add rsp, 8 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 3c: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/block/as_if_else.wat b/winch/filetests/filetests/x64/block/as_if_else.wat index e1d85ab4ee6d..0a0d0778fc52 100644 --- a/winch/filetests/filetests/x64/block/as_if_else.wat +++ b/winch/filetests/filetests/x64/block/as_if_else.wat @@ -4,16 +4,21 @@ (if (result i32) (i32.const 1) (then (i32.const 2)) (else (block (result i32) (i32.const 1)))) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b801000000 mov eax, 1 -;; 11: 85c0 test eax, eax -;; 13: 0f840a000000 je 0x23 -;; 19: b802000000 mov eax, 2 -;; 1e: e905000000 jmp 0x28 -;; 23: b801000000 mov eax, 1 -;; 28: 4883c408 add rsp, 8 -;; 2c: 5d pop rbp -;; 2d: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8726000000 ja 0x3e +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 85c0 test eax, eax +;; 0f840a000000 je 0x33 +;; 29: b802000000 mov eax, 2 +;; e905000000 jmp 0x38 +;; 33: b801000000 mov eax, 1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 3e: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/block/as_if_then.wat b/winch/filetests/filetests/x64/block/as_if_then.wat index 065f37f2bc3d..2a18cf673b23 100644 --- a/winch/filetests/filetests/x64/block/as_if_then.wat +++ b/winch/filetests/filetests/x64/block/as_if_then.wat @@ -4,16 +4,21 @@ (if (result i32) (i32.const 1) (then (block (result i32) (i32.const 1))) (else (i32.const 2))) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b801000000 mov eax, 1 -;; 11: 85c0 test eax, eax -;; 13: 0f840a000000 je 0x23 -;; 19: b801000000 mov eax, 1 -;; 1e: e905000000 jmp 0x28 -;; 23: b802000000 mov eax, 2 -;; 28: 4883c408 add rsp, 8 -;; 2c: 5d pop rbp -;; 2d: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8726000000 ja 0x3e +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 85c0 test eax, eax +;; 0f840a000000 je 0x33 +;; 29: b801000000 mov eax, 1 +;; e905000000 jmp 0x38 +;; 33: b802000000 mov eax, 2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 3e: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/block/deep.wat b/winch/filetests/filetests/x64/block/deep.wat index 50f596d0d6ab..fd087ac870c1 100644 --- a/winch/filetests/filetests/x64/block/deep.wat +++ b/winch/filetests/filetests/x64/block/deep.wat @@ -44,22 +44,32 @@ )) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883ec08 sub rsp, 8 -;; 10: e800000000 call 0x15 -;; 15: 4883c408 add rsp, 8 -;; 19: b896000000 mov eax, 0x96 -;; 1e: 4883c408 add rsp, 8 -;; 22: 5d pop rbp -;; 23: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871c000000 ja 0x34 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x25 +;; 4883c408 add rsp, 8 +;; b896000000 mov eax, 0x96 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 34: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/block/empty.wat b/winch/filetests/filetests/x64/block/empty.wat index 685dcf14d87b..25e352e4bad9 100644 --- a/winch/filetests/filetests/x64/block/empty.wat +++ b/winch/filetests/filetests/x64/block/empty.wat @@ -8,18 +8,28 @@ (block $l) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/block/get_and_set.wat b/winch/filetests/filetests/x64/block/get_and_set.wat index e4508f923839..0b3ec3986667 100644 --- a/winch/filetests/filetests/x64/block/get_and_set.wat +++ b/winch/filetests/filetests/x64/block/get_and_set.wat @@ -8,17 +8,22 @@ local.set 0 ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 4c893424 mov qword ptr [rsp], r14 -;; 10: 448b5c240c mov r11d, dword ptr [rsp + 0xc] -;; 15: 4883ec04 sub rsp, 4 -;; 19: 44891c24 mov dword ptr [rsp], r11d -;; 1d: 8b0424 mov eax, dword ptr [rsp] -;; 20: 4883c404 add rsp, 4 -;; 24: 8944240c mov dword ptr [rsp + 0xc], eax -;; 28: 4883c410 add rsp, 0x10 -;; 2c: 5d pop rbp -;; 2d: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8726000000 ja 0x3e +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 448b5c240c mov r11d, dword ptr [rsp + 0xc] +;; 4883ec04 sub rsp, 4 +;; 44891c24 mov dword ptr [rsp], r11d +;; 8b0424 mov eax, dword ptr [rsp] +;; 4883c404 add rsp, 4 +;; 8944240c mov dword ptr [rsp + 0xc], eax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 3e: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/block/get_and_tee.wat b/winch/filetests/filetests/x64/block/get_and_tee.wat index 7fa18d5f5265..1571fc033dca 100644 --- a/winch/filetests/filetests/x64/block/get_and_tee.wat +++ b/winch/filetests/filetests/x64/block/get_and_tee.wat @@ -8,17 +8,22 @@ local.tee 0 ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 4c893424 mov qword ptr [rsp], r14 -;; 10: 448b5c240c mov r11d, dword ptr [rsp + 0xc] -;; 15: 4883ec04 sub rsp, 4 -;; 19: 44891c24 mov dword ptr [rsp], r11d -;; 1d: 8b0424 mov eax, dword ptr [rsp] -;; 20: 4883c404 add rsp, 4 -;; 24: 8944240c mov dword ptr [rsp + 0xc], eax -;; 28: 4883c410 add rsp, 0x10 -;; 2c: 5d pop rbp -;; 2d: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8726000000 ja 0x3e +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 448b5c240c mov r11d, dword ptr [rsp + 0xc] +;; 4883ec04 sub rsp, 4 +;; 44891c24 mov dword ptr [rsp], r11d +;; 8b0424 mov eax, dword ptr [rsp] +;; 4883c404 add rsp, 4 +;; 8944240c mov dword ptr [rsp + 0xc], eax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 3e: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/block/nested.wat b/winch/filetests/filetests/x64/block/nested.wat index 9007dd2898e0..29252a326c8e 100644 --- a/winch/filetests/filetests/x64/block/nested.wat +++ b/winch/filetests/filetests/x64/block/nested.wat @@ -9,25 +9,35 @@ ) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883ec08 sub rsp, 8 -;; 10: e800000000 call 0x15 -;; 15: 4883c408 add rsp, 8 -;; 19: 4883ec08 sub rsp, 8 -;; 1d: e800000000 call 0x22 -;; 22: 4883c408 add rsp, 8 -;; 26: b809000000 mov eax, 9 -;; 2b: 4883c408 add rsp, 8 -;; 2f: 5d pop rbp -;; 30: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8729000000 ja 0x41 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x25 +;; 4883c408 add rsp, 8 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x32 +;; 4883c408 add rsp, 8 +;; b809000000 mov eax, 9 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 41: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/block/singular.wat b/winch/filetests/filetests/x64/block/singular.wat index a9c271ce957c..0d7d46239d90 100644 --- a/winch/filetests/filetests/x64/block/singular.wat +++ b/winch/filetests/filetests/x64/block/singular.wat @@ -6,11 +6,16 @@ (block (result i32) (i32.const 7)) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b807000000 mov eax, 7 -;; 11: 4883c408 add rsp, 8 -;; 15: 5d pop rbp -;; 16: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870f000000 ja 0x27 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b807000000 mov eax, 7 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 27: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/block/with_local_float.wat b/winch/filetests/filetests/x64/block/with_local_float.wat index 5c3c2038d357..4c92b4bd307b 100644 --- a/winch/filetests/filetests/x64/block/with_local_float.wat +++ b/winch/filetests/filetests/x64/block/with_local_float.wat @@ -7,16 +7,21 @@ end ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; e: 4c893424 mov qword ptr [rsp], r14 -;; 12: f3440f107c240c movss xmm15, dword ptr [rsp + 0xc] -;; 19: 4883ec04 sub rsp, 4 -;; 1d: f3440f113c24 movss dword ptr [rsp], xmm15 -;; 23: f30f100424 movss xmm0, dword ptr [rsp] -;; 28: 4883c404 add rsp, 4 -;; 2c: 4883c410 add rsp, 0x10 -;; 30: 5d pop rbp -;; 31: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872a000000 ja 0x42 +;; 18: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f3440f107c240c movss xmm15, dword ptr [rsp + 0xc] +;; 4883ec04 sub rsp, 4 +;; f3440f113c24 movss dword ptr [rsp], xmm15 +;; f30f100424 movss xmm0, dword ptr [rsp] +;; 4883c404 add rsp, 4 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 42: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/br/as_block_first.wat b/winch/filetests/filetests/x64/br/as_block_first.wat index 155ddd3ce040..6c4e892c4c19 100644 --- a/winch/filetests/filetests/x64/br/as_block_first.wat +++ b/winch/filetests/filetests/x64/br/as_block_first.wat @@ -6,18 +6,28 @@ (block (br 0) (call $dummy)) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/br/as_block_last.wat b/winch/filetests/filetests/x64/br/as_block_last.wat index 98c097184c11..5fee1dd7b896 100644 --- a/winch/filetests/filetests/x64/br/as_block_last.wat +++ b/winch/filetests/filetests/x64/br/as_block_last.wat @@ -6,21 +6,31 @@ (block (nop) (call $dummy) (br 0)) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883ec08 sub rsp, 8 -;; 10: e800000000 call 0x15 -;; 15: 4883c408 add rsp, 8 -;; 19: 4883c408 add rsp, 8 -;; 1d: 5d pop rbp -;; 1e: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8717000000 ja 0x2f +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x25 +;; 4883c408 add rsp, 8 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2f: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/br/as_block_mid.wat b/winch/filetests/filetests/x64/br/as_block_mid.wat index 9bd4043cfd7f..2f4ec7d7f5e4 100644 --- a/winch/filetests/filetests/x64/br/as_block_mid.wat +++ b/winch/filetests/filetests/x64/br/as_block_mid.wat @@ -6,21 +6,31 @@ (block (call $dummy) (br 0) (call $dummy)) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883ec08 sub rsp, 8 -;; 10: e800000000 call 0x15 -;; 15: 4883c408 add rsp, 8 -;; 19: 4883c408 add rsp, 8 -;; 1d: 5d pop rbp -;; 1e: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8717000000 ja 0x2f +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x25 +;; 4883c408 add rsp, 8 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2f: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/br/as_block_value.wat b/winch/filetests/filetests/x64/br/as_block_value.wat index aeecd54c2682..ab70901124a6 100644 --- a/winch/filetests/filetests/x64/br/as_block_value.wat +++ b/winch/filetests/filetests/x64/br/as_block_value.wat @@ -6,22 +6,32 @@ (block (result i32) (nop) (call $dummy) (br 0 (i32.const 2))) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883ec08 sub rsp, 8 -;; 10: e800000000 call 0x15 -;; 15: 4883c408 add rsp, 8 -;; 19: b802000000 mov eax, 2 -;; 1e: 4883c408 add rsp, 8 -;; 22: 5d pop rbp -;; 23: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871c000000 ja 0x34 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x25 +;; 4883c408 add rsp, 8 +;; b802000000 mov eax, 2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 34: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/br/as_br_if_cond.wat b/winch/filetests/filetests/x64/br/as_br_if_cond.wat index 532cfb1dfbc8..e7bfef03a9cf 100644 --- a/winch/filetests/filetests/x64/br/as_br_if_cond.wat +++ b/winch/filetests/filetests/x64/br/as_br_if_cond.wat @@ -4,10 +4,15 @@ (block (br_if 0 (br 0))) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/br/as_br_value.wat b/winch/filetests/filetests/x64/br/as_br_value.wat index 31023d82c1d3..2a5513b6ef9e 100644 --- a/winch/filetests/filetests/x64/br/as_br_value.wat +++ b/winch/filetests/filetests/x64/br/as_br_value.wat @@ -4,11 +4,16 @@ (block (result i32) (br 0 (br 0 (i32.const 9)))) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b809000000 mov eax, 9 -;; 11: 4883c408 add rsp, 8 -;; 15: 5d pop rbp -;; 16: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870f000000 ja 0x27 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b809000000 mov eax, 9 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 27: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/br/as_call_all.wat b/winch/filetests/filetests/x64/br/as_call_all.wat index 9d0287cf47c8..106a17d3cce7 100644 --- a/winch/filetests/filetests/x64/br/as_call_all.wat +++ b/winch/filetests/filetests/x64/br/as_call_all.wat @@ -5,23 +5,33 @@ (block (result i32) (call $f (br 0 (i32.const 15)))) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 897c2414 mov dword ptr [rsp + 0x14], edi -;; c: 89742410 mov dword ptr [rsp + 0x10], esi -;; 10: 8954240c mov dword ptr [rsp + 0xc], edx -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: b8ffffffff mov eax, 0xffffffff -;; 1d: 4883c418 add rsp, 0x18 -;; 21: 5d pop rbp -;; 22: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871b000000 ja 0x33 +;; 18: 897c2414 mov dword ptr [rsp + 0x14], edi +;; 89742410 mov dword ptr [rsp + 0x10], esi +;; 8954240c mov dword ptr [rsp + 0xc], edx +;; 4c893424 mov qword ptr [rsp], r14 +;; b8ffffffff mov eax, 0xffffffff +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 33: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b80f000000 mov eax, 0xf -;; 11: 4883c408 add rsp, 8 -;; 15: 5d pop rbp -;; 16: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870f000000 ja 0x27 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b80f000000 mov eax, 0xf +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 27: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/br/as_call_first.wat b/winch/filetests/filetests/x64/br/as_call_first.wat index 6a9e7a12dadb..66506b01d40b 100644 --- a/winch/filetests/filetests/x64/br/as_call_first.wat +++ b/winch/filetests/filetests/x64/br/as_call_first.wat @@ -8,23 +8,33 @@ ) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 897c2414 mov dword ptr [rsp + 0x14], edi -;; c: 89742410 mov dword ptr [rsp + 0x10], esi -;; 10: 8954240c mov dword ptr [rsp + 0xc], edx -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: b8ffffffff mov eax, 0xffffffff -;; 1d: 4883c418 add rsp, 0x18 -;; 21: 5d pop rbp -;; 22: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871b000000 ja 0x33 +;; 18: 897c2414 mov dword ptr [rsp + 0x14], edi +;; 89742410 mov dword ptr [rsp + 0x10], esi +;; 8954240c mov dword ptr [rsp + 0xc], edx +;; 4c893424 mov qword ptr [rsp], r14 +;; b8ffffffff mov eax, 0xffffffff +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 33: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b80c000000 mov eax, 0xc -;; 11: 4883c408 add rsp, 8 -;; 15: 5d pop rbp -;; 16: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870f000000 ja 0x27 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b80c000000 mov eax, 0xc +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 27: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/br/as_call_last.wat b/winch/filetests/filetests/x64/br/as_call_last.wat index b45081f8b3e3..af3fca40c358 100644 --- a/winch/filetests/filetests/x64/br/as_call_last.wat +++ b/winch/filetests/filetests/x64/br/as_call_last.wat @@ -7,23 +7,33 @@ ) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 897c2414 mov dword ptr [rsp + 0x14], edi -;; c: 89742410 mov dword ptr [rsp + 0x10], esi -;; 10: 8954240c mov dword ptr [rsp + 0xc], edx -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: b8ffffffff mov eax, 0xffffffff -;; 1d: 4883c418 add rsp, 0x18 -;; 21: 5d pop rbp -;; 22: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871b000000 ja 0x33 +;; 18: 897c2414 mov dword ptr [rsp + 0x14], edi +;; 89742410 mov dword ptr [rsp + 0x10], esi +;; 8954240c mov dword ptr [rsp + 0xc], edx +;; 4c893424 mov qword ptr [rsp], r14 +;; b8ffffffff mov eax, 0xffffffff +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 33: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b80e000000 mov eax, 0xe -;; 11: 4883c408 add rsp, 8 -;; 15: 5d pop rbp -;; 16: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870f000000 ja 0x27 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b80e000000 mov eax, 0xe +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 27: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/br/as_call_mid.wat b/winch/filetests/filetests/x64/br/as_call_mid.wat index 6413c6613fb6..0850f6abf6e2 100644 --- a/winch/filetests/filetests/x64/br/as_call_mid.wat +++ b/winch/filetests/filetests/x64/br/as_call_mid.wat @@ -8,23 +8,33 @@ ) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 897c2414 mov dword ptr [rsp + 0x14], edi -;; c: 89742410 mov dword ptr [rsp + 0x10], esi -;; 10: 8954240c mov dword ptr [rsp + 0xc], edx -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: b8ffffffff mov eax, 0xffffffff -;; 1d: 4883c418 add rsp, 0x18 -;; 21: 5d pop rbp -;; 22: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871b000000 ja 0x33 +;; 18: 897c2414 mov dword ptr [rsp + 0x14], edi +;; 89742410 mov dword ptr [rsp + 0x10], esi +;; 8954240c mov dword ptr [rsp + 0xc], edx +;; 4c893424 mov qword ptr [rsp], r14 +;; b8ffffffff mov eax, 0xffffffff +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 33: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b80d000000 mov eax, 0xd -;; 11: 4883c408 add rsp, 8 -;; 15: 5d pop rbp -;; 16: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870f000000 ja 0x27 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b80d000000 mov eax, 0xd +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 27: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/br/as_if_cond.wat b/winch/filetests/filetests/x64/br/as_if_cond.wat index 6d069439fc8d..c82c79c0d863 100644 --- a/winch/filetests/filetests/x64/br/as_if_cond.wat +++ b/winch/filetests/filetests/x64/br/as_if_cond.wat @@ -9,11 +9,16 @@ ) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b802000000 mov eax, 2 -;; 11: 4883c408 add rsp, 8 -;; 15: 5d pop rbp -;; 16: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870f000000 ja 0x27 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b802000000 mov eax, 2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 27: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/br/as_if_else.wat b/winch/filetests/filetests/x64/br/as_if_else.wat index 691b945da2ed..e504afe2ac8c 100644 --- a/winch/filetests/filetests/x64/br/as_if_else.wat +++ b/winch/filetests/filetests/x64/br/as_if_else.wat @@ -9,18 +9,23 @@ ) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 18: 85c0 test eax, eax -;; 1a: 0f8409000000 je 0x29 -;; 20: 8b442408 mov eax, dword ptr [rsp + 8] -;; 24: e905000000 jmp 0x2e -;; 29: b804000000 mov eax, 4 -;; 2e: 4883c410 add rsp, 0x10 -;; 32: 5d pop rbp -;; 33: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872c000000 ja 0x44 +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 85c0 test eax, eax +;; 0f8409000000 je 0x39 +;; 30: 8b442408 mov eax, dword ptr [rsp + 8] +;; e905000000 jmp 0x3e +;; 39: b804000000 mov eax, 4 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 44: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/br/as_if_then.wat b/winch/filetests/filetests/x64/br/as_if_then.wat index 81199c52569f..0c6324189b35 100644 --- a/winch/filetests/filetests/x64/br/as_if_then.wat +++ b/winch/filetests/filetests/x64/br/as_if_then.wat @@ -9,18 +9,23 @@ ) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 18: 85c0 test eax, eax -;; 1a: 0f840a000000 je 0x2a -;; 20: b803000000 mov eax, 3 -;; 25: e904000000 jmp 0x2e -;; 2a: 8b442408 mov eax, dword ptr [rsp + 8] -;; 2e: 4883c410 add rsp, 0x10 -;; 32: 5d pop rbp -;; 33: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872c000000 ja 0x44 +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 85c0 test eax, eax +;; 0f840a000000 je 0x3a +;; 30: b803000000 mov eax, 3 +;; e904000000 jmp 0x3e +;; 3a: 8b442408 mov eax, dword ptr [rsp + 8] +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 44: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/br/as_loop_first.wat b/winch/filetests/filetests/x64/br/as_loop_first.wat index 8ddad54267fd..ea4692382194 100644 --- a/winch/filetests/filetests/x64/br/as_loop_first.wat +++ b/winch/filetests/filetests/x64/br/as_loop_first.wat @@ -5,11 +5,16 @@ (block (result i32) (loop (result i32) (br 1 (i32.const 3)) (i32.const 2))) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b803000000 mov eax, 3 -;; 11: 4883c408 add rsp, 8 -;; 15: 5d pop rbp -;; 16: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870f000000 ja 0x27 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b803000000 mov eax, 3 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 27: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/br/as_loop_last.wat b/winch/filetests/filetests/x64/br/as_loop_last.wat index 6e1eaa990445..846e0817630c 100644 --- a/winch/filetests/filetests/x64/br/as_loop_last.wat +++ b/winch/filetests/filetests/x64/br/as_loop_last.wat @@ -7,22 +7,32 @@ ) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883ec08 sub rsp, 8 -;; 10: e800000000 call 0x15 -;; 15: 4883c408 add rsp, 8 -;; 19: b805000000 mov eax, 5 -;; 1e: 4883c408 add rsp, 8 -;; 22: 5d pop rbp -;; 23: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871c000000 ja 0x34 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x25 +;; 4883c408 add rsp, 8 +;; b805000000 mov eax, 5 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 34: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/br/as_loop_mid.wat b/winch/filetests/filetests/x64/br/as_loop_mid.wat index 90c011c9cba1..2afe84d5033a 100644 --- a/winch/filetests/filetests/x64/br/as_loop_mid.wat +++ b/winch/filetests/filetests/x64/br/as_loop_mid.wat @@ -8,22 +8,32 @@ ) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883ec08 sub rsp, 8 -;; 10: e800000000 call 0x15 -;; 15: 4883c408 add rsp, 8 -;; 19: b804000000 mov eax, 4 -;; 1e: 4883c408 add rsp, 8 -;; 22: 5d pop rbp -;; 23: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871c000000 ja 0x34 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x25 +;; 4883c408 add rsp, 8 +;; b804000000 mov eax, 4 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 34: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/br/br_jump.wat b/winch/filetests/filetests/x64/br/br_jump.wat index cde8ca3ab244..4dbeae4777db 100644 --- a/winch/filetests/filetests/x64/br/br_jump.wat +++ b/winch/filetests/filetests/x64/br/br_jump.wat @@ -12,21 +12,25 @@ ) (export "" (func 0)) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8736000000 ja 0x4e +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: 448b5c240c mov r11d, dword ptr [rsp + 0xc] -;; 1a: 4883ec04 sub rsp, 4 -;; 1e: 44891c24 mov dword ptr [rsp], r11d -;; 22: 448b5c2410 mov r11d, dword ptr [rsp + 0x10] -;; 27: 4883ec04 sub rsp, 4 -;; 2b: 44891c24 mov dword ptr [rsp], r11d -;; 2f: 4883c404 add rsp, 4 -;; 33: e9eaffffff jmp 0x22 -;; 38: 4883c404 add rsp, 4 -;; 3c: 4883c410 add rsp, 0x10 -;; 40: 5d pop rbp -;; 41: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; 448b5c240c mov r11d, dword ptr [rsp + 0xc] +;; 4883ec04 sub rsp, 4 +;; 44891c24 mov dword ptr [rsp], r11d +;; 448b5c2410 mov r11d, dword ptr [rsp + 0x10] +;; 4883ec04 sub rsp, 4 +;; 44891c24 mov dword ptr [rsp], r11d +;; 4883c404 add rsp, 4 +;; e9eaffffff jmp 0x32 +;; 48: 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 4e: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/br_if/as_block_last.wat b/winch/filetests/filetests/x64/br_if/as_block_last.wat index 10cb626e3584..d8323583396b 100644 --- a/winch/filetests/filetests/x64/br_if/as_block_last.wat +++ b/winch/filetests/filetests/x64/br_if/as_block_last.wat @@ -5,24 +5,34 @@ (block (call $dummy) (call $dummy) (br_if 0 (local.get 0))) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 4c893424 mov qword ptr [rsp], r14 -;; 10: e800000000 call 0x15 -;; 15: e800000000 call 0x1a -;; 1a: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 1e: 85c0 test eax, eax -;; 20: 0f8500000000 jne 0x26 -;; 26: 4883c410 add rsp, 0x10 -;; 2a: 5d pop rbp -;; 2b: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8724000000 ja 0x3c +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; e800000000 call 0x25 +;; e800000000 call 0x2a +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 85c0 test eax, eax +;; 0f8500000000 jne 0x36 +;; 36: 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 3c: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/br_if/as_block_last_value.wat b/winch/filetests/filetests/x64/br_if/as_block_last_value.wat index ca33b6be208a..1ab44f33326e 100644 --- a/winch/filetests/filetests/x64/br_if/as_block_last_value.wat +++ b/winch/filetests/filetests/x64/br_if/as_block_last_value.wat @@ -7,25 +7,35 @@ ) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 4c893424 mov qword ptr [rsp], r14 -;; 10: e800000000 call 0x15 -;; 15: e800000000 call 0x1a -;; 1a: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 1e: b80b000000 mov eax, 0xb -;; 23: 85c9 test ecx, ecx -;; 25: 0f8500000000 jne 0x2b -;; 2b: 4883c410 add rsp, 0x10 -;; 2f: 5d pop rbp -;; 30: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8729000000 ja 0x41 +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; e800000000 call 0x25 +;; e800000000 call 0x2a +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; b80b000000 mov eax, 0xb +;; 85c9 test ecx, ecx +;; 0f8500000000 jne 0x3b +;; 3b: 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 41: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/br_if/as_br_if_cond.wat b/winch/filetests/filetests/x64/br_if/as_br_if_cond.wat index 1447cdaa6c43..52846f3ecb19 100644 --- a/winch/filetests/filetests/x64/br_if/as_br_if_cond.wat +++ b/winch/filetests/filetests/x64/br_if/as_br_if_cond.wat @@ -4,16 +4,21 @@ (block (br_if 0 (br_if 0 (i32.const 1) (i32.const 1)))) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b801000000 mov eax, 1 -;; 11: 85c0 test eax, eax -;; 13: 0f850d000000 jne 0x26 -;; 19: b801000000 mov eax, 1 -;; 1e: 85c0 test eax, eax -;; 20: 0f8500000000 jne 0x26 -;; 26: 4883c408 add rsp, 8 -;; 2a: 5d pop rbp -;; 2b: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8724000000 ja 0x3c +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 85c0 test eax, eax +;; 0f850d000000 jne 0x36 +;; 29: b801000000 mov eax, 1 +;; 85c0 test eax, eax +;; 0f8500000000 jne 0x36 +;; 36: 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 3c: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/br_if/as_br_value.wat b/winch/filetests/filetests/x64/br_if/as_br_value.wat index a1ae40f4fd0e..71b8f4010324 100644 --- a/winch/filetests/filetests/x64/br_if/as_br_value.wat +++ b/winch/filetests/filetests/x64/br_if/as_br_value.wat @@ -4,14 +4,19 @@ (block (result i32) (br 0 (br_if 0 (i32.const 1) (i32.const 2)))) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b902000000 mov ecx, 2 -;; 11: b801000000 mov eax, 1 -;; 16: 85c9 test ecx, ecx -;; 18: 0f8500000000 jne 0x1e -;; 1e: 4883c408 add rsp, 8 -;; 22: 5d pop rbp -;; 23: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871c000000 ja 0x34 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b902000000 mov ecx, 2 +;; b801000000 mov eax, 1 +;; 85c9 test ecx, ecx +;; 0f8500000000 jne 0x2e +;; 2e: 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 34: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/br_if/as_call_first.wat b/winch/filetests/filetests/x64/br_if/as_call_first.wat index 01ca796175e1..ffa47da0caa8 100644 --- a/winch/filetests/filetests/x64/br_if/as_call_first.wat +++ b/winch/filetests/filetests/x64/br_if/as_call_first.wat @@ -9,35 +9,45 @@ ) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 897c2414 mov dword ptr [rsp + 0x14], edi -;; c: 89742410 mov dword ptr [rsp + 0x10], esi -;; 10: 8954240c mov dword ptr [rsp + 0xc], edx -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: b8ffffffff mov eax, 0xffffffff -;; 1d: 4883c418 add rsp, 0x18 -;; 21: 5d pop rbp -;; 22: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871b000000 ja 0x33 +;; 18: 897c2414 mov dword ptr [rsp + 0x14], edi +;; 89742410 mov dword ptr [rsp + 0x10], esi +;; 8954240c mov dword ptr [rsp + 0xc], edx +;; 4c893424 mov qword ptr [rsp], r14 +;; b8ffffffff mov eax, 0xffffffff +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 33: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b901000000 mov ecx, 1 -;; 11: b80c000000 mov eax, 0xc -;; 16: 85c9 test ecx, ecx -;; 18: 0f8526000000 jne 0x44 -;; 1e: 4883ec04 sub rsp, 4 -;; 22: 890424 mov dword ptr [rsp], eax -;; 25: 4883ec04 sub rsp, 4 -;; 29: 8b7c2404 mov edi, dword ptr [rsp + 4] -;; 2d: be02000000 mov esi, 2 -;; 32: ba03000000 mov edx, 3 -;; 37: e800000000 call 0x3c -;; 3c: 4883c404 add rsp, 4 -;; 40: 4883c404 add rsp, 4 -;; 44: 4883c408 add rsp, 8 -;; 48: 5d pop rbp -;; 49: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8742000000 ja 0x5a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b901000000 mov ecx, 1 +;; b80c000000 mov eax, 0xc +;; 85c9 test ecx, ecx +;; 0f8526000000 jne 0x54 +;; 2e: 4883ec04 sub rsp, 4 +;; 890424 mov dword ptr [rsp], eax +;; 4883ec04 sub rsp, 4 +;; 8b7c2404 mov edi, dword ptr [rsp + 4] +;; be02000000 mov esi, 2 +;; ba03000000 mov edx, 3 +;; e800000000 call 0x4c +;; 4883c404 add rsp, 4 +;; 4883c404 add rsp, 4 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 5a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/br_if/as_call_last.wat b/winch/filetests/filetests/x64/br_if/as_call_last.wat index cf746cc4a56c..99f257542e4c 100644 --- a/winch/filetests/filetests/x64/br_if/as_call_last.wat +++ b/winch/filetests/filetests/x64/br_if/as_call_last.wat @@ -9,35 +9,45 @@ ) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 897c2414 mov dword ptr [rsp + 0x14], edi -;; c: 89742410 mov dword ptr [rsp + 0x10], esi -;; 10: 8954240c mov dword ptr [rsp + 0xc], edx -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: b8ffffffff mov eax, 0xffffffff -;; 1d: 4883c418 add rsp, 0x18 -;; 21: 5d pop rbp -;; 22: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871b000000 ja 0x33 +;; 18: 897c2414 mov dword ptr [rsp + 0x14], edi +;; 89742410 mov dword ptr [rsp + 0x10], esi +;; 8954240c mov dword ptr [rsp + 0xc], edx +;; 4c893424 mov qword ptr [rsp], r14 +;; b8ffffffff mov eax, 0xffffffff +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 33: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b901000000 mov ecx, 1 -;; 11: b80e000000 mov eax, 0xe -;; 16: 85c9 test ecx, ecx -;; 18: 0f8526000000 jne 0x44 -;; 1e: 4883ec04 sub rsp, 4 -;; 22: 890424 mov dword ptr [rsp], eax -;; 25: 4883ec04 sub rsp, 4 -;; 29: bf01000000 mov edi, 1 -;; 2e: be02000000 mov esi, 2 -;; 33: 8b542404 mov edx, dword ptr [rsp + 4] -;; 37: e800000000 call 0x3c -;; 3c: 4883c404 add rsp, 4 -;; 40: 4883c404 add rsp, 4 -;; 44: 4883c408 add rsp, 8 -;; 48: 5d pop rbp -;; 49: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8742000000 ja 0x5a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b901000000 mov ecx, 1 +;; b80e000000 mov eax, 0xe +;; 85c9 test ecx, ecx +;; 0f8526000000 jne 0x54 +;; 2e: 4883ec04 sub rsp, 4 +;; 890424 mov dword ptr [rsp], eax +;; 4883ec04 sub rsp, 4 +;; bf01000000 mov edi, 1 +;; be02000000 mov esi, 2 +;; 8b542404 mov edx, dword ptr [rsp + 4] +;; e800000000 call 0x4c +;; 4883c404 add rsp, 4 +;; 4883c404 add rsp, 4 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 5a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/br_if/as_call_mid.wat b/winch/filetests/filetests/x64/br_if/as_call_mid.wat index d71c121db85b..fb2f9cc72a3a 100644 --- a/winch/filetests/filetests/x64/br_if/as_call_mid.wat +++ b/winch/filetests/filetests/x64/br_if/as_call_mid.wat @@ -9,35 +9,45 @@ ) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 897c2414 mov dword ptr [rsp + 0x14], edi -;; c: 89742410 mov dword ptr [rsp + 0x10], esi -;; 10: 8954240c mov dword ptr [rsp + 0xc], edx -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: b8ffffffff mov eax, 0xffffffff -;; 1d: 4883c418 add rsp, 0x18 -;; 21: 5d pop rbp -;; 22: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871b000000 ja 0x33 +;; 18: 897c2414 mov dword ptr [rsp + 0x14], edi +;; 89742410 mov dword ptr [rsp + 0x10], esi +;; 8954240c mov dword ptr [rsp + 0xc], edx +;; 4c893424 mov qword ptr [rsp], r14 +;; b8ffffffff mov eax, 0xffffffff +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 33: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b901000000 mov ecx, 1 -;; 11: b80d000000 mov eax, 0xd -;; 16: 85c9 test ecx, ecx -;; 18: 0f8526000000 jne 0x44 -;; 1e: 4883ec04 sub rsp, 4 -;; 22: 890424 mov dword ptr [rsp], eax -;; 25: 4883ec04 sub rsp, 4 -;; 29: bf01000000 mov edi, 1 -;; 2e: 8b742404 mov esi, dword ptr [rsp + 4] -;; 32: ba03000000 mov edx, 3 -;; 37: e800000000 call 0x3c -;; 3c: 4883c404 add rsp, 4 -;; 40: 4883c404 add rsp, 4 -;; 44: 4883c408 add rsp, 8 -;; 48: 5d pop rbp -;; 49: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8742000000 ja 0x5a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b901000000 mov ecx, 1 +;; b80d000000 mov eax, 0xd +;; 85c9 test ecx, ecx +;; 0f8526000000 jne 0x54 +;; 2e: 4883ec04 sub rsp, 4 +;; 890424 mov dword ptr [rsp], eax +;; 4883ec04 sub rsp, 4 +;; bf01000000 mov edi, 1 +;; 8b742404 mov esi, dword ptr [rsp + 4] +;; ba03000000 mov edx, 3 +;; e800000000 call 0x4c +;; 4883c404 add rsp, 4 +;; 4883c404 add rsp, 4 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 5a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/br_if/as_if_cond.wat b/winch/filetests/filetests/x64/br_if/as_if_cond.wat index a1c6aeaf2a3f..ea60c7fede78 100644 --- a/winch/filetests/filetests/x64/br_if/as_if_cond.wat +++ b/winch/filetests/filetests/x64/br_if/as_if_cond.wat @@ -10,20 +10,25 @@ ) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 4c893424 mov qword ptr [rsp], r14 -;; 10: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 14: b801000000 mov eax, 1 -;; 19: 85c9 test ecx, ecx -;; 1b: 0f8517000000 jne 0x38 -;; 21: 85c0 test eax, eax -;; 23: 0f840a000000 je 0x33 -;; 29: b802000000 mov eax, 2 -;; 2e: e905000000 jmp 0x38 -;; 33: b803000000 mov eax, 3 -;; 38: 4883c410 add rsp, 0x10 -;; 3c: 5d pop rbp -;; 3d: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8736000000 ja 0x4e +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; b801000000 mov eax, 1 +;; 85c9 test ecx, ecx +;; 0f8517000000 jne 0x48 +;; 31: 85c0 test eax, eax +;; 0f840a000000 je 0x43 +;; 39: b802000000 mov eax, 2 +;; e905000000 jmp 0x48 +;; 43: b803000000 mov eax, 3 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 4e: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/br_if/as_if_else.wat b/winch/filetests/filetests/x64/br_if/as_if_else.wat index 4af03a69b8c5..52bf8971fbb5 100644 --- a/winch/filetests/filetests/x64/br_if/as_if_else.wat +++ b/winch/filetests/filetests/x64/br_if/as_if_else.wat @@ -8,28 +8,38 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 18: 85c0 test eax, eax -;; 1a: 0f840a000000 je 0x2a -;; 20: e800000000 call 0x25 -;; 25: e90c000000 jmp 0x36 -;; 2a: 8b442408 mov eax, dword ptr [rsp + 8] -;; 2e: 85c0 test eax, eax -;; 30: 0f8500000000 jne 0x36 -;; 36: 4883c410 add rsp, 0x10 -;; 3a: 5d pop rbp -;; 3b: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8734000000 ja 0x4c +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 85c0 test eax, eax +;; 0f840a000000 je 0x3a +;; 30: e800000000 call 0x35 +;; e90c000000 jmp 0x46 +;; 3a: 8b442408 mov eax, dword ptr [rsp + 8] +;; 85c0 test eax, eax +;; 0f8500000000 jne 0x46 +;; 46: 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 4c: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/br_if/as_if_then.wat b/winch/filetests/filetests/x64/br_if/as_if_then.wat index f8be63c17702..864c0cbdbcfe 100644 --- a/winch/filetests/filetests/x64/br_if/as_if_then.wat +++ b/winch/filetests/filetests/x64/br_if/as_if_then.wat @@ -7,28 +7,38 @@ ) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 18: 85c0 test eax, eax -;; 1a: 0f8411000000 je 0x31 -;; 20: 8b442408 mov eax, dword ptr [rsp + 8] -;; 24: 85c0 test eax, eax -;; 26: 0f850a000000 jne 0x36 -;; 2c: e905000000 jmp 0x36 -;; 31: e800000000 call 0x36 -;; 36: 4883c410 add rsp, 0x10 -;; 3a: 5d pop rbp -;; 3b: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8734000000 ja 0x4c +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 85c0 test eax, eax +;; 0f8411000000 je 0x41 +;; 30: 8b442408 mov eax, dword ptr [rsp + 8] +;; 85c0 test eax, eax +;; 0f850a000000 jne 0x46 +;; e905000000 jmp 0x46 +;; 41: e800000000 call 0x46 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 4c: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/br_if/as_local_set_value.wat b/winch/filetests/filetests/x64/br_if/as_local_set_value.wat index ee5f0ac87d94..2ecc24b03b3b 100644 --- a/winch/filetests/filetests/x64/br_if/as_local_set_value.wat +++ b/winch/filetests/filetests/x64/br_if/as_local_set_value.wat @@ -8,19 +8,24 @@ ) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: c744240800000000 mov dword ptr [rsp + 8], 0 -;; 14: 4531db xor r11d, r11d -;; 17: 4c893424 mov qword ptr [rsp], r14 -;; 1b: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 1f: b811000000 mov eax, 0x11 -;; 24: 85c9 test ecx, ecx -;; 26: 0f8509000000 jne 0x35 -;; 2c: 8944240c mov dword ptr [rsp + 0xc], eax -;; 30: b8ffffffff mov eax, 0xffffffff -;; 35: 4883c410 add rsp, 0x10 -;; 39: 5d pop rbp -;; 3a: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8733000000 ja 0x4b +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; c744240800000000 mov dword ptr [rsp + 8], 0 +;; 4531db xor r11d, r11d +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; b811000000 mov eax, 0x11 +;; 85c9 test ecx, ecx +;; 0f8509000000 jne 0x45 +;; 3c: 8944240c mov dword ptr [rsp + 0xc], eax +;; b8ffffffff mov eax, 0xffffffff +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 4b: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/br_if/as_loop_last.wat b/winch/filetests/filetests/x64/br_if/as_loop_last.wat index 511686d85242..ee037ab8f0ab 100644 --- a/winch/filetests/filetests/x64/br_if/as_loop_last.wat +++ b/winch/filetests/filetests/x64/br_if/as_loop_last.wat @@ -5,23 +5,33 @@ (loop (call $dummy) (br_if 1 (local.get 0))) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 4c893424 mov qword ptr [rsp], r14 -;; 10: e800000000 call 0x15 -;; 15: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 19: 85c0 test eax, eax -;; 1b: 0f8500000000 jne 0x21 -;; 21: 4883c410 add rsp, 0x10 -;; 25: 5d pop rbp -;; 26: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871f000000 ja 0x37 +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; e800000000 call 0x25 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 85c0 test eax, eax +;; 0f8500000000 jne 0x31 +;; 31: 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 37: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/br_if/with_machine_stack_entry.wat b/winch/filetests/filetests/x64/br_if/with_machine_stack_entry.wat new file mode 100644 index 000000000000..5738e90e5e1b --- /dev/null +++ b/winch/filetests/filetests/x64/br_if/with_machine_stack_entry.wat @@ -0,0 +1,52 @@ +;;! target = "x86_64" + +(module + (func (export "") + call 1 + call 1 + br_if 0 + drop + ) + (func (;1;) (result i32) + i32.const 1 + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8740000000 ja 0x58 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x25 +;; 4883c408 add rsp, 8 +;; 4883ec04 sub rsp, 4 +;; 890424 mov dword ptr [rsp], eax +;; 4883ec04 sub rsp, 4 +;; e800000000 call 0x39 +;; 4883c404 add rsp, 4 +;; 85c0 test eax, eax +;; 0f8409000000 je 0x4e +;; 45: 4883c404 add rsp, 4 +;; e904000000 jmp 0x52 +;; 4e: 4883c404 add rsp, 4 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 58: 0f0b ud2 +;; +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870f000000 ja 0x27 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 27: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/br_table/ensure_sp_state.wat b/winch/filetests/filetests/x64/br_table/ensure_sp_state.wat new file mode 100644 index 000000000000..7cc91bb0e4ef --- /dev/null +++ b/winch/filetests/filetests/x64/br_table/ensure_sp_state.wat @@ -0,0 +1,39 @@ +;;! target = "x86_64" + +(module + (func (export "") (result i32) + block (result i32) + i32.const 0 + end + i32.const 0 + i32.const 0 + br_table 0 + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8743000000 ja 0x5b +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b800000000 mov eax, 0 +;; 4883ec04 sub rsp, 4 +;; 890424 mov dword ptr [rsp], eax +;; b900000000 mov ecx, 0 +;; b800000000 mov eax, 0 +;; ba00000000 mov edx, 0 +;; 39ca cmp edx, ecx +;; 0f42ca cmovb ecx, edx +;; 4c8d1d0a000000 lea r11, [rip + 0xa] +;; 4963148b movsxd rdx, dword ptr [r11 + rcx*4] +;; 4901d3 add r11, rdx +;; 41ffe3 jmp r11 +;; 4d: 0400 add al, 0 +;; 0000 add byte ptr [rax], al +;; 4883c404 add rsp, 4 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 5b: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/br_table/large.wat b/winch/filetests/filetests/x64/br_table/large.wat index b346435201cb..ab4647dccdb2 100644 --- a/winch/filetests/filetests/x64/br_table/large.wat +++ b/winch/filetests/filetests/x64/br_table/large.wat @@ -737,30792 +737,30797 @@ (return (i32.const 1)) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 4c893424 mov qword ptr [rsp], r14 -;; 10: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 14: b927600000 mov ecx, 0x6027 -;; 19: 39c1 cmp ecx, eax -;; 1b: 0f42c1 cmovb eax, ecx -;; 1e: 4c8d1d0a000000 lea r11, [rip + 0xa] -;; 25: 49630c83 movsxd rcx, dword ptr [r11 + rax*4] -;; 29: 4901cb add r11, rcx -;; 2c: 41ffe3 jmp r11 -;; 2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 38: 800100 add byte ptr [rcx], 0 -;; 3b: aa stosb byte ptr [rdi], al -;; 3c: 800100 add byte ptr [rcx], 0 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f87dc800100 ja 0x180f4 +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; b927600000 mov ecx, 0x6027 +;; 39c1 cmp ecx, eax +;; 0f42c1 cmovb eax, ecx +;; 4c8d1d0a000000 lea r11, [rip + 0xa] +;; 49630c83 movsxd rcx, dword ptr [r11 + rax*4] +;; 4901cb add r11, rcx +;; 41ffe3 jmp r11 ;; 3f: a0800100aa800100a0 ;; movabs al, byte ptr [0xa0000180aa000180] -;; 48: 800100 add byte ptr [rcx], 0 -;; 4b: aa stosb byte ptr [rdi], al -;; 4c: 800100 add byte ptr [rcx], 0 -;; 4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 58: 800100 add byte ptr [rcx], 0 -;; 5b: aa stosb byte ptr [rdi], al -;; 5c: 800100 add byte ptr [rcx], 0 -;; 5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 68: 800100 add byte ptr [rcx], 0 -;; 6b: aa stosb byte ptr [rdi], al -;; 6c: 800100 add byte ptr [rcx], 0 -;; 6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 78: 800100 add byte ptr [rcx], 0 -;; 7b: aa stosb byte ptr [rdi], al -;; 7c: 800100 add byte ptr [rcx], 0 -;; 7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 88: 800100 add byte ptr [rcx], 0 -;; 8b: aa stosb byte ptr [rdi], al -;; 8c: 800100 add byte ptr [rcx], 0 -;; 8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 98: 800100 add byte ptr [rcx], 0 -;; 9b: aa stosb byte ptr [rdi], al -;; 9c: 800100 add byte ptr [rcx], 0 -;; 9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a8: 800100 add byte ptr [rcx], 0 -;; ab: aa stosb byte ptr [rdi], al -;; ac: 800100 add byte ptr [rcx], 0 -;; af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b8: 800100 add byte ptr [rcx], 0 -;; bb: aa stosb byte ptr [rdi], al -;; bc: 800100 add byte ptr [rcx], 0 -;; bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c8: 800100 add byte ptr [rcx], 0 -;; cb: aa stosb byte ptr [rdi], al -;; cc: 800100 add byte ptr [rcx], 0 -;; cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d8: 800100 add byte ptr [rcx], 0 -;; db: aa stosb byte ptr [rdi], al -;; dc: 800100 add byte ptr [rcx], 0 -;; df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e8: 800100 add byte ptr [rcx], 0 -;; eb: aa stosb byte ptr [rdi], al -;; ec: 800100 add byte ptr [rcx], 0 -;; ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f8: 800100 add byte ptr [rcx], 0 -;; fb: aa stosb byte ptr [rdi], al -;; fc: 800100 add byte ptr [rcx], 0 -;; ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 108: 800100 add byte ptr [rcx], 0 -;; 10b: aa stosb byte ptr [rdi], al -;; 10c: 800100 add byte ptr [rcx], 0 -;; 10f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 118: 800100 add byte ptr [rcx], 0 -;; 11b: aa stosb byte ptr [rdi], al -;; 11c: 800100 add byte ptr [rcx], 0 -;; 11f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 128: 800100 add byte ptr [rcx], 0 -;; 12b: aa stosb byte ptr [rdi], al -;; 12c: 800100 add byte ptr [rcx], 0 -;; 12f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 138: 800100 add byte ptr [rcx], 0 -;; 13b: aa stosb byte ptr [rdi], al -;; 13c: 800100 add byte ptr [rcx], 0 -;; 13f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 148: 800100 add byte ptr [rcx], 0 -;; 14b: aa stosb byte ptr [rdi], al -;; 14c: 800100 add byte ptr [rcx], 0 -;; 14f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 158: 800100 add byte ptr [rcx], 0 -;; 15b: aa stosb byte ptr [rdi], al -;; 15c: 800100 add byte ptr [rcx], 0 -;; 15f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 168: 800100 add byte ptr [rcx], 0 -;; 16b: aa stosb byte ptr [rdi], al -;; 16c: 800100 add byte ptr [rcx], 0 -;; 16f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 178: 800100 add byte ptr [rcx], 0 -;; 17b: aa stosb byte ptr [rdi], al -;; 17c: 800100 add byte ptr [rcx], 0 -;; 17f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 188: 800100 add byte ptr [rcx], 0 -;; 18b: aa stosb byte ptr [rdi], al -;; 18c: 800100 add byte ptr [rcx], 0 -;; 18f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 198: 800100 add byte ptr [rcx], 0 -;; 19b: aa stosb byte ptr [rdi], al -;; 19c: 800100 add byte ptr [rcx], 0 -;; 19f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1a8: 800100 add byte ptr [rcx], 0 -;; 1ab: aa stosb byte ptr [rdi], al -;; 1ac: 800100 add byte ptr [rcx], 0 -;; 1af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1b8: 800100 add byte ptr [rcx], 0 -;; 1bb: aa stosb byte ptr [rdi], al -;; 1bc: 800100 add byte ptr [rcx], 0 -;; 1bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1c8: 800100 add byte ptr [rcx], 0 -;; 1cb: aa stosb byte ptr [rdi], al -;; 1cc: 800100 add byte ptr [rcx], 0 -;; 1cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1d8: 800100 add byte ptr [rcx], 0 -;; 1db: aa stosb byte ptr [rdi], al -;; 1dc: 800100 add byte ptr [rcx], 0 -;; 1df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1e8: 800100 add byte ptr [rcx], 0 -;; 1eb: aa stosb byte ptr [rdi], al -;; 1ec: 800100 add byte ptr [rcx], 0 -;; 1ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1f8: 800100 add byte ptr [rcx], 0 -;; 1fb: aa stosb byte ptr [rdi], al -;; 1fc: 800100 add byte ptr [rcx], 0 -;; 1ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 208: 800100 add byte ptr [rcx], 0 -;; 20b: aa stosb byte ptr [rdi], al -;; 20c: 800100 add byte ptr [rcx], 0 -;; 20f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 218: 800100 add byte ptr [rcx], 0 -;; 21b: aa stosb byte ptr [rdi], al -;; 21c: 800100 add byte ptr [rcx], 0 -;; 21f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 228: 800100 add byte ptr [rcx], 0 -;; 22b: aa stosb byte ptr [rdi], al -;; 22c: 800100 add byte ptr [rcx], 0 -;; 22f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 238: 800100 add byte ptr [rcx], 0 -;; 23b: aa stosb byte ptr [rdi], al -;; 23c: 800100 add byte ptr [rcx], 0 -;; 23f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 248: 800100 add byte ptr [rcx], 0 -;; 24b: aa stosb byte ptr [rdi], al -;; 24c: 800100 add byte ptr [rcx], 0 -;; 24f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 258: 800100 add byte ptr [rcx], 0 -;; 25b: aa stosb byte ptr [rdi], al -;; 25c: 800100 add byte ptr [rcx], 0 -;; 25f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 268: 800100 add byte ptr [rcx], 0 -;; 26b: aa stosb byte ptr [rdi], al -;; 26c: 800100 add byte ptr [rcx], 0 -;; 26f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 278: 800100 add byte ptr [rcx], 0 -;; 27b: aa stosb byte ptr [rdi], al -;; 27c: 800100 add byte ptr [rcx], 0 -;; 27f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 288: 800100 add byte ptr [rcx], 0 -;; 28b: aa stosb byte ptr [rdi], al -;; 28c: 800100 add byte ptr [rcx], 0 -;; 28f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 298: 800100 add byte ptr [rcx], 0 -;; 29b: aa stosb byte ptr [rdi], al -;; 29c: 800100 add byte ptr [rcx], 0 -;; 29f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2a8: 800100 add byte ptr [rcx], 0 -;; 2ab: aa stosb byte ptr [rdi], al -;; 2ac: 800100 add byte ptr [rcx], 0 -;; 2af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2b8: 800100 add byte ptr [rcx], 0 -;; 2bb: aa stosb byte ptr [rdi], al -;; 2bc: 800100 add byte ptr [rcx], 0 -;; 2bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2c8: 800100 add byte ptr [rcx], 0 -;; 2cb: aa stosb byte ptr [rdi], al -;; 2cc: 800100 add byte ptr [rcx], 0 -;; 2cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2d8: 800100 add byte ptr [rcx], 0 -;; 2db: aa stosb byte ptr [rdi], al -;; 2dc: 800100 add byte ptr [rcx], 0 -;; 2df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2e8: 800100 add byte ptr [rcx], 0 -;; 2eb: aa stosb byte ptr [rdi], al -;; 2ec: 800100 add byte ptr [rcx], 0 -;; 2ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2f8: 800100 add byte ptr [rcx], 0 -;; 2fb: aa stosb byte ptr [rdi], al -;; 2fc: 800100 add byte ptr [rcx], 0 -;; 2ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 308: 800100 add byte ptr [rcx], 0 -;; 30b: aa stosb byte ptr [rdi], al -;; 30c: 800100 add byte ptr [rcx], 0 -;; 30f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 318: 800100 add byte ptr [rcx], 0 -;; 31b: aa stosb byte ptr [rdi], al -;; 31c: 800100 add byte ptr [rcx], 0 -;; 31f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 328: 800100 add byte ptr [rcx], 0 -;; 32b: aa stosb byte ptr [rdi], al -;; 32c: 800100 add byte ptr [rcx], 0 -;; 32f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 338: 800100 add byte ptr [rcx], 0 -;; 33b: aa stosb byte ptr [rdi], al -;; 33c: 800100 add byte ptr [rcx], 0 -;; 33f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 348: 800100 add byte ptr [rcx], 0 -;; 34b: aa stosb byte ptr [rdi], al -;; 34c: 800100 add byte ptr [rcx], 0 -;; 34f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 358: 800100 add byte ptr [rcx], 0 -;; 35b: aa stosb byte ptr [rdi], al -;; 35c: 800100 add byte ptr [rcx], 0 -;; 35f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 368: 800100 add byte ptr [rcx], 0 -;; 36b: aa stosb byte ptr [rdi], al -;; 36c: 800100 add byte ptr [rcx], 0 -;; 36f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 378: 800100 add byte ptr [rcx], 0 -;; 37b: aa stosb byte ptr [rdi], al -;; 37c: 800100 add byte ptr [rcx], 0 -;; 37f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 388: 800100 add byte ptr [rcx], 0 -;; 38b: aa stosb byte ptr [rdi], al -;; 38c: 800100 add byte ptr [rcx], 0 -;; 38f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 398: 800100 add byte ptr [rcx], 0 -;; 39b: aa stosb byte ptr [rdi], al -;; 39c: 800100 add byte ptr [rcx], 0 -;; 39f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3a8: 800100 add byte ptr [rcx], 0 -;; 3ab: aa stosb byte ptr [rdi], al -;; 3ac: 800100 add byte ptr [rcx], 0 -;; 3af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3b8: 800100 add byte ptr [rcx], 0 -;; 3bb: aa stosb byte ptr [rdi], al -;; 3bc: 800100 add byte ptr [rcx], 0 -;; 3bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3c8: 800100 add byte ptr [rcx], 0 -;; 3cb: aa stosb byte ptr [rdi], al -;; 3cc: 800100 add byte ptr [rcx], 0 -;; 3cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3d8: 800100 add byte ptr [rcx], 0 -;; 3db: aa stosb byte ptr [rdi], al -;; 3dc: 800100 add byte ptr [rcx], 0 -;; 3df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3e8: 800100 add byte ptr [rcx], 0 -;; 3eb: aa stosb byte ptr [rdi], al -;; 3ec: 800100 add byte ptr [rcx], 0 -;; 3ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3f8: 800100 add byte ptr [rcx], 0 -;; 3fb: aa stosb byte ptr [rdi], al -;; 3fc: 800100 add byte ptr [rcx], 0 -;; 3ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 408: 800100 add byte ptr [rcx], 0 -;; 40b: aa stosb byte ptr [rdi], al -;; 40c: 800100 add byte ptr [rcx], 0 -;; 40f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 418: 800100 add byte ptr [rcx], 0 -;; 41b: aa stosb byte ptr [rdi], al -;; 41c: 800100 add byte ptr [rcx], 0 -;; 41f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 428: 800100 add byte ptr [rcx], 0 -;; 42b: aa stosb byte ptr [rdi], al -;; 42c: 800100 add byte ptr [rcx], 0 -;; 42f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 438: 800100 add byte ptr [rcx], 0 -;; 43b: aa stosb byte ptr [rdi], al -;; 43c: 800100 add byte ptr [rcx], 0 -;; 43f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 448: 800100 add byte ptr [rcx], 0 -;; 44b: aa stosb byte ptr [rdi], al -;; 44c: 800100 add byte ptr [rcx], 0 -;; 44f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 458: 800100 add byte ptr [rcx], 0 -;; 45b: aa stosb byte ptr [rdi], al -;; 45c: 800100 add byte ptr [rcx], 0 -;; 45f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 468: 800100 add byte ptr [rcx], 0 -;; 46b: aa stosb byte ptr [rdi], al -;; 46c: 800100 add byte ptr [rcx], 0 -;; 46f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 478: 800100 add byte ptr [rcx], 0 -;; 47b: aa stosb byte ptr [rdi], al -;; 47c: 800100 add byte ptr [rcx], 0 -;; 47f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 488: 800100 add byte ptr [rcx], 0 -;; 48b: aa stosb byte ptr [rdi], al -;; 48c: 800100 add byte ptr [rcx], 0 -;; 48f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 498: 800100 add byte ptr [rcx], 0 -;; 49b: aa stosb byte ptr [rdi], al -;; 49c: 800100 add byte ptr [rcx], 0 -;; 49f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4a8: 800100 add byte ptr [rcx], 0 -;; 4ab: aa stosb byte ptr [rdi], al -;; 4ac: 800100 add byte ptr [rcx], 0 -;; 4af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4b8: 800100 add byte ptr [rcx], 0 -;; 4bb: aa stosb byte ptr [rdi], al -;; 4bc: 800100 add byte ptr [rcx], 0 -;; 4bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4c8: 800100 add byte ptr [rcx], 0 -;; 4cb: aa stosb byte ptr [rdi], al -;; 4cc: 800100 add byte ptr [rcx], 0 -;; 4cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4d8: 800100 add byte ptr [rcx], 0 -;; 4db: aa stosb byte ptr [rdi], al -;; 4dc: 800100 add byte ptr [rcx], 0 -;; 4df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4e8: 800100 add byte ptr [rcx], 0 -;; 4eb: aa stosb byte ptr [rdi], al -;; 4ec: 800100 add byte ptr [rcx], 0 -;; 4ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4f8: 800100 add byte ptr [rcx], 0 -;; 4fb: aa stosb byte ptr [rdi], al -;; 4fc: 800100 add byte ptr [rcx], 0 -;; 4ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 508: 800100 add byte ptr [rcx], 0 -;; 50b: aa stosb byte ptr [rdi], al -;; 50c: 800100 add byte ptr [rcx], 0 -;; 50f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 518: 800100 add byte ptr [rcx], 0 -;; 51b: aa stosb byte ptr [rdi], al -;; 51c: 800100 add byte ptr [rcx], 0 -;; 51f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 528: 800100 add byte ptr [rcx], 0 -;; 52b: aa stosb byte ptr [rdi], al -;; 52c: 800100 add byte ptr [rcx], 0 -;; 52f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 538: 800100 add byte ptr [rcx], 0 -;; 53b: aa stosb byte ptr [rdi], al -;; 53c: 800100 add byte ptr [rcx], 0 -;; 53f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 548: 800100 add byte ptr [rcx], 0 -;; 54b: aa stosb byte ptr [rdi], al -;; 54c: 800100 add byte ptr [rcx], 0 -;; 54f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 558: 800100 add byte ptr [rcx], 0 -;; 55b: aa stosb byte ptr [rdi], al -;; 55c: 800100 add byte ptr [rcx], 0 -;; 55f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 568: 800100 add byte ptr [rcx], 0 -;; 56b: aa stosb byte ptr [rdi], al -;; 56c: 800100 add byte ptr [rcx], 0 -;; 56f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 578: 800100 add byte ptr [rcx], 0 -;; 57b: aa stosb byte ptr [rdi], al -;; 57c: 800100 add byte ptr [rcx], 0 -;; 57f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 588: 800100 add byte ptr [rcx], 0 -;; 58b: aa stosb byte ptr [rdi], al -;; 58c: 800100 add byte ptr [rcx], 0 -;; 58f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 598: 800100 add byte ptr [rcx], 0 -;; 59b: aa stosb byte ptr [rdi], al -;; 59c: 800100 add byte ptr [rcx], 0 -;; 59f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5a8: 800100 add byte ptr [rcx], 0 -;; 5ab: aa stosb byte ptr [rdi], al -;; 5ac: 800100 add byte ptr [rcx], 0 -;; 5af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5b8: 800100 add byte ptr [rcx], 0 -;; 5bb: aa stosb byte ptr [rdi], al -;; 5bc: 800100 add byte ptr [rcx], 0 -;; 5bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5c8: 800100 add byte ptr [rcx], 0 -;; 5cb: aa stosb byte ptr [rdi], al -;; 5cc: 800100 add byte ptr [rcx], 0 -;; 5cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5d8: 800100 add byte ptr [rcx], 0 -;; 5db: aa stosb byte ptr [rdi], al -;; 5dc: 800100 add byte ptr [rcx], 0 -;; 5df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5e8: 800100 add byte ptr [rcx], 0 -;; 5eb: aa stosb byte ptr [rdi], al -;; 5ec: 800100 add byte ptr [rcx], 0 -;; 5ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5f8: 800100 add byte ptr [rcx], 0 -;; 5fb: aa stosb byte ptr [rdi], al -;; 5fc: 800100 add byte ptr [rcx], 0 -;; 5ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 608: 800100 add byte ptr [rcx], 0 -;; 60b: aa stosb byte ptr [rdi], al -;; 60c: 800100 add byte ptr [rcx], 0 -;; 60f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 618: 800100 add byte ptr [rcx], 0 -;; 61b: aa stosb byte ptr [rdi], al -;; 61c: 800100 add byte ptr [rcx], 0 -;; 61f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 628: 800100 add byte ptr [rcx], 0 -;; 62b: aa stosb byte ptr [rdi], al -;; 62c: 800100 add byte ptr [rcx], 0 -;; 62f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 638: 800100 add byte ptr [rcx], 0 -;; 63b: aa stosb byte ptr [rdi], al -;; 63c: 800100 add byte ptr [rcx], 0 -;; 63f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 648: 800100 add byte ptr [rcx], 0 -;; 64b: aa stosb byte ptr [rdi], al -;; 64c: 800100 add byte ptr [rcx], 0 -;; 64f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 658: 800100 add byte ptr [rcx], 0 -;; 65b: aa stosb byte ptr [rdi], al -;; 65c: 800100 add byte ptr [rcx], 0 -;; 65f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 668: 800100 add byte ptr [rcx], 0 -;; 66b: aa stosb byte ptr [rdi], al -;; 66c: 800100 add byte ptr [rcx], 0 -;; 66f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 678: 800100 add byte ptr [rcx], 0 -;; 67b: aa stosb byte ptr [rdi], al -;; 67c: 800100 add byte ptr [rcx], 0 -;; 67f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 688: 800100 add byte ptr [rcx], 0 -;; 68b: aa stosb byte ptr [rdi], al -;; 68c: 800100 add byte ptr [rcx], 0 -;; 68f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 698: 800100 add byte ptr [rcx], 0 -;; 69b: aa stosb byte ptr [rdi], al -;; 69c: 800100 add byte ptr [rcx], 0 -;; 69f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6a8: 800100 add byte ptr [rcx], 0 -;; 6ab: aa stosb byte ptr [rdi], al -;; 6ac: 800100 add byte ptr [rcx], 0 -;; 6af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6b8: 800100 add byte ptr [rcx], 0 -;; 6bb: aa stosb byte ptr [rdi], al -;; 6bc: 800100 add byte ptr [rcx], 0 -;; 6bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6c8: 800100 add byte ptr [rcx], 0 -;; 6cb: aa stosb byte ptr [rdi], al -;; 6cc: 800100 add byte ptr [rcx], 0 -;; 6cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6d8: 800100 add byte ptr [rcx], 0 -;; 6db: aa stosb byte ptr [rdi], al -;; 6dc: 800100 add byte ptr [rcx], 0 -;; 6df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6e8: 800100 add byte ptr [rcx], 0 -;; 6eb: aa stosb byte ptr [rdi], al -;; 6ec: 800100 add byte ptr [rcx], 0 -;; 6ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6f8: 800100 add byte ptr [rcx], 0 -;; 6fb: aa stosb byte ptr [rdi], al -;; 6fc: 800100 add byte ptr [rcx], 0 -;; 6ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 708: 800100 add byte ptr [rcx], 0 -;; 70b: aa stosb byte ptr [rdi], al -;; 70c: 800100 add byte ptr [rcx], 0 -;; 70f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 718: 800100 add byte ptr [rcx], 0 -;; 71b: aa stosb byte ptr [rdi], al -;; 71c: 800100 add byte ptr [rcx], 0 -;; 71f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 728: 800100 add byte ptr [rcx], 0 -;; 72b: aa stosb byte ptr [rdi], al -;; 72c: 800100 add byte ptr [rcx], 0 -;; 72f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 738: 800100 add byte ptr [rcx], 0 -;; 73b: aa stosb byte ptr [rdi], al -;; 73c: 800100 add byte ptr [rcx], 0 -;; 73f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 748: 800100 add byte ptr [rcx], 0 -;; 74b: aa stosb byte ptr [rdi], al -;; 74c: 800100 add byte ptr [rcx], 0 -;; 74f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 758: 800100 add byte ptr [rcx], 0 -;; 75b: aa stosb byte ptr [rdi], al -;; 75c: 800100 add byte ptr [rcx], 0 -;; 75f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 768: 800100 add byte ptr [rcx], 0 -;; 76b: aa stosb byte ptr [rdi], al -;; 76c: 800100 add byte ptr [rcx], 0 -;; 76f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 778: 800100 add byte ptr [rcx], 0 -;; 77b: aa stosb byte ptr [rdi], al -;; 77c: 800100 add byte ptr [rcx], 0 -;; 77f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 788: 800100 add byte ptr [rcx], 0 -;; 78b: aa stosb byte ptr [rdi], al -;; 78c: 800100 add byte ptr [rcx], 0 -;; 78f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 798: 800100 add byte ptr [rcx], 0 -;; 79b: aa stosb byte ptr [rdi], al -;; 79c: 800100 add byte ptr [rcx], 0 -;; 79f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7a8: 800100 add byte ptr [rcx], 0 -;; 7ab: aa stosb byte ptr [rdi], al -;; 7ac: 800100 add byte ptr [rcx], 0 -;; 7af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7b8: 800100 add byte ptr [rcx], 0 -;; 7bb: aa stosb byte ptr [rdi], al -;; 7bc: 800100 add byte ptr [rcx], 0 -;; 7bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7c8: 800100 add byte ptr [rcx], 0 -;; 7cb: aa stosb byte ptr [rdi], al -;; 7cc: 800100 add byte ptr [rcx], 0 -;; 7cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7d8: 800100 add byte ptr [rcx], 0 -;; 7db: aa stosb byte ptr [rdi], al -;; 7dc: 800100 add byte ptr [rcx], 0 -;; 7df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7e8: 800100 add byte ptr [rcx], 0 -;; 7eb: aa stosb byte ptr [rdi], al -;; 7ec: 800100 add byte ptr [rcx], 0 -;; 7ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7f8: 800100 add byte ptr [rcx], 0 -;; 7fb: aa stosb byte ptr [rdi], al -;; 7fc: 800100 add byte ptr [rcx], 0 -;; 7ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 808: 800100 add byte ptr [rcx], 0 -;; 80b: aa stosb byte ptr [rdi], al -;; 80c: 800100 add byte ptr [rcx], 0 -;; 80f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 818: 800100 add byte ptr [rcx], 0 -;; 81b: aa stosb byte ptr [rdi], al -;; 81c: 800100 add byte ptr [rcx], 0 -;; 81f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 828: 800100 add byte ptr [rcx], 0 -;; 82b: aa stosb byte ptr [rdi], al -;; 82c: 800100 add byte ptr [rcx], 0 -;; 82f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 838: 800100 add byte ptr [rcx], 0 -;; 83b: aa stosb byte ptr [rdi], al -;; 83c: 800100 add byte ptr [rcx], 0 -;; 83f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 848: 800100 add byte ptr [rcx], 0 -;; 84b: aa stosb byte ptr [rdi], al -;; 84c: 800100 add byte ptr [rcx], 0 -;; 84f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 858: 800100 add byte ptr [rcx], 0 -;; 85b: aa stosb byte ptr [rdi], al -;; 85c: 800100 add byte ptr [rcx], 0 -;; 85f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 868: 800100 add byte ptr [rcx], 0 -;; 86b: aa stosb byte ptr [rdi], al -;; 86c: 800100 add byte ptr [rcx], 0 -;; 86f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 878: 800100 add byte ptr [rcx], 0 -;; 87b: aa stosb byte ptr [rdi], al -;; 87c: 800100 add byte ptr [rcx], 0 -;; 87f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 888: 800100 add byte ptr [rcx], 0 -;; 88b: aa stosb byte ptr [rdi], al -;; 88c: 800100 add byte ptr [rcx], 0 -;; 88f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 898: 800100 add byte ptr [rcx], 0 -;; 89b: aa stosb byte ptr [rdi], al -;; 89c: 800100 add byte ptr [rcx], 0 -;; 89f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8a8: 800100 add byte ptr [rcx], 0 -;; 8ab: aa stosb byte ptr [rdi], al -;; 8ac: 800100 add byte ptr [rcx], 0 -;; 8af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8b8: 800100 add byte ptr [rcx], 0 -;; 8bb: aa stosb byte ptr [rdi], al -;; 8bc: 800100 add byte ptr [rcx], 0 -;; 8bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8c8: 800100 add byte ptr [rcx], 0 -;; 8cb: aa stosb byte ptr [rdi], al -;; 8cc: 800100 add byte ptr [rcx], 0 -;; 8cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8d8: 800100 add byte ptr [rcx], 0 -;; 8db: aa stosb byte ptr [rdi], al -;; 8dc: 800100 add byte ptr [rcx], 0 -;; 8df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8e8: 800100 add byte ptr [rcx], 0 -;; 8eb: aa stosb byte ptr [rdi], al -;; 8ec: 800100 add byte ptr [rcx], 0 -;; 8ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8f8: 800100 add byte ptr [rcx], 0 -;; 8fb: aa stosb byte ptr [rdi], al -;; 8fc: 800100 add byte ptr [rcx], 0 -;; 8ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 908: 800100 add byte ptr [rcx], 0 -;; 90b: aa stosb byte ptr [rdi], al -;; 90c: 800100 add byte ptr [rcx], 0 -;; 90f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 918: 800100 add byte ptr [rcx], 0 -;; 91b: aa stosb byte ptr [rdi], al -;; 91c: 800100 add byte ptr [rcx], 0 -;; 91f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 928: 800100 add byte ptr [rcx], 0 -;; 92b: aa stosb byte ptr [rdi], al -;; 92c: 800100 add byte ptr [rcx], 0 -;; 92f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 938: 800100 add byte ptr [rcx], 0 -;; 93b: aa stosb byte ptr [rdi], al -;; 93c: 800100 add byte ptr [rcx], 0 -;; 93f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 948: 800100 add byte ptr [rcx], 0 -;; 94b: aa stosb byte ptr [rdi], al -;; 94c: 800100 add byte ptr [rcx], 0 -;; 94f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 958: 800100 add byte ptr [rcx], 0 -;; 95b: aa stosb byte ptr [rdi], al -;; 95c: 800100 add byte ptr [rcx], 0 -;; 95f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 968: 800100 add byte ptr [rcx], 0 -;; 96b: aa stosb byte ptr [rdi], al -;; 96c: 800100 add byte ptr [rcx], 0 -;; 96f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 978: 800100 add byte ptr [rcx], 0 -;; 97b: aa stosb byte ptr [rdi], al -;; 97c: 800100 add byte ptr [rcx], 0 -;; 97f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 988: 800100 add byte ptr [rcx], 0 -;; 98b: aa stosb byte ptr [rdi], al -;; 98c: 800100 add byte ptr [rcx], 0 -;; 98f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 998: 800100 add byte ptr [rcx], 0 -;; 99b: aa stosb byte ptr [rdi], al -;; 99c: 800100 add byte ptr [rcx], 0 -;; 99f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9a8: 800100 add byte ptr [rcx], 0 -;; 9ab: aa stosb byte ptr [rdi], al -;; 9ac: 800100 add byte ptr [rcx], 0 -;; 9af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9b8: 800100 add byte ptr [rcx], 0 -;; 9bb: aa stosb byte ptr [rdi], al -;; 9bc: 800100 add byte ptr [rcx], 0 -;; 9bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9c8: 800100 add byte ptr [rcx], 0 -;; 9cb: aa stosb byte ptr [rdi], al -;; 9cc: 800100 add byte ptr [rcx], 0 -;; 9cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9d8: 800100 add byte ptr [rcx], 0 -;; 9db: aa stosb byte ptr [rdi], al -;; 9dc: 800100 add byte ptr [rcx], 0 -;; 9df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9e8: 800100 add byte ptr [rcx], 0 -;; 9eb: aa stosb byte ptr [rdi], al -;; 9ec: 800100 add byte ptr [rcx], 0 -;; 9ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9f8: 800100 add byte ptr [rcx], 0 -;; 9fb: aa stosb byte ptr [rdi], al -;; 9fc: 800100 add byte ptr [rcx], 0 -;; 9ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a08: 800100 add byte ptr [rcx], 0 -;; a0b: aa stosb byte ptr [rdi], al -;; a0c: 800100 add byte ptr [rcx], 0 -;; a0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a18: 800100 add byte ptr [rcx], 0 -;; a1b: aa stosb byte ptr [rdi], al -;; a1c: 800100 add byte ptr [rcx], 0 -;; a1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a28: 800100 add byte ptr [rcx], 0 -;; a2b: aa stosb byte ptr [rdi], al -;; a2c: 800100 add byte ptr [rcx], 0 -;; a2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a38: 800100 add byte ptr [rcx], 0 -;; a3b: aa stosb byte ptr [rdi], al -;; a3c: 800100 add byte ptr [rcx], 0 -;; a3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a48: 800100 add byte ptr [rcx], 0 -;; a4b: aa stosb byte ptr [rdi], al -;; a4c: 800100 add byte ptr [rcx], 0 -;; a4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a58: 800100 add byte ptr [rcx], 0 -;; a5b: aa stosb byte ptr [rdi], al -;; a5c: 800100 add byte ptr [rcx], 0 -;; a5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a68: 800100 add byte ptr [rcx], 0 -;; a6b: aa stosb byte ptr [rdi], al -;; a6c: 800100 add byte ptr [rcx], 0 -;; a6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a78: 800100 add byte ptr [rcx], 0 -;; a7b: aa stosb byte ptr [rdi], al -;; a7c: 800100 add byte ptr [rcx], 0 -;; a7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a88: 800100 add byte ptr [rcx], 0 -;; a8b: aa stosb byte ptr [rdi], al -;; a8c: 800100 add byte ptr [rcx], 0 -;; a8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a98: 800100 add byte ptr [rcx], 0 -;; a9b: aa stosb byte ptr [rdi], al -;; a9c: 800100 add byte ptr [rcx], 0 -;; a9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; aa8: 800100 add byte ptr [rcx], 0 -;; aab: aa stosb byte ptr [rdi], al -;; aac: 800100 add byte ptr [rcx], 0 -;; aaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ab8: 800100 add byte ptr [rcx], 0 -;; abb: aa stosb byte ptr [rdi], al -;; abc: 800100 add byte ptr [rcx], 0 -;; abf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ac8: 800100 add byte ptr [rcx], 0 -;; acb: aa stosb byte ptr [rdi], al -;; acc: 800100 add byte ptr [rcx], 0 -;; acf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ad8: 800100 add byte ptr [rcx], 0 -;; adb: aa stosb byte ptr [rdi], al -;; adc: 800100 add byte ptr [rcx], 0 -;; adf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ae8: 800100 add byte ptr [rcx], 0 -;; aeb: aa stosb byte ptr [rdi], al -;; aec: 800100 add byte ptr [rcx], 0 -;; aef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; af8: 800100 add byte ptr [rcx], 0 -;; afb: aa stosb byte ptr [rdi], al -;; afc: 800100 add byte ptr [rcx], 0 -;; aff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b08: 800100 add byte ptr [rcx], 0 -;; b0b: aa stosb byte ptr [rdi], al -;; b0c: 800100 add byte ptr [rcx], 0 -;; b0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b18: 800100 add byte ptr [rcx], 0 -;; b1b: aa stosb byte ptr [rdi], al -;; b1c: 800100 add byte ptr [rcx], 0 -;; b1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b28: 800100 add byte ptr [rcx], 0 -;; b2b: aa stosb byte ptr [rdi], al -;; b2c: 800100 add byte ptr [rcx], 0 -;; b2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b38: 800100 add byte ptr [rcx], 0 -;; b3b: aa stosb byte ptr [rdi], al -;; b3c: 800100 add byte ptr [rcx], 0 -;; b3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b48: 800100 add byte ptr [rcx], 0 -;; b4b: aa stosb byte ptr [rdi], al -;; b4c: 800100 add byte ptr [rcx], 0 -;; b4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b58: 800100 add byte ptr [rcx], 0 -;; b5b: aa stosb byte ptr [rdi], al -;; b5c: 800100 add byte ptr [rcx], 0 -;; b5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b68: 800100 add byte ptr [rcx], 0 -;; b6b: aa stosb byte ptr [rdi], al -;; b6c: 800100 add byte ptr [rcx], 0 -;; b6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b78: 800100 add byte ptr [rcx], 0 -;; b7b: aa stosb byte ptr [rdi], al -;; b7c: 800100 add byte ptr [rcx], 0 -;; b7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b88: 800100 add byte ptr [rcx], 0 -;; b8b: aa stosb byte ptr [rdi], al -;; b8c: 800100 add byte ptr [rcx], 0 -;; b8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b98: 800100 add byte ptr [rcx], 0 -;; b9b: aa stosb byte ptr [rdi], al -;; b9c: 800100 add byte ptr [rcx], 0 -;; b9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ba8: 800100 add byte ptr [rcx], 0 -;; bab: aa stosb byte ptr [rdi], al -;; bac: 800100 add byte ptr [rcx], 0 -;; baf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bb8: 800100 add byte ptr [rcx], 0 -;; bbb: aa stosb byte ptr [rdi], al -;; bbc: 800100 add byte ptr [rcx], 0 -;; bbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bc8: 800100 add byte ptr [rcx], 0 -;; bcb: aa stosb byte ptr [rdi], al -;; bcc: 800100 add byte ptr [rcx], 0 -;; bcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bd8: 800100 add byte ptr [rcx], 0 -;; bdb: aa stosb byte ptr [rdi], al -;; bdc: 800100 add byte ptr [rcx], 0 -;; bdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; be8: 800100 add byte ptr [rcx], 0 -;; beb: aa stosb byte ptr [rdi], al -;; bec: 800100 add byte ptr [rcx], 0 -;; bef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bf8: 800100 add byte ptr [rcx], 0 -;; bfb: aa stosb byte ptr [rdi], al -;; bfc: 800100 add byte ptr [rcx], 0 -;; bff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c08: 800100 add byte ptr [rcx], 0 -;; c0b: aa stosb byte ptr [rdi], al -;; c0c: 800100 add byte ptr [rcx], 0 -;; c0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c18: 800100 add byte ptr [rcx], 0 -;; c1b: aa stosb byte ptr [rdi], al -;; c1c: 800100 add byte ptr [rcx], 0 -;; c1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c28: 800100 add byte ptr [rcx], 0 -;; c2b: aa stosb byte ptr [rdi], al -;; c2c: 800100 add byte ptr [rcx], 0 -;; c2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c38: 800100 add byte ptr [rcx], 0 -;; c3b: aa stosb byte ptr [rdi], al -;; c3c: 800100 add byte ptr [rcx], 0 -;; c3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c48: 800100 add byte ptr [rcx], 0 -;; c4b: aa stosb byte ptr [rdi], al -;; c4c: 800100 add byte ptr [rcx], 0 -;; c4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c58: 800100 add byte ptr [rcx], 0 -;; c5b: aa stosb byte ptr [rdi], al -;; c5c: 800100 add byte ptr [rcx], 0 -;; c5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c68: 800100 add byte ptr [rcx], 0 -;; c6b: aa stosb byte ptr [rdi], al -;; c6c: 800100 add byte ptr [rcx], 0 -;; c6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c78: 800100 add byte ptr [rcx], 0 -;; c7b: aa stosb byte ptr [rdi], al -;; c7c: 800100 add byte ptr [rcx], 0 -;; c7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c88: 800100 add byte ptr [rcx], 0 -;; c8b: aa stosb byte ptr [rdi], al -;; c8c: 800100 add byte ptr [rcx], 0 -;; c8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c98: 800100 add byte ptr [rcx], 0 -;; c9b: aa stosb byte ptr [rdi], al -;; c9c: 800100 add byte ptr [rcx], 0 -;; c9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ca8: 800100 add byte ptr [rcx], 0 -;; cab: aa stosb byte ptr [rdi], al -;; cac: 800100 add byte ptr [rcx], 0 -;; caf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cb8: 800100 add byte ptr [rcx], 0 -;; cbb: aa stosb byte ptr [rdi], al -;; cbc: 800100 add byte ptr [rcx], 0 -;; cbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cc8: 800100 add byte ptr [rcx], 0 -;; ccb: aa stosb byte ptr [rdi], al -;; ccc: 800100 add byte ptr [rcx], 0 -;; ccf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cd8: 800100 add byte ptr [rcx], 0 -;; cdb: aa stosb byte ptr [rdi], al -;; cdc: 800100 add byte ptr [rcx], 0 -;; cdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ce8: 800100 add byte ptr [rcx], 0 -;; ceb: aa stosb byte ptr [rdi], al -;; cec: 800100 add byte ptr [rcx], 0 -;; cef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cf8: 800100 add byte ptr [rcx], 0 -;; cfb: aa stosb byte ptr [rdi], al -;; cfc: 800100 add byte ptr [rcx], 0 -;; cff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d08: 800100 add byte ptr [rcx], 0 -;; d0b: aa stosb byte ptr [rdi], al -;; d0c: 800100 add byte ptr [rcx], 0 -;; d0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d18: 800100 add byte ptr [rcx], 0 -;; d1b: aa stosb byte ptr [rdi], al -;; d1c: 800100 add byte ptr [rcx], 0 -;; d1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d28: 800100 add byte ptr [rcx], 0 -;; d2b: aa stosb byte ptr [rdi], al -;; d2c: 800100 add byte ptr [rcx], 0 -;; d2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d38: 800100 add byte ptr [rcx], 0 -;; d3b: aa stosb byte ptr [rdi], al -;; d3c: 800100 add byte ptr [rcx], 0 -;; d3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d48: 800100 add byte ptr [rcx], 0 -;; d4b: aa stosb byte ptr [rdi], al -;; d4c: 800100 add byte ptr [rcx], 0 -;; d4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d58: 800100 add byte ptr [rcx], 0 -;; d5b: aa stosb byte ptr [rdi], al -;; d5c: 800100 add byte ptr [rcx], 0 -;; d5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d68: 800100 add byte ptr [rcx], 0 -;; d6b: aa stosb byte ptr [rdi], al -;; d6c: 800100 add byte ptr [rcx], 0 -;; d6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d78: 800100 add byte ptr [rcx], 0 -;; d7b: aa stosb byte ptr [rdi], al -;; d7c: 800100 add byte ptr [rcx], 0 -;; d7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d88: 800100 add byte ptr [rcx], 0 -;; d8b: aa stosb byte ptr [rdi], al -;; d8c: 800100 add byte ptr [rcx], 0 -;; d8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d98: 800100 add byte ptr [rcx], 0 -;; d9b: aa stosb byte ptr [rdi], al -;; d9c: 800100 add byte ptr [rcx], 0 -;; d9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; da8: 800100 add byte ptr [rcx], 0 -;; dab: aa stosb byte ptr [rdi], al -;; dac: 800100 add byte ptr [rcx], 0 -;; daf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; db8: 800100 add byte ptr [rcx], 0 -;; dbb: aa stosb byte ptr [rdi], al -;; dbc: 800100 add byte ptr [rcx], 0 -;; dbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dc8: 800100 add byte ptr [rcx], 0 -;; dcb: aa stosb byte ptr [rdi], al -;; dcc: 800100 add byte ptr [rcx], 0 -;; dcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dd8: 800100 add byte ptr [rcx], 0 -;; ddb: aa stosb byte ptr [rdi], al -;; ddc: 800100 add byte ptr [rcx], 0 -;; ddf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; de8: 800100 add byte ptr [rcx], 0 -;; deb: aa stosb byte ptr [rdi], al -;; dec: 800100 add byte ptr [rcx], 0 -;; def: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; df8: 800100 add byte ptr [rcx], 0 -;; dfb: aa stosb byte ptr [rdi], al -;; dfc: 800100 add byte ptr [rcx], 0 -;; dff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e08: 800100 add byte ptr [rcx], 0 -;; e0b: aa stosb byte ptr [rdi], al -;; e0c: 800100 add byte ptr [rcx], 0 -;; e0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e18: 800100 add byte ptr [rcx], 0 -;; e1b: aa stosb byte ptr [rdi], al -;; e1c: 800100 add byte ptr [rcx], 0 -;; e1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e28: 800100 add byte ptr [rcx], 0 -;; e2b: aa stosb byte ptr [rdi], al -;; e2c: 800100 add byte ptr [rcx], 0 -;; e2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e38: 800100 add byte ptr [rcx], 0 -;; e3b: aa stosb byte ptr [rdi], al -;; e3c: 800100 add byte ptr [rcx], 0 -;; e3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e48: 800100 add byte ptr [rcx], 0 -;; e4b: aa stosb byte ptr [rdi], al -;; e4c: 800100 add byte ptr [rcx], 0 -;; e4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e58: 800100 add byte ptr [rcx], 0 -;; e5b: aa stosb byte ptr [rdi], al -;; e5c: 800100 add byte ptr [rcx], 0 -;; e5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e68: 800100 add byte ptr [rcx], 0 -;; e6b: aa stosb byte ptr [rdi], al -;; e6c: 800100 add byte ptr [rcx], 0 -;; e6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e78: 800100 add byte ptr [rcx], 0 -;; e7b: aa stosb byte ptr [rdi], al -;; e7c: 800100 add byte ptr [rcx], 0 -;; e7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e88: 800100 add byte ptr [rcx], 0 -;; e8b: aa stosb byte ptr [rdi], al -;; e8c: 800100 add byte ptr [rcx], 0 -;; e8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e98: 800100 add byte ptr [rcx], 0 -;; e9b: aa stosb byte ptr [rdi], al -;; e9c: 800100 add byte ptr [rcx], 0 -;; e9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ea8: 800100 add byte ptr [rcx], 0 -;; eab: aa stosb byte ptr [rdi], al -;; eac: 800100 add byte ptr [rcx], 0 -;; eaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; eb8: 800100 add byte ptr [rcx], 0 -;; ebb: aa stosb byte ptr [rdi], al -;; ebc: 800100 add byte ptr [rcx], 0 -;; ebf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ec8: 800100 add byte ptr [rcx], 0 -;; ecb: aa stosb byte ptr [rdi], al -;; ecc: 800100 add byte ptr [rcx], 0 -;; ecf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ed8: 800100 add byte ptr [rcx], 0 -;; edb: aa stosb byte ptr [rdi], al -;; edc: 800100 add byte ptr [rcx], 0 -;; edf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ee8: 800100 add byte ptr [rcx], 0 -;; eeb: aa stosb byte ptr [rdi], al -;; eec: 800100 add byte ptr [rcx], 0 -;; eef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ef8: 800100 add byte ptr [rcx], 0 -;; efb: aa stosb byte ptr [rdi], al -;; efc: 800100 add byte ptr [rcx], 0 -;; eff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f08: 800100 add byte ptr [rcx], 0 -;; f0b: aa stosb byte ptr [rdi], al -;; f0c: 800100 add byte ptr [rcx], 0 -;; f0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f18: 800100 add byte ptr [rcx], 0 -;; f1b: aa stosb byte ptr [rdi], al -;; f1c: 800100 add byte ptr [rcx], 0 -;; f1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f28: 800100 add byte ptr [rcx], 0 -;; f2b: aa stosb byte ptr [rdi], al -;; f2c: 800100 add byte ptr [rcx], 0 -;; f2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f38: 800100 add byte ptr [rcx], 0 -;; f3b: aa stosb byte ptr [rdi], al -;; f3c: 800100 add byte ptr [rcx], 0 -;; f3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f48: 800100 add byte ptr [rcx], 0 -;; f4b: aa stosb byte ptr [rdi], al -;; f4c: 800100 add byte ptr [rcx], 0 -;; f4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f58: 800100 add byte ptr [rcx], 0 -;; f5b: aa stosb byte ptr [rdi], al -;; f5c: 800100 add byte ptr [rcx], 0 -;; f5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f68: 800100 add byte ptr [rcx], 0 -;; f6b: aa stosb byte ptr [rdi], al -;; f6c: 800100 add byte ptr [rcx], 0 -;; f6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f78: 800100 add byte ptr [rcx], 0 -;; f7b: aa stosb byte ptr [rdi], al -;; f7c: 800100 add byte ptr [rcx], 0 -;; f7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f88: 800100 add byte ptr [rcx], 0 -;; f8b: aa stosb byte ptr [rdi], al -;; f8c: 800100 add byte ptr [rcx], 0 -;; f8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f98: 800100 add byte ptr [rcx], 0 -;; f9b: aa stosb byte ptr [rdi], al -;; f9c: 800100 add byte ptr [rcx], 0 -;; f9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fa8: 800100 add byte ptr [rcx], 0 -;; fab: aa stosb byte ptr [rdi], al -;; fac: 800100 add byte ptr [rcx], 0 -;; faf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fb8: 800100 add byte ptr [rcx], 0 -;; fbb: aa stosb byte ptr [rdi], al -;; fbc: 800100 add byte ptr [rcx], 0 -;; fbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fc8: 800100 add byte ptr [rcx], 0 -;; fcb: aa stosb byte ptr [rdi], al -;; fcc: 800100 add byte ptr [rcx], 0 -;; fcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fd8: 800100 add byte ptr [rcx], 0 -;; fdb: aa stosb byte ptr [rdi], al -;; fdc: 800100 add byte ptr [rcx], 0 -;; fdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fe8: 800100 add byte ptr [rcx], 0 -;; feb: aa stosb byte ptr [rdi], al -;; fec: 800100 add byte ptr [rcx], 0 -;; fef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ff8: 800100 add byte ptr [rcx], 0 -;; ffb: aa stosb byte ptr [rdi], al -;; ffc: 800100 add byte ptr [rcx], 0 -;; fff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1008: 800100 add byte ptr [rcx], 0 -;; 100b: aa stosb byte ptr [rdi], al -;; 100c: 800100 add byte ptr [rcx], 0 -;; 100f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1018: 800100 add byte ptr [rcx], 0 -;; 101b: aa stosb byte ptr [rdi], al -;; 101c: 800100 add byte ptr [rcx], 0 -;; 101f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1028: 800100 add byte ptr [rcx], 0 -;; 102b: aa stosb byte ptr [rdi], al -;; 102c: 800100 add byte ptr [rcx], 0 -;; 102f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1038: 800100 add byte ptr [rcx], 0 -;; 103b: aa stosb byte ptr [rdi], al -;; 103c: 800100 add byte ptr [rcx], 0 -;; 103f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1048: 800100 add byte ptr [rcx], 0 -;; 104b: aa stosb byte ptr [rdi], al -;; 104c: 800100 add byte ptr [rcx], 0 -;; 104f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1058: 800100 add byte ptr [rcx], 0 -;; 105b: aa stosb byte ptr [rdi], al -;; 105c: 800100 add byte ptr [rcx], 0 -;; 105f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1068: 800100 add byte ptr [rcx], 0 -;; 106b: aa stosb byte ptr [rdi], al -;; 106c: 800100 add byte ptr [rcx], 0 -;; 106f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1078: 800100 add byte ptr [rcx], 0 -;; 107b: aa stosb byte ptr [rdi], al -;; 107c: 800100 add byte ptr [rcx], 0 -;; 107f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1088: 800100 add byte ptr [rcx], 0 -;; 108b: aa stosb byte ptr [rdi], al -;; 108c: 800100 add byte ptr [rcx], 0 -;; 108f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1098: 800100 add byte ptr [rcx], 0 -;; 109b: aa stosb byte ptr [rdi], al -;; 109c: 800100 add byte ptr [rcx], 0 -;; 109f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10a8: 800100 add byte ptr [rcx], 0 -;; 10ab: aa stosb byte ptr [rdi], al -;; 10ac: 800100 add byte ptr [rcx], 0 -;; 10af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10b8: 800100 add byte ptr [rcx], 0 -;; 10bb: aa stosb byte ptr [rdi], al -;; 10bc: 800100 add byte ptr [rcx], 0 -;; 10bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10c8: 800100 add byte ptr [rcx], 0 -;; 10cb: aa stosb byte ptr [rdi], al -;; 10cc: 800100 add byte ptr [rcx], 0 -;; 10cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10d8: 800100 add byte ptr [rcx], 0 -;; 10db: aa stosb byte ptr [rdi], al -;; 10dc: 800100 add byte ptr [rcx], 0 -;; 10df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10e8: 800100 add byte ptr [rcx], 0 -;; 10eb: aa stosb byte ptr [rdi], al -;; 10ec: 800100 add byte ptr [rcx], 0 -;; 10ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10f8: 800100 add byte ptr [rcx], 0 -;; 10fb: aa stosb byte ptr [rdi], al -;; 10fc: 800100 add byte ptr [rcx], 0 -;; 10ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1108: 800100 add byte ptr [rcx], 0 -;; 110b: aa stosb byte ptr [rdi], al -;; 110c: 800100 add byte ptr [rcx], 0 -;; 110f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1118: 800100 add byte ptr [rcx], 0 -;; 111b: aa stosb byte ptr [rdi], al -;; 111c: 800100 add byte ptr [rcx], 0 -;; 111f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1128: 800100 add byte ptr [rcx], 0 -;; 112b: aa stosb byte ptr [rdi], al -;; 112c: 800100 add byte ptr [rcx], 0 -;; 112f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1138: 800100 add byte ptr [rcx], 0 -;; 113b: aa stosb byte ptr [rdi], al -;; 113c: 800100 add byte ptr [rcx], 0 -;; 113f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1148: 800100 add byte ptr [rcx], 0 -;; 114b: aa stosb byte ptr [rdi], al -;; 114c: 800100 add byte ptr [rcx], 0 -;; 114f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1158: 800100 add byte ptr [rcx], 0 -;; 115b: aa stosb byte ptr [rdi], al -;; 115c: 800100 add byte ptr [rcx], 0 -;; 115f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1168: 800100 add byte ptr [rcx], 0 -;; 116b: aa stosb byte ptr [rdi], al -;; 116c: 800100 add byte ptr [rcx], 0 -;; 116f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1178: 800100 add byte ptr [rcx], 0 -;; 117b: aa stosb byte ptr [rdi], al -;; 117c: 800100 add byte ptr [rcx], 0 -;; 117f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1188: 800100 add byte ptr [rcx], 0 -;; 118b: aa stosb byte ptr [rdi], al -;; 118c: 800100 add byte ptr [rcx], 0 -;; 118f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1198: 800100 add byte ptr [rcx], 0 -;; 119b: aa stosb byte ptr [rdi], al -;; 119c: 800100 add byte ptr [rcx], 0 -;; 119f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11a8: 800100 add byte ptr [rcx], 0 -;; 11ab: aa stosb byte ptr [rdi], al -;; 11ac: 800100 add byte ptr [rcx], 0 -;; 11af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11b8: 800100 add byte ptr [rcx], 0 -;; 11bb: aa stosb byte ptr [rdi], al -;; 11bc: 800100 add byte ptr [rcx], 0 -;; 11bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11c8: 800100 add byte ptr [rcx], 0 -;; 11cb: aa stosb byte ptr [rdi], al -;; 11cc: 800100 add byte ptr [rcx], 0 -;; 11cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11d8: 800100 add byte ptr [rcx], 0 -;; 11db: aa stosb byte ptr [rdi], al -;; 11dc: 800100 add byte ptr [rcx], 0 -;; 11df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11e8: 800100 add byte ptr [rcx], 0 -;; 11eb: aa stosb byte ptr [rdi], al -;; 11ec: 800100 add byte ptr [rcx], 0 -;; 11ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11f8: 800100 add byte ptr [rcx], 0 -;; 11fb: aa stosb byte ptr [rdi], al -;; 11fc: 800100 add byte ptr [rcx], 0 -;; 11ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1208: 800100 add byte ptr [rcx], 0 -;; 120b: aa stosb byte ptr [rdi], al -;; 120c: 800100 add byte ptr [rcx], 0 -;; 120f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1218: 800100 add byte ptr [rcx], 0 -;; 121b: aa stosb byte ptr [rdi], al -;; 121c: 800100 add byte ptr [rcx], 0 -;; 121f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1228: 800100 add byte ptr [rcx], 0 -;; 122b: aa stosb byte ptr [rdi], al -;; 122c: 800100 add byte ptr [rcx], 0 -;; 122f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1238: 800100 add byte ptr [rcx], 0 -;; 123b: aa stosb byte ptr [rdi], al -;; 123c: 800100 add byte ptr [rcx], 0 -;; 123f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1248: 800100 add byte ptr [rcx], 0 -;; 124b: aa stosb byte ptr [rdi], al -;; 124c: 800100 add byte ptr [rcx], 0 -;; 124f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1258: 800100 add byte ptr [rcx], 0 -;; 125b: aa stosb byte ptr [rdi], al -;; 125c: 800100 add byte ptr [rcx], 0 -;; 125f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1268: 800100 add byte ptr [rcx], 0 -;; 126b: aa stosb byte ptr [rdi], al -;; 126c: 800100 add byte ptr [rcx], 0 -;; 126f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1278: 800100 add byte ptr [rcx], 0 -;; 127b: aa stosb byte ptr [rdi], al -;; 127c: 800100 add byte ptr [rcx], 0 -;; 127f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1288: 800100 add byte ptr [rcx], 0 -;; 128b: aa stosb byte ptr [rdi], al -;; 128c: 800100 add byte ptr [rcx], 0 -;; 128f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1298: 800100 add byte ptr [rcx], 0 -;; 129b: aa stosb byte ptr [rdi], al -;; 129c: 800100 add byte ptr [rcx], 0 -;; 129f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12a8: 800100 add byte ptr [rcx], 0 -;; 12ab: aa stosb byte ptr [rdi], al -;; 12ac: 800100 add byte ptr [rcx], 0 -;; 12af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12b8: 800100 add byte ptr [rcx], 0 -;; 12bb: aa stosb byte ptr [rdi], al -;; 12bc: 800100 add byte ptr [rcx], 0 -;; 12bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12c8: 800100 add byte ptr [rcx], 0 -;; 12cb: aa stosb byte ptr [rdi], al -;; 12cc: 800100 add byte ptr [rcx], 0 -;; 12cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12d8: 800100 add byte ptr [rcx], 0 -;; 12db: aa stosb byte ptr [rdi], al -;; 12dc: 800100 add byte ptr [rcx], 0 -;; 12df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12e8: 800100 add byte ptr [rcx], 0 -;; 12eb: aa stosb byte ptr [rdi], al -;; 12ec: 800100 add byte ptr [rcx], 0 -;; 12ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12f8: 800100 add byte ptr [rcx], 0 -;; 12fb: aa stosb byte ptr [rdi], al -;; 12fc: 800100 add byte ptr [rcx], 0 -;; 12ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1308: 800100 add byte ptr [rcx], 0 -;; 130b: aa stosb byte ptr [rdi], al -;; 130c: 800100 add byte ptr [rcx], 0 -;; 130f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1318: 800100 add byte ptr [rcx], 0 -;; 131b: aa stosb byte ptr [rdi], al -;; 131c: 800100 add byte ptr [rcx], 0 -;; 131f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1328: 800100 add byte ptr [rcx], 0 -;; 132b: aa stosb byte ptr [rdi], al -;; 132c: 800100 add byte ptr [rcx], 0 -;; 132f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1338: 800100 add byte ptr [rcx], 0 -;; 133b: aa stosb byte ptr [rdi], al -;; 133c: 800100 add byte ptr [rcx], 0 -;; 133f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1348: 800100 add byte ptr [rcx], 0 -;; 134b: aa stosb byte ptr [rdi], al -;; 134c: 800100 add byte ptr [rcx], 0 -;; 134f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1358: 800100 add byte ptr [rcx], 0 -;; 135b: aa stosb byte ptr [rdi], al -;; 135c: 800100 add byte ptr [rcx], 0 -;; 135f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1368: 800100 add byte ptr [rcx], 0 -;; 136b: aa stosb byte ptr [rdi], al -;; 136c: 800100 add byte ptr [rcx], 0 -;; 136f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1378: 800100 add byte ptr [rcx], 0 -;; 137b: aa stosb byte ptr [rdi], al -;; 137c: 800100 add byte ptr [rcx], 0 -;; 137f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1388: 800100 add byte ptr [rcx], 0 -;; 138b: aa stosb byte ptr [rdi], al -;; 138c: 800100 add byte ptr [rcx], 0 -;; 138f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1398: 800100 add byte ptr [rcx], 0 -;; 139b: aa stosb byte ptr [rdi], al -;; 139c: 800100 add byte ptr [rcx], 0 -;; 139f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13a8: 800100 add byte ptr [rcx], 0 -;; 13ab: aa stosb byte ptr [rdi], al -;; 13ac: 800100 add byte ptr [rcx], 0 -;; 13af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13b8: 800100 add byte ptr [rcx], 0 -;; 13bb: aa stosb byte ptr [rdi], al -;; 13bc: 800100 add byte ptr [rcx], 0 -;; 13bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13c8: 800100 add byte ptr [rcx], 0 -;; 13cb: aa stosb byte ptr [rdi], al -;; 13cc: 800100 add byte ptr [rcx], 0 -;; 13cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13d8: 800100 add byte ptr [rcx], 0 -;; 13db: aa stosb byte ptr [rdi], al -;; 13dc: 800100 add byte ptr [rcx], 0 -;; 13df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13e8: 800100 add byte ptr [rcx], 0 -;; 13eb: aa stosb byte ptr [rdi], al -;; 13ec: 800100 add byte ptr [rcx], 0 -;; 13ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13f8: 800100 add byte ptr [rcx], 0 -;; 13fb: aa stosb byte ptr [rdi], al -;; 13fc: 800100 add byte ptr [rcx], 0 -;; 13ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1408: 800100 add byte ptr [rcx], 0 -;; 140b: aa stosb byte ptr [rdi], al -;; 140c: 800100 add byte ptr [rcx], 0 -;; 140f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1418: 800100 add byte ptr [rcx], 0 -;; 141b: aa stosb byte ptr [rdi], al -;; 141c: 800100 add byte ptr [rcx], 0 -;; 141f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1428: 800100 add byte ptr [rcx], 0 -;; 142b: aa stosb byte ptr [rdi], al -;; 142c: 800100 add byte ptr [rcx], 0 -;; 142f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1438: 800100 add byte ptr [rcx], 0 -;; 143b: aa stosb byte ptr [rdi], al -;; 143c: 800100 add byte ptr [rcx], 0 -;; 143f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1448: 800100 add byte ptr [rcx], 0 -;; 144b: aa stosb byte ptr [rdi], al -;; 144c: 800100 add byte ptr [rcx], 0 -;; 144f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1458: 800100 add byte ptr [rcx], 0 -;; 145b: aa stosb byte ptr [rdi], al -;; 145c: 800100 add byte ptr [rcx], 0 -;; 145f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1468: 800100 add byte ptr [rcx], 0 -;; 146b: aa stosb byte ptr [rdi], al -;; 146c: 800100 add byte ptr [rcx], 0 -;; 146f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1478: 800100 add byte ptr [rcx], 0 -;; 147b: aa stosb byte ptr [rdi], al -;; 147c: 800100 add byte ptr [rcx], 0 -;; 147f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1488: 800100 add byte ptr [rcx], 0 -;; 148b: aa stosb byte ptr [rdi], al -;; 148c: 800100 add byte ptr [rcx], 0 -;; 148f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1498: 800100 add byte ptr [rcx], 0 -;; 149b: aa stosb byte ptr [rdi], al -;; 149c: 800100 add byte ptr [rcx], 0 -;; 149f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14a8: 800100 add byte ptr [rcx], 0 -;; 14ab: aa stosb byte ptr [rdi], al -;; 14ac: 800100 add byte ptr [rcx], 0 -;; 14af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14b8: 800100 add byte ptr [rcx], 0 -;; 14bb: aa stosb byte ptr [rdi], al -;; 14bc: 800100 add byte ptr [rcx], 0 -;; 14bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14c8: 800100 add byte ptr [rcx], 0 -;; 14cb: aa stosb byte ptr [rdi], al -;; 14cc: 800100 add byte ptr [rcx], 0 -;; 14cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14d8: 800100 add byte ptr [rcx], 0 -;; 14db: aa stosb byte ptr [rdi], al -;; 14dc: 800100 add byte ptr [rcx], 0 -;; 14df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14e8: 800100 add byte ptr [rcx], 0 -;; 14eb: aa stosb byte ptr [rdi], al -;; 14ec: 800100 add byte ptr [rcx], 0 -;; 14ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14f8: 800100 add byte ptr [rcx], 0 -;; 14fb: aa stosb byte ptr [rdi], al -;; 14fc: 800100 add byte ptr [rcx], 0 -;; 14ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1508: 800100 add byte ptr [rcx], 0 -;; 150b: aa stosb byte ptr [rdi], al -;; 150c: 800100 add byte ptr [rcx], 0 -;; 150f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1518: 800100 add byte ptr [rcx], 0 -;; 151b: aa stosb byte ptr [rdi], al -;; 151c: 800100 add byte ptr [rcx], 0 -;; 151f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1528: 800100 add byte ptr [rcx], 0 -;; 152b: aa stosb byte ptr [rdi], al -;; 152c: 800100 add byte ptr [rcx], 0 -;; 152f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1538: 800100 add byte ptr [rcx], 0 -;; 153b: aa stosb byte ptr [rdi], al -;; 153c: 800100 add byte ptr [rcx], 0 -;; 153f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1548: 800100 add byte ptr [rcx], 0 -;; 154b: aa stosb byte ptr [rdi], al -;; 154c: 800100 add byte ptr [rcx], 0 -;; 154f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1558: 800100 add byte ptr [rcx], 0 -;; 155b: aa stosb byte ptr [rdi], al -;; 155c: 800100 add byte ptr [rcx], 0 -;; 155f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1568: 800100 add byte ptr [rcx], 0 -;; 156b: aa stosb byte ptr [rdi], al -;; 156c: 800100 add byte ptr [rcx], 0 -;; 156f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1578: 800100 add byte ptr [rcx], 0 -;; 157b: aa stosb byte ptr [rdi], al -;; 157c: 800100 add byte ptr [rcx], 0 -;; 157f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1588: 800100 add byte ptr [rcx], 0 -;; 158b: aa stosb byte ptr [rdi], al -;; 158c: 800100 add byte ptr [rcx], 0 -;; 158f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1598: 800100 add byte ptr [rcx], 0 -;; 159b: aa stosb byte ptr [rdi], al -;; 159c: 800100 add byte ptr [rcx], 0 -;; 159f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15a8: 800100 add byte ptr [rcx], 0 -;; 15ab: aa stosb byte ptr [rdi], al -;; 15ac: 800100 add byte ptr [rcx], 0 -;; 15af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15b8: 800100 add byte ptr [rcx], 0 -;; 15bb: aa stosb byte ptr [rdi], al -;; 15bc: 800100 add byte ptr [rcx], 0 -;; 15bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15c8: 800100 add byte ptr [rcx], 0 -;; 15cb: aa stosb byte ptr [rdi], al -;; 15cc: 800100 add byte ptr [rcx], 0 -;; 15cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15d8: 800100 add byte ptr [rcx], 0 -;; 15db: aa stosb byte ptr [rdi], al -;; 15dc: 800100 add byte ptr [rcx], 0 -;; 15df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15e8: 800100 add byte ptr [rcx], 0 -;; 15eb: aa stosb byte ptr [rdi], al -;; 15ec: 800100 add byte ptr [rcx], 0 -;; 15ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15f8: 800100 add byte ptr [rcx], 0 -;; 15fb: aa stosb byte ptr [rdi], al -;; 15fc: 800100 add byte ptr [rcx], 0 -;; 15ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1608: 800100 add byte ptr [rcx], 0 -;; 160b: aa stosb byte ptr [rdi], al -;; 160c: 800100 add byte ptr [rcx], 0 -;; 160f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1618: 800100 add byte ptr [rcx], 0 -;; 161b: aa stosb byte ptr [rdi], al -;; 161c: 800100 add byte ptr [rcx], 0 -;; 161f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1628: 800100 add byte ptr [rcx], 0 -;; 162b: aa stosb byte ptr [rdi], al -;; 162c: 800100 add byte ptr [rcx], 0 -;; 162f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1638: 800100 add byte ptr [rcx], 0 -;; 163b: aa stosb byte ptr [rdi], al -;; 163c: 800100 add byte ptr [rcx], 0 -;; 163f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1648: 800100 add byte ptr [rcx], 0 -;; 164b: aa stosb byte ptr [rdi], al -;; 164c: 800100 add byte ptr [rcx], 0 -;; 164f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1658: 800100 add byte ptr [rcx], 0 -;; 165b: aa stosb byte ptr [rdi], al -;; 165c: 800100 add byte ptr [rcx], 0 -;; 165f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1668: 800100 add byte ptr [rcx], 0 -;; 166b: aa stosb byte ptr [rdi], al -;; 166c: 800100 add byte ptr [rcx], 0 -;; 166f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1678: 800100 add byte ptr [rcx], 0 -;; 167b: aa stosb byte ptr [rdi], al -;; 167c: 800100 add byte ptr [rcx], 0 -;; 167f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1688: 800100 add byte ptr [rcx], 0 -;; 168b: aa stosb byte ptr [rdi], al -;; 168c: 800100 add byte ptr [rcx], 0 -;; 168f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1698: 800100 add byte ptr [rcx], 0 -;; 169b: aa stosb byte ptr [rdi], al -;; 169c: 800100 add byte ptr [rcx], 0 -;; 169f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16a8: 800100 add byte ptr [rcx], 0 -;; 16ab: aa stosb byte ptr [rdi], al -;; 16ac: 800100 add byte ptr [rcx], 0 -;; 16af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16b8: 800100 add byte ptr [rcx], 0 -;; 16bb: aa stosb byte ptr [rdi], al -;; 16bc: 800100 add byte ptr [rcx], 0 -;; 16bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16c8: 800100 add byte ptr [rcx], 0 -;; 16cb: aa stosb byte ptr [rdi], al -;; 16cc: 800100 add byte ptr [rcx], 0 -;; 16cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16d8: 800100 add byte ptr [rcx], 0 -;; 16db: aa stosb byte ptr [rdi], al -;; 16dc: 800100 add byte ptr [rcx], 0 -;; 16df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16e8: 800100 add byte ptr [rcx], 0 -;; 16eb: aa stosb byte ptr [rdi], al -;; 16ec: 800100 add byte ptr [rcx], 0 -;; 16ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16f8: 800100 add byte ptr [rcx], 0 -;; 16fb: aa stosb byte ptr [rdi], al -;; 16fc: 800100 add byte ptr [rcx], 0 -;; 16ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1708: 800100 add byte ptr [rcx], 0 -;; 170b: aa stosb byte ptr [rdi], al -;; 170c: 800100 add byte ptr [rcx], 0 -;; 170f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1718: 800100 add byte ptr [rcx], 0 -;; 171b: aa stosb byte ptr [rdi], al -;; 171c: 800100 add byte ptr [rcx], 0 -;; 171f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1728: 800100 add byte ptr [rcx], 0 -;; 172b: aa stosb byte ptr [rdi], al -;; 172c: 800100 add byte ptr [rcx], 0 -;; 172f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1738: 800100 add byte ptr [rcx], 0 -;; 173b: aa stosb byte ptr [rdi], al -;; 173c: 800100 add byte ptr [rcx], 0 -;; 173f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1748: 800100 add byte ptr [rcx], 0 -;; 174b: aa stosb byte ptr [rdi], al -;; 174c: 800100 add byte ptr [rcx], 0 -;; 174f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1758: 800100 add byte ptr [rcx], 0 -;; 175b: aa stosb byte ptr [rdi], al -;; 175c: 800100 add byte ptr [rcx], 0 -;; 175f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1768: 800100 add byte ptr [rcx], 0 -;; 176b: aa stosb byte ptr [rdi], al -;; 176c: 800100 add byte ptr [rcx], 0 -;; 176f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1778: 800100 add byte ptr [rcx], 0 -;; 177b: aa stosb byte ptr [rdi], al -;; 177c: 800100 add byte ptr [rcx], 0 -;; 177f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1788: 800100 add byte ptr [rcx], 0 -;; 178b: aa stosb byte ptr [rdi], al -;; 178c: 800100 add byte ptr [rcx], 0 -;; 178f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1798: 800100 add byte ptr [rcx], 0 -;; 179b: aa stosb byte ptr [rdi], al -;; 179c: 800100 add byte ptr [rcx], 0 -;; 179f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17a8: 800100 add byte ptr [rcx], 0 -;; 17ab: aa stosb byte ptr [rdi], al -;; 17ac: 800100 add byte ptr [rcx], 0 -;; 17af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17b8: 800100 add byte ptr [rcx], 0 -;; 17bb: aa stosb byte ptr [rdi], al -;; 17bc: 800100 add byte ptr [rcx], 0 -;; 17bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17c8: 800100 add byte ptr [rcx], 0 -;; 17cb: aa stosb byte ptr [rdi], al -;; 17cc: 800100 add byte ptr [rcx], 0 -;; 17cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17d8: 800100 add byte ptr [rcx], 0 -;; 17db: aa stosb byte ptr [rdi], al -;; 17dc: 800100 add byte ptr [rcx], 0 -;; 17df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17e8: 800100 add byte ptr [rcx], 0 -;; 17eb: aa stosb byte ptr [rdi], al -;; 17ec: 800100 add byte ptr [rcx], 0 -;; 17ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17f8: 800100 add byte ptr [rcx], 0 -;; 17fb: aa stosb byte ptr [rdi], al -;; 17fc: 800100 add byte ptr [rcx], 0 -;; 17ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1808: 800100 add byte ptr [rcx], 0 -;; 180b: aa stosb byte ptr [rdi], al -;; 180c: 800100 add byte ptr [rcx], 0 -;; 180f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1818: 800100 add byte ptr [rcx], 0 -;; 181b: aa stosb byte ptr [rdi], al -;; 181c: 800100 add byte ptr [rcx], 0 -;; 181f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1828: 800100 add byte ptr [rcx], 0 -;; 182b: aa stosb byte ptr [rdi], al -;; 182c: 800100 add byte ptr [rcx], 0 -;; 182f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1838: 800100 add byte ptr [rcx], 0 -;; 183b: aa stosb byte ptr [rdi], al -;; 183c: 800100 add byte ptr [rcx], 0 -;; 183f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1848: 800100 add byte ptr [rcx], 0 -;; 184b: aa stosb byte ptr [rdi], al -;; 184c: 800100 add byte ptr [rcx], 0 -;; 184f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1858: 800100 add byte ptr [rcx], 0 -;; 185b: aa stosb byte ptr [rdi], al -;; 185c: 800100 add byte ptr [rcx], 0 -;; 185f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1868: 800100 add byte ptr [rcx], 0 -;; 186b: aa stosb byte ptr [rdi], al -;; 186c: 800100 add byte ptr [rcx], 0 -;; 186f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1878: 800100 add byte ptr [rcx], 0 -;; 187b: aa stosb byte ptr [rdi], al -;; 187c: 800100 add byte ptr [rcx], 0 -;; 187f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1888: 800100 add byte ptr [rcx], 0 -;; 188b: aa stosb byte ptr [rdi], al -;; 188c: 800100 add byte ptr [rcx], 0 -;; 188f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1898: 800100 add byte ptr [rcx], 0 -;; 189b: aa stosb byte ptr [rdi], al -;; 189c: 800100 add byte ptr [rcx], 0 -;; 189f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 18a8: 800100 add byte ptr [rcx], 0 -;; 18ab: aa stosb byte ptr [rdi], al -;; 18ac: 800100 add byte ptr [rcx], 0 -;; 18af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 18b8: 800100 add byte ptr [rcx], 0 -;; 18bb: aa stosb byte ptr [rdi], al -;; 18bc: 800100 add byte ptr [rcx], 0 -;; 18bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 18c8: 800100 add byte ptr [rcx], 0 -;; 18cb: aa stosb byte ptr [rdi], al -;; 18cc: 800100 add byte ptr [rcx], 0 -;; 18cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 18d8: 800100 add byte ptr [rcx], 0 -;; 18db: aa stosb byte ptr [rdi], al -;; 18dc: 800100 add byte ptr [rcx], 0 -;; 18df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 18e8: 800100 add byte ptr [rcx], 0 -;; 18eb: aa stosb byte ptr [rdi], al -;; 18ec: 800100 add byte ptr [rcx], 0 -;; 18ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 18f8: 800100 add byte ptr [rcx], 0 -;; 18fb: aa stosb byte ptr [rdi], al -;; 18fc: 800100 add byte ptr [rcx], 0 -;; 18ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1908: 800100 add byte ptr [rcx], 0 -;; 190b: aa stosb byte ptr [rdi], al -;; 190c: 800100 add byte ptr [rcx], 0 -;; 190f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1918: 800100 add byte ptr [rcx], 0 -;; 191b: aa stosb byte ptr [rdi], al -;; 191c: 800100 add byte ptr [rcx], 0 -;; 191f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1928: 800100 add byte ptr [rcx], 0 -;; 192b: aa stosb byte ptr [rdi], al -;; 192c: 800100 add byte ptr [rcx], 0 -;; 192f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1938: 800100 add byte ptr [rcx], 0 -;; 193b: aa stosb byte ptr [rdi], al -;; 193c: 800100 add byte ptr [rcx], 0 -;; 193f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1948: 800100 add byte ptr [rcx], 0 -;; 194b: aa stosb byte ptr [rdi], al -;; 194c: 800100 add byte ptr [rcx], 0 -;; 194f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1958: 800100 add byte ptr [rcx], 0 -;; 195b: aa stosb byte ptr [rdi], al -;; 195c: 800100 add byte ptr [rcx], 0 -;; 195f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1968: 800100 add byte ptr [rcx], 0 -;; 196b: aa stosb byte ptr [rdi], al -;; 196c: 800100 add byte ptr [rcx], 0 -;; 196f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1978: 800100 add byte ptr [rcx], 0 -;; 197b: aa stosb byte ptr [rdi], al -;; 197c: 800100 add byte ptr [rcx], 0 -;; 197f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1988: 800100 add byte ptr [rcx], 0 -;; 198b: aa stosb byte ptr [rdi], al -;; 198c: 800100 add byte ptr [rcx], 0 -;; 198f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1998: 800100 add byte ptr [rcx], 0 -;; 199b: aa stosb byte ptr [rdi], al -;; 199c: 800100 add byte ptr [rcx], 0 -;; 199f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 19a8: 800100 add byte ptr [rcx], 0 -;; 19ab: aa stosb byte ptr [rdi], al -;; 19ac: 800100 add byte ptr [rcx], 0 -;; 19af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 19b8: 800100 add byte ptr [rcx], 0 -;; 19bb: aa stosb byte ptr [rdi], al -;; 19bc: 800100 add byte ptr [rcx], 0 -;; 19bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 19c8: 800100 add byte ptr [rcx], 0 -;; 19cb: aa stosb byte ptr [rdi], al -;; 19cc: 800100 add byte ptr [rcx], 0 -;; 19cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 19d8: 800100 add byte ptr [rcx], 0 -;; 19db: aa stosb byte ptr [rdi], al -;; 19dc: 800100 add byte ptr [rcx], 0 -;; 19df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 19e8: 800100 add byte ptr [rcx], 0 -;; 19eb: aa stosb byte ptr [rdi], al -;; 19ec: 800100 add byte ptr [rcx], 0 -;; 19ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 19f8: 800100 add byte ptr [rcx], 0 -;; 19fb: aa stosb byte ptr [rdi], al -;; 19fc: 800100 add byte ptr [rcx], 0 -;; 19ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1a08: 800100 add byte ptr [rcx], 0 -;; 1a0b: aa stosb byte ptr [rdi], al -;; 1a0c: 800100 add byte ptr [rcx], 0 -;; 1a0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1a18: 800100 add byte ptr [rcx], 0 -;; 1a1b: aa stosb byte ptr [rdi], al -;; 1a1c: 800100 add byte ptr [rcx], 0 -;; 1a1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1a28: 800100 add byte ptr [rcx], 0 -;; 1a2b: aa stosb byte ptr [rdi], al -;; 1a2c: 800100 add byte ptr [rcx], 0 -;; 1a2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1a38: 800100 add byte ptr [rcx], 0 -;; 1a3b: aa stosb byte ptr [rdi], al -;; 1a3c: 800100 add byte ptr [rcx], 0 -;; 1a3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1a48: 800100 add byte ptr [rcx], 0 -;; 1a4b: aa stosb byte ptr [rdi], al -;; 1a4c: 800100 add byte ptr [rcx], 0 -;; 1a4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1a58: 800100 add byte ptr [rcx], 0 -;; 1a5b: aa stosb byte ptr [rdi], al -;; 1a5c: 800100 add byte ptr [rcx], 0 -;; 1a5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1a68: 800100 add byte ptr [rcx], 0 -;; 1a6b: aa stosb byte ptr [rdi], al -;; 1a6c: 800100 add byte ptr [rcx], 0 -;; 1a6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1a78: 800100 add byte ptr [rcx], 0 -;; 1a7b: aa stosb byte ptr [rdi], al -;; 1a7c: 800100 add byte ptr [rcx], 0 -;; 1a7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1a88: 800100 add byte ptr [rcx], 0 -;; 1a8b: aa stosb byte ptr [rdi], al -;; 1a8c: 800100 add byte ptr [rcx], 0 -;; 1a8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1a98: 800100 add byte ptr [rcx], 0 -;; 1a9b: aa stosb byte ptr [rdi], al -;; 1a9c: 800100 add byte ptr [rcx], 0 -;; 1a9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1aa8: 800100 add byte ptr [rcx], 0 -;; 1aab: aa stosb byte ptr [rdi], al -;; 1aac: 800100 add byte ptr [rcx], 0 -;; 1aaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1ab8: 800100 add byte ptr [rcx], 0 -;; 1abb: aa stosb byte ptr [rdi], al -;; 1abc: 800100 add byte ptr [rcx], 0 -;; 1abf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1ac8: 800100 add byte ptr [rcx], 0 -;; 1acb: aa stosb byte ptr [rdi], al -;; 1acc: 800100 add byte ptr [rcx], 0 -;; 1acf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1ad8: 800100 add byte ptr [rcx], 0 -;; 1adb: aa stosb byte ptr [rdi], al -;; 1adc: 800100 add byte ptr [rcx], 0 -;; 1adf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1ae8: 800100 add byte ptr [rcx], 0 -;; 1aeb: aa stosb byte ptr [rdi], al -;; 1aec: 800100 add byte ptr [rcx], 0 -;; 1aef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1af8: 800100 add byte ptr [rcx], 0 -;; 1afb: aa stosb byte ptr [rdi], al -;; 1afc: 800100 add byte ptr [rcx], 0 -;; 1aff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1b08: 800100 add byte ptr [rcx], 0 -;; 1b0b: aa stosb byte ptr [rdi], al -;; 1b0c: 800100 add byte ptr [rcx], 0 -;; 1b0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1b18: 800100 add byte ptr [rcx], 0 -;; 1b1b: aa stosb byte ptr [rdi], al -;; 1b1c: 800100 add byte ptr [rcx], 0 -;; 1b1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1b28: 800100 add byte ptr [rcx], 0 -;; 1b2b: aa stosb byte ptr [rdi], al -;; 1b2c: 800100 add byte ptr [rcx], 0 -;; 1b2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1b38: 800100 add byte ptr [rcx], 0 -;; 1b3b: aa stosb byte ptr [rdi], al -;; 1b3c: 800100 add byte ptr [rcx], 0 -;; 1b3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1b48: 800100 add byte ptr [rcx], 0 -;; 1b4b: aa stosb byte ptr [rdi], al -;; 1b4c: 800100 add byte ptr [rcx], 0 -;; 1b4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1b58: 800100 add byte ptr [rcx], 0 -;; 1b5b: aa stosb byte ptr [rdi], al -;; 1b5c: 800100 add byte ptr [rcx], 0 -;; 1b5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1b68: 800100 add byte ptr [rcx], 0 -;; 1b6b: aa stosb byte ptr [rdi], al -;; 1b6c: 800100 add byte ptr [rcx], 0 -;; 1b6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1b78: 800100 add byte ptr [rcx], 0 -;; 1b7b: aa stosb byte ptr [rdi], al -;; 1b7c: 800100 add byte ptr [rcx], 0 -;; 1b7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1b88: 800100 add byte ptr [rcx], 0 -;; 1b8b: aa stosb byte ptr [rdi], al -;; 1b8c: 800100 add byte ptr [rcx], 0 -;; 1b8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1b98: 800100 add byte ptr [rcx], 0 -;; 1b9b: aa stosb byte ptr [rdi], al -;; 1b9c: 800100 add byte ptr [rcx], 0 -;; 1b9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1ba8: 800100 add byte ptr [rcx], 0 -;; 1bab: aa stosb byte ptr [rdi], al -;; 1bac: 800100 add byte ptr [rcx], 0 -;; 1baf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1bb8: 800100 add byte ptr [rcx], 0 -;; 1bbb: aa stosb byte ptr [rdi], al -;; 1bbc: 800100 add byte ptr [rcx], 0 -;; 1bbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1bc8: 800100 add byte ptr [rcx], 0 -;; 1bcb: aa stosb byte ptr [rdi], al -;; 1bcc: 800100 add byte ptr [rcx], 0 -;; 1bcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1bd8: 800100 add byte ptr [rcx], 0 -;; 1bdb: aa stosb byte ptr [rdi], al -;; 1bdc: 800100 add byte ptr [rcx], 0 -;; 1bdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1be8: 800100 add byte ptr [rcx], 0 -;; 1beb: aa stosb byte ptr [rdi], al -;; 1bec: 800100 add byte ptr [rcx], 0 -;; 1bef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1bf8: 800100 add byte ptr [rcx], 0 -;; 1bfb: aa stosb byte ptr [rdi], al -;; 1bfc: 800100 add byte ptr [rcx], 0 -;; 1bff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1c08: 800100 add byte ptr [rcx], 0 -;; 1c0b: aa stosb byte ptr [rdi], al -;; 1c0c: 800100 add byte ptr [rcx], 0 -;; 1c0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1c18: 800100 add byte ptr [rcx], 0 -;; 1c1b: aa stosb byte ptr [rdi], al -;; 1c1c: 800100 add byte ptr [rcx], 0 -;; 1c1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1c28: 800100 add byte ptr [rcx], 0 -;; 1c2b: aa stosb byte ptr [rdi], al -;; 1c2c: 800100 add byte ptr [rcx], 0 -;; 1c2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1c38: 800100 add byte ptr [rcx], 0 -;; 1c3b: aa stosb byte ptr [rdi], al -;; 1c3c: 800100 add byte ptr [rcx], 0 -;; 1c3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1c48: 800100 add byte ptr [rcx], 0 -;; 1c4b: aa stosb byte ptr [rdi], al -;; 1c4c: 800100 add byte ptr [rcx], 0 -;; 1c4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1c58: 800100 add byte ptr [rcx], 0 -;; 1c5b: aa stosb byte ptr [rdi], al -;; 1c5c: 800100 add byte ptr [rcx], 0 -;; 1c5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1c68: 800100 add byte ptr [rcx], 0 -;; 1c6b: aa stosb byte ptr [rdi], al -;; 1c6c: 800100 add byte ptr [rcx], 0 -;; 1c6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1c78: 800100 add byte ptr [rcx], 0 -;; 1c7b: aa stosb byte ptr [rdi], al -;; 1c7c: 800100 add byte ptr [rcx], 0 -;; 1c7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1c88: 800100 add byte ptr [rcx], 0 -;; 1c8b: aa stosb byte ptr [rdi], al -;; 1c8c: 800100 add byte ptr [rcx], 0 -;; 1c8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1c98: 800100 add byte ptr [rcx], 0 -;; 1c9b: aa stosb byte ptr [rdi], al -;; 1c9c: 800100 add byte ptr [rcx], 0 -;; 1c9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1ca8: 800100 add byte ptr [rcx], 0 -;; 1cab: aa stosb byte ptr [rdi], al -;; 1cac: 800100 add byte ptr [rcx], 0 -;; 1caf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1cb8: 800100 add byte ptr [rcx], 0 -;; 1cbb: aa stosb byte ptr [rdi], al -;; 1cbc: 800100 add byte ptr [rcx], 0 -;; 1cbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1cc8: 800100 add byte ptr [rcx], 0 -;; 1ccb: aa stosb byte ptr [rdi], al -;; 1ccc: 800100 add byte ptr [rcx], 0 -;; 1ccf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1cd8: 800100 add byte ptr [rcx], 0 -;; 1cdb: aa stosb byte ptr [rdi], al -;; 1cdc: 800100 add byte ptr [rcx], 0 -;; 1cdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1ce8: 800100 add byte ptr [rcx], 0 -;; 1ceb: aa stosb byte ptr [rdi], al -;; 1cec: 800100 add byte ptr [rcx], 0 -;; 1cef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1cf8: 800100 add byte ptr [rcx], 0 -;; 1cfb: aa stosb byte ptr [rdi], al -;; 1cfc: 800100 add byte ptr [rcx], 0 -;; 1cff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1d08: 800100 add byte ptr [rcx], 0 -;; 1d0b: aa stosb byte ptr [rdi], al -;; 1d0c: 800100 add byte ptr [rcx], 0 -;; 1d0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1d18: 800100 add byte ptr [rcx], 0 -;; 1d1b: aa stosb byte ptr [rdi], al -;; 1d1c: 800100 add byte ptr [rcx], 0 -;; 1d1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1d28: 800100 add byte ptr [rcx], 0 -;; 1d2b: aa stosb byte ptr [rdi], al -;; 1d2c: 800100 add byte ptr [rcx], 0 -;; 1d2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1d38: 800100 add byte ptr [rcx], 0 -;; 1d3b: aa stosb byte ptr [rdi], al -;; 1d3c: 800100 add byte ptr [rcx], 0 -;; 1d3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1d48: 800100 add byte ptr [rcx], 0 -;; 1d4b: aa stosb byte ptr [rdi], al -;; 1d4c: 800100 add byte ptr [rcx], 0 -;; 1d4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1d58: 800100 add byte ptr [rcx], 0 -;; 1d5b: aa stosb byte ptr [rdi], al -;; 1d5c: 800100 add byte ptr [rcx], 0 -;; 1d5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1d68: 800100 add byte ptr [rcx], 0 -;; 1d6b: aa stosb byte ptr [rdi], al -;; 1d6c: 800100 add byte ptr [rcx], 0 -;; 1d6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1d78: 800100 add byte ptr [rcx], 0 -;; 1d7b: aa stosb byte ptr [rdi], al -;; 1d7c: 800100 add byte ptr [rcx], 0 -;; 1d7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1d88: 800100 add byte ptr [rcx], 0 -;; 1d8b: aa stosb byte ptr [rdi], al -;; 1d8c: 800100 add byte ptr [rcx], 0 -;; 1d8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1d98: 800100 add byte ptr [rcx], 0 -;; 1d9b: aa stosb byte ptr [rdi], al -;; 1d9c: 800100 add byte ptr [rcx], 0 -;; 1d9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1da8: 800100 add byte ptr [rcx], 0 -;; 1dab: aa stosb byte ptr [rdi], al -;; 1dac: 800100 add byte ptr [rcx], 0 -;; 1daf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1db8: 800100 add byte ptr [rcx], 0 -;; 1dbb: aa stosb byte ptr [rdi], al -;; 1dbc: 800100 add byte ptr [rcx], 0 -;; 1dbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1dc8: 800100 add byte ptr [rcx], 0 -;; 1dcb: aa stosb byte ptr [rdi], al -;; 1dcc: 800100 add byte ptr [rcx], 0 -;; 1dcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1dd8: 800100 add byte ptr [rcx], 0 -;; 1ddb: aa stosb byte ptr [rdi], al -;; 1ddc: 800100 add byte ptr [rcx], 0 -;; 1ddf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1de8: 800100 add byte ptr [rcx], 0 -;; 1deb: aa stosb byte ptr [rdi], al -;; 1dec: 800100 add byte ptr [rcx], 0 -;; 1def: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1df8: 800100 add byte ptr [rcx], 0 -;; 1dfb: aa stosb byte ptr [rdi], al -;; 1dfc: 800100 add byte ptr [rcx], 0 -;; 1dff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1e08: 800100 add byte ptr [rcx], 0 -;; 1e0b: aa stosb byte ptr [rdi], al -;; 1e0c: 800100 add byte ptr [rcx], 0 -;; 1e0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1e18: 800100 add byte ptr [rcx], 0 -;; 1e1b: aa stosb byte ptr [rdi], al -;; 1e1c: 800100 add byte ptr [rcx], 0 -;; 1e1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1e28: 800100 add byte ptr [rcx], 0 -;; 1e2b: aa stosb byte ptr [rdi], al -;; 1e2c: 800100 add byte ptr [rcx], 0 -;; 1e2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1e38: 800100 add byte ptr [rcx], 0 -;; 1e3b: aa stosb byte ptr [rdi], al -;; 1e3c: 800100 add byte ptr [rcx], 0 -;; 1e3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1e48: 800100 add byte ptr [rcx], 0 -;; 1e4b: aa stosb byte ptr [rdi], al -;; 1e4c: 800100 add byte ptr [rcx], 0 -;; 1e4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1e58: 800100 add byte ptr [rcx], 0 -;; 1e5b: aa stosb byte ptr [rdi], al -;; 1e5c: 800100 add byte ptr [rcx], 0 -;; 1e5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1e68: 800100 add byte ptr [rcx], 0 -;; 1e6b: aa stosb byte ptr [rdi], al -;; 1e6c: 800100 add byte ptr [rcx], 0 -;; 1e6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1e78: 800100 add byte ptr [rcx], 0 -;; 1e7b: aa stosb byte ptr [rdi], al -;; 1e7c: 800100 add byte ptr [rcx], 0 -;; 1e7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1e88: 800100 add byte ptr [rcx], 0 -;; 1e8b: aa stosb byte ptr [rdi], al -;; 1e8c: 800100 add byte ptr [rcx], 0 -;; 1e8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1e98: 800100 add byte ptr [rcx], 0 -;; 1e9b: aa stosb byte ptr [rdi], al -;; 1e9c: 800100 add byte ptr [rcx], 0 -;; 1e9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1ea8: 800100 add byte ptr [rcx], 0 -;; 1eab: aa stosb byte ptr [rdi], al -;; 1eac: 800100 add byte ptr [rcx], 0 -;; 1eaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1eb8: 800100 add byte ptr [rcx], 0 -;; 1ebb: aa stosb byte ptr [rdi], al -;; 1ebc: 800100 add byte ptr [rcx], 0 -;; 1ebf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1ec8: 800100 add byte ptr [rcx], 0 -;; 1ecb: aa stosb byte ptr [rdi], al -;; 1ecc: 800100 add byte ptr [rcx], 0 -;; 1ecf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1ed8: 800100 add byte ptr [rcx], 0 -;; 1edb: aa stosb byte ptr [rdi], al -;; 1edc: 800100 add byte ptr [rcx], 0 -;; 1edf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1ee8: 800100 add byte ptr [rcx], 0 -;; 1eeb: aa stosb byte ptr [rdi], al -;; 1eec: 800100 add byte ptr [rcx], 0 -;; 1eef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1ef8: 800100 add byte ptr [rcx], 0 -;; 1efb: aa stosb byte ptr [rdi], al -;; 1efc: 800100 add byte ptr [rcx], 0 -;; 1eff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1f08: 800100 add byte ptr [rcx], 0 -;; 1f0b: aa stosb byte ptr [rdi], al -;; 1f0c: 800100 add byte ptr [rcx], 0 -;; 1f0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1f18: 800100 add byte ptr [rcx], 0 -;; 1f1b: aa stosb byte ptr [rdi], al -;; 1f1c: 800100 add byte ptr [rcx], 0 -;; 1f1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1f28: 800100 add byte ptr [rcx], 0 -;; 1f2b: aa stosb byte ptr [rdi], al -;; 1f2c: 800100 add byte ptr [rcx], 0 -;; 1f2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1f38: 800100 add byte ptr [rcx], 0 -;; 1f3b: aa stosb byte ptr [rdi], al -;; 1f3c: 800100 add byte ptr [rcx], 0 -;; 1f3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1f48: 800100 add byte ptr [rcx], 0 -;; 1f4b: aa stosb byte ptr [rdi], al -;; 1f4c: 800100 add byte ptr [rcx], 0 -;; 1f4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1f58: 800100 add byte ptr [rcx], 0 -;; 1f5b: aa stosb byte ptr [rdi], al -;; 1f5c: 800100 add byte ptr [rcx], 0 -;; 1f5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1f68: 800100 add byte ptr [rcx], 0 -;; 1f6b: aa stosb byte ptr [rdi], al -;; 1f6c: 800100 add byte ptr [rcx], 0 -;; 1f6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1f78: 800100 add byte ptr [rcx], 0 -;; 1f7b: aa stosb byte ptr [rdi], al -;; 1f7c: 800100 add byte ptr [rcx], 0 -;; 1f7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1f88: 800100 add byte ptr [rcx], 0 -;; 1f8b: aa stosb byte ptr [rdi], al -;; 1f8c: 800100 add byte ptr [rcx], 0 -;; 1f8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1f98: 800100 add byte ptr [rcx], 0 -;; 1f9b: aa stosb byte ptr [rdi], al -;; 1f9c: 800100 add byte ptr [rcx], 0 -;; 1f9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1fa8: 800100 add byte ptr [rcx], 0 -;; 1fab: aa stosb byte ptr [rdi], al -;; 1fac: 800100 add byte ptr [rcx], 0 -;; 1faf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1fb8: 800100 add byte ptr [rcx], 0 -;; 1fbb: aa stosb byte ptr [rdi], al -;; 1fbc: 800100 add byte ptr [rcx], 0 -;; 1fbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1fc8: 800100 add byte ptr [rcx], 0 -;; 1fcb: aa stosb byte ptr [rdi], al -;; 1fcc: 800100 add byte ptr [rcx], 0 -;; 1fcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1fd8: 800100 add byte ptr [rcx], 0 -;; 1fdb: aa stosb byte ptr [rdi], al -;; 1fdc: 800100 add byte ptr [rcx], 0 -;; 1fdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1fe8: 800100 add byte ptr [rcx], 0 -;; 1feb: aa stosb byte ptr [rdi], al -;; 1fec: 800100 add byte ptr [rcx], 0 -;; 1fef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 1ff8: 800100 add byte ptr [rcx], 0 -;; 1ffb: aa stosb byte ptr [rdi], al -;; 1ffc: 800100 add byte ptr [rcx], 0 -;; 1fff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2008: 800100 add byte ptr [rcx], 0 -;; 200b: aa stosb byte ptr [rdi], al -;; 200c: 800100 add byte ptr [rcx], 0 -;; 200f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2018: 800100 add byte ptr [rcx], 0 -;; 201b: aa stosb byte ptr [rdi], al -;; 201c: 800100 add byte ptr [rcx], 0 -;; 201f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2028: 800100 add byte ptr [rcx], 0 -;; 202b: aa stosb byte ptr [rdi], al -;; 202c: 800100 add byte ptr [rcx], 0 -;; 202f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2038: 800100 add byte ptr [rcx], 0 -;; 203b: aa stosb byte ptr [rdi], al -;; 203c: 800100 add byte ptr [rcx], 0 -;; 203f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2048: 800100 add byte ptr [rcx], 0 -;; 204b: aa stosb byte ptr [rdi], al -;; 204c: 800100 add byte ptr [rcx], 0 -;; 204f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2058: 800100 add byte ptr [rcx], 0 -;; 205b: aa stosb byte ptr [rdi], al -;; 205c: 800100 add byte ptr [rcx], 0 -;; 205f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2068: 800100 add byte ptr [rcx], 0 -;; 206b: aa stosb byte ptr [rdi], al -;; 206c: 800100 add byte ptr [rcx], 0 -;; 206f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2078: 800100 add byte ptr [rcx], 0 -;; 207b: aa stosb byte ptr [rdi], al -;; 207c: 800100 add byte ptr [rcx], 0 -;; 207f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2088: 800100 add byte ptr [rcx], 0 -;; 208b: aa stosb byte ptr [rdi], al -;; 208c: 800100 add byte ptr [rcx], 0 -;; 208f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2098: 800100 add byte ptr [rcx], 0 -;; 209b: aa stosb byte ptr [rdi], al -;; 209c: 800100 add byte ptr [rcx], 0 -;; 209f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 20a8: 800100 add byte ptr [rcx], 0 -;; 20ab: aa stosb byte ptr [rdi], al -;; 20ac: 800100 add byte ptr [rcx], 0 -;; 20af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 20b8: 800100 add byte ptr [rcx], 0 -;; 20bb: aa stosb byte ptr [rdi], al -;; 20bc: 800100 add byte ptr [rcx], 0 -;; 20bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 20c8: 800100 add byte ptr [rcx], 0 -;; 20cb: aa stosb byte ptr [rdi], al -;; 20cc: 800100 add byte ptr [rcx], 0 -;; 20cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 20d8: 800100 add byte ptr [rcx], 0 -;; 20db: aa stosb byte ptr [rdi], al -;; 20dc: 800100 add byte ptr [rcx], 0 -;; 20df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 20e8: 800100 add byte ptr [rcx], 0 -;; 20eb: aa stosb byte ptr [rdi], al -;; 20ec: 800100 add byte ptr [rcx], 0 -;; 20ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 20f8: 800100 add byte ptr [rcx], 0 -;; 20fb: aa stosb byte ptr [rdi], al -;; 20fc: 800100 add byte ptr [rcx], 0 -;; 20ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2108: 800100 add byte ptr [rcx], 0 -;; 210b: aa stosb byte ptr [rdi], al -;; 210c: 800100 add byte ptr [rcx], 0 -;; 210f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2118: 800100 add byte ptr [rcx], 0 -;; 211b: aa stosb byte ptr [rdi], al -;; 211c: 800100 add byte ptr [rcx], 0 -;; 211f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2128: 800100 add byte ptr [rcx], 0 -;; 212b: aa stosb byte ptr [rdi], al -;; 212c: 800100 add byte ptr [rcx], 0 -;; 212f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2138: 800100 add byte ptr [rcx], 0 -;; 213b: aa stosb byte ptr [rdi], al -;; 213c: 800100 add byte ptr [rcx], 0 -;; 213f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2148: 800100 add byte ptr [rcx], 0 -;; 214b: aa stosb byte ptr [rdi], al -;; 214c: 800100 add byte ptr [rcx], 0 -;; 214f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2158: 800100 add byte ptr [rcx], 0 -;; 215b: aa stosb byte ptr [rdi], al -;; 215c: 800100 add byte ptr [rcx], 0 -;; 215f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2168: 800100 add byte ptr [rcx], 0 -;; 216b: aa stosb byte ptr [rdi], al -;; 216c: 800100 add byte ptr [rcx], 0 -;; 216f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2178: 800100 add byte ptr [rcx], 0 -;; 217b: aa stosb byte ptr [rdi], al -;; 217c: 800100 add byte ptr [rcx], 0 -;; 217f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2188: 800100 add byte ptr [rcx], 0 -;; 218b: aa stosb byte ptr [rdi], al -;; 218c: 800100 add byte ptr [rcx], 0 -;; 218f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2198: 800100 add byte ptr [rcx], 0 -;; 219b: aa stosb byte ptr [rdi], al -;; 219c: 800100 add byte ptr [rcx], 0 -;; 219f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 21a8: 800100 add byte ptr [rcx], 0 -;; 21ab: aa stosb byte ptr [rdi], al -;; 21ac: 800100 add byte ptr [rcx], 0 -;; 21af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 21b8: 800100 add byte ptr [rcx], 0 -;; 21bb: aa stosb byte ptr [rdi], al -;; 21bc: 800100 add byte ptr [rcx], 0 -;; 21bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 21c8: 800100 add byte ptr [rcx], 0 -;; 21cb: aa stosb byte ptr [rdi], al -;; 21cc: 800100 add byte ptr [rcx], 0 -;; 21cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 21d8: 800100 add byte ptr [rcx], 0 -;; 21db: aa stosb byte ptr [rdi], al -;; 21dc: 800100 add byte ptr [rcx], 0 -;; 21df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 21e8: 800100 add byte ptr [rcx], 0 -;; 21eb: aa stosb byte ptr [rdi], al -;; 21ec: 800100 add byte ptr [rcx], 0 -;; 21ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 21f8: 800100 add byte ptr [rcx], 0 -;; 21fb: aa stosb byte ptr [rdi], al -;; 21fc: 800100 add byte ptr [rcx], 0 -;; 21ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2208: 800100 add byte ptr [rcx], 0 -;; 220b: aa stosb byte ptr [rdi], al -;; 220c: 800100 add byte ptr [rcx], 0 -;; 220f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2218: 800100 add byte ptr [rcx], 0 -;; 221b: aa stosb byte ptr [rdi], al -;; 221c: 800100 add byte ptr [rcx], 0 -;; 221f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2228: 800100 add byte ptr [rcx], 0 -;; 222b: aa stosb byte ptr [rdi], al -;; 222c: 800100 add byte ptr [rcx], 0 -;; 222f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2238: 800100 add byte ptr [rcx], 0 -;; 223b: aa stosb byte ptr [rdi], al -;; 223c: 800100 add byte ptr [rcx], 0 -;; 223f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2248: 800100 add byte ptr [rcx], 0 -;; 224b: aa stosb byte ptr [rdi], al -;; 224c: 800100 add byte ptr [rcx], 0 -;; 224f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2258: 800100 add byte ptr [rcx], 0 -;; 225b: aa stosb byte ptr [rdi], al -;; 225c: 800100 add byte ptr [rcx], 0 -;; 225f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2268: 800100 add byte ptr [rcx], 0 -;; 226b: aa stosb byte ptr [rdi], al -;; 226c: 800100 add byte ptr [rcx], 0 -;; 226f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2278: 800100 add byte ptr [rcx], 0 -;; 227b: aa stosb byte ptr [rdi], al -;; 227c: 800100 add byte ptr [rcx], 0 -;; 227f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2288: 800100 add byte ptr [rcx], 0 -;; 228b: aa stosb byte ptr [rdi], al -;; 228c: 800100 add byte ptr [rcx], 0 -;; 228f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2298: 800100 add byte ptr [rcx], 0 -;; 229b: aa stosb byte ptr [rdi], al -;; 229c: 800100 add byte ptr [rcx], 0 -;; 229f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 22a8: 800100 add byte ptr [rcx], 0 -;; 22ab: aa stosb byte ptr [rdi], al -;; 22ac: 800100 add byte ptr [rcx], 0 -;; 22af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 22b8: 800100 add byte ptr [rcx], 0 -;; 22bb: aa stosb byte ptr [rdi], al -;; 22bc: 800100 add byte ptr [rcx], 0 -;; 22bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 22c8: 800100 add byte ptr [rcx], 0 -;; 22cb: aa stosb byte ptr [rdi], al -;; 22cc: 800100 add byte ptr [rcx], 0 -;; 22cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 22d8: 800100 add byte ptr [rcx], 0 -;; 22db: aa stosb byte ptr [rdi], al -;; 22dc: 800100 add byte ptr [rcx], 0 -;; 22df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 22e8: 800100 add byte ptr [rcx], 0 -;; 22eb: aa stosb byte ptr [rdi], al -;; 22ec: 800100 add byte ptr [rcx], 0 -;; 22ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 22f8: 800100 add byte ptr [rcx], 0 -;; 22fb: aa stosb byte ptr [rdi], al -;; 22fc: 800100 add byte ptr [rcx], 0 -;; 22ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2308: 800100 add byte ptr [rcx], 0 -;; 230b: aa stosb byte ptr [rdi], al -;; 230c: 800100 add byte ptr [rcx], 0 -;; 230f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2318: 800100 add byte ptr [rcx], 0 -;; 231b: aa stosb byte ptr [rdi], al -;; 231c: 800100 add byte ptr [rcx], 0 -;; 231f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2328: 800100 add byte ptr [rcx], 0 -;; 232b: aa stosb byte ptr [rdi], al -;; 232c: 800100 add byte ptr [rcx], 0 -;; 232f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2338: 800100 add byte ptr [rcx], 0 -;; 233b: aa stosb byte ptr [rdi], al -;; 233c: 800100 add byte ptr [rcx], 0 -;; 233f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2348: 800100 add byte ptr [rcx], 0 -;; 234b: aa stosb byte ptr [rdi], al -;; 234c: 800100 add byte ptr [rcx], 0 -;; 234f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2358: 800100 add byte ptr [rcx], 0 -;; 235b: aa stosb byte ptr [rdi], al -;; 235c: 800100 add byte ptr [rcx], 0 -;; 235f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2368: 800100 add byte ptr [rcx], 0 -;; 236b: aa stosb byte ptr [rdi], al -;; 236c: 800100 add byte ptr [rcx], 0 -;; 236f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2378: 800100 add byte ptr [rcx], 0 -;; 237b: aa stosb byte ptr [rdi], al -;; 237c: 800100 add byte ptr [rcx], 0 -;; 237f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2388: 800100 add byte ptr [rcx], 0 -;; 238b: aa stosb byte ptr [rdi], al -;; 238c: 800100 add byte ptr [rcx], 0 -;; 238f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2398: 800100 add byte ptr [rcx], 0 -;; 239b: aa stosb byte ptr [rdi], al -;; 239c: 800100 add byte ptr [rcx], 0 -;; 239f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 23a8: 800100 add byte ptr [rcx], 0 -;; 23ab: aa stosb byte ptr [rdi], al -;; 23ac: 800100 add byte ptr [rcx], 0 -;; 23af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 23b8: 800100 add byte ptr [rcx], 0 -;; 23bb: aa stosb byte ptr [rdi], al -;; 23bc: 800100 add byte ptr [rcx], 0 -;; 23bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 23c8: 800100 add byte ptr [rcx], 0 -;; 23cb: aa stosb byte ptr [rdi], al -;; 23cc: 800100 add byte ptr [rcx], 0 -;; 23cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 23d8: 800100 add byte ptr [rcx], 0 -;; 23db: aa stosb byte ptr [rdi], al -;; 23dc: 800100 add byte ptr [rcx], 0 -;; 23df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 23e8: 800100 add byte ptr [rcx], 0 -;; 23eb: aa stosb byte ptr [rdi], al -;; 23ec: 800100 add byte ptr [rcx], 0 -;; 23ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 23f8: 800100 add byte ptr [rcx], 0 -;; 23fb: aa stosb byte ptr [rdi], al -;; 23fc: 800100 add byte ptr [rcx], 0 -;; 23ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2408: 800100 add byte ptr [rcx], 0 -;; 240b: aa stosb byte ptr [rdi], al -;; 240c: 800100 add byte ptr [rcx], 0 -;; 240f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2418: 800100 add byte ptr [rcx], 0 -;; 241b: aa stosb byte ptr [rdi], al -;; 241c: 800100 add byte ptr [rcx], 0 -;; 241f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2428: 800100 add byte ptr [rcx], 0 -;; 242b: aa stosb byte ptr [rdi], al -;; 242c: 800100 add byte ptr [rcx], 0 -;; 242f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2438: 800100 add byte ptr [rcx], 0 -;; 243b: aa stosb byte ptr [rdi], al -;; 243c: 800100 add byte ptr [rcx], 0 -;; 243f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2448: 800100 add byte ptr [rcx], 0 -;; 244b: aa stosb byte ptr [rdi], al -;; 244c: 800100 add byte ptr [rcx], 0 -;; 244f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2458: 800100 add byte ptr [rcx], 0 -;; 245b: aa stosb byte ptr [rdi], al -;; 245c: 800100 add byte ptr [rcx], 0 -;; 245f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2468: 800100 add byte ptr [rcx], 0 -;; 246b: aa stosb byte ptr [rdi], al -;; 246c: 800100 add byte ptr [rcx], 0 -;; 246f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2478: 800100 add byte ptr [rcx], 0 -;; 247b: aa stosb byte ptr [rdi], al -;; 247c: 800100 add byte ptr [rcx], 0 -;; 247f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2488: 800100 add byte ptr [rcx], 0 -;; 248b: aa stosb byte ptr [rdi], al -;; 248c: 800100 add byte ptr [rcx], 0 -;; 248f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2498: 800100 add byte ptr [rcx], 0 -;; 249b: aa stosb byte ptr [rdi], al -;; 249c: 800100 add byte ptr [rcx], 0 -;; 249f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 24a8: 800100 add byte ptr [rcx], 0 -;; 24ab: aa stosb byte ptr [rdi], al -;; 24ac: 800100 add byte ptr [rcx], 0 -;; 24af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 24b8: 800100 add byte ptr [rcx], 0 -;; 24bb: aa stosb byte ptr [rdi], al -;; 24bc: 800100 add byte ptr [rcx], 0 -;; 24bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 24c8: 800100 add byte ptr [rcx], 0 -;; 24cb: aa stosb byte ptr [rdi], al -;; 24cc: 800100 add byte ptr [rcx], 0 -;; 24cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 24d8: 800100 add byte ptr [rcx], 0 -;; 24db: aa stosb byte ptr [rdi], al -;; 24dc: 800100 add byte ptr [rcx], 0 -;; 24df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 24e8: 800100 add byte ptr [rcx], 0 -;; 24eb: aa stosb byte ptr [rdi], al -;; 24ec: 800100 add byte ptr [rcx], 0 -;; 24ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 24f8: 800100 add byte ptr [rcx], 0 -;; 24fb: aa stosb byte ptr [rdi], al -;; 24fc: 800100 add byte ptr [rcx], 0 -;; 24ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2508: 800100 add byte ptr [rcx], 0 -;; 250b: aa stosb byte ptr [rdi], al -;; 250c: 800100 add byte ptr [rcx], 0 -;; 250f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2518: 800100 add byte ptr [rcx], 0 -;; 251b: aa stosb byte ptr [rdi], al -;; 251c: 800100 add byte ptr [rcx], 0 -;; 251f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2528: 800100 add byte ptr [rcx], 0 -;; 252b: aa stosb byte ptr [rdi], al -;; 252c: 800100 add byte ptr [rcx], 0 -;; 252f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2538: 800100 add byte ptr [rcx], 0 -;; 253b: aa stosb byte ptr [rdi], al -;; 253c: 800100 add byte ptr [rcx], 0 -;; 253f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2548: 800100 add byte ptr [rcx], 0 -;; 254b: aa stosb byte ptr [rdi], al -;; 254c: 800100 add byte ptr [rcx], 0 -;; 254f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2558: 800100 add byte ptr [rcx], 0 -;; 255b: aa stosb byte ptr [rdi], al -;; 255c: 800100 add byte ptr [rcx], 0 -;; 255f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2568: 800100 add byte ptr [rcx], 0 -;; 256b: aa stosb byte ptr [rdi], al -;; 256c: 800100 add byte ptr [rcx], 0 -;; 256f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2578: 800100 add byte ptr [rcx], 0 -;; 257b: aa stosb byte ptr [rdi], al -;; 257c: 800100 add byte ptr [rcx], 0 -;; 257f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2588: 800100 add byte ptr [rcx], 0 -;; 258b: aa stosb byte ptr [rdi], al -;; 258c: 800100 add byte ptr [rcx], 0 -;; 258f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2598: 800100 add byte ptr [rcx], 0 -;; 259b: aa stosb byte ptr [rdi], al -;; 259c: 800100 add byte ptr [rcx], 0 -;; 259f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 25a8: 800100 add byte ptr [rcx], 0 -;; 25ab: aa stosb byte ptr [rdi], al -;; 25ac: 800100 add byte ptr [rcx], 0 -;; 25af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 25b8: 800100 add byte ptr [rcx], 0 -;; 25bb: aa stosb byte ptr [rdi], al -;; 25bc: 800100 add byte ptr [rcx], 0 -;; 25bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 25c8: 800100 add byte ptr [rcx], 0 -;; 25cb: aa stosb byte ptr [rdi], al -;; 25cc: 800100 add byte ptr [rcx], 0 -;; 25cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 25d8: 800100 add byte ptr [rcx], 0 -;; 25db: aa stosb byte ptr [rdi], al -;; 25dc: 800100 add byte ptr [rcx], 0 -;; 25df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 25e8: 800100 add byte ptr [rcx], 0 -;; 25eb: aa stosb byte ptr [rdi], al -;; 25ec: 800100 add byte ptr [rcx], 0 -;; 25ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 25f8: 800100 add byte ptr [rcx], 0 -;; 25fb: aa stosb byte ptr [rdi], al -;; 25fc: 800100 add byte ptr [rcx], 0 -;; 25ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2608: 800100 add byte ptr [rcx], 0 -;; 260b: aa stosb byte ptr [rdi], al -;; 260c: 800100 add byte ptr [rcx], 0 -;; 260f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2618: 800100 add byte ptr [rcx], 0 -;; 261b: aa stosb byte ptr [rdi], al -;; 261c: 800100 add byte ptr [rcx], 0 -;; 261f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2628: 800100 add byte ptr [rcx], 0 -;; 262b: aa stosb byte ptr [rdi], al -;; 262c: 800100 add byte ptr [rcx], 0 -;; 262f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2638: 800100 add byte ptr [rcx], 0 -;; 263b: aa stosb byte ptr [rdi], al -;; 263c: 800100 add byte ptr [rcx], 0 -;; 263f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2648: 800100 add byte ptr [rcx], 0 -;; 264b: aa stosb byte ptr [rdi], al -;; 264c: 800100 add byte ptr [rcx], 0 -;; 264f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2658: 800100 add byte ptr [rcx], 0 -;; 265b: aa stosb byte ptr [rdi], al -;; 265c: 800100 add byte ptr [rcx], 0 -;; 265f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2668: 800100 add byte ptr [rcx], 0 -;; 266b: aa stosb byte ptr [rdi], al -;; 266c: 800100 add byte ptr [rcx], 0 -;; 266f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2678: 800100 add byte ptr [rcx], 0 -;; 267b: aa stosb byte ptr [rdi], al -;; 267c: 800100 add byte ptr [rcx], 0 -;; 267f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2688: 800100 add byte ptr [rcx], 0 -;; 268b: aa stosb byte ptr [rdi], al -;; 268c: 800100 add byte ptr [rcx], 0 -;; 268f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2698: 800100 add byte ptr [rcx], 0 -;; 269b: aa stosb byte ptr [rdi], al -;; 269c: 800100 add byte ptr [rcx], 0 -;; 269f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 26a8: 800100 add byte ptr [rcx], 0 -;; 26ab: aa stosb byte ptr [rdi], al -;; 26ac: 800100 add byte ptr [rcx], 0 -;; 26af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 26b8: 800100 add byte ptr [rcx], 0 -;; 26bb: aa stosb byte ptr [rdi], al -;; 26bc: 800100 add byte ptr [rcx], 0 -;; 26bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 26c8: 800100 add byte ptr [rcx], 0 -;; 26cb: aa stosb byte ptr [rdi], al -;; 26cc: 800100 add byte ptr [rcx], 0 -;; 26cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 26d8: 800100 add byte ptr [rcx], 0 -;; 26db: aa stosb byte ptr [rdi], al -;; 26dc: 800100 add byte ptr [rcx], 0 -;; 26df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 26e8: 800100 add byte ptr [rcx], 0 -;; 26eb: aa stosb byte ptr [rdi], al -;; 26ec: 800100 add byte ptr [rcx], 0 -;; 26ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 26f8: 800100 add byte ptr [rcx], 0 -;; 26fb: aa stosb byte ptr [rdi], al -;; 26fc: 800100 add byte ptr [rcx], 0 -;; 26ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2708: 800100 add byte ptr [rcx], 0 -;; 270b: aa stosb byte ptr [rdi], al -;; 270c: 800100 add byte ptr [rcx], 0 -;; 270f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2718: 800100 add byte ptr [rcx], 0 -;; 271b: aa stosb byte ptr [rdi], al -;; 271c: 800100 add byte ptr [rcx], 0 -;; 271f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2728: 800100 add byte ptr [rcx], 0 -;; 272b: aa stosb byte ptr [rdi], al -;; 272c: 800100 add byte ptr [rcx], 0 -;; 272f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2738: 800100 add byte ptr [rcx], 0 -;; 273b: aa stosb byte ptr [rdi], al -;; 273c: 800100 add byte ptr [rcx], 0 -;; 273f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2748: 800100 add byte ptr [rcx], 0 -;; 274b: aa stosb byte ptr [rdi], al -;; 274c: 800100 add byte ptr [rcx], 0 -;; 274f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2758: 800100 add byte ptr [rcx], 0 -;; 275b: aa stosb byte ptr [rdi], al -;; 275c: 800100 add byte ptr [rcx], 0 -;; 275f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2768: 800100 add byte ptr [rcx], 0 -;; 276b: aa stosb byte ptr [rdi], al -;; 276c: 800100 add byte ptr [rcx], 0 -;; 276f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2778: 800100 add byte ptr [rcx], 0 -;; 277b: aa stosb byte ptr [rdi], al -;; 277c: 800100 add byte ptr [rcx], 0 -;; 277f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2788: 800100 add byte ptr [rcx], 0 -;; 278b: aa stosb byte ptr [rdi], al -;; 278c: 800100 add byte ptr [rcx], 0 -;; 278f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2798: 800100 add byte ptr [rcx], 0 -;; 279b: aa stosb byte ptr [rdi], al -;; 279c: 800100 add byte ptr [rcx], 0 -;; 279f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 27a8: 800100 add byte ptr [rcx], 0 -;; 27ab: aa stosb byte ptr [rdi], al -;; 27ac: 800100 add byte ptr [rcx], 0 -;; 27af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 27b8: 800100 add byte ptr [rcx], 0 -;; 27bb: aa stosb byte ptr [rdi], al -;; 27bc: 800100 add byte ptr [rcx], 0 -;; 27bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 27c8: 800100 add byte ptr [rcx], 0 -;; 27cb: aa stosb byte ptr [rdi], al -;; 27cc: 800100 add byte ptr [rcx], 0 -;; 27cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 27d8: 800100 add byte ptr [rcx], 0 -;; 27db: aa stosb byte ptr [rdi], al -;; 27dc: 800100 add byte ptr [rcx], 0 -;; 27df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 27e8: 800100 add byte ptr [rcx], 0 -;; 27eb: aa stosb byte ptr [rdi], al -;; 27ec: 800100 add byte ptr [rcx], 0 -;; 27ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 27f8: 800100 add byte ptr [rcx], 0 -;; 27fb: aa stosb byte ptr [rdi], al -;; 27fc: 800100 add byte ptr [rcx], 0 -;; 27ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2808: 800100 add byte ptr [rcx], 0 -;; 280b: aa stosb byte ptr [rdi], al -;; 280c: 800100 add byte ptr [rcx], 0 -;; 280f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2818: 800100 add byte ptr [rcx], 0 -;; 281b: aa stosb byte ptr [rdi], al -;; 281c: 800100 add byte ptr [rcx], 0 -;; 281f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2828: 800100 add byte ptr [rcx], 0 -;; 282b: aa stosb byte ptr [rdi], al -;; 282c: 800100 add byte ptr [rcx], 0 -;; 282f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2838: 800100 add byte ptr [rcx], 0 -;; 283b: aa stosb byte ptr [rdi], al -;; 283c: 800100 add byte ptr [rcx], 0 -;; 283f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2848: 800100 add byte ptr [rcx], 0 -;; 284b: aa stosb byte ptr [rdi], al -;; 284c: 800100 add byte ptr [rcx], 0 -;; 284f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2858: 800100 add byte ptr [rcx], 0 -;; 285b: aa stosb byte ptr [rdi], al -;; 285c: 800100 add byte ptr [rcx], 0 -;; 285f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2868: 800100 add byte ptr [rcx], 0 -;; 286b: aa stosb byte ptr [rdi], al -;; 286c: 800100 add byte ptr [rcx], 0 -;; 286f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2878: 800100 add byte ptr [rcx], 0 -;; 287b: aa stosb byte ptr [rdi], al -;; 287c: 800100 add byte ptr [rcx], 0 -;; 287f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2888: 800100 add byte ptr [rcx], 0 -;; 288b: aa stosb byte ptr [rdi], al -;; 288c: 800100 add byte ptr [rcx], 0 -;; 288f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2898: 800100 add byte ptr [rcx], 0 -;; 289b: aa stosb byte ptr [rdi], al -;; 289c: 800100 add byte ptr [rcx], 0 -;; 289f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 28a8: 800100 add byte ptr [rcx], 0 -;; 28ab: aa stosb byte ptr [rdi], al -;; 28ac: 800100 add byte ptr [rcx], 0 -;; 28af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 28b8: 800100 add byte ptr [rcx], 0 -;; 28bb: aa stosb byte ptr [rdi], al -;; 28bc: 800100 add byte ptr [rcx], 0 -;; 28bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 28c8: 800100 add byte ptr [rcx], 0 -;; 28cb: aa stosb byte ptr [rdi], al -;; 28cc: 800100 add byte ptr [rcx], 0 -;; 28cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 28d8: 800100 add byte ptr [rcx], 0 -;; 28db: aa stosb byte ptr [rdi], al -;; 28dc: 800100 add byte ptr [rcx], 0 -;; 28df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 28e8: 800100 add byte ptr [rcx], 0 -;; 28eb: aa stosb byte ptr [rdi], al -;; 28ec: 800100 add byte ptr [rcx], 0 -;; 28ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 28f8: 800100 add byte ptr [rcx], 0 -;; 28fb: aa stosb byte ptr [rdi], al -;; 28fc: 800100 add byte ptr [rcx], 0 -;; 28ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2908: 800100 add byte ptr [rcx], 0 -;; 290b: aa stosb byte ptr [rdi], al -;; 290c: 800100 add byte ptr [rcx], 0 -;; 290f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2918: 800100 add byte ptr [rcx], 0 -;; 291b: aa stosb byte ptr [rdi], al -;; 291c: 800100 add byte ptr [rcx], 0 -;; 291f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2928: 800100 add byte ptr [rcx], 0 -;; 292b: aa stosb byte ptr [rdi], al -;; 292c: 800100 add byte ptr [rcx], 0 -;; 292f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2938: 800100 add byte ptr [rcx], 0 -;; 293b: aa stosb byte ptr [rdi], al -;; 293c: 800100 add byte ptr [rcx], 0 -;; 293f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2948: 800100 add byte ptr [rcx], 0 -;; 294b: aa stosb byte ptr [rdi], al -;; 294c: 800100 add byte ptr [rcx], 0 -;; 294f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2958: 800100 add byte ptr [rcx], 0 -;; 295b: aa stosb byte ptr [rdi], al -;; 295c: 800100 add byte ptr [rcx], 0 -;; 295f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2968: 800100 add byte ptr [rcx], 0 -;; 296b: aa stosb byte ptr [rdi], al -;; 296c: 800100 add byte ptr [rcx], 0 -;; 296f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2978: 800100 add byte ptr [rcx], 0 -;; 297b: aa stosb byte ptr [rdi], al -;; 297c: 800100 add byte ptr [rcx], 0 -;; 297f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2988: 800100 add byte ptr [rcx], 0 -;; 298b: aa stosb byte ptr [rdi], al -;; 298c: 800100 add byte ptr [rcx], 0 -;; 298f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2998: 800100 add byte ptr [rcx], 0 -;; 299b: aa stosb byte ptr [rdi], al -;; 299c: 800100 add byte ptr [rcx], 0 -;; 299f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 29a8: 800100 add byte ptr [rcx], 0 -;; 29ab: aa stosb byte ptr [rdi], al -;; 29ac: 800100 add byte ptr [rcx], 0 -;; 29af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 29b8: 800100 add byte ptr [rcx], 0 -;; 29bb: aa stosb byte ptr [rdi], al -;; 29bc: 800100 add byte ptr [rcx], 0 -;; 29bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 29c8: 800100 add byte ptr [rcx], 0 -;; 29cb: aa stosb byte ptr [rdi], al -;; 29cc: 800100 add byte ptr [rcx], 0 -;; 29cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 29d8: 800100 add byte ptr [rcx], 0 -;; 29db: aa stosb byte ptr [rdi], al -;; 29dc: 800100 add byte ptr [rcx], 0 -;; 29df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 29e8: 800100 add byte ptr [rcx], 0 -;; 29eb: aa stosb byte ptr [rdi], al -;; 29ec: 800100 add byte ptr [rcx], 0 -;; 29ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 29f8: 800100 add byte ptr [rcx], 0 -;; 29fb: aa stosb byte ptr [rdi], al -;; 29fc: 800100 add byte ptr [rcx], 0 -;; 29ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2a08: 800100 add byte ptr [rcx], 0 -;; 2a0b: aa stosb byte ptr [rdi], al -;; 2a0c: 800100 add byte ptr [rcx], 0 -;; 2a0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2a18: 800100 add byte ptr [rcx], 0 -;; 2a1b: aa stosb byte ptr [rdi], al -;; 2a1c: 800100 add byte ptr [rcx], 0 -;; 2a1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2a28: 800100 add byte ptr [rcx], 0 -;; 2a2b: aa stosb byte ptr [rdi], al -;; 2a2c: 800100 add byte ptr [rcx], 0 -;; 2a2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2a38: 800100 add byte ptr [rcx], 0 -;; 2a3b: aa stosb byte ptr [rdi], al -;; 2a3c: 800100 add byte ptr [rcx], 0 -;; 2a3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2a48: 800100 add byte ptr [rcx], 0 -;; 2a4b: aa stosb byte ptr [rdi], al -;; 2a4c: 800100 add byte ptr [rcx], 0 -;; 2a4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2a58: 800100 add byte ptr [rcx], 0 -;; 2a5b: aa stosb byte ptr [rdi], al -;; 2a5c: 800100 add byte ptr [rcx], 0 -;; 2a5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2a68: 800100 add byte ptr [rcx], 0 -;; 2a6b: aa stosb byte ptr [rdi], al -;; 2a6c: 800100 add byte ptr [rcx], 0 -;; 2a6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2a78: 800100 add byte ptr [rcx], 0 -;; 2a7b: aa stosb byte ptr [rdi], al -;; 2a7c: 800100 add byte ptr [rcx], 0 -;; 2a7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2a88: 800100 add byte ptr [rcx], 0 -;; 2a8b: aa stosb byte ptr [rdi], al -;; 2a8c: 800100 add byte ptr [rcx], 0 -;; 2a8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2a98: 800100 add byte ptr [rcx], 0 -;; 2a9b: aa stosb byte ptr [rdi], al -;; 2a9c: 800100 add byte ptr [rcx], 0 -;; 2a9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2aa8: 800100 add byte ptr [rcx], 0 -;; 2aab: aa stosb byte ptr [rdi], al -;; 2aac: 800100 add byte ptr [rcx], 0 -;; 2aaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2ab8: 800100 add byte ptr [rcx], 0 -;; 2abb: aa stosb byte ptr [rdi], al -;; 2abc: 800100 add byte ptr [rcx], 0 -;; 2abf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2ac8: 800100 add byte ptr [rcx], 0 -;; 2acb: aa stosb byte ptr [rdi], al -;; 2acc: 800100 add byte ptr [rcx], 0 -;; 2acf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2ad8: 800100 add byte ptr [rcx], 0 -;; 2adb: aa stosb byte ptr [rdi], al -;; 2adc: 800100 add byte ptr [rcx], 0 -;; 2adf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2ae8: 800100 add byte ptr [rcx], 0 -;; 2aeb: aa stosb byte ptr [rdi], al -;; 2aec: 800100 add byte ptr [rcx], 0 -;; 2aef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2af8: 800100 add byte ptr [rcx], 0 -;; 2afb: aa stosb byte ptr [rdi], al -;; 2afc: 800100 add byte ptr [rcx], 0 -;; 2aff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2b08: 800100 add byte ptr [rcx], 0 -;; 2b0b: aa stosb byte ptr [rdi], al -;; 2b0c: 800100 add byte ptr [rcx], 0 -;; 2b0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2b18: 800100 add byte ptr [rcx], 0 -;; 2b1b: aa stosb byte ptr [rdi], al -;; 2b1c: 800100 add byte ptr [rcx], 0 -;; 2b1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2b28: 800100 add byte ptr [rcx], 0 -;; 2b2b: aa stosb byte ptr [rdi], al -;; 2b2c: 800100 add byte ptr [rcx], 0 -;; 2b2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2b38: 800100 add byte ptr [rcx], 0 -;; 2b3b: aa stosb byte ptr [rdi], al -;; 2b3c: 800100 add byte ptr [rcx], 0 -;; 2b3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2b48: 800100 add byte ptr [rcx], 0 -;; 2b4b: aa stosb byte ptr [rdi], al -;; 2b4c: 800100 add byte ptr [rcx], 0 -;; 2b4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2b58: 800100 add byte ptr [rcx], 0 -;; 2b5b: aa stosb byte ptr [rdi], al -;; 2b5c: 800100 add byte ptr [rcx], 0 -;; 2b5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2b68: 800100 add byte ptr [rcx], 0 -;; 2b6b: aa stosb byte ptr [rdi], al -;; 2b6c: 800100 add byte ptr [rcx], 0 -;; 2b6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2b78: 800100 add byte ptr [rcx], 0 -;; 2b7b: aa stosb byte ptr [rdi], al -;; 2b7c: 800100 add byte ptr [rcx], 0 -;; 2b7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2b88: 800100 add byte ptr [rcx], 0 -;; 2b8b: aa stosb byte ptr [rdi], al -;; 2b8c: 800100 add byte ptr [rcx], 0 -;; 2b8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2b98: 800100 add byte ptr [rcx], 0 -;; 2b9b: aa stosb byte ptr [rdi], al -;; 2b9c: 800100 add byte ptr [rcx], 0 -;; 2b9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2ba8: 800100 add byte ptr [rcx], 0 -;; 2bab: aa stosb byte ptr [rdi], al -;; 2bac: 800100 add byte ptr [rcx], 0 -;; 2baf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2bb8: 800100 add byte ptr [rcx], 0 -;; 2bbb: aa stosb byte ptr [rdi], al -;; 2bbc: 800100 add byte ptr [rcx], 0 -;; 2bbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2bc8: 800100 add byte ptr [rcx], 0 -;; 2bcb: aa stosb byte ptr [rdi], al -;; 2bcc: 800100 add byte ptr [rcx], 0 -;; 2bcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2bd8: 800100 add byte ptr [rcx], 0 -;; 2bdb: aa stosb byte ptr [rdi], al -;; 2bdc: 800100 add byte ptr [rcx], 0 -;; 2bdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2be8: 800100 add byte ptr [rcx], 0 -;; 2beb: aa stosb byte ptr [rdi], al -;; 2bec: 800100 add byte ptr [rcx], 0 -;; 2bef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2bf8: 800100 add byte ptr [rcx], 0 -;; 2bfb: aa stosb byte ptr [rdi], al -;; 2bfc: 800100 add byte ptr [rcx], 0 -;; 2bff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2c08: 800100 add byte ptr [rcx], 0 -;; 2c0b: aa stosb byte ptr [rdi], al -;; 2c0c: 800100 add byte ptr [rcx], 0 -;; 2c0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2c18: 800100 add byte ptr [rcx], 0 -;; 2c1b: aa stosb byte ptr [rdi], al -;; 2c1c: 800100 add byte ptr [rcx], 0 -;; 2c1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2c28: 800100 add byte ptr [rcx], 0 -;; 2c2b: aa stosb byte ptr [rdi], al -;; 2c2c: 800100 add byte ptr [rcx], 0 -;; 2c2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2c38: 800100 add byte ptr [rcx], 0 -;; 2c3b: aa stosb byte ptr [rdi], al -;; 2c3c: 800100 add byte ptr [rcx], 0 -;; 2c3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2c48: 800100 add byte ptr [rcx], 0 -;; 2c4b: aa stosb byte ptr [rdi], al -;; 2c4c: 800100 add byte ptr [rcx], 0 -;; 2c4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2c58: 800100 add byte ptr [rcx], 0 -;; 2c5b: aa stosb byte ptr [rdi], al -;; 2c5c: 800100 add byte ptr [rcx], 0 -;; 2c5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2c68: 800100 add byte ptr [rcx], 0 -;; 2c6b: aa stosb byte ptr [rdi], al -;; 2c6c: 800100 add byte ptr [rcx], 0 -;; 2c6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2c78: 800100 add byte ptr [rcx], 0 -;; 2c7b: aa stosb byte ptr [rdi], al -;; 2c7c: 800100 add byte ptr [rcx], 0 -;; 2c7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2c88: 800100 add byte ptr [rcx], 0 -;; 2c8b: aa stosb byte ptr [rdi], al -;; 2c8c: 800100 add byte ptr [rcx], 0 -;; 2c8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2c98: 800100 add byte ptr [rcx], 0 -;; 2c9b: aa stosb byte ptr [rdi], al -;; 2c9c: 800100 add byte ptr [rcx], 0 -;; 2c9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2ca8: 800100 add byte ptr [rcx], 0 -;; 2cab: aa stosb byte ptr [rdi], al -;; 2cac: 800100 add byte ptr [rcx], 0 -;; 2caf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2cb8: 800100 add byte ptr [rcx], 0 -;; 2cbb: aa stosb byte ptr [rdi], al -;; 2cbc: 800100 add byte ptr [rcx], 0 -;; 2cbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2cc8: 800100 add byte ptr [rcx], 0 -;; 2ccb: aa stosb byte ptr [rdi], al -;; 2ccc: 800100 add byte ptr [rcx], 0 -;; 2ccf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2cd8: 800100 add byte ptr [rcx], 0 -;; 2cdb: aa stosb byte ptr [rdi], al -;; 2cdc: 800100 add byte ptr [rcx], 0 -;; 2cdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2ce8: 800100 add byte ptr [rcx], 0 -;; 2ceb: aa stosb byte ptr [rdi], al -;; 2cec: 800100 add byte ptr [rcx], 0 -;; 2cef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2cf8: 800100 add byte ptr [rcx], 0 -;; 2cfb: aa stosb byte ptr [rdi], al -;; 2cfc: 800100 add byte ptr [rcx], 0 -;; 2cff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2d08: 800100 add byte ptr [rcx], 0 -;; 2d0b: aa stosb byte ptr [rdi], al -;; 2d0c: 800100 add byte ptr [rcx], 0 -;; 2d0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2d18: 800100 add byte ptr [rcx], 0 -;; 2d1b: aa stosb byte ptr [rdi], al -;; 2d1c: 800100 add byte ptr [rcx], 0 -;; 2d1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2d28: 800100 add byte ptr [rcx], 0 -;; 2d2b: aa stosb byte ptr [rdi], al -;; 2d2c: 800100 add byte ptr [rcx], 0 -;; 2d2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2d38: 800100 add byte ptr [rcx], 0 -;; 2d3b: aa stosb byte ptr [rdi], al -;; 2d3c: 800100 add byte ptr [rcx], 0 -;; 2d3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2d48: 800100 add byte ptr [rcx], 0 -;; 2d4b: aa stosb byte ptr [rdi], al -;; 2d4c: 800100 add byte ptr [rcx], 0 -;; 2d4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2d58: 800100 add byte ptr [rcx], 0 -;; 2d5b: aa stosb byte ptr [rdi], al -;; 2d5c: 800100 add byte ptr [rcx], 0 -;; 2d5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2d68: 800100 add byte ptr [rcx], 0 -;; 2d6b: aa stosb byte ptr [rdi], al -;; 2d6c: 800100 add byte ptr [rcx], 0 -;; 2d6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2d78: 800100 add byte ptr [rcx], 0 -;; 2d7b: aa stosb byte ptr [rdi], al -;; 2d7c: 800100 add byte ptr [rcx], 0 -;; 2d7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2d88: 800100 add byte ptr [rcx], 0 -;; 2d8b: aa stosb byte ptr [rdi], al -;; 2d8c: 800100 add byte ptr [rcx], 0 -;; 2d8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2d98: 800100 add byte ptr [rcx], 0 -;; 2d9b: aa stosb byte ptr [rdi], al -;; 2d9c: 800100 add byte ptr [rcx], 0 -;; 2d9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2da8: 800100 add byte ptr [rcx], 0 -;; 2dab: aa stosb byte ptr [rdi], al -;; 2dac: 800100 add byte ptr [rcx], 0 -;; 2daf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2db8: 800100 add byte ptr [rcx], 0 -;; 2dbb: aa stosb byte ptr [rdi], al -;; 2dbc: 800100 add byte ptr [rcx], 0 -;; 2dbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2dc8: 800100 add byte ptr [rcx], 0 -;; 2dcb: aa stosb byte ptr [rdi], al -;; 2dcc: 800100 add byte ptr [rcx], 0 -;; 2dcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2dd8: 800100 add byte ptr [rcx], 0 -;; 2ddb: aa stosb byte ptr [rdi], al -;; 2ddc: 800100 add byte ptr [rcx], 0 -;; 2ddf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2de8: 800100 add byte ptr [rcx], 0 -;; 2deb: aa stosb byte ptr [rdi], al -;; 2dec: 800100 add byte ptr [rcx], 0 -;; 2def: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2df8: 800100 add byte ptr [rcx], 0 -;; 2dfb: aa stosb byte ptr [rdi], al -;; 2dfc: 800100 add byte ptr [rcx], 0 -;; 2dff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2e08: 800100 add byte ptr [rcx], 0 -;; 2e0b: aa stosb byte ptr [rdi], al -;; 2e0c: 800100 add byte ptr [rcx], 0 -;; 2e0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2e18: 800100 add byte ptr [rcx], 0 -;; 2e1b: aa stosb byte ptr [rdi], al -;; 2e1c: 800100 add byte ptr [rcx], 0 -;; 2e1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2e28: 800100 add byte ptr [rcx], 0 -;; 2e2b: aa stosb byte ptr [rdi], al -;; 2e2c: 800100 add byte ptr [rcx], 0 -;; 2e2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2e38: 800100 add byte ptr [rcx], 0 -;; 2e3b: aa stosb byte ptr [rdi], al -;; 2e3c: 800100 add byte ptr [rcx], 0 -;; 2e3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2e48: 800100 add byte ptr [rcx], 0 -;; 2e4b: aa stosb byte ptr [rdi], al -;; 2e4c: 800100 add byte ptr [rcx], 0 -;; 2e4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2e58: 800100 add byte ptr [rcx], 0 -;; 2e5b: aa stosb byte ptr [rdi], al -;; 2e5c: 800100 add byte ptr [rcx], 0 -;; 2e5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2e68: 800100 add byte ptr [rcx], 0 -;; 2e6b: aa stosb byte ptr [rdi], al -;; 2e6c: 800100 add byte ptr [rcx], 0 -;; 2e6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2e78: 800100 add byte ptr [rcx], 0 -;; 2e7b: aa stosb byte ptr [rdi], al -;; 2e7c: 800100 add byte ptr [rcx], 0 -;; 2e7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2e88: 800100 add byte ptr [rcx], 0 -;; 2e8b: aa stosb byte ptr [rdi], al -;; 2e8c: 800100 add byte ptr [rcx], 0 -;; 2e8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2e98: 800100 add byte ptr [rcx], 0 -;; 2e9b: aa stosb byte ptr [rdi], al -;; 2e9c: 800100 add byte ptr [rcx], 0 -;; 2e9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2ea8: 800100 add byte ptr [rcx], 0 -;; 2eab: aa stosb byte ptr [rdi], al -;; 2eac: 800100 add byte ptr [rcx], 0 -;; 2eaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2eb8: 800100 add byte ptr [rcx], 0 -;; 2ebb: aa stosb byte ptr [rdi], al -;; 2ebc: 800100 add byte ptr [rcx], 0 -;; 2ebf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2ec8: 800100 add byte ptr [rcx], 0 -;; 2ecb: aa stosb byte ptr [rdi], al -;; 2ecc: 800100 add byte ptr [rcx], 0 -;; 2ecf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2ed8: 800100 add byte ptr [rcx], 0 -;; 2edb: aa stosb byte ptr [rdi], al -;; 2edc: 800100 add byte ptr [rcx], 0 -;; 2edf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2ee8: 800100 add byte ptr [rcx], 0 -;; 2eeb: aa stosb byte ptr [rdi], al -;; 2eec: 800100 add byte ptr [rcx], 0 -;; 2eef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2ef8: 800100 add byte ptr [rcx], 0 -;; 2efb: aa stosb byte ptr [rdi], al -;; 2efc: 800100 add byte ptr [rcx], 0 -;; 2eff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2f08: 800100 add byte ptr [rcx], 0 -;; 2f0b: aa stosb byte ptr [rdi], al -;; 2f0c: 800100 add byte ptr [rcx], 0 -;; 2f0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2f18: 800100 add byte ptr [rcx], 0 -;; 2f1b: aa stosb byte ptr [rdi], al -;; 2f1c: 800100 add byte ptr [rcx], 0 -;; 2f1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2f28: 800100 add byte ptr [rcx], 0 -;; 2f2b: aa stosb byte ptr [rdi], al -;; 2f2c: 800100 add byte ptr [rcx], 0 -;; 2f2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2f38: 800100 add byte ptr [rcx], 0 -;; 2f3b: aa stosb byte ptr [rdi], al -;; 2f3c: 800100 add byte ptr [rcx], 0 -;; 2f3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2f48: 800100 add byte ptr [rcx], 0 -;; 2f4b: aa stosb byte ptr [rdi], al -;; 2f4c: 800100 add byte ptr [rcx], 0 -;; 2f4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2f58: 800100 add byte ptr [rcx], 0 -;; 2f5b: aa stosb byte ptr [rdi], al -;; 2f5c: 800100 add byte ptr [rcx], 0 -;; 2f5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2f68: 800100 add byte ptr [rcx], 0 -;; 2f6b: aa stosb byte ptr [rdi], al -;; 2f6c: 800100 add byte ptr [rcx], 0 -;; 2f6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2f78: 800100 add byte ptr [rcx], 0 -;; 2f7b: aa stosb byte ptr [rdi], al -;; 2f7c: 800100 add byte ptr [rcx], 0 -;; 2f7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2f88: 800100 add byte ptr [rcx], 0 -;; 2f8b: aa stosb byte ptr [rdi], al -;; 2f8c: 800100 add byte ptr [rcx], 0 -;; 2f8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2f98: 800100 add byte ptr [rcx], 0 -;; 2f9b: aa stosb byte ptr [rdi], al -;; 2f9c: 800100 add byte ptr [rcx], 0 -;; 2f9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2fa8: 800100 add byte ptr [rcx], 0 -;; 2fab: aa stosb byte ptr [rdi], al -;; 2fac: 800100 add byte ptr [rcx], 0 -;; 2faf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2fb8: 800100 add byte ptr [rcx], 0 -;; 2fbb: aa stosb byte ptr [rdi], al -;; 2fbc: 800100 add byte ptr [rcx], 0 -;; 2fbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2fc8: 800100 add byte ptr [rcx], 0 -;; 2fcb: aa stosb byte ptr [rdi], al -;; 2fcc: 800100 add byte ptr [rcx], 0 -;; 2fcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2fd8: 800100 add byte ptr [rcx], 0 -;; 2fdb: aa stosb byte ptr [rdi], al -;; 2fdc: 800100 add byte ptr [rcx], 0 -;; 2fdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2fe8: 800100 add byte ptr [rcx], 0 -;; 2feb: aa stosb byte ptr [rdi], al -;; 2fec: 800100 add byte ptr [rcx], 0 -;; 2fef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 2ff8: 800100 add byte ptr [rcx], 0 -;; 2ffb: aa stosb byte ptr [rdi], al -;; 2ffc: 800100 add byte ptr [rcx], 0 -;; 2fff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3008: 800100 add byte ptr [rcx], 0 -;; 300b: aa stosb byte ptr [rdi], al -;; 300c: 800100 add byte ptr [rcx], 0 -;; 300f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3018: 800100 add byte ptr [rcx], 0 -;; 301b: aa stosb byte ptr [rdi], al -;; 301c: 800100 add byte ptr [rcx], 0 -;; 301f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3028: 800100 add byte ptr [rcx], 0 -;; 302b: aa stosb byte ptr [rdi], al -;; 302c: 800100 add byte ptr [rcx], 0 -;; 302f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3038: 800100 add byte ptr [rcx], 0 -;; 303b: aa stosb byte ptr [rdi], al -;; 303c: 800100 add byte ptr [rcx], 0 -;; 303f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3048: 800100 add byte ptr [rcx], 0 -;; 304b: aa stosb byte ptr [rdi], al -;; 304c: 800100 add byte ptr [rcx], 0 -;; 304f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3058: 800100 add byte ptr [rcx], 0 -;; 305b: aa stosb byte ptr [rdi], al -;; 305c: 800100 add byte ptr [rcx], 0 -;; 305f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3068: 800100 add byte ptr [rcx], 0 -;; 306b: aa stosb byte ptr [rdi], al -;; 306c: 800100 add byte ptr [rcx], 0 -;; 306f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3078: 800100 add byte ptr [rcx], 0 -;; 307b: aa stosb byte ptr [rdi], al -;; 307c: 800100 add byte ptr [rcx], 0 -;; 307f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3088: 800100 add byte ptr [rcx], 0 -;; 308b: aa stosb byte ptr [rdi], al -;; 308c: 800100 add byte ptr [rcx], 0 -;; 308f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3098: 800100 add byte ptr [rcx], 0 -;; 309b: aa stosb byte ptr [rdi], al -;; 309c: 800100 add byte ptr [rcx], 0 -;; 309f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 30a8: 800100 add byte ptr [rcx], 0 -;; 30ab: aa stosb byte ptr [rdi], al -;; 30ac: 800100 add byte ptr [rcx], 0 -;; 30af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 30b8: 800100 add byte ptr [rcx], 0 -;; 30bb: aa stosb byte ptr [rdi], al -;; 30bc: 800100 add byte ptr [rcx], 0 -;; 30bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 30c8: 800100 add byte ptr [rcx], 0 -;; 30cb: aa stosb byte ptr [rdi], al -;; 30cc: 800100 add byte ptr [rcx], 0 -;; 30cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 30d8: 800100 add byte ptr [rcx], 0 -;; 30db: aa stosb byte ptr [rdi], al -;; 30dc: 800100 add byte ptr [rcx], 0 -;; 30df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 30e8: 800100 add byte ptr [rcx], 0 -;; 30eb: aa stosb byte ptr [rdi], al -;; 30ec: 800100 add byte ptr [rcx], 0 -;; 30ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 30f8: 800100 add byte ptr [rcx], 0 -;; 30fb: aa stosb byte ptr [rdi], al -;; 30fc: 800100 add byte ptr [rcx], 0 -;; 30ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3108: 800100 add byte ptr [rcx], 0 -;; 310b: aa stosb byte ptr [rdi], al -;; 310c: 800100 add byte ptr [rcx], 0 -;; 310f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3118: 800100 add byte ptr [rcx], 0 -;; 311b: aa stosb byte ptr [rdi], al -;; 311c: 800100 add byte ptr [rcx], 0 -;; 311f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3128: 800100 add byte ptr [rcx], 0 -;; 312b: aa stosb byte ptr [rdi], al -;; 312c: 800100 add byte ptr [rcx], 0 -;; 312f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3138: 800100 add byte ptr [rcx], 0 -;; 313b: aa stosb byte ptr [rdi], al -;; 313c: 800100 add byte ptr [rcx], 0 -;; 313f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3148: 800100 add byte ptr [rcx], 0 -;; 314b: aa stosb byte ptr [rdi], al -;; 314c: 800100 add byte ptr [rcx], 0 -;; 314f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3158: 800100 add byte ptr [rcx], 0 -;; 315b: aa stosb byte ptr [rdi], al -;; 315c: 800100 add byte ptr [rcx], 0 -;; 315f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3168: 800100 add byte ptr [rcx], 0 -;; 316b: aa stosb byte ptr [rdi], al -;; 316c: 800100 add byte ptr [rcx], 0 -;; 316f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3178: 800100 add byte ptr [rcx], 0 -;; 317b: aa stosb byte ptr [rdi], al -;; 317c: 800100 add byte ptr [rcx], 0 -;; 317f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3188: 800100 add byte ptr [rcx], 0 -;; 318b: aa stosb byte ptr [rdi], al -;; 318c: 800100 add byte ptr [rcx], 0 -;; 318f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3198: 800100 add byte ptr [rcx], 0 -;; 319b: aa stosb byte ptr [rdi], al -;; 319c: 800100 add byte ptr [rcx], 0 -;; 319f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 31a8: 800100 add byte ptr [rcx], 0 -;; 31ab: aa stosb byte ptr [rdi], al -;; 31ac: 800100 add byte ptr [rcx], 0 -;; 31af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 31b8: 800100 add byte ptr [rcx], 0 -;; 31bb: aa stosb byte ptr [rdi], al -;; 31bc: 800100 add byte ptr [rcx], 0 -;; 31bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 31c8: 800100 add byte ptr [rcx], 0 -;; 31cb: aa stosb byte ptr [rdi], al -;; 31cc: 800100 add byte ptr [rcx], 0 -;; 31cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 31d8: 800100 add byte ptr [rcx], 0 -;; 31db: aa stosb byte ptr [rdi], al -;; 31dc: 800100 add byte ptr [rcx], 0 -;; 31df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 31e8: 800100 add byte ptr [rcx], 0 -;; 31eb: aa stosb byte ptr [rdi], al -;; 31ec: 800100 add byte ptr [rcx], 0 -;; 31ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 31f8: 800100 add byte ptr [rcx], 0 -;; 31fb: aa stosb byte ptr [rdi], al -;; 31fc: 800100 add byte ptr [rcx], 0 -;; 31ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3208: 800100 add byte ptr [rcx], 0 -;; 320b: aa stosb byte ptr [rdi], al -;; 320c: 800100 add byte ptr [rcx], 0 -;; 320f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3218: 800100 add byte ptr [rcx], 0 -;; 321b: aa stosb byte ptr [rdi], al -;; 321c: 800100 add byte ptr [rcx], 0 -;; 321f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3228: 800100 add byte ptr [rcx], 0 -;; 322b: aa stosb byte ptr [rdi], al -;; 322c: 800100 add byte ptr [rcx], 0 -;; 322f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3238: 800100 add byte ptr [rcx], 0 -;; 323b: aa stosb byte ptr [rdi], al -;; 323c: 800100 add byte ptr [rcx], 0 -;; 323f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3248: 800100 add byte ptr [rcx], 0 -;; 324b: aa stosb byte ptr [rdi], al -;; 324c: 800100 add byte ptr [rcx], 0 -;; 324f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3258: 800100 add byte ptr [rcx], 0 -;; 325b: aa stosb byte ptr [rdi], al -;; 325c: 800100 add byte ptr [rcx], 0 -;; 325f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3268: 800100 add byte ptr [rcx], 0 -;; 326b: aa stosb byte ptr [rdi], al -;; 326c: 800100 add byte ptr [rcx], 0 -;; 326f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3278: 800100 add byte ptr [rcx], 0 -;; 327b: aa stosb byte ptr [rdi], al -;; 327c: 800100 add byte ptr [rcx], 0 -;; 327f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3288: 800100 add byte ptr [rcx], 0 -;; 328b: aa stosb byte ptr [rdi], al -;; 328c: 800100 add byte ptr [rcx], 0 -;; 328f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3298: 800100 add byte ptr [rcx], 0 -;; 329b: aa stosb byte ptr [rdi], al -;; 329c: 800100 add byte ptr [rcx], 0 -;; 329f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 32a8: 800100 add byte ptr [rcx], 0 -;; 32ab: aa stosb byte ptr [rdi], al -;; 32ac: 800100 add byte ptr [rcx], 0 -;; 32af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 32b8: 800100 add byte ptr [rcx], 0 -;; 32bb: aa stosb byte ptr [rdi], al -;; 32bc: 800100 add byte ptr [rcx], 0 -;; 32bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 32c8: 800100 add byte ptr [rcx], 0 -;; 32cb: aa stosb byte ptr [rdi], al -;; 32cc: 800100 add byte ptr [rcx], 0 -;; 32cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 32d8: 800100 add byte ptr [rcx], 0 -;; 32db: aa stosb byte ptr [rdi], al -;; 32dc: 800100 add byte ptr [rcx], 0 -;; 32df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 32e8: 800100 add byte ptr [rcx], 0 -;; 32eb: aa stosb byte ptr [rdi], al -;; 32ec: 800100 add byte ptr [rcx], 0 -;; 32ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 32f8: 800100 add byte ptr [rcx], 0 -;; 32fb: aa stosb byte ptr [rdi], al -;; 32fc: 800100 add byte ptr [rcx], 0 -;; 32ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3308: 800100 add byte ptr [rcx], 0 -;; 330b: aa stosb byte ptr [rdi], al -;; 330c: 800100 add byte ptr [rcx], 0 -;; 330f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3318: 800100 add byte ptr [rcx], 0 -;; 331b: aa stosb byte ptr [rdi], al -;; 331c: 800100 add byte ptr [rcx], 0 -;; 331f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3328: 800100 add byte ptr [rcx], 0 -;; 332b: aa stosb byte ptr [rdi], al -;; 332c: 800100 add byte ptr [rcx], 0 -;; 332f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3338: 800100 add byte ptr [rcx], 0 -;; 333b: aa stosb byte ptr [rdi], al -;; 333c: 800100 add byte ptr [rcx], 0 -;; 333f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3348: 800100 add byte ptr [rcx], 0 -;; 334b: aa stosb byte ptr [rdi], al -;; 334c: 800100 add byte ptr [rcx], 0 -;; 334f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3358: 800100 add byte ptr [rcx], 0 -;; 335b: aa stosb byte ptr [rdi], al -;; 335c: 800100 add byte ptr [rcx], 0 -;; 335f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3368: 800100 add byte ptr [rcx], 0 -;; 336b: aa stosb byte ptr [rdi], al -;; 336c: 800100 add byte ptr [rcx], 0 -;; 336f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3378: 800100 add byte ptr [rcx], 0 -;; 337b: aa stosb byte ptr [rdi], al -;; 337c: 800100 add byte ptr [rcx], 0 -;; 337f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3388: 800100 add byte ptr [rcx], 0 -;; 338b: aa stosb byte ptr [rdi], al -;; 338c: 800100 add byte ptr [rcx], 0 -;; 338f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3398: 800100 add byte ptr [rcx], 0 -;; 339b: aa stosb byte ptr [rdi], al -;; 339c: 800100 add byte ptr [rcx], 0 -;; 339f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 33a8: 800100 add byte ptr [rcx], 0 -;; 33ab: aa stosb byte ptr [rdi], al -;; 33ac: 800100 add byte ptr [rcx], 0 -;; 33af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 33b8: 800100 add byte ptr [rcx], 0 -;; 33bb: aa stosb byte ptr [rdi], al -;; 33bc: 800100 add byte ptr [rcx], 0 -;; 33bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 33c8: 800100 add byte ptr [rcx], 0 -;; 33cb: aa stosb byte ptr [rdi], al -;; 33cc: 800100 add byte ptr [rcx], 0 -;; 33cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 33d8: 800100 add byte ptr [rcx], 0 -;; 33db: aa stosb byte ptr [rdi], al -;; 33dc: 800100 add byte ptr [rcx], 0 -;; 33df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 33e8: 800100 add byte ptr [rcx], 0 -;; 33eb: aa stosb byte ptr [rdi], al -;; 33ec: 800100 add byte ptr [rcx], 0 -;; 33ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 33f8: 800100 add byte ptr [rcx], 0 -;; 33fb: aa stosb byte ptr [rdi], al -;; 33fc: 800100 add byte ptr [rcx], 0 -;; 33ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3408: 800100 add byte ptr [rcx], 0 -;; 340b: aa stosb byte ptr [rdi], al -;; 340c: 800100 add byte ptr [rcx], 0 -;; 340f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3418: 800100 add byte ptr [rcx], 0 -;; 341b: aa stosb byte ptr [rdi], al -;; 341c: 800100 add byte ptr [rcx], 0 -;; 341f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3428: 800100 add byte ptr [rcx], 0 -;; 342b: aa stosb byte ptr [rdi], al -;; 342c: 800100 add byte ptr [rcx], 0 -;; 342f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3438: 800100 add byte ptr [rcx], 0 -;; 343b: aa stosb byte ptr [rdi], al -;; 343c: 800100 add byte ptr [rcx], 0 -;; 343f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3448: 800100 add byte ptr [rcx], 0 -;; 344b: aa stosb byte ptr [rdi], al -;; 344c: 800100 add byte ptr [rcx], 0 -;; 344f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3458: 800100 add byte ptr [rcx], 0 -;; 345b: aa stosb byte ptr [rdi], al -;; 345c: 800100 add byte ptr [rcx], 0 -;; 345f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3468: 800100 add byte ptr [rcx], 0 -;; 346b: aa stosb byte ptr [rdi], al -;; 346c: 800100 add byte ptr [rcx], 0 -;; 346f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3478: 800100 add byte ptr [rcx], 0 -;; 347b: aa stosb byte ptr [rdi], al -;; 347c: 800100 add byte ptr [rcx], 0 -;; 347f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3488: 800100 add byte ptr [rcx], 0 -;; 348b: aa stosb byte ptr [rdi], al -;; 348c: 800100 add byte ptr [rcx], 0 -;; 348f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3498: 800100 add byte ptr [rcx], 0 -;; 349b: aa stosb byte ptr [rdi], al -;; 349c: 800100 add byte ptr [rcx], 0 -;; 349f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 34a8: 800100 add byte ptr [rcx], 0 -;; 34ab: aa stosb byte ptr [rdi], al -;; 34ac: 800100 add byte ptr [rcx], 0 -;; 34af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 34b8: 800100 add byte ptr [rcx], 0 -;; 34bb: aa stosb byte ptr [rdi], al -;; 34bc: 800100 add byte ptr [rcx], 0 -;; 34bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 34c8: 800100 add byte ptr [rcx], 0 -;; 34cb: aa stosb byte ptr [rdi], al -;; 34cc: 800100 add byte ptr [rcx], 0 -;; 34cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 34d8: 800100 add byte ptr [rcx], 0 -;; 34db: aa stosb byte ptr [rdi], al -;; 34dc: 800100 add byte ptr [rcx], 0 -;; 34df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 34e8: 800100 add byte ptr [rcx], 0 -;; 34eb: aa stosb byte ptr [rdi], al -;; 34ec: 800100 add byte ptr [rcx], 0 -;; 34ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 34f8: 800100 add byte ptr [rcx], 0 -;; 34fb: aa stosb byte ptr [rdi], al -;; 34fc: 800100 add byte ptr [rcx], 0 -;; 34ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3508: 800100 add byte ptr [rcx], 0 -;; 350b: aa stosb byte ptr [rdi], al -;; 350c: 800100 add byte ptr [rcx], 0 -;; 350f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3518: 800100 add byte ptr [rcx], 0 -;; 351b: aa stosb byte ptr [rdi], al -;; 351c: 800100 add byte ptr [rcx], 0 -;; 351f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3528: 800100 add byte ptr [rcx], 0 -;; 352b: aa stosb byte ptr [rdi], al -;; 352c: 800100 add byte ptr [rcx], 0 -;; 352f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3538: 800100 add byte ptr [rcx], 0 -;; 353b: aa stosb byte ptr [rdi], al -;; 353c: 800100 add byte ptr [rcx], 0 -;; 353f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3548: 800100 add byte ptr [rcx], 0 -;; 354b: aa stosb byte ptr [rdi], al -;; 354c: 800100 add byte ptr [rcx], 0 -;; 354f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3558: 800100 add byte ptr [rcx], 0 -;; 355b: aa stosb byte ptr [rdi], al -;; 355c: 800100 add byte ptr [rcx], 0 -;; 355f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3568: 800100 add byte ptr [rcx], 0 -;; 356b: aa stosb byte ptr [rdi], al -;; 356c: 800100 add byte ptr [rcx], 0 -;; 356f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3578: 800100 add byte ptr [rcx], 0 -;; 357b: aa stosb byte ptr [rdi], al -;; 357c: 800100 add byte ptr [rcx], 0 -;; 357f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3588: 800100 add byte ptr [rcx], 0 -;; 358b: aa stosb byte ptr [rdi], al -;; 358c: 800100 add byte ptr [rcx], 0 -;; 358f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3598: 800100 add byte ptr [rcx], 0 -;; 359b: aa stosb byte ptr [rdi], al -;; 359c: 800100 add byte ptr [rcx], 0 -;; 359f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 35a8: 800100 add byte ptr [rcx], 0 -;; 35ab: aa stosb byte ptr [rdi], al -;; 35ac: 800100 add byte ptr [rcx], 0 -;; 35af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 35b8: 800100 add byte ptr [rcx], 0 -;; 35bb: aa stosb byte ptr [rdi], al -;; 35bc: 800100 add byte ptr [rcx], 0 -;; 35bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 35c8: 800100 add byte ptr [rcx], 0 -;; 35cb: aa stosb byte ptr [rdi], al -;; 35cc: 800100 add byte ptr [rcx], 0 -;; 35cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 35d8: 800100 add byte ptr [rcx], 0 -;; 35db: aa stosb byte ptr [rdi], al -;; 35dc: 800100 add byte ptr [rcx], 0 -;; 35df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 35e8: 800100 add byte ptr [rcx], 0 -;; 35eb: aa stosb byte ptr [rdi], al -;; 35ec: 800100 add byte ptr [rcx], 0 -;; 35ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 35f8: 800100 add byte ptr [rcx], 0 -;; 35fb: aa stosb byte ptr [rdi], al -;; 35fc: 800100 add byte ptr [rcx], 0 -;; 35ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3608: 800100 add byte ptr [rcx], 0 -;; 360b: aa stosb byte ptr [rdi], al -;; 360c: 800100 add byte ptr [rcx], 0 -;; 360f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3618: 800100 add byte ptr [rcx], 0 -;; 361b: aa stosb byte ptr [rdi], al -;; 361c: 800100 add byte ptr [rcx], 0 -;; 361f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3628: 800100 add byte ptr [rcx], 0 -;; 362b: aa stosb byte ptr [rdi], al -;; 362c: 800100 add byte ptr [rcx], 0 -;; 362f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3638: 800100 add byte ptr [rcx], 0 -;; 363b: aa stosb byte ptr [rdi], al -;; 363c: 800100 add byte ptr [rcx], 0 -;; 363f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3648: 800100 add byte ptr [rcx], 0 -;; 364b: aa stosb byte ptr [rdi], al -;; 364c: 800100 add byte ptr [rcx], 0 -;; 364f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3658: 800100 add byte ptr [rcx], 0 -;; 365b: aa stosb byte ptr [rdi], al -;; 365c: 800100 add byte ptr [rcx], 0 -;; 365f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3668: 800100 add byte ptr [rcx], 0 -;; 366b: aa stosb byte ptr [rdi], al -;; 366c: 800100 add byte ptr [rcx], 0 -;; 366f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3678: 800100 add byte ptr [rcx], 0 -;; 367b: aa stosb byte ptr [rdi], al -;; 367c: 800100 add byte ptr [rcx], 0 -;; 367f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3688: 800100 add byte ptr [rcx], 0 -;; 368b: aa stosb byte ptr [rdi], al -;; 368c: 800100 add byte ptr [rcx], 0 -;; 368f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3698: 800100 add byte ptr [rcx], 0 -;; 369b: aa stosb byte ptr [rdi], al -;; 369c: 800100 add byte ptr [rcx], 0 -;; 369f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 36a8: 800100 add byte ptr [rcx], 0 -;; 36ab: aa stosb byte ptr [rdi], al -;; 36ac: 800100 add byte ptr [rcx], 0 -;; 36af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 36b8: 800100 add byte ptr [rcx], 0 -;; 36bb: aa stosb byte ptr [rdi], al -;; 36bc: 800100 add byte ptr [rcx], 0 -;; 36bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 36c8: 800100 add byte ptr [rcx], 0 -;; 36cb: aa stosb byte ptr [rdi], al -;; 36cc: 800100 add byte ptr [rcx], 0 -;; 36cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 36d8: 800100 add byte ptr [rcx], 0 -;; 36db: aa stosb byte ptr [rdi], al -;; 36dc: 800100 add byte ptr [rcx], 0 -;; 36df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 36e8: 800100 add byte ptr [rcx], 0 -;; 36eb: aa stosb byte ptr [rdi], al -;; 36ec: 800100 add byte ptr [rcx], 0 -;; 36ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 36f8: 800100 add byte ptr [rcx], 0 -;; 36fb: aa stosb byte ptr [rdi], al -;; 36fc: 800100 add byte ptr [rcx], 0 -;; 36ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3708: 800100 add byte ptr [rcx], 0 -;; 370b: aa stosb byte ptr [rdi], al -;; 370c: 800100 add byte ptr [rcx], 0 -;; 370f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3718: 800100 add byte ptr [rcx], 0 -;; 371b: aa stosb byte ptr [rdi], al -;; 371c: 800100 add byte ptr [rcx], 0 -;; 371f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3728: 800100 add byte ptr [rcx], 0 -;; 372b: aa stosb byte ptr [rdi], al -;; 372c: 800100 add byte ptr [rcx], 0 -;; 372f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3738: 800100 add byte ptr [rcx], 0 -;; 373b: aa stosb byte ptr [rdi], al -;; 373c: 800100 add byte ptr [rcx], 0 -;; 373f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3748: 800100 add byte ptr [rcx], 0 -;; 374b: aa stosb byte ptr [rdi], al -;; 374c: 800100 add byte ptr [rcx], 0 -;; 374f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3758: 800100 add byte ptr [rcx], 0 -;; 375b: aa stosb byte ptr [rdi], al -;; 375c: 800100 add byte ptr [rcx], 0 -;; 375f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3768: 800100 add byte ptr [rcx], 0 -;; 376b: aa stosb byte ptr [rdi], al -;; 376c: 800100 add byte ptr [rcx], 0 -;; 376f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3778: 800100 add byte ptr [rcx], 0 -;; 377b: aa stosb byte ptr [rdi], al -;; 377c: 800100 add byte ptr [rcx], 0 -;; 377f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3788: 800100 add byte ptr [rcx], 0 -;; 378b: aa stosb byte ptr [rdi], al -;; 378c: 800100 add byte ptr [rcx], 0 -;; 378f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3798: 800100 add byte ptr [rcx], 0 -;; 379b: aa stosb byte ptr [rdi], al -;; 379c: 800100 add byte ptr [rcx], 0 -;; 379f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 37a8: 800100 add byte ptr [rcx], 0 -;; 37ab: aa stosb byte ptr [rdi], al -;; 37ac: 800100 add byte ptr [rcx], 0 -;; 37af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 37b8: 800100 add byte ptr [rcx], 0 -;; 37bb: aa stosb byte ptr [rdi], al -;; 37bc: 800100 add byte ptr [rcx], 0 -;; 37bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 37c8: 800100 add byte ptr [rcx], 0 -;; 37cb: aa stosb byte ptr [rdi], al -;; 37cc: 800100 add byte ptr [rcx], 0 -;; 37cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 37d8: 800100 add byte ptr [rcx], 0 -;; 37db: aa stosb byte ptr [rdi], al -;; 37dc: 800100 add byte ptr [rcx], 0 -;; 37df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 37e8: 800100 add byte ptr [rcx], 0 -;; 37eb: aa stosb byte ptr [rdi], al -;; 37ec: 800100 add byte ptr [rcx], 0 -;; 37ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 37f8: 800100 add byte ptr [rcx], 0 -;; 37fb: aa stosb byte ptr [rdi], al -;; 37fc: 800100 add byte ptr [rcx], 0 -;; 37ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3808: 800100 add byte ptr [rcx], 0 -;; 380b: aa stosb byte ptr [rdi], al -;; 380c: 800100 add byte ptr [rcx], 0 -;; 380f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3818: 800100 add byte ptr [rcx], 0 -;; 381b: aa stosb byte ptr [rdi], al -;; 381c: 800100 add byte ptr [rcx], 0 -;; 381f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3828: 800100 add byte ptr [rcx], 0 -;; 382b: aa stosb byte ptr [rdi], al -;; 382c: 800100 add byte ptr [rcx], 0 -;; 382f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3838: 800100 add byte ptr [rcx], 0 -;; 383b: aa stosb byte ptr [rdi], al -;; 383c: 800100 add byte ptr [rcx], 0 -;; 383f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3848: 800100 add byte ptr [rcx], 0 -;; 384b: aa stosb byte ptr [rdi], al -;; 384c: 800100 add byte ptr [rcx], 0 -;; 384f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3858: 800100 add byte ptr [rcx], 0 -;; 385b: aa stosb byte ptr [rdi], al -;; 385c: 800100 add byte ptr [rcx], 0 -;; 385f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3868: 800100 add byte ptr [rcx], 0 -;; 386b: aa stosb byte ptr [rdi], al -;; 386c: 800100 add byte ptr [rcx], 0 -;; 386f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3878: 800100 add byte ptr [rcx], 0 -;; 387b: aa stosb byte ptr [rdi], al -;; 387c: 800100 add byte ptr [rcx], 0 -;; 387f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3888: 800100 add byte ptr [rcx], 0 -;; 388b: aa stosb byte ptr [rdi], al -;; 388c: 800100 add byte ptr [rcx], 0 -;; 388f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3898: 800100 add byte ptr [rcx], 0 -;; 389b: aa stosb byte ptr [rdi], al -;; 389c: 800100 add byte ptr [rcx], 0 -;; 389f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 38a8: 800100 add byte ptr [rcx], 0 -;; 38ab: aa stosb byte ptr [rdi], al -;; 38ac: 800100 add byte ptr [rcx], 0 -;; 38af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 38b8: 800100 add byte ptr [rcx], 0 -;; 38bb: aa stosb byte ptr [rdi], al -;; 38bc: 800100 add byte ptr [rcx], 0 -;; 38bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 38c8: 800100 add byte ptr [rcx], 0 -;; 38cb: aa stosb byte ptr [rdi], al -;; 38cc: 800100 add byte ptr [rcx], 0 -;; 38cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 38d8: 800100 add byte ptr [rcx], 0 -;; 38db: aa stosb byte ptr [rdi], al -;; 38dc: 800100 add byte ptr [rcx], 0 -;; 38df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 38e8: 800100 add byte ptr [rcx], 0 -;; 38eb: aa stosb byte ptr [rdi], al -;; 38ec: 800100 add byte ptr [rcx], 0 -;; 38ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 38f8: 800100 add byte ptr [rcx], 0 -;; 38fb: aa stosb byte ptr [rdi], al -;; 38fc: 800100 add byte ptr [rcx], 0 -;; 38ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3908: 800100 add byte ptr [rcx], 0 -;; 390b: aa stosb byte ptr [rdi], al -;; 390c: 800100 add byte ptr [rcx], 0 -;; 390f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3918: 800100 add byte ptr [rcx], 0 -;; 391b: aa stosb byte ptr [rdi], al -;; 391c: 800100 add byte ptr [rcx], 0 -;; 391f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3928: 800100 add byte ptr [rcx], 0 -;; 392b: aa stosb byte ptr [rdi], al -;; 392c: 800100 add byte ptr [rcx], 0 -;; 392f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3938: 800100 add byte ptr [rcx], 0 -;; 393b: aa stosb byte ptr [rdi], al -;; 393c: 800100 add byte ptr [rcx], 0 -;; 393f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3948: 800100 add byte ptr [rcx], 0 -;; 394b: aa stosb byte ptr [rdi], al -;; 394c: 800100 add byte ptr [rcx], 0 -;; 394f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3958: 800100 add byte ptr [rcx], 0 -;; 395b: aa stosb byte ptr [rdi], al -;; 395c: 800100 add byte ptr [rcx], 0 -;; 395f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3968: 800100 add byte ptr [rcx], 0 -;; 396b: aa stosb byte ptr [rdi], al -;; 396c: 800100 add byte ptr [rcx], 0 -;; 396f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3978: 800100 add byte ptr [rcx], 0 -;; 397b: aa stosb byte ptr [rdi], al -;; 397c: 800100 add byte ptr [rcx], 0 -;; 397f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3988: 800100 add byte ptr [rcx], 0 -;; 398b: aa stosb byte ptr [rdi], al -;; 398c: 800100 add byte ptr [rcx], 0 -;; 398f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3998: 800100 add byte ptr [rcx], 0 -;; 399b: aa stosb byte ptr [rdi], al -;; 399c: 800100 add byte ptr [rcx], 0 -;; 399f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 39a8: 800100 add byte ptr [rcx], 0 -;; 39ab: aa stosb byte ptr [rdi], al -;; 39ac: 800100 add byte ptr [rcx], 0 -;; 39af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 39b8: 800100 add byte ptr [rcx], 0 -;; 39bb: aa stosb byte ptr [rdi], al -;; 39bc: 800100 add byte ptr [rcx], 0 -;; 39bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 39c8: 800100 add byte ptr [rcx], 0 -;; 39cb: aa stosb byte ptr [rdi], al -;; 39cc: 800100 add byte ptr [rcx], 0 -;; 39cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 39d8: 800100 add byte ptr [rcx], 0 -;; 39db: aa stosb byte ptr [rdi], al -;; 39dc: 800100 add byte ptr [rcx], 0 -;; 39df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 39e8: 800100 add byte ptr [rcx], 0 -;; 39eb: aa stosb byte ptr [rdi], al -;; 39ec: 800100 add byte ptr [rcx], 0 -;; 39ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 39f8: 800100 add byte ptr [rcx], 0 -;; 39fb: aa stosb byte ptr [rdi], al -;; 39fc: 800100 add byte ptr [rcx], 0 -;; 39ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3a08: 800100 add byte ptr [rcx], 0 -;; 3a0b: aa stosb byte ptr [rdi], al -;; 3a0c: 800100 add byte ptr [rcx], 0 -;; 3a0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3a18: 800100 add byte ptr [rcx], 0 -;; 3a1b: aa stosb byte ptr [rdi], al -;; 3a1c: 800100 add byte ptr [rcx], 0 -;; 3a1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3a28: 800100 add byte ptr [rcx], 0 -;; 3a2b: aa stosb byte ptr [rdi], al -;; 3a2c: 800100 add byte ptr [rcx], 0 -;; 3a2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3a38: 800100 add byte ptr [rcx], 0 -;; 3a3b: aa stosb byte ptr [rdi], al -;; 3a3c: 800100 add byte ptr [rcx], 0 -;; 3a3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3a48: 800100 add byte ptr [rcx], 0 -;; 3a4b: aa stosb byte ptr [rdi], al -;; 3a4c: 800100 add byte ptr [rcx], 0 -;; 3a4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3a58: 800100 add byte ptr [rcx], 0 -;; 3a5b: aa stosb byte ptr [rdi], al -;; 3a5c: 800100 add byte ptr [rcx], 0 -;; 3a5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3a68: 800100 add byte ptr [rcx], 0 -;; 3a6b: aa stosb byte ptr [rdi], al -;; 3a6c: 800100 add byte ptr [rcx], 0 -;; 3a6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3a78: 800100 add byte ptr [rcx], 0 -;; 3a7b: aa stosb byte ptr [rdi], al -;; 3a7c: 800100 add byte ptr [rcx], 0 -;; 3a7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3a88: 800100 add byte ptr [rcx], 0 -;; 3a8b: aa stosb byte ptr [rdi], al -;; 3a8c: 800100 add byte ptr [rcx], 0 -;; 3a8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3a98: 800100 add byte ptr [rcx], 0 -;; 3a9b: aa stosb byte ptr [rdi], al -;; 3a9c: 800100 add byte ptr [rcx], 0 -;; 3a9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3aa8: 800100 add byte ptr [rcx], 0 -;; 3aab: aa stosb byte ptr [rdi], al -;; 3aac: 800100 add byte ptr [rcx], 0 -;; 3aaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3ab8: 800100 add byte ptr [rcx], 0 -;; 3abb: aa stosb byte ptr [rdi], al -;; 3abc: 800100 add byte ptr [rcx], 0 -;; 3abf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3ac8: 800100 add byte ptr [rcx], 0 -;; 3acb: aa stosb byte ptr [rdi], al -;; 3acc: 800100 add byte ptr [rcx], 0 -;; 3acf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3ad8: 800100 add byte ptr [rcx], 0 -;; 3adb: aa stosb byte ptr [rdi], al -;; 3adc: 800100 add byte ptr [rcx], 0 -;; 3adf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3ae8: 800100 add byte ptr [rcx], 0 -;; 3aeb: aa stosb byte ptr [rdi], al -;; 3aec: 800100 add byte ptr [rcx], 0 -;; 3aef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3af8: 800100 add byte ptr [rcx], 0 -;; 3afb: aa stosb byte ptr [rdi], al -;; 3afc: 800100 add byte ptr [rcx], 0 -;; 3aff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3b08: 800100 add byte ptr [rcx], 0 -;; 3b0b: aa stosb byte ptr [rdi], al -;; 3b0c: 800100 add byte ptr [rcx], 0 -;; 3b0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3b18: 800100 add byte ptr [rcx], 0 -;; 3b1b: aa stosb byte ptr [rdi], al -;; 3b1c: 800100 add byte ptr [rcx], 0 -;; 3b1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3b28: 800100 add byte ptr [rcx], 0 -;; 3b2b: aa stosb byte ptr [rdi], al -;; 3b2c: 800100 add byte ptr [rcx], 0 -;; 3b2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3b38: 800100 add byte ptr [rcx], 0 -;; 3b3b: aa stosb byte ptr [rdi], al -;; 3b3c: 800100 add byte ptr [rcx], 0 -;; 3b3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3b48: 800100 add byte ptr [rcx], 0 -;; 3b4b: aa stosb byte ptr [rdi], al -;; 3b4c: 800100 add byte ptr [rcx], 0 -;; 3b4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3b58: 800100 add byte ptr [rcx], 0 -;; 3b5b: aa stosb byte ptr [rdi], al -;; 3b5c: 800100 add byte ptr [rcx], 0 -;; 3b5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3b68: 800100 add byte ptr [rcx], 0 -;; 3b6b: aa stosb byte ptr [rdi], al -;; 3b6c: 800100 add byte ptr [rcx], 0 -;; 3b6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3b78: 800100 add byte ptr [rcx], 0 -;; 3b7b: aa stosb byte ptr [rdi], al -;; 3b7c: 800100 add byte ptr [rcx], 0 -;; 3b7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3b88: 800100 add byte ptr [rcx], 0 -;; 3b8b: aa stosb byte ptr [rdi], al -;; 3b8c: 800100 add byte ptr [rcx], 0 -;; 3b8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3b98: 800100 add byte ptr [rcx], 0 -;; 3b9b: aa stosb byte ptr [rdi], al -;; 3b9c: 800100 add byte ptr [rcx], 0 -;; 3b9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3ba8: 800100 add byte ptr [rcx], 0 -;; 3bab: aa stosb byte ptr [rdi], al -;; 3bac: 800100 add byte ptr [rcx], 0 -;; 3baf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3bb8: 800100 add byte ptr [rcx], 0 -;; 3bbb: aa stosb byte ptr [rdi], al -;; 3bbc: 800100 add byte ptr [rcx], 0 -;; 3bbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3bc8: 800100 add byte ptr [rcx], 0 -;; 3bcb: aa stosb byte ptr [rdi], al -;; 3bcc: 800100 add byte ptr [rcx], 0 -;; 3bcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3bd8: 800100 add byte ptr [rcx], 0 -;; 3bdb: aa stosb byte ptr [rdi], al -;; 3bdc: 800100 add byte ptr [rcx], 0 -;; 3bdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3be8: 800100 add byte ptr [rcx], 0 -;; 3beb: aa stosb byte ptr [rdi], al -;; 3bec: 800100 add byte ptr [rcx], 0 -;; 3bef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3bf8: 800100 add byte ptr [rcx], 0 -;; 3bfb: aa stosb byte ptr [rdi], al -;; 3bfc: 800100 add byte ptr [rcx], 0 -;; 3bff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3c08: 800100 add byte ptr [rcx], 0 -;; 3c0b: aa stosb byte ptr [rdi], al -;; 3c0c: 800100 add byte ptr [rcx], 0 -;; 3c0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3c18: 800100 add byte ptr [rcx], 0 -;; 3c1b: aa stosb byte ptr [rdi], al -;; 3c1c: 800100 add byte ptr [rcx], 0 -;; 3c1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3c28: 800100 add byte ptr [rcx], 0 -;; 3c2b: aa stosb byte ptr [rdi], al -;; 3c2c: 800100 add byte ptr [rcx], 0 -;; 3c2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3c38: 800100 add byte ptr [rcx], 0 -;; 3c3b: aa stosb byte ptr [rdi], al -;; 3c3c: 800100 add byte ptr [rcx], 0 -;; 3c3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3c48: 800100 add byte ptr [rcx], 0 -;; 3c4b: aa stosb byte ptr [rdi], al -;; 3c4c: 800100 add byte ptr [rcx], 0 -;; 3c4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3c58: 800100 add byte ptr [rcx], 0 -;; 3c5b: aa stosb byte ptr [rdi], al -;; 3c5c: 800100 add byte ptr [rcx], 0 -;; 3c5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3c68: 800100 add byte ptr [rcx], 0 -;; 3c6b: aa stosb byte ptr [rdi], al -;; 3c6c: 800100 add byte ptr [rcx], 0 -;; 3c6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3c78: 800100 add byte ptr [rcx], 0 -;; 3c7b: aa stosb byte ptr [rdi], al -;; 3c7c: 800100 add byte ptr [rcx], 0 -;; 3c7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3c88: 800100 add byte ptr [rcx], 0 -;; 3c8b: aa stosb byte ptr [rdi], al -;; 3c8c: 800100 add byte ptr [rcx], 0 -;; 3c8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3c98: 800100 add byte ptr [rcx], 0 -;; 3c9b: aa stosb byte ptr [rdi], al -;; 3c9c: 800100 add byte ptr [rcx], 0 -;; 3c9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3ca8: 800100 add byte ptr [rcx], 0 -;; 3cab: aa stosb byte ptr [rdi], al -;; 3cac: 800100 add byte ptr [rcx], 0 -;; 3caf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3cb8: 800100 add byte ptr [rcx], 0 -;; 3cbb: aa stosb byte ptr [rdi], al -;; 3cbc: 800100 add byte ptr [rcx], 0 -;; 3cbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3cc8: 800100 add byte ptr [rcx], 0 -;; 3ccb: aa stosb byte ptr [rdi], al -;; 3ccc: 800100 add byte ptr [rcx], 0 -;; 3ccf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3cd8: 800100 add byte ptr [rcx], 0 -;; 3cdb: aa stosb byte ptr [rdi], al -;; 3cdc: 800100 add byte ptr [rcx], 0 -;; 3cdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3ce8: 800100 add byte ptr [rcx], 0 -;; 3ceb: aa stosb byte ptr [rdi], al -;; 3cec: 800100 add byte ptr [rcx], 0 -;; 3cef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3cf8: 800100 add byte ptr [rcx], 0 -;; 3cfb: aa stosb byte ptr [rdi], al -;; 3cfc: 800100 add byte ptr [rcx], 0 -;; 3cff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3d08: 800100 add byte ptr [rcx], 0 -;; 3d0b: aa stosb byte ptr [rdi], al -;; 3d0c: 800100 add byte ptr [rcx], 0 -;; 3d0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3d18: 800100 add byte ptr [rcx], 0 -;; 3d1b: aa stosb byte ptr [rdi], al -;; 3d1c: 800100 add byte ptr [rcx], 0 -;; 3d1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3d28: 800100 add byte ptr [rcx], 0 -;; 3d2b: aa stosb byte ptr [rdi], al -;; 3d2c: 800100 add byte ptr [rcx], 0 -;; 3d2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3d38: 800100 add byte ptr [rcx], 0 -;; 3d3b: aa stosb byte ptr [rdi], al -;; 3d3c: 800100 add byte ptr [rcx], 0 -;; 3d3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3d48: 800100 add byte ptr [rcx], 0 -;; 3d4b: aa stosb byte ptr [rdi], al -;; 3d4c: 800100 add byte ptr [rcx], 0 -;; 3d4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3d58: 800100 add byte ptr [rcx], 0 -;; 3d5b: aa stosb byte ptr [rdi], al -;; 3d5c: 800100 add byte ptr [rcx], 0 -;; 3d5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3d68: 800100 add byte ptr [rcx], 0 -;; 3d6b: aa stosb byte ptr [rdi], al -;; 3d6c: 800100 add byte ptr [rcx], 0 -;; 3d6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3d78: 800100 add byte ptr [rcx], 0 -;; 3d7b: aa stosb byte ptr [rdi], al -;; 3d7c: 800100 add byte ptr [rcx], 0 -;; 3d7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3d88: 800100 add byte ptr [rcx], 0 -;; 3d8b: aa stosb byte ptr [rdi], al -;; 3d8c: 800100 add byte ptr [rcx], 0 -;; 3d8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3d98: 800100 add byte ptr [rcx], 0 -;; 3d9b: aa stosb byte ptr [rdi], al -;; 3d9c: 800100 add byte ptr [rcx], 0 -;; 3d9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3da8: 800100 add byte ptr [rcx], 0 -;; 3dab: aa stosb byte ptr [rdi], al -;; 3dac: 800100 add byte ptr [rcx], 0 -;; 3daf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3db8: 800100 add byte ptr [rcx], 0 -;; 3dbb: aa stosb byte ptr [rdi], al -;; 3dbc: 800100 add byte ptr [rcx], 0 -;; 3dbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3dc8: 800100 add byte ptr [rcx], 0 -;; 3dcb: aa stosb byte ptr [rdi], al -;; 3dcc: 800100 add byte ptr [rcx], 0 -;; 3dcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3dd8: 800100 add byte ptr [rcx], 0 -;; 3ddb: aa stosb byte ptr [rdi], al -;; 3ddc: 800100 add byte ptr [rcx], 0 -;; 3ddf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3de8: 800100 add byte ptr [rcx], 0 -;; 3deb: aa stosb byte ptr [rdi], al -;; 3dec: 800100 add byte ptr [rcx], 0 -;; 3def: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3df8: 800100 add byte ptr [rcx], 0 -;; 3dfb: aa stosb byte ptr [rdi], al -;; 3dfc: 800100 add byte ptr [rcx], 0 -;; 3dff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3e08: 800100 add byte ptr [rcx], 0 -;; 3e0b: aa stosb byte ptr [rdi], al -;; 3e0c: 800100 add byte ptr [rcx], 0 -;; 3e0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3e18: 800100 add byte ptr [rcx], 0 -;; 3e1b: aa stosb byte ptr [rdi], al -;; 3e1c: 800100 add byte ptr [rcx], 0 -;; 3e1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3e28: 800100 add byte ptr [rcx], 0 -;; 3e2b: aa stosb byte ptr [rdi], al -;; 3e2c: 800100 add byte ptr [rcx], 0 -;; 3e2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3e38: 800100 add byte ptr [rcx], 0 -;; 3e3b: aa stosb byte ptr [rdi], al -;; 3e3c: 800100 add byte ptr [rcx], 0 -;; 3e3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3e48: 800100 add byte ptr [rcx], 0 -;; 3e4b: aa stosb byte ptr [rdi], al -;; 3e4c: 800100 add byte ptr [rcx], 0 -;; 3e4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3e58: 800100 add byte ptr [rcx], 0 -;; 3e5b: aa stosb byte ptr [rdi], al -;; 3e5c: 800100 add byte ptr [rcx], 0 -;; 3e5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3e68: 800100 add byte ptr [rcx], 0 -;; 3e6b: aa stosb byte ptr [rdi], al -;; 3e6c: 800100 add byte ptr [rcx], 0 -;; 3e6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3e78: 800100 add byte ptr [rcx], 0 -;; 3e7b: aa stosb byte ptr [rdi], al -;; 3e7c: 800100 add byte ptr [rcx], 0 -;; 3e7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3e88: 800100 add byte ptr [rcx], 0 -;; 3e8b: aa stosb byte ptr [rdi], al -;; 3e8c: 800100 add byte ptr [rcx], 0 -;; 3e8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3e98: 800100 add byte ptr [rcx], 0 -;; 3e9b: aa stosb byte ptr [rdi], al -;; 3e9c: 800100 add byte ptr [rcx], 0 -;; 3e9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3ea8: 800100 add byte ptr [rcx], 0 -;; 3eab: aa stosb byte ptr [rdi], al -;; 3eac: 800100 add byte ptr [rcx], 0 -;; 3eaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3eb8: 800100 add byte ptr [rcx], 0 -;; 3ebb: aa stosb byte ptr [rdi], al -;; 3ebc: 800100 add byte ptr [rcx], 0 -;; 3ebf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3ec8: 800100 add byte ptr [rcx], 0 -;; 3ecb: aa stosb byte ptr [rdi], al -;; 3ecc: 800100 add byte ptr [rcx], 0 -;; 3ecf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3ed8: 800100 add byte ptr [rcx], 0 -;; 3edb: aa stosb byte ptr [rdi], al -;; 3edc: 800100 add byte ptr [rcx], 0 -;; 3edf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3ee8: 800100 add byte ptr [rcx], 0 -;; 3eeb: aa stosb byte ptr [rdi], al -;; 3eec: 800100 add byte ptr [rcx], 0 -;; 3eef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3ef8: 800100 add byte ptr [rcx], 0 -;; 3efb: aa stosb byte ptr [rdi], al -;; 3efc: 800100 add byte ptr [rcx], 0 -;; 3eff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3f08: 800100 add byte ptr [rcx], 0 -;; 3f0b: aa stosb byte ptr [rdi], al -;; 3f0c: 800100 add byte ptr [rcx], 0 -;; 3f0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3f18: 800100 add byte ptr [rcx], 0 -;; 3f1b: aa stosb byte ptr [rdi], al -;; 3f1c: 800100 add byte ptr [rcx], 0 -;; 3f1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3f28: 800100 add byte ptr [rcx], 0 -;; 3f2b: aa stosb byte ptr [rdi], al -;; 3f2c: 800100 add byte ptr [rcx], 0 -;; 3f2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3f38: 800100 add byte ptr [rcx], 0 -;; 3f3b: aa stosb byte ptr [rdi], al -;; 3f3c: 800100 add byte ptr [rcx], 0 -;; 3f3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3f48: 800100 add byte ptr [rcx], 0 -;; 3f4b: aa stosb byte ptr [rdi], al -;; 3f4c: 800100 add byte ptr [rcx], 0 -;; 3f4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3f58: 800100 add byte ptr [rcx], 0 -;; 3f5b: aa stosb byte ptr [rdi], al -;; 3f5c: 800100 add byte ptr [rcx], 0 -;; 3f5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3f68: 800100 add byte ptr [rcx], 0 -;; 3f6b: aa stosb byte ptr [rdi], al -;; 3f6c: 800100 add byte ptr [rcx], 0 -;; 3f6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3f78: 800100 add byte ptr [rcx], 0 -;; 3f7b: aa stosb byte ptr [rdi], al -;; 3f7c: 800100 add byte ptr [rcx], 0 -;; 3f7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3f88: 800100 add byte ptr [rcx], 0 -;; 3f8b: aa stosb byte ptr [rdi], al -;; 3f8c: 800100 add byte ptr [rcx], 0 -;; 3f8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3f98: 800100 add byte ptr [rcx], 0 -;; 3f9b: aa stosb byte ptr [rdi], al -;; 3f9c: 800100 add byte ptr [rcx], 0 -;; 3f9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3fa8: 800100 add byte ptr [rcx], 0 -;; 3fab: aa stosb byte ptr [rdi], al -;; 3fac: 800100 add byte ptr [rcx], 0 -;; 3faf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3fb8: 800100 add byte ptr [rcx], 0 -;; 3fbb: aa stosb byte ptr [rdi], al -;; 3fbc: 800100 add byte ptr [rcx], 0 -;; 3fbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3fc8: 800100 add byte ptr [rcx], 0 -;; 3fcb: aa stosb byte ptr [rdi], al -;; 3fcc: 800100 add byte ptr [rcx], 0 -;; 3fcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3fd8: 800100 add byte ptr [rcx], 0 -;; 3fdb: aa stosb byte ptr [rdi], al -;; 3fdc: 800100 add byte ptr [rcx], 0 -;; 3fdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3fe8: 800100 add byte ptr [rcx], 0 -;; 3feb: aa stosb byte ptr [rdi], al -;; 3fec: 800100 add byte ptr [rcx], 0 -;; 3fef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 3ff8: 800100 add byte ptr [rcx], 0 -;; 3ffb: aa stosb byte ptr [rdi], al -;; 3ffc: 800100 add byte ptr [rcx], 0 -;; 3fff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4008: 800100 add byte ptr [rcx], 0 -;; 400b: aa stosb byte ptr [rdi], al -;; 400c: 800100 add byte ptr [rcx], 0 -;; 400f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4018: 800100 add byte ptr [rcx], 0 -;; 401b: aa stosb byte ptr [rdi], al -;; 401c: 800100 add byte ptr [rcx], 0 -;; 401f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4028: 800100 add byte ptr [rcx], 0 -;; 402b: aa stosb byte ptr [rdi], al -;; 402c: 800100 add byte ptr [rcx], 0 -;; 402f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4038: 800100 add byte ptr [rcx], 0 -;; 403b: aa stosb byte ptr [rdi], al -;; 403c: 800100 add byte ptr [rcx], 0 -;; 403f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4048: 800100 add byte ptr [rcx], 0 -;; 404b: aa stosb byte ptr [rdi], al -;; 404c: 800100 add byte ptr [rcx], 0 -;; 404f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4058: 800100 add byte ptr [rcx], 0 -;; 405b: aa stosb byte ptr [rdi], al -;; 405c: 800100 add byte ptr [rcx], 0 -;; 405f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4068: 800100 add byte ptr [rcx], 0 -;; 406b: aa stosb byte ptr [rdi], al -;; 406c: 800100 add byte ptr [rcx], 0 -;; 406f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4078: 800100 add byte ptr [rcx], 0 -;; 407b: aa stosb byte ptr [rdi], al -;; 407c: 800100 add byte ptr [rcx], 0 -;; 407f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4088: 800100 add byte ptr [rcx], 0 -;; 408b: aa stosb byte ptr [rdi], al -;; 408c: 800100 add byte ptr [rcx], 0 -;; 408f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4098: 800100 add byte ptr [rcx], 0 -;; 409b: aa stosb byte ptr [rdi], al -;; 409c: 800100 add byte ptr [rcx], 0 -;; 409f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 40a8: 800100 add byte ptr [rcx], 0 -;; 40ab: aa stosb byte ptr [rdi], al -;; 40ac: 800100 add byte ptr [rcx], 0 -;; 40af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 40b8: 800100 add byte ptr [rcx], 0 -;; 40bb: aa stosb byte ptr [rdi], al -;; 40bc: 800100 add byte ptr [rcx], 0 -;; 40bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 40c8: 800100 add byte ptr [rcx], 0 -;; 40cb: aa stosb byte ptr [rdi], al -;; 40cc: 800100 add byte ptr [rcx], 0 -;; 40cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 40d8: 800100 add byte ptr [rcx], 0 -;; 40db: aa stosb byte ptr [rdi], al -;; 40dc: 800100 add byte ptr [rcx], 0 -;; 40df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 40e8: 800100 add byte ptr [rcx], 0 -;; 40eb: aa stosb byte ptr [rdi], al -;; 40ec: 800100 add byte ptr [rcx], 0 -;; 40ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 40f8: 800100 add byte ptr [rcx], 0 -;; 40fb: aa stosb byte ptr [rdi], al -;; 40fc: 800100 add byte ptr [rcx], 0 -;; 40ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4108: 800100 add byte ptr [rcx], 0 -;; 410b: aa stosb byte ptr [rdi], al -;; 410c: 800100 add byte ptr [rcx], 0 -;; 410f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4118: 800100 add byte ptr [rcx], 0 -;; 411b: aa stosb byte ptr [rdi], al -;; 411c: 800100 add byte ptr [rcx], 0 -;; 411f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4128: 800100 add byte ptr [rcx], 0 -;; 412b: aa stosb byte ptr [rdi], al -;; 412c: 800100 add byte ptr [rcx], 0 -;; 412f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4138: 800100 add byte ptr [rcx], 0 -;; 413b: aa stosb byte ptr [rdi], al -;; 413c: 800100 add byte ptr [rcx], 0 -;; 413f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4148: 800100 add byte ptr [rcx], 0 -;; 414b: aa stosb byte ptr [rdi], al -;; 414c: 800100 add byte ptr [rcx], 0 -;; 414f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4158: 800100 add byte ptr [rcx], 0 -;; 415b: aa stosb byte ptr [rdi], al -;; 415c: 800100 add byte ptr [rcx], 0 -;; 415f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4168: 800100 add byte ptr [rcx], 0 -;; 416b: aa stosb byte ptr [rdi], al -;; 416c: 800100 add byte ptr [rcx], 0 -;; 416f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4178: 800100 add byte ptr [rcx], 0 -;; 417b: aa stosb byte ptr [rdi], al -;; 417c: 800100 add byte ptr [rcx], 0 -;; 417f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4188: 800100 add byte ptr [rcx], 0 -;; 418b: aa stosb byte ptr [rdi], al -;; 418c: 800100 add byte ptr [rcx], 0 -;; 418f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4198: 800100 add byte ptr [rcx], 0 -;; 419b: aa stosb byte ptr [rdi], al -;; 419c: 800100 add byte ptr [rcx], 0 -;; 419f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 41a8: 800100 add byte ptr [rcx], 0 -;; 41ab: aa stosb byte ptr [rdi], al -;; 41ac: 800100 add byte ptr [rcx], 0 -;; 41af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 41b8: 800100 add byte ptr [rcx], 0 -;; 41bb: aa stosb byte ptr [rdi], al -;; 41bc: 800100 add byte ptr [rcx], 0 -;; 41bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 41c8: 800100 add byte ptr [rcx], 0 -;; 41cb: aa stosb byte ptr [rdi], al -;; 41cc: 800100 add byte ptr [rcx], 0 -;; 41cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 41d8: 800100 add byte ptr [rcx], 0 -;; 41db: aa stosb byte ptr [rdi], al -;; 41dc: 800100 add byte ptr [rcx], 0 -;; 41df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 41e8: 800100 add byte ptr [rcx], 0 -;; 41eb: aa stosb byte ptr [rdi], al -;; 41ec: 800100 add byte ptr [rcx], 0 -;; 41ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 41f8: 800100 add byte ptr [rcx], 0 -;; 41fb: aa stosb byte ptr [rdi], al -;; 41fc: 800100 add byte ptr [rcx], 0 -;; 41ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4208: 800100 add byte ptr [rcx], 0 -;; 420b: aa stosb byte ptr [rdi], al -;; 420c: 800100 add byte ptr [rcx], 0 -;; 420f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4218: 800100 add byte ptr [rcx], 0 -;; 421b: aa stosb byte ptr [rdi], al -;; 421c: 800100 add byte ptr [rcx], 0 -;; 421f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4228: 800100 add byte ptr [rcx], 0 -;; 422b: aa stosb byte ptr [rdi], al -;; 422c: 800100 add byte ptr [rcx], 0 -;; 422f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4238: 800100 add byte ptr [rcx], 0 -;; 423b: aa stosb byte ptr [rdi], al -;; 423c: 800100 add byte ptr [rcx], 0 -;; 423f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4248: 800100 add byte ptr [rcx], 0 -;; 424b: aa stosb byte ptr [rdi], al -;; 424c: 800100 add byte ptr [rcx], 0 -;; 424f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4258: 800100 add byte ptr [rcx], 0 -;; 425b: aa stosb byte ptr [rdi], al -;; 425c: 800100 add byte ptr [rcx], 0 -;; 425f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4268: 800100 add byte ptr [rcx], 0 -;; 426b: aa stosb byte ptr [rdi], al -;; 426c: 800100 add byte ptr [rcx], 0 -;; 426f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4278: 800100 add byte ptr [rcx], 0 -;; 427b: aa stosb byte ptr [rdi], al -;; 427c: 800100 add byte ptr [rcx], 0 -;; 427f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4288: 800100 add byte ptr [rcx], 0 -;; 428b: aa stosb byte ptr [rdi], al -;; 428c: 800100 add byte ptr [rcx], 0 -;; 428f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4298: 800100 add byte ptr [rcx], 0 -;; 429b: aa stosb byte ptr [rdi], al -;; 429c: 800100 add byte ptr [rcx], 0 -;; 429f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 42a8: 800100 add byte ptr [rcx], 0 -;; 42ab: aa stosb byte ptr [rdi], al -;; 42ac: 800100 add byte ptr [rcx], 0 -;; 42af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 42b8: 800100 add byte ptr [rcx], 0 -;; 42bb: aa stosb byte ptr [rdi], al -;; 42bc: 800100 add byte ptr [rcx], 0 -;; 42bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 42c8: 800100 add byte ptr [rcx], 0 -;; 42cb: aa stosb byte ptr [rdi], al -;; 42cc: 800100 add byte ptr [rcx], 0 -;; 42cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 42d8: 800100 add byte ptr [rcx], 0 -;; 42db: aa stosb byte ptr [rdi], al -;; 42dc: 800100 add byte ptr [rcx], 0 -;; 42df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 42e8: 800100 add byte ptr [rcx], 0 -;; 42eb: aa stosb byte ptr [rdi], al -;; 42ec: 800100 add byte ptr [rcx], 0 -;; 42ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 42f8: 800100 add byte ptr [rcx], 0 -;; 42fb: aa stosb byte ptr [rdi], al -;; 42fc: 800100 add byte ptr [rcx], 0 -;; 42ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4308: 800100 add byte ptr [rcx], 0 -;; 430b: aa stosb byte ptr [rdi], al -;; 430c: 800100 add byte ptr [rcx], 0 -;; 430f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4318: 800100 add byte ptr [rcx], 0 -;; 431b: aa stosb byte ptr [rdi], al -;; 431c: 800100 add byte ptr [rcx], 0 -;; 431f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4328: 800100 add byte ptr [rcx], 0 -;; 432b: aa stosb byte ptr [rdi], al -;; 432c: 800100 add byte ptr [rcx], 0 -;; 432f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4338: 800100 add byte ptr [rcx], 0 -;; 433b: aa stosb byte ptr [rdi], al -;; 433c: 800100 add byte ptr [rcx], 0 -;; 433f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4348: 800100 add byte ptr [rcx], 0 -;; 434b: aa stosb byte ptr [rdi], al -;; 434c: 800100 add byte ptr [rcx], 0 -;; 434f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4358: 800100 add byte ptr [rcx], 0 -;; 435b: aa stosb byte ptr [rdi], al -;; 435c: 800100 add byte ptr [rcx], 0 -;; 435f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4368: 800100 add byte ptr [rcx], 0 -;; 436b: aa stosb byte ptr [rdi], al -;; 436c: 800100 add byte ptr [rcx], 0 -;; 436f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4378: 800100 add byte ptr [rcx], 0 -;; 437b: aa stosb byte ptr [rdi], al -;; 437c: 800100 add byte ptr [rcx], 0 -;; 437f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4388: 800100 add byte ptr [rcx], 0 -;; 438b: aa stosb byte ptr [rdi], al -;; 438c: 800100 add byte ptr [rcx], 0 -;; 438f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4398: 800100 add byte ptr [rcx], 0 -;; 439b: aa stosb byte ptr [rdi], al -;; 439c: 800100 add byte ptr [rcx], 0 -;; 439f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 43a8: 800100 add byte ptr [rcx], 0 -;; 43ab: aa stosb byte ptr [rdi], al -;; 43ac: 800100 add byte ptr [rcx], 0 -;; 43af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 43b8: 800100 add byte ptr [rcx], 0 -;; 43bb: aa stosb byte ptr [rdi], al -;; 43bc: 800100 add byte ptr [rcx], 0 -;; 43bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 43c8: 800100 add byte ptr [rcx], 0 -;; 43cb: aa stosb byte ptr [rdi], al -;; 43cc: 800100 add byte ptr [rcx], 0 -;; 43cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 43d8: 800100 add byte ptr [rcx], 0 -;; 43db: aa stosb byte ptr [rdi], al -;; 43dc: 800100 add byte ptr [rcx], 0 -;; 43df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 43e8: 800100 add byte ptr [rcx], 0 -;; 43eb: aa stosb byte ptr [rdi], al -;; 43ec: 800100 add byte ptr [rcx], 0 -;; 43ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 43f8: 800100 add byte ptr [rcx], 0 -;; 43fb: aa stosb byte ptr [rdi], al -;; 43fc: 800100 add byte ptr [rcx], 0 -;; 43ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4408: 800100 add byte ptr [rcx], 0 -;; 440b: aa stosb byte ptr [rdi], al -;; 440c: 800100 add byte ptr [rcx], 0 -;; 440f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4418: 800100 add byte ptr [rcx], 0 -;; 441b: aa stosb byte ptr [rdi], al -;; 441c: 800100 add byte ptr [rcx], 0 -;; 441f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4428: 800100 add byte ptr [rcx], 0 -;; 442b: aa stosb byte ptr [rdi], al -;; 442c: 800100 add byte ptr [rcx], 0 -;; 442f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4438: 800100 add byte ptr [rcx], 0 -;; 443b: aa stosb byte ptr [rdi], al -;; 443c: 800100 add byte ptr [rcx], 0 -;; 443f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4448: 800100 add byte ptr [rcx], 0 -;; 444b: aa stosb byte ptr [rdi], al -;; 444c: 800100 add byte ptr [rcx], 0 -;; 444f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4458: 800100 add byte ptr [rcx], 0 -;; 445b: aa stosb byte ptr [rdi], al -;; 445c: 800100 add byte ptr [rcx], 0 -;; 445f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4468: 800100 add byte ptr [rcx], 0 -;; 446b: aa stosb byte ptr [rdi], al -;; 446c: 800100 add byte ptr [rcx], 0 -;; 446f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4478: 800100 add byte ptr [rcx], 0 -;; 447b: aa stosb byte ptr [rdi], al -;; 447c: 800100 add byte ptr [rcx], 0 -;; 447f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4488: 800100 add byte ptr [rcx], 0 -;; 448b: aa stosb byte ptr [rdi], al -;; 448c: 800100 add byte ptr [rcx], 0 -;; 448f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4498: 800100 add byte ptr [rcx], 0 -;; 449b: aa stosb byte ptr [rdi], al -;; 449c: 800100 add byte ptr [rcx], 0 -;; 449f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 44a8: 800100 add byte ptr [rcx], 0 -;; 44ab: aa stosb byte ptr [rdi], al -;; 44ac: 800100 add byte ptr [rcx], 0 -;; 44af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 44b8: 800100 add byte ptr [rcx], 0 -;; 44bb: aa stosb byte ptr [rdi], al -;; 44bc: 800100 add byte ptr [rcx], 0 -;; 44bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 44c8: 800100 add byte ptr [rcx], 0 -;; 44cb: aa stosb byte ptr [rdi], al -;; 44cc: 800100 add byte ptr [rcx], 0 -;; 44cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 44d8: 800100 add byte ptr [rcx], 0 -;; 44db: aa stosb byte ptr [rdi], al -;; 44dc: 800100 add byte ptr [rcx], 0 -;; 44df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 44e8: 800100 add byte ptr [rcx], 0 -;; 44eb: aa stosb byte ptr [rdi], al -;; 44ec: 800100 add byte ptr [rcx], 0 -;; 44ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 44f8: 800100 add byte ptr [rcx], 0 -;; 44fb: aa stosb byte ptr [rdi], al -;; 44fc: 800100 add byte ptr [rcx], 0 -;; 44ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4508: 800100 add byte ptr [rcx], 0 -;; 450b: aa stosb byte ptr [rdi], al -;; 450c: 800100 add byte ptr [rcx], 0 -;; 450f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4518: 800100 add byte ptr [rcx], 0 -;; 451b: aa stosb byte ptr [rdi], al -;; 451c: 800100 add byte ptr [rcx], 0 -;; 451f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4528: 800100 add byte ptr [rcx], 0 -;; 452b: aa stosb byte ptr [rdi], al -;; 452c: 800100 add byte ptr [rcx], 0 -;; 452f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4538: 800100 add byte ptr [rcx], 0 -;; 453b: aa stosb byte ptr [rdi], al -;; 453c: 800100 add byte ptr [rcx], 0 -;; 453f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4548: 800100 add byte ptr [rcx], 0 -;; 454b: aa stosb byte ptr [rdi], al -;; 454c: 800100 add byte ptr [rcx], 0 -;; 454f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4558: 800100 add byte ptr [rcx], 0 -;; 455b: aa stosb byte ptr [rdi], al -;; 455c: 800100 add byte ptr [rcx], 0 -;; 455f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4568: 800100 add byte ptr [rcx], 0 -;; 456b: aa stosb byte ptr [rdi], al -;; 456c: 800100 add byte ptr [rcx], 0 -;; 456f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4578: 800100 add byte ptr [rcx], 0 -;; 457b: aa stosb byte ptr [rdi], al -;; 457c: 800100 add byte ptr [rcx], 0 -;; 457f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4588: 800100 add byte ptr [rcx], 0 -;; 458b: aa stosb byte ptr [rdi], al -;; 458c: 800100 add byte ptr [rcx], 0 -;; 458f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4598: 800100 add byte ptr [rcx], 0 -;; 459b: aa stosb byte ptr [rdi], al -;; 459c: 800100 add byte ptr [rcx], 0 -;; 459f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 45a8: 800100 add byte ptr [rcx], 0 -;; 45ab: aa stosb byte ptr [rdi], al -;; 45ac: 800100 add byte ptr [rcx], 0 -;; 45af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 45b8: 800100 add byte ptr [rcx], 0 -;; 45bb: aa stosb byte ptr [rdi], al -;; 45bc: 800100 add byte ptr [rcx], 0 -;; 45bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 45c8: 800100 add byte ptr [rcx], 0 -;; 45cb: aa stosb byte ptr [rdi], al -;; 45cc: 800100 add byte ptr [rcx], 0 -;; 45cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 45d8: 800100 add byte ptr [rcx], 0 -;; 45db: aa stosb byte ptr [rdi], al -;; 45dc: 800100 add byte ptr [rcx], 0 -;; 45df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 45e8: 800100 add byte ptr [rcx], 0 -;; 45eb: aa stosb byte ptr [rdi], al -;; 45ec: 800100 add byte ptr [rcx], 0 -;; 45ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 45f8: 800100 add byte ptr [rcx], 0 -;; 45fb: aa stosb byte ptr [rdi], al -;; 45fc: 800100 add byte ptr [rcx], 0 -;; 45ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4608: 800100 add byte ptr [rcx], 0 -;; 460b: aa stosb byte ptr [rdi], al -;; 460c: 800100 add byte ptr [rcx], 0 -;; 460f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4618: 800100 add byte ptr [rcx], 0 -;; 461b: aa stosb byte ptr [rdi], al -;; 461c: 800100 add byte ptr [rcx], 0 -;; 461f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4628: 800100 add byte ptr [rcx], 0 -;; 462b: aa stosb byte ptr [rdi], al -;; 462c: 800100 add byte ptr [rcx], 0 -;; 462f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4638: 800100 add byte ptr [rcx], 0 -;; 463b: aa stosb byte ptr [rdi], al -;; 463c: 800100 add byte ptr [rcx], 0 -;; 463f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4648: 800100 add byte ptr [rcx], 0 -;; 464b: aa stosb byte ptr [rdi], al -;; 464c: 800100 add byte ptr [rcx], 0 -;; 464f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4658: 800100 add byte ptr [rcx], 0 -;; 465b: aa stosb byte ptr [rdi], al -;; 465c: 800100 add byte ptr [rcx], 0 -;; 465f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4668: 800100 add byte ptr [rcx], 0 -;; 466b: aa stosb byte ptr [rdi], al -;; 466c: 800100 add byte ptr [rcx], 0 -;; 466f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4678: 800100 add byte ptr [rcx], 0 -;; 467b: aa stosb byte ptr [rdi], al -;; 467c: 800100 add byte ptr [rcx], 0 -;; 467f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4688: 800100 add byte ptr [rcx], 0 -;; 468b: aa stosb byte ptr [rdi], al -;; 468c: 800100 add byte ptr [rcx], 0 -;; 468f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4698: 800100 add byte ptr [rcx], 0 -;; 469b: aa stosb byte ptr [rdi], al -;; 469c: 800100 add byte ptr [rcx], 0 -;; 469f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 46a8: 800100 add byte ptr [rcx], 0 -;; 46ab: aa stosb byte ptr [rdi], al -;; 46ac: 800100 add byte ptr [rcx], 0 -;; 46af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 46b8: 800100 add byte ptr [rcx], 0 -;; 46bb: aa stosb byte ptr [rdi], al -;; 46bc: 800100 add byte ptr [rcx], 0 -;; 46bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 46c8: 800100 add byte ptr [rcx], 0 -;; 46cb: aa stosb byte ptr [rdi], al -;; 46cc: 800100 add byte ptr [rcx], 0 -;; 46cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 46d8: 800100 add byte ptr [rcx], 0 -;; 46db: aa stosb byte ptr [rdi], al -;; 46dc: 800100 add byte ptr [rcx], 0 -;; 46df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 46e8: 800100 add byte ptr [rcx], 0 -;; 46eb: aa stosb byte ptr [rdi], al -;; 46ec: 800100 add byte ptr [rcx], 0 -;; 46ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 46f8: 800100 add byte ptr [rcx], 0 -;; 46fb: aa stosb byte ptr [rdi], al -;; 46fc: 800100 add byte ptr [rcx], 0 -;; 46ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4708: 800100 add byte ptr [rcx], 0 -;; 470b: aa stosb byte ptr [rdi], al -;; 470c: 800100 add byte ptr [rcx], 0 -;; 470f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4718: 800100 add byte ptr [rcx], 0 -;; 471b: aa stosb byte ptr [rdi], al -;; 471c: 800100 add byte ptr [rcx], 0 -;; 471f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4728: 800100 add byte ptr [rcx], 0 -;; 472b: aa stosb byte ptr [rdi], al -;; 472c: 800100 add byte ptr [rcx], 0 -;; 472f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4738: 800100 add byte ptr [rcx], 0 -;; 473b: aa stosb byte ptr [rdi], al -;; 473c: 800100 add byte ptr [rcx], 0 -;; 473f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4748: 800100 add byte ptr [rcx], 0 -;; 474b: aa stosb byte ptr [rdi], al -;; 474c: 800100 add byte ptr [rcx], 0 -;; 474f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4758: 800100 add byte ptr [rcx], 0 -;; 475b: aa stosb byte ptr [rdi], al -;; 475c: 800100 add byte ptr [rcx], 0 -;; 475f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4768: 800100 add byte ptr [rcx], 0 -;; 476b: aa stosb byte ptr [rdi], al -;; 476c: 800100 add byte ptr [rcx], 0 -;; 476f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4778: 800100 add byte ptr [rcx], 0 -;; 477b: aa stosb byte ptr [rdi], al -;; 477c: 800100 add byte ptr [rcx], 0 -;; 477f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4788: 800100 add byte ptr [rcx], 0 -;; 478b: aa stosb byte ptr [rdi], al -;; 478c: 800100 add byte ptr [rcx], 0 -;; 478f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4798: 800100 add byte ptr [rcx], 0 -;; 479b: aa stosb byte ptr [rdi], al -;; 479c: 800100 add byte ptr [rcx], 0 -;; 479f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 47a8: 800100 add byte ptr [rcx], 0 -;; 47ab: aa stosb byte ptr [rdi], al -;; 47ac: 800100 add byte ptr [rcx], 0 -;; 47af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 47b8: 800100 add byte ptr [rcx], 0 -;; 47bb: aa stosb byte ptr [rdi], al -;; 47bc: 800100 add byte ptr [rcx], 0 -;; 47bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 47c8: 800100 add byte ptr [rcx], 0 -;; 47cb: aa stosb byte ptr [rdi], al -;; 47cc: 800100 add byte ptr [rcx], 0 -;; 47cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 47d8: 800100 add byte ptr [rcx], 0 -;; 47db: aa stosb byte ptr [rdi], al -;; 47dc: 800100 add byte ptr [rcx], 0 -;; 47df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 47e8: 800100 add byte ptr [rcx], 0 -;; 47eb: aa stosb byte ptr [rdi], al -;; 47ec: 800100 add byte ptr [rcx], 0 -;; 47ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 47f8: 800100 add byte ptr [rcx], 0 -;; 47fb: aa stosb byte ptr [rdi], al -;; 47fc: 800100 add byte ptr [rcx], 0 -;; 47ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4808: 800100 add byte ptr [rcx], 0 -;; 480b: aa stosb byte ptr [rdi], al -;; 480c: 800100 add byte ptr [rcx], 0 -;; 480f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4818: 800100 add byte ptr [rcx], 0 -;; 481b: aa stosb byte ptr [rdi], al -;; 481c: 800100 add byte ptr [rcx], 0 -;; 481f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4828: 800100 add byte ptr [rcx], 0 -;; 482b: aa stosb byte ptr [rdi], al -;; 482c: 800100 add byte ptr [rcx], 0 -;; 482f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4838: 800100 add byte ptr [rcx], 0 -;; 483b: aa stosb byte ptr [rdi], al -;; 483c: 800100 add byte ptr [rcx], 0 -;; 483f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4848: 800100 add byte ptr [rcx], 0 -;; 484b: aa stosb byte ptr [rdi], al -;; 484c: 800100 add byte ptr [rcx], 0 -;; 484f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4858: 800100 add byte ptr [rcx], 0 -;; 485b: aa stosb byte ptr [rdi], al -;; 485c: 800100 add byte ptr [rcx], 0 -;; 485f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4868: 800100 add byte ptr [rcx], 0 -;; 486b: aa stosb byte ptr [rdi], al -;; 486c: 800100 add byte ptr [rcx], 0 -;; 486f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4878: 800100 add byte ptr [rcx], 0 -;; 487b: aa stosb byte ptr [rdi], al -;; 487c: 800100 add byte ptr [rcx], 0 -;; 487f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4888: 800100 add byte ptr [rcx], 0 -;; 488b: aa stosb byte ptr [rdi], al -;; 488c: 800100 add byte ptr [rcx], 0 -;; 488f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4898: 800100 add byte ptr [rcx], 0 -;; 489b: aa stosb byte ptr [rdi], al -;; 489c: 800100 add byte ptr [rcx], 0 -;; 489f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 48a8: 800100 add byte ptr [rcx], 0 -;; 48ab: aa stosb byte ptr [rdi], al -;; 48ac: 800100 add byte ptr [rcx], 0 -;; 48af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 48b8: 800100 add byte ptr [rcx], 0 -;; 48bb: aa stosb byte ptr [rdi], al -;; 48bc: 800100 add byte ptr [rcx], 0 -;; 48bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 48c8: 800100 add byte ptr [rcx], 0 -;; 48cb: aa stosb byte ptr [rdi], al -;; 48cc: 800100 add byte ptr [rcx], 0 -;; 48cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 48d8: 800100 add byte ptr [rcx], 0 -;; 48db: aa stosb byte ptr [rdi], al -;; 48dc: 800100 add byte ptr [rcx], 0 -;; 48df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 48e8: 800100 add byte ptr [rcx], 0 -;; 48eb: aa stosb byte ptr [rdi], al -;; 48ec: 800100 add byte ptr [rcx], 0 -;; 48ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 48f8: 800100 add byte ptr [rcx], 0 -;; 48fb: aa stosb byte ptr [rdi], al -;; 48fc: 800100 add byte ptr [rcx], 0 -;; 48ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4908: 800100 add byte ptr [rcx], 0 -;; 490b: aa stosb byte ptr [rdi], al -;; 490c: 800100 add byte ptr [rcx], 0 -;; 490f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4918: 800100 add byte ptr [rcx], 0 -;; 491b: aa stosb byte ptr [rdi], al -;; 491c: 800100 add byte ptr [rcx], 0 -;; 491f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4928: 800100 add byte ptr [rcx], 0 -;; 492b: aa stosb byte ptr [rdi], al -;; 492c: 800100 add byte ptr [rcx], 0 -;; 492f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4938: 800100 add byte ptr [rcx], 0 -;; 493b: aa stosb byte ptr [rdi], al -;; 493c: 800100 add byte ptr [rcx], 0 -;; 493f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4948: 800100 add byte ptr [rcx], 0 -;; 494b: aa stosb byte ptr [rdi], al -;; 494c: 800100 add byte ptr [rcx], 0 -;; 494f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4958: 800100 add byte ptr [rcx], 0 -;; 495b: aa stosb byte ptr [rdi], al -;; 495c: 800100 add byte ptr [rcx], 0 -;; 495f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4968: 800100 add byte ptr [rcx], 0 -;; 496b: aa stosb byte ptr [rdi], al -;; 496c: 800100 add byte ptr [rcx], 0 -;; 496f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4978: 800100 add byte ptr [rcx], 0 -;; 497b: aa stosb byte ptr [rdi], al -;; 497c: 800100 add byte ptr [rcx], 0 -;; 497f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4988: 800100 add byte ptr [rcx], 0 -;; 498b: aa stosb byte ptr [rdi], al -;; 498c: 800100 add byte ptr [rcx], 0 -;; 498f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4998: 800100 add byte ptr [rcx], 0 -;; 499b: aa stosb byte ptr [rdi], al -;; 499c: 800100 add byte ptr [rcx], 0 -;; 499f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 49a8: 800100 add byte ptr [rcx], 0 -;; 49ab: aa stosb byte ptr [rdi], al -;; 49ac: 800100 add byte ptr [rcx], 0 -;; 49af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 49b8: 800100 add byte ptr [rcx], 0 -;; 49bb: aa stosb byte ptr [rdi], al -;; 49bc: 800100 add byte ptr [rcx], 0 -;; 49bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 49c8: 800100 add byte ptr [rcx], 0 -;; 49cb: aa stosb byte ptr [rdi], al -;; 49cc: 800100 add byte ptr [rcx], 0 -;; 49cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 49d8: 800100 add byte ptr [rcx], 0 -;; 49db: aa stosb byte ptr [rdi], al -;; 49dc: 800100 add byte ptr [rcx], 0 -;; 49df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 49e8: 800100 add byte ptr [rcx], 0 -;; 49eb: aa stosb byte ptr [rdi], al -;; 49ec: 800100 add byte ptr [rcx], 0 -;; 49ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 49f8: 800100 add byte ptr [rcx], 0 -;; 49fb: aa stosb byte ptr [rdi], al -;; 49fc: 800100 add byte ptr [rcx], 0 -;; 49ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4a08: 800100 add byte ptr [rcx], 0 -;; 4a0b: aa stosb byte ptr [rdi], al -;; 4a0c: 800100 add byte ptr [rcx], 0 -;; 4a0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4a18: 800100 add byte ptr [rcx], 0 -;; 4a1b: aa stosb byte ptr [rdi], al -;; 4a1c: 800100 add byte ptr [rcx], 0 -;; 4a1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4a28: 800100 add byte ptr [rcx], 0 -;; 4a2b: aa stosb byte ptr [rdi], al -;; 4a2c: 800100 add byte ptr [rcx], 0 -;; 4a2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4a38: 800100 add byte ptr [rcx], 0 -;; 4a3b: aa stosb byte ptr [rdi], al -;; 4a3c: 800100 add byte ptr [rcx], 0 -;; 4a3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4a48: 800100 add byte ptr [rcx], 0 -;; 4a4b: aa stosb byte ptr [rdi], al -;; 4a4c: 800100 add byte ptr [rcx], 0 -;; 4a4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4a58: 800100 add byte ptr [rcx], 0 -;; 4a5b: aa stosb byte ptr [rdi], al -;; 4a5c: 800100 add byte ptr [rcx], 0 -;; 4a5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4a68: 800100 add byte ptr [rcx], 0 -;; 4a6b: aa stosb byte ptr [rdi], al -;; 4a6c: 800100 add byte ptr [rcx], 0 -;; 4a6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4a78: 800100 add byte ptr [rcx], 0 -;; 4a7b: aa stosb byte ptr [rdi], al -;; 4a7c: 800100 add byte ptr [rcx], 0 -;; 4a7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4a88: 800100 add byte ptr [rcx], 0 -;; 4a8b: aa stosb byte ptr [rdi], al -;; 4a8c: 800100 add byte ptr [rcx], 0 -;; 4a8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4a98: 800100 add byte ptr [rcx], 0 -;; 4a9b: aa stosb byte ptr [rdi], al -;; 4a9c: 800100 add byte ptr [rcx], 0 -;; 4a9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4aa8: 800100 add byte ptr [rcx], 0 -;; 4aab: aa stosb byte ptr [rdi], al -;; 4aac: 800100 add byte ptr [rcx], 0 -;; 4aaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4ab8: 800100 add byte ptr [rcx], 0 -;; 4abb: aa stosb byte ptr [rdi], al -;; 4abc: 800100 add byte ptr [rcx], 0 -;; 4abf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4ac8: 800100 add byte ptr [rcx], 0 -;; 4acb: aa stosb byte ptr [rdi], al -;; 4acc: 800100 add byte ptr [rcx], 0 -;; 4acf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4ad8: 800100 add byte ptr [rcx], 0 -;; 4adb: aa stosb byte ptr [rdi], al -;; 4adc: 800100 add byte ptr [rcx], 0 -;; 4adf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4ae8: 800100 add byte ptr [rcx], 0 -;; 4aeb: aa stosb byte ptr [rdi], al -;; 4aec: 800100 add byte ptr [rcx], 0 -;; 4aef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4af8: 800100 add byte ptr [rcx], 0 -;; 4afb: aa stosb byte ptr [rdi], al -;; 4afc: 800100 add byte ptr [rcx], 0 -;; 4aff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4b08: 800100 add byte ptr [rcx], 0 -;; 4b0b: aa stosb byte ptr [rdi], al -;; 4b0c: 800100 add byte ptr [rcx], 0 -;; 4b0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4b18: 800100 add byte ptr [rcx], 0 -;; 4b1b: aa stosb byte ptr [rdi], al -;; 4b1c: 800100 add byte ptr [rcx], 0 -;; 4b1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4b28: 800100 add byte ptr [rcx], 0 -;; 4b2b: aa stosb byte ptr [rdi], al -;; 4b2c: 800100 add byte ptr [rcx], 0 -;; 4b2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4b38: 800100 add byte ptr [rcx], 0 -;; 4b3b: aa stosb byte ptr [rdi], al -;; 4b3c: 800100 add byte ptr [rcx], 0 -;; 4b3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4b48: 800100 add byte ptr [rcx], 0 -;; 4b4b: aa stosb byte ptr [rdi], al -;; 4b4c: 800100 add byte ptr [rcx], 0 -;; 4b4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4b58: 800100 add byte ptr [rcx], 0 -;; 4b5b: aa stosb byte ptr [rdi], al -;; 4b5c: 800100 add byte ptr [rcx], 0 -;; 4b5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4b68: 800100 add byte ptr [rcx], 0 -;; 4b6b: aa stosb byte ptr [rdi], al -;; 4b6c: 800100 add byte ptr [rcx], 0 -;; 4b6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4b78: 800100 add byte ptr [rcx], 0 -;; 4b7b: aa stosb byte ptr [rdi], al -;; 4b7c: 800100 add byte ptr [rcx], 0 -;; 4b7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4b88: 800100 add byte ptr [rcx], 0 -;; 4b8b: aa stosb byte ptr [rdi], al -;; 4b8c: 800100 add byte ptr [rcx], 0 -;; 4b8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4b98: 800100 add byte ptr [rcx], 0 -;; 4b9b: aa stosb byte ptr [rdi], al -;; 4b9c: 800100 add byte ptr [rcx], 0 -;; 4b9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4ba8: 800100 add byte ptr [rcx], 0 -;; 4bab: aa stosb byte ptr [rdi], al -;; 4bac: 800100 add byte ptr [rcx], 0 -;; 4baf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4bb8: 800100 add byte ptr [rcx], 0 -;; 4bbb: aa stosb byte ptr [rdi], al -;; 4bbc: 800100 add byte ptr [rcx], 0 -;; 4bbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4bc8: 800100 add byte ptr [rcx], 0 -;; 4bcb: aa stosb byte ptr [rdi], al -;; 4bcc: 800100 add byte ptr [rcx], 0 -;; 4bcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4bd8: 800100 add byte ptr [rcx], 0 -;; 4bdb: aa stosb byte ptr [rdi], al -;; 4bdc: 800100 add byte ptr [rcx], 0 -;; 4bdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4be8: 800100 add byte ptr [rcx], 0 -;; 4beb: aa stosb byte ptr [rdi], al -;; 4bec: 800100 add byte ptr [rcx], 0 -;; 4bef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4bf8: 800100 add byte ptr [rcx], 0 -;; 4bfb: aa stosb byte ptr [rdi], al -;; 4bfc: 800100 add byte ptr [rcx], 0 -;; 4bff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4c08: 800100 add byte ptr [rcx], 0 -;; 4c0b: aa stosb byte ptr [rdi], al -;; 4c0c: 800100 add byte ptr [rcx], 0 -;; 4c0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4c18: 800100 add byte ptr [rcx], 0 -;; 4c1b: aa stosb byte ptr [rdi], al -;; 4c1c: 800100 add byte ptr [rcx], 0 -;; 4c1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4c28: 800100 add byte ptr [rcx], 0 -;; 4c2b: aa stosb byte ptr [rdi], al -;; 4c2c: 800100 add byte ptr [rcx], 0 -;; 4c2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4c38: 800100 add byte ptr [rcx], 0 -;; 4c3b: aa stosb byte ptr [rdi], al -;; 4c3c: 800100 add byte ptr [rcx], 0 -;; 4c3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4c48: 800100 add byte ptr [rcx], 0 -;; 4c4b: aa stosb byte ptr [rdi], al -;; 4c4c: 800100 add byte ptr [rcx], 0 -;; 4c4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4c58: 800100 add byte ptr [rcx], 0 -;; 4c5b: aa stosb byte ptr [rdi], al -;; 4c5c: 800100 add byte ptr [rcx], 0 -;; 4c5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4c68: 800100 add byte ptr [rcx], 0 -;; 4c6b: aa stosb byte ptr [rdi], al -;; 4c6c: 800100 add byte ptr [rcx], 0 -;; 4c6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4c78: 800100 add byte ptr [rcx], 0 -;; 4c7b: aa stosb byte ptr [rdi], al -;; 4c7c: 800100 add byte ptr [rcx], 0 -;; 4c7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4c88: 800100 add byte ptr [rcx], 0 -;; 4c8b: aa stosb byte ptr [rdi], al -;; 4c8c: 800100 add byte ptr [rcx], 0 -;; 4c8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4c98: 800100 add byte ptr [rcx], 0 -;; 4c9b: aa stosb byte ptr [rdi], al -;; 4c9c: 800100 add byte ptr [rcx], 0 -;; 4c9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4ca8: 800100 add byte ptr [rcx], 0 -;; 4cab: aa stosb byte ptr [rdi], al -;; 4cac: 800100 add byte ptr [rcx], 0 -;; 4caf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4cb8: 800100 add byte ptr [rcx], 0 -;; 4cbb: aa stosb byte ptr [rdi], al -;; 4cbc: 800100 add byte ptr [rcx], 0 -;; 4cbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4cc8: 800100 add byte ptr [rcx], 0 -;; 4ccb: aa stosb byte ptr [rdi], al -;; 4ccc: 800100 add byte ptr [rcx], 0 -;; 4ccf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4cd8: 800100 add byte ptr [rcx], 0 -;; 4cdb: aa stosb byte ptr [rdi], al -;; 4cdc: 800100 add byte ptr [rcx], 0 -;; 4cdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4ce8: 800100 add byte ptr [rcx], 0 -;; 4ceb: aa stosb byte ptr [rdi], al -;; 4cec: 800100 add byte ptr [rcx], 0 -;; 4cef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4cf8: 800100 add byte ptr [rcx], 0 -;; 4cfb: aa stosb byte ptr [rdi], al -;; 4cfc: 800100 add byte ptr [rcx], 0 -;; 4cff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4d08: 800100 add byte ptr [rcx], 0 -;; 4d0b: aa stosb byte ptr [rdi], al -;; 4d0c: 800100 add byte ptr [rcx], 0 -;; 4d0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4d18: 800100 add byte ptr [rcx], 0 -;; 4d1b: aa stosb byte ptr [rdi], al -;; 4d1c: 800100 add byte ptr [rcx], 0 -;; 4d1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4d28: 800100 add byte ptr [rcx], 0 -;; 4d2b: aa stosb byte ptr [rdi], al -;; 4d2c: 800100 add byte ptr [rcx], 0 -;; 4d2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4d38: 800100 add byte ptr [rcx], 0 -;; 4d3b: aa stosb byte ptr [rdi], al -;; 4d3c: 800100 add byte ptr [rcx], 0 -;; 4d3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4d48: 800100 add byte ptr [rcx], 0 -;; 4d4b: aa stosb byte ptr [rdi], al -;; 4d4c: 800100 add byte ptr [rcx], 0 -;; 4d4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4d58: 800100 add byte ptr [rcx], 0 -;; 4d5b: aa stosb byte ptr [rdi], al -;; 4d5c: 800100 add byte ptr [rcx], 0 -;; 4d5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4d68: 800100 add byte ptr [rcx], 0 -;; 4d6b: aa stosb byte ptr [rdi], al -;; 4d6c: 800100 add byte ptr [rcx], 0 -;; 4d6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4d78: 800100 add byte ptr [rcx], 0 -;; 4d7b: aa stosb byte ptr [rdi], al -;; 4d7c: 800100 add byte ptr [rcx], 0 -;; 4d7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4d88: 800100 add byte ptr [rcx], 0 -;; 4d8b: aa stosb byte ptr [rdi], al -;; 4d8c: 800100 add byte ptr [rcx], 0 -;; 4d8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4d98: 800100 add byte ptr [rcx], 0 -;; 4d9b: aa stosb byte ptr [rdi], al -;; 4d9c: 800100 add byte ptr [rcx], 0 -;; 4d9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4da8: 800100 add byte ptr [rcx], 0 -;; 4dab: aa stosb byte ptr [rdi], al -;; 4dac: 800100 add byte ptr [rcx], 0 -;; 4daf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4db8: 800100 add byte ptr [rcx], 0 -;; 4dbb: aa stosb byte ptr [rdi], al -;; 4dbc: 800100 add byte ptr [rcx], 0 -;; 4dbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4dc8: 800100 add byte ptr [rcx], 0 -;; 4dcb: aa stosb byte ptr [rdi], al -;; 4dcc: 800100 add byte ptr [rcx], 0 -;; 4dcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4dd8: 800100 add byte ptr [rcx], 0 -;; 4ddb: aa stosb byte ptr [rdi], al -;; 4ddc: 800100 add byte ptr [rcx], 0 -;; 4ddf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4de8: 800100 add byte ptr [rcx], 0 -;; 4deb: aa stosb byte ptr [rdi], al -;; 4dec: 800100 add byte ptr [rcx], 0 -;; 4def: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4df8: 800100 add byte ptr [rcx], 0 -;; 4dfb: aa stosb byte ptr [rdi], al -;; 4dfc: 800100 add byte ptr [rcx], 0 -;; 4dff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4e08: 800100 add byte ptr [rcx], 0 -;; 4e0b: aa stosb byte ptr [rdi], al -;; 4e0c: 800100 add byte ptr [rcx], 0 -;; 4e0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4e18: 800100 add byte ptr [rcx], 0 -;; 4e1b: aa stosb byte ptr [rdi], al -;; 4e1c: 800100 add byte ptr [rcx], 0 -;; 4e1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4e28: 800100 add byte ptr [rcx], 0 -;; 4e2b: aa stosb byte ptr [rdi], al -;; 4e2c: 800100 add byte ptr [rcx], 0 -;; 4e2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4e38: 800100 add byte ptr [rcx], 0 -;; 4e3b: aa stosb byte ptr [rdi], al -;; 4e3c: 800100 add byte ptr [rcx], 0 -;; 4e3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4e48: 800100 add byte ptr [rcx], 0 -;; 4e4b: aa stosb byte ptr [rdi], al -;; 4e4c: 800100 add byte ptr [rcx], 0 -;; 4e4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4e58: 800100 add byte ptr [rcx], 0 -;; 4e5b: aa stosb byte ptr [rdi], al -;; 4e5c: 800100 add byte ptr [rcx], 0 -;; 4e5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4e68: 800100 add byte ptr [rcx], 0 -;; 4e6b: aa stosb byte ptr [rdi], al -;; 4e6c: 800100 add byte ptr [rcx], 0 -;; 4e6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4e78: 800100 add byte ptr [rcx], 0 -;; 4e7b: aa stosb byte ptr [rdi], al -;; 4e7c: 800100 add byte ptr [rcx], 0 -;; 4e7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4e88: 800100 add byte ptr [rcx], 0 -;; 4e8b: aa stosb byte ptr [rdi], al -;; 4e8c: 800100 add byte ptr [rcx], 0 -;; 4e8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4e98: 800100 add byte ptr [rcx], 0 -;; 4e9b: aa stosb byte ptr [rdi], al -;; 4e9c: 800100 add byte ptr [rcx], 0 -;; 4e9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4ea8: 800100 add byte ptr [rcx], 0 -;; 4eab: aa stosb byte ptr [rdi], al -;; 4eac: 800100 add byte ptr [rcx], 0 -;; 4eaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4eb8: 800100 add byte ptr [rcx], 0 -;; 4ebb: aa stosb byte ptr [rdi], al -;; 4ebc: 800100 add byte ptr [rcx], 0 -;; 4ebf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4ec8: 800100 add byte ptr [rcx], 0 -;; 4ecb: aa stosb byte ptr [rdi], al -;; 4ecc: 800100 add byte ptr [rcx], 0 -;; 4ecf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4ed8: 800100 add byte ptr [rcx], 0 -;; 4edb: aa stosb byte ptr [rdi], al -;; 4edc: 800100 add byte ptr [rcx], 0 -;; 4edf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4ee8: 800100 add byte ptr [rcx], 0 -;; 4eeb: aa stosb byte ptr [rdi], al -;; 4eec: 800100 add byte ptr [rcx], 0 -;; 4eef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4ef8: 800100 add byte ptr [rcx], 0 -;; 4efb: aa stosb byte ptr [rdi], al -;; 4efc: 800100 add byte ptr [rcx], 0 -;; 4eff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4f08: 800100 add byte ptr [rcx], 0 -;; 4f0b: aa stosb byte ptr [rdi], al -;; 4f0c: 800100 add byte ptr [rcx], 0 -;; 4f0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4f18: 800100 add byte ptr [rcx], 0 -;; 4f1b: aa stosb byte ptr [rdi], al -;; 4f1c: 800100 add byte ptr [rcx], 0 -;; 4f1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4f28: 800100 add byte ptr [rcx], 0 -;; 4f2b: aa stosb byte ptr [rdi], al -;; 4f2c: 800100 add byte ptr [rcx], 0 -;; 4f2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4f38: 800100 add byte ptr [rcx], 0 -;; 4f3b: aa stosb byte ptr [rdi], al -;; 4f3c: 800100 add byte ptr [rcx], 0 -;; 4f3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4f48: 800100 add byte ptr [rcx], 0 -;; 4f4b: aa stosb byte ptr [rdi], al -;; 4f4c: 800100 add byte ptr [rcx], 0 -;; 4f4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4f58: 800100 add byte ptr [rcx], 0 -;; 4f5b: aa stosb byte ptr [rdi], al -;; 4f5c: 800100 add byte ptr [rcx], 0 -;; 4f5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4f68: 800100 add byte ptr [rcx], 0 -;; 4f6b: aa stosb byte ptr [rdi], al -;; 4f6c: 800100 add byte ptr [rcx], 0 -;; 4f6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4f78: 800100 add byte ptr [rcx], 0 -;; 4f7b: aa stosb byte ptr [rdi], al -;; 4f7c: 800100 add byte ptr [rcx], 0 -;; 4f7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4f88: 800100 add byte ptr [rcx], 0 -;; 4f8b: aa stosb byte ptr [rdi], al -;; 4f8c: 800100 add byte ptr [rcx], 0 -;; 4f8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4f98: 800100 add byte ptr [rcx], 0 -;; 4f9b: aa stosb byte ptr [rdi], al -;; 4f9c: 800100 add byte ptr [rcx], 0 -;; 4f9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4fa8: 800100 add byte ptr [rcx], 0 -;; 4fab: aa stosb byte ptr [rdi], al -;; 4fac: 800100 add byte ptr [rcx], 0 -;; 4faf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4fb8: 800100 add byte ptr [rcx], 0 -;; 4fbb: aa stosb byte ptr [rdi], al -;; 4fbc: 800100 add byte ptr [rcx], 0 -;; 4fbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4fc8: 800100 add byte ptr [rcx], 0 -;; 4fcb: aa stosb byte ptr [rdi], al -;; 4fcc: 800100 add byte ptr [rcx], 0 -;; 4fcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4fd8: 800100 add byte ptr [rcx], 0 -;; 4fdb: aa stosb byte ptr [rdi], al -;; 4fdc: 800100 add byte ptr [rcx], 0 -;; 4fdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4fe8: 800100 add byte ptr [rcx], 0 -;; 4feb: aa stosb byte ptr [rdi], al -;; 4fec: 800100 add byte ptr [rcx], 0 -;; 4fef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 4ff8: 800100 add byte ptr [rcx], 0 -;; 4ffb: aa stosb byte ptr [rdi], al -;; 4ffc: 800100 add byte ptr [rcx], 0 -;; 4fff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5008: 800100 add byte ptr [rcx], 0 -;; 500b: aa stosb byte ptr [rdi], al -;; 500c: 800100 add byte ptr [rcx], 0 -;; 500f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5018: 800100 add byte ptr [rcx], 0 -;; 501b: aa stosb byte ptr [rdi], al -;; 501c: 800100 add byte ptr [rcx], 0 -;; 501f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5028: 800100 add byte ptr [rcx], 0 -;; 502b: aa stosb byte ptr [rdi], al -;; 502c: 800100 add byte ptr [rcx], 0 -;; 502f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5038: 800100 add byte ptr [rcx], 0 -;; 503b: aa stosb byte ptr [rdi], al -;; 503c: 800100 add byte ptr [rcx], 0 -;; 503f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5048: 800100 add byte ptr [rcx], 0 -;; 504b: aa stosb byte ptr [rdi], al -;; 504c: 800100 add byte ptr [rcx], 0 -;; 504f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5058: 800100 add byte ptr [rcx], 0 -;; 505b: aa stosb byte ptr [rdi], al -;; 505c: 800100 add byte ptr [rcx], 0 -;; 505f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5068: 800100 add byte ptr [rcx], 0 -;; 506b: aa stosb byte ptr [rdi], al -;; 506c: 800100 add byte ptr [rcx], 0 -;; 506f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5078: 800100 add byte ptr [rcx], 0 -;; 507b: aa stosb byte ptr [rdi], al -;; 507c: 800100 add byte ptr [rcx], 0 -;; 507f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5088: 800100 add byte ptr [rcx], 0 -;; 508b: aa stosb byte ptr [rdi], al -;; 508c: 800100 add byte ptr [rcx], 0 -;; 508f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5098: 800100 add byte ptr [rcx], 0 -;; 509b: aa stosb byte ptr [rdi], al -;; 509c: 800100 add byte ptr [rcx], 0 -;; 509f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 50a8: 800100 add byte ptr [rcx], 0 -;; 50ab: aa stosb byte ptr [rdi], al -;; 50ac: 800100 add byte ptr [rcx], 0 -;; 50af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 50b8: 800100 add byte ptr [rcx], 0 -;; 50bb: aa stosb byte ptr [rdi], al -;; 50bc: 800100 add byte ptr [rcx], 0 -;; 50bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 50c8: 800100 add byte ptr [rcx], 0 -;; 50cb: aa stosb byte ptr [rdi], al -;; 50cc: 800100 add byte ptr [rcx], 0 -;; 50cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 50d8: 800100 add byte ptr [rcx], 0 -;; 50db: aa stosb byte ptr [rdi], al -;; 50dc: 800100 add byte ptr [rcx], 0 -;; 50df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 50e8: 800100 add byte ptr [rcx], 0 -;; 50eb: aa stosb byte ptr [rdi], al -;; 50ec: 800100 add byte ptr [rcx], 0 -;; 50ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 50f8: 800100 add byte ptr [rcx], 0 -;; 50fb: aa stosb byte ptr [rdi], al -;; 50fc: 800100 add byte ptr [rcx], 0 -;; 50ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5108: 800100 add byte ptr [rcx], 0 -;; 510b: aa stosb byte ptr [rdi], al -;; 510c: 800100 add byte ptr [rcx], 0 -;; 510f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5118: 800100 add byte ptr [rcx], 0 -;; 511b: aa stosb byte ptr [rdi], al -;; 511c: 800100 add byte ptr [rcx], 0 -;; 511f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5128: 800100 add byte ptr [rcx], 0 -;; 512b: aa stosb byte ptr [rdi], al -;; 512c: 800100 add byte ptr [rcx], 0 -;; 512f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5138: 800100 add byte ptr [rcx], 0 -;; 513b: aa stosb byte ptr [rdi], al -;; 513c: 800100 add byte ptr [rcx], 0 -;; 513f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5148: 800100 add byte ptr [rcx], 0 -;; 514b: aa stosb byte ptr [rdi], al -;; 514c: 800100 add byte ptr [rcx], 0 -;; 514f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5158: 800100 add byte ptr [rcx], 0 -;; 515b: aa stosb byte ptr [rdi], al -;; 515c: 800100 add byte ptr [rcx], 0 -;; 515f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5168: 800100 add byte ptr [rcx], 0 -;; 516b: aa stosb byte ptr [rdi], al -;; 516c: 800100 add byte ptr [rcx], 0 -;; 516f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5178: 800100 add byte ptr [rcx], 0 -;; 517b: aa stosb byte ptr [rdi], al -;; 517c: 800100 add byte ptr [rcx], 0 -;; 517f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5188: 800100 add byte ptr [rcx], 0 -;; 518b: aa stosb byte ptr [rdi], al -;; 518c: 800100 add byte ptr [rcx], 0 -;; 518f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5198: 800100 add byte ptr [rcx], 0 -;; 519b: aa stosb byte ptr [rdi], al -;; 519c: 800100 add byte ptr [rcx], 0 -;; 519f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 51a8: 800100 add byte ptr [rcx], 0 -;; 51ab: aa stosb byte ptr [rdi], al -;; 51ac: 800100 add byte ptr [rcx], 0 -;; 51af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 51b8: 800100 add byte ptr [rcx], 0 -;; 51bb: aa stosb byte ptr [rdi], al -;; 51bc: 800100 add byte ptr [rcx], 0 -;; 51bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 51c8: 800100 add byte ptr [rcx], 0 -;; 51cb: aa stosb byte ptr [rdi], al -;; 51cc: 800100 add byte ptr [rcx], 0 -;; 51cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 51d8: 800100 add byte ptr [rcx], 0 -;; 51db: aa stosb byte ptr [rdi], al -;; 51dc: 800100 add byte ptr [rcx], 0 -;; 51df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 51e8: 800100 add byte ptr [rcx], 0 -;; 51eb: aa stosb byte ptr [rdi], al -;; 51ec: 800100 add byte ptr [rcx], 0 -;; 51ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 51f8: 800100 add byte ptr [rcx], 0 -;; 51fb: aa stosb byte ptr [rdi], al -;; 51fc: 800100 add byte ptr [rcx], 0 -;; 51ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5208: 800100 add byte ptr [rcx], 0 -;; 520b: aa stosb byte ptr [rdi], al -;; 520c: 800100 add byte ptr [rcx], 0 -;; 520f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5218: 800100 add byte ptr [rcx], 0 -;; 521b: aa stosb byte ptr [rdi], al -;; 521c: 800100 add byte ptr [rcx], 0 -;; 521f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5228: 800100 add byte ptr [rcx], 0 -;; 522b: aa stosb byte ptr [rdi], al -;; 522c: 800100 add byte ptr [rcx], 0 -;; 522f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5238: 800100 add byte ptr [rcx], 0 -;; 523b: aa stosb byte ptr [rdi], al -;; 523c: 800100 add byte ptr [rcx], 0 -;; 523f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5248: 800100 add byte ptr [rcx], 0 -;; 524b: aa stosb byte ptr [rdi], al -;; 524c: 800100 add byte ptr [rcx], 0 -;; 524f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5258: 800100 add byte ptr [rcx], 0 -;; 525b: aa stosb byte ptr [rdi], al -;; 525c: 800100 add byte ptr [rcx], 0 -;; 525f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5268: 800100 add byte ptr [rcx], 0 -;; 526b: aa stosb byte ptr [rdi], al -;; 526c: 800100 add byte ptr [rcx], 0 -;; 526f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5278: 800100 add byte ptr [rcx], 0 -;; 527b: aa stosb byte ptr [rdi], al -;; 527c: 800100 add byte ptr [rcx], 0 -;; 527f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5288: 800100 add byte ptr [rcx], 0 -;; 528b: aa stosb byte ptr [rdi], al -;; 528c: 800100 add byte ptr [rcx], 0 -;; 528f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5298: 800100 add byte ptr [rcx], 0 -;; 529b: aa stosb byte ptr [rdi], al -;; 529c: 800100 add byte ptr [rcx], 0 -;; 529f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 52a8: 800100 add byte ptr [rcx], 0 -;; 52ab: aa stosb byte ptr [rdi], al -;; 52ac: 800100 add byte ptr [rcx], 0 -;; 52af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 52b8: 800100 add byte ptr [rcx], 0 -;; 52bb: aa stosb byte ptr [rdi], al -;; 52bc: 800100 add byte ptr [rcx], 0 -;; 52bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 52c8: 800100 add byte ptr [rcx], 0 -;; 52cb: aa stosb byte ptr [rdi], al -;; 52cc: 800100 add byte ptr [rcx], 0 -;; 52cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 52d8: 800100 add byte ptr [rcx], 0 -;; 52db: aa stosb byte ptr [rdi], al -;; 52dc: 800100 add byte ptr [rcx], 0 -;; 52df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 52e8: 800100 add byte ptr [rcx], 0 -;; 52eb: aa stosb byte ptr [rdi], al -;; 52ec: 800100 add byte ptr [rcx], 0 -;; 52ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 52f8: 800100 add byte ptr [rcx], 0 -;; 52fb: aa stosb byte ptr [rdi], al -;; 52fc: 800100 add byte ptr [rcx], 0 -;; 52ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5308: 800100 add byte ptr [rcx], 0 -;; 530b: aa stosb byte ptr [rdi], al -;; 530c: 800100 add byte ptr [rcx], 0 -;; 530f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5318: 800100 add byte ptr [rcx], 0 -;; 531b: aa stosb byte ptr [rdi], al -;; 531c: 800100 add byte ptr [rcx], 0 -;; 531f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5328: 800100 add byte ptr [rcx], 0 -;; 532b: aa stosb byte ptr [rdi], al -;; 532c: 800100 add byte ptr [rcx], 0 -;; 532f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5338: 800100 add byte ptr [rcx], 0 -;; 533b: aa stosb byte ptr [rdi], al -;; 533c: 800100 add byte ptr [rcx], 0 -;; 533f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5348: 800100 add byte ptr [rcx], 0 -;; 534b: aa stosb byte ptr [rdi], al -;; 534c: 800100 add byte ptr [rcx], 0 -;; 534f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5358: 800100 add byte ptr [rcx], 0 -;; 535b: aa stosb byte ptr [rdi], al -;; 535c: 800100 add byte ptr [rcx], 0 -;; 535f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5368: 800100 add byte ptr [rcx], 0 -;; 536b: aa stosb byte ptr [rdi], al -;; 536c: 800100 add byte ptr [rcx], 0 -;; 536f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5378: 800100 add byte ptr [rcx], 0 -;; 537b: aa stosb byte ptr [rdi], al -;; 537c: 800100 add byte ptr [rcx], 0 -;; 537f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5388: 800100 add byte ptr [rcx], 0 -;; 538b: aa stosb byte ptr [rdi], al -;; 538c: 800100 add byte ptr [rcx], 0 -;; 538f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5398: 800100 add byte ptr [rcx], 0 -;; 539b: aa stosb byte ptr [rdi], al -;; 539c: 800100 add byte ptr [rcx], 0 -;; 539f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 53a8: 800100 add byte ptr [rcx], 0 -;; 53ab: aa stosb byte ptr [rdi], al -;; 53ac: 800100 add byte ptr [rcx], 0 -;; 53af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 53b8: 800100 add byte ptr [rcx], 0 -;; 53bb: aa stosb byte ptr [rdi], al -;; 53bc: 800100 add byte ptr [rcx], 0 -;; 53bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 53c8: 800100 add byte ptr [rcx], 0 -;; 53cb: aa stosb byte ptr [rdi], al -;; 53cc: 800100 add byte ptr [rcx], 0 -;; 53cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 53d8: 800100 add byte ptr [rcx], 0 -;; 53db: aa stosb byte ptr [rdi], al -;; 53dc: 800100 add byte ptr [rcx], 0 -;; 53df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 53e8: 800100 add byte ptr [rcx], 0 -;; 53eb: aa stosb byte ptr [rdi], al -;; 53ec: 800100 add byte ptr [rcx], 0 -;; 53ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 53f8: 800100 add byte ptr [rcx], 0 -;; 53fb: aa stosb byte ptr [rdi], al -;; 53fc: 800100 add byte ptr [rcx], 0 -;; 53ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5408: 800100 add byte ptr [rcx], 0 -;; 540b: aa stosb byte ptr [rdi], al -;; 540c: 800100 add byte ptr [rcx], 0 -;; 540f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5418: 800100 add byte ptr [rcx], 0 -;; 541b: aa stosb byte ptr [rdi], al -;; 541c: 800100 add byte ptr [rcx], 0 -;; 541f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5428: 800100 add byte ptr [rcx], 0 -;; 542b: aa stosb byte ptr [rdi], al -;; 542c: 800100 add byte ptr [rcx], 0 -;; 542f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5438: 800100 add byte ptr [rcx], 0 -;; 543b: aa stosb byte ptr [rdi], al -;; 543c: 800100 add byte ptr [rcx], 0 -;; 543f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5448: 800100 add byte ptr [rcx], 0 -;; 544b: aa stosb byte ptr [rdi], al -;; 544c: 800100 add byte ptr [rcx], 0 -;; 544f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5458: 800100 add byte ptr [rcx], 0 -;; 545b: aa stosb byte ptr [rdi], al -;; 545c: 800100 add byte ptr [rcx], 0 -;; 545f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5468: 800100 add byte ptr [rcx], 0 -;; 546b: aa stosb byte ptr [rdi], al -;; 546c: 800100 add byte ptr [rcx], 0 -;; 546f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5478: 800100 add byte ptr [rcx], 0 -;; 547b: aa stosb byte ptr [rdi], al -;; 547c: 800100 add byte ptr [rcx], 0 -;; 547f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5488: 800100 add byte ptr [rcx], 0 -;; 548b: aa stosb byte ptr [rdi], al -;; 548c: 800100 add byte ptr [rcx], 0 -;; 548f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5498: 800100 add byte ptr [rcx], 0 -;; 549b: aa stosb byte ptr [rdi], al -;; 549c: 800100 add byte ptr [rcx], 0 -;; 549f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 54a8: 800100 add byte ptr [rcx], 0 -;; 54ab: aa stosb byte ptr [rdi], al -;; 54ac: 800100 add byte ptr [rcx], 0 -;; 54af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 54b8: 800100 add byte ptr [rcx], 0 -;; 54bb: aa stosb byte ptr [rdi], al -;; 54bc: 800100 add byte ptr [rcx], 0 -;; 54bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 54c8: 800100 add byte ptr [rcx], 0 -;; 54cb: aa stosb byte ptr [rdi], al -;; 54cc: 800100 add byte ptr [rcx], 0 -;; 54cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 54d8: 800100 add byte ptr [rcx], 0 -;; 54db: aa stosb byte ptr [rdi], al -;; 54dc: 800100 add byte ptr [rcx], 0 -;; 54df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 54e8: 800100 add byte ptr [rcx], 0 -;; 54eb: aa stosb byte ptr [rdi], al -;; 54ec: 800100 add byte ptr [rcx], 0 -;; 54ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 54f8: 800100 add byte ptr [rcx], 0 -;; 54fb: aa stosb byte ptr [rdi], al -;; 54fc: 800100 add byte ptr [rcx], 0 -;; 54ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5508: 800100 add byte ptr [rcx], 0 -;; 550b: aa stosb byte ptr [rdi], al -;; 550c: 800100 add byte ptr [rcx], 0 -;; 550f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5518: 800100 add byte ptr [rcx], 0 -;; 551b: aa stosb byte ptr [rdi], al -;; 551c: 800100 add byte ptr [rcx], 0 -;; 551f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5528: 800100 add byte ptr [rcx], 0 -;; 552b: aa stosb byte ptr [rdi], al -;; 552c: 800100 add byte ptr [rcx], 0 -;; 552f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5538: 800100 add byte ptr [rcx], 0 -;; 553b: aa stosb byte ptr [rdi], al -;; 553c: 800100 add byte ptr [rcx], 0 -;; 553f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5548: 800100 add byte ptr [rcx], 0 -;; 554b: aa stosb byte ptr [rdi], al -;; 554c: 800100 add byte ptr [rcx], 0 -;; 554f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5558: 800100 add byte ptr [rcx], 0 -;; 555b: aa stosb byte ptr [rdi], al -;; 555c: 800100 add byte ptr [rcx], 0 -;; 555f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5568: 800100 add byte ptr [rcx], 0 -;; 556b: aa stosb byte ptr [rdi], al -;; 556c: 800100 add byte ptr [rcx], 0 -;; 556f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5578: 800100 add byte ptr [rcx], 0 -;; 557b: aa stosb byte ptr [rdi], al -;; 557c: 800100 add byte ptr [rcx], 0 -;; 557f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5588: 800100 add byte ptr [rcx], 0 -;; 558b: aa stosb byte ptr [rdi], al -;; 558c: 800100 add byte ptr [rcx], 0 -;; 558f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5598: 800100 add byte ptr [rcx], 0 -;; 559b: aa stosb byte ptr [rdi], al -;; 559c: 800100 add byte ptr [rcx], 0 -;; 559f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 55a8: 800100 add byte ptr [rcx], 0 -;; 55ab: aa stosb byte ptr [rdi], al -;; 55ac: 800100 add byte ptr [rcx], 0 -;; 55af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 55b8: 800100 add byte ptr [rcx], 0 -;; 55bb: aa stosb byte ptr [rdi], al -;; 55bc: 800100 add byte ptr [rcx], 0 -;; 55bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 55c8: 800100 add byte ptr [rcx], 0 -;; 55cb: aa stosb byte ptr [rdi], al -;; 55cc: 800100 add byte ptr [rcx], 0 -;; 55cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 55d8: 800100 add byte ptr [rcx], 0 -;; 55db: aa stosb byte ptr [rdi], al -;; 55dc: 800100 add byte ptr [rcx], 0 -;; 55df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 55e8: 800100 add byte ptr [rcx], 0 -;; 55eb: aa stosb byte ptr [rdi], al -;; 55ec: 800100 add byte ptr [rcx], 0 -;; 55ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 55f8: 800100 add byte ptr [rcx], 0 -;; 55fb: aa stosb byte ptr [rdi], al -;; 55fc: 800100 add byte ptr [rcx], 0 -;; 55ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5608: 800100 add byte ptr [rcx], 0 -;; 560b: aa stosb byte ptr [rdi], al -;; 560c: 800100 add byte ptr [rcx], 0 -;; 560f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5618: 800100 add byte ptr [rcx], 0 -;; 561b: aa stosb byte ptr [rdi], al -;; 561c: 800100 add byte ptr [rcx], 0 -;; 561f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5628: 800100 add byte ptr [rcx], 0 -;; 562b: aa stosb byte ptr [rdi], al -;; 562c: 800100 add byte ptr [rcx], 0 -;; 562f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5638: 800100 add byte ptr [rcx], 0 -;; 563b: aa stosb byte ptr [rdi], al -;; 563c: 800100 add byte ptr [rcx], 0 -;; 563f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5648: 800100 add byte ptr [rcx], 0 -;; 564b: aa stosb byte ptr [rdi], al -;; 564c: 800100 add byte ptr [rcx], 0 -;; 564f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5658: 800100 add byte ptr [rcx], 0 -;; 565b: aa stosb byte ptr [rdi], al -;; 565c: 800100 add byte ptr [rcx], 0 -;; 565f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5668: 800100 add byte ptr [rcx], 0 -;; 566b: aa stosb byte ptr [rdi], al -;; 566c: 800100 add byte ptr [rcx], 0 -;; 566f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5678: 800100 add byte ptr [rcx], 0 -;; 567b: aa stosb byte ptr [rdi], al -;; 567c: 800100 add byte ptr [rcx], 0 -;; 567f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5688: 800100 add byte ptr [rcx], 0 -;; 568b: aa stosb byte ptr [rdi], al -;; 568c: 800100 add byte ptr [rcx], 0 -;; 568f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5698: 800100 add byte ptr [rcx], 0 -;; 569b: aa stosb byte ptr [rdi], al -;; 569c: 800100 add byte ptr [rcx], 0 -;; 569f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 56a8: 800100 add byte ptr [rcx], 0 -;; 56ab: aa stosb byte ptr [rdi], al -;; 56ac: 800100 add byte ptr [rcx], 0 -;; 56af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 56b8: 800100 add byte ptr [rcx], 0 -;; 56bb: aa stosb byte ptr [rdi], al -;; 56bc: 800100 add byte ptr [rcx], 0 -;; 56bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 56c8: 800100 add byte ptr [rcx], 0 -;; 56cb: aa stosb byte ptr [rdi], al -;; 56cc: 800100 add byte ptr [rcx], 0 -;; 56cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 56d8: 800100 add byte ptr [rcx], 0 -;; 56db: aa stosb byte ptr [rdi], al -;; 56dc: 800100 add byte ptr [rcx], 0 -;; 56df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 56e8: 800100 add byte ptr [rcx], 0 -;; 56eb: aa stosb byte ptr [rdi], al -;; 56ec: 800100 add byte ptr [rcx], 0 -;; 56ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 56f8: 800100 add byte ptr [rcx], 0 -;; 56fb: aa stosb byte ptr [rdi], al -;; 56fc: 800100 add byte ptr [rcx], 0 -;; 56ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5708: 800100 add byte ptr [rcx], 0 -;; 570b: aa stosb byte ptr [rdi], al -;; 570c: 800100 add byte ptr [rcx], 0 -;; 570f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5718: 800100 add byte ptr [rcx], 0 -;; 571b: aa stosb byte ptr [rdi], al -;; 571c: 800100 add byte ptr [rcx], 0 -;; 571f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5728: 800100 add byte ptr [rcx], 0 -;; 572b: aa stosb byte ptr [rdi], al -;; 572c: 800100 add byte ptr [rcx], 0 -;; 572f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5738: 800100 add byte ptr [rcx], 0 -;; 573b: aa stosb byte ptr [rdi], al -;; 573c: 800100 add byte ptr [rcx], 0 -;; 573f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5748: 800100 add byte ptr [rcx], 0 -;; 574b: aa stosb byte ptr [rdi], al -;; 574c: 800100 add byte ptr [rcx], 0 -;; 574f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5758: 800100 add byte ptr [rcx], 0 -;; 575b: aa stosb byte ptr [rdi], al -;; 575c: 800100 add byte ptr [rcx], 0 -;; 575f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5768: 800100 add byte ptr [rcx], 0 -;; 576b: aa stosb byte ptr [rdi], al -;; 576c: 800100 add byte ptr [rcx], 0 -;; 576f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5778: 800100 add byte ptr [rcx], 0 -;; 577b: aa stosb byte ptr [rdi], al -;; 577c: 800100 add byte ptr [rcx], 0 -;; 577f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5788: 800100 add byte ptr [rcx], 0 -;; 578b: aa stosb byte ptr [rdi], al -;; 578c: 800100 add byte ptr [rcx], 0 -;; 578f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5798: 800100 add byte ptr [rcx], 0 -;; 579b: aa stosb byte ptr [rdi], al -;; 579c: 800100 add byte ptr [rcx], 0 -;; 579f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 57a8: 800100 add byte ptr [rcx], 0 -;; 57ab: aa stosb byte ptr [rdi], al -;; 57ac: 800100 add byte ptr [rcx], 0 -;; 57af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 57b8: 800100 add byte ptr [rcx], 0 -;; 57bb: aa stosb byte ptr [rdi], al -;; 57bc: 800100 add byte ptr [rcx], 0 -;; 57bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 57c8: 800100 add byte ptr [rcx], 0 -;; 57cb: aa stosb byte ptr [rdi], al -;; 57cc: 800100 add byte ptr [rcx], 0 -;; 57cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 57d8: 800100 add byte ptr [rcx], 0 -;; 57db: aa stosb byte ptr [rdi], al -;; 57dc: 800100 add byte ptr [rcx], 0 -;; 57df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 57e8: 800100 add byte ptr [rcx], 0 -;; 57eb: aa stosb byte ptr [rdi], al -;; 57ec: 800100 add byte ptr [rcx], 0 -;; 57ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 57f8: 800100 add byte ptr [rcx], 0 -;; 57fb: aa stosb byte ptr [rdi], al -;; 57fc: 800100 add byte ptr [rcx], 0 -;; 57ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5808: 800100 add byte ptr [rcx], 0 -;; 580b: aa stosb byte ptr [rdi], al -;; 580c: 800100 add byte ptr [rcx], 0 -;; 580f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5818: 800100 add byte ptr [rcx], 0 -;; 581b: aa stosb byte ptr [rdi], al -;; 581c: 800100 add byte ptr [rcx], 0 -;; 581f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5828: 800100 add byte ptr [rcx], 0 -;; 582b: aa stosb byte ptr [rdi], al -;; 582c: 800100 add byte ptr [rcx], 0 -;; 582f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5838: 800100 add byte ptr [rcx], 0 -;; 583b: aa stosb byte ptr [rdi], al -;; 583c: 800100 add byte ptr [rcx], 0 -;; 583f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5848: 800100 add byte ptr [rcx], 0 -;; 584b: aa stosb byte ptr [rdi], al -;; 584c: 800100 add byte ptr [rcx], 0 -;; 584f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5858: 800100 add byte ptr [rcx], 0 -;; 585b: aa stosb byte ptr [rdi], al -;; 585c: 800100 add byte ptr [rcx], 0 -;; 585f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5868: 800100 add byte ptr [rcx], 0 -;; 586b: aa stosb byte ptr [rdi], al -;; 586c: 800100 add byte ptr [rcx], 0 -;; 586f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5878: 800100 add byte ptr [rcx], 0 -;; 587b: aa stosb byte ptr [rdi], al -;; 587c: 800100 add byte ptr [rcx], 0 -;; 587f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5888: 800100 add byte ptr [rcx], 0 -;; 588b: aa stosb byte ptr [rdi], al -;; 588c: 800100 add byte ptr [rcx], 0 -;; 588f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5898: 800100 add byte ptr [rcx], 0 -;; 589b: aa stosb byte ptr [rdi], al -;; 589c: 800100 add byte ptr [rcx], 0 -;; 589f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 58a8: 800100 add byte ptr [rcx], 0 -;; 58ab: aa stosb byte ptr [rdi], al -;; 58ac: 800100 add byte ptr [rcx], 0 -;; 58af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 58b8: 800100 add byte ptr [rcx], 0 -;; 58bb: aa stosb byte ptr [rdi], al -;; 58bc: 800100 add byte ptr [rcx], 0 -;; 58bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 58c8: 800100 add byte ptr [rcx], 0 -;; 58cb: aa stosb byte ptr [rdi], al -;; 58cc: 800100 add byte ptr [rcx], 0 -;; 58cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 58d8: 800100 add byte ptr [rcx], 0 -;; 58db: aa stosb byte ptr [rdi], al -;; 58dc: 800100 add byte ptr [rcx], 0 -;; 58df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 58e8: 800100 add byte ptr [rcx], 0 -;; 58eb: aa stosb byte ptr [rdi], al -;; 58ec: 800100 add byte ptr [rcx], 0 -;; 58ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 58f8: 800100 add byte ptr [rcx], 0 -;; 58fb: aa stosb byte ptr [rdi], al -;; 58fc: 800100 add byte ptr [rcx], 0 -;; 58ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5908: 800100 add byte ptr [rcx], 0 -;; 590b: aa stosb byte ptr [rdi], al -;; 590c: 800100 add byte ptr [rcx], 0 -;; 590f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5918: 800100 add byte ptr [rcx], 0 -;; 591b: aa stosb byte ptr [rdi], al -;; 591c: 800100 add byte ptr [rcx], 0 -;; 591f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5928: 800100 add byte ptr [rcx], 0 -;; 592b: aa stosb byte ptr [rdi], al -;; 592c: 800100 add byte ptr [rcx], 0 -;; 592f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5938: 800100 add byte ptr [rcx], 0 -;; 593b: aa stosb byte ptr [rdi], al -;; 593c: 800100 add byte ptr [rcx], 0 -;; 593f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5948: 800100 add byte ptr [rcx], 0 -;; 594b: aa stosb byte ptr [rdi], al -;; 594c: 800100 add byte ptr [rcx], 0 -;; 594f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5958: 800100 add byte ptr [rcx], 0 -;; 595b: aa stosb byte ptr [rdi], al -;; 595c: 800100 add byte ptr [rcx], 0 -;; 595f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5968: 800100 add byte ptr [rcx], 0 -;; 596b: aa stosb byte ptr [rdi], al -;; 596c: 800100 add byte ptr [rcx], 0 -;; 596f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5978: 800100 add byte ptr [rcx], 0 -;; 597b: aa stosb byte ptr [rdi], al -;; 597c: 800100 add byte ptr [rcx], 0 -;; 597f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5988: 800100 add byte ptr [rcx], 0 -;; 598b: aa stosb byte ptr [rdi], al -;; 598c: 800100 add byte ptr [rcx], 0 -;; 598f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5998: 800100 add byte ptr [rcx], 0 -;; 599b: aa stosb byte ptr [rdi], al -;; 599c: 800100 add byte ptr [rcx], 0 -;; 599f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 59a8: 800100 add byte ptr [rcx], 0 -;; 59ab: aa stosb byte ptr [rdi], al -;; 59ac: 800100 add byte ptr [rcx], 0 -;; 59af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 59b8: 800100 add byte ptr [rcx], 0 -;; 59bb: aa stosb byte ptr [rdi], al -;; 59bc: 800100 add byte ptr [rcx], 0 -;; 59bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 59c8: 800100 add byte ptr [rcx], 0 -;; 59cb: aa stosb byte ptr [rdi], al -;; 59cc: 800100 add byte ptr [rcx], 0 -;; 59cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 59d8: 800100 add byte ptr [rcx], 0 -;; 59db: aa stosb byte ptr [rdi], al -;; 59dc: 800100 add byte ptr [rcx], 0 -;; 59df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 59e8: 800100 add byte ptr [rcx], 0 -;; 59eb: aa stosb byte ptr [rdi], al -;; 59ec: 800100 add byte ptr [rcx], 0 -;; 59ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 59f8: 800100 add byte ptr [rcx], 0 -;; 59fb: aa stosb byte ptr [rdi], al -;; 59fc: 800100 add byte ptr [rcx], 0 -;; 59ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5a08: 800100 add byte ptr [rcx], 0 -;; 5a0b: aa stosb byte ptr [rdi], al -;; 5a0c: 800100 add byte ptr [rcx], 0 -;; 5a0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5a18: 800100 add byte ptr [rcx], 0 -;; 5a1b: aa stosb byte ptr [rdi], al -;; 5a1c: 800100 add byte ptr [rcx], 0 -;; 5a1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5a28: 800100 add byte ptr [rcx], 0 -;; 5a2b: aa stosb byte ptr [rdi], al -;; 5a2c: 800100 add byte ptr [rcx], 0 -;; 5a2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5a38: 800100 add byte ptr [rcx], 0 -;; 5a3b: aa stosb byte ptr [rdi], al -;; 5a3c: 800100 add byte ptr [rcx], 0 -;; 5a3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5a48: 800100 add byte ptr [rcx], 0 -;; 5a4b: aa stosb byte ptr [rdi], al -;; 5a4c: 800100 add byte ptr [rcx], 0 -;; 5a4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5a58: 800100 add byte ptr [rcx], 0 -;; 5a5b: aa stosb byte ptr [rdi], al -;; 5a5c: 800100 add byte ptr [rcx], 0 -;; 5a5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5a68: 800100 add byte ptr [rcx], 0 -;; 5a6b: aa stosb byte ptr [rdi], al -;; 5a6c: 800100 add byte ptr [rcx], 0 -;; 5a6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5a78: 800100 add byte ptr [rcx], 0 -;; 5a7b: aa stosb byte ptr [rdi], al -;; 5a7c: 800100 add byte ptr [rcx], 0 -;; 5a7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5a88: 800100 add byte ptr [rcx], 0 -;; 5a8b: aa stosb byte ptr [rdi], al -;; 5a8c: 800100 add byte ptr [rcx], 0 -;; 5a8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5a98: 800100 add byte ptr [rcx], 0 -;; 5a9b: aa stosb byte ptr [rdi], al -;; 5a9c: 800100 add byte ptr [rcx], 0 -;; 5a9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5aa8: 800100 add byte ptr [rcx], 0 -;; 5aab: aa stosb byte ptr [rdi], al -;; 5aac: 800100 add byte ptr [rcx], 0 -;; 5aaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5ab8: 800100 add byte ptr [rcx], 0 -;; 5abb: aa stosb byte ptr [rdi], al -;; 5abc: 800100 add byte ptr [rcx], 0 -;; 5abf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5ac8: 800100 add byte ptr [rcx], 0 -;; 5acb: aa stosb byte ptr [rdi], al -;; 5acc: 800100 add byte ptr [rcx], 0 -;; 5acf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5ad8: 800100 add byte ptr [rcx], 0 -;; 5adb: aa stosb byte ptr [rdi], al -;; 5adc: 800100 add byte ptr [rcx], 0 -;; 5adf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5ae8: 800100 add byte ptr [rcx], 0 -;; 5aeb: aa stosb byte ptr [rdi], al -;; 5aec: 800100 add byte ptr [rcx], 0 -;; 5aef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5af8: 800100 add byte ptr [rcx], 0 -;; 5afb: aa stosb byte ptr [rdi], al -;; 5afc: 800100 add byte ptr [rcx], 0 -;; 5aff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5b08: 800100 add byte ptr [rcx], 0 -;; 5b0b: aa stosb byte ptr [rdi], al -;; 5b0c: 800100 add byte ptr [rcx], 0 -;; 5b0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5b18: 800100 add byte ptr [rcx], 0 -;; 5b1b: aa stosb byte ptr [rdi], al -;; 5b1c: 800100 add byte ptr [rcx], 0 -;; 5b1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5b28: 800100 add byte ptr [rcx], 0 -;; 5b2b: aa stosb byte ptr [rdi], al -;; 5b2c: 800100 add byte ptr [rcx], 0 -;; 5b2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5b38: 800100 add byte ptr [rcx], 0 -;; 5b3b: aa stosb byte ptr [rdi], al -;; 5b3c: 800100 add byte ptr [rcx], 0 -;; 5b3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5b48: 800100 add byte ptr [rcx], 0 -;; 5b4b: aa stosb byte ptr [rdi], al -;; 5b4c: 800100 add byte ptr [rcx], 0 -;; 5b4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5b58: 800100 add byte ptr [rcx], 0 -;; 5b5b: aa stosb byte ptr [rdi], al -;; 5b5c: 800100 add byte ptr [rcx], 0 -;; 5b5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5b68: 800100 add byte ptr [rcx], 0 -;; 5b6b: aa stosb byte ptr [rdi], al -;; 5b6c: 800100 add byte ptr [rcx], 0 -;; 5b6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5b78: 800100 add byte ptr [rcx], 0 -;; 5b7b: aa stosb byte ptr [rdi], al -;; 5b7c: 800100 add byte ptr [rcx], 0 -;; 5b7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5b88: 800100 add byte ptr [rcx], 0 -;; 5b8b: aa stosb byte ptr [rdi], al -;; 5b8c: 800100 add byte ptr [rcx], 0 -;; 5b8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5b98: 800100 add byte ptr [rcx], 0 -;; 5b9b: aa stosb byte ptr [rdi], al -;; 5b9c: 800100 add byte ptr [rcx], 0 -;; 5b9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5ba8: 800100 add byte ptr [rcx], 0 -;; 5bab: aa stosb byte ptr [rdi], al -;; 5bac: 800100 add byte ptr [rcx], 0 -;; 5baf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5bb8: 800100 add byte ptr [rcx], 0 -;; 5bbb: aa stosb byte ptr [rdi], al -;; 5bbc: 800100 add byte ptr [rcx], 0 -;; 5bbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5bc8: 800100 add byte ptr [rcx], 0 -;; 5bcb: aa stosb byte ptr [rdi], al -;; 5bcc: 800100 add byte ptr [rcx], 0 -;; 5bcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5bd8: 800100 add byte ptr [rcx], 0 -;; 5bdb: aa stosb byte ptr [rdi], al -;; 5bdc: 800100 add byte ptr [rcx], 0 -;; 5bdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5be8: 800100 add byte ptr [rcx], 0 -;; 5beb: aa stosb byte ptr [rdi], al -;; 5bec: 800100 add byte ptr [rcx], 0 -;; 5bef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5bf8: 800100 add byte ptr [rcx], 0 -;; 5bfb: aa stosb byte ptr [rdi], al -;; 5bfc: 800100 add byte ptr [rcx], 0 -;; 5bff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5c08: 800100 add byte ptr [rcx], 0 -;; 5c0b: aa stosb byte ptr [rdi], al -;; 5c0c: 800100 add byte ptr [rcx], 0 -;; 5c0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5c18: 800100 add byte ptr [rcx], 0 -;; 5c1b: aa stosb byte ptr [rdi], al -;; 5c1c: 800100 add byte ptr [rcx], 0 -;; 5c1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5c28: 800100 add byte ptr [rcx], 0 -;; 5c2b: aa stosb byte ptr [rdi], al -;; 5c2c: 800100 add byte ptr [rcx], 0 -;; 5c2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5c38: 800100 add byte ptr [rcx], 0 -;; 5c3b: aa stosb byte ptr [rdi], al -;; 5c3c: 800100 add byte ptr [rcx], 0 -;; 5c3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5c48: 800100 add byte ptr [rcx], 0 -;; 5c4b: aa stosb byte ptr [rdi], al -;; 5c4c: 800100 add byte ptr [rcx], 0 -;; 5c4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5c58: 800100 add byte ptr [rcx], 0 -;; 5c5b: aa stosb byte ptr [rdi], al -;; 5c5c: 800100 add byte ptr [rcx], 0 -;; 5c5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5c68: 800100 add byte ptr [rcx], 0 -;; 5c6b: aa stosb byte ptr [rdi], al -;; 5c6c: 800100 add byte ptr [rcx], 0 -;; 5c6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5c78: 800100 add byte ptr [rcx], 0 -;; 5c7b: aa stosb byte ptr [rdi], al -;; 5c7c: 800100 add byte ptr [rcx], 0 -;; 5c7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5c88: 800100 add byte ptr [rcx], 0 -;; 5c8b: aa stosb byte ptr [rdi], al -;; 5c8c: 800100 add byte ptr [rcx], 0 -;; 5c8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5c98: 800100 add byte ptr [rcx], 0 -;; 5c9b: aa stosb byte ptr [rdi], al -;; 5c9c: 800100 add byte ptr [rcx], 0 -;; 5c9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5ca8: 800100 add byte ptr [rcx], 0 -;; 5cab: aa stosb byte ptr [rdi], al -;; 5cac: 800100 add byte ptr [rcx], 0 -;; 5caf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5cb8: 800100 add byte ptr [rcx], 0 -;; 5cbb: aa stosb byte ptr [rdi], al -;; 5cbc: 800100 add byte ptr [rcx], 0 -;; 5cbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5cc8: 800100 add byte ptr [rcx], 0 -;; 5ccb: aa stosb byte ptr [rdi], al -;; 5ccc: 800100 add byte ptr [rcx], 0 -;; 5ccf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5cd8: 800100 add byte ptr [rcx], 0 -;; 5cdb: aa stosb byte ptr [rdi], al -;; 5cdc: 800100 add byte ptr [rcx], 0 -;; 5cdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5ce8: 800100 add byte ptr [rcx], 0 -;; 5ceb: aa stosb byte ptr [rdi], al -;; 5cec: 800100 add byte ptr [rcx], 0 -;; 5cef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5cf8: 800100 add byte ptr [rcx], 0 -;; 5cfb: aa stosb byte ptr [rdi], al -;; 5cfc: 800100 add byte ptr [rcx], 0 -;; 5cff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5d08: 800100 add byte ptr [rcx], 0 -;; 5d0b: aa stosb byte ptr [rdi], al -;; 5d0c: 800100 add byte ptr [rcx], 0 -;; 5d0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5d18: 800100 add byte ptr [rcx], 0 -;; 5d1b: aa stosb byte ptr [rdi], al -;; 5d1c: 800100 add byte ptr [rcx], 0 -;; 5d1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5d28: 800100 add byte ptr [rcx], 0 -;; 5d2b: aa stosb byte ptr [rdi], al -;; 5d2c: 800100 add byte ptr [rcx], 0 -;; 5d2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5d38: 800100 add byte ptr [rcx], 0 -;; 5d3b: aa stosb byte ptr [rdi], al -;; 5d3c: 800100 add byte ptr [rcx], 0 -;; 5d3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5d48: 800100 add byte ptr [rcx], 0 -;; 5d4b: aa stosb byte ptr [rdi], al -;; 5d4c: 800100 add byte ptr [rcx], 0 -;; 5d4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5d58: 800100 add byte ptr [rcx], 0 -;; 5d5b: aa stosb byte ptr [rdi], al -;; 5d5c: 800100 add byte ptr [rcx], 0 -;; 5d5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5d68: 800100 add byte ptr [rcx], 0 -;; 5d6b: aa stosb byte ptr [rdi], al -;; 5d6c: 800100 add byte ptr [rcx], 0 -;; 5d6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5d78: 800100 add byte ptr [rcx], 0 -;; 5d7b: aa stosb byte ptr [rdi], al -;; 5d7c: 800100 add byte ptr [rcx], 0 -;; 5d7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5d88: 800100 add byte ptr [rcx], 0 -;; 5d8b: aa stosb byte ptr [rdi], al -;; 5d8c: 800100 add byte ptr [rcx], 0 -;; 5d8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5d98: 800100 add byte ptr [rcx], 0 -;; 5d9b: aa stosb byte ptr [rdi], al -;; 5d9c: 800100 add byte ptr [rcx], 0 -;; 5d9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5da8: 800100 add byte ptr [rcx], 0 -;; 5dab: aa stosb byte ptr [rdi], al -;; 5dac: 800100 add byte ptr [rcx], 0 -;; 5daf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5db8: 800100 add byte ptr [rcx], 0 -;; 5dbb: aa stosb byte ptr [rdi], al -;; 5dbc: 800100 add byte ptr [rcx], 0 -;; 5dbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5dc8: 800100 add byte ptr [rcx], 0 -;; 5dcb: aa stosb byte ptr [rdi], al -;; 5dcc: 800100 add byte ptr [rcx], 0 -;; 5dcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5dd8: 800100 add byte ptr [rcx], 0 -;; 5ddb: aa stosb byte ptr [rdi], al -;; 5ddc: 800100 add byte ptr [rcx], 0 -;; 5ddf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5de8: 800100 add byte ptr [rcx], 0 -;; 5deb: aa stosb byte ptr [rdi], al -;; 5dec: 800100 add byte ptr [rcx], 0 -;; 5def: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5df8: 800100 add byte ptr [rcx], 0 -;; 5dfb: aa stosb byte ptr [rdi], al -;; 5dfc: 800100 add byte ptr [rcx], 0 -;; 5dff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5e08: 800100 add byte ptr [rcx], 0 -;; 5e0b: aa stosb byte ptr [rdi], al -;; 5e0c: 800100 add byte ptr [rcx], 0 -;; 5e0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5e18: 800100 add byte ptr [rcx], 0 -;; 5e1b: aa stosb byte ptr [rdi], al -;; 5e1c: 800100 add byte ptr [rcx], 0 -;; 5e1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5e28: 800100 add byte ptr [rcx], 0 -;; 5e2b: aa stosb byte ptr [rdi], al -;; 5e2c: 800100 add byte ptr [rcx], 0 -;; 5e2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5e38: 800100 add byte ptr [rcx], 0 -;; 5e3b: aa stosb byte ptr [rdi], al -;; 5e3c: 800100 add byte ptr [rcx], 0 -;; 5e3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5e48: 800100 add byte ptr [rcx], 0 -;; 5e4b: aa stosb byte ptr [rdi], al -;; 5e4c: 800100 add byte ptr [rcx], 0 -;; 5e4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5e58: 800100 add byte ptr [rcx], 0 -;; 5e5b: aa stosb byte ptr [rdi], al -;; 5e5c: 800100 add byte ptr [rcx], 0 -;; 5e5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5e68: 800100 add byte ptr [rcx], 0 -;; 5e6b: aa stosb byte ptr [rdi], al -;; 5e6c: 800100 add byte ptr [rcx], 0 -;; 5e6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5e78: 800100 add byte ptr [rcx], 0 -;; 5e7b: aa stosb byte ptr [rdi], al -;; 5e7c: 800100 add byte ptr [rcx], 0 -;; 5e7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5e88: 800100 add byte ptr [rcx], 0 -;; 5e8b: aa stosb byte ptr [rdi], al -;; 5e8c: 800100 add byte ptr [rcx], 0 -;; 5e8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5e98: 800100 add byte ptr [rcx], 0 -;; 5e9b: aa stosb byte ptr [rdi], al -;; 5e9c: 800100 add byte ptr [rcx], 0 -;; 5e9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5ea8: 800100 add byte ptr [rcx], 0 -;; 5eab: aa stosb byte ptr [rdi], al -;; 5eac: 800100 add byte ptr [rcx], 0 -;; 5eaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5eb8: 800100 add byte ptr [rcx], 0 -;; 5ebb: aa stosb byte ptr [rdi], al -;; 5ebc: 800100 add byte ptr [rcx], 0 -;; 5ebf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5ec8: 800100 add byte ptr [rcx], 0 -;; 5ecb: aa stosb byte ptr [rdi], al -;; 5ecc: 800100 add byte ptr [rcx], 0 -;; 5ecf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5ed8: 800100 add byte ptr [rcx], 0 -;; 5edb: aa stosb byte ptr [rdi], al -;; 5edc: 800100 add byte ptr [rcx], 0 -;; 5edf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5ee8: 800100 add byte ptr [rcx], 0 -;; 5eeb: aa stosb byte ptr [rdi], al -;; 5eec: 800100 add byte ptr [rcx], 0 -;; 5eef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5ef8: 800100 add byte ptr [rcx], 0 -;; 5efb: aa stosb byte ptr [rdi], al -;; 5efc: 800100 add byte ptr [rcx], 0 -;; 5eff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5f08: 800100 add byte ptr [rcx], 0 -;; 5f0b: aa stosb byte ptr [rdi], al -;; 5f0c: 800100 add byte ptr [rcx], 0 -;; 5f0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5f18: 800100 add byte ptr [rcx], 0 -;; 5f1b: aa stosb byte ptr [rdi], al -;; 5f1c: 800100 add byte ptr [rcx], 0 -;; 5f1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5f28: 800100 add byte ptr [rcx], 0 -;; 5f2b: aa stosb byte ptr [rdi], al -;; 5f2c: 800100 add byte ptr [rcx], 0 -;; 5f2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5f38: 800100 add byte ptr [rcx], 0 -;; 5f3b: aa stosb byte ptr [rdi], al -;; 5f3c: 800100 add byte ptr [rcx], 0 -;; 5f3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5f48: 800100 add byte ptr [rcx], 0 -;; 5f4b: aa stosb byte ptr [rdi], al -;; 5f4c: 800100 add byte ptr [rcx], 0 -;; 5f4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5f58: 800100 add byte ptr [rcx], 0 -;; 5f5b: aa stosb byte ptr [rdi], al -;; 5f5c: 800100 add byte ptr [rcx], 0 -;; 5f5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5f68: 800100 add byte ptr [rcx], 0 -;; 5f6b: aa stosb byte ptr [rdi], al -;; 5f6c: 800100 add byte ptr [rcx], 0 -;; 5f6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5f78: 800100 add byte ptr [rcx], 0 -;; 5f7b: aa stosb byte ptr [rdi], al -;; 5f7c: 800100 add byte ptr [rcx], 0 -;; 5f7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5f88: 800100 add byte ptr [rcx], 0 -;; 5f8b: aa stosb byte ptr [rdi], al -;; 5f8c: 800100 add byte ptr [rcx], 0 -;; 5f8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5f98: 800100 add byte ptr [rcx], 0 -;; 5f9b: aa stosb byte ptr [rdi], al -;; 5f9c: 800100 add byte ptr [rcx], 0 -;; 5f9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5fa8: 800100 add byte ptr [rcx], 0 -;; 5fab: aa stosb byte ptr [rdi], al -;; 5fac: 800100 add byte ptr [rcx], 0 -;; 5faf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5fb8: 800100 add byte ptr [rcx], 0 -;; 5fbb: aa stosb byte ptr [rdi], al -;; 5fbc: 800100 add byte ptr [rcx], 0 -;; 5fbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5fc8: 800100 add byte ptr [rcx], 0 -;; 5fcb: aa stosb byte ptr [rdi], al -;; 5fcc: 800100 add byte ptr [rcx], 0 -;; 5fcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5fd8: 800100 add byte ptr [rcx], 0 -;; 5fdb: aa stosb byte ptr [rdi], al -;; 5fdc: 800100 add byte ptr [rcx], 0 -;; 5fdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5fe8: 800100 add byte ptr [rcx], 0 -;; 5feb: aa stosb byte ptr [rdi], al -;; 5fec: 800100 add byte ptr [rcx], 0 -;; 5fef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 5ff8: 800100 add byte ptr [rcx], 0 -;; 5ffb: aa stosb byte ptr [rdi], al -;; 5ffc: 800100 add byte ptr [rcx], 0 -;; 5fff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6008: 800100 add byte ptr [rcx], 0 -;; 600b: aa stosb byte ptr [rdi], al -;; 600c: 800100 add byte ptr [rcx], 0 -;; 600f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6018: 800100 add byte ptr [rcx], 0 -;; 601b: aa stosb byte ptr [rdi], al -;; 601c: 800100 add byte ptr [rcx], 0 -;; 601f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6028: 800100 add byte ptr [rcx], 0 -;; 602b: aa stosb byte ptr [rdi], al -;; 602c: 800100 add byte ptr [rcx], 0 -;; 602f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6038: 800100 add byte ptr [rcx], 0 -;; 603b: aa stosb byte ptr [rdi], al -;; 603c: 800100 add byte ptr [rcx], 0 -;; 603f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6048: 800100 add byte ptr [rcx], 0 -;; 604b: aa stosb byte ptr [rdi], al -;; 604c: 800100 add byte ptr [rcx], 0 -;; 604f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6058: 800100 add byte ptr [rcx], 0 -;; 605b: aa stosb byte ptr [rdi], al -;; 605c: 800100 add byte ptr [rcx], 0 -;; 605f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6068: 800100 add byte ptr [rcx], 0 -;; 606b: aa stosb byte ptr [rdi], al -;; 606c: 800100 add byte ptr [rcx], 0 -;; 606f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6078: 800100 add byte ptr [rcx], 0 -;; 607b: aa stosb byte ptr [rdi], al -;; 607c: 800100 add byte ptr [rcx], 0 -;; 607f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6088: 800100 add byte ptr [rcx], 0 -;; 608b: aa stosb byte ptr [rdi], al -;; 608c: 800100 add byte ptr [rcx], 0 -;; 608f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6098: 800100 add byte ptr [rcx], 0 -;; 609b: aa stosb byte ptr [rdi], al -;; 609c: 800100 add byte ptr [rcx], 0 -;; 609f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 60a8: 800100 add byte ptr [rcx], 0 -;; 60ab: aa stosb byte ptr [rdi], al -;; 60ac: 800100 add byte ptr [rcx], 0 -;; 60af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 60b8: 800100 add byte ptr [rcx], 0 -;; 60bb: aa stosb byte ptr [rdi], al -;; 60bc: 800100 add byte ptr [rcx], 0 -;; 60bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 60c8: 800100 add byte ptr [rcx], 0 -;; 60cb: aa stosb byte ptr [rdi], al -;; 60cc: 800100 add byte ptr [rcx], 0 -;; 60cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 60d8: 800100 add byte ptr [rcx], 0 -;; 60db: aa stosb byte ptr [rdi], al -;; 60dc: 800100 add byte ptr [rcx], 0 -;; 60df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 60e8: 800100 add byte ptr [rcx], 0 -;; 60eb: aa stosb byte ptr [rdi], al -;; 60ec: 800100 add byte ptr [rcx], 0 -;; 60ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 60f8: 800100 add byte ptr [rcx], 0 -;; 60fb: aa stosb byte ptr [rdi], al -;; 60fc: 800100 add byte ptr [rcx], 0 -;; 60ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6108: 800100 add byte ptr [rcx], 0 -;; 610b: aa stosb byte ptr [rdi], al -;; 610c: 800100 add byte ptr [rcx], 0 -;; 610f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6118: 800100 add byte ptr [rcx], 0 -;; 611b: aa stosb byte ptr [rdi], al -;; 611c: 800100 add byte ptr [rcx], 0 -;; 611f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6128: 800100 add byte ptr [rcx], 0 -;; 612b: aa stosb byte ptr [rdi], al -;; 612c: 800100 add byte ptr [rcx], 0 -;; 612f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6138: 800100 add byte ptr [rcx], 0 -;; 613b: aa stosb byte ptr [rdi], al -;; 613c: 800100 add byte ptr [rcx], 0 -;; 613f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6148: 800100 add byte ptr [rcx], 0 -;; 614b: aa stosb byte ptr [rdi], al -;; 614c: 800100 add byte ptr [rcx], 0 -;; 614f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6158: 800100 add byte ptr [rcx], 0 -;; 615b: aa stosb byte ptr [rdi], al -;; 615c: 800100 add byte ptr [rcx], 0 -;; 615f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6168: 800100 add byte ptr [rcx], 0 -;; 616b: aa stosb byte ptr [rdi], al -;; 616c: 800100 add byte ptr [rcx], 0 -;; 616f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6178: 800100 add byte ptr [rcx], 0 -;; 617b: aa stosb byte ptr [rdi], al -;; 617c: 800100 add byte ptr [rcx], 0 -;; 617f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6188: 800100 add byte ptr [rcx], 0 -;; 618b: aa stosb byte ptr [rdi], al -;; 618c: 800100 add byte ptr [rcx], 0 -;; 618f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6198: 800100 add byte ptr [rcx], 0 -;; 619b: aa stosb byte ptr [rdi], al -;; 619c: 800100 add byte ptr [rcx], 0 -;; 619f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 61a8: 800100 add byte ptr [rcx], 0 -;; 61ab: aa stosb byte ptr [rdi], al -;; 61ac: 800100 add byte ptr [rcx], 0 -;; 61af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 61b8: 800100 add byte ptr [rcx], 0 -;; 61bb: aa stosb byte ptr [rdi], al -;; 61bc: 800100 add byte ptr [rcx], 0 -;; 61bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 61c8: 800100 add byte ptr [rcx], 0 -;; 61cb: aa stosb byte ptr [rdi], al -;; 61cc: 800100 add byte ptr [rcx], 0 -;; 61cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 61d8: 800100 add byte ptr [rcx], 0 -;; 61db: aa stosb byte ptr [rdi], al -;; 61dc: 800100 add byte ptr [rcx], 0 -;; 61df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 61e8: 800100 add byte ptr [rcx], 0 -;; 61eb: aa stosb byte ptr [rdi], al -;; 61ec: 800100 add byte ptr [rcx], 0 -;; 61ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 61f8: 800100 add byte ptr [rcx], 0 -;; 61fb: aa stosb byte ptr [rdi], al -;; 61fc: 800100 add byte ptr [rcx], 0 -;; 61ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6208: 800100 add byte ptr [rcx], 0 -;; 620b: aa stosb byte ptr [rdi], al -;; 620c: 800100 add byte ptr [rcx], 0 -;; 620f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6218: 800100 add byte ptr [rcx], 0 -;; 621b: aa stosb byte ptr [rdi], al -;; 621c: 800100 add byte ptr [rcx], 0 -;; 621f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6228: 800100 add byte ptr [rcx], 0 -;; 622b: aa stosb byte ptr [rdi], al -;; 622c: 800100 add byte ptr [rcx], 0 -;; 622f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6238: 800100 add byte ptr [rcx], 0 -;; 623b: aa stosb byte ptr [rdi], al -;; 623c: 800100 add byte ptr [rcx], 0 -;; 623f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6248: 800100 add byte ptr [rcx], 0 -;; 624b: aa stosb byte ptr [rdi], al -;; 624c: 800100 add byte ptr [rcx], 0 -;; 624f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6258: 800100 add byte ptr [rcx], 0 -;; 625b: aa stosb byte ptr [rdi], al -;; 625c: 800100 add byte ptr [rcx], 0 -;; 625f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6268: 800100 add byte ptr [rcx], 0 -;; 626b: aa stosb byte ptr [rdi], al -;; 626c: 800100 add byte ptr [rcx], 0 -;; 626f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6278: 800100 add byte ptr [rcx], 0 -;; 627b: aa stosb byte ptr [rdi], al -;; 627c: 800100 add byte ptr [rcx], 0 -;; 627f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6288: 800100 add byte ptr [rcx], 0 -;; 628b: aa stosb byte ptr [rdi], al -;; 628c: 800100 add byte ptr [rcx], 0 -;; 628f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6298: 800100 add byte ptr [rcx], 0 -;; 629b: aa stosb byte ptr [rdi], al -;; 629c: 800100 add byte ptr [rcx], 0 -;; 629f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 62a8: 800100 add byte ptr [rcx], 0 -;; 62ab: aa stosb byte ptr [rdi], al -;; 62ac: 800100 add byte ptr [rcx], 0 -;; 62af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 62b8: 800100 add byte ptr [rcx], 0 -;; 62bb: aa stosb byte ptr [rdi], al -;; 62bc: 800100 add byte ptr [rcx], 0 -;; 62bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 62c8: 800100 add byte ptr [rcx], 0 -;; 62cb: aa stosb byte ptr [rdi], al -;; 62cc: 800100 add byte ptr [rcx], 0 -;; 62cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 62d8: 800100 add byte ptr [rcx], 0 -;; 62db: aa stosb byte ptr [rdi], al -;; 62dc: 800100 add byte ptr [rcx], 0 -;; 62df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 62e8: 800100 add byte ptr [rcx], 0 -;; 62eb: aa stosb byte ptr [rdi], al -;; 62ec: 800100 add byte ptr [rcx], 0 -;; 62ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 62f8: 800100 add byte ptr [rcx], 0 -;; 62fb: aa stosb byte ptr [rdi], al -;; 62fc: 800100 add byte ptr [rcx], 0 -;; 62ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6308: 800100 add byte ptr [rcx], 0 -;; 630b: aa stosb byte ptr [rdi], al -;; 630c: 800100 add byte ptr [rcx], 0 -;; 630f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6318: 800100 add byte ptr [rcx], 0 -;; 631b: aa stosb byte ptr [rdi], al -;; 631c: 800100 add byte ptr [rcx], 0 -;; 631f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6328: 800100 add byte ptr [rcx], 0 -;; 632b: aa stosb byte ptr [rdi], al -;; 632c: 800100 add byte ptr [rcx], 0 -;; 632f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6338: 800100 add byte ptr [rcx], 0 -;; 633b: aa stosb byte ptr [rdi], al -;; 633c: 800100 add byte ptr [rcx], 0 -;; 633f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6348: 800100 add byte ptr [rcx], 0 -;; 634b: aa stosb byte ptr [rdi], al -;; 634c: 800100 add byte ptr [rcx], 0 -;; 634f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6358: 800100 add byte ptr [rcx], 0 -;; 635b: aa stosb byte ptr [rdi], al -;; 635c: 800100 add byte ptr [rcx], 0 -;; 635f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6368: 800100 add byte ptr [rcx], 0 -;; 636b: aa stosb byte ptr [rdi], al -;; 636c: 800100 add byte ptr [rcx], 0 -;; 636f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6378: 800100 add byte ptr [rcx], 0 -;; 637b: aa stosb byte ptr [rdi], al -;; 637c: 800100 add byte ptr [rcx], 0 -;; 637f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6388: 800100 add byte ptr [rcx], 0 -;; 638b: aa stosb byte ptr [rdi], al -;; 638c: 800100 add byte ptr [rcx], 0 -;; 638f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6398: 800100 add byte ptr [rcx], 0 -;; 639b: aa stosb byte ptr [rdi], al -;; 639c: 800100 add byte ptr [rcx], 0 -;; 639f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 63a8: 800100 add byte ptr [rcx], 0 -;; 63ab: aa stosb byte ptr [rdi], al -;; 63ac: 800100 add byte ptr [rcx], 0 -;; 63af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 63b8: 800100 add byte ptr [rcx], 0 -;; 63bb: aa stosb byte ptr [rdi], al -;; 63bc: 800100 add byte ptr [rcx], 0 -;; 63bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 63c8: 800100 add byte ptr [rcx], 0 -;; 63cb: aa stosb byte ptr [rdi], al -;; 63cc: 800100 add byte ptr [rcx], 0 -;; 63cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 63d8: 800100 add byte ptr [rcx], 0 -;; 63db: aa stosb byte ptr [rdi], al -;; 63dc: 800100 add byte ptr [rcx], 0 -;; 63df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 63e8: 800100 add byte ptr [rcx], 0 -;; 63eb: aa stosb byte ptr [rdi], al -;; 63ec: 800100 add byte ptr [rcx], 0 -;; 63ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 63f8: 800100 add byte ptr [rcx], 0 -;; 63fb: aa stosb byte ptr [rdi], al -;; 63fc: 800100 add byte ptr [rcx], 0 -;; 63ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6408: 800100 add byte ptr [rcx], 0 -;; 640b: aa stosb byte ptr [rdi], al -;; 640c: 800100 add byte ptr [rcx], 0 -;; 640f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6418: 800100 add byte ptr [rcx], 0 -;; 641b: aa stosb byte ptr [rdi], al -;; 641c: 800100 add byte ptr [rcx], 0 -;; 641f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6428: 800100 add byte ptr [rcx], 0 -;; 642b: aa stosb byte ptr [rdi], al -;; 642c: 800100 add byte ptr [rcx], 0 -;; 642f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6438: 800100 add byte ptr [rcx], 0 -;; 643b: aa stosb byte ptr [rdi], al -;; 643c: 800100 add byte ptr [rcx], 0 -;; 643f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6448: 800100 add byte ptr [rcx], 0 -;; 644b: aa stosb byte ptr [rdi], al -;; 644c: 800100 add byte ptr [rcx], 0 -;; 644f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6458: 800100 add byte ptr [rcx], 0 -;; 645b: aa stosb byte ptr [rdi], al -;; 645c: 800100 add byte ptr [rcx], 0 -;; 645f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6468: 800100 add byte ptr [rcx], 0 -;; 646b: aa stosb byte ptr [rdi], al -;; 646c: 800100 add byte ptr [rcx], 0 -;; 646f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6478: 800100 add byte ptr [rcx], 0 -;; 647b: aa stosb byte ptr [rdi], al -;; 647c: 800100 add byte ptr [rcx], 0 -;; 647f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6488: 800100 add byte ptr [rcx], 0 -;; 648b: aa stosb byte ptr [rdi], al -;; 648c: 800100 add byte ptr [rcx], 0 -;; 648f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6498: 800100 add byte ptr [rcx], 0 -;; 649b: aa stosb byte ptr [rdi], al -;; 649c: 800100 add byte ptr [rcx], 0 -;; 649f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 64a8: 800100 add byte ptr [rcx], 0 -;; 64ab: aa stosb byte ptr [rdi], al -;; 64ac: 800100 add byte ptr [rcx], 0 -;; 64af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 64b8: 800100 add byte ptr [rcx], 0 -;; 64bb: aa stosb byte ptr [rdi], al -;; 64bc: 800100 add byte ptr [rcx], 0 -;; 64bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 64c8: 800100 add byte ptr [rcx], 0 -;; 64cb: aa stosb byte ptr [rdi], al -;; 64cc: 800100 add byte ptr [rcx], 0 -;; 64cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 64d8: 800100 add byte ptr [rcx], 0 -;; 64db: aa stosb byte ptr [rdi], al -;; 64dc: 800100 add byte ptr [rcx], 0 -;; 64df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 64e8: 800100 add byte ptr [rcx], 0 -;; 64eb: aa stosb byte ptr [rdi], al -;; 64ec: 800100 add byte ptr [rcx], 0 -;; 64ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 64f8: 800100 add byte ptr [rcx], 0 -;; 64fb: aa stosb byte ptr [rdi], al -;; 64fc: 800100 add byte ptr [rcx], 0 -;; 64ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6508: 800100 add byte ptr [rcx], 0 -;; 650b: aa stosb byte ptr [rdi], al -;; 650c: 800100 add byte ptr [rcx], 0 -;; 650f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6518: 800100 add byte ptr [rcx], 0 -;; 651b: aa stosb byte ptr [rdi], al -;; 651c: 800100 add byte ptr [rcx], 0 -;; 651f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6528: 800100 add byte ptr [rcx], 0 -;; 652b: aa stosb byte ptr [rdi], al -;; 652c: 800100 add byte ptr [rcx], 0 -;; 652f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6538: 800100 add byte ptr [rcx], 0 -;; 653b: aa stosb byte ptr [rdi], al -;; 653c: 800100 add byte ptr [rcx], 0 -;; 653f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6548: 800100 add byte ptr [rcx], 0 -;; 654b: aa stosb byte ptr [rdi], al -;; 654c: 800100 add byte ptr [rcx], 0 -;; 654f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6558: 800100 add byte ptr [rcx], 0 -;; 655b: aa stosb byte ptr [rdi], al -;; 655c: 800100 add byte ptr [rcx], 0 -;; 655f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6568: 800100 add byte ptr [rcx], 0 -;; 656b: aa stosb byte ptr [rdi], al -;; 656c: 800100 add byte ptr [rcx], 0 -;; 656f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6578: 800100 add byte ptr [rcx], 0 -;; 657b: aa stosb byte ptr [rdi], al -;; 657c: 800100 add byte ptr [rcx], 0 -;; 657f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6588: 800100 add byte ptr [rcx], 0 -;; 658b: aa stosb byte ptr [rdi], al -;; 658c: 800100 add byte ptr [rcx], 0 -;; 658f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6598: 800100 add byte ptr [rcx], 0 -;; 659b: aa stosb byte ptr [rdi], al -;; 659c: 800100 add byte ptr [rcx], 0 -;; 659f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 65a8: 800100 add byte ptr [rcx], 0 -;; 65ab: aa stosb byte ptr [rdi], al -;; 65ac: 800100 add byte ptr [rcx], 0 -;; 65af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 65b8: 800100 add byte ptr [rcx], 0 -;; 65bb: aa stosb byte ptr [rdi], al -;; 65bc: 800100 add byte ptr [rcx], 0 -;; 65bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 65c8: 800100 add byte ptr [rcx], 0 -;; 65cb: aa stosb byte ptr [rdi], al -;; 65cc: 800100 add byte ptr [rcx], 0 -;; 65cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 65d8: 800100 add byte ptr [rcx], 0 -;; 65db: aa stosb byte ptr [rdi], al -;; 65dc: 800100 add byte ptr [rcx], 0 -;; 65df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 65e8: 800100 add byte ptr [rcx], 0 -;; 65eb: aa stosb byte ptr [rdi], al -;; 65ec: 800100 add byte ptr [rcx], 0 -;; 65ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 65f8: 800100 add byte ptr [rcx], 0 -;; 65fb: aa stosb byte ptr [rdi], al -;; 65fc: 800100 add byte ptr [rcx], 0 -;; 65ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6608: 800100 add byte ptr [rcx], 0 -;; 660b: aa stosb byte ptr [rdi], al -;; 660c: 800100 add byte ptr [rcx], 0 -;; 660f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6618: 800100 add byte ptr [rcx], 0 -;; 661b: aa stosb byte ptr [rdi], al -;; 661c: 800100 add byte ptr [rcx], 0 -;; 661f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6628: 800100 add byte ptr [rcx], 0 -;; 662b: aa stosb byte ptr [rdi], al -;; 662c: 800100 add byte ptr [rcx], 0 -;; 662f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6638: 800100 add byte ptr [rcx], 0 -;; 663b: aa stosb byte ptr [rdi], al -;; 663c: 800100 add byte ptr [rcx], 0 -;; 663f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6648: 800100 add byte ptr [rcx], 0 -;; 664b: aa stosb byte ptr [rdi], al -;; 664c: 800100 add byte ptr [rcx], 0 -;; 664f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6658: 800100 add byte ptr [rcx], 0 -;; 665b: aa stosb byte ptr [rdi], al -;; 665c: 800100 add byte ptr [rcx], 0 -;; 665f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6668: 800100 add byte ptr [rcx], 0 -;; 666b: aa stosb byte ptr [rdi], al -;; 666c: 800100 add byte ptr [rcx], 0 -;; 666f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6678: 800100 add byte ptr [rcx], 0 -;; 667b: aa stosb byte ptr [rdi], al -;; 667c: 800100 add byte ptr [rcx], 0 -;; 667f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6688: 800100 add byte ptr [rcx], 0 -;; 668b: aa stosb byte ptr [rdi], al -;; 668c: 800100 add byte ptr [rcx], 0 -;; 668f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6698: 800100 add byte ptr [rcx], 0 -;; 669b: aa stosb byte ptr [rdi], al -;; 669c: 800100 add byte ptr [rcx], 0 -;; 669f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 66a8: 800100 add byte ptr [rcx], 0 -;; 66ab: aa stosb byte ptr [rdi], al -;; 66ac: 800100 add byte ptr [rcx], 0 -;; 66af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 66b8: 800100 add byte ptr [rcx], 0 -;; 66bb: aa stosb byte ptr [rdi], al -;; 66bc: 800100 add byte ptr [rcx], 0 -;; 66bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 66c8: 800100 add byte ptr [rcx], 0 -;; 66cb: aa stosb byte ptr [rdi], al -;; 66cc: 800100 add byte ptr [rcx], 0 -;; 66cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 66d8: 800100 add byte ptr [rcx], 0 -;; 66db: aa stosb byte ptr [rdi], al -;; 66dc: 800100 add byte ptr [rcx], 0 -;; 66df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 66e8: 800100 add byte ptr [rcx], 0 -;; 66eb: aa stosb byte ptr [rdi], al -;; 66ec: 800100 add byte ptr [rcx], 0 -;; 66ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 66f8: 800100 add byte ptr [rcx], 0 -;; 66fb: aa stosb byte ptr [rdi], al -;; 66fc: 800100 add byte ptr [rcx], 0 -;; 66ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6708: 800100 add byte ptr [rcx], 0 -;; 670b: aa stosb byte ptr [rdi], al -;; 670c: 800100 add byte ptr [rcx], 0 -;; 670f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6718: 800100 add byte ptr [rcx], 0 -;; 671b: aa stosb byte ptr [rdi], al -;; 671c: 800100 add byte ptr [rcx], 0 -;; 671f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6728: 800100 add byte ptr [rcx], 0 -;; 672b: aa stosb byte ptr [rdi], al -;; 672c: 800100 add byte ptr [rcx], 0 -;; 672f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6738: 800100 add byte ptr [rcx], 0 -;; 673b: aa stosb byte ptr [rdi], al -;; 673c: 800100 add byte ptr [rcx], 0 -;; 673f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6748: 800100 add byte ptr [rcx], 0 -;; 674b: aa stosb byte ptr [rdi], al -;; 674c: 800100 add byte ptr [rcx], 0 -;; 674f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6758: 800100 add byte ptr [rcx], 0 -;; 675b: aa stosb byte ptr [rdi], al -;; 675c: 800100 add byte ptr [rcx], 0 -;; 675f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6768: 800100 add byte ptr [rcx], 0 -;; 676b: aa stosb byte ptr [rdi], al -;; 676c: 800100 add byte ptr [rcx], 0 -;; 676f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6778: 800100 add byte ptr [rcx], 0 -;; 677b: aa stosb byte ptr [rdi], al -;; 677c: 800100 add byte ptr [rcx], 0 -;; 677f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6788: 800100 add byte ptr [rcx], 0 -;; 678b: aa stosb byte ptr [rdi], al -;; 678c: 800100 add byte ptr [rcx], 0 -;; 678f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6798: 800100 add byte ptr [rcx], 0 -;; 679b: aa stosb byte ptr [rdi], al -;; 679c: 800100 add byte ptr [rcx], 0 -;; 679f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 67a8: 800100 add byte ptr [rcx], 0 -;; 67ab: aa stosb byte ptr [rdi], al -;; 67ac: 800100 add byte ptr [rcx], 0 -;; 67af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 67b8: 800100 add byte ptr [rcx], 0 -;; 67bb: aa stosb byte ptr [rdi], al -;; 67bc: 800100 add byte ptr [rcx], 0 -;; 67bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 67c8: 800100 add byte ptr [rcx], 0 -;; 67cb: aa stosb byte ptr [rdi], al -;; 67cc: 800100 add byte ptr [rcx], 0 -;; 67cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 67d8: 800100 add byte ptr [rcx], 0 -;; 67db: aa stosb byte ptr [rdi], al -;; 67dc: 800100 add byte ptr [rcx], 0 -;; 67df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 67e8: 800100 add byte ptr [rcx], 0 -;; 67eb: aa stosb byte ptr [rdi], al -;; 67ec: 800100 add byte ptr [rcx], 0 -;; 67ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 67f8: 800100 add byte ptr [rcx], 0 -;; 67fb: aa stosb byte ptr [rdi], al -;; 67fc: 800100 add byte ptr [rcx], 0 -;; 67ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6808: 800100 add byte ptr [rcx], 0 -;; 680b: aa stosb byte ptr [rdi], al -;; 680c: 800100 add byte ptr [rcx], 0 -;; 680f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6818: 800100 add byte ptr [rcx], 0 -;; 681b: aa stosb byte ptr [rdi], al -;; 681c: 800100 add byte ptr [rcx], 0 -;; 681f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6828: 800100 add byte ptr [rcx], 0 -;; 682b: aa stosb byte ptr [rdi], al -;; 682c: 800100 add byte ptr [rcx], 0 -;; 682f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6838: 800100 add byte ptr [rcx], 0 -;; 683b: aa stosb byte ptr [rdi], al -;; 683c: 800100 add byte ptr [rcx], 0 -;; 683f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6848: 800100 add byte ptr [rcx], 0 -;; 684b: aa stosb byte ptr [rdi], al -;; 684c: 800100 add byte ptr [rcx], 0 -;; 684f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6858: 800100 add byte ptr [rcx], 0 -;; 685b: aa stosb byte ptr [rdi], al -;; 685c: 800100 add byte ptr [rcx], 0 -;; 685f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6868: 800100 add byte ptr [rcx], 0 -;; 686b: aa stosb byte ptr [rdi], al -;; 686c: 800100 add byte ptr [rcx], 0 -;; 686f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6878: 800100 add byte ptr [rcx], 0 -;; 687b: aa stosb byte ptr [rdi], al -;; 687c: 800100 add byte ptr [rcx], 0 -;; 687f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6888: 800100 add byte ptr [rcx], 0 -;; 688b: aa stosb byte ptr [rdi], al -;; 688c: 800100 add byte ptr [rcx], 0 -;; 688f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6898: 800100 add byte ptr [rcx], 0 -;; 689b: aa stosb byte ptr [rdi], al -;; 689c: 800100 add byte ptr [rcx], 0 -;; 689f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 68a8: 800100 add byte ptr [rcx], 0 -;; 68ab: aa stosb byte ptr [rdi], al -;; 68ac: 800100 add byte ptr [rcx], 0 -;; 68af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 68b8: 800100 add byte ptr [rcx], 0 -;; 68bb: aa stosb byte ptr [rdi], al -;; 68bc: 800100 add byte ptr [rcx], 0 -;; 68bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 68c8: 800100 add byte ptr [rcx], 0 -;; 68cb: aa stosb byte ptr [rdi], al -;; 68cc: 800100 add byte ptr [rcx], 0 -;; 68cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 68d8: 800100 add byte ptr [rcx], 0 -;; 68db: aa stosb byte ptr [rdi], al -;; 68dc: 800100 add byte ptr [rcx], 0 -;; 68df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 68e8: 800100 add byte ptr [rcx], 0 -;; 68eb: aa stosb byte ptr [rdi], al -;; 68ec: 800100 add byte ptr [rcx], 0 -;; 68ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 68f8: 800100 add byte ptr [rcx], 0 -;; 68fb: aa stosb byte ptr [rdi], al -;; 68fc: 800100 add byte ptr [rcx], 0 -;; 68ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6908: 800100 add byte ptr [rcx], 0 -;; 690b: aa stosb byte ptr [rdi], al -;; 690c: 800100 add byte ptr [rcx], 0 -;; 690f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6918: 800100 add byte ptr [rcx], 0 -;; 691b: aa stosb byte ptr [rdi], al -;; 691c: 800100 add byte ptr [rcx], 0 -;; 691f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6928: 800100 add byte ptr [rcx], 0 -;; 692b: aa stosb byte ptr [rdi], al -;; 692c: 800100 add byte ptr [rcx], 0 -;; 692f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6938: 800100 add byte ptr [rcx], 0 -;; 693b: aa stosb byte ptr [rdi], al -;; 693c: 800100 add byte ptr [rcx], 0 -;; 693f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6948: 800100 add byte ptr [rcx], 0 -;; 694b: aa stosb byte ptr [rdi], al -;; 694c: 800100 add byte ptr [rcx], 0 -;; 694f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6958: 800100 add byte ptr [rcx], 0 -;; 695b: aa stosb byte ptr [rdi], al -;; 695c: 800100 add byte ptr [rcx], 0 -;; 695f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6968: 800100 add byte ptr [rcx], 0 -;; 696b: aa stosb byte ptr [rdi], al -;; 696c: 800100 add byte ptr [rcx], 0 -;; 696f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6978: 800100 add byte ptr [rcx], 0 -;; 697b: aa stosb byte ptr [rdi], al -;; 697c: 800100 add byte ptr [rcx], 0 -;; 697f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6988: 800100 add byte ptr [rcx], 0 -;; 698b: aa stosb byte ptr [rdi], al -;; 698c: 800100 add byte ptr [rcx], 0 -;; 698f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6998: 800100 add byte ptr [rcx], 0 -;; 699b: aa stosb byte ptr [rdi], al -;; 699c: 800100 add byte ptr [rcx], 0 -;; 699f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 69a8: 800100 add byte ptr [rcx], 0 -;; 69ab: aa stosb byte ptr [rdi], al -;; 69ac: 800100 add byte ptr [rcx], 0 -;; 69af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 69b8: 800100 add byte ptr [rcx], 0 -;; 69bb: aa stosb byte ptr [rdi], al -;; 69bc: 800100 add byte ptr [rcx], 0 -;; 69bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 69c8: 800100 add byte ptr [rcx], 0 -;; 69cb: aa stosb byte ptr [rdi], al -;; 69cc: 800100 add byte ptr [rcx], 0 -;; 69cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 69d8: 800100 add byte ptr [rcx], 0 -;; 69db: aa stosb byte ptr [rdi], al -;; 69dc: 800100 add byte ptr [rcx], 0 -;; 69df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 69e8: 800100 add byte ptr [rcx], 0 -;; 69eb: aa stosb byte ptr [rdi], al -;; 69ec: 800100 add byte ptr [rcx], 0 -;; 69ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 69f8: 800100 add byte ptr [rcx], 0 -;; 69fb: aa stosb byte ptr [rdi], al -;; 69fc: 800100 add byte ptr [rcx], 0 -;; 69ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6a08: 800100 add byte ptr [rcx], 0 -;; 6a0b: aa stosb byte ptr [rdi], al -;; 6a0c: 800100 add byte ptr [rcx], 0 -;; 6a0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6a18: 800100 add byte ptr [rcx], 0 -;; 6a1b: aa stosb byte ptr [rdi], al -;; 6a1c: 800100 add byte ptr [rcx], 0 -;; 6a1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6a28: 800100 add byte ptr [rcx], 0 -;; 6a2b: aa stosb byte ptr [rdi], al -;; 6a2c: 800100 add byte ptr [rcx], 0 -;; 6a2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6a38: 800100 add byte ptr [rcx], 0 -;; 6a3b: aa stosb byte ptr [rdi], al -;; 6a3c: 800100 add byte ptr [rcx], 0 -;; 6a3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6a48: 800100 add byte ptr [rcx], 0 -;; 6a4b: aa stosb byte ptr [rdi], al -;; 6a4c: 800100 add byte ptr [rcx], 0 -;; 6a4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6a58: 800100 add byte ptr [rcx], 0 -;; 6a5b: aa stosb byte ptr [rdi], al -;; 6a5c: 800100 add byte ptr [rcx], 0 -;; 6a5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6a68: 800100 add byte ptr [rcx], 0 -;; 6a6b: aa stosb byte ptr [rdi], al -;; 6a6c: 800100 add byte ptr [rcx], 0 -;; 6a6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6a78: 800100 add byte ptr [rcx], 0 -;; 6a7b: aa stosb byte ptr [rdi], al -;; 6a7c: 800100 add byte ptr [rcx], 0 -;; 6a7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6a88: 800100 add byte ptr [rcx], 0 -;; 6a8b: aa stosb byte ptr [rdi], al -;; 6a8c: 800100 add byte ptr [rcx], 0 -;; 6a8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6a98: 800100 add byte ptr [rcx], 0 -;; 6a9b: aa stosb byte ptr [rdi], al -;; 6a9c: 800100 add byte ptr [rcx], 0 -;; 6a9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6aa8: 800100 add byte ptr [rcx], 0 -;; 6aab: aa stosb byte ptr [rdi], al -;; 6aac: 800100 add byte ptr [rcx], 0 -;; 6aaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6ab8: 800100 add byte ptr [rcx], 0 -;; 6abb: aa stosb byte ptr [rdi], al -;; 6abc: 800100 add byte ptr [rcx], 0 -;; 6abf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6ac8: 800100 add byte ptr [rcx], 0 -;; 6acb: aa stosb byte ptr [rdi], al -;; 6acc: 800100 add byte ptr [rcx], 0 -;; 6acf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6ad8: 800100 add byte ptr [rcx], 0 -;; 6adb: aa stosb byte ptr [rdi], al -;; 6adc: 800100 add byte ptr [rcx], 0 -;; 6adf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6ae8: 800100 add byte ptr [rcx], 0 -;; 6aeb: aa stosb byte ptr [rdi], al -;; 6aec: 800100 add byte ptr [rcx], 0 -;; 6aef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6af8: 800100 add byte ptr [rcx], 0 -;; 6afb: aa stosb byte ptr [rdi], al -;; 6afc: 800100 add byte ptr [rcx], 0 -;; 6aff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6b08: 800100 add byte ptr [rcx], 0 -;; 6b0b: aa stosb byte ptr [rdi], al -;; 6b0c: 800100 add byte ptr [rcx], 0 -;; 6b0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6b18: 800100 add byte ptr [rcx], 0 -;; 6b1b: aa stosb byte ptr [rdi], al -;; 6b1c: 800100 add byte ptr [rcx], 0 -;; 6b1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6b28: 800100 add byte ptr [rcx], 0 -;; 6b2b: aa stosb byte ptr [rdi], al -;; 6b2c: 800100 add byte ptr [rcx], 0 -;; 6b2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6b38: 800100 add byte ptr [rcx], 0 -;; 6b3b: aa stosb byte ptr [rdi], al -;; 6b3c: 800100 add byte ptr [rcx], 0 -;; 6b3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6b48: 800100 add byte ptr [rcx], 0 -;; 6b4b: aa stosb byte ptr [rdi], al -;; 6b4c: 800100 add byte ptr [rcx], 0 -;; 6b4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6b58: 800100 add byte ptr [rcx], 0 -;; 6b5b: aa stosb byte ptr [rdi], al -;; 6b5c: 800100 add byte ptr [rcx], 0 -;; 6b5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6b68: 800100 add byte ptr [rcx], 0 -;; 6b6b: aa stosb byte ptr [rdi], al -;; 6b6c: 800100 add byte ptr [rcx], 0 -;; 6b6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6b78: 800100 add byte ptr [rcx], 0 -;; 6b7b: aa stosb byte ptr [rdi], al -;; 6b7c: 800100 add byte ptr [rcx], 0 -;; 6b7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6b88: 800100 add byte ptr [rcx], 0 -;; 6b8b: aa stosb byte ptr [rdi], al -;; 6b8c: 800100 add byte ptr [rcx], 0 -;; 6b8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6b98: 800100 add byte ptr [rcx], 0 -;; 6b9b: aa stosb byte ptr [rdi], al -;; 6b9c: 800100 add byte ptr [rcx], 0 -;; 6b9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6ba8: 800100 add byte ptr [rcx], 0 -;; 6bab: aa stosb byte ptr [rdi], al -;; 6bac: 800100 add byte ptr [rcx], 0 -;; 6baf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6bb8: 800100 add byte ptr [rcx], 0 -;; 6bbb: aa stosb byte ptr [rdi], al -;; 6bbc: 800100 add byte ptr [rcx], 0 -;; 6bbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6bc8: 800100 add byte ptr [rcx], 0 -;; 6bcb: aa stosb byte ptr [rdi], al -;; 6bcc: 800100 add byte ptr [rcx], 0 -;; 6bcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6bd8: 800100 add byte ptr [rcx], 0 -;; 6bdb: aa stosb byte ptr [rdi], al -;; 6bdc: 800100 add byte ptr [rcx], 0 -;; 6bdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6be8: 800100 add byte ptr [rcx], 0 -;; 6beb: aa stosb byte ptr [rdi], al -;; 6bec: 800100 add byte ptr [rcx], 0 -;; 6bef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6bf8: 800100 add byte ptr [rcx], 0 -;; 6bfb: aa stosb byte ptr [rdi], al -;; 6bfc: 800100 add byte ptr [rcx], 0 -;; 6bff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6c08: 800100 add byte ptr [rcx], 0 -;; 6c0b: aa stosb byte ptr [rdi], al -;; 6c0c: 800100 add byte ptr [rcx], 0 -;; 6c0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6c18: 800100 add byte ptr [rcx], 0 -;; 6c1b: aa stosb byte ptr [rdi], al -;; 6c1c: 800100 add byte ptr [rcx], 0 -;; 6c1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6c28: 800100 add byte ptr [rcx], 0 -;; 6c2b: aa stosb byte ptr [rdi], al -;; 6c2c: 800100 add byte ptr [rcx], 0 -;; 6c2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6c38: 800100 add byte ptr [rcx], 0 -;; 6c3b: aa stosb byte ptr [rdi], al -;; 6c3c: 800100 add byte ptr [rcx], 0 -;; 6c3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6c48: 800100 add byte ptr [rcx], 0 -;; 6c4b: aa stosb byte ptr [rdi], al -;; 6c4c: 800100 add byte ptr [rcx], 0 -;; 6c4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6c58: 800100 add byte ptr [rcx], 0 -;; 6c5b: aa stosb byte ptr [rdi], al -;; 6c5c: 800100 add byte ptr [rcx], 0 -;; 6c5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6c68: 800100 add byte ptr [rcx], 0 -;; 6c6b: aa stosb byte ptr [rdi], al -;; 6c6c: 800100 add byte ptr [rcx], 0 -;; 6c6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6c78: 800100 add byte ptr [rcx], 0 -;; 6c7b: aa stosb byte ptr [rdi], al -;; 6c7c: 800100 add byte ptr [rcx], 0 -;; 6c7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6c88: 800100 add byte ptr [rcx], 0 -;; 6c8b: aa stosb byte ptr [rdi], al -;; 6c8c: 800100 add byte ptr [rcx], 0 -;; 6c8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6c98: 800100 add byte ptr [rcx], 0 -;; 6c9b: aa stosb byte ptr [rdi], al -;; 6c9c: 800100 add byte ptr [rcx], 0 -;; 6c9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6ca8: 800100 add byte ptr [rcx], 0 -;; 6cab: aa stosb byte ptr [rdi], al -;; 6cac: 800100 add byte ptr [rcx], 0 -;; 6caf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6cb8: 800100 add byte ptr [rcx], 0 -;; 6cbb: aa stosb byte ptr [rdi], al -;; 6cbc: 800100 add byte ptr [rcx], 0 -;; 6cbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6cc8: 800100 add byte ptr [rcx], 0 -;; 6ccb: aa stosb byte ptr [rdi], al -;; 6ccc: 800100 add byte ptr [rcx], 0 -;; 6ccf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6cd8: 800100 add byte ptr [rcx], 0 -;; 6cdb: aa stosb byte ptr [rdi], al -;; 6cdc: 800100 add byte ptr [rcx], 0 -;; 6cdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6ce8: 800100 add byte ptr [rcx], 0 -;; 6ceb: aa stosb byte ptr [rdi], al -;; 6cec: 800100 add byte ptr [rcx], 0 -;; 6cef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6cf8: 800100 add byte ptr [rcx], 0 -;; 6cfb: aa stosb byte ptr [rdi], al -;; 6cfc: 800100 add byte ptr [rcx], 0 -;; 6cff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6d08: 800100 add byte ptr [rcx], 0 -;; 6d0b: aa stosb byte ptr [rdi], al -;; 6d0c: 800100 add byte ptr [rcx], 0 -;; 6d0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6d18: 800100 add byte ptr [rcx], 0 -;; 6d1b: aa stosb byte ptr [rdi], al -;; 6d1c: 800100 add byte ptr [rcx], 0 -;; 6d1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6d28: 800100 add byte ptr [rcx], 0 -;; 6d2b: aa stosb byte ptr [rdi], al -;; 6d2c: 800100 add byte ptr [rcx], 0 -;; 6d2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6d38: 800100 add byte ptr [rcx], 0 -;; 6d3b: aa stosb byte ptr [rdi], al -;; 6d3c: 800100 add byte ptr [rcx], 0 -;; 6d3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6d48: 800100 add byte ptr [rcx], 0 -;; 6d4b: aa stosb byte ptr [rdi], al -;; 6d4c: 800100 add byte ptr [rcx], 0 -;; 6d4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6d58: 800100 add byte ptr [rcx], 0 -;; 6d5b: aa stosb byte ptr [rdi], al -;; 6d5c: 800100 add byte ptr [rcx], 0 -;; 6d5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6d68: 800100 add byte ptr [rcx], 0 -;; 6d6b: aa stosb byte ptr [rdi], al -;; 6d6c: 800100 add byte ptr [rcx], 0 -;; 6d6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6d78: 800100 add byte ptr [rcx], 0 -;; 6d7b: aa stosb byte ptr [rdi], al -;; 6d7c: 800100 add byte ptr [rcx], 0 -;; 6d7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6d88: 800100 add byte ptr [rcx], 0 -;; 6d8b: aa stosb byte ptr [rdi], al -;; 6d8c: 800100 add byte ptr [rcx], 0 -;; 6d8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6d98: 800100 add byte ptr [rcx], 0 -;; 6d9b: aa stosb byte ptr [rdi], al -;; 6d9c: 800100 add byte ptr [rcx], 0 -;; 6d9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6da8: 800100 add byte ptr [rcx], 0 -;; 6dab: aa stosb byte ptr [rdi], al -;; 6dac: 800100 add byte ptr [rcx], 0 -;; 6daf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6db8: 800100 add byte ptr [rcx], 0 -;; 6dbb: aa stosb byte ptr [rdi], al -;; 6dbc: 800100 add byte ptr [rcx], 0 -;; 6dbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6dc8: 800100 add byte ptr [rcx], 0 -;; 6dcb: aa stosb byte ptr [rdi], al -;; 6dcc: 800100 add byte ptr [rcx], 0 -;; 6dcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6dd8: 800100 add byte ptr [rcx], 0 -;; 6ddb: aa stosb byte ptr [rdi], al -;; 6ddc: 800100 add byte ptr [rcx], 0 -;; 6ddf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6de8: 800100 add byte ptr [rcx], 0 -;; 6deb: aa stosb byte ptr [rdi], al -;; 6dec: 800100 add byte ptr [rcx], 0 -;; 6def: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6df8: 800100 add byte ptr [rcx], 0 -;; 6dfb: aa stosb byte ptr [rdi], al -;; 6dfc: 800100 add byte ptr [rcx], 0 -;; 6dff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6e08: 800100 add byte ptr [rcx], 0 -;; 6e0b: aa stosb byte ptr [rdi], al -;; 6e0c: 800100 add byte ptr [rcx], 0 -;; 6e0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6e18: 800100 add byte ptr [rcx], 0 -;; 6e1b: aa stosb byte ptr [rdi], al -;; 6e1c: 800100 add byte ptr [rcx], 0 -;; 6e1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6e28: 800100 add byte ptr [rcx], 0 -;; 6e2b: aa stosb byte ptr [rdi], al -;; 6e2c: 800100 add byte ptr [rcx], 0 -;; 6e2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6e38: 800100 add byte ptr [rcx], 0 -;; 6e3b: aa stosb byte ptr [rdi], al -;; 6e3c: 800100 add byte ptr [rcx], 0 -;; 6e3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6e48: 800100 add byte ptr [rcx], 0 -;; 6e4b: aa stosb byte ptr [rdi], al -;; 6e4c: 800100 add byte ptr [rcx], 0 -;; 6e4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6e58: 800100 add byte ptr [rcx], 0 -;; 6e5b: aa stosb byte ptr [rdi], al -;; 6e5c: 800100 add byte ptr [rcx], 0 -;; 6e5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6e68: 800100 add byte ptr [rcx], 0 -;; 6e6b: aa stosb byte ptr [rdi], al -;; 6e6c: 800100 add byte ptr [rcx], 0 -;; 6e6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6e78: 800100 add byte ptr [rcx], 0 -;; 6e7b: aa stosb byte ptr [rdi], al -;; 6e7c: 800100 add byte ptr [rcx], 0 -;; 6e7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6e88: 800100 add byte ptr [rcx], 0 -;; 6e8b: aa stosb byte ptr [rdi], al -;; 6e8c: 800100 add byte ptr [rcx], 0 -;; 6e8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6e98: 800100 add byte ptr [rcx], 0 -;; 6e9b: aa stosb byte ptr [rdi], al -;; 6e9c: 800100 add byte ptr [rcx], 0 -;; 6e9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6ea8: 800100 add byte ptr [rcx], 0 -;; 6eab: aa stosb byte ptr [rdi], al -;; 6eac: 800100 add byte ptr [rcx], 0 -;; 6eaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6eb8: 800100 add byte ptr [rcx], 0 -;; 6ebb: aa stosb byte ptr [rdi], al -;; 6ebc: 800100 add byte ptr [rcx], 0 -;; 6ebf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6ec8: 800100 add byte ptr [rcx], 0 -;; 6ecb: aa stosb byte ptr [rdi], al -;; 6ecc: 800100 add byte ptr [rcx], 0 -;; 6ecf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6ed8: 800100 add byte ptr [rcx], 0 -;; 6edb: aa stosb byte ptr [rdi], al -;; 6edc: 800100 add byte ptr [rcx], 0 -;; 6edf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6ee8: 800100 add byte ptr [rcx], 0 -;; 6eeb: aa stosb byte ptr [rdi], al -;; 6eec: 800100 add byte ptr [rcx], 0 -;; 6eef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6ef8: 800100 add byte ptr [rcx], 0 -;; 6efb: aa stosb byte ptr [rdi], al -;; 6efc: 800100 add byte ptr [rcx], 0 -;; 6eff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6f08: 800100 add byte ptr [rcx], 0 -;; 6f0b: aa stosb byte ptr [rdi], al -;; 6f0c: 800100 add byte ptr [rcx], 0 -;; 6f0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6f18: 800100 add byte ptr [rcx], 0 -;; 6f1b: aa stosb byte ptr [rdi], al -;; 6f1c: 800100 add byte ptr [rcx], 0 -;; 6f1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6f28: 800100 add byte ptr [rcx], 0 -;; 6f2b: aa stosb byte ptr [rdi], al -;; 6f2c: 800100 add byte ptr [rcx], 0 -;; 6f2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6f38: 800100 add byte ptr [rcx], 0 -;; 6f3b: aa stosb byte ptr [rdi], al -;; 6f3c: 800100 add byte ptr [rcx], 0 -;; 6f3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6f48: 800100 add byte ptr [rcx], 0 -;; 6f4b: aa stosb byte ptr [rdi], al -;; 6f4c: 800100 add byte ptr [rcx], 0 -;; 6f4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6f58: 800100 add byte ptr [rcx], 0 -;; 6f5b: aa stosb byte ptr [rdi], al -;; 6f5c: 800100 add byte ptr [rcx], 0 -;; 6f5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6f68: 800100 add byte ptr [rcx], 0 -;; 6f6b: aa stosb byte ptr [rdi], al -;; 6f6c: 800100 add byte ptr [rcx], 0 -;; 6f6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6f78: 800100 add byte ptr [rcx], 0 -;; 6f7b: aa stosb byte ptr [rdi], al -;; 6f7c: 800100 add byte ptr [rcx], 0 -;; 6f7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6f88: 800100 add byte ptr [rcx], 0 -;; 6f8b: aa stosb byte ptr [rdi], al -;; 6f8c: 800100 add byte ptr [rcx], 0 -;; 6f8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6f98: 800100 add byte ptr [rcx], 0 -;; 6f9b: aa stosb byte ptr [rdi], al -;; 6f9c: 800100 add byte ptr [rcx], 0 -;; 6f9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6fa8: 800100 add byte ptr [rcx], 0 -;; 6fab: aa stosb byte ptr [rdi], al -;; 6fac: 800100 add byte ptr [rcx], 0 -;; 6faf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6fb8: 800100 add byte ptr [rcx], 0 -;; 6fbb: aa stosb byte ptr [rdi], al -;; 6fbc: 800100 add byte ptr [rcx], 0 -;; 6fbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6fc8: 800100 add byte ptr [rcx], 0 -;; 6fcb: aa stosb byte ptr [rdi], al -;; 6fcc: 800100 add byte ptr [rcx], 0 -;; 6fcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6fd8: 800100 add byte ptr [rcx], 0 -;; 6fdb: aa stosb byte ptr [rdi], al -;; 6fdc: 800100 add byte ptr [rcx], 0 -;; 6fdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6fe8: 800100 add byte ptr [rcx], 0 -;; 6feb: aa stosb byte ptr [rdi], al -;; 6fec: 800100 add byte ptr [rcx], 0 -;; 6fef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 6ff8: 800100 add byte ptr [rcx], 0 -;; 6ffb: aa stosb byte ptr [rdi], al -;; 6ffc: 800100 add byte ptr [rcx], 0 -;; 6fff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7008: 800100 add byte ptr [rcx], 0 -;; 700b: aa stosb byte ptr [rdi], al -;; 700c: 800100 add byte ptr [rcx], 0 -;; 700f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7018: 800100 add byte ptr [rcx], 0 -;; 701b: aa stosb byte ptr [rdi], al -;; 701c: 800100 add byte ptr [rcx], 0 -;; 701f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7028: 800100 add byte ptr [rcx], 0 -;; 702b: aa stosb byte ptr [rdi], al -;; 702c: 800100 add byte ptr [rcx], 0 -;; 702f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7038: 800100 add byte ptr [rcx], 0 -;; 703b: aa stosb byte ptr [rdi], al -;; 703c: 800100 add byte ptr [rcx], 0 -;; 703f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7048: 800100 add byte ptr [rcx], 0 -;; 704b: aa stosb byte ptr [rdi], al -;; 704c: 800100 add byte ptr [rcx], 0 -;; 704f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7058: 800100 add byte ptr [rcx], 0 -;; 705b: aa stosb byte ptr [rdi], al -;; 705c: 800100 add byte ptr [rcx], 0 -;; 705f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7068: 800100 add byte ptr [rcx], 0 -;; 706b: aa stosb byte ptr [rdi], al -;; 706c: 800100 add byte ptr [rcx], 0 -;; 706f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7078: 800100 add byte ptr [rcx], 0 -;; 707b: aa stosb byte ptr [rdi], al -;; 707c: 800100 add byte ptr [rcx], 0 -;; 707f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7088: 800100 add byte ptr [rcx], 0 -;; 708b: aa stosb byte ptr [rdi], al -;; 708c: 800100 add byte ptr [rcx], 0 -;; 708f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7098: 800100 add byte ptr [rcx], 0 -;; 709b: aa stosb byte ptr [rdi], al -;; 709c: 800100 add byte ptr [rcx], 0 -;; 709f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 70a8: 800100 add byte ptr [rcx], 0 -;; 70ab: aa stosb byte ptr [rdi], al -;; 70ac: 800100 add byte ptr [rcx], 0 -;; 70af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 70b8: 800100 add byte ptr [rcx], 0 -;; 70bb: aa stosb byte ptr [rdi], al -;; 70bc: 800100 add byte ptr [rcx], 0 -;; 70bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 70c8: 800100 add byte ptr [rcx], 0 -;; 70cb: aa stosb byte ptr [rdi], al -;; 70cc: 800100 add byte ptr [rcx], 0 -;; 70cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 70d8: 800100 add byte ptr [rcx], 0 -;; 70db: aa stosb byte ptr [rdi], al -;; 70dc: 800100 add byte ptr [rcx], 0 -;; 70df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 70e8: 800100 add byte ptr [rcx], 0 -;; 70eb: aa stosb byte ptr [rdi], al -;; 70ec: 800100 add byte ptr [rcx], 0 -;; 70ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 70f8: 800100 add byte ptr [rcx], 0 -;; 70fb: aa stosb byte ptr [rdi], al -;; 70fc: 800100 add byte ptr [rcx], 0 -;; 70ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7108: 800100 add byte ptr [rcx], 0 -;; 710b: aa stosb byte ptr [rdi], al -;; 710c: 800100 add byte ptr [rcx], 0 -;; 710f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7118: 800100 add byte ptr [rcx], 0 -;; 711b: aa stosb byte ptr [rdi], al -;; 711c: 800100 add byte ptr [rcx], 0 -;; 711f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7128: 800100 add byte ptr [rcx], 0 -;; 712b: aa stosb byte ptr [rdi], al -;; 712c: 800100 add byte ptr [rcx], 0 -;; 712f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7138: 800100 add byte ptr [rcx], 0 -;; 713b: aa stosb byte ptr [rdi], al -;; 713c: 800100 add byte ptr [rcx], 0 -;; 713f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7148: 800100 add byte ptr [rcx], 0 -;; 714b: aa stosb byte ptr [rdi], al -;; 714c: 800100 add byte ptr [rcx], 0 -;; 714f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7158: 800100 add byte ptr [rcx], 0 -;; 715b: aa stosb byte ptr [rdi], al -;; 715c: 800100 add byte ptr [rcx], 0 -;; 715f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7168: 800100 add byte ptr [rcx], 0 -;; 716b: aa stosb byte ptr [rdi], al -;; 716c: 800100 add byte ptr [rcx], 0 -;; 716f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7178: 800100 add byte ptr [rcx], 0 -;; 717b: aa stosb byte ptr [rdi], al -;; 717c: 800100 add byte ptr [rcx], 0 -;; 717f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7188: 800100 add byte ptr [rcx], 0 -;; 718b: aa stosb byte ptr [rdi], al -;; 718c: 800100 add byte ptr [rcx], 0 -;; 718f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7198: 800100 add byte ptr [rcx], 0 -;; 719b: aa stosb byte ptr [rdi], al -;; 719c: 800100 add byte ptr [rcx], 0 -;; 719f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 71a8: 800100 add byte ptr [rcx], 0 -;; 71ab: aa stosb byte ptr [rdi], al -;; 71ac: 800100 add byte ptr [rcx], 0 -;; 71af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 71b8: 800100 add byte ptr [rcx], 0 -;; 71bb: aa stosb byte ptr [rdi], al -;; 71bc: 800100 add byte ptr [rcx], 0 -;; 71bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 71c8: 800100 add byte ptr [rcx], 0 -;; 71cb: aa stosb byte ptr [rdi], al -;; 71cc: 800100 add byte ptr [rcx], 0 -;; 71cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 71d8: 800100 add byte ptr [rcx], 0 -;; 71db: aa stosb byte ptr [rdi], al -;; 71dc: 800100 add byte ptr [rcx], 0 -;; 71df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 71e8: 800100 add byte ptr [rcx], 0 -;; 71eb: aa stosb byte ptr [rdi], al -;; 71ec: 800100 add byte ptr [rcx], 0 -;; 71ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 71f8: 800100 add byte ptr [rcx], 0 -;; 71fb: aa stosb byte ptr [rdi], al -;; 71fc: 800100 add byte ptr [rcx], 0 -;; 71ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7208: 800100 add byte ptr [rcx], 0 -;; 720b: aa stosb byte ptr [rdi], al -;; 720c: 800100 add byte ptr [rcx], 0 -;; 720f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7218: 800100 add byte ptr [rcx], 0 -;; 721b: aa stosb byte ptr [rdi], al -;; 721c: 800100 add byte ptr [rcx], 0 -;; 721f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7228: 800100 add byte ptr [rcx], 0 -;; 722b: aa stosb byte ptr [rdi], al -;; 722c: 800100 add byte ptr [rcx], 0 -;; 722f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7238: 800100 add byte ptr [rcx], 0 -;; 723b: aa stosb byte ptr [rdi], al -;; 723c: 800100 add byte ptr [rcx], 0 -;; 723f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7248: 800100 add byte ptr [rcx], 0 -;; 724b: aa stosb byte ptr [rdi], al -;; 724c: 800100 add byte ptr [rcx], 0 -;; 724f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7258: 800100 add byte ptr [rcx], 0 -;; 725b: aa stosb byte ptr [rdi], al -;; 725c: 800100 add byte ptr [rcx], 0 -;; 725f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7268: 800100 add byte ptr [rcx], 0 -;; 726b: aa stosb byte ptr [rdi], al -;; 726c: 800100 add byte ptr [rcx], 0 -;; 726f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7278: 800100 add byte ptr [rcx], 0 -;; 727b: aa stosb byte ptr [rdi], al -;; 727c: 800100 add byte ptr [rcx], 0 -;; 727f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7288: 800100 add byte ptr [rcx], 0 -;; 728b: aa stosb byte ptr [rdi], al -;; 728c: 800100 add byte ptr [rcx], 0 -;; 728f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7298: 800100 add byte ptr [rcx], 0 -;; 729b: aa stosb byte ptr [rdi], al -;; 729c: 800100 add byte ptr [rcx], 0 -;; 729f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 72a8: 800100 add byte ptr [rcx], 0 -;; 72ab: aa stosb byte ptr [rdi], al -;; 72ac: 800100 add byte ptr [rcx], 0 -;; 72af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 72b8: 800100 add byte ptr [rcx], 0 -;; 72bb: aa stosb byte ptr [rdi], al -;; 72bc: 800100 add byte ptr [rcx], 0 -;; 72bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 72c8: 800100 add byte ptr [rcx], 0 -;; 72cb: aa stosb byte ptr [rdi], al -;; 72cc: 800100 add byte ptr [rcx], 0 -;; 72cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 72d8: 800100 add byte ptr [rcx], 0 -;; 72db: aa stosb byte ptr [rdi], al -;; 72dc: 800100 add byte ptr [rcx], 0 -;; 72df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 72e8: 800100 add byte ptr [rcx], 0 -;; 72eb: aa stosb byte ptr [rdi], al -;; 72ec: 800100 add byte ptr [rcx], 0 -;; 72ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 72f8: 800100 add byte ptr [rcx], 0 -;; 72fb: aa stosb byte ptr [rdi], al -;; 72fc: 800100 add byte ptr [rcx], 0 -;; 72ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7308: 800100 add byte ptr [rcx], 0 -;; 730b: aa stosb byte ptr [rdi], al -;; 730c: 800100 add byte ptr [rcx], 0 -;; 730f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7318: 800100 add byte ptr [rcx], 0 -;; 731b: aa stosb byte ptr [rdi], al -;; 731c: 800100 add byte ptr [rcx], 0 -;; 731f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7328: 800100 add byte ptr [rcx], 0 -;; 732b: aa stosb byte ptr [rdi], al -;; 732c: 800100 add byte ptr [rcx], 0 -;; 732f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7338: 800100 add byte ptr [rcx], 0 -;; 733b: aa stosb byte ptr [rdi], al -;; 733c: 800100 add byte ptr [rcx], 0 -;; 733f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7348: 800100 add byte ptr [rcx], 0 -;; 734b: aa stosb byte ptr [rdi], al -;; 734c: 800100 add byte ptr [rcx], 0 -;; 734f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7358: 800100 add byte ptr [rcx], 0 -;; 735b: aa stosb byte ptr [rdi], al -;; 735c: 800100 add byte ptr [rcx], 0 -;; 735f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7368: 800100 add byte ptr [rcx], 0 -;; 736b: aa stosb byte ptr [rdi], al -;; 736c: 800100 add byte ptr [rcx], 0 -;; 736f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7378: 800100 add byte ptr [rcx], 0 -;; 737b: aa stosb byte ptr [rdi], al -;; 737c: 800100 add byte ptr [rcx], 0 -;; 737f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7388: 800100 add byte ptr [rcx], 0 -;; 738b: aa stosb byte ptr [rdi], al -;; 738c: 800100 add byte ptr [rcx], 0 -;; 738f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7398: 800100 add byte ptr [rcx], 0 -;; 739b: aa stosb byte ptr [rdi], al -;; 739c: 800100 add byte ptr [rcx], 0 -;; 739f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 73a8: 800100 add byte ptr [rcx], 0 -;; 73ab: aa stosb byte ptr [rdi], al -;; 73ac: 800100 add byte ptr [rcx], 0 -;; 73af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 73b8: 800100 add byte ptr [rcx], 0 -;; 73bb: aa stosb byte ptr [rdi], al -;; 73bc: 800100 add byte ptr [rcx], 0 -;; 73bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 73c8: 800100 add byte ptr [rcx], 0 -;; 73cb: aa stosb byte ptr [rdi], al -;; 73cc: 800100 add byte ptr [rcx], 0 -;; 73cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 73d8: 800100 add byte ptr [rcx], 0 -;; 73db: aa stosb byte ptr [rdi], al -;; 73dc: 800100 add byte ptr [rcx], 0 -;; 73df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 73e8: 800100 add byte ptr [rcx], 0 -;; 73eb: aa stosb byte ptr [rdi], al -;; 73ec: 800100 add byte ptr [rcx], 0 -;; 73ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 73f8: 800100 add byte ptr [rcx], 0 -;; 73fb: aa stosb byte ptr [rdi], al -;; 73fc: 800100 add byte ptr [rcx], 0 -;; 73ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7408: 800100 add byte ptr [rcx], 0 -;; 740b: aa stosb byte ptr [rdi], al -;; 740c: 800100 add byte ptr [rcx], 0 -;; 740f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7418: 800100 add byte ptr [rcx], 0 -;; 741b: aa stosb byte ptr [rdi], al -;; 741c: 800100 add byte ptr [rcx], 0 -;; 741f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7428: 800100 add byte ptr [rcx], 0 -;; 742b: aa stosb byte ptr [rdi], al -;; 742c: 800100 add byte ptr [rcx], 0 -;; 742f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7438: 800100 add byte ptr [rcx], 0 -;; 743b: aa stosb byte ptr [rdi], al -;; 743c: 800100 add byte ptr [rcx], 0 -;; 743f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7448: 800100 add byte ptr [rcx], 0 -;; 744b: aa stosb byte ptr [rdi], al -;; 744c: 800100 add byte ptr [rcx], 0 -;; 744f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7458: 800100 add byte ptr [rcx], 0 -;; 745b: aa stosb byte ptr [rdi], al -;; 745c: 800100 add byte ptr [rcx], 0 -;; 745f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7468: 800100 add byte ptr [rcx], 0 -;; 746b: aa stosb byte ptr [rdi], al -;; 746c: 800100 add byte ptr [rcx], 0 -;; 746f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7478: 800100 add byte ptr [rcx], 0 -;; 747b: aa stosb byte ptr [rdi], al -;; 747c: 800100 add byte ptr [rcx], 0 -;; 747f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7488: 800100 add byte ptr [rcx], 0 -;; 748b: aa stosb byte ptr [rdi], al -;; 748c: 800100 add byte ptr [rcx], 0 -;; 748f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7498: 800100 add byte ptr [rcx], 0 -;; 749b: aa stosb byte ptr [rdi], al -;; 749c: 800100 add byte ptr [rcx], 0 -;; 749f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 74a8: 800100 add byte ptr [rcx], 0 -;; 74ab: aa stosb byte ptr [rdi], al -;; 74ac: 800100 add byte ptr [rcx], 0 -;; 74af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 74b8: 800100 add byte ptr [rcx], 0 -;; 74bb: aa stosb byte ptr [rdi], al -;; 74bc: 800100 add byte ptr [rcx], 0 -;; 74bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 74c8: 800100 add byte ptr [rcx], 0 -;; 74cb: aa stosb byte ptr [rdi], al -;; 74cc: 800100 add byte ptr [rcx], 0 -;; 74cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 74d8: 800100 add byte ptr [rcx], 0 -;; 74db: aa stosb byte ptr [rdi], al -;; 74dc: 800100 add byte ptr [rcx], 0 -;; 74df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 74e8: 800100 add byte ptr [rcx], 0 -;; 74eb: aa stosb byte ptr [rdi], al -;; 74ec: 800100 add byte ptr [rcx], 0 -;; 74ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 74f8: 800100 add byte ptr [rcx], 0 -;; 74fb: aa stosb byte ptr [rdi], al -;; 74fc: 800100 add byte ptr [rcx], 0 -;; 74ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7508: 800100 add byte ptr [rcx], 0 -;; 750b: aa stosb byte ptr [rdi], al -;; 750c: 800100 add byte ptr [rcx], 0 -;; 750f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7518: 800100 add byte ptr [rcx], 0 -;; 751b: aa stosb byte ptr [rdi], al -;; 751c: 800100 add byte ptr [rcx], 0 -;; 751f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7528: 800100 add byte ptr [rcx], 0 -;; 752b: aa stosb byte ptr [rdi], al -;; 752c: 800100 add byte ptr [rcx], 0 -;; 752f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7538: 800100 add byte ptr [rcx], 0 -;; 753b: aa stosb byte ptr [rdi], al -;; 753c: 800100 add byte ptr [rcx], 0 -;; 753f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7548: 800100 add byte ptr [rcx], 0 -;; 754b: aa stosb byte ptr [rdi], al -;; 754c: 800100 add byte ptr [rcx], 0 -;; 754f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7558: 800100 add byte ptr [rcx], 0 -;; 755b: aa stosb byte ptr [rdi], al -;; 755c: 800100 add byte ptr [rcx], 0 -;; 755f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7568: 800100 add byte ptr [rcx], 0 -;; 756b: aa stosb byte ptr [rdi], al -;; 756c: 800100 add byte ptr [rcx], 0 -;; 756f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7578: 800100 add byte ptr [rcx], 0 -;; 757b: aa stosb byte ptr [rdi], al -;; 757c: 800100 add byte ptr [rcx], 0 -;; 757f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7588: 800100 add byte ptr [rcx], 0 -;; 758b: aa stosb byte ptr [rdi], al -;; 758c: 800100 add byte ptr [rcx], 0 -;; 758f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7598: 800100 add byte ptr [rcx], 0 -;; 759b: aa stosb byte ptr [rdi], al -;; 759c: 800100 add byte ptr [rcx], 0 -;; 759f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 75a8: 800100 add byte ptr [rcx], 0 -;; 75ab: aa stosb byte ptr [rdi], al -;; 75ac: 800100 add byte ptr [rcx], 0 -;; 75af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 75b8: 800100 add byte ptr [rcx], 0 -;; 75bb: aa stosb byte ptr [rdi], al -;; 75bc: 800100 add byte ptr [rcx], 0 -;; 75bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 75c8: 800100 add byte ptr [rcx], 0 -;; 75cb: aa stosb byte ptr [rdi], al -;; 75cc: 800100 add byte ptr [rcx], 0 -;; 75cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 75d8: 800100 add byte ptr [rcx], 0 -;; 75db: aa stosb byte ptr [rdi], al -;; 75dc: 800100 add byte ptr [rcx], 0 -;; 75df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 75e8: 800100 add byte ptr [rcx], 0 -;; 75eb: aa stosb byte ptr [rdi], al -;; 75ec: 800100 add byte ptr [rcx], 0 -;; 75ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 75f8: 800100 add byte ptr [rcx], 0 -;; 75fb: aa stosb byte ptr [rdi], al -;; 75fc: 800100 add byte ptr [rcx], 0 -;; 75ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7608: 800100 add byte ptr [rcx], 0 -;; 760b: aa stosb byte ptr [rdi], al -;; 760c: 800100 add byte ptr [rcx], 0 -;; 760f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7618: 800100 add byte ptr [rcx], 0 -;; 761b: aa stosb byte ptr [rdi], al -;; 761c: 800100 add byte ptr [rcx], 0 -;; 761f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7628: 800100 add byte ptr [rcx], 0 -;; 762b: aa stosb byte ptr [rdi], al -;; 762c: 800100 add byte ptr [rcx], 0 -;; 762f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7638: 800100 add byte ptr [rcx], 0 -;; 763b: aa stosb byte ptr [rdi], al -;; 763c: 800100 add byte ptr [rcx], 0 -;; 763f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7648: 800100 add byte ptr [rcx], 0 -;; 764b: aa stosb byte ptr [rdi], al -;; 764c: 800100 add byte ptr [rcx], 0 -;; 764f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7658: 800100 add byte ptr [rcx], 0 -;; 765b: aa stosb byte ptr [rdi], al -;; 765c: 800100 add byte ptr [rcx], 0 -;; 765f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7668: 800100 add byte ptr [rcx], 0 -;; 766b: aa stosb byte ptr [rdi], al -;; 766c: 800100 add byte ptr [rcx], 0 -;; 766f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7678: 800100 add byte ptr [rcx], 0 -;; 767b: aa stosb byte ptr [rdi], al -;; 767c: 800100 add byte ptr [rcx], 0 -;; 767f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7688: 800100 add byte ptr [rcx], 0 -;; 768b: aa stosb byte ptr [rdi], al -;; 768c: 800100 add byte ptr [rcx], 0 -;; 768f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7698: 800100 add byte ptr [rcx], 0 -;; 769b: aa stosb byte ptr [rdi], al -;; 769c: 800100 add byte ptr [rcx], 0 -;; 769f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 76a8: 800100 add byte ptr [rcx], 0 -;; 76ab: aa stosb byte ptr [rdi], al -;; 76ac: 800100 add byte ptr [rcx], 0 -;; 76af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 76b8: 800100 add byte ptr [rcx], 0 -;; 76bb: aa stosb byte ptr [rdi], al -;; 76bc: 800100 add byte ptr [rcx], 0 -;; 76bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 76c8: 800100 add byte ptr [rcx], 0 -;; 76cb: aa stosb byte ptr [rdi], al -;; 76cc: 800100 add byte ptr [rcx], 0 -;; 76cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 76d8: 800100 add byte ptr [rcx], 0 -;; 76db: aa stosb byte ptr [rdi], al -;; 76dc: 800100 add byte ptr [rcx], 0 -;; 76df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 76e8: 800100 add byte ptr [rcx], 0 -;; 76eb: aa stosb byte ptr [rdi], al -;; 76ec: 800100 add byte ptr [rcx], 0 -;; 76ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 76f8: 800100 add byte ptr [rcx], 0 -;; 76fb: aa stosb byte ptr [rdi], al -;; 76fc: 800100 add byte ptr [rcx], 0 -;; 76ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7708: 800100 add byte ptr [rcx], 0 -;; 770b: aa stosb byte ptr [rdi], al -;; 770c: 800100 add byte ptr [rcx], 0 -;; 770f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7718: 800100 add byte ptr [rcx], 0 -;; 771b: aa stosb byte ptr [rdi], al -;; 771c: 800100 add byte ptr [rcx], 0 -;; 771f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7728: 800100 add byte ptr [rcx], 0 -;; 772b: aa stosb byte ptr [rdi], al -;; 772c: 800100 add byte ptr [rcx], 0 -;; 772f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7738: 800100 add byte ptr [rcx], 0 -;; 773b: aa stosb byte ptr [rdi], al -;; 773c: 800100 add byte ptr [rcx], 0 -;; 773f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7748: 800100 add byte ptr [rcx], 0 -;; 774b: aa stosb byte ptr [rdi], al -;; 774c: 800100 add byte ptr [rcx], 0 -;; 774f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7758: 800100 add byte ptr [rcx], 0 -;; 775b: aa stosb byte ptr [rdi], al -;; 775c: 800100 add byte ptr [rcx], 0 -;; 775f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7768: 800100 add byte ptr [rcx], 0 -;; 776b: aa stosb byte ptr [rdi], al -;; 776c: 800100 add byte ptr [rcx], 0 -;; 776f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7778: 800100 add byte ptr [rcx], 0 -;; 777b: aa stosb byte ptr [rdi], al -;; 777c: 800100 add byte ptr [rcx], 0 -;; 777f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7788: 800100 add byte ptr [rcx], 0 -;; 778b: aa stosb byte ptr [rdi], al -;; 778c: 800100 add byte ptr [rcx], 0 -;; 778f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7798: 800100 add byte ptr [rcx], 0 -;; 779b: aa stosb byte ptr [rdi], al -;; 779c: 800100 add byte ptr [rcx], 0 -;; 779f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 77a8: 800100 add byte ptr [rcx], 0 -;; 77ab: aa stosb byte ptr [rdi], al -;; 77ac: 800100 add byte ptr [rcx], 0 -;; 77af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 77b8: 800100 add byte ptr [rcx], 0 -;; 77bb: aa stosb byte ptr [rdi], al -;; 77bc: 800100 add byte ptr [rcx], 0 -;; 77bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 77c8: 800100 add byte ptr [rcx], 0 -;; 77cb: aa stosb byte ptr [rdi], al -;; 77cc: 800100 add byte ptr [rcx], 0 -;; 77cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 77d8: 800100 add byte ptr [rcx], 0 -;; 77db: aa stosb byte ptr [rdi], al -;; 77dc: 800100 add byte ptr [rcx], 0 -;; 77df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 77e8: 800100 add byte ptr [rcx], 0 -;; 77eb: aa stosb byte ptr [rdi], al -;; 77ec: 800100 add byte ptr [rcx], 0 -;; 77ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 77f8: 800100 add byte ptr [rcx], 0 -;; 77fb: aa stosb byte ptr [rdi], al -;; 77fc: 800100 add byte ptr [rcx], 0 -;; 77ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7808: 800100 add byte ptr [rcx], 0 -;; 780b: aa stosb byte ptr [rdi], al -;; 780c: 800100 add byte ptr [rcx], 0 -;; 780f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7818: 800100 add byte ptr [rcx], 0 -;; 781b: aa stosb byte ptr [rdi], al -;; 781c: 800100 add byte ptr [rcx], 0 -;; 781f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7828: 800100 add byte ptr [rcx], 0 -;; 782b: aa stosb byte ptr [rdi], al -;; 782c: 800100 add byte ptr [rcx], 0 -;; 782f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7838: 800100 add byte ptr [rcx], 0 -;; 783b: aa stosb byte ptr [rdi], al -;; 783c: 800100 add byte ptr [rcx], 0 -;; 783f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7848: 800100 add byte ptr [rcx], 0 -;; 784b: aa stosb byte ptr [rdi], al -;; 784c: 800100 add byte ptr [rcx], 0 -;; 784f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7858: 800100 add byte ptr [rcx], 0 -;; 785b: aa stosb byte ptr [rdi], al -;; 785c: 800100 add byte ptr [rcx], 0 -;; 785f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7868: 800100 add byte ptr [rcx], 0 -;; 786b: aa stosb byte ptr [rdi], al -;; 786c: 800100 add byte ptr [rcx], 0 -;; 786f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7878: 800100 add byte ptr [rcx], 0 -;; 787b: aa stosb byte ptr [rdi], al -;; 787c: 800100 add byte ptr [rcx], 0 -;; 787f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7888: 800100 add byte ptr [rcx], 0 -;; 788b: aa stosb byte ptr [rdi], al -;; 788c: 800100 add byte ptr [rcx], 0 -;; 788f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7898: 800100 add byte ptr [rcx], 0 -;; 789b: aa stosb byte ptr [rdi], al -;; 789c: 800100 add byte ptr [rcx], 0 -;; 789f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 78a8: 800100 add byte ptr [rcx], 0 -;; 78ab: aa stosb byte ptr [rdi], al -;; 78ac: 800100 add byte ptr [rcx], 0 -;; 78af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 78b8: 800100 add byte ptr [rcx], 0 -;; 78bb: aa stosb byte ptr [rdi], al -;; 78bc: 800100 add byte ptr [rcx], 0 -;; 78bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 78c8: 800100 add byte ptr [rcx], 0 -;; 78cb: aa stosb byte ptr [rdi], al -;; 78cc: 800100 add byte ptr [rcx], 0 -;; 78cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 78d8: 800100 add byte ptr [rcx], 0 -;; 78db: aa stosb byte ptr [rdi], al -;; 78dc: 800100 add byte ptr [rcx], 0 -;; 78df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 78e8: 800100 add byte ptr [rcx], 0 -;; 78eb: aa stosb byte ptr [rdi], al -;; 78ec: 800100 add byte ptr [rcx], 0 -;; 78ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 78f8: 800100 add byte ptr [rcx], 0 -;; 78fb: aa stosb byte ptr [rdi], al -;; 78fc: 800100 add byte ptr [rcx], 0 -;; 78ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7908: 800100 add byte ptr [rcx], 0 -;; 790b: aa stosb byte ptr [rdi], al -;; 790c: 800100 add byte ptr [rcx], 0 -;; 790f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7918: 800100 add byte ptr [rcx], 0 -;; 791b: aa stosb byte ptr [rdi], al -;; 791c: 800100 add byte ptr [rcx], 0 -;; 791f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7928: 800100 add byte ptr [rcx], 0 -;; 792b: aa stosb byte ptr [rdi], al -;; 792c: 800100 add byte ptr [rcx], 0 -;; 792f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7938: 800100 add byte ptr [rcx], 0 -;; 793b: aa stosb byte ptr [rdi], al -;; 793c: 800100 add byte ptr [rcx], 0 -;; 793f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7948: 800100 add byte ptr [rcx], 0 -;; 794b: aa stosb byte ptr [rdi], al -;; 794c: 800100 add byte ptr [rcx], 0 -;; 794f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7958: 800100 add byte ptr [rcx], 0 -;; 795b: aa stosb byte ptr [rdi], al -;; 795c: 800100 add byte ptr [rcx], 0 -;; 795f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7968: 800100 add byte ptr [rcx], 0 -;; 796b: aa stosb byte ptr [rdi], al -;; 796c: 800100 add byte ptr [rcx], 0 -;; 796f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7978: 800100 add byte ptr [rcx], 0 -;; 797b: aa stosb byte ptr [rdi], al -;; 797c: 800100 add byte ptr [rcx], 0 -;; 797f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7988: 800100 add byte ptr [rcx], 0 -;; 798b: aa stosb byte ptr [rdi], al -;; 798c: 800100 add byte ptr [rcx], 0 -;; 798f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7998: 800100 add byte ptr [rcx], 0 -;; 799b: aa stosb byte ptr [rdi], al -;; 799c: 800100 add byte ptr [rcx], 0 -;; 799f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 79a8: 800100 add byte ptr [rcx], 0 -;; 79ab: aa stosb byte ptr [rdi], al -;; 79ac: 800100 add byte ptr [rcx], 0 -;; 79af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 79b8: 800100 add byte ptr [rcx], 0 -;; 79bb: aa stosb byte ptr [rdi], al -;; 79bc: 800100 add byte ptr [rcx], 0 -;; 79bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 79c8: 800100 add byte ptr [rcx], 0 -;; 79cb: aa stosb byte ptr [rdi], al -;; 79cc: 800100 add byte ptr [rcx], 0 -;; 79cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 79d8: 800100 add byte ptr [rcx], 0 -;; 79db: aa stosb byte ptr [rdi], al -;; 79dc: 800100 add byte ptr [rcx], 0 -;; 79df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 79e8: 800100 add byte ptr [rcx], 0 -;; 79eb: aa stosb byte ptr [rdi], al -;; 79ec: 800100 add byte ptr [rcx], 0 -;; 79ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 79f8: 800100 add byte ptr [rcx], 0 -;; 79fb: aa stosb byte ptr [rdi], al -;; 79fc: 800100 add byte ptr [rcx], 0 -;; 79ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7a08: 800100 add byte ptr [rcx], 0 -;; 7a0b: aa stosb byte ptr [rdi], al -;; 7a0c: 800100 add byte ptr [rcx], 0 -;; 7a0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7a18: 800100 add byte ptr [rcx], 0 -;; 7a1b: aa stosb byte ptr [rdi], al -;; 7a1c: 800100 add byte ptr [rcx], 0 -;; 7a1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7a28: 800100 add byte ptr [rcx], 0 -;; 7a2b: aa stosb byte ptr [rdi], al -;; 7a2c: 800100 add byte ptr [rcx], 0 -;; 7a2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7a38: 800100 add byte ptr [rcx], 0 -;; 7a3b: aa stosb byte ptr [rdi], al -;; 7a3c: 800100 add byte ptr [rcx], 0 -;; 7a3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7a48: 800100 add byte ptr [rcx], 0 -;; 7a4b: aa stosb byte ptr [rdi], al -;; 7a4c: 800100 add byte ptr [rcx], 0 -;; 7a4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7a58: 800100 add byte ptr [rcx], 0 -;; 7a5b: aa stosb byte ptr [rdi], al -;; 7a5c: 800100 add byte ptr [rcx], 0 -;; 7a5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7a68: 800100 add byte ptr [rcx], 0 -;; 7a6b: aa stosb byte ptr [rdi], al -;; 7a6c: 800100 add byte ptr [rcx], 0 -;; 7a6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7a78: 800100 add byte ptr [rcx], 0 -;; 7a7b: aa stosb byte ptr [rdi], al -;; 7a7c: 800100 add byte ptr [rcx], 0 -;; 7a7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7a88: 800100 add byte ptr [rcx], 0 -;; 7a8b: aa stosb byte ptr [rdi], al -;; 7a8c: 800100 add byte ptr [rcx], 0 -;; 7a8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7a98: 800100 add byte ptr [rcx], 0 -;; 7a9b: aa stosb byte ptr [rdi], al -;; 7a9c: 800100 add byte ptr [rcx], 0 -;; 7a9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7aa8: 800100 add byte ptr [rcx], 0 -;; 7aab: aa stosb byte ptr [rdi], al -;; 7aac: 800100 add byte ptr [rcx], 0 -;; 7aaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7ab8: 800100 add byte ptr [rcx], 0 -;; 7abb: aa stosb byte ptr [rdi], al -;; 7abc: 800100 add byte ptr [rcx], 0 -;; 7abf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7ac8: 800100 add byte ptr [rcx], 0 -;; 7acb: aa stosb byte ptr [rdi], al -;; 7acc: 800100 add byte ptr [rcx], 0 -;; 7acf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7ad8: 800100 add byte ptr [rcx], 0 -;; 7adb: aa stosb byte ptr [rdi], al -;; 7adc: 800100 add byte ptr [rcx], 0 -;; 7adf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7ae8: 800100 add byte ptr [rcx], 0 -;; 7aeb: aa stosb byte ptr [rdi], al -;; 7aec: 800100 add byte ptr [rcx], 0 -;; 7aef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7af8: 800100 add byte ptr [rcx], 0 -;; 7afb: aa stosb byte ptr [rdi], al -;; 7afc: 800100 add byte ptr [rcx], 0 -;; 7aff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7b08: 800100 add byte ptr [rcx], 0 -;; 7b0b: aa stosb byte ptr [rdi], al -;; 7b0c: 800100 add byte ptr [rcx], 0 -;; 7b0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7b18: 800100 add byte ptr [rcx], 0 -;; 7b1b: aa stosb byte ptr [rdi], al -;; 7b1c: 800100 add byte ptr [rcx], 0 -;; 7b1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7b28: 800100 add byte ptr [rcx], 0 -;; 7b2b: aa stosb byte ptr [rdi], al -;; 7b2c: 800100 add byte ptr [rcx], 0 -;; 7b2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7b38: 800100 add byte ptr [rcx], 0 -;; 7b3b: aa stosb byte ptr [rdi], al -;; 7b3c: 800100 add byte ptr [rcx], 0 -;; 7b3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7b48: 800100 add byte ptr [rcx], 0 -;; 7b4b: aa stosb byte ptr [rdi], al -;; 7b4c: 800100 add byte ptr [rcx], 0 -;; 7b4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7b58: 800100 add byte ptr [rcx], 0 -;; 7b5b: aa stosb byte ptr [rdi], al -;; 7b5c: 800100 add byte ptr [rcx], 0 -;; 7b5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7b68: 800100 add byte ptr [rcx], 0 -;; 7b6b: aa stosb byte ptr [rdi], al -;; 7b6c: 800100 add byte ptr [rcx], 0 -;; 7b6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7b78: 800100 add byte ptr [rcx], 0 -;; 7b7b: aa stosb byte ptr [rdi], al -;; 7b7c: 800100 add byte ptr [rcx], 0 -;; 7b7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7b88: 800100 add byte ptr [rcx], 0 -;; 7b8b: aa stosb byte ptr [rdi], al -;; 7b8c: 800100 add byte ptr [rcx], 0 -;; 7b8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7b98: 800100 add byte ptr [rcx], 0 -;; 7b9b: aa stosb byte ptr [rdi], al -;; 7b9c: 800100 add byte ptr [rcx], 0 -;; 7b9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7ba8: 800100 add byte ptr [rcx], 0 -;; 7bab: aa stosb byte ptr [rdi], al -;; 7bac: 800100 add byte ptr [rcx], 0 -;; 7baf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7bb8: 800100 add byte ptr [rcx], 0 -;; 7bbb: aa stosb byte ptr [rdi], al -;; 7bbc: 800100 add byte ptr [rcx], 0 -;; 7bbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7bc8: 800100 add byte ptr [rcx], 0 -;; 7bcb: aa stosb byte ptr [rdi], al -;; 7bcc: 800100 add byte ptr [rcx], 0 -;; 7bcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7bd8: 800100 add byte ptr [rcx], 0 -;; 7bdb: aa stosb byte ptr [rdi], al -;; 7bdc: 800100 add byte ptr [rcx], 0 -;; 7bdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7be8: 800100 add byte ptr [rcx], 0 -;; 7beb: aa stosb byte ptr [rdi], al -;; 7bec: 800100 add byte ptr [rcx], 0 -;; 7bef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7bf8: 800100 add byte ptr [rcx], 0 -;; 7bfb: aa stosb byte ptr [rdi], al -;; 7bfc: 800100 add byte ptr [rcx], 0 -;; 7bff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7c08: 800100 add byte ptr [rcx], 0 -;; 7c0b: aa stosb byte ptr [rdi], al -;; 7c0c: 800100 add byte ptr [rcx], 0 -;; 7c0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7c18: 800100 add byte ptr [rcx], 0 -;; 7c1b: aa stosb byte ptr [rdi], al -;; 7c1c: 800100 add byte ptr [rcx], 0 -;; 7c1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7c28: 800100 add byte ptr [rcx], 0 -;; 7c2b: aa stosb byte ptr [rdi], al -;; 7c2c: 800100 add byte ptr [rcx], 0 -;; 7c2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7c38: 800100 add byte ptr [rcx], 0 -;; 7c3b: aa stosb byte ptr [rdi], al -;; 7c3c: 800100 add byte ptr [rcx], 0 -;; 7c3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7c48: 800100 add byte ptr [rcx], 0 -;; 7c4b: aa stosb byte ptr [rdi], al -;; 7c4c: 800100 add byte ptr [rcx], 0 -;; 7c4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7c58: 800100 add byte ptr [rcx], 0 -;; 7c5b: aa stosb byte ptr [rdi], al -;; 7c5c: 800100 add byte ptr [rcx], 0 -;; 7c5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7c68: 800100 add byte ptr [rcx], 0 -;; 7c6b: aa stosb byte ptr [rdi], al -;; 7c6c: 800100 add byte ptr [rcx], 0 -;; 7c6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7c78: 800100 add byte ptr [rcx], 0 -;; 7c7b: aa stosb byte ptr [rdi], al -;; 7c7c: 800100 add byte ptr [rcx], 0 -;; 7c7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7c88: 800100 add byte ptr [rcx], 0 -;; 7c8b: aa stosb byte ptr [rdi], al -;; 7c8c: 800100 add byte ptr [rcx], 0 -;; 7c8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7c98: 800100 add byte ptr [rcx], 0 -;; 7c9b: aa stosb byte ptr [rdi], al -;; 7c9c: 800100 add byte ptr [rcx], 0 -;; 7c9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7ca8: 800100 add byte ptr [rcx], 0 -;; 7cab: aa stosb byte ptr [rdi], al -;; 7cac: 800100 add byte ptr [rcx], 0 -;; 7caf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7cb8: 800100 add byte ptr [rcx], 0 -;; 7cbb: aa stosb byte ptr [rdi], al -;; 7cbc: 800100 add byte ptr [rcx], 0 -;; 7cbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7cc8: 800100 add byte ptr [rcx], 0 -;; 7ccb: aa stosb byte ptr [rdi], al -;; 7ccc: 800100 add byte ptr [rcx], 0 -;; 7ccf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7cd8: 800100 add byte ptr [rcx], 0 -;; 7cdb: aa stosb byte ptr [rdi], al -;; 7cdc: 800100 add byte ptr [rcx], 0 -;; 7cdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7ce8: 800100 add byte ptr [rcx], 0 -;; 7ceb: aa stosb byte ptr [rdi], al -;; 7cec: 800100 add byte ptr [rcx], 0 -;; 7cef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7cf8: 800100 add byte ptr [rcx], 0 -;; 7cfb: aa stosb byte ptr [rdi], al -;; 7cfc: 800100 add byte ptr [rcx], 0 -;; 7cff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7d08: 800100 add byte ptr [rcx], 0 -;; 7d0b: aa stosb byte ptr [rdi], al -;; 7d0c: 800100 add byte ptr [rcx], 0 -;; 7d0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7d18: 800100 add byte ptr [rcx], 0 -;; 7d1b: aa stosb byte ptr [rdi], al -;; 7d1c: 800100 add byte ptr [rcx], 0 -;; 7d1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7d28: 800100 add byte ptr [rcx], 0 -;; 7d2b: aa stosb byte ptr [rdi], al -;; 7d2c: 800100 add byte ptr [rcx], 0 -;; 7d2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7d38: 800100 add byte ptr [rcx], 0 -;; 7d3b: aa stosb byte ptr [rdi], al -;; 7d3c: 800100 add byte ptr [rcx], 0 -;; 7d3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7d48: 800100 add byte ptr [rcx], 0 -;; 7d4b: aa stosb byte ptr [rdi], al -;; 7d4c: 800100 add byte ptr [rcx], 0 -;; 7d4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7d58: 800100 add byte ptr [rcx], 0 -;; 7d5b: aa stosb byte ptr [rdi], al -;; 7d5c: 800100 add byte ptr [rcx], 0 -;; 7d5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7d68: 800100 add byte ptr [rcx], 0 -;; 7d6b: aa stosb byte ptr [rdi], al -;; 7d6c: 800100 add byte ptr [rcx], 0 -;; 7d6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7d78: 800100 add byte ptr [rcx], 0 -;; 7d7b: aa stosb byte ptr [rdi], al -;; 7d7c: 800100 add byte ptr [rcx], 0 -;; 7d7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7d88: 800100 add byte ptr [rcx], 0 -;; 7d8b: aa stosb byte ptr [rdi], al -;; 7d8c: 800100 add byte ptr [rcx], 0 -;; 7d8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7d98: 800100 add byte ptr [rcx], 0 -;; 7d9b: aa stosb byte ptr [rdi], al -;; 7d9c: 800100 add byte ptr [rcx], 0 -;; 7d9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7da8: 800100 add byte ptr [rcx], 0 -;; 7dab: aa stosb byte ptr [rdi], al -;; 7dac: 800100 add byte ptr [rcx], 0 -;; 7daf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7db8: 800100 add byte ptr [rcx], 0 -;; 7dbb: aa stosb byte ptr [rdi], al -;; 7dbc: 800100 add byte ptr [rcx], 0 -;; 7dbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7dc8: 800100 add byte ptr [rcx], 0 -;; 7dcb: aa stosb byte ptr [rdi], al -;; 7dcc: 800100 add byte ptr [rcx], 0 -;; 7dcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7dd8: 800100 add byte ptr [rcx], 0 -;; 7ddb: aa stosb byte ptr [rdi], al -;; 7ddc: 800100 add byte ptr [rcx], 0 -;; 7ddf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7de8: 800100 add byte ptr [rcx], 0 -;; 7deb: aa stosb byte ptr [rdi], al -;; 7dec: 800100 add byte ptr [rcx], 0 -;; 7def: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7df8: 800100 add byte ptr [rcx], 0 -;; 7dfb: aa stosb byte ptr [rdi], al -;; 7dfc: 800100 add byte ptr [rcx], 0 -;; 7dff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7e08: 800100 add byte ptr [rcx], 0 -;; 7e0b: aa stosb byte ptr [rdi], al -;; 7e0c: 800100 add byte ptr [rcx], 0 -;; 7e0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7e18: 800100 add byte ptr [rcx], 0 -;; 7e1b: aa stosb byte ptr [rdi], al -;; 7e1c: 800100 add byte ptr [rcx], 0 -;; 7e1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7e28: 800100 add byte ptr [rcx], 0 -;; 7e2b: aa stosb byte ptr [rdi], al -;; 7e2c: 800100 add byte ptr [rcx], 0 -;; 7e2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7e38: 800100 add byte ptr [rcx], 0 -;; 7e3b: aa stosb byte ptr [rdi], al -;; 7e3c: 800100 add byte ptr [rcx], 0 -;; 7e3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7e48: 800100 add byte ptr [rcx], 0 -;; 7e4b: aa stosb byte ptr [rdi], al -;; 7e4c: 800100 add byte ptr [rcx], 0 -;; 7e4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7e58: 800100 add byte ptr [rcx], 0 -;; 7e5b: aa stosb byte ptr [rdi], al -;; 7e5c: 800100 add byte ptr [rcx], 0 -;; 7e5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7e68: 800100 add byte ptr [rcx], 0 -;; 7e6b: aa stosb byte ptr [rdi], al -;; 7e6c: 800100 add byte ptr [rcx], 0 -;; 7e6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7e78: 800100 add byte ptr [rcx], 0 -;; 7e7b: aa stosb byte ptr [rdi], al -;; 7e7c: 800100 add byte ptr [rcx], 0 -;; 7e7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7e88: 800100 add byte ptr [rcx], 0 -;; 7e8b: aa stosb byte ptr [rdi], al -;; 7e8c: 800100 add byte ptr [rcx], 0 -;; 7e8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7e98: 800100 add byte ptr [rcx], 0 -;; 7e9b: aa stosb byte ptr [rdi], al -;; 7e9c: 800100 add byte ptr [rcx], 0 -;; 7e9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7ea8: 800100 add byte ptr [rcx], 0 -;; 7eab: aa stosb byte ptr [rdi], al -;; 7eac: 800100 add byte ptr [rcx], 0 -;; 7eaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7eb8: 800100 add byte ptr [rcx], 0 -;; 7ebb: aa stosb byte ptr [rdi], al -;; 7ebc: 800100 add byte ptr [rcx], 0 -;; 7ebf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7ec8: 800100 add byte ptr [rcx], 0 -;; 7ecb: aa stosb byte ptr [rdi], al -;; 7ecc: 800100 add byte ptr [rcx], 0 -;; 7ecf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7ed8: 800100 add byte ptr [rcx], 0 -;; 7edb: aa stosb byte ptr [rdi], al -;; 7edc: 800100 add byte ptr [rcx], 0 -;; 7edf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7ee8: 800100 add byte ptr [rcx], 0 -;; 7eeb: aa stosb byte ptr [rdi], al -;; 7eec: 800100 add byte ptr [rcx], 0 -;; 7eef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7ef8: 800100 add byte ptr [rcx], 0 -;; 7efb: aa stosb byte ptr [rdi], al -;; 7efc: 800100 add byte ptr [rcx], 0 -;; 7eff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7f08: 800100 add byte ptr [rcx], 0 -;; 7f0b: aa stosb byte ptr [rdi], al -;; 7f0c: 800100 add byte ptr [rcx], 0 -;; 7f0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7f18: 800100 add byte ptr [rcx], 0 -;; 7f1b: aa stosb byte ptr [rdi], al -;; 7f1c: 800100 add byte ptr [rcx], 0 -;; 7f1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7f28: 800100 add byte ptr [rcx], 0 -;; 7f2b: aa stosb byte ptr [rdi], al -;; 7f2c: 800100 add byte ptr [rcx], 0 -;; 7f2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7f38: 800100 add byte ptr [rcx], 0 -;; 7f3b: aa stosb byte ptr [rdi], al -;; 7f3c: 800100 add byte ptr [rcx], 0 -;; 7f3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7f48: 800100 add byte ptr [rcx], 0 -;; 7f4b: aa stosb byte ptr [rdi], al -;; 7f4c: 800100 add byte ptr [rcx], 0 -;; 7f4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7f58: 800100 add byte ptr [rcx], 0 -;; 7f5b: aa stosb byte ptr [rdi], al -;; 7f5c: 800100 add byte ptr [rcx], 0 -;; 7f5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7f68: 800100 add byte ptr [rcx], 0 -;; 7f6b: aa stosb byte ptr [rdi], al -;; 7f6c: 800100 add byte ptr [rcx], 0 -;; 7f6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7f78: 800100 add byte ptr [rcx], 0 -;; 7f7b: aa stosb byte ptr [rdi], al -;; 7f7c: 800100 add byte ptr [rcx], 0 -;; 7f7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7f88: 800100 add byte ptr [rcx], 0 -;; 7f8b: aa stosb byte ptr [rdi], al -;; 7f8c: 800100 add byte ptr [rcx], 0 -;; 7f8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7f98: 800100 add byte ptr [rcx], 0 -;; 7f9b: aa stosb byte ptr [rdi], al -;; 7f9c: 800100 add byte ptr [rcx], 0 -;; 7f9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7fa8: 800100 add byte ptr [rcx], 0 -;; 7fab: aa stosb byte ptr [rdi], al -;; 7fac: 800100 add byte ptr [rcx], 0 -;; 7faf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7fb8: 800100 add byte ptr [rcx], 0 -;; 7fbb: aa stosb byte ptr [rdi], al -;; 7fbc: 800100 add byte ptr [rcx], 0 -;; 7fbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7fc8: 800100 add byte ptr [rcx], 0 -;; 7fcb: aa stosb byte ptr [rdi], al -;; 7fcc: 800100 add byte ptr [rcx], 0 -;; 7fcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7fd8: 800100 add byte ptr [rcx], 0 -;; 7fdb: aa stosb byte ptr [rdi], al -;; 7fdc: 800100 add byte ptr [rcx], 0 -;; 7fdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7fe8: 800100 add byte ptr [rcx], 0 -;; 7feb: aa stosb byte ptr [rdi], al -;; 7fec: 800100 add byte ptr [rcx], 0 -;; 7fef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 7ff8: 800100 add byte ptr [rcx], 0 -;; 7ffb: aa stosb byte ptr [rdi], al -;; 7ffc: 800100 add byte ptr [rcx], 0 -;; 7fff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8008: 800100 add byte ptr [rcx], 0 -;; 800b: aa stosb byte ptr [rdi], al -;; 800c: 800100 add byte ptr [rcx], 0 -;; 800f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8018: 800100 add byte ptr [rcx], 0 -;; 801b: aa stosb byte ptr [rdi], al -;; 801c: 800100 add byte ptr [rcx], 0 -;; 801f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8028: 800100 add byte ptr [rcx], 0 -;; 802b: aa stosb byte ptr [rdi], al -;; 802c: 800100 add byte ptr [rcx], 0 -;; 802f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8038: 800100 add byte ptr [rcx], 0 -;; 803b: aa stosb byte ptr [rdi], al -;; 803c: 800100 add byte ptr [rcx], 0 -;; 803f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8048: 800100 add byte ptr [rcx], 0 -;; 804b: aa stosb byte ptr [rdi], al -;; 804c: 800100 add byte ptr [rcx], 0 -;; 804f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8058: 800100 add byte ptr [rcx], 0 -;; 805b: aa stosb byte ptr [rdi], al -;; 805c: 800100 add byte ptr [rcx], 0 -;; 805f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8068: 800100 add byte ptr [rcx], 0 -;; 806b: aa stosb byte ptr [rdi], al -;; 806c: 800100 add byte ptr [rcx], 0 -;; 806f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8078: 800100 add byte ptr [rcx], 0 -;; 807b: aa stosb byte ptr [rdi], al -;; 807c: 800100 add byte ptr [rcx], 0 -;; 807f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8088: 800100 add byte ptr [rcx], 0 -;; 808b: aa stosb byte ptr [rdi], al -;; 808c: 800100 add byte ptr [rcx], 0 -;; 808f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8098: 800100 add byte ptr [rcx], 0 -;; 809b: aa stosb byte ptr [rdi], al -;; 809c: 800100 add byte ptr [rcx], 0 -;; 809f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 80a8: 800100 add byte ptr [rcx], 0 -;; 80ab: aa stosb byte ptr [rdi], al -;; 80ac: 800100 add byte ptr [rcx], 0 -;; 80af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 80b8: 800100 add byte ptr [rcx], 0 -;; 80bb: aa stosb byte ptr [rdi], al -;; 80bc: 800100 add byte ptr [rcx], 0 -;; 80bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 80c8: 800100 add byte ptr [rcx], 0 -;; 80cb: aa stosb byte ptr [rdi], al -;; 80cc: 800100 add byte ptr [rcx], 0 -;; 80cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 80d8: 800100 add byte ptr [rcx], 0 -;; 80db: aa stosb byte ptr [rdi], al -;; 80dc: 800100 add byte ptr [rcx], 0 -;; 80df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 80e8: 800100 add byte ptr [rcx], 0 -;; 80eb: aa stosb byte ptr [rdi], al -;; 80ec: 800100 add byte ptr [rcx], 0 -;; 80ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 80f8: 800100 add byte ptr [rcx], 0 -;; 80fb: aa stosb byte ptr [rdi], al -;; 80fc: 800100 add byte ptr [rcx], 0 -;; 80ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8108: 800100 add byte ptr [rcx], 0 -;; 810b: aa stosb byte ptr [rdi], al -;; 810c: 800100 add byte ptr [rcx], 0 -;; 810f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8118: 800100 add byte ptr [rcx], 0 -;; 811b: aa stosb byte ptr [rdi], al -;; 811c: 800100 add byte ptr [rcx], 0 -;; 811f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8128: 800100 add byte ptr [rcx], 0 -;; 812b: aa stosb byte ptr [rdi], al -;; 812c: 800100 add byte ptr [rcx], 0 -;; 812f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8138: 800100 add byte ptr [rcx], 0 -;; 813b: aa stosb byte ptr [rdi], al -;; 813c: 800100 add byte ptr [rcx], 0 -;; 813f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8148: 800100 add byte ptr [rcx], 0 -;; 814b: aa stosb byte ptr [rdi], al -;; 814c: 800100 add byte ptr [rcx], 0 -;; 814f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8158: 800100 add byte ptr [rcx], 0 -;; 815b: aa stosb byte ptr [rdi], al -;; 815c: 800100 add byte ptr [rcx], 0 -;; 815f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8168: 800100 add byte ptr [rcx], 0 -;; 816b: aa stosb byte ptr [rdi], al -;; 816c: 800100 add byte ptr [rcx], 0 -;; 816f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8178: 800100 add byte ptr [rcx], 0 -;; 817b: aa stosb byte ptr [rdi], al -;; 817c: 800100 add byte ptr [rcx], 0 -;; 817f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8188: 800100 add byte ptr [rcx], 0 -;; 818b: aa stosb byte ptr [rdi], al -;; 818c: 800100 add byte ptr [rcx], 0 -;; 818f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8198: 800100 add byte ptr [rcx], 0 -;; 819b: aa stosb byte ptr [rdi], al -;; 819c: 800100 add byte ptr [rcx], 0 -;; 819f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 81a8: 800100 add byte ptr [rcx], 0 -;; 81ab: aa stosb byte ptr [rdi], al -;; 81ac: 800100 add byte ptr [rcx], 0 -;; 81af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 81b8: 800100 add byte ptr [rcx], 0 -;; 81bb: aa stosb byte ptr [rdi], al -;; 81bc: 800100 add byte ptr [rcx], 0 -;; 81bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 81c8: 800100 add byte ptr [rcx], 0 -;; 81cb: aa stosb byte ptr [rdi], al -;; 81cc: 800100 add byte ptr [rcx], 0 -;; 81cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 81d8: 800100 add byte ptr [rcx], 0 -;; 81db: aa stosb byte ptr [rdi], al -;; 81dc: 800100 add byte ptr [rcx], 0 -;; 81df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 81e8: 800100 add byte ptr [rcx], 0 -;; 81eb: aa stosb byte ptr [rdi], al -;; 81ec: 800100 add byte ptr [rcx], 0 -;; 81ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 81f8: 800100 add byte ptr [rcx], 0 -;; 81fb: aa stosb byte ptr [rdi], al -;; 81fc: 800100 add byte ptr [rcx], 0 -;; 81ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8208: 800100 add byte ptr [rcx], 0 -;; 820b: aa stosb byte ptr [rdi], al -;; 820c: 800100 add byte ptr [rcx], 0 -;; 820f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8218: 800100 add byte ptr [rcx], 0 -;; 821b: aa stosb byte ptr [rdi], al -;; 821c: 800100 add byte ptr [rcx], 0 -;; 821f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8228: 800100 add byte ptr [rcx], 0 -;; 822b: aa stosb byte ptr [rdi], al -;; 822c: 800100 add byte ptr [rcx], 0 -;; 822f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8238: 800100 add byte ptr [rcx], 0 -;; 823b: aa stosb byte ptr [rdi], al -;; 823c: 800100 add byte ptr [rcx], 0 -;; 823f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8248: 800100 add byte ptr [rcx], 0 -;; 824b: aa stosb byte ptr [rdi], al -;; 824c: 800100 add byte ptr [rcx], 0 -;; 824f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8258: 800100 add byte ptr [rcx], 0 -;; 825b: aa stosb byte ptr [rdi], al -;; 825c: 800100 add byte ptr [rcx], 0 -;; 825f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8268: 800100 add byte ptr [rcx], 0 -;; 826b: aa stosb byte ptr [rdi], al -;; 826c: 800100 add byte ptr [rcx], 0 -;; 826f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8278: 800100 add byte ptr [rcx], 0 -;; 827b: aa stosb byte ptr [rdi], al -;; 827c: 800100 add byte ptr [rcx], 0 -;; 827f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8288: 800100 add byte ptr [rcx], 0 -;; 828b: aa stosb byte ptr [rdi], al -;; 828c: 800100 add byte ptr [rcx], 0 -;; 828f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8298: 800100 add byte ptr [rcx], 0 -;; 829b: aa stosb byte ptr [rdi], al -;; 829c: 800100 add byte ptr [rcx], 0 -;; 829f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 82a8: 800100 add byte ptr [rcx], 0 -;; 82ab: aa stosb byte ptr [rdi], al -;; 82ac: 800100 add byte ptr [rcx], 0 -;; 82af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 82b8: 800100 add byte ptr [rcx], 0 -;; 82bb: aa stosb byte ptr [rdi], al -;; 82bc: 800100 add byte ptr [rcx], 0 -;; 82bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 82c8: 800100 add byte ptr [rcx], 0 -;; 82cb: aa stosb byte ptr [rdi], al -;; 82cc: 800100 add byte ptr [rcx], 0 -;; 82cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 82d8: 800100 add byte ptr [rcx], 0 -;; 82db: aa stosb byte ptr [rdi], al -;; 82dc: 800100 add byte ptr [rcx], 0 -;; 82df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 82e8: 800100 add byte ptr [rcx], 0 -;; 82eb: aa stosb byte ptr [rdi], al -;; 82ec: 800100 add byte ptr [rcx], 0 -;; 82ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 82f8: 800100 add byte ptr [rcx], 0 -;; 82fb: aa stosb byte ptr [rdi], al -;; 82fc: 800100 add byte ptr [rcx], 0 -;; 82ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8308: 800100 add byte ptr [rcx], 0 -;; 830b: aa stosb byte ptr [rdi], al -;; 830c: 800100 add byte ptr [rcx], 0 -;; 830f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8318: 800100 add byte ptr [rcx], 0 -;; 831b: aa stosb byte ptr [rdi], al -;; 831c: 800100 add byte ptr [rcx], 0 -;; 831f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8328: 800100 add byte ptr [rcx], 0 -;; 832b: aa stosb byte ptr [rdi], al -;; 832c: 800100 add byte ptr [rcx], 0 -;; 832f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8338: 800100 add byte ptr [rcx], 0 -;; 833b: aa stosb byte ptr [rdi], al -;; 833c: 800100 add byte ptr [rcx], 0 -;; 833f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8348: 800100 add byte ptr [rcx], 0 -;; 834b: aa stosb byte ptr [rdi], al -;; 834c: 800100 add byte ptr [rcx], 0 -;; 834f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8358: 800100 add byte ptr [rcx], 0 -;; 835b: aa stosb byte ptr [rdi], al -;; 835c: 800100 add byte ptr [rcx], 0 -;; 835f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8368: 800100 add byte ptr [rcx], 0 -;; 836b: aa stosb byte ptr [rdi], al -;; 836c: 800100 add byte ptr [rcx], 0 -;; 836f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8378: 800100 add byte ptr [rcx], 0 -;; 837b: aa stosb byte ptr [rdi], al -;; 837c: 800100 add byte ptr [rcx], 0 -;; 837f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8388: 800100 add byte ptr [rcx], 0 -;; 838b: aa stosb byte ptr [rdi], al -;; 838c: 800100 add byte ptr [rcx], 0 -;; 838f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8398: 800100 add byte ptr [rcx], 0 -;; 839b: aa stosb byte ptr [rdi], al -;; 839c: 800100 add byte ptr [rcx], 0 -;; 839f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 83a8: 800100 add byte ptr [rcx], 0 -;; 83ab: aa stosb byte ptr [rdi], al -;; 83ac: 800100 add byte ptr [rcx], 0 -;; 83af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 83b8: 800100 add byte ptr [rcx], 0 -;; 83bb: aa stosb byte ptr [rdi], al -;; 83bc: 800100 add byte ptr [rcx], 0 -;; 83bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 83c8: 800100 add byte ptr [rcx], 0 -;; 83cb: aa stosb byte ptr [rdi], al -;; 83cc: 800100 add byte ptr [rcx], 0 -;; 83cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 83d8: 800100 add byte ptr [rcx], 0 -;; 83db: aa stosb byte ptr [rdi], al -;; 83dc: 800100 add byte ptr [rcx], 0 -;; 83df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 83e8: 800100 add byte ptr [rcx], 0 -;; 83eb: aa stosb byte ptr [rdi], al -;; 83ec: 800100 add byte ptr [rcx], 0 -;; 83ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 83f8: 800100 add byte ptr [rcx], 0 -;; 83fb: aa stosb byte ptr [rdi], al -;; 83fc: 800100 add byte ptr [rcx], 0 -;; 83ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8408: 800100 add byte ptr [rcx], 0 -;; 840b: aa stosb byte ptr [rdi], al -;; 840c: 800100 add byte ptr [rcx], 0 -;; 840f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8418: 800100 add byte ptr [rcx], 0 -;; 841b: aa stosb byte ptr [rdi], al -;; 841c: 800100 add byte ptr [rcx], 0 -;; 841f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8428: 800100 add byte ptr [rcx], 0 -;; 842b: aa stosb byte ptr [rdi], al -;; 842c: 800100 add byte ptr [rcx], 0 -;; 842f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8438: 800100 add byte ptr [rcx], 0 -;; 843b: aa stosb byte ptr [rdi], al -;; 843c: 800100 add byte ptr [rcx], 0 -;; 843f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8448: 800100 add byte ptr [rcx], 0 -;; 844b: aa stosb byte ptr [rdi], al -;; 844c: 800100 add byte ptr [rcx], 0 -;; 844f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8458: 800100 add byte ptr [rcx], 0 -;; 845b: aa stosb byte ptr [rdi], al -;; 845c: 800100 add byte ptr [rcx], 0 -;; 845f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8468: 800100 add byte ptr [rcx], 0 -;; 846b: aa stosb byte ptr [rdi], al -;; 846c: 800100 add byte ptr [rcx], 0 -;; 846f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8478: 800100 add byte ptr [rcx], 0 -;; 847b: aa stosb byte ptr [rdi], al -;; 847c: 800100 add byte ptr [rcx], 0 -;; 847f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8488: 800100 add byte ptr [rcx], 0 -;; 848b: aa stosb byte ptr [rdi], al -;; 848c: 800100 add byte ptr [rcx], 0 -;; 848f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8498: 800100 add byte ptr [rcx], 0 -;; 849b: aa stosb byte ptr [rdi], al -;; 849c: 800100 add byte ptr [rcx], 0 -;; 849f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 84a8: 800100 add byte ptr [rcx], 0 -;; 84ab: aa stosb byte ptr [rdi], al -;; 84ac: 800100 add byte ptr [rcx], 0 -;; 84af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 84b8: 800100 add byte ptr [rcx], 0 -;; 84bb: aa stosb byte ptr [rdi], al -;; 84bc: 800100 add byte ptr [rcx], 0 -;; 84bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 84c8: 800100 add byte ptr [rcx], 0 -;; 84cb: aa stosb byte ptr [rdi], al -;; 84cc: 800100 add byte ptr [rcx], 0 -;; 84cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 84d8: 800100 add byte ptr [rcx], 0 -;; 84db: aa stosb byte ptr [rdi], al -;; 84dc: 800100 add byte ptr [rcx], 0 -;; 84df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 84e8: 800100 add byte ptr [rcx], 0 -;; 84eb: aa stosb byte ptr [rdi], al -;; 84ec: 800100 add byte ptr [rcx], 0 -;; 84ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 84f8: 800100 add byte ptr [rcx], 0 -;; 84fb: aa stosb byte ptr [rdi], al -;; 84fc: 800100 add byte ptr [rcx], 0 -;; 84ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8508: 800100 add byte ptr [rcx], 0 -;; 850b: aa stosb byte ptr [rdi], al -;; 850c: 800100 add byte ptr [rcx], 0 -;; 850f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8518: 800100 add byte ptr [rcx], 0 -;; 851b: aa stosb byte ptr [rdi], al -;; 851c: 800100 add byte ptr [rcx], 0 -;; 851f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8528: 800100 add byte ptr [rcx], 0 -;; 852b: aa stosb byte ptr [rdi], al -;; 852c: 800100 add byte ptr [rcx], 0 -;; 852f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8538: 800100 add byte ptr [rcx], 0 -;; 853b: aa stosb byte ptr [rdi], al -;; 853c: 800100 add byte ptr [rcx], 0 -;; 853f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8548: 800100 add byte ptr [rcx], 0 -;; 854b: aa stosb byte ptr [rdi], al -;; 854c: 800100 add byte ptr [rcx], 0 -;; 854f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8558: 800100 add byte ptr [rcx], 0 -;; 855b: aa stosb byte ptr [rdi], al -;; 855c: 800100 add byte ptr [rcx], 0 -;; 855f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8568: 800100 add byte ptr [rcx], 0 -;; 856b: aa stosb byte ptr [rdi], al -;; 856c: 800100 add byte ptr [rcx], 0 -;; 856f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8578: 800100 add byte ptr [rcx], 0 -;; 857b: aa stosb byte ptr [rdi], al -;; 857c: 800100 add byte ptr [rcx], 0 -;; 857f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8588: 800100 add byte ptr [rcx], 0 -;; 858b: aa stosb byte ptr [rdi], al -;; 858c: 800100 add byte ptr [rcx], 0 -;; 858f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8598: 800100 add byte ptr [rcx], 0 -;; 859b: aa stosb byte ptr [rdi], al -;; 859c: 800100 add byte ptr [rcx], 0 -;; 859f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 85a8: 800100 add byte ptr [rcx], 0 -;; 85ab: aa stosb byte ptr [rdi], al -;; 85ac: 800100 add byte ptr [rcx], 0 -;; 85af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 85b8: 800100 add byte ptr [rcx], 0 -;; 85bb: aa stosb byte ptr [rdi], al -;; 85bc: 800100 add byte ptr [rcx], 0 -;; 85bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 85c8: 800100 add byte ptr [rcx], 0 -;; 85cb: aa stosb byte ptr [rdi], al -;; 85cc: 800100 add byte ptr [rcx], 0 -;; 85cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 85d8: 800100 add byte ptr [rcx], 0 -;; 85db: aa stosb byte ptr [rdi], al -;; 85dc: 800100 add byte ptr [rcx], 0 -;; 85df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 85e8: 800100 add byte ptr [rcx], 0 -;; 85eb: aa stosb byte ptr [rdi], al -;; 85ec: 800100 add byte ptr [rcx], 0 -;; 85ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 85f8: 800100 add byte ptr [rcx], 0 -;; 85fb: aa stosb byte ptr [rdi], al -;; 85fc: 800100 add byte ptr [rcx], 0 -;; 85ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8608: 800100 add byte ptr [rcx], 0 -;; 860b: aa stosb byte ptr [rdi], al -;; 860c: 800100 add byte ptr [rcx], 0 -;; 860f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8618: 800100 add byte ptr [rcx], 0 -;; 861b: aa stosb byte ptr [rdi], al -;; 861c: 800100 add byte ptr [rcx], 0 -;; 861f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8628: 800100 add byte ptr [rcx], 0 -;; 862b: aa stosb byte ptr [rdi], al -;; 862c: 800100 add byte ptr [rcx], 0 -;; 862f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8638: 800100 add byte ptr [rcx], 0 -;; 863b: aa stosb byte ptr [rdi], al -;; 863c: 800100 add byte ptr [rcx], 0 -;; 863f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8648: 800100 add byte ptr [rcx], 0 -;; 864b: aa stosb byte ptr [rdi], al -;; 864c: 800100 add byte ptr [rcx], 0 -;; 864f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8658: 800100 add byte ptr [rcx], 0 -;; 865b: aa stosb byte ptr [rdi], al -;; 865c: 800100 add byte ptr [rcx], 0 -;; 865f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8668: 800100 add byte ptr [rcx], 0 -;; 866b: aa stosb byte ptr [rdi], al -;; 866c: 800100 add byte ptr [rcx], 0 -;; 866f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8678: 800100 add byte ptr [rcx], 0 -;; 867b: aa stosb byte ptr [rdi], al -;; 867c: 800100 add byte ptr [rcx], 0 -;; 867f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8688: 800100 add byte ptr [rcx], 0 -;; 868b: aa stosb byte ptr [rdi], al -;; 868c: 800100 add byte ptr [rcx], 0 -;; 868f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8698: 800100 add byte ptr [rcx], 0 -;; 869b: aa stosb byte ptr [rdi], al -;; 869c: 800100 add byte ptr [rcx], 0 -;; 869f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 86a8: 800100 add byte ptr [rcx], 0 -;; 86ab: aa stosb byte ptr [rdi], al -;; 86ac: 800100 add byte ptr [rcx], 0 -;; 86af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 86b8: 800100 add byte ptr [rcx], 0 -;; 86bb: aa stosb byte ptr [rdi], al -;; 86bc: 800100 add byte ptr [rcx], 0 -;; 86bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 86c8: 800100 add byte ptr [rcx], 0 -;; 86cb: aa stosb byte ptr [rdi], al -;; 86cc: 800100 add byte ptr [rcx], 0 -;; 86cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 86d8: 800100 add byte ptr [rcx], 0 -;; 86db: aa stosb byte ptr [rdi], al -;; 86dc: 800100 add byte ptr [rcx], 0 -;; 86df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 86e8: 800100 add byte ptr [rcx], 0 -;; 86eb: aa stosb byte ptr [rdi], al -;; 86ec: 800100 add byte ptr [rcx], 0 -;; 86ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 86f8: 800100 add byte ptr [rcx], 0 -;; 86fb: aa stosb byte ptr [rdi], al -;; 86fc: 800100 add byte ptr [rcx], 0 -;; 86ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8708: 800100 add byte ptr [rcx], 0 -;; 870b: aa stosb byte ptr [rdi], al -;; 870c: 800100 add byte ptr [rcx], 0 -;; 870f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8718: 800100 add byte ptr [rcx], 0 -;; 871b: aa stosb byte ptr [rdi], al -;; 871c: 800100 add byte ptr [rcx], 0 -;; 871f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8728: 800100 add byte ptr [rcx], 0 -;; 872b: aa stosb byte ptr [rdi], al -;; 872c: 800100 add byte ptr [rcx], 0 -;; 872f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8738: 800100 add byte ptr [rcx], 0 -;; 873b: aa stosb byte ptr [rdi], al -;; 873c: 800100 add byte ptr [rcx], 0 -;; 873f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8748: 800100 add byte ptr [rcx], 0 -;; 874b: aa stosb byte ptr [rdi], al -;; 874c: 800100 add byte ptr [rcx], 0 -;; 874f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8758: 800100 add byte ptr [rcx], 0 -;; 875b: aa stosb byte ptr [rdi], al -;; 875c: 800100 add byte ptr [rcx], 0 -;; 875f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8768: 800100 add byte ptr [rcx], 0 -;; 876b: aa stosb byte ptr [rdi], al -;; 876c: 800100 add byte ptr [rcx], 0 -;; 876f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8778: 800100 add byte ptr [rcx], 0 -;; 877b: aa stosb byte ptr [rdi], al -;; 877c: 800100 add byte ptr [rcx], 0 -;; 877f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8788: 800100 add byte ptr [rcx], 0 -;; 878b: aa stosb byte ptr [rdi], al -;; 878c: 800100 add byte ptr [rcx], 0 -;; 878f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8798: 800100 add byte ptr [rcx], 0 -;; 879b: aa stosb byte ptr [rdi], al -;; 879c: 800100 add byte ptr [rcx], 0 -;; 879f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 87a8: 800100 add byte ptr [rcx], 0 -;; 87ab: aa stosb byte ptr [rdi], al -;; 87ac: 800100 add byte ptr [rcx], 0 -;; 87af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 87b8: 800100 add byte ptr [rcx], 0 -;; 87bb: aa stosb byte ptr [rdi], al -;; 87bc: 800100 add byte ptr [rcx], 0 -;; 87bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 87c8: 800100 add byte ptr [rcx], 0 -;; 87cb: aa stosb byte ptr [rdi], al -;; 87cc: 800100 add byte ptr [rcx], 0 -;; 87cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 87d8: 800100 add byte ptr [rcx], 0 -;; 87db: aa stosb byte ptr [rdi], al -;; 87dc: 800100 add byte ptr [rcx], 0 -;; 87df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 87e8: 800100 add byte ptr [rcx], 0 -;; 87eb: aa stosb byte ptr [rdi], al -;; 87ec: 800100 add byte ptr [rcx], 0 -;; 87ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 87f8: 800100 add byte ptr [rcx], 0 -;; 87fb: aa stosb byte ptr [rdi], al -;; 87fc: 800100 add byte ptr [rcx], 0 -;; 87ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8808: 800100 add byte ptr [rcx], 0 -;; 880b: aa stosb byte ptr [rdi], al -;; 880c: 800100 add byte ptr [rcx], 0 -;; 880f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8818: 800100 add byte ptr [rcx], 0 -;; 881b: aa stosb byte ptr [rdi], al -;; 881c: 800100 add byte ptr [rcx], 0 -;; 881f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8828: 800100 add byte ptr [rcx], 0 -;; 882b: aa stosb byte ptr [rdi], al -;; 882c: 800100 add byte ptr [rcx], 0 -;; 882f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8838: 800100 add byte ptr [rcx], 0 -;; 883b: aa stosb byte ptr [rdi], al -;; 883c: 800100 add byte ptr [rcx], 0 -;; 883f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8848: 800100 add byte ptr [rcx], 0 -;; 884b: aa stosb byte ptr [rdi], al -;; 884c: 800100 add byte ptr [rcx], 0 -;; 884f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8858: 800100 add byte ptr [rcx], 0 -;; 885b: aa stosb byte ptr [rdi], al -;; 885c: 800100 add byte ptr [rcx], 0 -;; 885f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8868: 800100 add byte ptr [rcx], 0 -;; 886b: aa stosb byte ptr [rdi], al -;; 886c: 800100 add byte ptr [rcx], 0 -;; 886f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8878: 800100 add byte ptr [rcx], 0 -;; 887b: aa stosb byte ptr [rdi], al -;; 887c: 800100 add byte ptr [rcx], 0 -;; 887f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8888: 800100 add byte ptr [rcx], 0 -;; 888b: aa stosb byte ptr [rdi], al -;; 888c: 800100 add byte ptr [rcx], 0 -;; 888f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8898: 800100 add byte ptr [rcx], 0 -;; 889b: aa stosb byte ptr [rdi], al -;; 889c: 800100 add byte ptr [rcx], 0 -;; 889f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 88a8: 800100 add byte ptr [rcx], 0 -;; 88ab: aa stosb byte ptr [rdi], al -;; 88ac: 800100 add byte ptr [rcx], 0 -;; 88af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 88b8: 800100 add byte ptr [rcx], 0 -;; 88bb: aa stosb byte ptr [rdi], al -;; 88bc: 800100 add byte ptr [rcx], 0 -;; 88bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 88c8: 800100 add byte ptr [rcx], 0 -;; 88cb: aa stosb byte ptr [rdi], al -;; 88cc: 800100 add byte ptr [rcx], 0 -;; 88cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 88d8: 800100 add byte ptr [rcx], 0 -;; 88db: aa stosb byte ptr [rdi], al -;; 88dc: 800100 add byte ptr [rcx], 0 -;; 88df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 88e8: 800100 add byte ptr [rcx], 0 -;; 88eb: aa stosb byte ptr [rdi], al -;; 88ec: 800100 add byte ptr [rcx], 0 -;; 88ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 88f8: 800100 add byte ptr [rcx], 0 -;; 88fb: aa stosb byte ptr [rdi], al -;; 88fc: 800100 add byte ptr [rcx], 0 -;; 88ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8908: 800100 add byte ptr [rcx], 0 -;; 890b: aa stosb byte ptr [rdi], al -;; 890c: 800100 add byte ptr [rcx], 0 -;; 890f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8918: 800100 add byte ptr [rcx], 0 -;; 891b: aa stosb byte ptr [rdi], al -;; 891c: 800100 add byte ptr [rcx], 0 -;; 891f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8928: 800100 add byte ptr [rcx], 0 -;; 892b: aa stosb byte ptr [rdi], al -;; 892c: 800100 add byte ptr [rcx], 0 -;; 892f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8938: 800100 add byte ptr [rcx], 0 -;; 893b: aa stosb byte ptr [rdi], al -;; 893c: 800100 add byte ptr [rcx], 0 -;; 893f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8948: 800100 add byte ptr [rcx], 0 -;; 894b: aa stosb byte ptr [rdi], al -;; 894c: 800100 add byte ptr [rcx], 0 -;; 894f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8958: 800100 add byte ptr [rcx], 0 -;; 895b: aa stosb byte ptr [rdi], al -;; 895c: 800100 add byte ptr [rcx], 0 -;; 895f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8968: 800100 add byte ptr [rcx], 0 -;; 896b: aa stosb byte ptr [rdi], al -;; 896c: 800100 add byte ptr [rcx], 0 -;; 896f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8978: 800100 add byte ptr [rcx], 0 -;; 897b: aa stosb byte ptr [rdi], al -;; 897c: 800100 add byte ptr [rcx], 0 -;; 897f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8988: 800100 add byte ptr [rcx], 0 -;; 898b: aa stosb byte ptr [rdi], al -;; 898c: 800100 add byte ptr [rcx], 0 -;; 898f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8998: 800100 add byte ptr [rcx], 0 -;; 899b: aa stosb byte ptr [rdi], al -;; 899c: 800100 add byte ptr [rcx], 0 -;; 899f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 89a8: 800100 add byte ptr [rcx], 0 -;; 89ab: aa stosb byte ptr [rdi], al -;; 89ac: 800100 add byte ptr [rcx], 0 -;; 89af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 89b8: 800100 add byte ptr [rcx], 0 -;; 89bb: aa stosb byte ptr [rdi], al -;; 89bc: 800100 add byte ptr [rcx], 0 -;; 89bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 89c8: 800100 add byte ptr [rcx], 0 -;; 89cb: aa stosb byte ptr [rdi], al -;; 89cc: 800100 add byte ptr [rcx], 0 -;; 89cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 89d8: 800100 add byte ptr [rcx], 0 -;; 89db: aa stosb byte ptr [rdi], al -;; 89dc: 800100 add byte ptr [rcx], 0 -;; 89df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 89e8: 800100 add byte ptr [rcx], 0 -;; 89eb: aa stosb byte ptr [rdi], al -;; 89ec: 800100 add byte ptr [rcx], 0 -;; 89ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 89f8: 800100 add byte ptr [rcx], 0 -;; 89fb: aa stosb byte ptr [rdi], al -;; 89fc: 800100 add byte ptr [rcx], 0 -;; 89ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8a08: 800100 add byte ptr [rcx], 0 -;; 8a0b: aa stosb byte ptr [rdi], al -;; 8a0c: 800100 add byte ptr [rcx], 0 -;; 8a0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8a18: 800100 add byte ptr [rcx], 0 -;; 8a1b: aa stosb byte ptr [rdi], al -;; 8a1c: 800100 add byte ptr [rcx], 0 -;; 8a1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8a28: 800100 add byte ptr [rcx], 0 -;; 8a2b: aa stosb byte ptr [rdi], al -;; 8a2c: 800100 add byte ptr [rcx], 0 -;; 8a2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8a38: 800100 add byte ptr [rcx], 0 -;; 8a3b: aa stosb byte ptr [rdi], al -;; 8a3c: 800100 add byte ptr [rcx], 0 -;; 8a3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8a48: 800100 add byte ptr [rcx], 0 -;; 8a4b: aa stosb byte ptr [rdi], al -;; 8a4c: 800100 add byte ptr [rcx], 0 -;; 8a4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8a58: 800100 add byte ptr [rcx], 0 -;; 8a5b: aa stosb byte ptr [rdi], al -;; 8a5c: 800100 add byte ptr [rcx], 0 -;; 8a5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8a68: 800100 add byte ptr [rcx], 0 -;; 8a6b: aa stosb byte ptr [rdi], al -;; 8a6c: 800100 add byte ptr [rcx], 0 -;; 8a6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8a78: 800100 add byte ptr [rcx], 0 -;; 8a7b: aa stosb byte ptr [rdi], al -;; 8a7c: 800100 add byte ptr [rcx], 0 -;; 8a7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8a88: 800100 add byte ptr [rcx], 0 -;; 8a8b: aa stosb byte ptr [rdi], al -;; 8a8c: 800100 add byte ptr [rcx], 0 -;; 8a8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8a98: 800100 add byte ptr [rcx], 0 -;; 8a9b: aa stosb byte ptr [rdi], al -;; 8a9c: 800100 add byte ptr [rcx], 0 -;; 8a9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8aa8: 800100 add byte ptr [rcx], 0 -;; 8aab: aa stosb byte ptr [rdi], al -;; 8aac: 800100 add byte ptr [rcx], 0 -;; 8aaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8ab8: 800100 add byte ptr [rcx], 0 -;; 8abb: aa stosb byte ptr [rdi], al -;; 8abc: 800100 add byte ptr [rcx], 0 -;; 8abf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8ac8: 800100 add byte ptr [rcx], 0 -;; 8acb: aa stosb byte ptr [rdi], al -;; 8acc: 800100 add byte ptr [rcx], 0 -;; 8acf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8ad8: 800100 add byte ptr [rcx], 0 -;; 8adb: aa stosb byte ptr [rdi], al -;; 8adc: 800100 add byte ptr [rcx], 0 -;; 8adf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8ae8: 800100 add byte ptr [rcx], 0 -;; 8aeb: aa stosb byte ptr [rdi], al -;; 8aec: 800100 add byte ptr [rcx], 0 -;; 8aef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8af8: 800100 add byte ptr [rcx], 0 -;; 8afb: aa stosb byte ptr [rdi], al -;; 8afc: 800100 add byte ptr [rcx], 0 -;; 8aff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8b08: 800100 add byte ptr [rcx], 0 -;; 8b0b: aa stosb byte ptr [rdi], al -;; 8b0c: 800100 add byte ptr [rcx], 0 -;; 8b0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8b18: 800100 add byte ptr [rcx], 0 -;; 8b1b: aa stosb byte ptr [rdi], al -;; 8b1c: 800100 add byte ptr [rcx], 0 -;; 8b1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8b28: 800100 add byte ptr [rcx], 0 -;; 8b2b: aa stosb byte ptr [rdi], al -;; 8b2c: 800100 add byte ptr [rcx], 0 -;; 8b2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8b38: 800100 add byte ptr [rcx], 0 -;; 8b3b: aa stosb byte ptr [rdi], al -;; 8b3c: 800100 add byte ptr [rcx], 0 -;; 8b3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8b48: 800100 add byte ptr [rcx], 0 -;; 8b4b: aa stosb byte ptr [rdi], al -;; 8b4c: 800100 add byte ptr [rcx], 0 -;; 8b4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8b58: 800100 add byte ptr [rcx], 0 -;; 8b5b: aa stosb byte ptr [rdi], al -;; 8b5c: 800100 add byte ptr [rcx], 0 -;; 8b5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8b68: 800100 add byte ptr [rcx], 0 -;; 8b6b: aa stosb byte ptr [rdi], al -;; 8b6c: 800100 add byte ptr [rcx], 0 -;; 8b6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8b78: 800100 add byte ptr [rcx], 0 -;; 8b7b: aa stosb byte ptr [rdi], al -;; 8b7c: 800100 add byte ptr [rcx], 0 -;; 8b7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8b88: 800100 add byte ptr [rcx], 0 -;; 8b8b: aa stosb byte ptr [rdi], al -;; 8b8c: 800100 add byte ptr [rcx], 0 -;; 8b8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8b98: 800100 add byte ptr [rcx], 0 -;; 8b9b: aa stosb byte ptr [rdi], al -;; 8b9c: 800100 add byte ptr [rcx], 0 -;; 8b9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8ba8: 800100 add byte ptr [rcx], 0 -;; 8bab: aa stosb byte ptr [rdi], al -;; 8bac: 800100 add byte ptr [rcx], 0 -;; 8baf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8bb8: 800100 add byte ptr [rcx], 0 -;; 8bbb: aa stosb byte ptr [rdi], al -;; 8bbc: 800100 add byte ptr [rcx], 0 -;; 8bbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8bc8: 800100 add byte ptr [rcx], 0 -;; 8bcb: aa stosb byte ptr [rdi], al -;; 8bcc: 800100 add byte ptr [rcx], 0 -;; 8bcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8bd8: 800100 add byte ptr [rcx], 0 -;; 8bdb: aa stosb byte ptr [rdi], al -;; 8bdc: 800100 add byte ptr [rcx], 0 -;; 8bdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8be8: 800100 add byte ptr [rcx], 0 -;; 8beb: aa stosb byte ptr [rdi], al -;; 8bec: 800100 add byte ptr [rcx], 0 -;; 8bef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8bf8: 800100 add byte ptr [rcx], 0 -;; 8bfb: aa stosb byte ptr [rdi], al -;; 8bfc: 800100 add byte ptr [rcx], 0 -;; 8bff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8c08: 800100 add byte ptr [rcx], 0 -;; 8c0b: aa stosb byte ptr [rdi], al -;; 8c0c: 800100 add byte ptr [rcx], 0 -;; 8c0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8c18: 800100 add byte ptr [rcx], 0 -;; 8c1b: aa stosb byte ptr [rdi], al -;; 8c1c: 800100 add byte ptr [rcx], 0 -;; 8c1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8c28: 800100 add byte ptr [rcx], 0 -;; 8c2b: aa stosb byte ptr [rdi], al -;; 8c2c: 800100 add byte ptr [rcx], 0 -;; 8c2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8c38: 800100 add byte ptr [rcx], 0 -;; 8c3b: aa stosb byte ptr [rdi], al -;; 8c3c: 800100 add byte ptr [rcx], 0 -;; 8c3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8c48: 800100 add byte ptr [rcx], 0 -;; 8c4b: aa stosb byte ptr [rdi], al -;; 8c4c: 800100 add byte ptr [rcx], 0 -;; 8c4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8c58: 800100 add byte ptr [rcx], 0 -;; 8c5b: aa stosb byte ptr [rdi], al -;; 8c5c: 800100 add byte ptr [rcx], 0 -;; 8c5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8c68: 800100 add byte ptr [rcx], 0 -;; 8c6b: aa stosb byte ptr [rdi], al -;; 8c6c: 800100 add byte ptr [rcx], 0 -;; 8c6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8c78: 800100 add byte ptr [rcx], 0 -;; 8c7b: aa stosb byte ptr [rdi], al -;; 8c7c: 800100 add byte ptr [rcx], 0 -;; 8c7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8c88: 800100 add byte ptr [rcx], 0 -;; 8c8b: aa stosb byte ptr [rdi], al -;; 8c8c: 800100 add byte ptr [rcx], 0 -;; 8c8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8c98: 800100 add byte ptr [rcx], 0 -;; 8c9b: aa stosb byte ptr [rdi], al -;; 8c9c: 800100 add byte ptr [rcx], 0 -;; 8c9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8ca8: 800100 add byte ptr [rcx], 0 -;; 8cab: aa stosb byte ptr [rdi], al -;; 8cac: 800100 add byte ptr [rcx], 0 -;; 8caf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8cb8: 800100 add byte ptr [rcx], 0 -;; 8cbb: aa stosb byte ptr [rdi], al -;; 8cbc: 800100 add byte ptr [rcx], 0 -;; 8cbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8cc8: 800100 add byte ptr [rcx], 0 -;; 8ccb: aa stosb byte ptr [rdi], al -;; 8ccc: 800100 add byte ptr [rcx], 0 -;; 8ccf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8cd8: 800100 add byte ptr [rcx], 0 -;; 8cdb: aa stosb byte ptr [rdi], al -;; 8cdc: 800100 add byte ptr [rcx], 0 -;; 8cdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8ce8: 800100 add byte ptr [rcx], 0 -;; 8ceb: aa stosb byte ptr [rdi], al -;; 8cec: 800100 add byte ptr [rcx], 0 -;; 8cef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8cf8: 800100 add byte ptr [rcx], 0 -;; 8cfb: aa stosb byte ptr [rdi], al -;; 8cfc: 800100 add byte ptr [rcx], 0 -;; 8cff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8d08: 800100 add byte ptr [rcx], 0 -;; 8d0b: aa stosb byte ptr [rdi], al -;; 8d0c: 800100 add byte ptr [rcx], 0 -;; 8d0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8d18: 800100 add byte ptr [rcx], 0 -;; 8d1b: aa stosb byte ptr [rdi], al -;; 8d1c: 800100 add byte ptr [rcx], 0 -;; 8d1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8d28: 800100 add byte ptr [rcx], 0 -;; 8d2b: aa stosb byte ptr [rdi], al -;; 8d2c: 800100 add byte ptr [rcx], 0 -;; 8d2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8d38: 800100 add byte ptr [rcx], 0 -;; 8d3b: aa stosb byte ptr [rdi], al -;; 8d3c: 800100 add byte ptr [rcx], 0 -;; 8d3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8d48: 800100 add byte ptr [rcx], 0 -;; 8d4b: aa stosb byte ptr [rdi], al -;; 8d4c: 800100 add byte ptr [rcx], 0 -;; 8d4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8d58: 800100 add byte ptr [rcx], 0 -;; 8d5b: aa stosb byte ptr [rdi], al -;; 8d5c: 800100 add byte ptr [rcx], 0 -;; 8d5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8d68: 800100 add byte ptr [rcx], 0 -;; 8d6b: aa stosb byte ptr [rdi], al -;; 8d6c: 800100 add byte ptr [rcx], 0 -;; 8d6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8d78: 800100 add byte ptr [rcx], 0 -;; 8d7b: aa stosb byte ptr [rdi], al -;; 8d7c: 800100 add byte ptr [rcx], 0 -;; 8d7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8d88: 800100 add byte ptr [rcx], 0 -;; 8d8b: aa stosb byte ptr [rdi], al -;; 8d8c: 800100 add byte ptr [rcx], 0 -;; 8d8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8d98: 800100 add byte ptr [rcx], 0 -;; 8d9b: aa stosb byte ptr [rdi], al -;; 8d9c: 800100 add byte ptr [rcx], 0 -;; 8d9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8da8: 800100 add byte ptr [rcx], 0 -;; 8dab: aa stosb byte ptr [rdi], al -;; 8dac: 800100 add byte ptr [rcx], 0 -;; 8daf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8db8: 800100 add byte ptr [rcx], 0 -;; 8dbb: aa stosb byte ptr [rdi], al -;; 8dbc: 800100 add byte ptr [rcx], 0 -;; 8dbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8dc8: 800100 add byte ptr [rcx], 0 -;; 8dcb: aa stosb byte ptr [rdi], al -;; 8dcc: 800100 add byte ptr [rcx], 0 -;; 8dcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8dd8: 800100 add byte ptr [rcx], 0 -;; 8ddb: aa stosb byte ptr [rdi], al -;; 8ddc: 800100 add byte ptr [rcx], 0 -;; 8ddf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8de8: 800100 add byte ptr [rcx], 0 -;; 8deb: aa stosb byte ptr [rdi], al -;; 8dec: 800100 add byte ptr [rcx], 0 -;; 8def: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8df8: 800100 add byte ptr [rcx], 0 -;; 8dfb: aa stosb byte ptr [rdi], al -;; 8dfc: 800100 add byte ptr [rcx], 0 -;; 8dff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8e08: 800100 add byte ptr [rcx], 0 -;; 8e0b: aa stosb byte ptr [rdi], al -;; 8e0c: 800100 add byte ptr [rcx], 0 -;; 8e0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8e18: 800100 add byte ptr [rcx], 0 -;; 8e1b: aa stosb byte ptr [rdi], al -;; 8e1c: 800100 add byte ptr [rcx], 0 -;; 8e1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8e28: 800100 add byte ptr [rcx], 0 -;; 8e2b: aa stosb byte ptr [rdi], al -;; 8e2c: 800100 add byte ptr [rcx], 0 -;; 8e2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8e38: 800100 add byte ptr [rcx], 0 -;; 8e3b: aa stosb byte ptr [rdi], al -;; 8e3c: 800100 add byte ptr [rcx], 0 -;; 8e3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8e48: 800100 add byte ptr [rcx], 0 -;; 8e4b: aa stosb byte ptr [rdi], al -;; 8e4c: 800100 add byte ptr [rcx], 0 -;; 8e4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8e58: 800100 add byte ptr [rcx], 0 -;; 8e5b: aa stosb byte ptr [rdi], al -;; 8e5c: 800100 add byte ptr [rcx], 0 -;; 8e5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8e68: 800100 add byte ptr [rcx], 0 -;; 8e6b: aa stosb byte ptr [rdi], al -;; 8e6c: 800100 add byte ptr [rcx], 0 -;; 8e6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8e78: 800100 add byte ptr [rcx], 0 -;; 8e7b: aa stosb byte ptr [rdi], al -;; 8e7c: 800100 add byte ptr [rcx], 0 -;; 8e7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8e88: 800100 add byte ptr [rcx], 0 -;; 8e8b: aa stosb byte ptr [rdi], al -;; 8e8c: 800100 add byte ptr [rcx], 0 -;; 8e8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8e98: 800100 add byte ptr [rcx], 0 -;; 8e9b: aa stosb byte ptr [rdi], al -;; 8e9c: 800100 add byte ptr [rcx], 0 -;; 8e9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8ea8: 800100 add byte ptr [rcx], 0 -;; 8eab: aa stosb byte ptr [rdi], al -;; 8eac: 800100 add byte ptr [rcx], 0 -;; 8eaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8eb8: 800100 add byte ptr [rcx], 0 -;; 8ebb: aa stosb byte ptr [rdi], al -;; 8ebc: 800100 add byte ptr [rcx], 0 -;; 8ebf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8ec8: 800100 add byte ptr [rcx], 0 -;; 8ecb: aa stosb byte ptr [rdi], al -;; 8ecc: 800100 add byte ptr [rcx], 0 -;; 8ecf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8ed8: 800100 add byte ptr [rcx], 0 -;; 8edb: aa stosb byte ptr [rdi], al -;; 8edc: 800100 add byte ptr [rcx], 0 -;; 8edf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8ee8: 800100 add byte ptr [rcx], 0 -;; 8eeb: aa stosb byte ptr [rdi], al -;; 8eec: 800100 add byte ptr [rcx], 0 -;; 8eef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8ef8: 800100 add byte ptr [rcx], 0 -;; 8efb: aa stosb byte ptr [rdi], al -;; 8efc: 800100 add byte ptr [rcx], 0 -;; 8eff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8f08: 800100 add byte ptr [rcx], 0 -;; 8f0b: aa stosb byte ptr [rdi], al -;; 8f0c: 800100 add byte ptr [rcx], 0 -;; 8f0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8f18: 800100 add byte ptr [rcx], 0 -;; 8f1b: aa stosb byte ptr [rdi], al -;; 8f1c: 800100 add byte ptr [rcx], 0 -;; 8f1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8f28: 800100 add byte ptr [rcx], 0 -;; 8f2b: aa stosb byte ptr [rdi], al -;; 8f2c: 800100 add byte ptr [rcx], 0 -;; 8f2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8f38: 800100 add byte ptr [rcx], 0 -;; 8f3b: aa stosb byte ptr [rdi], al -;; 8f3c: 800100 add byte ptr [rcx], 0 -;; 8f3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8f48: 800100 add byte ptr [rcx], 0 -;; 8f4b: aa stosb byte ptr [rdi], al -;; 8f4c: 800100 add byte ptr [rcx], 0 -;; 8f4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8f58: 800100 add byte ptr [rcx], 0 -;; 8f5b: aa stosb byte ptr [rdi], al -;; 8f5c: 800100 add byte ptr [rcx], 0 -;; 8f5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8f68: 800100 add byte ptr [rcx], 0 -;; 8f6b: aa stosb byte ptr [rdi], al -;; 8f6c: 800100 add byte ptr [rcx], 0 -;; 8f6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8f78: 800100 add byte ptr [rcx], 0 -;; 8f7b: aa stosb byte ptr [rdi], al -;; 8f7c: 800100 add byte ptr [rcx], 0 -;; 8f7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8f88: 800100 add byte ptr [rcx], 0 -;; 8f8b: aa stosb byte ptr [rdi], al -;; 8f8c: 800100 add byte ptr [rcx], 0 -;; 8f8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8f98: 800100 add byte ptr [rcx], 0 -;; 8f9b: aa stosb byte ptr [rdi], al -;; 8f9c: 800100 add byte ptr [rcx], 0 -;; 8f9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8fa8: 800100 add byte ptr [rcx], 0 -;; 8fab: aa stosb byte ptr [rdi], al -;; 8fac: 800100 add byte ptr [rcx], 0 -;; 8faf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8fb8: 800100 add byte ptr [rcx], 0 -;; 8fbb: aa stosb byte ptr [rdi], al -;; 8fbc: 800100 add byte ptr [rcx], 0 -;; 8fbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8fc8: 800100 add byte ptr [rcx], 0 -;; 8fcb: aa stosb byte ptr [rdi], al -;; 8fcc: 800100 add byte ptr [rcx], 0 -;; 8fcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8fd8: 800100 add byte ptr [rcx], 0 -;; 8fdb: aa stosb byte ptr [rdi], al -;; 8fdc: 800100 add byte ptr [rcx], 0 -;; 8fdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8fe8: 800100 add byte ptr [rcx], 0 -;; 8feb: aa stosb byte ptr [rdi], al -;; 8fec: 800100 add byte ptr [rcx], 0 -;; 8fef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 8ff8: 800100 add byte ptr [rcx], 0 -;; 8ffb: aa stosb byte ptr [rdi], al -;; 8ffc: 800100 add byte ptr [rcx], 0 -;; 8fff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9008: 800100 add byte ptr [rcx], 0 -;; 900b: aa stosb byte ptr [rdi], al -;; 900c: 800100 add byte ptr [rcx], 0 -;; 900f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9018: 800100 add byte ptr [rcx], 0 -;; 901b: aa stosb byte ptr [rdi], al -;; 901c: 800100 add byte ptr [rcx], 0 -;; 901f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9028: 800100 add byte ptr [rcx], 0 -;; 902b: aa stosb byte ptr [rdi], al -;; 902c: 800100 add byte ptr [rcx], 0 -;; 902f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9038: 800100 add byte ptr [rcx], 0 -;; 903b: aa stosb byte ptr [rdi], al -;; 903c: 800100 add byte ptr [rcx], 0 -;; 903f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9048: 800100 add byte ptr [rcx], 0 -;; 904b: aa stosb byte ptr [rdi], al -;; 904c: 800100 add byte ptr [rcx], 0 -;; 904f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9058: 800100 add byte ptr [rcx], 0 -;; 905b: aa stosb byte ptr [rdi], al -;; 905c: 800100 add byte ptr [rcx], 0 -;; 905f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9068: 800100 add byte ptr [rcx], 0 -;; 906b: aa stosb byte ptr [rdi], al -;; 906c: 800100 add byte ptr [rcx], 0 -;; 906f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9078: 800100 add byte ptr [rcx], 0 -;; 907b: aa stosb byte ptr [rdi], al -;; 907c: 800100 add byte ptr [rcx], 0 -;; 907f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9088: 800100 add byte ptr [rcx], 0 -;; 908b: aa stosb byte ptr [rdi], al -;; 908c: 800100 add byte ptr [rcx], 0 -;; 908f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9098: 800100 add byte ptr [rcx], 0 -;; 909b: aa stosb byte ptr [rdi], al -;; 909c: 800100 add byte ptr [rcx], 0 -;; 909f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 90a8: 800100 add byte ptr [rcx], 0 -;; 90ab: aa stosb byte ptr [rdi], al -;; 90ac: 800100 add byte ptr [rcx], 0 -;; 90af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 90b8: 800100 add byte ptr [rcx], 0 -;; 90bb: aa stosb byte ptr [rdi], al -;; 90bc: 800100 add byte ptr [rcx], 0 -;; 90bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 90c8: 800100 add byte ptr [rcx], 0 -;; 90cb: aa stosb byte ptr [rdi], al -;; 90cc: 800100 add byte ptr [rcx], 0 -;; 90cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 90d8: 800100 add byte ptr [rcx], 0 -;; 90db: aa stosb byte ptr [rdi], al -;; 90dc: 800100 add byte ptr [rcx], 0 -;; 90df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 90e8: 800100 add byte ptr [rcx], 0 -;; 90eb: aa stosb byte ptr [rdi], al -;; 90ec: 800100 add byte ptr [rcx], 0 -;; 90ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 90f8: 800100 add byte ptr [rcx], 0 -;; 90fb: aa stosb byte ptr [rdi], al -;; 90fc: 800100 add byte ptr [rcx], 0 -;; 90ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9108: 800100 add byte ptr [rcx], 0 -;; 910b: aa stosb byte ptr [rdi], al -;; 910c: 800100 add byte ptr [rcx], 0 -;; 910f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9118: 800100 add byte ptr [rcx], 0 -;; 911b: aa stosb byte ptr [rdi], al -;; 911c: 800100 add byte ptr [rcx], 0 -;; 911f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9128: 800100 add byte ptr [rcx], 0 -;; 912b: aa stosb byte ptr [rdi], al -;; 912c: 800100 add byte ptr [rcx], 0 -;; 912f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9138: 800100 add byte ptr [rcx], 0 -;; 913b: aa stosb byte ptr [rdi], al -;; 913c: 800100 add byte ptr [rcx], 0 -;; 913f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9148: 800100 add byte ptr [rcx], 0 -;; 914b: aa stosb byte ptr [rdi], al -;; 914c: 800100 add byte ptr [rcx], 0 -;; 914f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9158: 800100 add byte ptr [rcx], 0 -;; 915b: aa stosb byte ptr [rdi], al -;; 915c: 800100 add byte ptr [rcx], 0 -;; 915f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9168: 800100 add byte ptr [rcx], 0 -;; 916b: aa stosb byte ptr [rdi], al -;; 916c: 800100 add byte ptr [rcx], 0 -;; 916f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9178: 800100 add byte ptr [rcx], 0 -;; 917b: aa stosb byte ptr [rdi], al -;; 917c: 800100 add byte ptr [rcx], 0 -;; 917f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9188: 800100 add byte ptr [rcx], 0 -;; 918b: aa stosb byte ptr [rdi], al -;; 918c: 800100 add byte ptr [rcx], 0 -;; 918f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9198: 800100 add byte ptr [rcx], 0 -;; 919b: aa stosb byte ptr [rdi], al -;; 919c: 800100 add byte ptr [rcx], 0 -;; 919f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 91a8: 800100 add byte ptr [rcx], 0 -;; 91ab: aa stosb byte ptr [rdi], al -;; 91ac: 800100 add byte ptr [rcx], 0 -;; 91af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 91b8: 800100 add byte ptr [rcx], 0 -;; 91bb: aa stosb byte ptr [rdi], al -;; 91bc: 800100 add byte ptr [rcx], 0 -;; 91bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 91c8: 800100 add byte ptr [rcx], 0 -;; 91cb: aa stosb byte ptr [rdi], al -;; 91cc: 800100 add byte ptr [rcx], 0 -;; 91cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 91d8: 800100 add byte ptr [rcx], 0 -;; 91db: aa stosb byte ptr [rdi], al -;; 91dc: 800100 add byte ptr [rcx], 0 -;; 91df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 91e8: 800100 add byte ptr [rcx], 0 -;; 91eb: aa stosb byte ptr [rdi], al -;; 91ec: 800100 add byte ptr [rcx], 0 -;; 91ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 91f8: 800100 add byte ptr [rcx], 0 -;; 91fb: aa stosb byte ptr [rdi], al -;; 91fc: 800100 add byte ptr [rcx], 0 -;; 91ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9208: 800100 add byte ptr [rcx], 0 -;; 920b: aa stosb byte ptr [rdi], al -;; 920c: 800100 add byte ptr [rcx], 0 -;; 920f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9218: 800100 add byte ptr [rcx], 0 -;; 921b: aa stosb byte ptr [rdi], al -;; 921c: 800100 add byte ptr [rcx], 0 -;; 921f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9228: 800100 add byte ptr [rcx], 0 -;; 922b: aa stosb byte ptr [rdi], al -;; 922c: 800100 add byte ptr [rcx], 0 -;; 922f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9238: 800100 add byte ptr [rcx], 0 -;; 923b: aa stosb byte ptr [rdi], al -;; 923c: 800100 add byte ptr [rcx], 0 -;; 923f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9248: 800100 add byte ptr [rcx], 0 -;; 924b: aa stosb byte ptr [rdi], al -;; 924c: 800100 add byte ptr [rcx], 0 -;; 924f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9258: 800100 add byte ptr [rcx], 0 -;; 925b: aa stosb byte ptr [rdi], al -;; 925c: 800100 add byte ptr [rcx], 0 -;; 925f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9268: 800100 add byte ptr [rcx], 0 -;; 926b: aa stosb byte ptr [rdi], al -;; 926c: 800100 add byte ptr [rcx], 0 -;; 926f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9278: 800100 add byte ptr [rcx], 0 -;; 927b: aa stosb byte ptr [rdi], al -;; 927c: 800100 add byte ptr [rcx], 0 -;; 927f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9288: 800100 add byte ptr [rcx], 0 -;; 928b: aa stosb byte ptr [rdi], al -;; 928c: 800100 add byte ptr [rcx], 0 -;; 928f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9298: 800100 add byte ptr [rcx], 0 -;; 929b: aa stosb byte ptr [rdi], al -;; 929c: 800100 add byte ptr [rcx], 0 -;; 929f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 92a8: 800100 add byte ptr [rcx], 0 -;; 92ab: aa stosb byte ptr [rdi], al -;; 92ac: 800100 add byte ptr [rcx], 0 -;; 92af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 92b8: 800100 add byte ptr [rcx], 0 -;; 92bb: aa stosb byte ptr [rdi], al -;; 92bc: 800100 add byte ptr [rcx], 0 -;; 92bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 92c8: 800100 add byte ptr [rcx], 0 -;; 92cb: aa stosb byte ptr [rdi], al -;; 92cc: 800100 add byte ptr [rcx], 0 -;; 92cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 92d8: 800100 add byte ptr [rcx], 0 -;; 92db: aa stosb byte ptr [rdi], al -;; 92dc: 800100 add byte ptr [rcx], 0 -;; 92df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 92e8: 800100 add byte ptr [rcx], 0 -;; 92eb: aa stosb byte ptr [rdi], al -;; 92ec: 800100 add byte ptr [rcx], 0 -;; 92ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 92f8: 800100 add byte ptr [rcx], 0 -;; 92fb: aa stosb byte ptr [rdi], al -;; 92fc: 800100 add byte ptr [rcx], 0 -;; 92ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9308: 800100 add byte ptr [rcx], 0 -;; 930b: aa stosb byte ptr [rdi], al -;; 930c: 800100 add byte ptr [rcx], 0 -;; 930f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9318: 800100 add byte ptr [rcx], 0 -;; 931b: aa stosb byte ptr [rdi], al -;; 931c: 800100 add byte ptr [rcx], 0 -;; 931f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9328: 800100 add byte ptr [rcx], 0 -;; 932b: aa stosb byte ptr [rdi], al -;; 932c: 800100 add byte ptr [rcx], 0 -;; 932f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9338: 800100 add byte ptr [rcx], 0 -;; 933b: aa stosb byte ptr [rdi], al -;; 933c: 800100 add byte ptr [rcx], 0 -;; 933f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9348: 800100 add byte ptr [rcx], 0 -;; 934b: aa stosb byte ptr [rdi], al -;; 934c: 800100 add byte ptr [rcx], 0 -;; 934f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9358: 800100 add byte ptr [rcx], 0 -;; 935b: aa stosb byte ptr [rdi], al -;; 935c: 800100 add byte ptr [rcx], 0 -;; 935f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9368: 800100 add byte ptr [rcx], 0 -;; 936b: aa stosb byte ptr [rdi], al -;; 936c: 800100 add byte ptr [rcx], 0 -;; 936f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9378: 800100 add byte ptr [rcx], 0 -;; 937b: aa stosb byte ptr [rdi], al -;; 937c: 800100 add byte ptr [rcx], 0 -;; 937f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9388: 800100 add byte ptr [rcx], 0 -;; 938b: aa stosb byte ptr [rdi], al -;; 938c: 800100 add byte ptr [rcx], 0 -;; 938f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9398: 800100 add byte ptr [rcx], 0 -;; 939b: aa stosb byte ptr [rdi], al -;; 939c: 800100 add byte ptr [rcx], 0 -;; 939f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 93a8: 800100 add byte ptr [rcx], 0 -;; 93ab: aa stosb byte ptr [rdi], al -;; 93ac: 800100 add byte ptr [rcx], 0 -;; 93af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 93b8: 800100 add byte ptr [rcx], 0 -;; 93bb: aa stosb byte ptr [rdi], al -;; 93bc: 800100 add byte ptr [rcx], 0 -;; 93bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 93c8: 800100 add byte ptr [rcx], 0 -;; 93cb: aa stosb byte ptr [rdi], al -;; 93cc: 800100 add byte ptr [rcx], 0 -;; 93cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 93d8: 800100 add byte ptr [rcx], 0 -;; 93db: aa stosb byte ptr [rdi], al -;; 93dc: 800100 add byte ptr [rcx], 0 -;; 93df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 93e8: 800100 add byte ptr [rcx], 0 -;; 93eb: aa stosb byte ptr [rdi], al -;; 93ec: 800100 add byte ptr [rcx], 0 -;; 93ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 93f8: 800100 add byte ptr [rcx], 0 -;; 93fb: aa stosb byte ptr [rdi], al -;; 93fc: 800100 add byte ptr [rcx], 0 -;; 93ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9408: 800100 add byte ptr [rcx], 0 -;; 940b: aa stosb byte ptr [rdi], al -;; 940c: 800100 add byte ptr [rcx], 0 -;; 940f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9418: 800100 add byte ptr [rcx], 0 -;; 941b: aa stosb byte ptr [rdi], al -;; 941c: 800100 add byte ptr [rcx], 0 -;; 941f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9428: 800100 add byte ptr [rcx], 0 -;; 942b: aa stosb byte ptr [rdi], al -;; 942c: 800100 add byte ptr [rcx], 0 -;; 942f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9438: 800100 add byte ptr [rcx], 0 -;; 943b: aa stosb byte ptr [rdi], al -;; 943c: 800100 add byte ptr [rcx], 0 -;; 943f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9448: 800100 add byte ptr [rcx], 0 -;; 944b: aa stosb byte ptr [rdi], al -;; 944c: 800100 add byte ptr [rcx], 0 -;; 944f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9458: 800100 add byte ptr [rcx], 0 -;; 945b: aa stosb byte ptr [rdi], al -;; 945c: 800100 add byte ptr [rcx], 0 -;; 945f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9468: 800100 add byte ptr [rcx], 0 -;; 946b: aa stosb byte ptr [rdi], al -;; 946c: 800100 add byte ptr [rcx], 0 -;; 946f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9478: 800100 add byte ptr [rcx], 0 -;; 947b: aa stosb byte ptr [rdi], al -;; 947c: 800100 add byte ptr [rcx], 0 -;; 947f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9488: 800100 add byte ptr [rcx], 0 -;; 948b: aa stosb byte ptr [rdi], al -;; 948c: 800100 add byte ptr [rcx], 0 -;; 948f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9498: 800100 add byte ptr [rcx], 0 -;; 949b: aa stosb byte ptr [rdi], al -;; 949c: 800100 add byte ptr [rcx], 0 -;; 949f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 94a8: 800100 add byte ptr [rcx], 0 -;; 94ab: aa stosb byte ptr [rdi], al -;; 94ac: 800100 add byte ptr [rcx], 0 -;; 94af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 94b8: 800100 add byte ptr [rcx], 0 -;; 94bb: aa stosb byte ptr [rdi], al -;; 94bc: 800100 add byte ptr [rcx], 0 -;; 94bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 94c8: 800100 add byte ptr [rcx], 0 -;; 94cb: aa stosb byte ptr [rdi], al -;; 94cc: 800100 add byte ptr [rcx], 0 -;; 94cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 94d8: 800100 add byte ptr [rcx], 0 -;; 94db: aa stosb byte ptr [rdi], al -;; 94dc: 800100 add byte ptr [rcx], 0 -;; 94df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 94e8: 800100 add byte ptr [rcx], 0 -;; 94eb: aa stosb byte ptr [rdi], al -;; 94ec: 800100 add byte ptr [rcx], 0 -;; 94ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 94f8: 800100 add byte ptr [rcx], 0 -;; 94fb: aa stosb byte ptr [rdi], al -;; 94fc: 800100 add byte ptr [rcx], 0 -;; 94ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9508: 800100 add byte ptr [rcx], 0 -;; 950b: aa stosb byte ptr [rdi], al -;; 950c: 800100 add byte ptr [rcx], 0 -;; 950f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9518: 800100 add byte ptr [rcx], 0 -;; 951b: aa stosb byte ptr [rdi], al -;; 951c: 800100 add byte ptr [rcx], 0 -;; 951f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9528: 800100 add byte ptr [rcx], 0 -;; 952b: aa stosb byte ptr [rdi], al -;; 952c: 800100 add byte ptr [rcx], 0 -;; 952f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9538: 800100 add byte ptr [rcx], 0 -;; 953b: aa stosb byte ptr [rdi], al -;; 953c: 800100 add byte ptr [rcx], 0 -;; 953f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9548: 800100 add byte ptr [rcx], 0 -;; 954b: aa stosb byte ptr [rdi], al -;; 954c: 800100 add byte ptr [rcx], 0 -;; 954f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9558: 800100 add byte ptr [rcx], 0 -;; 955b: aa stosb byte ptr [rdi], al -;; 955c: 800100 add byte ptr [rcx], 0 -;; 955f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9568: 800100 add byte ptr [rcx], 0 -;; 956b: aa stosb byte ptr [rdi], al -;; 956c: 800100 add byte ptr [rcx], 0 -;; 956f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9578: 800100 add byte ptr [rcx], 0 -;; 957b: aa stosb byte ptr [rdi], al -;; 957c: 800100 add byte ptr [rcx], 0 -;; 957f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9588: 800100 add byte ptr [rcx], 0 -;; 958b: aa stosb byte ptr [rdi], al -;; 958c: 800100 add byte ptr [rcx], 0 -;; 958f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9598: 800100 add byte ptr [rcx], 0 -;; 959b: aa stosb byte ptr [rdi], al -;; 959c: 800100 add byte ptr [rcx], 0 -;; 959f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 95a8: 800100 add byte ptr [rcx], 0 -;; 95ab: aa stosb byte ptr [rdi], al -;; 95ac: 800100 add byte ptr [rcx], 0 -;; 95af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 95b8: 800100 add byte ptr [rcx], 0 -;; 95bb: aa stosb byte ptr [rdi], al -;; 95bc: 800100 add byte ptr [rcx], 0 -;; 95bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 95c8: 800100 add byte ptr [rcx], 0 -;; 95cb: aa stosb byte ptr [rdi], al -;; 95cc: 800100 add byte ptr [rcx], 0 -;; 95cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 95d8: 800100 add byte ptr [rcx], 0 -;; 95db: aa stosb byte ptr [rdi], al -;; 95dc: 800100 add byte ptr [rcx], 0 -;; 95df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 95e8: 800100 add byte ptr [rcx], 0 -;; 95eb: aa stosb byte ptr [rdi], al -;; 95ec: 800100 add byte ptr [rcx], 0 -;; 95ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 95f8: 800100 add byte ptr [rcx], 0 -;; 95fb: aa stosb byte ptr [rdi], al -;; 95fc: 800100 add byte ptr [rcx], 0 -;; 95ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9608: 800100 add byte ptr [rcx], 0 -;; 960b: aa stosb byte ptr [rdi], al -;; 960c: 800100 add byte ptr [rcx], 0 -;; 960f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9618: 800100 add byte ptr [rcx], 0 -;; 961b: aa stosb byte ptr [rdi], al -;; 961c: 800100 add byte ptr [rcx], 0 -;; 961f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9628: 800100 add byte ptr [rcx], 0 -;; 962b: aa stosb byte ptr [rdi], al -;; 962c: 800100 add byte ptr [rcx], 0 -;; 962f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9638: 800100 add byte ptr [rcx], 0 -;; 963b: aa stosb byte ptr [rdi], al -;; 963c: 800100 add byte ptr [rcx], 0 -;; 963f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9648: 800100 add byte ptr [rcx], 0 -;; 964b: aa stosb byte ptr [rdi], al -;; 964c: 800100 add byte ptr [rcx], 0 -;; 964f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9658: 800100 add byte ptr [rcx], 0 -;; 965b: aa stosb byte ptr [rdi], al -;; 965c: 800100 add byte ptr [rcx], 0 -;; 965f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9668: 800100 add byte ptr [rcx], 0 -;; 966b: aa stosb byte ptr [rdi], al -;; 966c: 800100 add byte ptr [rcx], 0 -;; 966f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9678: 800100 add byte ptr [rcx], 0 -;; 967b: aa stosb byte ptr [rdi], al -;; 967c: 800100 add byte ptr [rcx], 0 -;; 967f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9688: 800100 add byte ptr [rcx], 0 -;; 968b: aa stosb byte ptr [rdi], al -;; 968c: 800100 add byte ptr [rcx], 0 -;; 968f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9698: 800100 add byte ptr [rcx], 0 -;; 969b: aa stosb byte ptr [rdi], al -;; 969c: 800100 add byte ptr [rcx], 0 -;; 969f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 96a8: 800100 add byte ptr [rcx], 0 -;; 96ab: aa stosb byte ptr [rdi], al -;; 96ac: 800100 add byte ptr [rcx], 0 -;; 96af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 96b8: 800100 add byte ptr [rcx], 0 -;; 96bb: aa stosb byte ptr [rdi], al -;; 96bc: 800100 add byte ptr [rcx], 0 -;; 96bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 96c8: 800100 add byte ptr [rcx], 0 -;; 96cb: aa stosb byte ptr [rdi], al -;; 96cc: 800100 add byte ptr [rcx], 0 -;; 96cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 96d8: 800100 add byte ptr [rcx], 0 -;; 96db: aa stosb byte ptr [rdi], al -;; 96dc: 800100 add byte ptr [rcx], 0 -;; 96df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 96e8: 800100 add byte ptr [rcx], 0 -;; 96eb: aa stosb byte ptr [rdi], al -;; 96ec: 800100 add byte ptr [rcx], 0 -;; 96ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 96f8: 800100 add byte ptr [rcx], 0 -;; 96fb: aa stosb byte ptr [rdi], al -;; 96fc: 800100 add byte ptr [rcx], 0 -;; 96ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9708: 800100 add byte ptr [rcx], 0 -;; 970b: aa stosb byte ptr [rdi], al -;; 970c: 800100 add byte ptr [rcx], 0 -;; 970f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9718: 800100 add byte ptr [rcx], 0 -;; 971b: aa stosb byte ptr [rdi], al -;; 971c: 800100 add byte ptr [rcx], 0 -;; 971f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9728: 800100 add byte ptr [rcx], 0 -;; 972b: aa stosb byte ptr [rdi], al -;; 972c: 800100 add byte ptr [rcx], 0 -;; 972f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9738: 800100 add byte ptr [rcx], 0 -;; 973b: aa stosb byte ptr [rdi], al -;; 973c: 800100 add byte ptr [rcx], 0 -;; 973f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9748: 800100 add byte ptr [rcx], 0 -;; 974b: aa stosb byte ptr [rdi], al -;; 974c: 800100 add byte ptr [rcx], 0 -;; 974f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9758: 800100 add byte ptr [rcx], 0 -;; 975b: aa stosb byte ptr [rdi], al -;; 975c: 800100 add byte ptr [rcx], 0 -;; 975f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9768: 800100 add byte ptr [rcx], 0 -;; 976b: aa stosb byte ptr [rdi], al -;; 976c: 800100 add byte ptr [rcx], 0 -;; 976f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9778: 800100 add byte ptr [rcx], 0 -;; 977b: aa stosb byte ptr [rdi], al -;; 977c: 800100 add byte ptr [rcx], 0 -;; 977f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9788: 800100 add byte ptr [rcx], 0 -;; 978b: aa stosb byte ptr [rdi], al -;; 978c: 800100 add byte ptr [rcx], 0 -;; 978f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9798: 800100 add byte ptr [rcx], 0 -;; 979b: aa stosb byte ptr [rdi], al -;; 979c: 800100 add byte ptr [rcx], 0 -;; 979f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 97a8: 800100 add byte ptr [rcx], 0 -;; 97ab: aa stosb byte ptr [rdi], al -;; 97ac: 800100 add byte ptr [rcx], 0 -;; 97af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 97b8: 800100 add byte ptr [rcx], 0 -;; 97bb: aa stosb byte ptr [rdi], al -;; 97bc: 800100 add byte ptr [rcx], 0 -;; 97bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 97c8: 800100 add byte ptr [rcx], 0 -;; 97cb: aa stosb byte ptr [rdi], al -;; 97cc: 800100 add byte ptr [rcx], 0 -;; 97cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 97d8: 800100 add byte ptr [rcx], 0 -;; 97db: aa stosb byte ptr [rdi], al -;; 97dc: 800100 add byte ptr [rcx], 0 -;; 97df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 97e8: 800100 add byte ptr [rcx], 0 -;; 97eb: aa stosb byte ptr [rdi], al -;; 97ec: 800100 add byte ptr [rcx], 0 -;; 97ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 97f8: 800100 add byte ptr [rcx], 0 -;; 97fb: aa stosb byte ptr [rdi], al -;; 97fc: 800100 add byte ptr [rcx], 0 -;; 97ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9808: 800100 add byte ptr [rcx], 0 -;; 980b: aa stosb byte ptr [rdi], al -;; 980c: 800100 add byte ptr [rcx], 0 -;; 980f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9818: 800100 add byte ptr [rcx], 0 -;; 981b: aa stosb byte ptr [rdi], al -;; 981c: 800100 add byte ptr [rcx], 0 -;; 981f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9828: 800100 add byte ptr [rcx], 0 -;; 982b: aa stosb byte ptr [rdi], al -;; 982c: 800100 add byte ptr [rcx], 0 -;; 982f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9838: 800100 add byte ptr [rcx], 0 -;; 983b: aa stosb byte ptr [rdi], al -;; 983c: 800100 add byte ptr [rcx], 0 -;; 983f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9848: 800100 add byte ptr [rcx], 0 -;; 984b: aa stosb byte ptr [rdi], al -;; 984c: 800100 add byte ptr [rcx], 0 -;; 984f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9858: 800100 add byte ptr [rcx], 0 -;; 985b: aa stosb byte ptr [rdi], al -;; 985c: 800100 add byte ptr [rcx], 0 -;; 985f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9868: 800100 add byte ptr [rcx], 0 -;; 986b: aa stosb byte ptr [rdi], al -;; 986c: 800100 add byte ptr [rcx], 0 -;; 986f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9878: 800100 add byte ptr [rcx], 0 -;; 987b: aa stosb byte ptr [rdi], al -;; 987c: 800100 add byte ptr [rcx], 0 -;; 987f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9888: 800100 add byte ptr [rcx], 0 -;; 988b: aa stosb byte ptr [rdi], al -;; 988c: 800100 add byte ptr [rcx], 0 -;; 988f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9898: 800100 add byte ptr [rcx], 0 -;; 989b: aa stosb byte ptr [rdi], al -;; 989c: 800100 add byte ptr [rcx], 0 -;; 989f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 98a8: 800100 add byte ptr [rcx], 0 -;; 98ab: aa stosb byte ptr [rdi], al -;; 98ac: 800100 add byte ptr [rcx], 0 -;; 98af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 98b8: 800100 add byte ptr [rcx], 0 -;; 98bb: aa stosb byte ptr [rdi], al -;; 98bc: 800100 add byte ptr [rcx], 0 -;; 98bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 98c8: 800100 add byte ptr [rcx], 0 -;; 98cb: aa stosb byte ptr [rdi], al -;; 98cc: 800100 add byte ptr [rcx], 0 -;; 98cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 98d8: 800100 add byte ptr [rcx], 0 -;; 98db: aa stosb byte ptr [rdi], al -;; 98dc: 800100 add byte ptr [rcx], 0 -;; 98df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 98e8: 800100 add byte ptr [rcx], 0 -;; 98eb: aa stosb byte ptr [rdi], al -;; 98ec: 800100 add byte ptr [rcx], 0 -;; 98ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 98f8: 800100 add byte ptr [rcx], 0 -;; 98fb: aa stosb byte ptr [rdi], al -;; 98fc: 800100 add byte ptr [rcx], 0 -;; 98ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9908: 800100 add byte ptr [rcx], 0 -;; 990b: aa stosb byte ptr [rdi], al -;; 990c: 800100 add byte ptr [rcx], 0 -;; 990f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9918: 800100 add byte ptr [rcx], 0 -;; 991b: aa stosb byte ptr [rdi], al -;; 991c: 800100 add byte ptr [rcx], 0 -;; 991f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9928: 800100 add byte ptr [rcx], 0 -;; 992b: aa stosb byte ptr [rdi], al -;; 992c: 800100 add byte ptr [rcx], 0 -;; 992f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9938: 800100 add byte ptr [rcx], 0 -;; 993b: aa stosb byte ptr [rdi], al -;; 993c: 800100 add byte ptr [rcx], 0 -;; 993f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9948: 800100 add byte ptr [rcx], 0 -;; 994b: aa stosb byte ptr [rdi], al -;; 994c: 800100 add byte ptr [rcx], 0 -;; 994f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9958: 800100 add byte ptr [rcx], 0 -;; 995b: aa stosb byte ptr [rdi], al -;; 995c: 800100 add byte ptr [rcx], 0 -;; 995f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9968: 800100 add byte ptr [rcx], 0 -;; 996b: aa stosb byte ptr [rdi], al -;; 996c: 800100 add byte ptr [rcx], 0 -;; 996f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9978: 800100 add byte ptr [rcx], 0 -;; 997b: aa stosb byte ptr [rdi], al -;; 997c: 800100 add byte ptr [rcx], 0 -;; 997f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9988: 800100 add byte ptr [rcx], 0 -;; 998b: aa stosb byte ptr [rdi], al -;; 998c: 800100 add byte ptr [rcx], 0 -;; 998f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9998: 800100 add byte ptr [rcx], 0 -;; 999b: aa stosb byte ptr [rdi], al -;; 999c: 800100 add byte ptr [rcx], 0 -;; 999f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 99a8: 800100 add byte ptr [rcx], 0 -;; 99ab: aa stosb byte ptr [rdi], al -;; 99ac: 800100 add byte ptr [rcx], 0 -;; 99af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 99b8: 800100 add byte ptr [rcx], 0 -;; 99bb: aa stosb byte ptr [rdi], al -;; 99bc: 800100 add byte ptr [rcx], 0 -;; 99bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 99c8: 800100 add byte ptr [rcx], 0 -;; 99cb: aa stosb byte ptr [rdi], al -;; 99cc: 800100 add byte ptr [rcx], 0 -;; 99cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 99d8: 800100 add byte ptr [rcx], 0 -;; 99db: aa stosb byte ptr [rdi], al -;; 99dc: 800100 add byte ptr [rcx], 0 -;; 99df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 99e8: 800100 add byte ptr [rcx], 0 -;; 99eb: aa stosb byte ptr [rdi], al -;; 99ec: 800100 add byte ptr [rcx], 0 -;; 99ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 99f8: 800100 add byte ptr [rcx], 0 -;; 99fb: aa stosb byte ptr [rdi], al -;; 99fc: 800100 add byte ptr [rcx], 0 -;; 99ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9a08: 800100 add byte ptr [rcx], 0 -;; 9a0b: aa stosb byte ptr [rdi], al -;; 9a0c: 800100 add byte ptr [rcx], 0 -;; 9a0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9a18: 800100 add byte ptr [rcx], 0 -;; 9a1b: aa stosb byte ptr [rdi], al -;; 9a1c: 800100 add byte ptr [rcx], 0 -;; 9a1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9a28: 800100 add byte ptr [rcx], 0 -;; 9a2b: aa stosb byte ptr [rdi], al -;; 9a2c: 800100 add byte ptr [rcx], 0 -;; 9a2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9a38: 800100 add byte ptr [rcx], 0 -;; 9a3b: aa stosb byte ptr [rdi], al -;; 9a3c: 800100 add byte ptr [rcx], 0 -;; 9a3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9a48: 800100 add byte ptr [rcx], 0 -;; 9a4b: aa stosb byte ptr [rdi], al -;; 9a4c: 800100 add byte ptr [rcx], 0 -;; 9a4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9a58: 800100 add byte ptr [rcx], 0 -;; 9a5b: aa stosb byte ptr [rdi], al -;; 9a5c: 800100 add byte ptr [rcx], 0 -;; 9a5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9a68: 800100 add byte ptr [rcx], 0 -;; 9a6b: aa stosb byte ptr [rdi], al -;; 9a6c: 800100 add byte ptr [rcx], 0 -;; 9a6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9a78: 800100 add byte ptr [rcx], 0 -;; 9a7b: aa stosb byte ptr [rdi], al -;; 9a7c: 800100 add byte ptr [rcx], 0 -;; 9a7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9a88: 800100 add byte ptr [rcx], 0 -;; 9a8b: aa stosb byte ptr [rdi], al -;; 9a8c: 800100 add byte ptr [rcx], 0 -;; 9a8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9a98: 800100 add byte ptr [rcx], 0 -;; 9a9b: aa stosb byte ptr [rdi], al -;; 9a9c: 800100 add byte ptr [rcx], 0 -;; 9a9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9aa8: 800100 add byte ptr [rcx], 0 -;; 9aab: aa stosb byte ptr [rdi], al -;; 9aac: 800100 add byte ptr [rcx], 0 -;; 9aaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9ab8: 800100 add byte ptr [rcx], 0 -;; 9abb: aa stosb byte ptr [rdi], al -;; 9abc: 800100 add byte ptr [rcx], 0 -;; 9abf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9ac8: 800100 add byte ptr [rcx], 0 -;; 9acb: aa stosb byte ptr [rdi], al -;; 9acc: 800100 add byte ptr [rcx], 0 -;; 9acf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9ad8: 800100 add byte ptr [rcx], 0 -;; 9adb: aa stosb byte ptr [rdi], al -;; 9adc: 800100 add byte ptr [rcx], 0 -;; 9adf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9ae8: 800100 add byte ptr [rcx], 0 -;; 9aeb: aa stosb byte ptr [rdi], al -;; 9aec: 800100 add byte ptr [rcx], 0 -;; 9aef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9af8: 800100 add byte ptr [rcx], 0 -;; 9afb: aa stosb byte ptr [rdi], al -;; 9afc: 800100 add byte ptr [rcx], 0 -;; 9aff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9b08: 800100 add byte ptr [rcx], 0 -;; 9b0b: aa stosb byte ptr [rdi], al -;; 9b0c: 800100 add byte ptr [rcx], 0 -;; 9b0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9b18: 800100 add byte ptr [rcx], 0 -;; 9b1b: aa stosb byte ptr [rdi], al -;; 9b1c: 800100 add byte ptr [rcx], 0 -;; 9b1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9b28: 800100 add byte ptr [rcx], 0 -;; 9b2b: aa stosb byte ptr [rdi], al -;; 9b2c: 800100 add byte ptr [rcx], 0 -;; 9b2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9b38: 800100 add byte ptr [rcx], 0 -;; 9b3b: aa stosb byte ptr [rdi], al -;; 9b3c: 800100 add byte ptr [rcx], 0 -;; 9b3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9b48: 800100 add byte ptr [rcx], 0 -;; 9b4b: aa stosb byte ptr [rdi], al -;; 9b4c: 800100 add byte ptr [rcx], 0 -;; 9b4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9b58: 800100 add byte ptr [rcx], 0 -;; 9b5b: aa stosb byte ptr [rdi], al -;; 9b5c: 800100 add byte ptr [rcx], 0 -;; 9b5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9b68: 800100 add byte ptr [rcx], 0 -;; 9b6b: aa stosb byte ptr [rdi], al -;; 9b6c: 800100 add byte ptr [rcx], 0 -;; 9b6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9b78: 800100 add byte ptr [rcx], 0 -;; 9b7b: aa stosb byte ptr [rdi], al -;; 9b7c: 800100 add byte ptr [rcx], 0 -;; 9b7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9b88: 800100 add byte ptr [rcx], 0 -;; 9b8b: aa stosb byte ptr [rdi], al -;; 9b8c: 800100 add byte ptr [rcx], 0 -;; 9b8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9b98: 800100 add byte ptr [rcx], 0 -;; 9b9b: aa stosb byte ptr [rdi], al -;; 9b9c: 800100 add byte ptr [rcx], 0 -;; 9b9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9ba8: 800100 add byte ptr [rcx], 0 -;; 9bab: aa stosb byte ptr [rdi], al -;; 9bac: 800100 add byte ptr [rcx], 0 -;; 9baf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9bb8: 800100 add byte ptr [rcx], 0 -;; 9bbb: aa stosb byte ptr [rdi], al -;; 9bbc: 800100 add byte ptr [rcx], 0 -;; 9bbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9bc8: 800100 add byte ptr [rcx], 0 -;; 9bcb: aa stosb byte ptr [rdi], al -;; 9bcc: 800100 add byte ptr [rcx], 0 -;; 9bcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9bd8: 800100 add byte ptr [rcx], 0 -;; 9bdb: aa stosb byte ptr [rdi], al -;; 9bdc: 800100 add byte ptr [rcx], 0 -;; 9bdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9be8: 800100 add byte ptr [rcx], 0 -;; 9beb: aa stosb byte ptr [rdi], al -;; 9bec: 800100 add byte ptr [rcx], 0 -;; 9bef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9bf8: 800100 add byte ptr [rcx], 0 -;; 9bfb: aa stosb byte ptr [rdi], al -;; 9bfc: 800100 add byte ptr [rcx], 0 -;; 9bff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9c08: 800100 add byte ptr [rcx], 0 -;; 9c0b: aa stosb byte ptr [rdi], al -;; 9c0c: 800100 add byte ptr [rcx], 0 -;; 9c0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9c18: 800100 add byte ptr [rcx], 0 -;; 9c1b: aa stosb byte ptr [rdi], al -;; 9c1c: 800100 add byte ptr [rcx], 0 -;; 9c1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9c28: 800100 add byte ptr [rcx], 0 -;; 9c2b: aa stosb byte ptr [rdi], al -;; 9c2c: 800100 add byte ptr [rcx], 0 -;; 9c2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9c38: 800100 add byte ptr [rcx], 0 -;; 9c3b: aa stosb byte ptr [rdi], al -;; 9c3c: 800100 add byte ptr [rcx], 0 -;; 9c3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9c48: 800100 add byte ptr [rcx], 0 -;; 9c4b: aa stosb byte ptr [rdi], al -;; 9c4c: 800100 add byte ptr [rcx], 0 -;; 9c4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9c58: 800100 add byte ptr [rcx], 0 -;; 9c5b: aa stosb byte ptr [rdi], al -;; 9c5c: 800100 add byte ptr [rcx], 0 -;; 9c5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9c68: 800100 add byte ptr [rcx], 0 -;; 9c6b: aa stosb byte ptr [rdi], al -;; 9c6c: 800100 add byte ptr [rcx], 0 -;; 9c6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9c78: 800100 add byte ptr [rcx], 0 -;; 9c7b: aa stosb byte ptr [rdi], al -;; 9c7c: 800100 add byte ptr [rcx], 0 -;; 9c7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9c88: 800100 add byte ptr [rcx], 0 -;; 9c8b: aa stosb byte ptr [rdi], al -;; 9c8c: 800100 add byte ptr [rcx], 0 -;; 9c8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9c98: 800100 add byte ptr [rcx], 0 -;; 9c9b: aa stosb byte ptr [rdi], al -;; 9c9c: 800100 add byte ptr [rcx], 0 -;; 9c9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9ca8: 800100 add byte ptr [rcx], 0 -;; 9cab: aa stosb byte ptr [rdi], al -;; 9cac: 800100 add byte ptr [rcx], 0 -;; 9caf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9cb8: 800100 add byte ptr [rcx], 0 -;; 9cbb: aa stosb byte ptr [rdi], al -;; 9cbc: 800100 add byte ptr [rcx], 0 -;; 9cbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9cc8: 800100 add byte ptr [rcx], 0 -;; 9ccb: aa stosb byte ptr [rdi], al -;; 9ccc: 800100 add byte ptr [rcx], 0 -;; 9ccf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9cd8: 800100 add byte ptr [rcx], 0 -;; 9cdb: aa stosb byte ptr [rdi], al -;; 9cdc: 800100 add byte ptr [rcx], 0 -;; 9cdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9ce8: 800100 add byte ptr [rcx], 0 -;; 9ceb: aa stosb byte ptr [rdi], al -;; 9cec: 800100 add byte ptr [rcx], 0 -;; 9cef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9cf8: 800100 add byte ptr [rcx], 0 -;; 9cfb: aa stosb byte ptr [rdi], al -;; 9cfc: 800100 add byte ptr [rcx], 0 -;; 9cff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9d08: 800100 add byte ptr [rcx], 0 -;; 9d0b: aa stosb byte ptr [rdi], al -;; 9d0c: 800100 add byte ptr [rcx], 0 -;; 9d0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9d18: 800100 add byte ptr [rcx], 0 -;; 9d1b: aa stosb byte ptr [rdi], al -;; 9d1c: 800100 add byte ptr [rcx], 0 -;; 9d1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9d28: 800100 add byte ptr [rcx], 0 -;; 9d2b: aa stosb byte ptr [rdi], al -;; 9d2c: 800100 add byte ptr [rcx], 0 -;; 9d2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9d38: 800100 add byte ptr [rcx], 0 -;; 9d3b: aa stosb byte ptr [rdi], al -;; 9d3c: 800100 add byte ptr [rcx], 0 -;; 9d3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9d48: 800100 add byte ptr [rcx], 0 -;; 9d4b: aa stosb byte ptr [rdi], al -;; 9d4c: 800100 add byte ptr [rcx], 0 -;; 9d4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9d58: 800100 add byte ptr [rcx], 0 -;; 9d5b: aa stosb byte ptr [rdi], al -;; 9d5c: 800100 add byte ptr [rcx], 0 -;; 9d5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9d68: 800100 add byte ptr [rcx], 0 -;; 9d6b: aa stosb byte ptr [rdi], al -;; 9d6c: 800100 add byte ptr [rcx], 0 -;; 9d6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9d78: 800100 add byte ptr [rcx], 0 -;; 9d7b: aa stosb byte ptr [rdi], al -;; 9d7c: 800100 add byte ptr [rcx], 0 -;; 9d7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9d88: 800100 add byte ptr [rcx], 0 -;; 9d8b: aa stosb byte ptr [rdi], al -;; 9d8c: 800100 add byte ptr [rcx], 0 -;; 9d8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9d98: 800100 add byte ptr [rcx], 0 -;; 9d9b: aa stosb byte ptr [rdi], al -;; 9d9c: 800100 add byte ptr [rcx], 0 -;; 9d9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9da8: 800100 add byte ptr [rcx], 0 -;; 9dab: aa stosb byte ptr [rdi], al -;; 9dac: 800100 add byte ptr [rcx], 0 -;; 9daf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9db8: 800100 add byte ptr [rcx], 0 -;; 9dbb: aa stosb byte ptr [rdi], al -;; 9dbc: 800100 add byte ptr [rcx], 0 -;; 9dbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9dc8: 800100 add byte ptr [rcx], 0 -;; 9dcb: aa stosb byte ptr [rdi], al -;; 9dcc: 800100 add byte ptr [rcx], 0 -;; 9dcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9dd8: 800100 add byte ptr [rcx], 0 -;; 9ddb: aa stosb byte ptr [rdi], al -;; 9ddc: 800100 add byte ptr [rcx], 0 -;; 9ddf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9de8: 800100 add byte ptr [rcx], 0 -;; 9deb: aa stosb byte ptr [rdi], al -;; 9dec: 800100 add byte ptr [rcx], 0 -;; 9def: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9df8: 800100 add byte ptr [rcx], 0 -;; 9dfb: aa stosb byte ptr [rdi], al -;; 9dfc: 800100 add byte ptr [rcx], 0 -;; 9dff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9e08: 800100 add byte ptr [rcx], 0 -;; 9e0b: aa stosb byte ptr [rdi], al -;; 9e0c: 800100 add byte ptr [rcx], 0 -;; 9e0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9e18: 800100 add byte ptr [rcx], 0 -;; 9e1b: aa stosb byte ptr [rdi], al -;; 9e1c: 800100 add byte ptr [rcx], 0 -;; 9e1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9e28: 800100 add byte ptr [rcx], 0 -;; 9e2b: aa stosb byte ptr [rdi], al -;; 9e2c: 800100 add byte ptr [rcx], 0 -;; 9e2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9e38: 800100 add byte ptr [rcx], 0 -;; 9e3b: aa stosb byte ptr [rdi], al -;; 9e3c: 800100 add byte ptr [rcx], 0 -;; 9e3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9e48: 800100 add byte ptr [rcx], 0 -;; 9e4b: aa stosb byte ptr [rdi], al -;; 9e4c: 800100 add byte ptr [rcx], 0 -;; 9e4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9e58: 800100 add byte ptr [rcx], 0 -;; 9e5b: aa stosb byte ptr [rdi], al -;; 9e5c: 800100 add byte ptr [rcx], 0 -;; 9e5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9e68: 800100 add byte ptr [rcx], 0 -;; 9e6b: aa stosb byte ptr [rdi], al -;; 9e6c: 800100 add byte ptr [rcx], 0 -;; 9e6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9e78: 800100 add byte ptr [rcx], 0 -;; 9e7b: aa stosb byte ptr [rdi], al -;; 9e7c: 800100 add byte ptr [rcx], 0 -;; 9e7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9e88: 800100 add byte ptr [rcx], 0 -;; 9e8b: aa stosb byte ptr [rdi], al -;; 9e8c: 800100 add byte ptr [rcx], 0 -;; 9e8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9e98: 800100 add byte ptr [rcx], 0 -;; 9e9b: aa stosb byte ptr [rdi], al -;; 9e9c: 800100 add byte ptr [rcx], 0 -;; 9e9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9ea8: 800100 add byte ptr [rcx], 0 -;; 9eab: aa stosb byte ptr [rdi], al -;; 9eac: 800100 add byte ptr [rcx], 0 -;; 9eaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9eb8: 800100 add byte ptr [rcx], 0 -;; 9ebb: aa stosb byte ptr [rdi], al -;; 9ebc: 800100 add byte ptr [rcx], 0 -;; 9ebf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9ec8: 800100 add byte ptr [rcx], 0 -;; 9ecb: aa stosb byte ptr [rdi], al -;; 9ecc: 800100 add byte ptr [rcx], 0 -;; 9ecf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9ed8: 800100 add byte ptr [rcx], 0 -;; 9edb: aa stosb byte ptr [rdi], al -;; 9edc: 800100 add byte ptr [rcx], 0 -;; 9edf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9ee8: 800100 add byte ptr [rcx], 0 -;; 9eeb: aa stosb byte ptr [rdi], al -;; 9eec: 800100 add byte ptr [rcx], 0 -;; 9eef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9ef8: 800100 add byte ptr [rcx], 0 -;; 9efb: aa stosb byte ptr [rdi], al -;; 9efc: 800100 add byte ptr [rcx], 0 -;; 9eff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9f08: 800100 add byte ptr [rcx], 0 -;; 9f0b: aa stosb byte ptr [rdi], al -;; 9f0c: 800100 add byte ptr [rcx], 0 -;; 9f0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9f18: 800100 add byte ptr [rcx], 0 -;; 9f1b: aa stosb byte ptr [rdi], al -;; 9f1c: 800100 add byte ptr [rcx], 0 -;; 9f1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9f28: 800100 add byte ptr [rcx], 0 -;; 9f2b: aa stosb byte ptr [rdi], al -;; 9f2c: 800100 add byte ptr [rcx], 0 -;; 9f2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9f38: 800100 add byte ptr [rcx], 0 -;; 9f3b: aa stosb byte ptr [rdi], al -;; 9f3c: 800100 add byte ptr [rcx], 0 -;; 9f3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9f48: 800100 add byte ptr [rcx], 0 -;; 9f4b: aa stosb byte ptr [rdi], al -;; 9f4c: 800100 add byte ptr [rcx], 0 -;; 9f4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9f58: 800100 add byte ptr [rcx], 0 -;; 9f5b: aa stosb byte ptr [rdi], al -;; 9f5c: 800100 add byte ptr [rcx], 0 -;; 9f5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9f68: 800100 add byte ptr [rcx], 0 -;; 9f6b: aa stosb byte ptr [rdi], al -;; 9f6c: 800100 add byte ptr [rcx], 0 -;; 9f6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9f78: 800100 add byte ptr [rcx], 0 -;; 9f7b: aa stosb byte ptr [rdi], al -;; 9f7c: 800100 add byte ptr [rcx], 0 -;; 9f7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9f88: 800100 add byte ptr [rcx], 0 -;; 9f8b: aa stosb byte ptr [rdi], al -;; 9f8c: 800100 add byte ptr [rcx], 0 -;; 9f8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9f98: 800100 add byte ptr [rcx], 0 -;; 9f9b: aa stosb byte ptr [rdi], al -;; 9f9c: 800100 add byte ptr [rcx], 0 -;; 9f9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9fa8: 800100 add byte ptr [rcx], 0 -;; 9fab: aa stosb byte ptr [rdi], al -;; 9fac: 800100 add byte ptr [rcx], 0 -;; 9faf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9fb8: 800100 add byte ptr [rcx], 0 -;; 9fbb: aa stosb byte ptr [rdi], al -;; 9fbc: 800100 add byte ptr [rcx], 0 -;; 9fbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9fc8: 800100 add byte ptr [rcx], 0 -;; 9fcb: aa stosb byte ptr [rdi], al -;; 9fcc: 800100 add byte ptr [rcx], 0 -;; 9fcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9fd8: 800100 add byte ptr [rcx], 0 -;; 9fdb: aa stosb byte ptr [rdi], al -;; 9fdc: 800100 add byte ptr [rcx], 0 -;; 9fdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9fe8: 800100 add byte ptr [rcx], 0 -;; 9feb: aa stosb byte ptr [rdi], al -;; 9fec: 800100 add byte ptr [rcx], 0 -;; 9fef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 9ff8: 800100 add byte ptr [rcx], 0 -;; 9ffb: aa stosb byte ptr [rdi], al -;; 9ffc: 800100 add byte ptr [rcx], 0 -;; 9fff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a008: 800100 add byte ptr [rcx], 0 -;; a00b: aa stosb byte ptr [rdi], al -;; a00c: 800100 add byte ptr [rcx], 0 -;; a00f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a018: 800100 add byte ptr [rcx], 0 -;; a01b: aa stosb byte ptr [rdi], al -;; a01c: 800100 add byte ptr [rcx], 0 -;; a01f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a028: 800100 add byte ptr [rcx], 0 -;; a02b: aa stosb byte ptr [rdi], al -;; a02c: 800100 add byte ptr [rcx], 0 -;; a02f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a038: 800100 add byte ptr [rcx], 0 -;; a03b: aa stosb byte ptr [rdi], al -;; a03c: 800100 add byte ptr [rcx], 0 -;; a03f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a048: 800100 add byte ptr [rcx], 0 -;; a04b: aa stosb byte ptr [rdi], al -;; a04c: 800100 add byte ptr [rcx], 0 -;; a04f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a058: 800100 add byte ptr [rcx], 0 -;; a05b: aa stosb byte ptr [rdi], al -;; a05c: 800100 add byte ptr [rcx], 0 -;; a05f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a068: 800100 add byte ptr [rcx], 0 -;; a06b: aa stosb byte ptr [rdi], al -;; a06c: 800100 add byte ptr [rcx], 0 -;; a06f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a078: 800100 add byte ptr [rcx], 0 -;; a07b: aa stosb byte ptr [rdi], al -;; a07c: 800100 add byte ptr [rcx], 0 -;; a07f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a088: 800100 add byte ptr [rcx], 0 -;; a08b: aa stosb byte ptr [rdi], al -;; a08c: 800100 add byte ptr [rcx], 0 -;; a08f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a098: 800100 add byte ptr [rcx], 0 -;; a09b: aa stosb byte ptr [rdi], al -;; a09c: 800100 add byte ptr [rcx], 0 -;; a09f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a0a8: 800100 add byte ptr [rcx], 0 -;; a0ab: aa stosb byte ptr [rdi], al -;; a0ac: 800100 add byte ptr [rcx], 0 -;; a0af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a0b8: 800100 add byte ptr [rcx], 0 -;; a0bb: aa stosb byte ptr [rdi], al -;; a0bc: 800100 add byte ptr [rcx], 0 -;; a0bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a0c8: 800100 add byte ptr [rcx], 0 -;; a0cb: aa stosb byte ptr [rdi], al -;; a0cc: 800100 add byte ptr [rcx], 0 -;; a0cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a0d8: 800100 add byte ptr [rcx], 0 -;; a0db: aa stosb byte ptr [rdi], al -;; a0dc: 800100 add byte ptr [rcx], 0 -;; a0df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a0e8: 800100 add byte ptr [rcx], 0 -;; a0eb: aa stosb byte ptr [rdi], al -;; a0ec: 800100 add byte ptr [rcx], 0 -;; a0ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a0f8: 800100 add byte ptr [rcx], 0 -;; a0fb: aa stosb byte ptr [rdi], al -;; a0fc: 800100 add byte ptr [rcx], 0 -;; a0ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a108: 800100 add byte ptr [rcx], 0 -;; a10b: aa stosb byte ptr [rdi], al -;; a10c: 800100 add byte ptr [rcx], 0 -;; a10f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a118: 800100 add byte ptr [rcx], 0 -;; a11b: aa stosb byte ptr [rdi], al -;; a11c: 800100 add byte ptr [rcx], 0 -;; a11f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a128: 800100 add byte ptr [rcx], 0 -;; a12b: aa stosb byte ptr [rdi], al -;; a12c: 800100 add byte ptr [rcx], 0 -;; a12f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a138: 800100 add byte ptr [rcx], 0 -;; a13b: aa stosb byte ptr [rdi], al -;; a13c: 800100 add byte ptr [rcx], 0 -;; a13f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a148: 800100 add byte ptr [rcx], 0 -;; a14b: aa stosb byte ptr [rdi], al -;; a14c: 800100 add byte ptr [rcx], 0 -;; a14f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a158: 800100 add byte ptr [rcx], 0 -;; a15b: aa stosb byte ptr [rdi], al -;; a15c: 800100 add byte ptr [rcx], 0 -;; a15f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a168: 800100 add byte ptr [rcx], 0 -;; a16b: aa stosb byte ptr [rdi], al -;; a16c: 800100 add byte ptr [rcx], 0 -;; a16f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a178: 800100 add byte ptr [rcx], 0 -;; a17b: aa stosb byte ptr [rdi], al -;; a17c: 800100 add byte ptr [rcx], 0 -;; a17f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a188: 800100 add byte ptr [rcx], 0 -;; a18b: aa stosb byte ptr [rdi], al -;; a18c: 800100 add byte ptr [rcx], 0 -;; a18f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a198: 800100 add byte ptr [rcx], 0 -;; a19b: aa stosb byte ptr [rdi], al -;; a19c: 800100 add byte ptr [rcx], 0 -;; a19f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a1a8: 800100 add byte ptr [rcx], 0 -;; a1ab: aa stosb byte ptr [rdi], al -;; a1ac: 800100 add byte ptr [rcx], 0 -;; a1af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a1b8: 800100 add byte ptr [rcx], 0 -;; a1bb: aa stosb byte ptr [rdi], al -;; a1bc: 800100 add byte ptr [rcx], 0 -;; a1bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a1c8: 800100 add byte ptr [rcx], 0 -;; a1cb: aa stosb byte ptr [rdi], al -;; a1cc: 800100 add byte ptr [rcx], 0 -;; a1cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a1d8: 800100 add byte ptr [rcx], 0 -;; a1db: aa stosb byte ptr [rdi], al -;; a1dc: 800100 add byte ptr [rcx], 0 -;; a1df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a1e8: 800100 add byte ptr [rcx], 0 -;; a1eb: aa stosb byte ptr [rdi], al -;; a1ec: 800100 add byte ptr [rcx], 0 -;; a1ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a1f8: 800100 add byte ptr [rcx], 0 -;; a1fb: aa stosb byte ptr [rdi], al -;; a1fc: 800100 add byte ptr [rcx], 0 -;; a1ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a208: 800100 add byte ptr [rcx], 0 -;; a20b: aa stosb byte ptr [rdi], al -;; a20c: 800100 add byte ptr [rcx], 0 -;; a20f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a218: 800100 add byte ptr [rcx], 0 -;; a21b: aa stosb byte ptr [rdi], al -;; a21c: 800100 add byte ptr [rcx], 0 -;; a21f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a228: 800100 add byte ptr [rcx], 0 -;; a22b: aa stosb byte ptr [rdi], al -;; a22c: 800100 add byte ptr [rcx], 0 -;; a22f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a238: 800100 add byte ptr [rcx], 0 -;; a23b: aa stosb byte ptr [rdi], al -;; a23c: 800100 add byte ptr [rcx], 0 -;; a23f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a248: 800100 add byte ptr [rcx], 0 -;; a24b: aa stosb byte ptr [rdi], al -;; a24c: 800100 add byte ptr [rcx], 0 -;; a24f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a258: 800100 add byte ptr [rcx], 0 -;; a25b: aa stosb byte ptr [rdi], al -;; a25c: 800100 add byte ptr [rcx], 0 -;; a25f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a268: 800100 add byte ptr [rcx], 0 -;; a26b: aa stosb byte ptr [rdi], al -;; a26c: 800100 add byte ptr [rcx], 0 -;; a26f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a278: 800100 add byte ptr [rcx], 0 -;; a27b: aa stosb byte ptr [rdi], al -;; a27c: 800100 add byte ptr [rcx], 0 -;; a27f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a288: 800100 add byte ptr [rcx], 0 -;; a28b: aa stosb byte ptr [rdi], al -;; a28c: 800100 add byte ptr [rcx], 0 -;; a28f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a298: 800100 add byte ptr [rcx], 0 -;; a29b: aa stosb byte ptr [rdi], al -;; a29c: 800100 add byte ptr [rcx], 0 -;; a29f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a2a8: 800100 add byte ptr [rcx], 0 -;; a2ab: aa stosb byte ptr [rdi], al -;; a2ac: 800100 add byte ptr [rcx], 0 -;; a2af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a2b8: 800100 add byte ptr [rcx], 0 -;; a2bb: aa stosb byte ptr [rdi], al -;; a2bc: 800100 add byte ptr [rcx], 0 -;; a2bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a2c8: 800100 add byte ptr [rcx], 0 -;; a2cb: aa stosb byte ptr [rdi], al -;; a2cc: 800100 add byte ptr [rcx], 0 -;; a2cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a2d8: 800100 add byte ptr [rcx], 0 -;; a2db: aa stosb byte ptr [rdi], al -;; a2dc: 800100 add byte ptr [rcx], 0 -;; a2df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a2e8: 800100 add byte ptr [rcx], 0 -;; a2eb: aa stosb byte ptr [rdi], al -;; a2ec: 800100 add byte ptr [rcx], 0 -;; a2ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a2f8: 800100 add byte ptr [rcx], 0 -;; a2fb: aa stosb byte ptr [rdi], al -;; a2fc: 800100 add byte ptr [rcx], 0 -;; a2ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a308: 800100 add byte ptr [rcx], 0 -;; a30b: aa stosb byte ptr [rdi], al -;; a30c: 800100 add byte ptr [rcx], 0 -;; a30f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a318: 800100 add byte ptr [rcx], 0 -;; a31b: aa stosb byte ptr [rdi], al -;; a31c: 800100 add byte ptr [rcx], 0 -;; a31f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a328: 800100 add byte ptr [rcx], 0 -;; a32b: aa stosb byte ptr [rdi], al -;; a32c: 800100 add byte ptr [rcx], 0 -;; a32f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a338: 800100 add byte ptr [rcx], 0 -;; a33b: aa stosb byte ptr [rdi], al -;; a33c: 800100 add byte ptr [rcx], 0 -;; a33f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a348: 800100 add byte ptr [rcx], 0 -;; a34b: aa stosb byte ptr [rdi], al -;; a34c: 800100 add byte ptr [rcx], 0 -;; a34f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a358: 800100 add byte ptr [rcx], 0 -;; a35b: aa stosb byte ptr [rdi], al -;; a35c: 800100 add byte ptr [rcx], 0 -;; a35f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a368: 800100 add byte ptr [rcx], 0 -;; a36b: aa stosb byte ptr [rdi], al -;; a36c: 800100 add byte ptr [rcx], 0 -;; a36f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a378: 800100 add byte ptr [rcx], 0 -;; a37b: aa stosb byte ptr [rdi], al -;; a37c: 800100 add byte ptr [rcx], 0 -;; a37f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a388: 800100 add byte ptr [rcx], 0 -;; a38b: aa stosb byte ptr [rdi], al -;; a38c: 800100 add byte ptr [rcx], 0 -;; a38f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a398: 800100 add byte ptr [rcx], 0 -;; a39b: aa stosb byte ptr [rdi], al -;; a39c: 800100 add byte ptr [rcx], 0 -;; a39f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a3a8: 800100 add byte ptr [rcx], 0 -;; a3ab: aa stosb byte ptr [rdi], al -;; a3ac: 800100 add byte ptr [rcx], 0 -;; a3af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a3b8: 800100 add byte ptr [rcx], 0 -;; a3bb: aa stosb byte ptr [rdi], al -;; a3bc: 800100 add byte ptr [rcx], 0 -;; a3bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a3c8: 800100 add byte ptr [rcx], 0 -;; a3cb: aa stosb byte ptr [rdi], al -;; a3cc: 800100 add byte ptr [rcx], 0 -;; a3cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a3d8: 800100 add byte ptr [rcx], 0 -;; a3db: aa stosb byte ptr [rdi], al -;; a3dc: 800100 add byte ptr [rcx], 0 -;; a3df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a3e8: 800100 add byte ptr [rcx], 0 -;; a3eb: aa stosb byte ptr [rdi], al -;; a3ec: 800100 add byte ptr [rcx], 0 -;; a3ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a3f8: 800100 add byte ptr [rcx], 0 -;; a3fb: aa stosb byte ptr [rdi], al -;; a3fc: 800100 add byte ptr [rcx], 0 -;; a3ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a408: 800100 add byte ptr [rcx], 0 -;; a40b: aa stosb byte ptr [rdi], al -;; a40c: 800100 add byte ptr [rcx], 0 -;; a40f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a418: 800100 add byte ptr [rcx], 0 -;; a41b: aa stosb byte ptr [rdi], al -;; a41c: 800100 add byte ptr [rcx], 0 -;; a41f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a428: 800100 add byte ptr [rcx], 0 -;; a42b: aa stosb byte ptr [rdi], al -;; a42c: 800100 add byte ptr [rcx], 0 -;; a42f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a438: 800100 add byte ptr [rcx], 0 -;; a43b: aa stosb byte ptr [rdi], al -;; a43c: 800100 add byte ptr [rcx], 0 -;; a43f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a448: 800100 add byte ptr [rcx], 0 -;; a44b: aa stosb byte ptr [rdi], al -;; a44c: 800100 add byte ptr [rcx], 0 -;; a44f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a458: 800100 add byte ptr [rcx], 0 -;; a45b: aa stosb byte ptr [rdi], al -;; a45c: 800100 add byte ptr [rcx], 0 -;; a45f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a468: 800100 add byte ptr [rcx], 0 -;; a46b: aa stosb byte ptr [rdi], al -;; a46c: 800100 add byte ptr [rcx], 0 -;; a46f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a478: 800100 add byte ptr [rcx], 0 -;; a47b: aa stosb byte ptr [rdi], al -;; a47c: 800100 add byte ptr [rcx], 0 -;; a47f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a488: 800100 add byte ptr [rcx], 0 -;; a48b: aa stosb byte ptr [rdi], al -;; a48c: 800100 add byte ptr [rcx], 0 -;; a48f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a498: 800100 add byte ptr [rcx], 0 -;; a49b: aa stosb byte ptr [rdi], al -;; a49c: 800100 add byte ptr [rcx], 0 -;; a49f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a4a8: 800100 add byte ptr [rcx], 0 -;; a4ab: aa stosb byte ptr [rdi], al -;; a4ac: 800100 add byte ptr [rcx], 0 -;; a4af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a4b8: 800100 add byte ptr [rcx], 0 -;; a4bb: aa stosb byte ptr [rdi], al -;; a4bc: 800100 add byte ptr [rcx], 0 -;; a4bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a4c8: 800100 add byte ptr [rcx], 0 -;; a4cb: aa stosb byte ptr [rdi], al -;; a4cc: 800100 add byte ptr [rcx], 0 -;; a4cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a4d8: 800100 add byte ptr [rcx], 0 -;; a4db: aa stosb byte ptr [rdi], al -;; a4dc: 800100 add byte ptr [rcx], 0 -;; a4df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a4e8: 800100 add byte ptr [rcx], 0 -;; a4eb: aa stosb byte ptr [rdi], al -;; a4ec: 800100 add byte ptr [rcx], 0 -;; a4ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a4f8: 800100 add byte ptr [rcx], 0 -;; a4fb: aa stosb byte ptr [rdi], al -;; a4fc: 800100 add byte ptr [rcx], 0 -;; a4ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a508: 800100 add byte ptr [rcx], 0 -;; a50b: aa stosb byte ptr [rdi], al -;; a50c: 800100 add byte ptr [rcx], 0 -;; a50f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a518: 800100 add byte ptr [rcx], 0 -;; a51b: aa stosb byte ptr [rdi], al -;; a51c: 800100 add byte ptr [rcx], 0 -;; a51f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a528: 800100 add byte ptr [rcx], 0 -;; a52b: aa stosb byte ptr [rdi], al -;; a52c: 800100 add byte ptr [rcx], 0 -;; a52f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a538: 800100 add byte ptr [rcx], 0 -;; a53b: aa stosb byte ptr [rdi], al -;; a53c: 800100 add byte ptr [rcx], 0 -;; a53f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a548: 800100 add byte ptr [rcx], 0 -;; a54b: aa stosb byte ptr [rdi], al -;; a54c: 800100 add byte ptr [rcx], 0 -;; a54f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a558: 800100 add byte ptr [rcx], 0 -;; a55b: aa stosb byte ptr [rdi], al -;; a55c: 800100 add byte ptr [rcx], 0 -;; a55f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a568: 800100 add byte ptr [rcx], 0 -;; a56b: aa stosb byte ptr [rdi], al -;; a56c: 800100 add byte ptr [rcx], 0 -;; a56f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a578: 800100 add byte ptr [rcx], 0 -;; a57b: aa stosb byte ptr [rdi], al -;; a57c: 800100 add byte ptr [rcx], 0 -;; a57f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a588: 800100 add byte ptr [rcx], 0 -;; a58b: aa stosb byte ptr [rdi], al -;; a58c: 800100 add byte ptr [rcx], 0 -;; a58f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a598: 800100 add byte ptr [rcx], 0 -;; a59b: aa stosb byte ptr [rdi], al -;; a59c: 800100 add byte ptr [rcx], 0 -;; a59f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a5a8: 800100 add byte ptr [rcx], 0 -;; a5ab: aa stosb byte ptr [rdi], al -;; a5ac: 800100 add byte ptr [rcx], 0 -;; a5af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a5b8: 800100 add byte ptr [rcx], 0 -;; a5bb: aa stosb byte ptr [rdi], al -;; a5bc: 800100 add byte ptr [rcx], 0 -;; a5bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a5c8: 800100 add byte ptr [rcx], 0 -;; a5cb: aa stosb byte ptr [rdi], al -;; a5cc: 800100 add byte ptr [rcx], 0 -;; a5cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a5d8: 800100 add byte ptr [rcx], 0 -;; a5db: aa stosb byte ptr [rdi], al -;; a5dc: 800100 add byte ptr [rcx], 0 -;; a5df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a5e8: 800100 add byte ptr [rcx], 0 -;; a5eb: aa stosb byte ptr [rdi], al -;; a5ec: 800100 add byte ptr [rcx], 0 -;; a5ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a5f8: 800100 add byte ptr [rcx], 0 -;; a5fb: aa stosb byte ptr [rdi], al -;; a5fc: 800100 add byte ptr [rcx], 0 -;; a5ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a608: 800100 add byte ptr [rcx], 0 -;; a60b: aa stosb byte ptr [rdi], al -;; a60c: 800100 add byte ptr [rcx], 0 -;; a60f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a618: 800100 add byte ptr [rcx], 0 -;; a61b: aa stosb byte ptr [rdi], al -;; a61c: 800100 add byte ptr [rcx], 0 -;; a61f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a628: 800100 add byte ptr [rcx], 0 -;; a62b: aa stosb byte ptr [rdi], al -;; a62c: 800100 add byte ptr [rcx], 0 -;; a62f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a638: 800100 add byte ptr [rcx], 0 -;; a63b: aa stosb byte ptr [rdi], al -;; a63c: 800100 add byte ptr [rcx], 0 -;; a63f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a648: 800100 add byte ptr [rcx], 0 -;; a64b: aa stosb byte ptr [rdi], al -;; a64c: 800100 add byte ptr [rcx], 0 -;; a64f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a658: 800100 add byte ptr [rcx], 0 -;; a65b: aa stosb byte ptr [rdi], al -;; a65c: 800100 add byte ptr [rcx], 0 -;; a65f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a668: 800100 add byte ptr [rcx], 0 -;; a66b: aa stosb byte ptr [rdi], al -;; a66c: 800100 add byte ptr [rcx], 0 -;; a66f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a678: 800100 add byte ptr [rcx], 0 -;; a67b: aa stosb byte ptr [rdi], al -;; a67c: 800100 add byte ptr [rcx], 0 -;; a67f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a688: 800100 add byte ptr [rcx], 0 -;; a68b: aa stosb byte ptr [rdi], al -;; a68c: 800100 add byte ptr [rcx], 0 -;; a68f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a698: 800100 add byte ptr [rcx], 0 -;; a69b: aa stosb byte ptr [rdi], al -;; a69c: 800100 add byte ptr [rcx], 0 -;; a69f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a6a8: 800100 add byte ptr [rcx], 0 -;; a6ab: aa stosb byte ptr [rdi], al -;; a6ac: 800100 add byte ptr [rcx], 0 -;; a6af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a6b8: 800100 add byte ptr [rcx], 0 -;; a6bb: aa stosb byte ptr [rdi], al -;; a6bc: 800100 add byte ptr [rcx], 0 -;; a6bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a6c8: 800100 add byte ptr [rcx], 0 -;; a6cb: aa stosb byte ptr [rdi], al -;; a6cc: 800100 add byte ptr [rcx], 0 -;; a6cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a6d8: 800100 add byte ptr [rcx], 0 -;; a6db: aa stosb byte ptr [rdi], al -;; a6dc: 800100 add byte ptr [rcx], 0 -;; a6df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a6e8: 800100 add byte ptr [rcx], 0 -;; a6eb: aa stosb byte ptr [rdi], al -;; a6ec: 800100 add byte ptr [rcx], 0 -;; a6ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a6f8: 800100 add byte ptr [rcx], 0 -;; a6fb: aa stosb byte ptr [rdi], al -;; a6fc: 800100 add byte ptr [rcx], 0 -;; a6ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a708: 800100 add byte ptr [rcx], 0 -;; a70b: aa stosb byte ptr [rdi], al -;; a70c: 800100 add byte ptr [rcx], 0 -;; a70f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a718: 800100 add byte ptr [rcx], 0 -;; a71b: aa stosb byte ptr [rdi], al -;; a71c: 800100 add byte ptr [rcx], 0 -;; a71f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a728: 800100 add byte ptr [rcx], 0 -;; a72b: aa stosb byte ptr [rdi], al -;; a72c: 800100 add byte ptr [rcx], 0 -;; a72f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a738: 800100 add byte ptr [rcx], 0 -;; a73b: aa stosb byte ptr [rdi], al -;; a73c: 800100 add byte ptr [rcx], 0 -;; a73f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a748: 800100 add byte ptr [rcx], 0 -;; a74b: aa stosb byte ptr [rdi], al -;; a74c: 800100 add byte ptr [rcx], 0 -;; a74f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a758: 800100 add byte ptr [rcx], 0 -;; a75b: aa stosb byte ptr [rdi], al -;; a75c: 800100 add byte ptr [rcx], 0 -;; a75f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a768: 800100 add byte ptr [rcx], 0 -;; a76b: aa stosb byte ptr [rdi], al -;; a76c: 800100 add byte ptr [rcx], 0 -;; a76f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a778: 800100 add byte ptr [rcx], 0 -;; a77b: aa stosb byte ptr [rdi], al -;; a77c: 800100 add byte ptr [rcx], 0 -;; a77f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a788: 800100 add byte ptr [rcx], 0 -;; a78b: aa stosb byte ptr [rdi], al -;; a78c: 800100 add byte ptr [rcx], 0 -;; a78f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a798: 800100 add byte ptr [rcx], 0 -;; a79b: aa stosb byte ptr [rdi], al -;; a79c: 800100 add byte ptr [rcx], 0 -;; a79f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a7a8: 800100 add byte ptr [rcx], 0 -;; a7ab: aa stosb byte ptr [rdi], al -;; a7ac: 800100 add byte ptr [rcx], 0 -;; a7af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a7b8: 800100 add byte ptr [rcx], 0 -;; a7bb: aa stosb byte ptr [rdi], al -;; a7bc: 800100 add byte ptr [rcx], 0 -;; a7bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a7c8: 800100 add byte ptr [rcx], 0 -;; a7cb: aa stosb byte ptr [rdi], al -;; a7cc: 800100 add byte ptr [rcx], 0 -;; a7cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a7d8: 800100 add byte ptr [rcx], 0 -;; a7db: aa stosb byte ptr [rdi], al -;; a7dc: 800100 add byte ptr [rcx], 0 -;; a7df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a7e8: 800100 add byte ptr [rcx], 0 -;; a7eb: aa stosb byte ptr [rdi], al -;; a7ec: 800100 add byte ptr [rcx], 0 -;; a7ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a7f8: 800100 add byte ptr [rcx], 0 -;; a7fb: aa stosb byte ptr [rdi], al -;; a7fc: 800100 add byte ptr [rcx], 0 -;; a7ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a808: 800100 add byte ptr [rcx], 0 -;; a80b: aa stosb byte ptr [rdi], al -;; a80c: 800100 add byte ptr [rcx], 0 -;; a80f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a818: 800100 add byte ptr [rcx], 0 -;; a81b: aa stosb byte ptr [rdi], al -;; a81c: 800100 add byte ptr [rcx], 0 -;; a81f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a828: 800100 add byte ptr [rcx], 0 -;; a82b: aa stosb byte ptr [rdi], al -;; a82c: 800100 add byte ptr [rcx], 0 -;; a82f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a838: 800100 add byte ptr [rcx], 0 -;; a83b: aa stosb byte ptr [rdi], al -;; a83c: 800100 add byte ptr [rcx], 0 -;; a83f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a848: 800100 add byte ptr [rcx], 0 -;; a84b: aa stosb byte ptr [rdi], al -;; a84c: 800100 add byte ptr [rcx], 0 -;; a84f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a858: 800100 add byte ptr [rcx], 0 -;; a85b: aa stosb byte ptr [rdi], al -;; a85c: 800100 add byte ptr [rcx], 0 -;; a85f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a868: 800100 add byte ptr [rcx], 0 -;; a86b: aa stosb byte ptr [rdi], al -;; a86c: 800100 add byte ptr [rcx], 0 -;; a86f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a878: 800100 add byte ptr [rcx], 0 -;; a87b: aa stosb byte ptr [rdi], al -;; a87c: 800100 add byte ptr [rcx], 0 -;; a87f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a888: 800100 add byte ptr [rcx], 0 -;; a88b: aa stosb byte ptr [rdi], al -;; a88c: 800100 add byte ptr [rcx], 0 -;; a88f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a898: 800100 add byte ptr [rcx], 0 -;; a89b: aa stosb byte ptr [rdi], al -;; a89c: 800100 add byte ptr [rcx], 0 -;; a89f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a8a8: 800100 add byte ptr [rcx], 0 -;; a8ab: aa stosb byte ptr [rdi], al -;; a8ac: 800100 add byte ptr [rcx], 0 -;; a8af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a8b8: 800100 add byte ptr [rcx], 0 -;; a8bb: aa stosb byte ptr [rdi], al -;; a8bc: 800100 add byte ptr [rcx], 0 -;; a8bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a8c8: 800100 add byte ptr [rcx], 0 -;; a8cb: aa stosb byte ptr [rdi], al -;; a8cc: 800100 add byte ptr [rcx], 0 -;; a8cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a8d8: 800100 add byte ptr [rcx], 0 -;; a8db: aa stosb byte ptr [rdi], al -;; a8dc: 800100 add byte ptr [rcx], 0 -;; a8df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a8e8: 800100 add byte ptr [rcx], 0 -;; a8eb: aa stosb byte ptr [rdi], al -;; a8ec: 800100 add byte ptr [rcx], 0 -;; a8ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a8f8: 800100 add byte ptr [rcx], 0 -;; a8fb: aa stosb byte ptr [rdi], al -;; a8fc: 800100 add byte ptr [rcx], 0 -;; a8ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a908: 800100 add byte ptr [rcx], 0 -;; a90b: aa stosb byte ptr [rdi], al -;; a90c: 800100 add byte ptr [rcx], 0 -;; a90f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a918: 800100 add byte ptr [rcx], 0 -;; a91b: aa stosb byte ptr [rdi], al -;; a91c: 800100 add byte ptr [rcx], 0 -;; a91f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a928: 800100 add byte ptr [rcx], 0 -;; a92b: aa stosb byte ptr [rdi], al -;; a92c: 800100 add byte ptr [rcx], 0 -;; a92f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a938: 800100 add byte ptr [rcx], 0 -;; a93b: aa stosb byte ptr [rdi], al -;; a93c: 800100 add byte ptr [rcx], 0 -;; a93f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a948: 800100 add byte ptr [rcx], 0 -;; a94b: aa stosb byte ptr [rdi], al -;; a94c: 800100 add byte ptr [rcx], 0 -;; a94f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a958: 800100 add byte ptr [rcx], 0 -;; a95b: aa stosb byte ptr [rdi], al -;; a95c: 800100 add byte ptr [rcx], 0 -;; a95f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a968: 800100 add byte ptr [rcx], 0 -;; a96b: aa stosb byte ptr [rdi], al -;; a96c: 800100 add byte ptr [rcx], 0 -;; a96f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a978: 800100 add byte ptr [rcx], 0 -;; a97b: aa stosb byte ptr [rdi], al -;; a97c: 800100 add byte ptr [rcx], 0 -;; a97f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a988: 800100 add byte ptr [rcx], 0 -;; a98b: aa stosb byte ptr [rdi], al -;; a98c: 800100 add byte ptr [rcx], 0 -;; a98f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a998: 800100 add byte ptr [rcx], 0 -;; a99b: aa stosb byte ptr [rdi], al -;; a99c: 800100 add byte ptr [rcx], 0 -;; a99f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a9a8: 800100 add byte ptr [rcx], 0 -;; a9ab: aa stosb byte ptr [rdi], al -;; a9ac: 800100 add byte ptr [rcx], 0 -;; a9af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a9b8: 800100 add byte ptr [rcx], 0 -;; a9bb: aa stosb byte ptr [rdi], al -;; a9bc: 800100 add byte ptr [rcx], 0 -;; a9bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a9c8: 800100 add byte ptr [rcx], 0 -;; a9cb: aa stosb byte ptr [rdi], al -;; a9cc: 800100 add byte ptr [rcx], 0 -;; a9cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a9d8: 800100 add byte ptr [rcx], 0 -;; a9db: aa stosb byte ptr [rdi], al -;; a9dc: 800100 add byte ptr [rcx], 0 -;; a9df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a9e8: 800100 add byte ptr [rcx], 0 -;; a9eb: aa stosb byte ptr [rdi], al -;; a9ec: 800100 add byte ptr [rcx], 0 -;; a9ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; a9f8: 800100 add byte ptr [rcx], 0 -;; a9fb: aa stosb byte ptr [rdi], al -;; a9fc: 800100 add byte ptr [rcx], 0 -;; a9ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; aa08: 800100 add byte ptr [rcx], 0 -;; aa0b: aa stosb byte ptr [rdi], al -;; aa0c: 800100 add byte ptr [rcx], 0 -;; aa0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; aa18: 800100 add byte ptr [rcx], 0 -;; aa1b: aa stosb byte ptr [rdi], al -;; aa1c: 800100 add byte ptr [rcx], 0 -;; aa1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; aa28: 800100 add byte ptr [rcx], 0 -;; aa2b: aa stosb byte ptr [rdi], al -;; aa2c: 800100 add byte ptr [rcx], 0 -;; aa2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; aa38: 800100 add byte ptr [rcx], 0 -;; aa3b: aa stosb byte ptr [rdi], al -;; aa3c: 800100 add byte ptr [rcx], 0 -;; aa3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; aa48: 800100 add byte ptr [rcx], 0 -;; aa4b: aa stosb byte ptr [rdi], al -;; aa4c: 800100 add byte ptr [rcx], 0 -;; aa4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; aa58: 800100 add byte ptr [rcx], 0 -;; aa5b: aa stosb byte ptr [rdi], al -;; aa5c: 800100 add byte ptr [rcx], 0 -;; aa5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; aa68: 800100 add byte ptr [rcx], 0 -;; aa6b: aa stosb byte ptr [rdi], al -;; aa6c: 800100 add byte ptr [rcx], 0 -;; aa6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; aa78: 800100 add byte ptr [rcx], 0 -;; aa7b: aa stosb byte ptr [rdi], al -;; aa7c: 800100 add byte ptr [rcx], 0 -;; aa7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; aa88: 800100 add byte ptr [rcx], 0 -;; aa8b: aa stosb byte ptr [rdi], al -;; aa8c: 800100 add byte ptr [rcx], 0 -;; aa8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; aa98: 800100 add byte ptr [rcx], 0 -;; aa9b: aa stosb byte ptr [rdi], al -;; aa9c: 800100 add byte ptr [rcx], 0 -;; aa9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; aaa8: 800100 add byte ptr [rcx], 0 -;; aaab: aa stosb byte ptr [rdi], al -;; aaac: 800100 add byte ptr [rcx], 0 -;; aaaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; aab8: 800100 add byte ptr [rcx], 0 -;; aabb: aa stosb byte ptr [rdi], al -;; aabc: 800100 add byte ptr [rcx], 0 -;; aabf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; aac8: 800100 add byte ptr [rcx], 0 -;; aacb: aa stosb byte ptr [rdi], al -;; aacc: 800100 add byte ptr [rcx], 0 -;; aacf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; aad8: 800100 add byte ptr [rcx], 0 -;; aadb: aa stosb byte ptr [rdi], al -;; aadc: 800100 add byte ptr [rcx], 0 -;; aadf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; aae8: 800100 add byte ptr [rcx], 0 -;; aaeb: aa stosb byte ptr [rdi], al -;; aaec: 800100 add byte ptr [rcx], 0 -;; aaef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; aaf8: 800100 add byte ptr [rcx], 0 -;; aafb: aa stosb byte ptr [rdi], al -;; aafc: 800100 add byte ptr [rcx], 0 -;; aaff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ab08: 800100 add byte ptr [rcx], 0 -;; ab0b: aa stosb byte ptr [rdi], al -;; ab0c: 800100 add byte ptr [rcx], 0 -;; ab0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ab18: 800100 add byte ptr [rcx], 0 -;; ab1b: aa stosb byte ptr [rdi], al -;; ab1c: 800100 add byte ptr [rcx], 0 -;; ab1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ab28: 800100 add byte ptr [rcx], 0 -;; ab2b: aa stosb byte ptr [rdi], al -;; ab2c: 800100 add byte ptr [rcx], 0 -;; ab2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ab38: 800100 add byte ptr [rcx], 0 -;; ab3b: aa stosb byte ptr [rdi], al -;; ab3c: 800100 add byte ptr [rcx], 0 -;; ab3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ab48: 800100 add byte ptr [rcx], 0 -;; ab4b: aa stosb byte ptr [rdi], al -;; ab4c: 800100 add byte ptr [rcx], 0 -;; ab4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ab58: 800100 add byte ptr [rcx], 0 -;; ab5b: aa stosb byte ptr [rdi], al -;; ab5c: 800100 add byte ptr [rcx], 0 -;; ab5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ab68: 800100 add byte ptr [rcx], 0 -;; ab6b: aa stosb byte ptr [rdi], al -;; ab6c: 800100 add byte ptr [rcx], 0 -;; ab6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ab78: 800100 add byte ptr [rcx], 0 -;; ab7b: aa stosb byte ptr [rdi], al -;; ab7c: 800100 add byte ptr [rcx], 0 -;; ab7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ab88: 800100 add byte ptr [rcx], 0 -;; ab8b: aa stosb byte ptr [rdi], al -;; ab8c: 800100 add byte ptr [rcx], 0 -;; ab8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ab98: 800100 add byte ptr [rcx], 0 -;; ab9b: aa stosb byte ptr [rdi], al -;; ab9c: 800100 add byte ptr [rcx], 0 -;; ab9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; aba8: 800100 add byte ptr [rcx], 0 -;; abab: aa stosb byte ptr [rdi], al -;; abac: 800100 add byte ptr [rcx], 0 -;; abaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; abb8: 800100 add byte ptr [rcx], 0 -;; abbb: aa stosb byte ptr [rdi], al -;; abbc: 800100 add byte ptr [rcx], 0 -;; abbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; abc8: 800100 add byte ptr [rcx], 0 -;; abcb: aa stosb byte ptr [rdi], al -;; abcc: 800100 add byte ptr [rcx], 0 -;; abcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; abd8: 800100 add byte ptr [rcx], 0 -;; abdb: aa stosb byte ptr [rdi], al -;; abdc: 800100 add byte ptr [rcx], 0 -;; abdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; abe8: 800100 add byte ptr [rcx], 0 -;; abeb: aa stosb byte ptr [rdi], al -;; abec: 800100 add byte ptr [rcx], 0 -;; abef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; abf8: 800100 add byte ptr [rcx], 0 -;; abfb: aa stosb byte ptr [rdi], al -;; abfc: 800100 add byte ptr [rcx], 0 -;; abff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ac08: 800100 add byte ptr [rcx], 0 -;; ac0b: aa stosb byte ptr [rdi], al -;; ac0c: 800100 add byte ptr [rcx], 0 -;; ac0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ac18: 800100 add byte ptr [rcx], 0 -;; ac1b: aa stosb byte ptr [rdi], al -;; ac1c: 800100 add byte ptr [rcx], 0 -;; ac1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ac28: 800100 add byte ptr [rcx], 0 -;; ac2b: aa stosb byte ptr [rdi], al -;; ac2c: 800100 add byte ptr [rcx], 0 -;; ac2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ac38: 800100 add byte ptr [rcx], 0 -;; ac3b: aa stosb byte ptr [rdi], al -;; ac3c: 800100 add byte ptr [rcx], 0 -;; ac3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ac48: 800100 add byte ptr [rcx], 0 -;; ac4b: aa stosb byte ptr [rdi], al -;; ac4c: 800100 add byte ptr [rcx], 0 -;; ac4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ac58: 800100 add byte ptr [rcx], 0 -;; ac5b: aa stosb byte ptr [rdi], al -;; ac5c: 800100 add byte ptr [rcx], 0 -;; ac5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ac68: 800100 add byte ptr [rcx], 0 -;; ac6b: aa stosb byte ptr [rdi], al -;; ac6c: 800100 add byte ptr [rcx], 0 -;; ac6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ac78: 800100 add byte ptr [rcx], 0 -;; ac7b: aa stosb byte ptr [rdi], al -;; ac7c: 800100 add byte ptr [rcx], 0 -;; ac7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ac88: 800100 add byte ptr [rcx], 0 -;; ac8b: aa stosb byte ptr [rdi], al -;; ac8c: 800100 add byte ptr [rcx], 0 -;; ac8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ac98: 800100 add byte ptr [rcx], 0 -;; ac9b: aa stosb byte ptr [rdi], al -;; ac9c: 800100 add byte ptr [rcx], 0 -;; ac9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; aca8: 800100 add byte ptr [rcx], 0 -;; acab: aa stosb byte ptr [rdi], al -;; acac: 800100 add byte ptr [rcx], 0 -;; acaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; acb8: 800100 add byte ptr [rcx], 0 -;; acbb: aa stosb byte ptr [rdi], al -;; acbc: 800100 add byte ptr [rcx], 0 -;; acbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; acc8: 800100 add byte ptr [rcx], 0 -;; accb: aa stosb byte ptr [rdi], al -;; accc: 800100 add byte ptr [rcx], 0 -;; accf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; acd8: 800100 add byte ptr [rcx], 0 -;; acdb: aa stosb byte ptr [rdi], al -;; acdc: 800100 add byte ptr [rcx], 0 -;; acdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ace8: 800100 add byte ptr [rcx], 0 -;; aceb: aa stosb byte ptr [rdi], al -;; acec: 800100 add byte ptr [rcx], 0 -;; acef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; acf8: 800100 add byte ptr [rcx], 0 -;; acfb: aa stosb byte ptr [rdi], al -;; acfc: 800100 add byte ptr [rcx], 0 -;; acff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ad08: 800100 add byte ptr [rcx], 0 -;; ad0b: aa stosb byte ptr [rdi], al -;; ad0c: 800100 add byte ptr [rcx], 0 -;; ad0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ad18: 800100 add byte ptr [rcx], 0 -;; ad1b: aa stosb byte ptr [rdi], al -;; ad1c: 800100 add byte ptr [rcx], 0 -;; ad1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ad28: 800100 add byte ptr [rcx], 0 -;; ad2b: aa stosb byte ptr [rdi], al -;; ad2c: 800100 add byte ptr [rcx], 0 -;; ad2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ad38: 800100 add byte ptr [rcx], 0 -;; ad3b: aa stosb byte ptr [rdi], al -;; ad3c: 800100 add byte ptr [rcx], 0 -;; ad3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ad48: 800100 add byte ptr [rcx], 0 -;; ad4b: aa stosb byte ptr [rdi], al -;; ad4c: 800100 add byte ptr [rcx], 0 -;; ad4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ad58: 800100 add byte ptr [rcx], 0 -;; ad5b: aa stosb byte ptr [rdi], al -;; ad5c: 800100 add byte ptr [rcx], 0 -;; ad5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ad68: 800100 add byte ptr [rcx], 0 -;; ad6b: aa stosb byte ptr [rdi], al -;; ad6c: 800100 add byte ptr [rcx], 0 -;; ad6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ad78: 800100 add byte ptr [rcx], 0 -;; ad7b: aa stosb byte ptr [rdi], al -;; ad7c: 800100 add byte ptr [rcx], 0 -;; ad7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ad88: 800100 add byte ptr [rcx], 0 -;; ad8b: aa stosb byte ptr [rdi], al -;; ad8c: 800100 add byte ptr [rcx], 0 -;; ad8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ad98: 800100 add byte ptr [rcx], 0 -;; ad9b: aa stosb byte ptr [rdi], al -;; ad9c: 800100 add byte ptr [rcx], 0 -;; ad9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ada8: 800100 add byte ptr [rcx], 0 -;; adab: aa stosb byte ptr [rdi], al -;; adac: 800100 add byte ptr [rcx], 0 -;; adaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; adb8: 800100 add byte ptr [rcx], 0 -;; adbb: aa stosb byte ptr [rdi], al -;; adbc: 800100 add byte ptr [rcx], 0 -;; adbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; adc8: 800100 add byte ptr [rcx], 0 -;; adcb: aa stosb byte ptr [rdi], al -;; adcc: 800100 add byte ptr [rcx], 0 -;; adcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; add8: 800100 add byte ptr [rcx], 0 -;; addb: aa stosb byte ptr [rdi], al -;; addc: 800100 add byte ptr [rcx], 0 -;; addf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ade8: 800100 add byte ptr [rcx], 0 -;; adeb: aa stosb byte ptr [rdi], al -;; adec: 800100 add byte ptr [rcx], 0 -;; adef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; adf8: 800100 add byte ptr [rcx], 0 -;; adfb: aa stosb byte ptr [rdi], al -;; adfc: 800100 add byte ptr [rcx], 0 -;; adff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ae08: 800100 add byte ptr [rcx], 0 -;; ae0b: aa stosb byte ptr [rdi], al -;; ae0c: 800100 add byte ptr [rcx], 0 -;; ae0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ae18: 800100 add byte ptr [rcx], 0 -;; ae1b: aa stosb byte ptr [rdi], al -;; ae1c: 800100 add byte ptr [rcx], 0 -;; ae1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ae28: 800100 add byte ptr [rcx], 0 -;; ae2b: aa stosb byte ptr [rdi], al -;; ae2c: 800100 add byte ptr [rcx], 0 -;; ae2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ae38: 800100 add byte ptr [rcx], 0 -;; ae3b: aa stosb byte ptr [rdi], al -;; ae3c: 800100 add byte ptr [rcx], 0 -;; ae3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ae48: 800100 add byte ptr [rcx], 0 -;; ae4b: aa stosb byte ptr [rdi], al -;; ae4c: 800100 add byte ptr [rcx], 0 -;; ae4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ae58: 800100 add byte ptr [rcx], 0 -;; ae5b: aa stosb byte ptr [rdi], al -;; ae5c: 800100 add byte ptr [rcx], 0 -;; ae5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ae68: 800100 add byte ptr [rcx], 0 -;; ae6b: aa stosb byte ptr [rdi], al -;; ae6c: 800100 add byte ptr [rcx], 0 -;; ae6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ae78: 800100 add byte ptr [rcx], 0 -;; ae7b: aa stosb byte ptr [rdi], al -;; ae7c: 800100 add byte ptr [rcx], 0 -;; ae7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ae88: 800100 add byte ptr [rcx], 0 -;; ae8b: aa stosb byte ptr [rdi], al -;; ae8c: 800100 add byte ptr [rcx], 0 -;; ae8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ae98: 800100 add byte ptr [rcx], 0 -;; ae9b: aa stosb byte ptr [rdi], al -;; ae9c: 800100 add byte ptr [rcx], 0 -;; ae9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; aea8: 800100 add byte ptr [rcx], 0 -;; aeab: aa stosb byte ptr [rdi], al -;; aeac: 800100 add byte ptr [rcx], 0 -;; aeaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; aeb8: 800100 add byte ptr [rcx], 0 -;; aebb: aa stosb byte ptr [rdi], al -;; aebc: 800100 add byte ptr [rcx], 0 -;; aebf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; aec8: 800100 add byte ptr [rcx], 0 -;; aecb: aa stosb byte ptr [rdi], al -;; aecc: 800100 add byte ptr [rcx], 0 -;; aecf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; aed8: 800100 add byte ptr [rcx], 0 -;; aedb: aa stosb byte ptr [rdi], al -;; aedc: 800100 add byte ptr [rcx], 0 -;; aedf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; aee8: 800100 add byte ptr [rcx], 0 -;; aeeb: aa stosb byte ptr [rdi], al -;; aeec: 800100 add byte ptr [rcx], 0 -;; aeef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; aef8: 800100 add byte ptr [rcx], 0 -;; aefb: aa stosb byte ptr [rdi], al -;; aefc: 800100 add byte ptr [rcx], 0 -;; aeff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; af08: 800100 add byte ptr [rcx], 0 -;; af0b: aa stosb byte ptr [rdi], al -;; af0c: 800100 add byte ptr [rcx], 0 -;; af0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; af18: 800100 add byte ptr [rcx], 0 -;; af1b: aa stosb byte ptr [rdi], al -;; af1c: 800100 add byte ptr [rcx], 0 -;; af1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; af28: 800100 add byte ptr [rcx], 0 -;; af2b: aa stosb byte ptr [rdi], al -;; af2c: 800100 add byte ptr [rcx], 0 -;; af2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; af38: 800100 add byte ptr [rcx], 0 -;; af3b: aa stosb byte ptr [rdi], al -;; af3c: 800100 add byte ptr [rcx], 0 -;; af3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; af48: 800100 add byte ptr [rcx], 0 -;; af4b: aa stosb byte ptr [rdi], al -;; af4c: 800100 add byte ptr [rcx], 0 -;; af4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; af58: 800100 add byte ptr [rcx], 0 -;; af5b: aa stosb byte ptr [rdi], al -;; af5c: 800100 add byte ptr [rcx], 0 -;; af5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; af68: 800100 add byte ptr [rcx], 0 -;; af6b: aa stosb byte ptr [rdi], al -;; af6c: 800100 add byte ptr [rcx], 0 -;; af6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; af78: 800100 add byte ptr [rcx], 0 -;; af7b: aa stosb byte ptr [rdi], al -;; af7c: 800100 add byte ptr [rcx], 0 -;; af7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; af88: 800100 add byte ptr [rcx], 0 -;; af8b: aa stosb byte ptr [rdi], al -;; af8c: 800100 add byte ptr [rcx], 0 -;; af8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; af98: 800100 add byte ptr [rcx], 0 -;; af9b: aa stosb byte ptr [rdi], al -;; af9c: 800100 add byte ptr [rcx], 0 -;; af9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; afa8: 800100 add byte ptr [rcx], 0 -;; afab: aa stosb byte ptr [rdi], al -;; afac: 800100 add byte ptr [rcx], 0 -;; afaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; afb8: 800100 add byte ptr [rcx], 0 -;; afbb: aa stosb byte ptr [rdi], al -;; afbc: 800100 add byte ptr [rcx], 0 -;; afbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; afc8: 800100 add byte ptr [rcx], 0 -;; afcb: aa stosb byte ptr [rdi], al -;; afcc: 800100 add byte ptr [rcx], 0 -;; afcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; afd8: 800100 add byte ptr [rcx], 0 -;; afdb: aa stosb byte ptr [rdi], al -;; afdc: 800100 add byte ptr [rcx], 0 -;; afdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; afe8: 800100 add byte ptr [rcx], 0 -;; afeb: aa stosb byte ptr [rdi], al -;; afec: 800100 add byte ptr [rcx], 0 -;; afef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; aff8: 800100 add byte ptr [rcx], 0 -;; affb: aa stosb byte ptr [rdi], al -;; affc: 800100 add byte ptr [rcx], 0 -;; afff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b008: 800100 add byte ptr [rcx], 0 -;; b00b: aa stosb byte ptr [rdi], al -;; b00c: 800100 add byte ptr [rcx], 0 -;; b00f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b018: 800100 add byte ptr [rcx], 0 -;; b01b: aa stosb byte ptr [rdi], al -;; b01c: 800100 add byte ptr [rcx], 0 -;; b01f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b028: 800100 add byte ptr [rcx], 0 -;; b02b: aa stosb byte ptr [rdi], al -;; b02c: 800100 add byte ptr [rcx], 0 -;; b02f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b038: 800100 add byte ptr [rcx], 0 -;; b03b: aa stosb byte ptr [rdi], al -;; b03c: 800100 add byte ptr [rcx], 0 -;; b03f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b048: 800100 add byte ptr [rcx], 0 -;; b04b: aa stosb byte ptr [rdi], al -;; b04c: 800100 add byte ptr [rcx], 0 -;; b04f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b058: 800100 add byte ptr [rcx], 0 -;; b05b: aa stosb byte ptr [rdi], al -;; b05c: 800100 add byte ptr [rcx], 0 -;; b05f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b068: 800100 add byte ptr [rcx], 0 -;; b06b: aa stosb byte ptr [rdi], al -;; b06c: 800100 add byte ptr [rcx], 0 -;; b06f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b078: 800100 add byte ptr [rcx], 0 -;; b07b: aa stosb byte ptr [rdi], al -;; b07c: 800100 add byte ptr [rcx], 0 -;; b07f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b088: 800100 add byte ptr [rcx], 0 -;; b08b: aa stosb byte ptr [rdi], al -;; b08c: 800100 add byte ptr [rcx], 0 -;; b08f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b098: 800100 add byte ptr [rcx], 0 -;; b09b: aa stosb byte ptr [rdi], al -;; b09c: 800100 add byte ptr [rcx], 0 -;; b09f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b0a8: 800100 add byte ptr [rcx], 0 -;; b0ab: aa stosb byte ptr [rdi], al -;; b0ac: 800100 add byte ptr [rcx], 0 -;; b0af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b0b8: 800100 add byte ptr [rcx], 0 -;; b0bb: aa stosb byte ptr [rdi], al -;; b0bc: 800100 add byte ptr [rcx], 0 -;; b0bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b0c8: 800100 add byte ptr [rcx], 0 -;; b0cb: aa stosb byte ptr [rdi], al -;; b0cc: 800100 add byte ptr [rcx], 0 -;; b0cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b0d8: 800100 add byte ptr [rcx], 0 -;; b0db: aa stosb byte ptr [rdi], al -;; b0dc: 800100 add byte ptr [rcx], 0 -;; b0df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b0e8: 800100 add byte ptr [rcx], 0 -;; b0eb: aa stosb byte ptr [rdi], al -;; b0ec: 800100 add byte ptr [rcx], 0 -;; b0ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b0f8: 800100 add byte ptr [rcx], 0 -;; b0fb: aa stosb byte ptr [rdi], al -;; b0fc: 800100 add byte ptr [rcx], 0 -;; b0ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b108: 800100 add byte ptr [rcx], 0 -;; b10b: aa stosb byte ptr [rdi], al -;; b10c: 800100 add byte ptr [rcx], 0 -;; b10f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b118: 800100 add byte ptr [rcx], 0 -;; b11b: aa stosb byte ptr [rdi], al -;; b11c: 800100 add byte ptr [rcx], 0 -;; b11f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b128: 800100 add byte ptr [rcx], 0 -;; b12b: aa stosb byte ptr [rdi], al -;; b12c: 800100 add byte ptr [rcx], 0 -;; b12f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b138: 800100 add byte ptr [rcx], 0 -;; b13b: aa stosb byte ptr [rdi], al -;; b13c: 800100 add byte ptr [rcx], 0 -;; b13f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b148: 800100 add byte ptr [rcx], 0 -;; b14b: aa stosb byte ptr [rdi], al -;; b14c: 800100 add byte ptr [rcx], 0 -;; b14f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b158: 800100 add byte ptr [rcx], 0 -;; b15b: aa stosb byte ptr [rdi], al -;; b15c: 800100 add byte ptr [rcx], 0 -;; b15f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b168: 800100 add byte ptr [rcx], 0 -;; b16b: aa stosb byte ptr [rdi], al -;; b16c: 800100 add byte ptr [rcx], 0 -;; b16f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b178: 800100 add byte ptr [rcx], 0 -;; b17b: aa stosb byte ptr [rdi], al -;; b17c: 800100 add byte ptr [rcx], 0 -;; b17f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b188: 800100 add byte ptr [rcx], 0 -;; b18b: aa stosb byte ptr [rdi], al -;; b18c: 800100 add byte ptr [rcx], 0 -;; b18f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b198: 800100 add byte ptr [rcx], 0 -;; b19b: aa stosb byte ptr [rdi], al -;; b19c: 800100 add byte ptr [rcx], 0 -;; b19f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b1a8: 800100 add byte ptr [rcx], 0 -;; b1ab: aa stosb byte ptr [rdi], al -;; b1ac: 800100 add byte ptr [rcx], 0 -;; b1af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b1b8: 800100 add byte ptr [rcx], 0 -;; b1bb: aa stosb byte ptr [rdi], al -;; b1bc: 800100 add byte ptr [rcx], 0 -;; b1bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b1c8: 800100 add byte ptr [rcx], 0 -;; b1cb: aa stosb byte ptr [rdi], al -;; b1cc: 800100 add byte ptr [rcx], 0 -;; b1cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b1d8: 800100 add byte ptr [rcx], 0 -;; b1db: aa stosb byte ptr [rdi], al -;; b1dc: 800100 add byte ptr [rcx], 0 -;; b1df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b1e8: 800100 add byte ptr [rcx], 0 -;; b1eb: aa stosb byte ptr [rdi], al -;; b1ec: 800100 add byte ptr [rcx], 0 -;; b1ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b1f8: 800100 add byte ptr [rcx], 0 -;; b1fb: aa stosb byte ptr [rdi], al -;; b1fc: 800100 add byte ptr [rcx], 0 -;; b1ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b208: 800100 add byte ptr [rcx], 0 -;; b20b: aa stosb byte ptr [rdi], al -;; b20c: 800100 add byte ptr [rcx], 0 -;; b20f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b218: 800100 add byte ptr [rcx], 0 -;; b21b: aa stosb byte ptr [rdi], al -;; b21c: 800100 add byte ptr [rcx], 0 -;; b21f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b228: 800100 add byte ptr [rcx], 0 -;; b22b: aa stosb byte ptr [rdi], al -;; b22c: 800100 add byte ptr [rcx], 0 -;; b22f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b238: 800100 add byte ptr [rcx], 0 -;; b23b: aa stosb byte ptr [rdi], al -;; b23c: 800100 add byte ptr [rcx], 0 -;; b23f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b248: 800100 add byte ptr [rcx], 0 -;; b24b: aa stosb byte ptr [rdi], al -;; b24c: 800100 add byte ptr [rcx], 0 -;; b24f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b258: 800100 add byte ptr [rcx], 0 -;; b25b: aa stosb byte ptr [rdi], al -;; b25c: 800100 add byte ptr [rcx], 0 -;; b25f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b268: 800100 add byte ptr [rcx], 0 -;; b26b: aa stosb byte ptr [rdi], al -;; b26c: 800100 add byte ptr [rcx], 0 -;; b26f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b278: 800100 add byte ptr [rcx], 0 -;; b27b: aa stosb byte ptr [rdi], al -;; b27c: 800100 add byte ptr [rcx], 0 -;; b27f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b288: 800100 add byte ptr [rcx], 0 -;; b28b: aa stosb byte ptr [rdi], al -;; b28c: 800100 add byte ptr [rcx], 0 -;; b28f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b298: 800100 add byte ptr [rcx], 0 -;; b29b: aa stosb byte ptr [rdi], al -;; b29c: 800100 add byte ptr [rcx], 0 -;; b29f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b2a8: 800100 add byte ptr [rcx], 0 -;; b2ab: aa stosb byte ptr [rdi], al -;; b2ac: 800100 add byte ptr [rcx], 0 -;; b2af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b2b8: 800100 add byte ptr [rcx], 0 -;; b2bb: aa stosb byte ptr [rdi], al -;; b2bc: 800100 add byte ptr [rcx], 0 -;; b2bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b2c8: 800100 add byte ptr [rcx], 0 -;; b2cb: aa stosb byte ptr [rdi], al -;; b2cc: 800100 add byte ptr [rcx], 0 -;; b2cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b2d8: 800100 add byte ptr [rcx], 0 -;; b2db: aa stosb byte ptr [rdi], al -;; b2dc: 800100 add byte ptr [rcx], 0 -;; b2df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b2e8: 800100 add byte ptr [rcx], 0 -;; b2eb: aa stosb byte ptr [rdi], al -;; b2ec: 800100 add byte ptr [rcx], 0 -;; b2ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b2f8: 800100 add byte ptr [rcx], 0 -;; b2fb: aa stosb byte ptr [rdi], al -;; b2fc: 800100 add byte ptr [rcx], 0 -;; b2ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b308: 800100 add byte ptr [rcx], 0 -;; b30b: aa stosb byte ptr [rdi], al -;; b30c: 800100 add byte ptr [rcx], 0 -;; b30f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b318: 800100 add byte ptr [rcx], 0 -;; b31b: aa stosb byte ptr [rdi], al -;; b31c: 800100 add byte ptr [rcx], 0 -;; b31f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b328: 800100 add byte ptr [rcx], 0 -;; b32b: aa stosb byte ptr [rdi], al -;; b32c: 800100 add byte ptr [rcx], 0 -;; b32f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b338: 800100 add byte ptr [rcx], 0 -;; b33b: aa stosb byte ptr [rdi], al -;; b33c: 800100 add byte ptr [rcx], 0 -;; b33f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b348: 800100 add byte ptr [rcx], 0 -;; b34b: aa stosb byte ptr [rdi], al -;; b34c: 800100 add byte ptr [rcx], 0 -;; b34f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b358: 800100 add byte ptr [rcx], 0 -;; b35b: aa stosb byte ptr [rdi], al -;; b35c: 800100 add byte ptr [rcx], 0 -;; b35f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b368: 800100 add byte ptr [rcx], 0 -;; b36b: aa stosb byte ptr [rdi], al -;; b36c: 800100 add byte ptr [rcx], 0 -;; b36f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b378: 800100 add byte ptr [rcx], 0 -;; b37b: aa stosb byte ptr [rdi], al -;; b37c: 800100 add byte ptr [rcx], 0 -;; b37f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b388: 800100 add byte ptr [rcx], 0 -;; b38b: aa stosb byte ptr [rdi], al -;; b38c: 800100 add byte ptr [rcx], 0 -;; b38f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b398: 800100 add byte ptr [rcx], 0 -;; b39b: aa stosb byte ptr [rdi], al -;; b39c: 800100 add byte ptr [rcx], 0 -;; b39f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b3a8: 800100 add byte ptr [rcx], 0 -;; b3ab: aa stosb byte ptr [rdi], al -;; b3ac: 800100 add byte ptr [rcx], 0 -;; b3af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b3b8: 800100 add byte ptr [rcx], 0 -;; b3bb: aa stosb byte ptr [rdi], al -;; b3bc: 800100 add byte ptr [rcx], 0 -;; b3bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b3c8: 800100 add byte ptr [rcx], 0 -;; b3cb: aa stosb byte ptr [rdi], al -;; b3cc: 800100 add byte ptr [rcx], 0 -;; b3cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b3d8: 800100 add byte ptr [rcx], 0 -;; b3db: aa stosb byte ptr [rdi], al -;; b3dc: 800100 add byte ptr [rcx], 0 -;; b3df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b3e8: 800100 add byte ptr [rcx], 0 -;; b3eb: aa stosb byte ptr [rdi], al -;; b3ec: 800100 add byte ptr [rcx], 0 -;; b3ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b3f8: 800100 add byte ptr [rcx], 0 -;; b3fb: aa stosb byte ptr [rdi], al -;; b3fc: 800100 add byte ptr [rcx], 0 -;; b3ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b408: 800100 add byte ptr [rcx], 0 -;; b40b: aa stosb byte ptr [rdi], al -;; b40c: 800100 add byte ptr [rcx], 0 -;; b40f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b418: 800100 add byte ptr [rcx], 0 -;; b41b: aa stosb byte ptr [rdi], al -;; b41c: 800100 add byte ptr [rcx], 0 -;; b41f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b428: 800100 add byte ptr [rcx], 0 -;; b42b: aa stosb byte ptr [rdi], al -;; b42c: 800100 add byte ptr [rcx], 0 -;; b42f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b438: 800100 add byte ptr [rcx], 0 -;; b43b: aa stosb byte ptr [rdi], al -;; b43c: 800100 add byte ptr [rcx], 0 -;; b43f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b448: 800100 add byte ptr [rcx], 0 -;; b44b: aa stosb byte ptr [rdi], al -;; b44c: 800100 add byte ptr [rcx], 0 -;; b44f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b458: 800100 add byte ptr [rcx], 0 -;; b45b: aa stosb byte ptr [rdi], al -;; b45c: 800100 add byte ptr [rcx], 0 -;; b45f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b468: 800100 add byte ptr [rcx], 0 -;; b46b: aa stosb byte ptr [rdi], al -;; b46c: 800100 add byte ptr [rcx], 0 -;; b46f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b478: 800100 add byte ptr [rcx], 0 -;; b47b: aa stosb byte ptr [rdi], al -;; b47c: 800100 add byte ptr [rcx], 0 -;; b47f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b488: 800100 add byte ptr [rcx], 0 -;; b48b: aa stosb byte ptr [rdi], al -;; b48c: 800100 add byte ptr [rcx], 0 -;; b48f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b498: 800100 add byte ptr [rcx], 0 -;; b49b: aa stosb byte ptr [rdi], al -;; b49c: 800100 add byte ptr [rcx], 0 -;; b49f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b4a8: 800100 add byte ptr [rcx], 0 -;; b4ab: aa stosb byte ptr [rdi], al -;; b4ac: 800100 add byte ptr [rcx], 0 -;; b4af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b4b8: 800100 add byte ptr [rcx], 0 -;; b4bb: aa stosb byte ptr [rdi], al -;; b4bc: 800100 add byte ptr [rcx], 0 -;; b4bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b4c8: 800100 add byte ptr [rcx], 0 -;; b4cb: aa stosb byte ptr [rdi], al -;; b4cc: 800100 add byte ptr [rcx], 0 -;; b4cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b4d8: 800100 add byte ptr [rcx], 0 -;; b4db: aa stosb byte ptr [rdi], al -;; b4dc: 800100 add byte ptr [rcx], 0 -;; b4df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b4e8: 800100 add byte ptr [rcx], 0 -;; b4eb: aa stosb byte ptr [rdi], al -;; b4ec: 800100 add byte ptr [rcx], 0 -;; b4ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b4f8: 800100 add byte ptr [rcx], 0 -;; b4fb: aa stosb byte ptr [rdi], al -;; b4fc: 800100 add byte ptr [rcx], 0 -;; b4ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b508: 800100 add byte ptr [rcx], 0 -;; b50b: aa stosb byte ptr [rdi], al -;; b50c: 800100 add byte ptr [rcx], 0 -;; b50f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b518: 800100 add byte ptr [rcx], 0 -;; b51b: aa stosb byte ptr [rdi], al -;; b51c: 800100 add byte ptr [rcx], 0 -;; b51f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b528: 800100 add byte ptr [rcx], 0 -;; b52b: aa stosb byte ptr [rdi], al -;; b52c: 800100 add byte ptr [rcx], 0 -;; b52f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b538: 800100 add byte ptr [rcx], 0 -;; b53b: aa stosb byte ptr [rdi], al -;; b53c: 800100 add byte ptr [rcx], 0 -;; b53f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b548: 800100 add byte ptr [rcx], 0 -;; b54b: aa stosb byte ptr [rdi], al -;; b54c: 800100 add byte ptr [rcx], 0 -;; b54f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b558: 800100 add byte ptr [rcx], 0 -;; b55b: aa stosb byte ptr [rdi], al -;; b55c: 800100 add byte ptr [rcx], 0 -;; b55f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b568: 800100 add byte ptr [rcx], 0 -;; b56b: aa stosb byte ptr [rdi], al -;; b56c: 800100 add byte ptr [rcx], 0 -;; b56f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b578: 800100 add byte ptr [rcx], 0 -;; b57b: aa stosb byte ptr [rdi], al -;; b57c: 800100 add byte ptr [rcx], 0 -;; b57f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b588: 800100 add byte ptr [rcx], 0 -;; b58b: aa stosb byte ptr [rdi], al -;; b58c: 800100 add byte ptr [rcx], 0 -;; b58f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b598: 800100 add byte ptr [rcx], 0 -;; b59b: aa stosb byte ptr [rdi], al -;; b59c: 800100 add byte ptr [rcx], 0 -;; b59f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b5a8: 800100 add byte ptr [rcx], 0 -;; b5ab: aa stosb byte ptr [rdi], al -;; b5ac: 800100 add byte ptr [rcx], 0 -;; b5af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b5b8: 800100 add byte ptr [rcx], 0 -;; b5bb: aa stosb byte ptr [rdi], al -;; b5bc: 800100 add byte ptr [rcx], 0 -;; b5bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b5c8: 800100 add byte ptr [rcx], 0 -;; b5cb: aa stosb byte ptr [rdi], al -;; b5cc: 800100 add byte ptr [rcx], 0 -;; b5cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b5d8: 800100 add byte ptr [rcx], 0 -;; b5db: aa stosb byte ptr [rdi], al -;; b5dc: 800100 add byte ptr [rcx], 0 -;; b5df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b5e8: 800100 add byte ptr [rcx], 0 -;; b5eb: aa stosb byte ptr [rdi], al -;; b5ec: 800100 add byte ptr [rcx], 0 -;; b5ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b5f8: 800100 add byte ptr [rcx], 0 -;; b5fb: aa stosb byte ptr [rdi], al -;; b5fc: 800100 add byte ptr [rcx], 0 -;; b5ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b608: 800100 add byte ptr [rcx], 0 -;; b60b: aa stosb byte ptr [rdi], al -;; b60c: 800100 add byte ptr [rcx], 0 -;; b60f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b618: 800100 add byte ptr [rcx], 0 -;; b61b: aa stosb byte ptr [rdi], al -;; b61c: 800100 add byte ptr [rcx], 0 -;; b61f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b628: 800100 add byte ptr [rcx], 0 -;; b62b: aa stosb byte ptr [rdi], al -;; b62c: 800100 add byte ptr [rcx], 0 -;; b62f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b638: 800100 add byte ptr [rcx], 0 -;; b63b: aa stosb byte ptr [rdi], al -;; b63c: 800100 add byte ptr [rcx], 0 -;; b63f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b648: 800100 add byte ptr [rcx], 0 -;; b64b: aa stosb byte ptr [rdi], al -;; b64c: 800100 add byte ptr [rcx], 0 -;; b64f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b658: 800100 add byte ptr [rcx], 0 -;; b65b: aa stosb byte ptr [rdi], al -;; b65c: 800100 add byte ptr [rcx], 0 -;; b65f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b668: 800100 add byte ptr [rcx], 0 -;; b66b: aa stosb byte ptr [rdi], al -;; b66c: 800100 add byte ptr [rcx], 0 -;; b66f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b678: 800100 add byte ptr [rcx], 0 -;; b67b: aa stosb byte ptr [rdi], al -;; b67c: 800100 add byte ptr [rcx], 0 -;; b67f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b688: 800100 add byte ptr [rcx], 0 -;; b68b: aa stosb byte ptr [rdi], al -;; b68c: 800100 add byte ptr [rcx], 0 -;; b68f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b698: 800100 add byte ptr [rcx], 0 -;; b69b: aa stosb byte ptr [rdi], al -;; b69c: 800100 add byte ptr [rcx], 0 -;; b69f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b6a8: 800100 add byte ptr [rcx], 0 -;; b6ab: aa stosb byte ptr [rdi], al -;; b6ac: 800100 add byte ptr [rcx], 0 -;; b6af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b6b8: 800100 add byte ptr [rcx], 0 -;; b6bb: aa stosb byte ptr [rdi], al -;; b6bc: 800100 add byte ptr [rcx], 0 -;; b6bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b6c8: 800100 add byte ptr [rcx], 0 -;; b6cb: aa stosb byte ptr [rdi], al -;; b6cc: 800100 add byte ptr [rcx], 0 -;; b6cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b6d8: 800100 add byte ptr [rcx], 0 -;; b6db: aa stosb byte ptr [rdi], al -;; b6dc: 800100 add byte ptr [rcx], 0 -;; b6df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b6e8: 800100 add byte ptr [rcx], 0 -;; b6eb: aa stosb byte ptr [rdi], al -;; b6ec: 800100 add byte ptr [rcx], 0 -;; b6ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b6f8: 800100 add byte ptr [rcx], 0 -;; b6fb: aa stosb byte ptr [rdi], al -;; b6fc: 800100 add byte ptr [rcx], 0 -;; b6ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b708: 800100 add byte ptr [rcx], 0 -;; b70b: aa stosb byte ptr [rdi], al -;; b70c: 800100 add byte ptr [rcx], 0 -;; b70f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b718: 800100 add byte ptr [rcx], 0 -;; b71b: aa stosb byte ptr [rdi], al -;; b71c: 800100 add byte ptr [rcx], 0 -;; b71f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b728: 800100 add byte ptr [rcx], 0 -;; b72b: aa stosb byte ptr [rdi], al -;; b72c: 800100 add byte ptr [rcx], 0 -;; b72f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b738: 800100 add byte ptr [rcx], 0 -;; b73b: aa stosb byte ptr [rdi], al -;; b73c: 800100 add byte ptr [rcx], 0 -;; b73f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b748: 800100 add byte ptr [rcx], 0 -;; b74b: aa stosb byte ptr [rdi], al -;; b74c: 800100 add byte ptr [rcx], 0 -;; b74f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b758: 800100 add byte ptr [rcx], 0 -;; b75b: aa stosb byte ptr [rdi], al -;; b75c: 800100 add byte ptr [rcx], 0 -;; b75f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b768: 800100 add byte ptr [rcx], 0 -;; b76b: aa stosb byte ptr [rdi], al -;; b76c: 800100 add byte ptr [rcx], 0 -;; b76f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b778: 800100 add byte ptr [rcx], 0 -;; b77b: aa stosb byte ptr [rdi], al -;; b77c: 800100 add byte ptr [rcx], 0 -;; b77f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b788: 800100 add byte ptr [rcx], 0 -;; b78b: aa stosb byte ptr [rdi], al -;; b78c: 800100 add byte ptr [rcx], 0 -;; b78f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b798: 800100 add byte ptr [rcx], 0 -;; b79b: aa stosb byte ptr [rdi], al -;; b79c: 800100 add byte ptr [rcx], 0 -;; b79f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b7a8: 800100 add byte ptr [rcx], 0 -;; b7ab: aa stosb byte ptr [rdi], al -;; b7ac: 800100 add byte ptr [rcx], 0 -;; b7af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b7b8: 800100 add byte ptr [rcx], 0 -;; b7bb: aa stosb byte ptr [rdi], al -;; b7bc: 800100 add byte ptr [rcx], 0 -;; b7bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b7c8: 800100 add byte ptr [rcx], 0 -;; b7cb: aa stosb byte ptr [rdi], al -;; b7cc: 800100 add byte ptr [rcx], 0 -;; b7cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b7d8: 800100 add byte ptr [rcx], 0 -;; b7db: aa stosb byte ptr [rdi], al -;; b7dc: 800100 add byte ptr [rcx], 0 -;; b7df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b7e8: 800100 add byte ptr [rcx], 0 -;; b7eb: aa stosb byte ptr [rdi], al -;; b7ec: 800100 add byte ptr [rcx], 0 -;; b7ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b7f8: 800100 add byte ptr [rcx], 0 -;; b7fb: aa stosb byte ptr [rdi], al -;; b7fc: 800100 add byte ptr [rcx], 0 -;; b7ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b808: 800100 add byte ptr [rcx], 0 -;; b80b: aa stosb byte ptr [rdi], al -;; b80c: 800100 add byte ptr [rcx], 0 -;; b80f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b818: 800100 add byte ptr [rcx], 0 -;; b81b: aa stosb byte ptr [rdi], al -;; b81c: 800100 add byte ptr [rcx], 0 -;; b81f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b828: 800100 add byte ptr [rcx], 0 -;; b82b: aa stosb byte ptr [rdi], al -;; b82c: 800100 add byte ptr [rcx], 0 -;; b82f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b838: 800100 add byte ptr [rcx], 0 -;; b83b: aa stosb byte ptr [rdi], al -;; b83c: 800100 add byte ptr [rcx], 0 -;; b83f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b848: 800100 add byte ptr [rcx], 0 -;; b84b: aa stosb byte ptr [rdi], al -;; b84c: 800100 add byte ptr [rcx], 0 -;; b84f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b858: 800100 add byte ptr [rcx], 0 -;; b85b: aa stosb byte ptr [rdi], al -;; b85c: 800100 add byte ptr [rcx], 0 -;; b85f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b868: 800100 add byte ptr [rcx], 0 -;; b86b: aa stosb byte ptr [rdi], al -;; b86c: 800100 add byte ptr [rcx], 0 -;; b86f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b878: 800100 add byte ptr [rcx], 0 -;; b87b: aa stosb byte ptr [rdi], al -;; b87c: 800100 add byte ptr [rcx], 0 -;; b87f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b888: 800100 add byte ptr [rcx], 0 -;; b88b: aa stosb byte ptr [rdi], al -;; b88c: 800100 add byte ptr [rcx], 0 -;; b88f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b898: 800100 add byte ptr [rcx], 0 -;; b89b: aa stosb byte ptr [rdi], al -;; b89c: 800100 add byte ptr [rcx], 0 -;; b89f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b8a8: 800100 add byte ptr [rcx], 0 -;; b8ab: aa stosb byte ptr [rdi], al -;; b8ac: 800100 add byte ptr [rcx], 0 -;; b8af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b8b8: 800100 add byte ptr [rcx], 0 -;; b8bb: aa stosb byte ptr [rdi], al -;; b8bc: 800100 add byte ptr [rcx], 0 -;; b8bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b8c8: 800100 add byte ptr [rcx], 0 -;; b8cb: aa stosb byte ptr [rdi], al -;; b8cc: 800100 add byte ptr [rcx], 0 -;; b8cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b8d8: 800100 add byte ptr [rcx], 0 -;; b8db: aa stosb byte ptr [rdi], al -;; b8dc: 800100 add byte ptr [rcx], 0 -;; b8df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b8e8: 800100 add byte ptr [rcx], 0 -;; b8eb: aa stosb byte ptr [rdi], al -;; b8ec: 800100 add byte ptr [rcx], 0 -;; b8ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b8f8: 800100 add byte ptr [rcx], 0 -;; b8fb: aa stosb byte ptr [rdi], al -;; b8fc: 800100 add byte ptr [rcx], 0 -;; b8ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b908: 800100 add byte ptr [rcx], 0 -;; b90b: aa stosb byte ptr [rdi], al -;; b90c: 800100 add byte ptr [rcx], 0 -;; b90f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b918: 800100 add byte ptr [rcx], 0 -;; b91b: aa stosb byte ptr [rdi], al -;; b91c: 800100 add byte ptr [rcx], 0 -;; b91f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b928: 800100 add byte ptr [rcx], 0 -;; b92b: aa stosb byte ptr [rdi], al -;; b92c: 800100 add byte ptr [rcx], 0 -;; b92f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b938: 800100 add byte ptr [rcx], 0 -;; b93b: aa stosb byte ptr [rdi], al -;; b93c: 800100 add byte ptr [rcx], 0 -;; b93f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b948: 800100 add byte ptr [rcx], 0 -;; b94b: aa stosb byte ptr [rdi], al -;; b94c: 800100 add byte ptr [rcx], 0 -;; b94f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b958: 800100 add byte ptr [rcx], 0 -;; b95b: aa stosb byte ptr [rdi], al -;; b95c: 800100 add byte ptr [rcx], 0 -;; b95f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b968: 800100 add byte ptr [rcx], 0 -;; b96b: aa stosb byte ptr [rdi], al -;; b96c: 800100 add byte ptr [rcx], 0 -;; b96f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b978: 800100 add byte ptr [rcx], 0 -;; b97b: aa stosb byte ptr [rdi], al -;; b97c: 800100 add byte ptr [rcx], 0 -;; b97f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b988: 800100 add byte ptr [rcx], 0 -;; b98b: aa stosb byte ptr [rdi], al -;; b98c: 800100 add byte ptr [rcx], 0 -;; b98f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b998: 800100 add byte ptr [rcx], 0 -;; b99b: aa stosb byte ptr [rdi], al -;; b99c: 800100 add byte ptr [rcx], 0 -;; b99f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b9a8: 800100 add byte ptr [rcx], 0 -;; b9ab: aa stosb byte ptr [rdi], al -;; b9ac: 800100 add byte ptr [rcx], 0 -;; b9af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b9b8: 800100 add byte ptr [rcx], 0 -;; b9bb: aa stosb byte ptr [rdi], al -;; b9bc: 800100 add byte ptr [rcx], 0 -;; b9bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b9c8: 800100 add byte ptr [rcx], 0 -;; b9cb: aa stosb byte ptr [rdi], al -;; b9cc: 800100 add byte ptr [rcx], 0 -;; b9cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b9d8: 800100 add byte ptr [rcx], 0 -;; b9db: aa stosb byte ptr [rdi], al -;; b9dc: 800100 add byte ptr [rcx], 0 -;; b9df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b9e8: 800100 add byte ptr [rcx], 0 -;; b9eb: aa stosb byte ptr [rdi], al -;; b9ec: 800100 add byte ptr [rcx], 0 -;; b9ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; b9f8: 800100 add byte ptr [rcx], 0 -;; b9fb: aa stosb byte ptr [rdi], al -;; b9fc: 800100 add byte ptr [rcx], 0 -;; b9ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ba08: 800100 add byte ptr [rcx], 0 -;; ba0b: aa stosb byte ptr [rdi], al -;; ba0c: 800100 add byte ptr [rcx], 0 -;; ba0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ba18: 800100 add byte ptr [rcx], 0 -;; ba1b: aa stosb byte ptr [rdi], al -;; ba1c: 800100 add byte ptr [rcx], 0 -;; ba1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ba28: 800100 add byte ptr [rcx], 0 -;; ba2b: aa stosb byte ptr [rdi], al -;; ba2c: 800100 add byte ptr [rcx], 0 -;; ba2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ba38: 800100 add byte ptr [rcx], 0 -;; ba3b: aa stosb byte ptr [rdi], al -;; ba3c: 800100 add byte ptr [rcx], 0 -;; ba3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ba48: 800100 add byte ptr [rcx], 0 -;; ba4b: aa stosb byte ptr [rdi], al -;; ba4c: 800100 add byte ptr [rcx], 0 -;; ba4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ba58: 800100 add byte ptr [rcx], 0 -;; ba5b: aa stosb byte ptr [rdi], al -;; ba5c: 800100 add byte ptr [rcx], 0 -;; ba5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ba68: 800100 add byte ptr [rcx], 0 -;; ba6b: aa stosb byte ptr [rdi], al -;; ba6c: 800100 add byte ptr [rcx], 0 -;; ba6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ba78: 800100 add byte ptr [rcx], 0 -;; ba7b: aa stosb byte ptr [rdi], al -;; ba7c: 800100 add byte ptr [rcx], 0 -;; ba7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ba88: 800100 add byte ptr [rcx], 0 -;; ba8b: aa stosb byte ptr [rdi], al -;; ba8c: 800100 add byte ptr [rcx], 0 -;; ba8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ba98: 800100 add byte ptr [rcx], 0 -;; ba9b: aa stosb byte ptr [rdi], al -;; ba9c: 800100 add byte ptr [rcx], 0 -;; ba9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; baa8: 800100 add byte ptr [rcx], 0 -;; baab: aa stosb byte ptr [rdi], al -;; baac: 800100 add byte ptr [rcx], 0 -;; baaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bab8: 800100 add byte ptr [rcx], 0 -;; babb: aa stosb byte ptr [rdi], al -;; babc: 800100 add byte ptr [rcx], 0 -;; babf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bac8: 800100 add byte ptr [rcx], 0 -;; bacb: aa stosb byte ptr [rdi], al -;; bacc: 800100 add byte ptr [rcx], 0 -;; bacf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bad8: 800100 add byte ptr [rcx], 0 -;; badb: aa stosb byte ptr [rdi], al -;; badc: 800100 add byte ptr [rcx], 0 -;; badf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bae8: 800100 add byte ptr [rcx], 0 -;; baeb: aa stosb byte ptr [rdi], al -;; baec: 800100 add byte ptr [rcx], 0 -;; baef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; baf8: 800100 add byte ptr [rcx], 0 -;; bafb: aa stosb byte ptr [rdi], al -;; bafc: 800100 add byte ptr [rcx], 0 -;; baff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bb08: 800100 add byte ptr [rcx], 0 -;; bb0b: aa stosb byte ptr [rdi], al -;; bb0c: 800100 add byte ptr [rcx], 0 -;; bb0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bb18: 800100 add byte ptr [rcx], 0 -;; bb1b: aa stosb byte ptr [rdi], al -;; bb1c: 800100 add byte ptr [rcx], 0 -;; bb1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bb28: 800100 add byte ptr [rcx], 0 -;; bb2b: aa stosb byte ptr [rdi], al -;; bb2c: 800100 add byte ptr [rcx], 0 -;; bb2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bb38: 800100 add byte ptr [rcx], 0 -;; bb3b: aa stosb byte ptr [rdi], al -;; bb3c: 800100 add byte ptr [rcx], 0 -;; bb3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bb48: 800100 add byte ptr [rcx], 0 -;; bb4b: aa stosb byte ptr [rdi], al -;; bb4c: 800100 add byte ptr [rcx], 0 -;; bb4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bb58: 800100 add byte ptr [rcx], 0 -;; bb5b: aa stosb byte ptr [rdi], al -;; bb5c: 800100 add byte ptr [rcx], 0 -;; bb5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bb68: 800100 add byte ptr [rcx], 0 -;; bb6b: aa stosb byte ptr [rdi], al -;; bb6c: 800100 add byte ptr [rcx], 0 -;; bb6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bb78: 800100 add byte ptr [rcx], 0 -;; bb7b: aa stosb byte ptr [rdi], al -;; bb7c: 800100 add byte ptr [rcx], 0 -;; bb7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bb88: 800100 add byte ptr [rcx], 0 -;; bb8b: aa stosb byte ptr [rdi], al -;; bb8c: 800100 add byte ptr [rcx], 0 -;; bb8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bb98: 800100 add byte ptr [rcx], 0 -;; bb9b: aa stosb byte ptr [rdi], al -;; bb9c: 800100 add byte ptr [rcx], 0 -;; bb9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bba8: 800100 add byte ptr [rcx], 0 -;; bbab: aa stosb byte ptr [rdi], al -;; bbac: 800100 add byte ptr [rcx], 0 -;; bbaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bbb8: 800100 add byte ptr [rcx], 0 -;; bbbb: aa stosb byte ptr [rdi], al -;; bbbc: 800100 add byte ptr [rcx], 0 -;; bbbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bbc8: 800100 add byte ptr [rcx], 0 -;; bbcb: aa stosb byte ptr [rdi], al -;; bbcc: 800100 add byte ptr [rcx], 0 -;; bbcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bbd8: 800100 add byte ptr [rcx], 0 -;; bbdb: aa stosb byte ptr [rdi], al -;; bbdc: 800100 add byte ptr [rcx], 0 -;; bbdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bbe8: 800100 add byte ptr [rcx], 0 -;; bbeb: aa stosb byte ptr [rdi], al -;; bbec: 800100 add byte ptr [rcx], 0 -;; bbef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bbf8: 800100 add byte ptr [rcx], 0 -;; bbfb: aa stosb byte ptr [rdi], al -;; bbfc: 800100 add byte ptr [rcx], 0 -;; bbff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bc08: 800100 add byte ptr [rcx], 0 -;; bc0b: aa stosb byte ptr [rdi], al -;; bc0c: 800100 add byte ptr [rcx], 0 -;; bc0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bc18: 800100 add byte ptr [rcx], 0 -;; bc1b: aa stosb byte ptr [rdi], al -;; bc1c: 800100 add byte ptr [rcx], 0 -;; bc1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bc28: 800100 add byte ptr [rcx], 0 -;; bc2b: aa stosb byte ptr [rdi], al -;; bc2c: 800100 add byte ptr [rcx], 0 -;; bc2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bc38: 800100 add byte ptr [rcx], 0 -;; bc3b: aa stosb byte ptr [rdi], al -;; bc3c: 800100 add byte ptr [rcx], 0 -;; bc3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bc48: 800100 add byte ptr [rcx], 0 -;; bc4b: aa stosb byte ptr [rdi], al -;; bc4c: 800100 add byte ptr [rcx], 0 -;; bc4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bc58: 800100 add byte ptr [rcx], 0 -;; bc5b: aa stosb byte ptr [rdi], al -;; bc5c: 800100 add byte ptr [rcx], 0 -;; bc5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bc68: 800100 add byte ptr [rcx], 0 -;; bc6b: aa stosb byte ptr [rdi], al -;; bc6c: 800100 add byte ptr [rcx], 0 -;; bc6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bc78: 800100 add byte ptr [rcx], 0 -;; bc7b: aa stosb byte ptr [rdi], al -;; bc7c: 800100 add byte ptr [rcx], 0 -;; bc7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bc88: 800100 add byte ptr [rcx], 0 -;; bc8b: aa stosb byte ptr [rdi], al -;; bc8c: 800100 add byte ptr [rcx], 0 -;; bc8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bc98: 800100 add byte ptr [rcx], 0 -;; bc9b: aa stosb byte ptr [rdi], al -;; bc9c: 800100 add byte ptr [rcx], 0 -;; bc9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bca8: 800100 add byte ptr [rcx], 0 -;; bcab: aa stosb byte ptr [rdi], al -;; bcac: 800100 add byte ptr [rcx], 0 -;; bcaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bcb8: 800100 add byte ptr [rcx], 0 -;; bcbb: aa stosb byte ptr [rdi], al -;; bcbc: 800100 add byte ptr [rcx], 0 -;; bcbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bcc8: 800100 add byte ptr [rcx], 0 -;; bccb: aa stosb byte ptr [rdi], al -;; bccc: 800100 add byte ptr [rcx], 0 -;; bccf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bcd8: 800100 add byte ptr [rcx], 0 -;; bcdb: aa stosb byte ptr [rdi], al -;; bcdc: 800100 add byte ptr [rcx], 0 -;; bcdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bce8: 800100 add byte ptr [rcx], 0 -;; bceb: aa stosb byte ptr [rdi], al -;; bcec: 800100 add byte ptr [rcx], 0 -;; bcef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bcf8: 800100 add byte ptr [rcx], 0 -;; bcfb: aa stosb byte ptr [rdi], al -;; bcfc: 800100 add byte ptr [rcx], 0 -;; bcff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bd08: 800100 add byte ptr [rcx], 0 -;; bd0b: aa stosb byte ptr [rdi], al -;; bd0c: 800100 add byte ptr [rcx], 0 -;; bd0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bd18: 800100 add byte ptr [rcx], 0 -;; bd1b: aa stosb byte ptr [rdi], al -;; bd1c: 800100 add byte ptr [rcx], 0 -;; bd1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bd28: 800100 add byte ptr [rcx], 0 -;; bd2b: aa stosb byte ptr [rdi], al -;; bd2c: 800100 add byte ptr [rcx], 0 -;; bd2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bd38: 800100 add byte ptr [rcx], 0 -;; bd3b: aa stosb byte ptr [rdi], al -;; bd3c: 800100 add byte ptr [rcx], 0 -;; bd3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bd48: 800100 add byte ptr [rcx], 0 -;; bd4b: aa stosb byte ptr [rdi], al -;; bd4c: 800100 add byte ptr [rcx], 0 -;; bd4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bd58: 800100 add byte ptr [rcx], 0 -;; bd5b: aa stosb byte ptr [rdi], al -;; bd5c: 800100 add byte ptr [rcx], 0 -;; bd5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bd68: 800100 add byte ptr [rcx], 0 -;; bd6b: aa stosb byte ptr [rdi], al -;; bd6c: 800100 add byte ptr [rcx], 0 -;; bd6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bd78: 800100 add byte ptr [rcx], 0 -;; bd7b: aa stosb byte ptr [rdi], al -;; bd7c: 800100 add byte ptr [rcx], 0 -;; bd7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bd88: 800100 add byte ptr [rcx], 0 -;; bd8b: aa stosb byte ptr [rdi], al -;; bd8c: 800100 add byte ptr [rcx], 0 -;; bd8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bd98: 800100 add byte ptr [rcx], 0 -;; bd9b: aa stosb byte ptr [rdi], al -;; bd9c: 800100 add byte ptr [rcx], 0 -;; bd9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bda8: 800100 add byte ptr [rcx], 0 -;; bdab: aa stosb byte ptr [rdi], al -;; bdac: 800100 add byte ptr [rcx], 0 -;; bdaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bdb8: 800100 add byte ptr [rcx], 0 -;; bdbb: aa stosb byte ptr [rdi], al -;; bdbc: 800100 add byte ptr [rcx], 0 -;; bdbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bdc8: 800100 add byte ptr [rcx], 0 -;; bdcb: aa stosb byte ptr [rdi], al -;; bdcc: 800100 add byte ptr [rcx], 0 -;; bdcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bdd8: 800100 add byte ptr [rcx], 0 -;; bddb: aa stosb byte ptr [rdi], al -;; bddc: 800100 add byte ptr [rcx], 0 -;; bddf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bde8: 800100 add byte ptr [rcx], 0 -;; bdeb: aa stosb byte ptr [rdi], al -;; bdec: 800100 add byte ptr [rcx], 0 -;; bdef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bdf8: 800100 add byte ptr [rcx], 0 -;; bdfb: aa stosb byte ptr [rdi], al -;; bdfc: 800100 add byte ptr [rcx], 0 -;; bdff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; be08: 800100 add byte ptr [rcx], 0 -;; be0b: aa stosb byte ptr [rdi], al -;; be0c: 800100 add byte ptr [rcx], 0 -;; be0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; be18: 800100 add byte ptr [rcx], 0 -;; be1b: aa stosb byte ptr [rdi], al -;; be1c: 800100 add byte ptr [rcx], 0 -;; be1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; be28: 800100 add byte ptr [rcx], 0 -;; be2b: aa stosb byte ptr [rdi], al -;; be2c: 800100 add byte ptr [rcx], 0 -;; be2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; be38: 800100 add byte ptr [rcx], 0 -;; be3b: aa stosb byte ptr [rdi], al -;; be3c: 800100 add byte ptr [rcx], 0 -;; be3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; be48: 800100 add byte ptr [rcx], 0 -;; be4b: aa stosb byte ptr [rdi], al -;; be4c: 800100 add byte ptr [rcx], 0 -;; be4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; be58: 800100 add byte ptr [rcx], 0 -;; be5b: aa stosb byte ptr [rdi], al -;; be5c: 800100 add byte ptr [rcx], 0 -;; be5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; be68: 800100 add byte ptr [rcx], 0 -;; be6b: aa stosb byte ptr [rdi], al -;; be6c: 800100 add byte ptr [rcx], 0 -;; be6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; be78: 800100 add byte ptr [rcx], 0 -;; be7b: aa stosb byte ptr [rdi], al -;; be7c: 800100 add byte ptr [rcx], 0 -;; be7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; be88: 800100 add byte ptr [rcx], 0 -;; be8b: aa stosb byte ptr [rdi], al -;; be8c: 800100 add byte ptr [rcx], 0 -;; be8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; be98: 800100 add byte ptr [rcx], 0 -;; be9b: aa stosb byte ptr [rdi], al -;; be9c: 800100 add byte ptr [rcx], 0 -;; be9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bea8: 800100 add byte ptr [rcx], 0 -;; beab: aa stosb byte ptr [rdi], al -;; beac: 800100 add byte ptr [rcx], 0 -;; beaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; beb8: 800100 add byte ptr [rcx], 0 -;; bebb: aa stosb byte ptr [rdi], al -;; bebc: 800100 add byte ptr [rcx], 0 -;; bebf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bec8: 800100 add byte ptr [rcx], 0 -;; becb: aa stosb byte ptr [rdi], al -;; becc: 800100 add byte ptr [rcx], 0 -;; becf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bed8: 800100 add byte ptr [rcx], 0 -;; bedb: aa stosb byte ptr [rdi], al -;; bedc: 800100 add byte ptr [rcx], 0 -;; bedf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bee8: 800100 add byte ptr [rcx], 0 -;; beeb: aa stosb byte ptr [rdi], al -;; beec: 800100 add byte ptr [rcx], 0 -;; beef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bef8: 800100 add byte ptr [rcx], 0 -;; befb: aa stosb byte ptr [rdi], al -;; befc: 800100 add byte ptr [rcx], 0 -;; beff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bf08: 800100 add byte ptr [rcx], 0 -;; bf0b: aa stosb byte ptr [rdi], al -;; bf0c: 800100 add byte ptr [rcx], 0 -;; bf0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bf18: 800100 add byte ptr [rcx], 0 -;; bf1b: aa stosb byte ptr [rdi], al -;; bf1c: 800100 add byte ptr [rcx], 0 -;; bf1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bf28: 800100 add byte ptr [rcx], 0 -;; bf2b: aa stosb byte ptr [rdi], al -;; bf2c: 800100 add byte ptr [rcx], 0 -;; bf2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bf38: 800100 add byte ptr [rcx], 0 -;; bf3b: aa stosb byte ptr [rdi], al -;; bf3c: 800100 add byte ptr [rcx], 0 -;; bf3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bf48: 800100 add byte ptr [rcx], 0 -;; bf4b: aa stosb byte ptr [rdi], al -;; bf4c: 800100 add byte ptr [rcx], 0 -;; bf4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bf58: 800100 add byte ptr [rcx], 0 -;; bf5b: aa stosb byte ptr [rdi], al -;; bf5c: 800100 add byte ptr [rcx], 0 -;; bf5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bf68: 800100 add byte ptr [rcx], 0 -;; bf6b: aa stosb byte ptr [rdi], al -;; bf6c: 800100 add byte ptr [rcx], 0 -;; bf6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bf78: 800100 add byte ptr [rcx], 0 -;; bf7b: aa stosb byte ptr [rdi], al -;; bf7c: 800100 add byte ptr [rcx], 0 -;; bf7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bf88: 800100 add byte ptr [rcx], 0 -;; bf8b: aa stosb byte ptr [rdi], al -;; bf8c: 800100 add byte ptr [rcx], 0 -;; bf8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bf98: 800100 add byte ptr [rcx], 0 -;; bf9b: aa stosb byte ptr [rdi], al -;; bf9c: 800100 add byte ptr [rcx], 0 -;; bf9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bfa8: 800100 add byte ptr [rcx], 0 -;; bfab: aa stosb byte ptr [rdi], al -;; bfac: 800100 add byte ptr [rcx], 0 -;; bfaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bfb8: 800100 add byte ptr [rcx], 0 -;; bfbb: aa stosb byte ptr [rdi], al -;; bfbc: 800100 add byte ptr [rcx], 0 -;; bfbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bfc8: 800100 add byte ptr [rcx], 0 -;; bfcb: aa stosb byte ptr [rdi], al -;; bfcc: 800100 add byte ptr [rcx], 0 -;; bfcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bfd8: 800100 add byte ptr [rcx], 0 -;; bfdb: aa stosb byte ptr [rdi], al -;; bfdc: 800100 add byte ptr [rcx], 0 -;; bfdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bfe8: 800100 add byte ptr [rcx], 0 -;; bfeb: aa stosb byte ptr [rdi], al -;; bfec: 800100 add byte ptr [rcx], 0 -;; bfef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; bff8: 800100 add byte ptr [rcx], 0 -;; bffb: aa stosb byte ptr [rdi], al -;; bffc: 800100 add byte ptr [rcx], 0 -;; bfff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c008: 800100 add byte ptr [rcx], 0 -;; c00b: aa stosb byte ptr [rdi], al -;; c00c: 800100 add byte ptr [rcx], 0 -;; c00f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c018: 800100 add byte ptr [rcx], 0 -;; c01b: aa stosb byte ptr [rdi], al -;; c01c: 800100 add byte ptr [rcx], 0 -;; c01f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c028: 800100 add byte ptr [rcx], 0 -;; c02b: aa stosb byte ptr [rdi], al -;; c02c: 800100 add byte ptr [rcx], 0 -;; c02f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c038: 800100 add byte ptr [rcx], 0 -;; c03b: aa stosb byte ptr [rdi], al -;; c03c: 800100 add byte ptr [rcx], 0 -;; c03f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c048: 800100 add byte ptr [rcx], 0 -;; c04b: aa stosb byte ptr [rdi], al -;; c04c: 800100 add byte ptr [rcx], 0 -;; c04f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c058: 800100 add byte ptr [rcx], 0 -;; c05b: aa stosb byte ptr [rdi], al -;; c05c: 800100 add byte ptr [rcx], 0 -;; c05f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c068: 800100 add byte ptr [rcx], 0 -;; c06b: aa stosb byte ptr [rdi], al -;; c06c: 800100 add byte ptr [rcx], 0 -;; c06f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c078: 800100 add byte ptr [rcx], 0 -;; c07b: aa stosb byte ptr [rdi], al -;; c07c: 800100 add byte ptr [rcx], 0 -;; c07f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c088: 800100 add byte ptr [rcx], 0 -;; c08b: aa stosb byte ptr [rdi], al -;; c08c: 800100 add byte ptr [rcx], 0 -;; c08f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c098: 800100 add byte ptr [rcx], 0 -;; c09b: aa stosb byte ptr [rdi], al -;; c09c: 800100 add byte ptr [rcx], 0 -;; c09f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c0a8: 800100 add byte ptr [rcx], 0 -;; c0ab: aa stosb byte ptr [rdi], al -;; c0ac: 800100 add byte ptr [rcx], 0 -;; c0af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c0b8: 800100 add byte ptr [rcx], 0 -;; c0bb: aa stosb byte ptr [rdi], al -;; c0bc: 800100 add byte ptr [rcx], 0 -;; c0bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c0c8: 800100 add byte ptr [rcx], 0 -;; c0cb: aa stosb byte ptr [rdi], al -;; c0cc: 800100 add byte ptr [rcx], 0 -;; c0cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c0d8: 800100 add byte ptr [rcx], 0 -;; c0db: aa stosb byte ptr [rdi], al -;; c0dc: 800100 add byte ptr [rcx], 0 -;; c0df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c0e8: 800100 add byte ptr [rcx], 0 -;; c0eb: aa stosb byte ptr [rdi], al -;; c0ec: 800100 add byte ptr [rcx], 0 -;; c0ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c0f8: 800100 add byte ptr [rcx], 0 -;; c0fb: aa stosb byte ptr [rdi], al -;; c0fc: 800100 add byte ptr [rcx], 0 -;; c0ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c108: 800100 add byte ptr [rcx], 0 -;; c10b: aa stosb byte ptr [rdi], al -;; c10c: 800100 add byte ptr [rcx], 0 -;; c10f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c118: 800100 add byte ptr [rcx], 0 -;; c11b: aa stosb byte ptr [rdi], al -;; c11c: 800100 add byte ptr [rcx], 0 -;; c11f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c128: 800100 add byte ptr [rcx], 0 -;; c12b: aa stosb byte ptr [rdi], al -;; c12c: 800100 add byte ptr [rcx], 0 -;; c12f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c138: 800100 add byte ptr [rcx], 0 -;; c13b: aa stosb byte ptr [rdi], al -;; c13c: 800100 add byte ptr [rcx], 0 -;; c13f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c148: 800100 add byte ptr [rcx], 0 -;; c14b: aa stosb byte ptr [rdi], al -;; c14c: 800100 add byte ptr [rcx], 0 -;; c14f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c158: 800100 add byte ptr [rcx], 0 -;; c15b: aa stosb byte ptr [rdi], al -;; c15c: 800100 add byte ptr [rcx], 0 -;; c15f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c168: 800100 add byte ptr [rcx], 0 -;; c16b: aa stosb byte ptr [rdi], al -;; c16c: 800100 add byte ptr [rcx], 0 -;; c16f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c178: 800100 add byte ptr [rcx], 0 -;; c17b: aa stosb byte ptr [rdi], al -;; c17c: 800100 add byte ptr [rcx], 0 -;; c17f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c188: 800100 add byte ptr [rcx], 0 -;; c18b: aa stosb byte ptr [rdi], al -;; c18c: 800100 add byte ptr [rcx], 0 -;; c18f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c198: 800100 add byte ptr [rcx], 0 -;; c19b: aa stosb byte ptr [rdi], al -;; c19c: 800100 add byte ptr [rcx], 0 -;; c19f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c1a8: 800100 add byte ptr [rcx], 0 -;; c1ab: aa stosb byte ptr [rdi], al -;; c1ac: 800100 add byte ptr [rcx], 0 -;; c1af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c1b8: 800100 add byte ptr [rcx], 0 -;; c1bb: aa stosb byte ptr [rdi], al -;; c1bc: 800100 add byte ptr [rcx], 0 -;; c1bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c1c8: 800100 add byte ptr [rcx], 0 -;; c1cb: aa stosb byte ptr [rdi], al -;; c1cc: 800100 add byte ptr [rcx], 0 -;; c1cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c1d8: 800100 add byte ptr [rcx], 0 -;; c1db: aa stosb byte ptr [rdi], al -;; c1dc: 800100 add byte ptr [rcx], 0 -;; c1df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c1e8: 800100 add byte ptr [rcx], 0 -;; c1eb: aa stosb byte ptr [rdi], al -;; c1ec: 800100 add byte ptr [rcx], 0 -;; c1ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c1f8: 800100 add byte ptr [rcx], 0 -;; c1fb: aa stosb byte ptr [rdi], al -;; c1fc: 800100 add byte ptr [rcx], 0 -;; c1ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c208: 800100 add byte ptr [rcx], 0 -;; c20b: aa stosb byte ptr [rdi], al -;; c20c: 800100 add byte ptr [rcx], 0 -;; c20f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c218: 800100 add byte ptr [rcx], 0 -;; c21b: aa stosb byte ptr [rdi], al -;; c21c: 800100 add byte ptr [rcx], 0 -;; c21f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c228: 800100 add byte ptr [rcx], 0 -;; c22b: aa stosb byte ptr [rdi], al -;; c22c: 800100 add byte ptr [rcx], 0 -;; c22f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c238: 800100 add byte ptr [rcx], 0 -;; c23b: aa stosb byte ptr [rdi], al -;; c23c: 800100 add byte ptr [rcx], 0 -;; c23f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c248: 800100 add byte ptr [rcx], 0 -;; c24b: aa stosb byte ptr [rdi], al -;; c24c: 800100 add byte ptr [rcx], 0 -;; c24f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c258: 800100 add byte ptr [rcx], 0 -;; c25b: aa stosb byte ptr [rdi], al -;; c25c: 800100 add byte ptr [rcx], 0 -;; c25f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c268: 800100 add byte ptr [rcx], 0 -;; c26b: aa stosb byte ptr [rdi], al -;; c26c: 800100 add byte ptr [rcx], 0 -;; c26f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c278: 800100 add byte ptr [rcx], 0 -;; c27b: aa stosb byte ptr [rdi], al -;; c27c: 800100 add byte ptr [rcx], 0 -;; c27f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c288: 800100 add byte ptr [rcx], 0 -;; c28b: aa stosb byte ptr [rdi], al -;; c28c: 800100 add byte ptr [rcx], 0 -;; c28f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c298: 800100 add byte ptr [rcx], 0 -;; c29b: aa stosb byte ptr [rdi], al -;; c29c: 800100 add byte ptr [rcx], 0 -;; c29f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c2a8: 800100 add byte ptr [rcx], 0 -;; c2ab: aa stosb byte ptr [rdi], al -;; c2ac: 800100 add byte ptr [rcx], 0 -;; c2af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c2b8: 800100 add byte ptr [rcx], 0 -;; c2bb: aa stosb byte ptr [rdi], al -;; c2bc: 800100 add byte ptr [rcx], 0 -;; c2bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c2c8: 800100 add byte ptr [rcx], 0 -;; c2cb: aa stosb byte ptr [rdi], al -;; c2cc: 800100 add byte ptr [rcx], 0 -;; c2cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c2d8: 800100 add byte ptr [rcx], 0 -;; c2db: aa stosb byte ptr [rdi], al -;; c2dc: 800100 add byte ptr [rcx], 0 -;; c2df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c2e8: 800100 add byte ptr [rcx], 0 -;; c2eb: aa stosb byte ptr [rdi], al -;; c2ec: 800100 add byte ptr [rcx], 0 -;; c2ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c2f8: 800100 add byte ptr [rcx], 0 -;; c2fb: aa stosb byte ptr [rdi], al -;; c2fc: 800100 add byte ptr [rcx], 0 -;; c2ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c308: 800100 add byte ptr [rcx], 0 -;; c30b: aa stosb byte ptr [rdi], al -;; c30c: 800100 add byte ptr [rcx], 0 -;; c30f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c318: 800100 add byte ptr [rcx], 0 -;; c31b: aa stosb byte ptr [rdi], al -;; c31c: 800100 add byte ptr [rcx], 0 -;; c31f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c328: 800100 add byte ptr [rcx], 0 -;; c32b: aa stosb byte ptr [rdi], al -;; c32c: 800100 add byte ptr [rcx], 0 -;; c32f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c338: 800100 add byte ptr [rcx], 0 -;; c33b: aa stosb byte ptr [rdi], al -;; c33c: 800100 add byte ptr [rcx], 0 -;; c33f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c348: 800100 add byte ptr [rcx], 0 -;; c34b: aa stosb byte ptr [rdi], al -;; c34c: 800100 add byte ptr [rcx], 0 -;; c34f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c358: 800100 add byte ptr [rcx], 0 -;; c35b: aa stosb byte ptr [rdi], al -;; c35c: 800100 add byte ptr [rcx], 0 -;; c35f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c368: 800100 add byte ptr [rcx], 0 -;; c36b: aa stosb byte ptr [rdi], al -;; c36c: 800100 add byte ptr [rcx], 0 -;; c36f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c378: 800100 add byte ptr [rcx], 0 -;; c37b: aa stosb byte ptr [rdi], al -;; c37c: 800100 add byte ptr [rcx], 0 -;; c37f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c388: 800100 add byte ptr [rcx], 0 -;; c38b: aa stosb byte ptr [rdi], al -;; c38c: 800100 add byte ptr [rcx], 0 -;; c38f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c398: 800100 add byte ptr [rcx], 0 -;; c39b: aa stosb byte ptr [rdi], al -;; c39c: 800100 add byte ptr [rcx], 0 -;; c39f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c3a8: 800100 add byte ptr [rcx], 0 -;; c3ab: aa stosb byte ptr [rdi], al -;; c3ac: 800100 add byte ptr [rcx], 0 -;; c3af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c3b8: 800100 add byte ptr [rcx], 0 -;; c3bb: aa stosb byte ptr [rdi], al -;; c3bc: 800100 add byte ptr [rcx], 0 -;; c3bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c3c8: 800100 add byte ptr [rcx], 0 -;; c3cb: aa stosb byte ptr [rdi], al -;; c3cc: 800100 add byte ptr [rcx], 0 -;; c3cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c3d8: 800100 add byte ptr [rcx], 0 -;; c3db: aa stosb byte ptr [rdi], al -;; c3dc: 800100 add byte ptr [rcx], 0 -;; c3df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c3e8: 800100 add byte ptr [rcx], 0 -;; c3eb: aa stosb byte ptr [rdi], al -;; c3ec: 800100 add byte ptr [rcx], 0 -;; c3ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c3f8: 800100 add byte ptr [rcx], 0 -;; c3fb: aa stosb byte ptr [rdi], al -;; c3fc: 800100 add byte ptr [rcx], 0 -;; c3ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c408: 800100 add byte ptr [rcx], 0 -;; c40b: aa stosb byte ptr [rdi], al -;; c40c: 800100 add byte ptr [rcx], 0 -;; c40f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c418: 800100 add byte ptr [rcx], 0 -;; c41b: aa stosb byte ptr [rdi], al -;; c41c: 800100 add byte ptr [rcx], 0 -;; c41f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c428: 800100 add byte ptr [rcx], 0 -;; c42b: aa stosb byte ptr [rdi], al -;; c42c: 800100 add byte ptr [rcx], 0 -;; c42f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c438: 800100 add byte ptr [rcx], 0 -;; c43b: aa stosb byte ptr [rdi], al -;; c43c: 800100 add byte ptr [rcx], 0 -;; c43f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c448: 800100 add byte ptr [rcx], 0 -;; c44b: aa stosb byte ptr [rdi], al -;; c44c: 800100 add byte ptr [rcx], 0 -;; c44f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c458: 800100 add byte ptr [rcx], 0 -;; c45b: aa stosb byte ptr [rdi], al -;; c45c: 800100 add byte ptr [rcx], 0 -;; c45f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c468: 800100 add byte ptr [rcx], 0 -;; c46b: aa stosb byte ptr [rdi], al -;; c46c: 800100 add byte ptr [rcx], 0 -;; c46f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c478: 800100 add byte ptr [rcx], 0 -;; c47b: aa stosb byte ptr [rdi], al -;; c47c: 800100 add byte ptr [rcx], 0 -;; c47f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c488: 800100 add byte ptr [rcx], 0 -;; c48b: aa stosb byte ptr [rdi], al -;; c48c: 800100 add byte ptr [rcx], 0 -;; c48f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c498: 800100 add byte ptr [rcx], 0 -;; c49b: aa stosb byte ptr [rdi], al -;; c49c: 800100 add byte ptr [rcx], 0 -;; c49f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c4a8: 800100 add byte ptr [rcx], 0 -;; c4ab: aa stosb byte ptr [rdi], al -;; c4ac: 800100 add byte ptr [rcx], 0 -;; c4af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c4b8: 800100 add byte ptr [rcx], 0 -;; c4bb: aa stosb byte ptr [rdi], al -;; c4bc: 800100 add byte ptr [rcx], 0 -;; c4bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c4c8: 800100 add byte ptr [rcx], 0 -;; c4cb: aa stosb byte ptr [rdi], al -;; c4cc: 800100 add byte ptr [rcx], 0 -;; c4cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c4d8: 800100 add byte ptr [rcx], 0 -;; c4db: aa stosb byte ptr [rdi], al -;; c4dc: 800100 add byte ptr [rcx], 0 -;; c4df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c4e8: 800100 add byte ptr [rcx], 0 -;; c4eb: aa stosb byte ptr [rdi], al -;; c4ec: 800100 add byte ptr [rcx], 0 -;; c4ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c4f8: 800100 add byte ptr [rcx], 0 -;; c4fb: aa stosb byte ptr [rdi], al -;; c4fc: 800100 add byte ptr [rcx], 0 -;; c4ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c508: 800100 add byte ptr [rcx], 0 -;; c50b: aa stosb byte ptr [rdi], al -;; c50c: 800100 add byte ptr [rcx], 0 -;; c50f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c518: 800100 add byte ptr [rcx], 0 -;; c51b: aa stosb byte ptr [rdi], al -;; c51c: 800100 add byte ptr [rcx], 0 -;; c51f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c528: 800100 add byte ptr [rcx], 0 -;; c52b: aa stosb byte ptr [rdi], al -;; c52c: 800100 add byte ptr [rcx], 0 -;; c52f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c538: 800100 add byte ptr [rcx], 0 -;; c53b: aa stosb byte ptr [rdi], al -;; c53c: 800100 add byte ptr [rcx], 0 -;; c53f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c548: 800100 add byte ptr [rcx], 0 -;; c54b: aa stosb byte ptr [rdi], al -;; c54c: 800100 add byte ptr [rcx], 0 -;; c54f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c558: 800100 add byte ptr [rcx], 0 -;; c55b: aa stosb byte ptr [rdi], al -;; c55c: 800100 add byte ptr [rcx], 0 -;; c55f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c568: 800100 add byte ptr [rcx], 0 -;; c56b: aa stosb byte ptr [rdi], al -;; c56c: 800100 add byte ptr [rcx], 0 -;; c56f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c578: 800100 add byte ptr [rcx], 0 -;; c57b: aa stosb byte ptr [rdi], al -;; c57c: 800100 add byte ptr [rcx], 0 -;; c57f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c588: 800100 add byte ptr [rcx], 0 -;; c58b: aa stosb byte ptr [rdi], al -;; c58c: 800100 add byte ptr [rcx], 0 -;; c58f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c598: 800100 add byte ptr [rcx], 0 -;; c59b: aa stosb byte ptr [rdi], al -;; c59c: 800100 add byte ptr [rcx], 0 -;; c59f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c5a8: 800100 add byte ptr [rcx], 0 -;; c5ab: aa stosb byte ptr [rdi], al -;; c5ac: 800100 add byte ptr [rcx], 0 -;; c5af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c5b8: 800100 add byte ptr [rcx], 0 -;; c5bb: aa stosb byte ptr [rdi], al -;; c5bc: 800100 add byte ptr [rcx], 0 -;; c5bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c5c8: 800100 add byte ptr [rcx], 0 -;; c5cb: aa stosb byte ptr [rdi], al -;; c5cc: 800100 add byte ptr [rcx], 0 -;; c5cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c5d8: 800100 add byte ptr [rcx], 0 -;; c5db: aa stosb byte ptr [rdi], al -;; c5dc: 800100 add byte ptr [rcx], 0 -;; c5df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c5e8: 800100 add byte ptr [rcx], 0 -;; c5eb: aa stosb byte ptr [rdi], al -;; c5ec: 800100 add byte ptr [rcx], 0 -;; c5ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c5f8: 800100 add byte ptr [rcx], 0 -;; c5fb: aa stosb byte ptr [rdi], al -;; c5fc: 800100 add byte ptr [rcx], 0 -;; c5ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c608: 800100 add byte ptr [rcx], 0 -;; c60b: aa stosb byte ptr [rdi], al -;; c60c: 800100 add byte ptr [rcx], 0 -;; c60f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c618: 800100 add byte ptr [rcx], 0 -;; c61b: aa stosb byte ptr [rdi], al -;; c61c: 800100 add byte ptr [rcx], 0 -;; c61f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c628: 800100 add byte ptr [rcx], 0 -;; c62b: aa stosb byte ptr [rdi], al -;; c62c: 800100 add byte ptr [rcx], 0 -;; c62f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c638: 800100 add byte ptr [rcx], 0 -;; c63b: aa stosb byte ptr [rdi], al -;; c63c: 800100 add byte ptr [rcx], 0 -;; c63f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c648: 800100 add byte ptr [rcx], 0 -;; c64b: aa stosb byte ptr [rdi], al -;; c64c: 800100 add byte ptr [rcx], 0 -;; c64f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c658: 800100 add byte ptr [rcx], 0 -;; c65b: aa stosb byte ptr [rdi], al -;; c65c: 800100 add byte ptr [rcx], 0 -;; c65f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c668: 800100 add byte ptr [rcx], 0 -;; c66b: aa stosb byte ptr [rdi], al -;; c66c: 800100 add byte ptr [rcx], 0 -;; c66f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c678: 800100 add byte ptr [rcx], 0 -;; c67b: aa stosb byte ptr [rdi], al -;; c67c: 800100 add byte ptr [rcx], 0 -;; c67f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c688: 800100 add byte ptr [rcx], 0 -;; c68b: aa stosb byte ptr [rdi], al -;; c68c: 800100 add byte ptr [rcx], 0 -;; c68f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c698: 800100 add byte ptr [rcx], 0 -;; c69b: aa stosb byte ptr [rdi], al -;; c69c: 800100 add byte ptr [rcx], 0 -;; c69f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c6a8: 800100 add byte ptr [rcx], 0 -;; c6ab: aa stosb byte ptr [rdi], al -;; c6ac: 800100 add byte ptr [rcx], 0 -;; c6af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c6b8: 800100 add byte ptr [rcx], 0 -;; c6bb: aa stosb byte ptr [rdi], al -;; c6bc: 800100 add byte ptr [rcx], 0 -;; c6bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c6c8: 800100 add byte ptr [rcx], 0 -;; c6cb: aa stosb byte ptr [rdi], al -;; c6cc: 800100 add byte ptr [rcx], 0 -;; c6cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c6d8: 800100 add byte ptr [rcx], 0 -;; c6db: aa stosb byte ptr [rdi], al -;; c6dc: 800100 add byte ptr [rcx], 0 -;; c6df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c6e8: 800100 add byte ptr [rcx], 0 -;; c6eb: aa stosb byte ptr [rdi], al -;; c6ec: 800100 add byte ptr [rcx], 0 -;; c6ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c6f8: 800100 add byte ptr [rcx], 0 -;; c6fb: aa stosb byte ptr [rdi], al -;; c6fc: 800100 add byte ptr [rcx], 0 -;; c6ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c708: 800100 add byte ptr [rcx], 0 -;; c70b: aa stosb byte ptr [rdi], al -;; c70c: 800100 add byte ptr [rcx], 0 -;; c70f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c718: 800100 add byte ptr [rcx], 0 -;; c71b: aa stosb byte ptr [rdi], al -;; c71c: 800100 add byte ptr [rcx], 0 -;; c71f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c728: 800100 add byte ptr [rcx], 0 -;; c72b: aa stosb byte ptr [rdi], al -;; c72c: 800100 add byte ptr [rcx], 0 -;; c72f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c738: 800100 add byte ptr [rcx], 0 -;; c73b: aa stosb byte ptr [rdi], al -;; c73c: 800100 add byte ptr [rcx], 0 -;; c73f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c748: 800100 add byte ptr [rcx], 0 -;; c74b: aa stosb byte ptr [rdi], al -;; c74c: 800100 add byte ptr [rcx], 0 -;; c74f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c758: 800100 add byte ptr [rcx], 0 -;; c75b: aa stosb byte ptr [rdi], al -;; c75c: 800100 add byte ptr [rcx], 0 -;; c75f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c768: 800100 add byte ptr [rcx], 0 -;; c76b: aa stosb byte ptr [rdi], al -;; c76c: 800100 add byte ptr [rcx], 0 -;; c76f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c778: 800100 add byte ptr [rcx], 0 -;; c77b: aa stosb byte ptr [rdi], al -;; c77c: 800100 add byte ptr [rcx], 0 -;; c77f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c788: 800100 add byte ptr [rcx], 0 -;; c78b: aa stosb byte ptr [rdi], al -;; c78c: 800100 add byte ptr [rcx], 0 -;; c78f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c798: 800100 add byte ptr [rcx], 0 -;; c79b: aa stosb byte ptr [rdi], al -;; c79c: 800100 add byte ptr [rcx], 0 -;; c79f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c7a8: 800100 add byte ptr [rcx], 0 -;; c7ab: aa stosb byte ptr [rdi], al -;; c7ac: 800100 add byte ptr [rcx], 0 -;; c7af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c7b8: 800100 add byte ptr [rcx], 0 -;; c7bb: aa stosb byte ptr [rdi], al -;; c7bc: 800100 add byte ptr [rcx], 0 -;; c7bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c7c8: 800100 add byte ptr [rcx], 0 -;; c7cb: aa stosb byte ptr [rdi], al -;; c7cc: 800100 add byte ptr [rcx], 0 -;; c7cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c7d8: 800100 add byte ptr [rcx], 0 -;; c7db: aa stosb byte ptr [rdi], al -;; c7dc: 800100 add byte ptr [rcx], 0 -;; c7df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c7e8: 800100 add byte ptr [rcx], 0 -;; c7eb: aa stosb byte ptr [rdi], al -;; c7ec: 800100 add byte ptr [rcx], 0 -;; c7ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c7f8: 800100 add byte ptr [rcx], 0 -;; c7fb: aa stosb byte ptr [rdi], al -;; c7fc: 800100 add byte ptr [rcx], 0 -;; c7ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c808: 800100 add byte ptr [rcx], 0 -;; c80b: aa stosb byte ptr [rdi], al -;; c80c: 800100 add byte ptr [rcx], 0 -;; c80f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c818: 800100 add byte ptr [rcx], 0 -;; c81b: aa stosb byte ptr [rdi], al -;; c81c: 800100 add byte ptr [rcx], 0 -;; c81f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c828: 800100 add byte ptr [rcx], 0 -;; c82b: aa stosb byte ptr [rdi], al -;; c82c: 800100 add byte ptr [rcx], 0 -;; c82f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c838: 800100 add byte ptr [rcx], 0 -;; c83b: aa stosb byte ptr [rdi], al -;; c83c: 800100 add byte ptr [rcx], 0 -;; c83f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c848: 800100 add byte ptr [rcx], 0 -;; c84b: aa stosb byte ptr [rdi], al -;; c84c: 800100 add byte ptr [rcx], 0 -;; c84f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c858: 800100 add byte ptr [rcx], 0 -;; c85b: aa stosb byte ptr [rdi], al -;; c85c: 800100 add byte ptr [rcx], 0 -;; c85f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c868: 800100 add byte ptr [rcx], 0 -;; c86b: aa stosb byte ptr [rdi], al -;; c86c: 800100 add byte ptr [rcx], 0 -;; c86f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c878: 800100 add byte ptr [rcx], 0 -;; c87b: aa stosb byte ptr [rdi], al -;; c87c: 800100 add byte ptr [rcx], 0 -;; c87f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c888: 800100 add byte ptr [rcx], 0 -;; c88b: aa stosb byte ptr [rdi], al -;; c88c: 800100 add byte ptr [rcx], 0 -;; c88f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c898: 800100 add byte ptr [rcx], 0 -;; c89b: aa stosb byte ptr [rdi], al -;; c89c: 800100 add byte ptr [rcx], 0 -;; c89f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c8a8: 800100 add byte ptr [rcx], 0 -;; c8ab: aa stosb byte ptr [rdi], al -;; c8ac: 800100 add byte ptr [rcx], 0 -;; c8af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c8b8: 800100 add byte ptr [rcx], 0 -;; c8bb: aa stosb byte ptr [rdi], al -;; c8bc: 800100 add byte ptr [rcx], 0 -;; c8bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c8c8: 800100 add byte ptr [rcx], 0 -;; c8cb: aa stosb byte ptr [rdi], al -;; c8cc: 800100 add byte ptr [rcx], 0 -;; c8cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c8d8: 800100 add byte ptr [rcx], 0 -;; c8db: aa stosb byte ptr [rdi], al -;; c8dc: 800100 add byte ptr [rcx], 0 -;; c8df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c8e8: 800100 add byte ptr [rcx], 0 -;; c8eb: aa stosb byte ptr [rdi], al -;; c8ec: 800100 add byte ptr [rcx], 0 -;; c8ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c8f8: 800100 add byte ptr [rcx], 0 -;; c8fb: aa stosb byte ptr [rdi], al -;; c8fc: 800100 add byte ptr [rcx], 0 -;; c8ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c908: 800100 add byte ptr [rcx], 0 -;; c90b: aa stosb byte ptr [rdi], al -;; c90c: 800100 add byte ptr [rcx], 0 -;; c90f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c918: 800100 add byte ptr [rcx], 0 -;; c91b: aa stosb byte ptr [rdi], al -;; c91c: 800100 add byte ptr [rcx], 0 -;; c91f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c928: 800100 add byte ptr [rcx], 0 -;; c92b: aa stosb byte ptr [rdi], al -;; c92c: 800100 add byte ptr [rcx], 0 -;; c92f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c938: 800100 add byte ptr [rcx], 0 -;; c93b: aa stosb byte ptr [rdi], al -;; c93c: 800100 add byte ptr [rcx], 0 -;; c93f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c948: 800100 add byte ptr [rcx], 0 -;; c94b: aa stosb byte ptr [rdi], al -;; c94c: 800100 add byte ptr [rcx], 0 -;; c94f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c958: 800100 add byte ptr [rcx], 0 -;; c95b: aa stosb byte ptr [rdi], al -;; c95c: 800100 add byte ptr [rcx], 0 -;; c95f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c968: 800100 add byte ptr [rcx], 0 -;; c96b: aa stosb byte ptr [rdi], al -;; c96c: 800100 add byte ptr [rcx], 0 -;; c96f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c978: 800100 add byte ptr [rcx], 0 -;; c97b: aa stosb byte ptr [rdi], al -;; c97c: 800100 add byte ptr [rcx], 0 -;; c97f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c988: 800100 add byte ptr [rcx], 0 -;; c98b: aa stosb byte ptr [rdi], al -;; c98c: 800100 add byte ptr [rcx], 0 -;; c98f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c998: 800100 add byte ptr [rcx], 0 -;; c99b: aa stosb byte ptr [rdi], al -;; c99c: 800100 add byte ptr [rcx], 0 -;; c99f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c9a8: 800100 add byte ptr [rcx], 0 -;; c9ab: aa stosb byte ptr [rdi], al -;; c9ac: 800100 add byte ptr [rcx], 0 -;; c9af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c9b8: 800100 add byte ptr [rcx], 0 -;; c9bb: aa stosb byte ptr [rdi], al -;; c9bc: 800100 add byte ptr [rcx], 0 -;; c9bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c9c8: 800100 add byte ptr [rcx], 0 -;; c9cb: aa stosb byte ptr [rdi], al -;; c9cc: 800100 add byte ptr [rcx], 0 -;; c9cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c9d8: 800100 add byte ptr [rcx], 0 -;; c9db: aa stosb byte ptr [rdi], al -;; c9dc: 800100 add byte ptr [rcx], 0 -;; c9df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c9e8: 800100 add byte ptr [rcx], 0 -;; c9eb: aa stosb byte ptr [rdi], al -;; c9ec: 800100 add byte ptr [rcx], 0 -;; c9ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; c9f8: 800100 add byte ptr [rcx], 0 -;; c9fb: aa stosb byte ptr [rdi], al -;; c9fc: 800100 add byte ptr [rcx], 0 -;; c9ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ca08: 800100 add byte ptr [rcx], 0 -;; ca0b: aa stosb byte ptr [rdi], al -;; ca0c: 800100 add byte ptr [rcx], 0 -;; ca0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ca18: 800100 add byte ptr [rcx], 0 -;; ca1b: aa stosb byte ptr [rdi], al -;; ca1c: 800100 add byte ptr [rcx], 0 -;; ca1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ca28: 800100 add byte ptr [rcx], 0 -;; ca2b: aa stosb byte ptr [rdi], al -;; ca2c: 800100 add byte ptr [rcx], 0 -;; ca2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ca38: 800100 add byte ptr [rcx], 0 -;; ca3b: aa stosb byte ptr [rdi], al -;; ca3c: 800100 add byte ptr [rcx], 0 -;; ca3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ca48: 800100 add byte ptr [rcx], 0 -;; ca4b: aa stosb byte ptr [rdi], al -;; ca4c: 800100 add byte ptr [rcx], 0 -;; ca4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ca58: 800100 add byte ptr [rcx], 0 -;; ca5b: aa stosb byte ptr [rdi], al -;; ca5c: 800100 add byte ptr [rcx], 0 -;; ca5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ca68: 800100 add byte ptr [rcx], 0 -;; ca6b: aa stosb byte ptr [rdi], al -;; ca6c: 800100 add byte ptr [rcx], 0 -;; ca6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ca78: 800100 add byte ptr [rcx], 0 -;; ca7b: aa stosb byte ptr [rdi], al -;; ca7c: 800100 add byte ptr [rcx], 0 -;; ca7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ca88: 800100 add byte ptr [rcx], 0 -;; ca8b: aa stosb byte ptr [rdi], al -;; ca8c: 800100 add byte ptr [rcx], 0 -;; ca8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ca98: 800100 add byte ptr [rcx], 0 -;; ca9b: aa stosb byte ptr [rdi], al -;; ca9c: 800100 add byte ptr [rcx], 0 -;; ca9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; caa8: 800100 add byte ptr [rcx], 0 -;; caab: aa stosb byte ptr [rdi], al -;; caac: 800100 add byte ptr [rcx], 0 -;; caaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cab8: 800100 add byte ptr [rcx], 0 -;; cabb: aa stosb byte ptr [rdi], al -;; cabc: 800100 add byte ptr [rcx], 0 -;; cabf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cac8: 800100 add byte ptr [rcx], 0 -;; cacb: aa stosb byte ptr [rdi], al -;; cacc: 800100 add byte ptr [rcx], 0 -;; cacf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cad8: 800100 add byte ptr [rcx], 0 -;; cadb: aa stosb byte ptr [rdi], al -;; cadc: 800100 add byte ptr [rcx], 0 -;; cadf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cae8: 800100 add byte ptr [rcx], 0 -;; caeb: aa stosb byte ptr [rdi], al -;; caec: 800100 add byte ptr [rcx], 0 -;; caef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; caf8: 800100 add byte ptr [rcx], 0 -;; cafb: aa stosb byte ptr [rdi], al -;; cafc: 800100 add byte ptr [rcx], 0 -;; caff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cb08: 800100 add byte ptr [rcx], 0 -;; cb0b: aa stosb byte ptr [rdi], al -;; cb0c: 800100 add byte ptr [rcx], 0 -;; cb0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cb18: 800100 add byte ptr [rcx], 0 -;; cb1b: aa stosb byte ptr [rdi], al -;; cb1c: 800100 add byte ptr [rcx], 0 -;; cb1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cb28: 800100 add byte ptr [rcx], 0 -;; cb2b: aa stosb byte ptr [rdi], al -;; cb2c: 800100 add byte ptr [rcx], 0 -;; cb2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cb38: 800100 add byte ptr [rcx], 0 -;; cb3b: aa stosb byte ptr [rdi], al -;; cb3c: 800100 add byte ptr [rcx], 0 -;; cb3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cb48: 800100 add byte ptr [rcx], 0 -;; cb4b: aa stosb byte ptr [rdi], al -;; cb4c: 800100 add byte ptr [rcx], 0 -;; cb4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cb58: 800100 add byte ptr [rcx], 0 -;; cb5b: aa stosb byte ptr [rdi], al -;; cb5c: 800100 add byte ptr [rcx], 0 -;; cb5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cb68: 800100 add byte ptr [rcx], 0 -;; cb6b: aa stosb byte ptr [rdi], al -;; cb6c: 800100 add byte ptr [rcx], 0 -;; cb6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cb78: 800100 add byte ptr [rcx], 0 -;; cb7b: aa stosb byte ptr [rdi], al -;; cb7c: 800100 add byte ptr [rcx], 0 -;; cb7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cb88: 800100 add byte ptr [rcx], 0 -;; cb8b: aa stosb byte ptr [rdi], al -;; cb8c: 800100 add byte ptr [rcx], 0 -;; cb8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cb98: 800100 add byte ptr [rcx], 0 -;; cb9b: aa stosb byte ptr [rdi], al -;; cb9c: 800100 add byte ptr [rcx], 0 -;; cb9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cba8: 800100 add byte ptr [rcx], 0 -;; cbab: aa stosb byte ptr [rdi], al -;; cbac: 800100 add byte ptr [rcx], 0 -;; cbaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cbb8: 800100 add byte ptr [rcx], 0 -;; cbbb: aa stosb byte ptr [rdi], al -;; cbbc: 800100 add byte ptr [rcx], 0 -;; cbbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cbc8: 800100 add byte ptr [rcx], 0 -;; cbcb: aa stosb byte ptr [rdi], al -;; cbcc: 800100 add byte ptr [rcx], 0 -;; cbcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cbd8: 800100 add byte ptr [rcx], 0 -;; cbdb: aa stosb byte ptr [rdi], al -;; cbdc: 800100 add byte ptr [rcx], 0 -;; cbdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cbe8: 800100 add byte ptr [rcx], 0 -;; cbeb: aa stosb byte ptr [rdi], al -;; cbec: 800100 add byte ptr [rcx], 0 -;; cbef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cbf8: 800100 add byte ptr [rcx], 0 -;; cbfb: aa stosb byte ptr [rdi], al -;; cbfc: 800100 add byte ptr [rcx], 0 -;; cbff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cc08: 800100 add byte ptr [rcx], 0 -;; cc0b: aa stosb byte ptr [rdi], al -;; cc0c: 800100 add byte ptr [rcx], 0 -;; cc0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cc18: 800100 add byte ptr [rcx], 0 -;; cc1b: aa stosb byte ptr [rdi], al -;; cc1c: 800100 add byte ptr [rcx], 0 -;; cc1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cc28: 800100 add byte ptr [rcx], 0 -;; cc2b: aa stosb byte ptr [rdi], al -;; cc2c: 800100 add byte ptr [rcx], 0 -;; cc2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cc38: 800100 add byte ptr [rcx], 0 -;; cc3b: aa stosb byte ptr [rdi], al -;; cc3c: 800100 add byte ptr [rcx], 0 -;; cc3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cc48: 800100 add byte ptr [rcx], 0 -;; cc4b: aa stosb byte ptr [rdi], al -;; cc4c: 800100 add byte ptr [rcx], 0 -;; cc4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cc58: 800100 add byte ptr [rcx], 0 -;; cc5b: aa stosb byte ptr [rdi], al -;; cc5c: 800100 add byte ptr [rcx], 0 -;; cc5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cc68: 800100 add byte ptr [rcx], 0 -;; cc6b: aa stosb byte ptr [rdi], al -;; cc6c: 800100 add byte ptr [rcx], 0 -;; cc6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cc78: 800100 add byte ptr [rcx], 0 -;; cc7b: aa stosb byte ptr [rdi], al -;; cc7c: 800100 add byte ptr [rcx], 0 -;; cc7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cc88: 800100 add byte ptr [rcx], 0 -;; cc8b: aa stosb byte ptr [rdi], al -;; cc8c: 800100 add byte ptr [rcx], 0 -;; cc8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cc98: 800100 add byte ptr [rcx], 0 -;; cc9b: aa stosb byte ptr [rdi], al -;; cc9c: 800100 add byte ptr [rcx], 0 -;; cc9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cca8: 800100 add byte ptr [rcx], 0 -;; ccab: aa stosb byte ptr [rdi], al -;; ccac: 800100 add byte ptr [rcx], 0 -;; ccaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ccb8: 800100 add byte ptr [rcx], 0 -;; ccbb: aa stosb byte ptr [rdi], al -;; ccbc: 800100 add byte ptr [rcx], 0 -;; ccbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ccc8: 800100 add byte ptr [rcx], 0 -;; cccb: aa stosb byte ptr [rdi], al -;; cccc: 800100 add byte ptr [rcx], 0 -;; cccf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ccd8: 800100 add byte ptr [rcx], 0 -;; ccdb: aa stosb byte ptr [rdi], al -;; ccdc: 800100 add byte ptr [rcx], 0 -;; ccdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cce8: 800100 add byte ptr [rcx], 0 -;; cceb: aa stosb byte ptr [rdi], al -;; ccec: 800100 add byte ptr [rcx], 0 -;; ccef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ccf8: 800100 add byte ptr [rcx], 0 -;; ccfb: aa stosb byte ptr [rdi], al -;; ccfc: 800100 add byte ptr [rcx], 0 -;; ccff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cd08: 800100 add byte ptr [rcx], 0 -;; cd0b: aa stosb byte ptr [rdi], al -;; cd0c: 800100 add byte ptr [rcx], 0 -;; cd0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cd18: 800100 add byte ptr [rcx], 0 -;; cd1b: aa stosb byte ptr [rdi], al -;; cd1c: 800100 add byte ptr [rcx], 0 -;; cd1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cd28: 800100 add byte ptr [rcx], 0 -;; cd2b: aa stosb byte ptr [rdi], al -;; cd2c: 800100 add byte ptr [rcx], 0 -;; cd2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cd38: 800100 add byte ptr [rcx], 0 -;; cd3b: aa stosb byte ptr [rdi], al -;; cd3c: 800100 add byte ptr [rcx], 0 -;; cd3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cd48: 800100 add byte ptr [rcx], 0 -;; cd4b: aa stosb byte ptr [rdi], al -;; cd4c: 800100 add byte ptr [rcx], 0 -;; cd4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cd58: 800100 add byte ptr [rcx], 0 -;; cd5b: aa stosb byte ptr [rdi], al -;; cd5c: 800100 add byte ptr [rcx], 0 -;; cd5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cd68: 800100 add byte ptr [rcx], 0 -;; cd6b: aa stosb byte ptr [rdi], al -;; cd6c: 800100 add byte ptr [rcx], 0 -;; cd6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cd78: 800100 add byte ptr [rcx], 0 -;; cd7b: aa stosb byte ptr [rdi], al -;; cd7c: 800100 add byte ptr [rcx], 0 -;; cd7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cd88: 800100 add byte ptr [rcx], 0 -;; cd8b: aa stosb byte ptr [rdi], al -;; cd8c: 800100 add byte ptr [rcx], 0 -;; cd8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cd98: 800100 add byte ptr [rcx], 0 -;; cd9b: aa stosb byte ptr [rdi], al -;; cd9c: 800100 add byte ptr [rcx], 0 -;; cd9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cda8: 800100 add byte ptr [rcx], 0 -;; cdab: aa stosb byte ptr [rdi], al -;; cdac: 800100 add byte ptr [rcx], 0 -;; cdaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cdb8: 800100 add byte ptr [rcx], 0 -;; cdbb: aa stosb byte ptr [rdi], al -;; cdbc: 800100 add byte ptr [rcx], 0 -;; cdbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cdc8: 800100 add byte ptr [rcx], 0 -;; cdcb: aa stosb byte ptr [rdi], al -;; cdcc: 800100 add byte ptr [rcx], 0 -;; cdcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cdd8: 800100 add byte ptr [rcx], 0 -;; cddb: aa stosb byte ptr [rdi], al -;; cddc: 800100 add byte ptr [rcx], 0 -;; cddf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cde8: 800100 add byte ptr [rcx], 0 -;; cdeb: aa stosb byte ptr [rdi], al -;; cdec: 800100 add byte ptr [rcx], 0 -;; cdef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cdf8: 800100 add byte ptr [rcx], 0 -;; cdfb: aa stosb byte ptr [rdi], al -;; cdfc: 800100 add byte ptr [rcx], 0 -;; cdff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ce08: 800100 add byte ptr [rcx], 0 -;; ce0b: aa stosb byte ptr [rdi], al -;; ce0c: 800100 add byte ptr [rcx], 0 -;; ce0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ce18: 800100 add byte ptr [rcx], 0 -;; ce1b: aa stosb byte ptr [rdi], al -;; ce1c: 800100 add byte ptr [rcx], 0 -;; ce1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ce28: 800100 add byte ptr [rcx], 0 -;; ce2b: aa stosb byte ptr [rdi], al -;; ce2c: 800100 add byte ptr [rcx], 0 -;; ce2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ce38: 800100 add byte ptr [rcx], 0 -;; ce3b: aa stosb byte ptr [rdi], al -;; ce3c: 800100 add byte ptr [rcx], 0 -;; ce3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ce48: 800100 add byte ptr [rcx], 0 -;; ce4b: aa stosb byte ptr [rdi], al -;; ce4c: 800100 add byte ptr [rcx], 0 -;; ce4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ce58: 800100 add byte ptr [rcx], 0 -;; ce5b: aa stosb byte ptr [rdi], al -;; ce5c: 800100 add byte ptr [rcx], 0 -;; ce5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ce68: 800100 add byte ptr [rcx], 0 -;; ce6b: aa stosb byte ptr [rdi], al -;; ce6c: 800100 add byte ptr [rcx], 0 -;; ce6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ce78: 800100 add byte ptr [rcx], 0 -;; ce7b: aa stosb byte ptr [rdi], al -;; ce7c: 800100 add byte ptr [rcx], 0 -;; ce7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ce88: 800100 add byte ptr [rcx], 0 -;; ce8b: aa stosb byte ptr [rdi], al -;; ce8c: 800100 add byte ptr [rcx], 0 -;; ce8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ce98: 800100 add byte ptr [rcx], 0 -;; ce9b: aa stosb byte ptr [rdi], al -;; ce9c: 800100 add byte ptr [rcx], 0 -;; ce9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cea8: 800100 add byte ptr [rcx], 0 -;; ceab: aa stosb byte ptr [rdi], al -;; ceac: 800100 add byte ptr [rcx], 0 -;; ceaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ceb8: 800100 add byte ptr [rcx], 0 -;; cebb: aa stosb byte ptr [rdi], al -;; cebc: 800100 add byte ptr [rcx], 0 -;; cebf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cec8: 800100 add byte ptr [rcx], 0 -;; cecb: aa stosb byte ptr [rdi], al -;; cecc: 800100 add byte ptr [rcx], 0 -;; cecf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ced8: 800100 add byte ptr [rcx], 0 -;; cedb: aa stosb byte ptr [rdi], al -;; cedc: 800100 add byte ptr [rcx], 0 -;; cedf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cee8: 800100 add byte ptr [rcx], 0 -;; ceeb: aa stosb byte ptr [rdi], al -;; ceec: 800100 add byte ptr [rcx], 0 -;; ceef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cef8: 800100 add byte ptr [rcx], 0 -;; cefb: aa stosb byte ptr [rdi], al -;; cefc: 800100 add byte ptr [rcx], 0 -;; ceff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cf08: 800100 add byte ptr [rcx], 0 -;; cf0b: aa stosb byte ptr [rdi], al -;; cf0c: 800100 add byte ptr [rcx], 0 -;; cf0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cf18: 800100 add byte ptr [rcx], 0 -;; cf1b: aa stosb byte ptr [rdi], al -;; cf1c: 800100 add byte ptr [rcx], 0 -;; cf1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cf28: 800100 add byte ptr [rcx], 0 -;; cf2b: aa stosb byte ptr [rdi], al -;; cf2c: 800100 add byte ptr [rcx], 0 -;; cf2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cf38: 800100 add byte ptr [rcx], 0 -;; cf3b: aa stosb byte ptr [rdi], al -;; cf3c: 800100 add byte ptr [rcx], 0 -;; cf3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cf48: 800100 add byte ptr [rcx], 0 -;; cf4b: aa stosb byte ptr [rdi], al -;; cf4c: 800100 add byte ptr [rcx], 0 -;; cf4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cf58: 800100 add byte ptr [rcx], 0 -;; cf5b: aa stosb byte ptr [rdi], al -;; cf5c: 800100 add byte ptr [rcx], 0 -;; cf5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cf68: 800100 add byte ptr [rcx], 0 -;; cf6b: aa stosb byte ptr [rdi], al -;; cf6c: 800100 add byte ptr [rcx], 0 -;; cf6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cf78: 800100 add byte ptr [rcx], 0 -;; cf7b: aa stosb byte ptr [rdi], al -;; cf7c: 800100 add byte ptr [rcx], 0 -;; cf7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cf88: 800100 add byte ptr [rcx], 0 -;; cf8b: aa stosb byte ptr [rdi], al -;; cf8c: 800100 add byte ptr [rcx], 0 -;; cf8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cf98: 800100 add byte ptr [rcx], 0 -;; cf9b: aa stosb byte ptr [rdi], al -;; cf9c: 800100 add byte ptr [rcx], 0 -;; cf9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cfa8: 800100 add byte ptr [rcx], 0 -;; cfab: aa stosb byte ptr [rdi], al -;; cfac: 800100 add byte ptr [rcx], 0 -;; cfaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cfb8: 800100 add byte ptr [rcx], 0 -;; cfbb: aa stosb byte ptr [rdi], al -;; cfbc: 800100 add byte ptr [rcx], 0 -;; cfbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cfc8: 800100 add byte ptr [rcx], 0 -;; cfcb: aa stosb byte ptr [rdi], al -;; cfcc: 800100 add byte ptr [rcx], 0 -;; cfcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cfd8: 800100 add byte ptr [rcx], 0 -;; cfdb: aa stosb byte ptr [rdi], al -;; cfdc: 800100 add byte ptr [rcx], 0 -;; cfdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cfe8: 800100 add byte ptr [rcx], 0 -;; cfeb: aa stosb byte ptr [rdi], al -;; cfec: 800100 add byte ptr [rcx], 0 -;; cfef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; cff8: 800100 add byte ptr [rcx], 0 -;; cffb: aa stosb byte ptr [rdi], al -;; cffc: 800100 add byte ptr [rcx], 0 -;; cfff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d008: 800100 add byte ptr [rcx], 0 -;; d00b: aa stosb byte ptr [rdi], al -;; d00c: 800100 add byte ptr [rcx], 0 -;; d00f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d018: 800100 add byte ptr [rcx], 0 -;; d01b: aa stosb byte ptr [rdi], al -;; d01c: 800100 add byte ptr [rcx], 0 -;; d01f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d028: 800100 add byte ptr [rcx], 0 -;; d02b: aa stosb byte ptr [rdi], al -;; d02c: 800100 add byte ptr [rcx], 0 -;; d02f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d038: 800100 add byte ptr [rcx], 0 -;; d03b: aa stosb byte ptr [rdi], al -;; d03c: 800100 add byte ptr [rcx], 0 -;; d03f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d048: 800100 add byte ptr [rcx], 0 -;; d04b: aa stosb byte ptr [rdi], al -;; d04c: 800100 add byte ptr [rcx], 0 -;; d04f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d058: 800100 add byte ptr [rcx], 0 -;; d05b: aa stosb byte ptr [rdi], al -;; d05c: 800100 add byte ptr [rcx], 0 -;; d05f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d068: 800100 add byte ptr [rcx], 0 -;; d06b: aa stosb byte ptr [rdi], al -;; d06c: 800100 add byte ptr [rcx], 0 -;; d06f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d078: 800100 add byte ptr [rcx], 0 -;; d07b: aa stosb byte ptr [rdi], al -;; d07c: 800100 add byte ptr [rcx], 0 -;; d07f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d088: 800100 add byte ptr [rcx], 0 -;; d08b: aa stosb byte ptr [rdi], al -;; d08c: 800100 add byte ptr [rcx], 0 -;; d08f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d098: 800100 add byte ptr [rcx], 0 -;; d09b: aa stosb byte ptr [rdi], al -;; d09c: 800100 add byte ptr [rcx], 0 -;; d09f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d0a8: 800100 add byte ptr [rcx], 0 -;; d0ab: aa stosb byte ptr [rdi], al -;; d0ac: 800100 add byte ptr [rcx], 0 -;; d0af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d0b8: 800100 add byte ptr [rcx], 0 -;; d0bb: aa stosb byte ptr [rdi], al -;; d0bc: 800100 add byte ptr [rcx], 0 -;; d0bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d0c8: 800100 add byte ptr [rcx], 0 -;; d0cb: aa stosb byte ptr [rdi], al -;; d0cc: 800100 add byte ptr [rcx], 0 -;; d0cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d0d8: 800100 add byte ptr [rcx], 0 -;; d0db: aa stosb byte ptr [rdi], al -;; d0dc: 800100 add byte ptr [rcx], 0 -;; d0df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d0e8: 800100 add byte ptr [rcx], 0 -;; d0eb: aa stosb byte ptr [rdi], al -;; d0ec: 800100 add byte ptr [rcx], 0 -;; d0ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d0f8: 800100 add byte ptr [rcx], 0 -;; d0fb: aa stosb byte ptr [rdi], al -;; d0fc: 800100 add byte ptr [rcx], 0 -;; d0ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d108: 800100 add byte ptr [rcx], 0 -;; d10b: aa stosb byte ptr [rdi], al -;; d10c: 800100 add byte ptr [rcx], 0 -;; d10f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d118: 800100 add byte ptr [rcx], 0 -;; d11b: aa stosb byte ptr [rdi], al -;; d11c: 800100 add byte ptr [rcx], 0 -;; d11f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d128: 800100 add byte ptr [rcx], 0 -;; d12b: aa stosb byte ptr [rdi], al -;; d12c: 800100 add byte ptr [rcx], 0 -;; d12f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d138: 800100 add byte ptr [rcx], 0 -;; d13b: aa stosb byte ptr [rdi], al -;; d13c: 800100 add byte ptr [rcx], 0 -;; d13f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d148: 800100 add byte ptr [rcx], 0 -;; d14b: aa stosb byte ptr [rdi], al -;; d14c: 800100 add byte ptr [rcx], 0 -;; d14f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d158: 800100 add byte ptr [rcx], 0 -;; d15b: aa stosb byte ptr [rdi], al -;; d15c: 800100 add byte ptr [rcx], 0 -;; d15f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d168: 800100 add byte ptr [rcx], 0 -;; d16b: aa stosb byte ptr [rdi], al -;; d16c: 800100 add byte ptr [rcx], 0 -;; d16f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d178: 800100 add byte ptr [rcx], 0 -;; d17b: aa stosb byte ptr [rdi], al -;; d17c: 800100 add byte ptr [rcx], 0 -;; d17f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d188: 800100 add byte ptr [rcx], 0 -;; d18b: aa stosb byte ptr [rdi], al -;; d18c: 800100 add byte ptr [rcx], 0 -;; d18f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d198: 800100 add byte ptr [rcx], 0 -;; d19b: aa stosb byte ptr [rdi], al -;; d19c: 800100 add byte ptr [rcx], 0 -;; d19f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d1a8: 800100 add byte ptr [rcx], 0 -;; d1ab: aa stosb byte ptr [rdi], al -;; d1ac: 800100 add byte ptr [rcx], 0 -;; d1af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d1b8: 800100 add byte ptr [rcx], 0 -;; d1bb: aa stosb byte ptr [rdi], al -;; d1bc: 800100 add byte ptr [rcx], 0 -;; d1bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d1c8: 800100 add byte ptr [rcx], 0 -;; d1cb: aa stosb byte ptr [rdi], al -;; d1cc: 800100 add byte ptr [rcx], 0 -;; d1cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d1d8: 800100 add byte ptr [rcx], 0 -;; d1db: aa stosb byte ptr [rdi], al -;; d1dc: 800100 add byte ptr [rcx], 0 -;; d1df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d1e8: 800100 add byte ptr [rcx], 0 -;; d1eb: aa stosb byte ptr [rdi], al -;; d1ec: 800100 add byte ptr [rcx], 0 -;; d1ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d1f8: 800100 add byte ptr [rcx], 0 -;; d1fb: aa stosb byte ptr [rdi], al -;; d1fc: 800100 add byte ptr [rcx], 0 -;; d1ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d208: 800100 add byte ptr [rcx], 0 -;; d20b: aa stosb byte ptr [rdi], al -;; d20c: 800100 add byte ptr [rcx], 0 -;; d20f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d218: 800100 add byte ptr [rcx], 0 -;; d21b: aa stosb byte ptr [rdi], al -;; d21c: 800100 add byte ptr [rcx], 0 -;; d21f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d228: 800100 add byte ptr [rcx], 0 -;; d22b: aa stosb byte ptr [rdi], al -;; d22c: 800100 add byte ptr [rcx], 0 -;; d22f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d238: 800100 add byte ptr [rcx], 0 -;; d23b: aa stosb byte ptr [rdi], al -;; d23c: 800100 add byte ptr [rcx], 0 -;; d23f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d248: 800100 add byte ptr [rcx], 0 -;; d24b: aa stosb byte ptr [rdi], al -;; d24c: 800100 add byte ptr [rcx], 0 -;; d24f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d258: 800100 add byte ptr [rcx], 0 -;; d25b: aa stosb byte ptr [rdi], al -;; d25c: 800100 add byte ptr [rcx], 0 -;; d25f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d268: 800100 add byte ptr [rcx], 0 -;; d26b: aa stosb byte ptr [rdi], al -;; d26c: 800100 add byte ptr [rcx], 0 -;; d26f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d278: 800100 add byte ptr [rcx], 0 -;; d27b: aa stosb byte ptr [rdi], al -;; d27c: 800100 add byte ptr [rcx], 0 -;; d27f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d288: 800100 add byte ptr [rcx], 0 -;; d28b: aa stosb byte ptr [rdi], al -;; d28c: 800100 add byte ptr [rcx], 0 -;; d28f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d298: 800100 add byte ptr [rcx], 0 -;; d29b: aa stosb byte ptr [rdi], al -;; d29c: 800100 add byte ptr [rcx], 0 -;; d29f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d2a8: 800100 add byte ptr [rcx], 0 -;; d2ab: aa stosb byte ptr [rdi], al -;; d2ac: 800100 add byte ptr [rcx], 0 -;; d2af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d2b8: 800100 add byte ptr [rcx], 0 -;; d2bb: aa stosb byte ptr [rdi], al -;; d2bc: 800100 add byte ptr [rcx], 0 -;; d2bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d2c8: 800100 add byte ptr [rcx], 0 -;; d2cb: aa stosb byte ptr [rdi], al -;; d2cc: 800100 add byte ptr [rcx], 0 -;; d2cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d2d8: 800100 add byte ptr [rcx], 0 -;; d2db: aa stosb byte ptr [rdi], al -;; d2dc: 800100 add byte ptr [rcx], 0 -;; d2df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d2e8: 800100 add byte ptr [rcx], 0 -;; d2eb: aa stosb byte ptr [rdi], al -;; d2ec: 800100 add byte ptr [rcx], 0 -;; d2ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d2f8: 800100 add byte ptr [rcx], 0 -;; d2fb: aa stosb byte ptr [rdi], al -;; d2fc: 800100 add byte ptr [rcx], 0 -;; d2ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d308: 800100 add byte ptr [rcx], 0 -;; d30b: aa stosb byte ptr [rdi], al -;; d30c: 800100 add byte ptr [rcx], 0 -;; d30f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d318: 800100 add byte ptr [rcx], 0 -;; d31b: aa stosb byte ptr [rdi], al -;; d31c: 800100 add byte ptr [rcx], 0 -;; d31f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d328: 800100 add byte ptr [rcx], 0 -;; d32b: aa stosb byte ptr [rdi], al -;; d32c: 800100 add byte ptr [rcx], 0 -;; d32f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d338: 800100 add byte ptr [rcx], 0 -;; d33b: aa stosb byte ptr [rdi], al -;; d33c: 800100 add byte ptr [rcx], 0 -;; d33f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d348: 800100 add byte ptr [rcx], 0 -;; d34b: aa stosb byte ptr [rdi], al -;; d34c: 800100 add byte ptr [rcx], 0 -;; d34f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d358: 800100 add byte ptr [rcx], 0 -;; d35b: aa stosb byte ptr [rdi], al -;; d35c: 800100 add byte ptr [rcx], 0 -;; d35f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d368: 800100 add byte ptr [rcx], 0 -;; d36b: aa stosb byte ptr [rdi], al -;; d36c: 800100 add byte ptr [rcx], 0 -;; d36f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d378: 800100 add byte ptr [rcx], 0 -;; d37b: aa stosb byte ptr [rdi], al -;; d37c: 800100 add byte ptr [rcx], 0 -;; d37f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d388: 800100 add byte ptr [rcx], 0 -;; d38b: aa stosb byte ptr [rdi], al -;; d38c: 800100 add byte ptr [rcx], 0 -;; d38f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d398: 800100 add byte ptr [rcx], 0 -;; d39b: aa stosb byte ptr [rdi], al -;; d39c: 800100 add byte ptr [rcx], 0 -;; d39f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d3a8: 800100 add byte ptr [rcx], 0 -;; d3ab: aa stosb byte ptr [rdi], al -;; d3ac: 800100 add byte ptr [rcx], 0 -;; d3af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d3b8: 800100 add byte ptr [rcx], 0 -;; d3bb: aa stosb byte ptr [rdi], al -;; d3bc: 800100 add byte ptr [rcx], 0 -;; d3bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d3c8: 800100 add byte ptr [rcx], 0 -;; d3cb: aa stosb byte ptr [rdi], al -;; d3cc: 800100 add byte ptr [rcx], 0 -;; d3cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d3d8: 800100 add byte ptr [rcx], 0 -;; d3db: aa stosb byte ptr [rdi], al -;; d3dc: 800100 add byte ptr [rcx], 0 -;; d3df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d3e8: 800100 add byte ptr [rcx], 0 -;; d3eb: aa stosb byte ptr [rdi], al -;; d3ec: 800100 add byte ptr [rcx], 0 -;; d3ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d3f8: 800100 add byte ptr [rcx], 0 -;; d3fb: aa stosb byte ptr [rdi], al -;; d3fc: 800100 add byte ptr [rcx], 0 -;; d3ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d408: 800100 add byte ptr [rcx], 0 -;; d40b: aa stosb byte ptr [rdi], al -;; d40c: 800100 add byte ptr [rcx], 0 -;; d40f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d418: 800100 add byte ptr [rcx], 0 -;; d41b: aa stosb byte ptr [rdi], al -;; d41c: 800100 add byte ptr [rcx], 0 -;; d41f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d428: 800100 add byte ptr [rcx], 0 -;; d42b: aa stosb byte ptr [rdi], al -;; d42c: 800100 add byte ptr [rcx], 0 -;; d42f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d438: 800100 add byte ptr [rcx], 0 -;; d43b: aa stosb byte ptr [rdi], al -;; d43c: 800100 add byte ptr [rcx], 0 -;; d43f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d448: 800100 add byte ptr [rcx], 0 -;; d44b: aa stosb byte ptr [rdi], al -;; d44c: 800100 add byte ptr [rcx], 0 -;; d44f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d458: 800100 add byte ptr [rcx], 0 -;; d45b: aa stosb byte ptr [rdi], al -;; d45c: 800100 add byte ptr [rcx], 0 -;; d45f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d468: 800100 add byte ptr [rcx], 0 -;; d46b: aa stosb byte ptr [rdi], al -;; d46c: 800100 add byte ptr [rcx], 0 -;; d46f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d478: 800100 add byte ptr [rcx], 0 -;; d47b: aa stosb byte ptr [rdi], al -;; d47c: 800100 add byte ptr [rcx], 0 -;; d47f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d488: 800100 add byte ptr [rcx], 0 -;; d48b: aa stosb byte ptr [rdi], al -;; d48c: 800100 add byte ptr [rcx], 0 -;; d48f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d498: 800100 add byte ptr [rcx], 0 -;; d49b: aa stosb byte ptr [rdi], al -;; d49c: 800100 add byte ptr [rcx], 0 -;; d49f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d4a8: 800100 add byte ptr [rcx], 0 -;; d4ab: aa stosb byte ptr [rdi], al -;; d4ac: 800100 add byte ptr [rcx], 0 -;; d4af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d4b8: 800100 add byte ptr [rcx], 0 -;; d4bb: aa stosb byte ptr [rdi], al -;; d4bc: 800100 add byte ptr [rcx], 0 -;; d4bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d4c8: 800100 add byte ptr [rcx], 0 -;; d4cb: aa stosb byte ptr [rdi], al -;; d4cc: 800100 add byte ptr [rcx], 0 -;; d4cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d4d8: 800100 add byte ptr [rcx], 0 -;; d4db: aa stosb byte ptr [rdi], al -;; d4dc: 800100 add byte ptr [rcx], 0 -;; d4df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d4e8: 800100 add byte ptr [rcx], 0 -;; d4eb: aa stosb byte ptr [rdi], al -;; d4ec: 800100 add byte ptr [rcx], 0 -;; d4ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d4f8: 800100 add byte ptr [rcx], 0 -;; d4fb: aa stosb byte ptr [rdi], al -;; d4fc: 800100 add byte ptr [rcx], 0 -;; d4ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d508: 800100 add byte ptr [rcx], 0 -;; d50b: aa stosb byte ptr [rdi], al -;; d50c: 800100 add byte ptr [rcx], 0 -;; d50f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d518: 800100 add byte ptr [rcx], 0 -;; d51b: aa stosb byte ptr [rdi], al -;; d51c: 800100 add byte ptr [rcx], 0 -;; d51f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d528: 800100 add byte ptr [rcx], 0 -;; d52b: aa stosb byte ptr [rdi], al -;; d52c: 800100 add byte ptr [rcx], 0 -;; d52f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d538: 800100 add byte ptr [rcx], 0 -;; d53b: aa stosb byte ptr [rdi], al -;; d53c: 800100 add byte ptr [rcx], 0 -;; d53f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d548: 800100 add byte ptr [rcx], 0 -;; d54b: aa stosb byte ptr [rdi], al -;; d54c: 800100 add byte ptr [rcx], 0 -;; d54f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d558: 800100 add byte ptr [rcx], 0 -;; d55b: aa stosb byte ptr [rdi], al -;; d55c: 800100 add byte ptr [rcx], 0 -;; d55f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d568: 800100 add byte ptr [rcx], 0 -;; d56b: aa stosb byte ptr [rdi], al -;; d56c: 800100 add byte ptr [rcx], 0 -;; d56f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d578: 800100 add byte ptr [rcx], 0 -;; d57b: aa stosb byte ptr [rdi], al -;; d57c: 800100 add byte ptr [rcx], 0 -;; d57f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d588: 800100 add byte ptr [rcx], 0 -;; d58b: aa stosb byte ptr [rdi], al -;; d58c: 800100 add byte ptr [rcx], 0 -;; d58f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d598: 800100 add byte ptr [rcx], 0 -;; d59b: aa stosb byte ptr [rdi], al -;; d59c: 800100 add byte ptr [rcx], 0 -;; d59f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d5a8: 800100 add byte ptr [rcx], 0 -;; d5ab: aa stosb byte ptr [rdi], al -;; d5ac: 800100 add byte ptr [rcx], 0 -;; d5af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d5b8: 800100 add byte ptr [rcx], 0 -;; d5bb: aa stosb byte ptr [rdi], al -;; d5bc: 800100 add byte ptr [rcx], 0 -;; d5bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d5c8: 800100 add byte ptr [rcx], 0 -;; d5cb: aa stosb byte ptr [rdi], al -;; d5cc: 800100 add byte ptr [rcx], 0 -;; d5cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d5d8: 800100 add byte ptr [rcx], 0 -;; d5db: aa stosb byte ptr [rdi], al -;; d5dc: 800100 add byte ptr [rcx], 0 -;; d5df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d5e8: 800100 add byte ptr [rcx], 0 -;; d5eb: aa stosb byte ptr [rdi], al -;; d5ec: 800100 add byte ptr [rcx], 0 -;; d5ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d5f8: 800100 add byte ptr [rcx], 0 -;; d5fb: aa stosb byte ptr [rdi], al -;; d5fc: 800100 add byte ptr [rcx], 0 -;; d5ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d608: 800100 add byte ptr [rcx], 0 -;; d60b: aa stosb byte ptr [rdi], al -;; d60c: 800100 add byte ptr [rcx], 0 -;; d60f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d618: 800100 add byte ptr [rcx], 0 -;; d61b: aa stosb byte ptr [rdi], al -;; d61c: 800100 add byte ptr [rcx], 0 -;; d61f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d628: 800100 add byte ptr [rcx], 0 -;; d62b: aa stosb byte ptr [rdi], al -;; d62c: 800100 add byte ptr [rcx], 0 -;; d62f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d638: 800100 add byte ptr [rcx], 0 -;; d63b: aa stosb byte ptr [rdi], al -;; d63c: 800100 add byte ptr [rcx], 0 -;; d63f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d648: 800100 add byte ptr [rcx], 0 -;; d64b: aa stosb byte ptr [rdi], al -;; d64c: 800100 add byte ptr [rcx], 0 -;; d64f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d658: 800100 add byte ptr [rcx], 0 -;; d65b: aa stosb byte ptr [rdi], al -;; d65c: 800100 add byte ptr [rcx], 0 -;; d65f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d668: 800100 add byte ptr [rcx], 0 -;; d66b: aa stosb byte ptr [rdi], al -;; d66c: 800100 add byte ptr [rcx], 0 -;; d66f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d678: 800100 add byte ptr [rcx], 0 -;; d67b: aa stosb byte ptr [rdi], al -;; d67c: 800100 add byte ptr [rcx], 0 -;; d67f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d688: 800100 add byte ptr [rcx], 0 -;; d68b: aa stosb byte ptr [rdi], al -;; d68c: 800100 add byte ptr [rcx], 0 -;; d68f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d698: 800100 add byte ptr [rcx], 0 -;; d69b: aa stosb byte ptr [rdi], al -;; d69c: 800100 add byte ptr [rcx], 0 -;; d69f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d6a8: 800100 add byte ptr [rcx], 0 -;; d6ab: aa stosb byte ptr [rdi], al -;; d6ac: 800100 add byte ptr [rcx], 0 -;; d6af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d6b8: 800100 add byte ptr [rcx], 0 -;; d6bb: aa stosb byte ptr [rdi], al -;; d6bc: 800100 add byte ptr [rcx], 0 -;; d6bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d6c8: 800100 add byte ptr [rcx], 0 -;; d6cb: aa stosb byte ptr [rdi], al -;; d6cc: 800100 add byte ptr [rcx], 0 -;; d6cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d6d8: 800100 add byte ptr [rcx], 0 -;; d6db: aa stosb byte ptr [rdi], al -;; d6dc: 800100 add byte ptr [rcx], 0 -;; d6df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d6e8: 800100 add byte ptr [rcx], 0 -;; d6eb: aa stosb byte ptr [rdi], al -;; d6ec: 800100 add byte ptr [rcx], 0 -;; d6ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d6f8: 800100 add byte ptr [rcx], 0 -;; d6fb: aa stosb byte ptr [rdi], al -;; d6fc: 800100 add byte ptr [rcx], 0 -;; d6ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d708: 800100 add byte ptr [rcx], 0 -;; d70b: aa stosb byte ptr [rdi], al -;; d70c: 800100 add byte ptr [rcx], 0 -;; d70f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d718: 800100 add byte ptr [rcx], 0 -;; d71b: aa stosb byte ptr [rdi], al -;; d71c: 800100 add byte ptr [rcx], 0 -;; d71f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d728: 800100 add byte ptr [rcx], 0 -;; d72b: aa stosb byte ptr [rdi], al -;; d72c: 800100 add byte ptr [rcx], 0 -;; d72f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d738: 800100 add byte ptr [rcx], 0 -;; d73b: aa stosb byte ptr [rdi], al -;; d73c: 800100 add byte ptr [rcx], 0 -;; d73f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d748: 800100 add byte ptr [rcx], 0 -;; d74b: aa stosb byte ptr [rdi], al -;; d74c: 800100 add byte ptr [rcx], 0 -;; d74f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d758: 800100 add byte ptr [rcx], 0 -;; d75b: aa stosb byte ptr [rdi], al -;; d75c: 800100 add byte ptr [rcx], 0 -;; d75f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d768: 800100 add byte ptr [rcx], 0 -;; d76b: aa stosb byte ptr [rdi], al -;; d76c: 800100 add byte ptr [rcx], 0 -;; d76f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d778: 800100 add byte ptr [rcx], 0 -;; d77b: aa stosb byte ptr [rdi], al -;; d77c: 800100 add byte ptr [rcx], 0 -;; d77f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d788: 800100 add byte ptr [rcx], 0 -;; d78b: aa stosb byte ptr [rdi], al -;; d78c: 800100 add byte ptr [rcx], 0 -;; d78f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d798: 800100 add byte ptr [rcx], 0 -;; d79b: aa stosb byte ptr [rdi], al -;; d79c: 800100 add byte ptr [rcx], 0 -;; d79f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d7a8: 800100 add byte ptr [rcx], 0 -;; d7ab: aa stosb byte ptr [rdi], al -;; d7ac: 800100 add byte ptr [rcx], 0 -;; d7af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d7b8: 800100 add byte ptr [rcx], 0 -;; d7bb: aa stosb byte ptr [rdi], al -;; d7bc: 800100 add byte ptr [rcx], 0 -;; d7bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d7c8: 800100 add byte ptr [rcx], 0 -;; d7cb: aa stosb byte ptr [rdi], al -;; d7cc: 800100 add byte ptr [rcx], 0 -;; d7cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d7d8: 800100 add byte ptr [rcx], 0 -;; d7db: aa stosb byte ptr [rdi], al -;; d7dc: 800100 add byte ptr [rcx], 0 -;; d7df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d7e8: 800100 add byte ptr [rcx], 0 -;; d7eb: aa stosb byte ptr [rdi], al -;; d7ec: 800100 add byte ptr [rcx], 0 -;; d7ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d7f8: 800100 add byte ptr [rcx], 0 -;; d7fb: aa stosb byte ptr [rdi], al -;; d7fc: 800100 add byte ptr [rcx], 0 -;; d7ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d808: 800100 add byte ptr [rcx], 0 -;; d80b: aa stosb byte ptr [rdi], al -;; d80c: 800100 add byte ptr [rcx], 0 -;; d80f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d818: 800100 add byte ptr [rcx], 0 -;; d81b: aa stosb byte ptr [rdi], al -;; d81c: 800100 add byte ptr [rcx], 0 -;; d81f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d828: 800100 add byte ptr [rcx], 0 -;; d82b: aa stosb byte ptr [rdi], al -;; d82c: 800100 add byte ptr [rcx], 0 -;; d82f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d838: 800100 add byte ptr [rcx], 0 -;; d83b: aa stosb byte ptr [rdi], al -;; d83c: 800100 add byte ptr [rcx], 0 -;; d83f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d848: 800100 add byte ptr [rcx], 0 -;; d84b: aa stosb byte ptr [rdi], al -;; d84c: 800100 add byte ptr [rcx], 0 -;; d84f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d858: 800100 add byte ptr [rcx], 0 -;; d85b: aa stosb byte ptr [rdi], al -;; d85c: 800100 add byte ptr [rcx], 0 -;; d85f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d868: 800100 add byte ptr [rcx], 0 -;; d86b: aa stosb byte ptr [rdi], al -;; d86c: 800100 add byte ptr [rcx], 0 -;; d86f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d878: 800100 add byte ptr [rcx], 0 -;; d87b: aa stosb byte ptr [rdi], al -;; d87c: 800100 add byte ptr [rcx], 0 -;; d87f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d888: 800100 add byte ptr [rcx], 0 -;; d88b: aa stosb byte ptr [rdi], al -;; d88c: 800100 add byte ptr [rcx], 0 -;; d88f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d898: 800100 add byte ptr [rcx], 0 -;; d89b: aa stosb byte ptr [rdi], al -;; d89c: 800100 add byte ptr [rcx], 0 -;; d89f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d8a8: 800100 add byte ptr [rcx], 0 -;; d8ab: aa stosb byte ptr [rdi], al -;; d8ac: 800100 add byte ptr [rcx], 0 -;; d8af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d8b8: 800100 add byte ptr [rcx], 0 -;; d8bb: aa stosb byte ptr [rdi], al -;; d8bc: 800100 add byte ptr [rcx], 0 -;; d8bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d8c8: 800100 add byte ptr [rcx], 0 -;; d8cb: aa stosb byte ptr [rdi], al -;; d8cc: 800100 add byte ptr [rcx], 0 -;; d8cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d8d8: 800100 add byte ptr [rcx], 0 -;; d8db: aa stosb byte ptr [rdi], al -;; d8dc: 800100 add byte ptr [rcx], 0 -;; d8df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d8e8: 800100 add byte ptr [rcx], 0 -;; d8eb: aa stosb byte ptr [rdi], al -;; d8ec: 800100 add byte ptr [rcx], 0 -;; d8ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d8f8: 800100 add byte ptr [rcx], 0 -;; d8fb: aa stosb byte ptr [rdi], al -;; d8fc: 800100 add byte ptr [rcx], 0 -;; d8ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d908: 800100 add byte ptr [rcx], 0 -;; d90b: aa stosb byte ptr [rdi], al -;; d90c: 800100 add byte ptr [rcx], 0 -;; d90f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d918: 800100 add byte ptr [rcx], 0 -;; d91b: aa stosb byte ptr [rdi], al -;; d91c: 800100 add byte ptr [rcx], 0 -;; d91f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d928: 800100 add byte ptr [rcx], 0 -;; d92b: aa stosb byte ptr [rdi], al -;; d92c: 800100 add byte ptr [rcx], 0 -;; d92f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d938: 800100 add byte ptr [rcx], 0 -;; d93b: aa stosb byte ptr [rdi], al -;; d93c: 800100 add byte ptr [rcx], 0 -;; d93f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d948: 800100 add byte ptr [rcx], 0 -;; d94b: aa stosb byte ptr [rdi], al -;; d94c: 800100 add byte ptr [rcx], 0 -;; d94f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d958: 800100 add byte ptr [rcx], 0 -;; d95b: aa stosb byte ptr [rdi], al -;; d95c: 800100 add byte ptr [rcx], 0 -;; d95f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d968: 800100 add byte ptr [rcx], 0 -;; d96b: aa stosb byte ptr [rdi], al -;; d96c: 800100 add byte ptr [rcx], 0 -;; d96f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d978: 800100 add byte ptr [rcx], 0 -;; d97b: aa stosb byte ptr [rdi], al -;; d97c: 800100 add byte ptr [rcx], 0 -;; d97f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d988: 800100 add byte ptr [rcx], 0 -;; d98b: aa stosb byte ptr [rdi], al -;; d98c: 800100 add byte ptr [rcx], 0 -;; d98f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d998: 800100 add byte ptr [rcx], 0 -;; d99b: aa stosb byte ptr [rdi], al -;; d99c: 800100 add byte ptr [rcx], 0 -;; d99f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d9a8: 800100 add byte ptr [rcx], 0 -;; d9ab: aa stosb byte ptr [rdi], al -;; d9ac: 800100 add byte ptr [rcx], 0 -;; d9af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d9b8: 800100 add byte ptr [rcx], 0 -;; d9bb: aa stosb byte ptr [rdi], al -;; d9bc: 800100 add byte ptr [rcx], 0 -;; d9bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d9c8: 800100 add byte ptr [rcx], 0 -;; d9cb: aa stosb byte ptr [rdi], al -;; d9cc: 800100 add byte ptr [rcx], 0 -;; d9cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d9d8: 800100 add byte ptr [rcx], 0 -;; d9db: aa stosb byte ptr [rdi], al -;; d9dc: 800100 add byte ptr [rcx], 0 -;; d9df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d9e8: 800100 add byte ptr [rcx], 0 -;; d9eb: aa stosb byte ptr [rdi], al -;; d9ec: 800100 add byte ptr [rcx], 0 -;; d9ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; d9f8: 800100 add byte ptr [rcx], 0 -;; d9fb: aa stosb byte ptr [rdi], al -;; d9fc: 800100 add byte ptr [rcx], 0 -;; d9ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; da08: 800100 add byte ptr [rcx], 0 -;; da0b: aa stosb byte ptr [rdi], al -;; da0c: 800100 add byte ptr [rcx], 0 -;; da0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; da18: 800100 add byte ptr [rcx], 0 -;; da1b: aa stosb byte ptr [rdi], al -;; da1c: 800100 add byte ptr [rcx], 0 -;; da1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; da28: 800100 add byte ptr [rcx], 0 -;; da2b: aa stosb byte ptr [rdi], al -;; da2c: 800100 add byte ptr [rcx], 0 -;; da2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; da38: 800100 add byte ptr [rcx], 0 -;; da3b: aa stosb byte ptr [rdi], al -;; da3c: 800100 add byte ptr [rcx], 0 -;; da3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; da48: 800100 add byte ptr [rcx], 0 -;; da4b: aa stosb byte ptr [rdi], al -;; da4c: 800100 add byte ptr [rcx], 0 -;; da4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; da58: 800100 add byte ptr [rcx], 0 -;; da5b: aa stosb byte ptr [rdi], al -;; da5c: 800100 add byte ptr [rcx], 0 -;; da5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; da68: 800100 add byte ptr [rcx], 0 -;; da6b: aa stosb byte ptr [rdi], al -;; da6c: 800100 add byte ptr [rcx], 0 -;; da6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; da78: 800100 add byte ptr [rcx], 0 -;; da7b: aa stosb byte ptr [rdi], al -;; da7c: 800100 add byte ptr [rcx], 0 -;; da7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; da88: 800100 add byte ptr [rcx], 0 -;; da8b: aa stosb byte ptr [rdi], al -;; da8c: 800100 add byte ptr [rcx], 0 -;; da8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; da98: 800100 add byte ptr [rcx], 0 -;; da9b: aa stosb byte ptr [rdi], al -;; da9c: 800100 add byte ptr [rcx], 0 -;; da9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; daa8: 800100 add byte ptr [rcx], 0 -;; daab: aa stosb byte ptr [rdi], al -;; daac: 800100 add byte ptr [rcx], 0 -;; daaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dab8: 800100 add byte ptr [rcx], 0 -;; dabb: aa stosb byte ptr [rdi], al -;; dabc: 800100 add byte ptr [rcx], 0 -;; dabf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dac8: 800100 add byte ptr [rcx], 0 -;; dacb: aa stosb byte ptr [rdi], al -;; dacc: 800100 add byte ptr [rcx], 0 -;; dacf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dad8: 800100 add byte ptr [rcx], 0 -;; dadb: aa stosb byte ptr [rdi], al -;; dadc: 800100 add byte ptr [rcx], 0 -;; dadf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dae8: 800100 add byte ptr [rcx], 0 -;; daeb: aa stosb byte ptr [rdi], al -;; daec: 800100 add byte ptr [rcx], 0 -;; daef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; daf8: 800100 add byte ptr [rcx], 0 -;; dafb: aa stosb byte ptr [rdi], al -;; dafc: 800100 add byte ptr [rcx], 0 -;; daff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; db08: 800100 add byte ptr [rcx], 0 -;; db0b: aa stosb byte ptr [rdi], al -;; db0c: 800100 add byte ptr [rcx], 0 -;; db0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; db18: 800100 add byte ptr [rcx], 0 -;; db1b: aa stosb byte ptr [rdi], al -;; db1c: 800100 add byte ptr [rcx], 0 -;; db1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; db28: 800100 add byte ptr [rcx], 0 -;; db2b: aa stosb byte ptr [rdi], al -;; db2c: 800100 add byte ptr [rcx], 0 -;; db2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; db38: 800100 add byte ptr [rcx], 0 -;; db3b: aa stosb byte ptr [rdi], al -;; db3c: 800100 add byte ptr [rcx], 0 -;; db3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; db48: 800100 add byte ptr [rcx], 0 -;; db4b: aa stosb byte ptr [rdi], al -;; db4c: 800100 add byte ptr [rcx], 0 -;; db4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; db58: 800100 add byte ptr [rcx], 0 -;; db5b: aa stosb byte ptr [rdi], al -;; db5c: 800100 add byte ptr [rcx], 0 -;; db5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; db68: 800100 add byte ptr [rcx], 0 -;; db6b: aa stosb byte ptr [rdi], al -;; db6c: 800100 add byte ptr [rcx], 0 -;; db6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; db78: 800100 add byte ptr [rcx], 0 -;; db7b: aa stosb byte ptr [rdi], al -;; db7c: 800100 add byte ptr [rcx], 0 -;; db7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; db88: 800100 add byte ptr [rcx], 0 -;; db8b: aa stosb byte ptr [rdi], al -;; db8c: 800100 add byte ptr [rcx], 0 -;; db8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; db98: 800100 add byte ptr [rcx], 0 -;; db9b: aa stosb byte ptr [rdi], al -;; db9c: 800100 add byte ptr [rcx], 0 -;; db9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dba8: 800100 add byte ptr [rcx], 0 -;; dbab: aa stosb byte ptr [rdi], al -;; dbac: 800100 add byte ptr [rcx], 0 -;; dbaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dbb8: 800100 add byte ptr [rcx], 0 -;; dbbb: aa stosb byte ptr [rdi], al -;; dbbc: 800100 add byte ptr [rcx], 0 -;; dbbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dbc8: 800100 add byte ptr [rcx], 0 -;; dbcb: aa stosb byte ptr [rdi], al -;; dbcc: 800100 add byte ptr [rcx], 0 -;; dbcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dbd8: 800100 add byte ptr [rcx], 0 -;; dbdb: aa stosb byte ptr [rdi], al -;; dbdc: 800100 add byte ptr [rcx], 0 -;; dbdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dbe8: 800100 add byte ptr [rcx], 0 -;; dbeb: aa stosb byte ptr [rdi], al -;; dbec: 800100 add byte ptr [rcx], 0 -;; dbef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dbf8: 800100 add byte ptr [rcx], 0 -;; dbfb: aa stosb byte ptr [rdi], al -;; dbfc: 800100 add byte ptr [rcx], 0 -;; dbff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dc08: 800100 add byte ptr [rcx], 0 -;; dc0b: aa stosb byte ptr [rdi], al -;; dc0c: 800100 add byte ptr [rcx], 0 -;; dc0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dc18: 800100 add byte ptr [rcx], 0 -;; dc1b: aa stosb byte ptr [rdi], al -;; dc1c: 800100 add byte ptr [rcx], 0 -;; dc1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dc28: 800100 add byte ptr [rcx], 0 -;; dc2b: aa stosb byte ptr [rdi], al -;; dc2c: 800100 add byte ptr [rcx], 0 -;; dc2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dc38: 800100 add byte ptr [rcx], 0 -;; dc3b: aa stosb byte ptr [rdi], al -;; dc3c: 800100 add byte ptr [rcx], 0 -;; dc3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dc48: 800100 add byte ptr [rcx], 0 -;; dc4b: aa stosb byte ptr [rdi], al -;; dc4c: 800100 add byte ptr [rcx], 0 -;; dc4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dc58: 800100 add byte ptr [rcx], 0 -;; dc5b: aa stosb byte ptr [rdi], al -;; dc5c: 800100 add byte ptr [rcx], 0 -;; dc5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dc68: 800100 add byte ptr [rcx], 0 -;; dc6b: aa stosb byte ptr [rdi], al -;; dc6c: 800100 add byte ptr [rcx], 0 -;; dc6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dc78: 800100 add byte ptr [rcx], 0 -;; dc7b: aa stosb byte ptr [rdi], al -;; dc7c: 800100 add byte ptr [rcx], 0 -;; dc7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dc88: 800100 add byte ptr [rcx], 0 -;; dc8b: aa stosb byte ptr [rdi], al -;; dc8c: 800100 add byte ptr [rcx], 0 -;; dc8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dc98: 800100 add byte ptr [rcx], 0 -;; dc9b: aa stosb byte ptr [rdi], al -;; dc9c: 800100 add byte ptr [rcx], 0 -;; dc9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dca8: 800100 add byte ptr [rcx], 0 -;; dcab: aa stosb byte ptr [rdi], al -;; dcac: 800100 add byte ptr [rcx], 0 -;; dcaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dcb8: 800100 add byte ptr [rcx], 0 -;; dcbb: aa stosb byte ptr [rdi], al -;; dcbc: 800100 add byte ptr [rcx], 0 -;; dcbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dcc8: 800100 add byte ptr [rcx], 0 -;; dccb: aa stosb byte ptr [rdi], al -;; dccc: 800100 add byte ptr [rcx], 0 -;; dccf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dcd8: 800100 add byte ptr [rcx], 0 -;; dcdb: aa stosb byte ptr [rdi], al -;; dcdc: 800100 add byte ptr [rcx], 0 -;; dcdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dce8: 800100 add byte ptr [rcx], 0 -;; dceb: aa stosb byte ptr [rdi], al -;; dcec: 800100 add byte ptr [rcx], 0 -;; dcef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dcf8: 800100 add byte ptr [rcx], 0 -;; dcfb: aa stosb byte ptr [rdi], al -;; dcfc: 800100 add byte ptr [rcx], 0 -;; dcff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dd08: 800100 add byte ptr [rcx], 0 -;; dd0b: aa stosb byte ptr [rdi], al -;; dd0c: 800100 add byte ptr [rcx], 0 -;; dd0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dd18: 800100 add byte ptr [rcx], 0 -;; dd1b: aa stosb byte ptr [rdi], al -;; dd1c: 800100 add byte ptr [rcx], 0 -;; dd1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dd28: 800100 add byte ptr [rcx], 0 -;; dd2b: aa stosb byte ptr [rdi], al -;; dd2c: 800100 add byte ptr [rcx], 0 -;; dd2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dd38: 800100 add byte ptr [rcx], 0 -;; dd3b: aa stosb byte ptr [rdi], al -;; dd3c: 800100 add byte ptr [rcx], 0 -;; dd3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dd48: 800100 add byte ptr [rcx], 0 -;; dd4b: aa stosb byte ptr [rdi], al -;; dd4c: 800100 add byte ptr [rcx], 0 -;; dd4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dd58: 800100 add byte ptr [rcx], 0 -;; dd5b: aa stosb byte ptr [rdi], al -;; dd5c: 800100 add byte ptr [rcx], 0 -;; dd5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dd68: 800100 add byte ptr [rcx], 0 -;; dd6b: aa stosb byte ptr [rdi], al -;; dd6c: 800100 add byte ptr [rcx], 0 -;; dd6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dd78: 800100 add byte ptr [rcx], 0 -;; dd7b: aa stosb byte ptr [rdi], al -;; dd7c: 800100 add byte ptr [rcx], 0 -;; dd7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dd88: 800100 add byte ptr [rcx], 0 -;; dd8b: aa stosb byte ptr [rdi], al -;; dd8c: 800100 add byte ptr [rcx], 0 -;; dd8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dd98: 800100 add byte ptr [rcx], 0 -;; dd9b: aa stosb byte ptr [rdi], al -;; dd9c: 800100 add byte ptr [rcx], 0 -;; dd9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dda8: 800100 add byte ptr [rcx], 0 -;; ddab: aa stosb byte ptr [rdi], al -;; ddac: 800100 add byte ptr [rcx], 0 -;; ddaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ddb8: 800100 add byte ptr [rcx], 0 -;; ddbb: aa stosb byte ptr [rdi], al -;; ddbc: 800100 add byte ptr [rcx], 0 -;; ddbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ddc8: 800100 add byte ptr [rcx], 0 -;; ddcb: aa stosb byte ptr [rdi], al -;; ddcc: 800100 add byte ptr [rcx], 0 -;; ddcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ddd8: 800100 add byte ptr [rcx], 0 -;; dddb: aa stosb byte ptr [rdi], al -;; dddc: 800100 add byte ptr [rcx], 0 -;; dddf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dde8: 800100 add byte ptr [rcx], 0 -;; ddeb: aa stosb byte ptr [rdi], al -;; ddec: 800100 add byte ptr [rcx], 0 -;; ddef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ddf8: 800100 add byte ptr [rcx], 0 -;; ddfb: aa stosb byte ptr [rdi], al -;; ddfc: 800100 add byte ptr [rcx], 0 -;; ddff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; de08: 800100 add byte ptr [rcx], 0 -;; de0b: aa stosb byte ptr [rdi], al -;; de0c: 800100 add byte ptr [rcx], 0 -;; de0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; de18: 800100 add byte ptr [rcx], 0 -;; de1b: aa stosb byte ptr [rdi], al -;; de1c: 800100 add byte ptr [rcx], 0 -;; de1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; de28: 800100 add byte ptr [rcx], 0 -;; de2b: aa stosb byte ptr [rdi], al -;; de2c: 800100 add byte ptr [rcx], 0 -;; de2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; de38: 800100 add byte ptr [rcx], 0 -;; de3b: aa stosb byte ptr [rdi], al -;; de3c: 800100 add byte ptr [rcx], 0 -;; de3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; de48: 800100 add byte ptr [rcx], 0 -;; de4b: aa stosb byte ptr [rdi], al -;; de4c: 800100 add byte ptr [rcx], 0 -;; de4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; de58: 800100 add byte ptr [rcx], 0 -;; de5b: aa stosb byte ptr [rdi], al -;; de5c: 800100 add byte ptr [rcx], 0 -;; de5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; de68: 800100 add byte ptr [rcx], 0 -;; de6b: aa stosb byte ptr [rdi], al -;; de6c: 800100 add byte ptr [rcx], 0 -;; de6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; de78: 800100 add byte ptr [rcx], 0 -;; de7b: aa stosb byte ptr [rdi], al -;; de7c: 800100 add byte ptr [rcx], 0 -;; de7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; de88: 800100 add byte ptr [rcx], 0 -;; de8b: aa stosb byte ptr [rdi], al -;; de8c: 800100 add byte ptr [rcx], 0 -;; de8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; de98: 800100 add byte ptr [rcx], 0 -;; de9b: aa stosb byte ptr [rdi], al -;; de9c: 800100 add byte ptr [rcx], 0 -;; de9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dea8: 800100 add byte ptr [rcx], 0 -;; deab: aa stosb byte ptr [rdi], al -;; deac: 800100 add byte ptr [rcx], 0 -;; deaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; deb8: 800100 add byte ptr [rcx], 0 -;; debb: aa stosb byte ptr [rdi], al -;; debc: 800100 add byte ptr [rcx], 0 -;; debf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dec8: 800100 add byte ptr [rcx], 0 -;; decb: aa stosb byte ptr [rdi], al -;; decc: 800100 add byte ptr [rcx], 0 -;; decf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ded8: 800100 add byte ptr [rcx], 0 -;; dedb: aa stosb byte ptr [rdi], al -;; dedc: 800100 add byte ptr [rcx], 0 -;; dedf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dee8: 800100 add byte ptr [rcx], 0 -;; deeb: aa stosb byte ptr [rdi], al -;; deec: 800100 add byte ptr [rcx], 0 -;; deef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; def8: 800100 add byte ptr [rcx], 0 -;; defb: aa stosb byte ptr [rdi], al -;; defc: 800100 add byte ptr [rcx], 0 -;; deff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; df08: 800100 add byte ptr [rcx], 0 -;; df0b: aa stosb byte ptr [rdi], al -;; df0c: 800100 add byte ptr [rcx], 0 -;; df0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; df18: 800100 add byte ptr [rcx], 0 -;; df1b: aa stosb byte ptr [rdi], al -;; df1c: 800100 add byte ptr [rcx], 0 -;; df1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; df28: 800100 add byte ptr [rcx], 0 -;; df2b: aa stosb byte ptr [rdi], al -;; df2c: 800100 add byte ptr [rcx], 0 -;; df2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; df38: 800100 add byte ptr [rcx], 0 -;; df3b: aa stosb byte ptr [rdi], al -;; df3c: 800100 add byte ptr [rcx], 0 -;; df3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; df48: 800100 add byte ptr [rcx], 0 -;; df4b: aa stosb byte ptr [rdi], al -;; df4c: 800100 add byte ptr [rcx], 0 -;; df4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; df58: 800100 add byte ptr [rcx], 0 -;; df5b: aa stosb byte ptr [rdi], al -;; df5c: 800100 add byte ptr [rcx], 0 -;; df5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; df68: 800100 add byte ptr [rcx], 0 -;; df6b: aa stosb byte ptr [rdi], al -;; df6c: 800100 add byte ptr [rcx], 0 -;; df6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; df78: 800100 add byte ptr [rcx], 0 -;; df7b: aa stosb byte ptr [rdi], al -;; df7c: 800100 add byte ptr [rcx], 0 -;; df7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; df88: 800100 add byte ptr [rcx], 0 -;; df8b: aa stosb byte ptr [rdi], al -;; df8c: 800100 add byte ptr [rcx], 0 -;; df8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; df98: 800100 add byte ptr [rcx], 0 -;; df9b: aa stosb byte ptr [rdi], al -;; df9c: 800100 add byte ptr [rcx], 0 -;; df9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dfa8: 800100 add byte ptr [rcx], 0 -;; dfab: aa stosb byte ptr [rdi], al -;; dfac: 800100 add byte ptr [rcx], 0 -;; dfaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dfb8: 800100 add byte ptr [rcx], 0 -;; dfbb: aa stosb byte ptr [rdi], al -;; dfbc: 800100 add byte ptr [rcx], 0 -;; dfbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dfc8: 800100 add byte ptr [rcx], 0 -;; dfcb: aa stosb byte ptr [rdi], al -;; dfcc: 800100 add byte ptr [rcx], 0 -;; dfcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dfd8: 800100 add byte ptr [rcx], 0 -;; dfdb: aa stosb byte ptr [rdi], al -;; dfdc: 800100 add byte ptr [rcx], 0 -;; dfdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dfe8: 800100 add byte ptr [rcx], 0 -;; dfeb: aa stosb byte ptr [rdi], al -;; dfec: 800100 add byte ptr [rcx], 0 -;; dfef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; dff8: 800100 add byte ptr [rcx], 0 -;; dffb: aa stosb byte ptr [rdi], al -;; dffc: 800100 add byte ptr [rcx], 0 -;; dfff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e008: 800100 add byte ptr [rcx], 0 -;; e00b: aa stosb byte ptr [rdi], al -;; e00c: 800100 add byte ptr [rcx], 0 -;; e00f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e018: 800100 add byte ptr [rcx], 0 -;; e01b: aa stosb byte ptr [rdi], al -;; e01c: 800100 add byte ptr [rcx], 0 -;; e01f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e028: 800100 add byte ptr [rcx], 0 -;; e02b: aa stosb byte ptr [rdi], al -;; e02c: 800100 add byte ptr [rcx], 0 -;; e02f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e038: 800100 add byte ptr [rcx], 0 -;; e03b: aa stosb byte ptr [rdi], al -;; e03c: 800100 add byte ptr [rcx], 0 -;; e03f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e048: 800100 add byte ptr [rcx], 0 -;; e04b: aa stosb byte ptr [rdi], al -;; e04c: 800100 add byte ptr [rcx], 0 -;; e04f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e058: 800100 add byte ptr [rcx], 0 -;; e05b: aa stosb byte ptr [rdi], al -;; e05c: 800100 add byte ptr [rcx], 0 -;; e05f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e068: 800100 add byte ptr [rcx], 0 -;; e06b: aa stosb byte ptr [rdi], al -;; e06c: 800100 add byte ptr [rcx], 0 -;; e06f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e078: 800100 add byte ptr [rcx], 0 -;; e07b: aa stosb byte ptr [rdi], al -;; e07c: 800100 add byte ptr [rcx], 0 -;; e07f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e088: 800100 add byte ptr [rcx], 0 -;; e08b: aa stosb byte ptr [rdi], al -;; e08c: 800100 add byte ptr [rcx], 0 -;; e08f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e098: 800100 add byte ptr [rcx], 0 -;; e09b: aa stosb byte ptr [rdi], al -;; e09c: 800100 add byte ptr [rcx], 0 -;; e09f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e0a8: 800100 add byte ptr [rcx], 0 -;; e0ab: aa stosb byte ptr [rdi], al -;; e0ac: 800100 add byte ptr [rcx], 0 -;; e0af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e0b8: 800100 add byte ptr [rcx], 0 -;; e0bb: aa stosb byte ptr [rdi], al -;; e0bc: 800100 add byte ptr [rcx], 0 -;; e0bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e0c8: 800100 add byte ptr [rcx], 0 -;; e0cb: aa stosb byte ptr [rdi], al -;; e0cc: 800100 add byte ptr [rcx], 0 -;; e0cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e0d8: 800100 add byte ptr [rcx], 0 -;; e0db: aa stosb byte ptr [rdi], al -;; e0dc: 800100 add byte ptr [rcx], 0 -;; e0df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e0e8: 800100 add byte ptr [rcx], 0 -;; e0eb: aa stosb byte ptr [rdi], al -;; e0ec: 800100 add byte ptr [rcx], 0 -;; e0ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e0f8: 800100 add byte ptr [rcx], 0 -;; e0fb: aa stosb byte ptr [rdi], al -;; e0fc: 800100 add byte ptr [rcx], 0 -;; e0ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e108: 800100 add byte ptr [rcx], 0 -;; e10b: aa stosb byte ptr [rdi], al -;; e10c: 800100 add byte ptr [rcx], 0 -;; e10f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e118: 800100 add byte ptr [rcx], 0 -;; e11b: aa stosb byte ptr [rdi], al -;; e11c: 800100 add byte ptr [rcx], 0 -;; e11f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e128: 800100 add byte ptr [rcx], 0 -;; e12b: aa stosb byte ptr [rdi], al -;; e12c: 800100 add byte ptr [rcx], 0 -;; e12f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e138: 800100 add byte ptr [rcx], 0 -;; e13b: aa stosb byte ptr [rdi], al -;; e13c: 800100 add byte ptr [rcx], 0 -;; e13f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e148: 800100 add byte ptr [rcx], 0 -;; e14b: aa stosb byte ptr [rdi], al -;; e14c: 800100 add byte ptr [rcx], 0 -;; e14f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e158: 800100 add byte ptr [rcx], 0 -;; e15b: aa stosb byte ptr [rdi], al -;; e15c: 800100 add byte ptr [rcx], 0 -;; e15f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e168: 800100 add byte ptr [rcx], 0 -;; e16b: aa stosb byte ptr [rdi], al -;; e16c: 800100 add byte ptr [rcx], 0 -;; e16f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e178: 800100 add byte ptr [rcx], 0 -;; e17b: aa stosb byte ptr [rdi], al -;; e17c: 800100 add byte ptr [rcx], 0 -;; e17f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e188: 800100 add byte ptr [rcx], 0 -;; e18b: aa stosb byte ptr [rdi], al -;; e18c: 800100 add byte ptr [rcx], 0 -;; e18f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e198: 800100 add byte ptr [rcx], 0 -;; e19b: aa stosb byte ptr [rdi], al -;; e19c: 800100 add byte ptr [rcx], 0 -;; e19f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e1a8: 800100 add byte ptr [rcx], 0 -;; e1ab: aa stosb byte ptr [rdi], al -;; e1ac: 800100 add byte ptr [rcx], 0 -;; e1af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e1b8: 800100 add byte ptr [rcx], 0 -;; e1bb: aa stosb byte ptr [rdi], al -;; e1bc: 800100 add byte ptr [rcx], 0 -;; e1bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e1c8: 800100 add byte ptr [rcx], 0 -;; e1cb: aa stosb byte ptr [rdi], al -;; e1cc: 800100 add byte ptr [rcx], 0 -;; e1cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e1d8: 800100 add byte ptr [rcx], 0 -;; e1db: aa stosb byte ptr [rdi], al -;; e1dc: 800100 add byte ptr [rcx], 0 -;; e1df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e1e8: 800100 add byte ptr [rcx], 0 -;; e1eb: aa stosb byte ptr [rdi], al -;; e1ec: 800100 add byte ptr [rcx], 0 -;; e1ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e1f8: 800100 add byte ptr [rcx], 0 -;; e1fb: aa stosb byte ptr [rdi], al -;; e1fc: 800100 add byte ptr [rcx], 0 -;; e1ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e208: 800100 add byte ptr [rcx], 0 -;; e20b: aa stosb byte ptr [rdi], al -;; e20c: 800100 add byte ptr [rcx], 0 -;; e20f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e218: 800100 add byte ptr [rcx], 0 -;; e21b: aa stosb byte ptr [rdi], al -;; e21c: 800100 add byte ptr [rcx], 0 -;; e21f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e228: 800100 add byte ptr [rcx], 0 -;; e22b: aa stosb byte ptr [rdi], al -;; e22c: 800100 add byte ptr [rcx], 0 -;; e22f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e238: 800100 add byte ptr [rcx], 0 -;; e23b: aa stosb byte ptr [rdi], al -;; e23c: 800100 add byte ptr [rcx], 0 -;; e23f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e248: 800100 add byte ptr [rcx], 0 -;; e24b: aa stosb byte ptr [rdi], al -;; e24c: 800100 add byte ptr [rcx], 0 -;; e24f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e258: 800100 add byte ptr [rcx], 0 -;; e25b: aa stosb byte ptr [rdi], al -;; e25c: 800100 add byte ptr [rcx], 0 -;; e25f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e268: 800100 add byte ptr [rcx], 0 -;; e26b: aa stosb byte ptr [rdi], al -;; e26c: 800100 add byte ptr [rcx], 0 -;; e26f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e278: 800100 add byte ptr [rcx], 0 -;; e27b: aa stosb byte ptr [rdi], al -;; e27c: 800100 add byte ptr [rcx], 0 -;; e27f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e288: 800100 add byte ptr [rcx], 0 -;; e28b: aa stosb byte ptr [rdi], al -;; e28c: 800100 add byte ptr [rcx], 0 -;; e28f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e298: 800100 add byte ptr [rcx], 0 -;; e29b: aa stosb byte ptr [rdi], al -;; e29c: 800100 add byte ptr [rcx], 0 -;; e29f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e2a8: 800100 add byte ptr [rcx], 0 -;; e2ab: aa stosb byte ptr [rdi], al -;; e2ac: 800100 add byte ptr [rcx], 0 -;; e2af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e2b8: 800100 add byte ptr [rcx], 0 -;; e2bb: aa stosb byte ptr [rdi], al -;; e2bc: 800100 add byte ptr [rcx], 0 -;; e2bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e2c8: 800100 add byte ptr [rcx], 0 -;; e2cb: aa stosb byte ptr [rdi], al -;; e2cc: 800100 add byte ptr [rcx], 0 -;; e2cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e2d8: 800100 add byte ptr [rcx], 0 -;; e2db: aa stosb byte ptr [rdi], al -;; e2dc: 800100 add byte ptr [rcx], 0 -;; e2df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e2e8: 800100 add byte ptr [rcx], 0 -;; e2eb: aa stosb byte ptr [rdi], al -;; e2ec: 800100 add byte ptr [rcx], 0 -;; e2ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e2f8: 800100 add byte ptr [rcx], 0 -;; e2fb: aa stosb byte ptr [rdi], al -;; e2fc: 800100 add byte ptr [rcx], 0 -;; e2ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e308: 800100 add byte ptr [rcx], 0 -;; e30b: aa stosb byte ptr [rdi], al -;; e30c: 800100 add byte ptr [rcx], 0 -;; e30f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e318: 800100 add byte ptr [rcx], 0 -;; e31b: aa stosb byte ptr [rdi], al -;; e31c: 800100 add byte ptr [rcx], 0 -;; e31f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e328: 800100 add byte ptr [rcx], 0 -;; e32b: aa stosb byte ptr [rdi], al -;; e32c: 800100 add byte ptr [rcx], 0 -;; e32f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e338: 800100 add byte ptr [rcx], 0 -;; e33b: aa stosb byte ptr [rdi], al -;; e33c: 800100 add byte ptr [rcx], 0 -;; e33f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e348: 800100 add byte ptr [rcx], 0 -;; e34b: aa stosb byte ptr [rdi], al -;; e34c: 800100 add byte ptr [rcx], 0 -;; e34f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e358: 800100 add byte ptr [rcx], 0 -;; e35b: aa stosb byte ptr [rdi], al -;; e35c: 800100 add byte ptr [rcx], 0 -;; e35f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e368: 800100 add byte ptr [rcx], 0 -;; e36b: aa stosb byte ptr [rdi], al -;; e36c: 800100 add byte ptr [rcx], 0 -;; e36f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e378: 800100 add byte ptr [rcx], 0 -;; e37b: aa stosb byte ptr [rdi], al -;; e37c: 800100 add byte ptr [rcx], 0 -;; e37f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e388: 800100 add byte ptr [rcx], 0 -;; e38b: aa stosb byte ptr [rdi], al -;; e38c: 800100 add byte ptr [rcx], 0 -;; e38f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e398: 800100 add byte ptr [rcx], 0 -;; e39b: aa stosb byte ptr [rdi], al -;; e39c: 800100 add byte ptr [rcx], 0 -;; e39f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e3a8: 800100 add byte ptr [rcx], 0 -;; e3ab: aa stosb byte ptr [rdi], al -;; e3ac: 800100 add byte ptr [rcx], 0 -;; e3af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e3b8: 800100 add byte ptr [rcx], 0 -;; e3bb: aa stosb byte ptr [rdi], al -;; e3bc: 800100 add byte ptr [rcx], 0 -;; e3bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e3c8: 800100 add byte ptr [rcx], 0 -;; e3cb: aa stosb byte ptr [rdi], al -;; e3cc: 800100 add byte ptr [rcx], 0 -;; e3cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e3d8: 800100 add byte ptr [rcx], 0 -;; e3db: aa stosb byte ptr [rdi], al -;; e3dc: 800100 add byte ptr [rcx], 0 -;; e3df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e3e8: 800100 add byte ptr [rcx], 0 -;; e3eb: aa stosb byte ptr [rdi], al -;; e3ec: 800100 add byte ptr [rcx], 0 -;; e3ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e3f8: 800100 add byte ptr [rcx], 0 -;; e3fb: aa stosb byte ptr [rdi], al -;; e3fc: 800100 add byte ptr [rcx], 0 -;; e3ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e408: 800100 add byte ptr [rcx], 0 -;; e40b: aa stosb byte ptr [rdi], al -;; e40c: 800100 add byte ptr [rcx], 0 -;; e40f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e418: 800100 add byte ptr [rcx], 0 -;; e41b: aa stosb byte ptr [rdi], al -;; e41c: 800100 add byte ptr [rcx], 0 -;; e41f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e428: 800100 add byte ptr [rcx], 0 -;; e42b: aa stosb byte ptr [rdi], al -;; e42c: 800100 add byte ptr [rcx], 0 -;; e42f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e438: 800100 add byte ptr [rcx], 0 -;; e43b: aa stosb byte ptr [rdi], al -;; e43c: 800100 add byte ptr [rcx], 0 -;; e43f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e448: 800100 add byte ptr [rcx], 0 -;; e44b: aa stosb byte ptr [rdi], al -;; e44c: 800100 add byte ptr [rcx], 0 -;; e44f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e458: 800100 add byte ptr [rcx], 0 -;; e45b: aa stosb byte ptr [rdi], al -;; e45c: 800100 add byte ptr [rcx], 0 -;; e45f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e468: 800100 add byte ptr [rcx], 0 -;; e46b: aa stosb byte ptr [rdi], al -;; e46c: 800100 add byte ptr [rcx], 0 -;; e46f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e478: 800100 add byte ptr [rcx], 0 -;; e47b: aa stosb byte ptr [rdi], al -;; e47c: 800100 add byte ptr [rcx], 0 -;; e47f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e488: 800100 add byte ptr [rcx], 0 -;; e48b: aa stosb byte ptr [rdi], al -;; e48c: 800100 add byte ptr [rcx], 0 -;; e48f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e498: 800100 add byte ptr [rcx], 0 -;; e49b: aa stosb byte ptr [rdi], al -;; e49c: 800100 add byte ptr [rcx], 0 -;; e49f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e4a8: 800100 add byte ptr [rcx], 0 -;; e4ab: aa stosb byte ptr [rdi], al -;; e4ac: 800100 add byte ptr [rcx], 0 -;; e4af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e4b8: 800100 add byte ptr [rcx], 0 -;; e4bb: aa stosb byte ptr [rdi], al -;; e4bc: 800100 add byte ptr [rcx], 0 -;; e4bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e4c8: 800100 add byte ptr [rcx], 0 -;; e4cb: aa stosb byte ptr [rdi], al -;; e4cc: 800100 add byte ptr [rcx], 0 -;; e4cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e4d8: 800100 add byte ptr [rcx], 0 -;; e4db: aa stosb byte ptr [rdi], al -;; e4dc: 800100 add byte ptr [rcx], 0 -;; e4df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e4e8: 800100 add byte ptr [rcx], 0 -;; e4eb: aa stosb byte ptr [rdi], al -;; e4ec: 800100 add byte ptr [rcx], 0 -;; e4ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e4f8: 800100 add byte ptr [rcx], 0 -;; e4fb: aa stosb byte ptr [rdi], al -;; e4fc: 800100 add byte ptr [rcx], 0 -;; e4ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e508: 800100 add byte ptr [rcx], 0 -;; e50b: aa stosb byte ptr [rdi], al -;; e50c: 800100 add byte ptr [rcx], 0 -;; e50f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e518: 800100 add byte ptr [rcx], 0 -;; e51b: aa stosb byte ptr [rdi], al -;; e51c: 800100 add byte ptr [rcx], 0 -;; e51f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e528: 800100 add byte ptr [rcx], 0 -;; e52b: aa stosb byte ptr [rdi], al -;; e52c: 800100 add byte ptr [rcx], 0 -;; e52f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e538: 800100 add byte ptr [rcx], 0 -;; e53b: aa stosb byte ptr [rdi], al -;; e53c: 800100 add byte ptr [rcx], 0 -;; e53f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e548: 800100 add byte ptr [rcx], 0 -;; e54b: aa stosb byte ptr [rdi], al -;; e54c: 800100 add byte ptr [rcx], 0 -;; e54f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e558: 800100 add byte ptr [rcx], 0 -;; e55b: aa stosb byte ptr [rdi], al -;; e55c: 800100 add byte ptr [rcx], 0 -;; e55f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e568: 800100 add byte ptr [rcx], 0 -;; e56b: aa stosb byte ptr [rdi], al -;; e56c: 800100 add byte ptr [rcx], 0 -;; e56f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e578: 800100 add byte ptr [rcx], 0 -;; e57b: aa stosb byte ptr [rdi], al -;; e57c: 800100 add byte ptr [rcx], 0 -;; e57f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e588: 800100 add byte ptr [rcx], 0 -;; e58b: aa stosb byte ptr [rdi], al -;; e58c: 800100 add byte ptr [rcx], 0 -;; e58f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e598: 800100 add byte ptr [rcx], 0 -;; e59b: aa stosb byte ptr [rdi], al -;; e59c: 800100 add byte ptr [rcx], 0 -;; e59f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e5a8: 800100 add byte ptr [rcx], 0 -;; e5ab: aa stosb byte ptr [rdi], al -;; e5ac: 800100 add byte ptr [rcx], 0 -;; e5af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e5b8: 800100 add byte ptr [rcx], 0 -;; e5bb: aa stosb byte ptr [rdi], al -;; e5bc: 800100 add byte ptr [rcx], 0 -;; e5bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e5c8: 800100 add byte ptr [rcx], 0 -;; e5cb: aa stosb byte ptr [rdi], al -;; e5cc: 800100 add byte ptr [rcx], 0 -;; e5cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e5d8: 800100 add byte ptr [rcx], 0 -;; e5db: aa stosb byte ptr [rdi], al -;; e5dc: 800100 add byte ptr [rcx], 0 -;; e5df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e5e8: 800100 add byte ptr [rcx], 0 -;; e5eb: aa stosb byte ptr [rdi], al -;; e5ec: 800100 add byte ptr [rcx], 0 -;; e5ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e5f8: 800100 add byte ptr [rcx], 0 -;; e5fb: aa stosb byte ptr [rdi], al -;; e5fc: 800100 add byte ptr [rcx], 0 -;; e5ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e608: 800100 add byte ptr [rcx], 0 -;; e60b: aa stosb byte ptr [rdi], al -;; e60c: 800100 add byte ptr [rcx], 0 -;; e60f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e618: 800100 add byte ptr [rcx], 0 -;; e61b: aa stosb byte ptr [rdi], al -;; e61c: 800100 add byte ptr [rcx], 0 -;; e61f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e628: 800100 add byte ptr [rcx], 0 -;; e62b: aa stosb byte ptr [rdi], al -;; e62c: 800100 add byte ptr [rcx], 0 -;; e62f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e638: 800100 add byte ptr [rcx], 0 -;; e63b: aa stosb byte ptr [rdi], al -;; e63c: 800100 add byte ptr [rcx], 0 -;; e63f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e648: 800100 add byte ptr [rcx], 0 -;; e64b: aa stosb byte ptr [rdi], al -;; e64c: 800100 add byte ptr [rcx], 0 -;; e64f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e658: 800100 add byte ptr [rcx], 0 -;; e65b: aa stosb byte ptr [rdi], al -;; e65c: 800100 add byte ptr [rcx], 0 -;; e65f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e668: 800100 add byte ptr [rcx], 0 -;; e66b: aa stosb byte ptr [rdi], al -;; e66c: 800100 add byte ptr [rcx], 0 -;; e66f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e678: 800100 add byte ptr [rcx], 0 -;; e67b: aa stosb byte ptr [rdi], al -;; e67c: 800100 add byte ptr [rcx], 0 -;; e67f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e688: 800100 add byte ptr [rcx], 0 -;; e68b: aa stosb byte ptr [rdi], al -;; e68c: 800100 add byte ptr [rcx], 0 -;; e68f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e698: 800100 add byte ptr [rcx], 0 -;; e69b: aa stosb byte ptr [rdi], al -;; e69c: 800100 add byte ptr [rcx], 0 -;; e69f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e6a8: 800100 add byte ptr [rcx], 0 -;; e6ab: aa stosb byte ptr [rdi], al -;; e6ac: 800100 add byte ptr [rcx], 0 -;; e6af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e6b8: 800100 add byte ptr [rcx], 0 -;; e6bb: aa stosb byte ptr [rdi], al -;; e6bc: 800100 add byte ptr [rcx], 0 -;; e6bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e6c8: 800100 add byte ptr [rcx], 0 -;; e6cb: aa stosb byte ptr [rdi], al -;; e6cc: 800100 add byte ptr [rcx], 0 -;; e6cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e6d8: 800100 add byte ptr [rcx], 0 -;; e6db: aa stosb byte ptr [rdi], al -;; e6dc: 800100 add byte ptr [rcx], 0 -;; e6df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e6e8: 800100 add byte ptr [rcx], 0 -;; e6eb: aa stosb byte ptr [rdi], al -;; e6ec: 800100 add byte ptr [rcx], 0 -;; e6ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e6f8: 800100 add byte ptr [rcx], 0 -;; e6fb: aa stosb byte ptr [rdi], al -;; e6fc: 800100 add byte ptr [rcx], 0 -;; e6ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e708: 800100 add byte ptr [rcx], 0 -;; e70b: aa stosb byte ptr [rdi], al -;; e70c: 800100 add byte ptr [rcx], 0 -;; e70f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e718: 800100 add byte ptr [rcx], 0 -;; e71b: aa stosb byte ptr [rdi], al -;; e71c: 800100 add byte ptr [rcx], 0 -;; e71f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e728: 800100 add byte ptr [rcx], 0 -;; e72b: aa stosb byte ptr [rdi], al -;; e72c: 800100 add byte ptr [rcx], 0 -;; e72f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e738: 800100 add byte ptr [rcx], 0 -;; e73b: aa stosb byte ptr [rdi], al -;; e73c: 800100 add byte ptr [rcx], 0 -;; e73f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e748: 800100 add byte ptr [rcx], 0 -;; e74b: aa stosb byte ptr [rdi], al -;; e74c: 800100 add byte ptr [rcx], 0 -;; e74f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e758: 800100 add byte ptr [rcx], 0 -;; e75b: aa stosb byte ptr [rdi], al -;; e75c: 800100 add byte ptr [rcx], 0 -;; e75f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e768: 800100 add byte ptr [rcx], 0 -;; e76b: aa stosb byte ptr [rdi], al -;; e76c: 800100 add byte ptr [rcx], 0 -;; e76f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e778: 800100 add byte ptr [rcx], 0 -;; e77b: aa stosb byte ptr [rdi], al -;; e77c: 800100 add byte ptr [rcx], 0 -;; e77f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e788: 800100 add byte ptr [rcx], 0 -;; e78b: aa stosb byte ptr [rdi], al -;; e78c: 800100 add byte ptr [rcx], 0 -;; e78f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e798: 800100 add byte ptr [rcx], 0 -;; e79b: aa stosb byte ptr [rdi], al -;; e79c: 800100 add byte ptr [rcx], 0 -;; e79f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e7a8: 800100 add byte ptr [rcx], 0 -;; e7ab: aa stosb byte ptr [rdi], al -;; e7ac: 800100 add byte ptr [rcx], 0 -;; e7af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e7b8: 800100 add byte ptr [rcx], 0 -;; e7bb: aa stosb byte ptr [rdi], al -;; e7bc: 800100 add byte ptr [rcx], 0 -;; e7bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e7c8: 800100 add byte ptr [rcx], 0 -;; e7cb: aa stosb byte ptr [rdi], al -;; e7cc: 800100 add byte ptr [rcx], 0 -;; e7cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e7d8: 800100 add byte ptr [rcx], 0 -;; e7db: aa stosb byte ptr [rdi], al -;; e7dc: 800100 add byte ptr [rcx], 0 -;; e7df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e7e8: 800100 add byte ptr [rcx], 0 -;; e7eb: aa stosb byte ptr [rdi], al -;; e7ec: 800100 add byte ptr [rcx], 0 -;; e7ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e7f8: 800100 add byte ptr [rcx], 0 -;; e7fb: aa stosb byte ptr [rdi], al -;; e7fc: 800100 add byte ptr [rcx], 0 -;; e7ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e808: 800100 add byte ptr [rcx], 0 -;; e80b: aa stosb byte ptr [rdi], al -;; e80c: 800100 add byte ptr [rcx], 0 -;; e80f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e818: 800100 add byte ptr [rcx], 0 -;; e81b: aa stosb byte ptr [rdi], al -;; e81c: 800100 add byte ptr [rcx], 0 -;; e81f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e828: 800100 add byte ptr [rcx], 0 -;; e82b: aa stosb byte ptr [rdi], al -;; e82c: 800100 add byte ptr [rcx], 0 -;; e82f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e838: 800100 add byte ptr [rcx], 0 -;; e83b: aa stosb byte ptr [rdi], al -;; e83c: 800100 add byte ptr [rcx], 0 -;; e83f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e848: 800100 add byte ptr [rcx], 0 -;; e84b: aa stosb byte ptr [rdi], al -;; e84c: 800100 add byte ptr [rcx], 0 -;; e84f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e858: 800100 add byte ptr [rcx], 0 -;; e85b: aa stosb byte ptr [rdi], al -;; e85c: 800100 add byte ptr [rcx], 0 -;; e85f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e868: 800100 add byte ptr [rcx], 0 -;; e86b: aa stosb byte ptr [rdi], al -;; e86c: 800100 add byte ptr [rcx], 0 -;; e86f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e878: 800100 add byte ptr [rcx], 0 -;; e87b: aa stosb byte ptr [rdi], al -;; e87c: 800100 add byte ptr [rcx], 0 -;; e87f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e888: 800100 add byte ptr [rcx], 0 -;; e88b: aa stosb byte ptr [rdi], al -;; e88c: 800100 add byte ptr [rcx], 0 -;; e88f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e898: 800100 add byte ptr [rcx], 0 -;; e89b: aa stosb byte ptr [rdi], al -;; e89c: 800100 add byte ptr [rcx], 0 -;; e89f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e8a8: 800100 add byte ptr [rcx], 0 -;; e8ab: aa stosb byte ptr [rdi], al -;; e8ac: 800100 add byte ptr [rcx], 0 -;; e8af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e8b8: 800100 add byte ptr [rcx], 0 -;; e8bb: aa stosb byte ptr [rdi], al -;; e8bc: 800100 add byte ptr [rcx], 0 -;; e8bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e8c8: 800100 add byte ptr [rcx], 0 -;; e8cb: aa stosb byte ptr [rdi], al -;; e8cc: 800100 add byte ptr [rcx], 0 -;; e8cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e8d8: 800100 add byte ptr [rcx], 0 -;; e8db: aa stosb byte ptr [rdi], al -;; e8dc: 800100 add byte ptr [rcx], 0 -;; e8df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e8e8: 800100 add byte ptr [rcx], 0 -;; e8eb: aa stosb byte ptr [rdi], al -;; e8ec: 800100 add byte ptr [rcx], 0 -;; e8ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e8f8: 800100 add byte ptr [rcx], 0 -;; e8fb: aa stosb byte ptr [rdi], al -;; e8fc: 800100 add byte ptr [rcx], 0 -;; e8ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e908: 800100 add byte ptr [rcx], 0 -;; e90b: aa stosb byte ptr [rdi], al -;; e90c: 800100 add byte ptr [rcx], 0 -;; e90f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e918: 800100 add byte ptr [rcx], 0 -;; e91b: aa stosb byte ptr [rdi], al -;; e91c: 800100 add byte ptr [rcx], 0 -;; e91f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e928: 800100 add byte ptr [rcx], 0 -;; e92b: aa stosb byte ptr [rdi], al -;; e92c: 800100 add byte ptr [rcx], 0 -;; e92f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e938: 800100 add byte ptr [rcx], 0 -;; e93b: aa stosb byte ptr [rdi], al -;; e93c: 800100 add byte ptr [rcx], 0 -;; e93f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e948: 800100 add byte ptr [rcx], 0 -;; e94b: aa stosb byte ptr [rdi], al -;; e94c: 800100 add byte ptr [rcx], 0 -;; e94f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e958: 800100 add byte ptr [rcx], 0 -;; e95b: aa stosb byte ptr [rdi], al -;; e95c: 800100 add byte ptr [rcx], 0 -;; e95f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e968: 800100 add byte ptr [rcx], 0 -;; e96b: aa stosb byte ptr [rdi], al -;; e96c: 800100 add byte ptr [rcx], 0 -;; e96f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e978: 800100 add byte ptr [rcx], 0 -;; e97b: aa stosb byte ptr [rdi], al -;; e97c: 800100 add byte ptr [rcx], 0 -;; e97f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e988: 800100 add byte ptr [rcx], 0 -;; e98b: aa stosb byte ptr [rdi], al -;; e98c: 800100 add byte ptr [rcx], 0 -;; e98f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e998: 800100 add byte ptr [rcx], 0 -;; e99b: aa stosb byte ptr [rdi], al -;; e99c: 800100 add byte ptr [rcx], 0 -;; e99f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e9a8: 800100 add byte ptr [rcx], 0 -;; e9ab: aa stosb byte ptr [rdi], al -;; e9ac: 800100 add byte ptr [rcx], 0 -;; e9af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e9b8: 800100 add byte ptr [rcx], 0 -;; e9bb: aa stosb byte ptr [rdi], al -;; e9bc: 800100 add byte ptr [rcx], 0 -;; e9bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e9c8: 800100 add byte ptr [rcx], 0 -;; e9cb: aa stosb byte ptr [rdi], al -;; e9cc: 800100 add byte ptr [rcx], 0 -;; e9cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e9d8: 800100 add byte ptr [rcx], 0 -;; e9db: aa stosb byte ptr [rdi], al -;; e9dc: 800100 add byte ptr [rcx], 0 -;; e9df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e9e8: 800100 add byte ptr [rcx], 0 -;; e9eb: aa stosb byte ptr [rdi], al -;; e9ec: 800100 add byte ptr [rcx], 0 -;; e9ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; e9f8: 800100 add byte ptr [rcx], 0 -;; e9fb: aa stosb byte ptr [rdi], al -;; e9fc: 800100 add byte ptr [rcx], 0 -;; e9ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ea08: 800100 add byte ptr [rcx], 0 -;; ea0b: aa stosb byte ptr [rdi], al -;; ea0c: 800100 add byte ptr [rcx], 0 -;; ea0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ea18: 800100 add byte ptr [rcx], 0 -;; ea1b: aa stosb byte ptr [rdi], al -;; ea1c: 800100 add byte ptr [rcx], 0 -;; ea1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ea28: 800100 add byte ptr [rcx], 0 -;; ea2b: aa stosb byte ptr [rdi], al -;; ea2c: 800100 add byte ptr [rcx], 0 -;; ea2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ea38: 800100 add byte ptr [rcx], 0 -;; ea3b: aa stosb byte ptr [rdi], al -;; ea3c: 800100 add byte ptr [rcx], 0 -;; ea3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ea48: 800100 add byte ptr [rcx], 0 -;; ea4b: aa stosb byte ptr [rdi], al -;; ea4c: 800100 add byte ptr [rcx], 0 -;; ea4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ea58: 800100 add byte ptr [rcx], 0 -;; ea5b: aa stosb byte ptr [rdi], al -;; ea5c: 800100 add byte ptr [rcx], 0 -;; ea5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ea68: 800100 add byte ptr [rcx], 0 -;; ea6b: aa stosb byte ptr [rdi], al -;; ea6c: 800100 add byte ptr [rcx], 0 -;; ea6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ea78: 800100 add byte ptr [rcx], 0 -;; ea7b: aa stosb byte ptr [rdi], al -;; ea7c: 800100 add byte ptr [rcx], 0 -;; ea7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ea88: 800100 add byte ptr [rcx], 0 -;; ea8b: aa stosb byte ptr [rdi], al -;; ea8c: 800100 add byte ptr [rcx], 0 -;; ea8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ea98: 800100 add byte ptr [rcx], 0 -;; ea9b: aa stosb byte ptr [rdi], al -;; ea9c: 800100 add byte ptr [rcx], 0 -;; ea9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; eaa8: 800100 add byte ptr [rcx], 0 -;; eaab: aa stosb byte ptr [rdi], al -;; eaac: 800100 add byte ptr [rcx], 0 -;; eaaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; eab8: 800100 add byte ptr [rcx], 0 -;; eabb: aa stosb byte ptr [rdi], al -;; eabc: 800100 add byte ptr [rcx], 0 -;; eabf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; eac8: 800100 add byte ptr [rcx], 0 -;; eacb: aa stosb byte ptr [rdi], al -;; eacc: 800100 add byte ptr [rcx], 0 -;; eacf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ead8: 800100 add byte ptr [rcx], 0 -;; eadb: aa stosb byte ptr [rdi], al -;; eadc: 800100 add byte ptr [rcx], 0 -;; eadf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; eae8: 800100 add byte ptr [rcx], 0 -;; eaeb: aa stosb byte ptr [rdi], al -;; eaec: 800100 add byte ptr [rcx], 0 -;; eaef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; eaf8: 800100 add byte ptr [rcx], 0 -;; eafb: aa stosb byte ptr [rdi], al -;; eafc: 800100 add byte ptr [rcx], 0 -;; eaff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; eb08: 800100 add byte ptr [rcx], 0 -;; eb0b: aa stosb byte ptr [rdi], al -;; eb0c: 800100 add byte ptr [rcx], 0 -;; eb0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; eb18: 800100 add byte ptr [rcx], 0 -;; eb1b: aa stosb byte ptr [rdi], al -;; eb1c: 800100 add byte ptr [rcx], 0 -;; eb1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; eb28: 800100 add byte ptr [rcx], 0 -;; eb2b: aa stosb byte ptr [rdi], al -;; eb2c: 800100 add byte ptr [rcx], 0 -;; eb2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; eb38: 800100 add byte ptr [rcx], 0 -;; eb3b: aa stosb byte ptr [rdi], al -;; eb3c: 800100 add byte ptr [rcx], 0 -;; eb3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; eb48: 800100 add byte ptr [rcx], 0 -;; eb4b: aa stosb byte ptr [rdi], al -;; eb4c: 800100 add byte ptr [rcx], 0 -;; eb4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; eb58: 800100 add byte ptr [rcx], 0 -;; eb5b: aa stosb byte ptr [rdi], al -;; eb5c: 800100 add byte ptr [rcx], 0 -;; eb5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; eb68: 800100 add byte ptr [rcx], 0 -;; eb6b: aa stosb byte ptr [rdi], al -;; eb6c: 800100 add byte ptr [rcx], 0 -;; eb6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; eb78: 800100 add byte ptr [rcx], 0 -;; eb7b: aa stosb byte ptr [rdi], al -;; eb7c: 800100 add byte ptr [rcx], 0 -;; eb7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; eb88: 800100 add byte ptr [rcx], 0 -;; eb8b: aa stosb byte ptr [rdi], al -;; eb8c: 800100 add byte ptr [rcx], 0 -;; eb8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; eb98: 800100 add byte ptr [rcx], 0 -;; eb9b: aa stosb byte ptr [rdi], al -;; eb9c: 800100 add byte ptr [rcx], 0 -;; eb9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; eba8: 800100 add byte ptr [rcx], 0 -;; ebab: aa stosb byte ptr [rdi], al -;; ebac: 800100 add byte ptr [rcx], 0 -;; ebaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ebb8: 800100 add byte ptr [rcx], 0 -;; ebbb: aa stosb byte ptr [rdi], al -;; ebbc: 800100 add byte ptr [rcx], 0 -;; ebbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ebc8: 800100 add byte ptr [rcx], 0 -;; ebcb: aa stosb byte ptr [rdi], al -;; ebcc: 800100 add byte ptr [rcx], 0 -;; ebcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ebd8: 800100 add byte ptr [rcx], 0 -;; ebdb: aa stosb byte ptr [rdi], al -;; ebdc: 800100 add byte ptr [rcx], 0 -;; ebdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ebe8: 800100 add byte ptr [rcx], 0 -;; ebeb: aa stosb byte ptr [rdi], al -;; ebec: 800100 add byte ptr [rcx], 0 -;; ebef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ebf8: 800100 add byte ptr [rcx], 0 -;; ebfb: aa stosb byte ptr [rdi], al -;; ebfc: 800100 add byte ptr [rcx], 0 -;; ebff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ec08: 800100 add byte ptr [rcx], 0 -;; ec0b: aa stosb byte ptr [rdi], al -;; ec0c: 800100 add byte ptr [rcx], 0 -;; ec0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ec18: 800100 add byte ptr [rcx], 0 -;; ec1b: aa stosb byte ptr [rdi], al -;; ec1c: 800100 add byte ptr [rcx], 0 -;; ec1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ec28: 800100 add byte ptr [rcx], 0 -;; ec2b: aa stosb byte ptr [rdi], al -;; ec2c: 800100 add byte ptr [rcx], 0 -;; ec2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ec38: 800100 add byte ptr [rcx], 0 -;; ec3b: aa stosb byte ptr [rdi], al -;; ec3c: 800100 add byte ptr [rcx], 0 -;; ec3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ec48: 800100 add byte ptr [rcx], 0 -;; ec4b: aa stosb byte ptr [rdi], al -;; ec4c: 800100 add byte ptr [rcx], 0 -;; ec4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ec58: 800100 add byte ptr [rcx], 0 -;; ec5b: aa stosb byte ptr [rdi], al -;; ec5c: 800100 add byte ptr [rcx], 0 -;; ec5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ec68: 800100 add byte ptr [rcx], 0 -;; ec6b: aa stosb byte ptr [rdi], al -;; ec6c: 800100 add byte ptr [rcx], 0 -;; ec6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ec78: 800100 add byte ptr [rcx], 0 -;; ec7b: aa stosb byte ptr [rdi], al -;; ec7c: 800100 add byte ptr [rcx], 0 -;; ec7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ec88: 800100 add byte ptr [rcx], 0 -;; ec8b: aa stosb byte ptr [rdi], al -;; ec8c: 800100 add byte ptr [rcx], 0 -;; ec8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ec98: 800100 add byte ptr [rcx], 0 -;; ec9b: aa stosb byte ptr [rdi], al -;; ec9c: 800100 add byte ptr [rcx], 0 -;; ec9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; eca8: 800100 add byte ptr [rcx], 0 -;; ecab: aa stosb byte ptr [rdi], al -;; ecac: 800100 add byte ptr [rcx], 0 -;; ecaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ecb8: 800100 add byte ptr [rcx], 0 -;; ecbb: aa stosb byte ptr [rdi], al -;; ecbc: 800100 add byte ptr [rcx], 0 -;; ecbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ecc8: 800100 add byte ptr [rcx], 0 -;; eccb: aa stosb byte ptr [rdi], al -;; eccc: 800100 add byte ptr [rcx], 0 -;; eccf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ecd8: 800100 add byte ptr [rcx], 0 -;; ecdb: aa stosb byte ptr [rdi], al -;; ecdc: 800100 add byte ptr [rcx], 0 -;; ecdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ece8: 800100 add byte ptr [rcx], 0 -;; eceb: aa stosb byte ptr [rdi], al -;; ecec: 800100 add byte ptr [rcx], 0 -;; ecef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ecf8: 800100 add byte ptr [rcx], 0 -;; ecfb: aa stosb byte ptr [rdi], al -;; ecfc: 800100 add byte ptr [rcx], 0 -;; ecff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ed08: 800100 add byte ptr [rcx], 0 -;; ed0b: aa stosb byte ptr [rdi], al -;; ed0c: 800100 add byte ptr [rcx], 0 -;; ed0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ed18: 800100 add byte ptr [rcx], 0 -;; ed1b: aa stosb byte ptr [rdi], al -;; ed1c: 800100 add byte ptr [rcx], 0 -;; ed1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ed28: 800100 add byte ptr [rcx], 0 -;; ed2b: aa stosb byte ptr [rdi], al -;; ed2c: 800100 add byte ptr [rcx], 0 -;; ed2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ed38: 800100 add byte ptr [rcx], 0 -;; ed3b: aa stosb byte ptr [rdi], al -;; ed3c: 800100 add byte ptr [rcx], 0 -;; ed3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ed48: 800100 add byte ptr [rcx], 0 -;; ed4b: aa stosb byte ptr [rdi], al -;; ed4c: 800100 add byte ptr [rcx], 0 -;; ed4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ed58: 800100 add byte ptr [rcx], 0 -;; ed5b: aa stosb byte ptr [rdi], al -;; ed5c: 800100 add byte ptr [rcx], 0 -;; ed5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ed68: 800100 add byte ptr [rcx], 0 -;; ed6b: aa stosb byte ptr [rdi], al -;; ed6c: 800100 add byte ptr [rcx], 0 -;; ed6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ed78: 800100 add byte ptr [rcx], 0 -;; ed7b: aa stosb byte ptr [rdi], al -;; ed7c: 800100 add byte ptr [rcx], 0 -;; ed7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ed88: 800100 add byte ptr [rcx], 0 -;; ed8b: aa stosb byte ptr [rdi], al -;; ed8c: 800100 add byte ptr [rcx], 0 -;; ed8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ed98: 800100 add byte ptr [rcx], 0 -;; ed9b: aa stosb byte ptr [rdi], al -;; ed9c: 800100 add byte ptr [rcx], 0 -;; ed9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; eda8: 800100 add byte ptr [rcx], 0 -;; edab: aa stosb byte ptr [rdi], al -;; edac: 800100 add byte ptr [rcx], 0 -;; edaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; edb8: 800100 add byte ptr [rcx], 0 -;; edbb: aa stosb byte ptr [rdi], al -;; edbc: 800100 add byte ptr [rcx], 0 -;; edbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; edc8: 800100 add byte ptr [rcx], 0 -;; edcb: aa stosb byte ptr [rdi], al -;; edcc: 800100 add byte ptr [rcx], 0 -;; edcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; edd8: 800100 add byte ptr [rcx], 0 -;; eddb: aa stosb byte ptr [rdi], al -;; eddc: 800100 add byte ptr [rcx], 0 -;; eddf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ede8: 800100 add byte ptr [rcx], 0 -;; edeb: aa stosb byte ptr [rdi], al -;; edec: 800100 add byte ptr [rcx], 0 -;; edef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; edf8: 800100 add byte ptr [rcx], 0 -;; edfb: aa stosb byte ptr [rdi], al -;; edfc: 800100 add byte ptr [rcx], 0 -;; edff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ee08: 800100 add byte ptr [rcx], 0 -;; ee0b: aa stosb byte ptr [rdi], al -;; ee0c: 800100 add byte ptr [rcx], 0 -;; ee0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ee18: 800100 add byte ptr [rcx], 0 -;; ee1b: aa stosb byte ptr [rdi], al -;; ee1c: 800100 add byte ptr [rcx], 0 -;; ee1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ee28: 800100 add byte ptr [rcx], 0 -;; ee2b: aa stosb byte ptr [rdi], al -;; ee2c: 800100 add byte ptr [rcx], 0 -;; ee2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ee38: 800100 add byte ptr [rcx], 0 -;; ee3b: aa stosb byte ptr [rdi], al -;; ee3c: 800100 add byte ptr [rcx], 0 -;; ee3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ee48: 800100 add byte ptr [rcx], 0 -;; ee4b: aa stosb byte ptr [rdi], al -;; ee4c: 800100 add byte ptr [rcx], 0 -;; ee4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ee58: 800100 add byte ptr [rcx], 0 -;; ee5b: aa stosb byte ptr [rdi], al -;; ee5c: 800100 add byte ptr [rcx], 0 -;; ee5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ee68: 800100 add byte ptr [rcx], 0 -;; ee6b: aa stosb byte ptr [rdi], al -;; ee6c: 800100 add byte ptr [rcx], 0 -;; ee6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ee78: 800100 add byte ptr [rcx], 0 -;; ee7b: aa stosb byte ptr [rdi], al -;; ee7c: 800100 add byte ptr [rcx], 0 -;; ee7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ee88: 800100 add byte ptr [rcx], 0 -;; ee8b: aa stosb byte ptr [rdi], al -;; ee8c: 800100 add byte ptr [rcx], 0 -;; ee8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ee98: 800100 add byte ptr [rcx], 0 -;; ee9b: aa stosb byte ptr [rdi], al -;; ee9c: 800100 add byte ptr [rcx], 0 -;; ee9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; eea8: 800100 add byte ptr [rcx], 0 -;; eeab: aa stosb byte ptr [rdi], al -;; eeac: 800100 add byte ptr [rcx], 0 -;; eeaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; eeb8: 800100 add byte ptr [rcx], 0 -;; eebb: aa stosb byte ptr [rdi], al -;; eebc: 800100 add byte ptr [rcx], 0 -;; eebf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; eec8: 800100 add byte ptr [rcx], 0 -;; eecb: aa stosb byte ptr [rdi], al -;; eecc: 800100 add byte ptr [rcx], 0 -;; eecf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; eed8: 800100 add byte ptr [rcx], 0 -;; eedb: aa stosb byte ptr [rdi], al -;; eedc: 800100 add byte ptr [rcx], 0 -;; eedf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; eee8: 800100 add byte ptr [rcx], 0 -;; eeeb: aa stosb byte ptr [rdi], al -;; eeec: 800100 add byte ptr [rcx], 0 -;; eeef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; eef8: 800100 add byte ptr [rcx], 0 -;; eefb: aa stosb byte ptr [rdi], al -;; eefc: 800100 add byte ptr [rcx], 0 -;; eeff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ef08: 800100 add byte ptr [rcx], 0 -;; ef0b: aa stosb byte ptr [rdi], al -;; ef0c: 800100 add byte ptr [rcx], 0 -;; ef0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ef18: 800100 add byte ptr [rcx], 0 -;; ef1b: aa stosb byte ptr [rdi], al -;; ef1c: 800100 add byte ptr [rcx], 0 -;; ef1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ef28: 800100 add byte ptr [rcx], 0 -;; ef2b: aa stosb byte ptr [rdi], al -;; ef2c: 800100 add byte ptr [rcx], 0 -;; ef2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ef38: 800100 add byte ptr [rcx], 0 -;; ef3b: aa stosb byte ptr [rdi], al -;; ef3c: 800100 add byte ptr [rcx], 0 -;; ef3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ef48: 800100 add byte ptr [rcx], 0 -;; ef4b: aa stosb byte ptr [rdi], al -;; ef4c: 800100 add byte ptr [rcx], 0 -;; ef4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ef58: 800100 add byte ptr [rcx], 0 -;; ef5b: aa stosb byte ptr [rdi], al -;; ef5c: 800100 add byte ptr [rcx], 0 -;; ef5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ef68: 800100 add byte ptr [rcx], 0 -;; ef6b: aa stosb byte ptr [rdi], al -;; ef6c: 800100 add byte ptr [rcx], 0 -;; ef6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ef78: 800100 add byte ptr [rcx], 0 -;; ef7b: aa stosb byte ptr [rdi], al -;; ef7c: 800100 add byte ptr [rcx], 0 -;; ef7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ef88: 800100 add byte ptr [rcx], 0 -;; ef8b: aa stosb byte ptr [rdi], al -;; ef8c: 800100 add byte ptr [rcx], 0 -;; ef8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ef98: 800100 add byte ptr [rcx], 0 -;; ef9b: aa stosb byte ptr [rdi], al -;; ef9c: 800100 add byte ptr [rcx], 0 -;; ef9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; efa8: 800100 add byte ptr [rcx], 0 -;; efab: aa stosb byte ptr [rdi], al -;; efac: 800100 add byte ptr [rcx], 0 -;; efaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; efb8: 800100 add byte ptr [rcx], 0 -;; efbb: aa stosb byte ptr [rdi], al -;; efbc: 800100 add byte ptr [rcx], 0 -;; efbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; efc8: 800100 add byte ptr [rcx], 0 -;; efcb: aa stosb byte ptr [rdi], al -;; efcc: 800100 add byte ptr [rcx], 0 -;; efcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; efd8: 800100 add byte ptr [rcx], 0 -;; efdb: aa stosb byte ptr [rdi], al -;; efdc: 800100 add byte ptr [rcx], 0 -;; efdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; efe8: 800100 add byte ptr [rcx], 0 -;; efeb: aa stosb byte ptr [rdi], al -;; efec: 800100 add byte ptr [rcx], 0 -;; efef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; eff8: 800100 add byte ptr [rcx], 0 -;; effb: aa stosb byte ptr [rdi], al -;; effc: 800100 add byte ptr [rcx], 0 -;; efff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f008: 800100 add byte ptr [rcx], 0 -;; f00b: aa stosb byte ptr [rdi], al -;; f00c: 800100 add byte ptr [rcx], 0 -;; f00f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f018: 800100 add byte ptr [rcx], 0 -;; f01b: aa stosb byte ptr [rdi], al -;; f01c: 800100 add byte ptr [rcx], 0 -;; f01f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f028: 800100 add byte ptr [rcx], 0 -;; f02b: aa stosb byte ptr [rdi], al -;; f02c: 800100 add byte ptr [rcx], 0 -;; f02f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f038: 800100 add byte ptr [rcx], 0 -;; f03b: aa stosb byte ptr [rdi], al -;; f03c: 800100 add byte ptr [rcx], 0 -;; f03f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f048: 800100 add byte ptr [rcx], 0 -;; f04b: aa stosb byte ptr [rdi], al -;; f04c: 800100 add byte ptr [rcx], 0 -;; f04f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f058: 800100 add byte ptr [rcx], 0 -;; f05b: aa stosb byte ptr [rdi], al -;; f05c: 800100 add byte ptr [rcx], 0 -;; f05f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f068: 800100 add byte ptr [rcx], 0 -;; f06b: aa stosb byte ptr [rdi], al -;; f06c: 800100 add byte ptr [rcx], 0 -;; f06f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f078: 800100 add byte ptr [rcx], 0 -;; f07b: aa stosb byte ptr [rdi], al -;; f07c: 800100 add byte ptr [rcx], 0 -;; f07f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f088: 800100 add byte ptr [rcx], 0 -;; f08b: aa stosb byte ptr [rdi], al -;; f08c: 800100 add byte ptr [rcx], 0 -;; f08f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f098: 800100 add byte ptr [rcx], 0 -;; f09b: aa stosb byte ptr [rdi], al -;; f09c: 800100 add byte ptr [rcx], 0 -;; f09f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f0a8: 800100 add byte ptr [rcx], 0 -;; f0ab: aa stosb byte ptr [rdi], al -;; f0ac: 800100 add byte ptr [rcx], 0 -;; f0af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f0b8: 800100 add byte ptr [rcx], 0 -;; f0bb: aa stosb byte ptr [rdi], al -;; f0bc: 800100 add byte ptr [rcx], 0 -;; f0bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f0c8: 800100 add byte ptr [rcx], 0 -;; f0cb: aa stosb byte ptr [rdi], al -;; f0cc: 800100 add byte ptr [rcx], 0 -;; f0cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f0d8: 800100 add byte ptr [rcx], 0 -;; f0db: aa stosb byte ptr [rdi], al -;; f0dc: 800100 add byte ptr [rcx], 0 -;; f0df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f0e8: 800100 add byte ptr [rcx], 0 -;; f0eb: aa stosb byte ptr [rdi], al -;; f0ec: 800100 add byte ptr [rcx], 0 -;; f0ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f0f8: 800100 add byte ptr [rcx], 0 -;; f0fb: aa stosb byte ptr [rdi], al -;; f0fc: 800100 add byte ptr [rcx], 0 -;; f0ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f108: 800100 add byte ptr [rcx], 0 -;; f10b: aa stosb byte ptr [rdi], al -;; f10c: 800100 add byte ptr [rcx], 0 -;; f10f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f118: 800100 add byte ptr [rcx], 0 -;; f11b: aa stosb byte ptr [rdi], al -;; f11c: 800100 add byte ptr [rcx], 0 -;; f11f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f128: 800100 add byte ptr [rcx], 0 -;; f12b: aa stosb byte ptr [rdi], al -;; f12c: 800100 add byte ptr [rcx], 0 -;; f12f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f138: 800100 add byte ptr [rcx], 0 -;; f13b: aa stosb byte ptr [rdi], al -;; f13c: 800100 add byte ptr [rcx], 0 -;; f13f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f148: 800100 add byte ptr [rcx], 0 -;; f14b: aa stosb byte ptr [rdi], al -;; f14c: 800100 add byte ptr [rcx], 0 -;; f14f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f158: 800100 add byte ptr [rcx], 0 -;; f15b: aa stosb byte ptr [rdi], al -;; f15c: 800100 add byte ptr [rcx], 0 -;; f15f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f168: 800100 add byte ptr [rcx], 0 -;; f16b: aa stosb byte ptr [rdi], al -;; f16c: 800100 add byte ptr [rcx], 0 -;; f16f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f178: 800100 add byte ptr [rcx], 0 -;; f17b: aa stosb byte ptr [rdi], al -;; f17c: 800100 add byte ptr [rcx], 0 -;; f17f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f188: 800100 add byte ptr [rcx], 0 -;; f18b: aa stosb byte ptr [rdi], al -;; f18c: 800100 add byte ptr [rcx], 0 -;; f18f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f198: 800100 add byte ptr [rcx], 0 -;; f19b: aa stosb byte ptr [rdi], al -;; f19c: 800100 add byte ptr [rcx], 0 -;; f19f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f1a8: 800100 add byte ptr [rcx], 0 -;; f1ab: aa stosb byte ptr [rdi], al -;; f1ac: 800100 add byte ptr [rcx], 0 -;; f1af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f1b8: 800100 add byte ptr [rcx], 0 -;; f1bb: aa stosb byte ptr [rdi], al -;; f1bc: 800100 add byte ptr [rcx], 0 -;; f1bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f1c8: 800100 add byte ptr [rcx], 0 -;; f1cb: aa stosb byte ptr [rdi], al -;; f1cc: 800100 add byte ptr [rcx], 0 -;; f1cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f1d8: 800100 add byte ptr [rcx], 0 -;; f1db: aa stosb byte ptr [rdi], al -;; f1dc: 800100 add byte ptr [rcx], 0 -;; f1df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f1e8: 800100 add byte ptr [rcx], 0 -;; f1eb: aa stosb byte ptr [rdi], al -;; f1ec: 800100 add byte ptr [rcx], 0 -;; f1ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f1f8: 800100 add byte ptr [rcx], 0 -;; f1fb: aa stosb byte ptr [rdi], al -;; f1fc: 800100 add byte ptr [rcx], 0 -;; f1ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f208: 800100 add byte ptr [rcx], 0 -;; f20b: aa stosb byte ptr [rdi], al -;; f20c: 800100 add byte ptr [rcx], 0 -;; f20f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f218: 800100 add byte ptr [rcx], 0 -;; f21b: aa stosb byte ptr [rdi], al -;; f21c: 800100 add byte ptr [rcx], 0 -;; f21f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f228: 800100 add byte ptr [rcx], 0 -;; f22b: aa stosb byte ptr [rdi], al -;; f22c: 800100 add byte ptr [rcx], 0 -;; f22f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f238: 800100 add byte ptr [rcx], 0 -;; f23b: aa stosb byte ptr [rdi], al -;; f23c: 800100 add byte ptr [rcx], 0 -;; f23f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f248: 800100 add byte ptr [rcx], 0 -;; f24b: aa stosb byte ptr [rdi], al -;; f24c: 800100 add byte ptr [rcx], 0 -;; f24f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f258: 800100 add byte ptr [rcx], 0 -;; f25b: aa stosb byte ptr [rdi], al -;; f25c: 800100 add byte ptr [rcx], 0 -;; f25f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f268: 800100 add byte ptr [rcx], 0 -;; f26b: aa stosb byte ptr [rdi], al -;; f26c: 800100 add byte ptr [rcx], 0 -;; f26f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f278: 800100 add byte ptr [rcx], 0 -;; f27b: aa stosb byte ptr [rdi], al -;; f27c: 800100 add byte ptr [rcx], 0 -;; f27f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f288: 800100 add byte ptr [rcx], 0 -;; f28b: aa stosb byte ptr [rdi], al -;; f28c: 800100 add byte ptr [rcx], 0 -;; f28f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f298: 800100 add byte ptr [rcx], 0 -;; f29b: aa stosb byte ptr [rdi], al -;; f29c: 800100 add byte ptr [rcx], 0 -;; f29f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f2a8: 800100 add byte ptr [rcx], 0 -;; f2ab: aa stosb byte ptr [rdi], al -;; f2ac: 800100 add byte ptr [rcx], 0 -;; f2af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f2b8: 800100 add byte ptr [rcx], 0 -;; f2bb: aa stosb byte ptr [rdi], al -;; f2bc: 800100 add byte ptr [rcx], 0 -;; f2bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f2c8: 800100 add byte ptr [rcx], 0 -;; f2cb: aa stosb byte ptr [rdi], al -;; f2cc: 800100 add byte ptr [rcx], 0 -;; f2cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f2d8: 800100 add byte ptr [rcx], 0 -;; f2db: aa stosb byte ptr [rdi], al -;; f2dc: 800100 add byte ptr [rcx], 0 -;; f2df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f2e8: 800100 add byte ptr [rcx], 0 -;; f2eb: aa stosb byte ptr [rdi], al -;; f2ec: 800100 add byte ptr [rcx], 0 -;; f2ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f2f8: 800100 add byte ptr [rcx], 0 -;; f2fb: aa stosb byte ptr [rdi], al -;; f2fc: 800100 add byte ptr [rcx], 0 -;; f2ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f308: 800100 add byte ptr [rcx], 0 -;; f30b: aa stosb byte ptr [rdi], al -;; f30c: 800100 add byte ptr [rcx], 0 -;; f30f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f318: 800100 add byte ptr [rcx], 0 -;; f31b: aa stosb byte ptr [rdi], al -;; f31c: 800100 add byte ptr [rcx], 0 -;; f31f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f328: 800100 add byte ptr [rcx], 0 -;; f32b: aa stosb byte ptr [rdi], al -;; f32c: 800100 add byte ptr [rcx], 0 -;; f32f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f338: 800100 add byte ptr [rcx], 0 -;; f33b: aa stosb byte ptr [rdi], al -;; f33c: 800100 add byte ptr [rcx], 0 -;; f33f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f348: 800100 add byte ptr [rcx], 0 -;; f34b: aa stosb byte ptr [rdi], al -;; f34c: 800100 add byte ptr [rcx], 0 -;; f34f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f358: 800100 add byte ptr [rcx], 0 -;; f35b: aa stosb byte ptr [rdi], al -;; f35c: 800100 add byte ptr [rcx], 0 -;; f35f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f368: 800100 add byte ptr [rcx], 0 -;; f36b: aa stosb byte ptr [rdi], al -;; f36c: 800100 add byte ptr [rcx], 0 -;; f36f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f378: 800100 add byte ptr [rcx], 0 -;; f37b: aa stosb byte ptr [rdi], al -;; f37c: 800100 add byte ptr [rcx], 0 -;; f37f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f388: 800100 add byte ptr [rcx], 0 -;; f38b: aa stosb byte ptr [rdi], al -;; f38c: 800100 add byte ptr [rcx], 0 -;; f38f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f398: 800100 add byte ptr [rcx], 0 -;; f39b: aa stosb byte ptr [rdi], al -;; f39c: 800100 add byte ptr [rcx], 0 -;; f39f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f3a8: 800100 add byte ptr [rcx], 0 -;; f3ab: aa stosb byte ptr [rdi], al -;; f3ac: 800100 add byte ptr [rcx], 0 -;; f3af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f3b8: 800100 add byte ptr [rcx], 0 -;; f3bb: aa stosb byte ptr [rdi], al -;; f3bc: 800100 add byte ptr [rcx], 0 -;; f3bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f3c8: 800100 add byte ptr [rcx], 0 -;; f3cb: aa stosb byte ptr [rdi], al -;; f3cc: 800100 add byte ptr [rcx], 0 -;; f3cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f3d8: 800100 add byte ptr [rcx], 0 -;; f3db: aa stosb byte ptr [rdi], al -;; f3dc: 800100 add byte ptr [rcx], 0 -;; f3df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f3e8: 800100 add byte ptr [rcx], 0 -;; f3eb: aa stosb byte ptr [rdi], al -;; f3ec: 800100 add byte ptr [rcx], 0 -;; f3ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f3f8: 800100 add byte ptr [rcx], 0 -;; f3fb: aa stosb byte ptr [rdi], al -;; f3fc: 800100 add byte ptr [rcx], 0 -;; f3ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f408: 800100 add byte ptr [rcx], 0 -;; f40b: aa stosb byte ptr [rdi], al -;; f40c: 800100 add byte ptr [rcx], 0 -;; f40f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f418: 800100 add byte ptr [rcx], 0 -;; f41b: aa stosb byte ptr [rdi], al -;; f41c: 800100 add byte ptr [rcx], 0 -;; f41f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f428: 800100 add byte ptr [rcx], 0 -;; f42b: aa stosb byte ptr [rdi], al -;; f42c: 800100 add byte ptr [rcx], 0 -;; f42f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f438: 800100 add byte ptr [rcx], 0 -;; f43b: aa stosb byte ptr [rdi], al -;; f43c: 800100 add byte ptr [rcx], 0 -;; f43f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f448: 800100 add byte ptr [rcx], 0 -;; f44b: aa stosb byte ptr [rdi], al -;; f44c: 800100 add byte ptr [rcx], 0 -;; f44f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f458: 800100 add byte ptr [rcx], 0 -;; f45b: aa stosb byte ptr [rdi], al -;; f45c: 800100 add byte ptr [rcx], 0 -;; f45f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f468: 800100 add byte ptr [rcx], 0 -;; f46b: aa stosb byte ptr [rdi], al -;; f46c: 800100 add byte ptr [rcx], 0 -;; f46f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f478: 800100 add byte ptr [rcx], 0 -;; f47b: aa stosb byte ptr [rdi], al -;; f47c: 800100 add byte ptr [rcx], 0 -;; f47f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f488: 800100 add byte ptr [rcx], 0 -;; f48b: aa stosb byte ptr [rdi], al -;; f48c: 800100 add byte ptr [rcx], 0 -;; f48f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f498: 800100 add byte ptr [rcx], 0 -;; f49b: aa stosb byte ptr [rdi], al -;; f49c: 800100 add byte ptr [rcx], 0 -;; f49f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f4a8: 800100 add byte ptr [rcx], 0 -;; f4ab: aa stosb byte ptr [rdi], al -;; f4ac: 800100 add byte ptr [rcx], 0 -;; f4af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f4b8: 800100 add byte ptr [rcx], 0 -;; f4bb: aa stosb byte ptr [rdi], al -;; f4bc: 800100 add byte ptr [rcx], 0 -;; f4bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f4c8: 800100 add byte ptr [rcx], 0 -;; f4cb: aa stosb byte ptr [rdi], al -;; f4cc: 800100 add byte ptr [rcx], 0 -;; f4cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f4d8: 800100 add byte ptr [rcx], 0 -;; f4db: aa stosb byte ptr [rdi], al -;; f4dc: 800100 add byte ptr [rcx], 0 -;; f4df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f4e8: 800100 add byte ptr [rcx], 0 -;; f4eb: aa stosb byte ptr [rdi], al -;; f4ec: 800100 add byte ptr [rcx], 0 -;; f4ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f4f8: 800100 add byte ptr [rcx], 0 -;; f4fb: aa stosb byte ptr [rdi], al -;; f4fc: 800100 add byte ptr [rcx], 0 -;; f4ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f508: 800100 add byte ptr [rcx], 0 -;; f50b: aa stosb byte ptr [rdi], al -;; f50c: 800100 add byte ptr [rcx], 0 -;; f50f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f518: 800100 add byte ptr [rcx], 0 -;; f51b: aa stosb byte ptr [rdi], al -;; f51c: 800100 add byte ptr [rcx], 0 -;; f51f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f528: 800100 add byte ptr [rcx], 0 -;; f52b: aa stosb byte ptr [rdi], al -;; f52c: 800100 add byte ptr [rcx], 0 -;; f52f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f538: 800100 add byte ptr [rcx], 0 -;; f53b: aa stosb byte ptr [rdi], al -;; f53c: 800100 add byte ptr [rcx], 0 -;; f53f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f548: 800100 add byte ptr [rcx], 0 -;; f54b: aa stosb byte ptr [rdi], al -;; f54c: 800100 add byte ptr [rcx], 0 -;; f54f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f558: 800100 add byte ptr [rcx], 0 -;; f55b: aa stosb byte ptr [rdi], al -;; f55c: 800100 add byte ptr [rcx], 0 -;; f55f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f568: 800100 add byte ptr [rcx], 0 -;; f56b: aa stosb byte ptr [rdi], al -;; f56c: 800100 add byte ptr [rcx], 0 -;; f56f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f578: 800100 add byte ptr [rcx], 0 -;; f57b: aa stosb byte ptr [rdi], al -;; f57c: 800100 add byte ptr [rcx], 0 -;; f57f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f588: 800100 add byte ptr [rcx], 0 -;; f58b: aa stosb byte ptr [rdi], al -;; f58c: 800100 add byte ptr [rcx], 0 -;; f58f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f598: 800100 add byte ptr [rcx], 0 -;; f59b: aa stosb byte ptr [rdi], al -;; f59c: 800100 add byte ptr [rcx], 0 -;; f59f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f5a8: 800100 add byte ptr [rcx], 0 -;; f5ab: aa stosb byte ptr [rdi], al -;; f5ac: 800100 add byte ptr [rcx], 0 -;; f5af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f5b8: 800100 add byte ptr [rcx], 0 -;; f5bb: aa stosb byte ptr [rdi], al -;; f5bc: 800100 add byte ptr [rcx], 0 -;; f5bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f5c8: 800100 add byte ptr [rcx], 0 -;; f5cb: aa stosb byte ptr [rdi], al -;; f5cc: 800100 add byte ptr [rcx], 0 -;; f5cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f5d8: 800100 add byte ptr [rcx], 0 -;; f5db: aa stosb byte ptr [rdi], al -;; f5dc: 800100 add byte ptr [rcx], 0 -;; f5df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f5e8: 800100 add byte ptr [rcx], 0 -;; f5eb: aa stosb byte ptr [rdi], al -;; f5ec: 800100 add byte ptr [rcx], 0 -;; f5ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f5f8: 800100 add byte ptr [rcx], 0 -;; f5fb: aa stosb byte ptr [rdi], al -;; f5fc: 800100 add byte ptr [rcx], 0 -;; f5ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f608: 800100 add byte ptr [rcx], 0 -;; f60b: aa stosb byte ptr [rdi], al -;; f60c: 800100 add byte ptr [rcx], 0 -;; f60f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f618: 800100 add byte ptr [rcx], 0 -;; f61b: aa stosb byte ptr [rdi], al -;; f61c: 800100 add byte ptr [rcx], 0 -;; f61f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f628: 800100 add byte ptr [rcx], 0 -;; f62b: aa stosb byte ptr [rdi], al -;; f62c: 800100 add byte ptr [rcx], 0 -;; f62f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f638: 800100 add byte ptr [rcx], 0 -;; f63b: aa stosb byte ptr [rdi], al -;; f63c: 800100 add byte ptr [rcx], 0 -;; f63f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f648: 800100 add byte ptr [rcx], 0 -;; f64b: aa stosb byte ptr [rdi], al -;; f64c: 800100 add byte ptr [rcx], 0 -;; f64f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f658: 800100 add byte ptr [rcx], 0 -;; f65b: aa stosb byte ptr [rdi], al -;; f65c: 800100 add byte ptr [rcx], 0 -;; f65f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f668: 800100 add byte ptr [rcx], 0 -;; f66b: aa stosb byte ptr [rdi], al -;; f66c: 800100 add byte ptr [rcx], 0 -;; f66f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f678: 800100 add byte ptr [rcx], 0 -;; f67b: aa stosb byte ptr [rdi], al -;; f67c: 800100 add byte ptr [rcx], 0 -;; f67f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f688: 800100 add byte ptr [rcx], 0 -;; f68b: aa stosb byte ptr [rdi], al -;; f68c: 800100 add byte ptr [rcx], 0 -;; f68f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f698: 800100 add byte ptr [rcx], 0 -;; f69b: aa stosb byte ptr [rdi], al -;; f69c: 800100 add byte ptr [rcx], 0 -;; f69f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f6a8: 800100 add byte ptr [rcx], 0 -;; f6ab: aa stosb byte ptr [rdi], al -;; f6ac: 800100 add byte ptr [rcx], 0 -;; f6af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f6b8: 800100 add byte ptr [rcx], 0 -;; f6bb: aa stosb byte ptr [rdi], al -;; f6bc: 800100 add byte ptr [rcx], 0 -;; f6bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f6c8: 800100 add byte ptr [rcx], 0 -;; f6cb: aa stosb byte ptr [rdi], al -;; f6cc: 800100 add byte ptr [rcx], 0 -;; f6cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f6d8: 800100 add byte ptr [rcx], 0 -;; f6db: aa stosb byte ptr [rdi], al -;; f6dc: 800100 add byte ptr [rcx], 0 -;; f6df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f6e8: 800100 add byte ptr [rcx], 0 -;; f6eb: aa stosb byte ptr [rdi], al -;; f6ec: 800100 add byte ptr [rcx], 0 -;; f6ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f6f8: 800100 add byte ptr [rcx], 0 -;; f6fb: aa stosb byte ptr [rdi], al -;; f6fc: 800100 add byte ptr [rcx], 0 -;; f6ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f708: 800100 add byte ptr [rcx], 0 -;; f70b: aa stosb byte ptr [rdi], al -;; f70c: 800100 add byte ptr [rcx], 0 -;; f70f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f718: 800100 add byte ptr [rcx], 0 -;; f71b: aa stosb byte ptr [rdi], al -;; f71c: 800100 add byte ptr [rcx], 0 -;; f71f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f728: 800100 add byte ptr [rcx], 0 -;; f72b: aa stosb byte ptr [rdi], al -;; f72c: 800100 add byte ptr [rcx], 0 -;; f72f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f738: 800100 add byte ptr [rcx], 0 -;; f73b: aa stosb byte ptr [rdi], al -;; f73c: 800100 add byte ptr [rcx], 0 -;; f73f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f748: 800100 add byte ptr [rcx], 0 -;; f74b: aa stosb byte ptr [rdi], al -;; f74c: 800100 add byte ptr [rcx], 0 -;; f74f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f758: 800100 add byte ptr [rcx], 0 -;; f75b: aa stosb byte ptr [rdi], al -;; f75c: 800100 add byte ptr [rcx], 0 -;; f75f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f768: 800100 add byte ptr [rcx], 0 -;; f76b: aa stosb byte ptr [rdi], al -;; f76c: 800100 add byte ptr [rcx], 0 -;; f76f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f778: 800100 add byte ptr [rcx], 0 -;; f77b: aa stosb byte ptr [rdi], al -;; f77c: 800100 add byte ptr [rcx], 0 -;; f77f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f788: 800100 add byte ptr [rcx], 0 -;; f78b: aa stosb byte ptr [rdi], al -;; f78c: 800100 add byte ptr [rcx], 0 -;; f78f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f798: 800100 add byte ptr [rcx], 0 -;; f79b: aa stosb byte ptr [rdi], al -;; f79c: 800100 add byte ptr [rcx], 0 -;; f79f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f7a8: 800100 add byte ptr [rcx], 0 -;; f7ab: aa stosb byte ptr [rdi], al -;; f7ac: 800100 add byte ptr [rcx], 0 -;; f7af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f7b8: 800100 add byte ptr [rcx], 0 -;; f7bb: aa stosb byte ptr [rdi], al -;; f7bc: 800100 add byte ptr [rcx], 0 -;; f7bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f7c8: 800100 add byte ptr [rcx], 0 -;; f7cb: aa stosb byte ptr [rdi], al -;; f7cc: 800100 add byte ptr [rcx], 0 -;; f7cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f7d8: 800100 add byte ptr [rcx], 0 -;; f7db: aa stosb byte ptr [rdi], al -;; f7dc: 800100 add byte ptr [rcx], 0 -;; f7df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f7e8: 800100 add byte ptr [rcx], 0 -;; f7eb: aa stosb byte ptr [rdi], al -;; f7ec: 800100 add byte ptr [rcx], 0 -;; f7ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f7f8: 800100 add byte ptr [rcx], 0 -;; f7fb: aa stosb byte ptr [rdi], al -;; f7fc: 800100 add byte ptr [rcx], 0 -;; f7ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f808: 800100 add byte ptr [rcx], 0 -;; f80b: aa stosb byte ptr [rdi], al -;; f80c: 800100 add byte ptr [rcx], 0 -;; f80f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f818: 800100 add byte ptr [rcx], 0 -;; f81b: aa stosb byte ptr [rdi], al -;; f81c: 800100 add byte ptr [rcx], 0 -;; f81f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f828: 800100 add byte ptr [rcx], 0 -;; f82b: aa stosb byte ptr [rdi], al -;; f82c: 800100 add byte ptr [rcx], 0 -;; f82f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f838: 800100 add byte ptr [rcx], 0 -;; f83b: aa stosb byte ptr [rdi], al -;; f83c: 800100 add byte ptr [rcx], 0 -;; f83f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f848: 800100 add byte ptr [rcx], 0 -;; f84b: aa stosb byte ptr [rdi], al -;; f84c: 800100 add byte ptr [rcx], 0 -;; f84f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f858: 800100 add byte ptr [rcx], 0 -;; f85b: aa stosb byte ptr [rdi], al -;; f85c: 800100 add byte ptr [rcx], 0 -;; f85f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f868: 800100 add byte ptr [rcx], 0 -;; f86b: aa stosb byte ptr [rdi], al -;; f86c: 800100 add byte ptr [rcx], 0 -;; f86f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f878: 800100 add byte ptr [rcx], 0 -;; f87b: aa stosb byte ptr [rdi], al -;; f87c: 800100 add byte ptr [rcx], 0 -;; f87f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f888: 800100 add byte ptr [rcx], 0 -;; f88b: aa stosb byte ptr [rdi], al -;; f88c: 800100 add byte ptr [rcx], 0 -;; f88f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f898: 800100 add byte ptr [rcx], 0 -;; f89b: aa stosb byte ptr [rdi], al -;; f89c: 800100 add byte ptr [rcx], 0 -;; f89f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f8a8: 800100 add byte ptr [rcx], 0 -;; f8ab: aa stosb byte ptr [rdi], al -;; f8ac: 800100 add byte ptr [rcx], 0 -;; f8af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f8b8: 800100 add byte ptr [rcx], 0 -;; f8bb: aa stosb byte ptr [rdi], al -;; f8bc: 800100 add byte ptr [rcx], 0 -;; f8bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f8c8: 800100 add byte ptr [rcx], 0 -;; f8cb: aa stosb byte ptr [rdi], al -;; f8cc: 800100 add byte ptr [rcx], 0 -;; f8cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f8d8: 800100 add byte ptr [rcx], 0 -;; f8db: aa stosb byte ptr [rdi], al -;; f8dc: 800100 add byte ptr [rcx], 0 -;; f8df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f8e8: 800100 add byte ptr [rcx], 0 -;; f8eb: aa stosb byte ptr [rdi], al -;; f8ec: 800100 add byte ptr [rcx], 0 -;; f8ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f8f8: 800100 add byte ptr [rcx], 0 -;; f8fb: aa stosb byte ptr [rdi], al -;; f8fc: 800100 add byte ptr [rcx], 0 -;; f8ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f908: 800100 add byte ptr [rcx], 0 -;; f90b: aa stosb byte ptr [rdi], al -;; f90c: 800100 add byte ptr [rcx], 0 -;; f90f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f918: 800100 add byte ptr [rcx], 0 -;; f91b: aa stosb byte ptr [rdi], al -;; f91c: 800100 add byte ptr [rcx], 0 -;; f91f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f928: 800100 add byte ptr [rcx], 0 -;; f92b: aa stosb byte ptr [rdi], al -;; f92c: 800100 add byte ptr [rcx], 0 -;; f92f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f938: 800100 add byte ptr [rcx], 0 -;; f93b: aa stosb byte ptr [rdi], al -;; f93c: 800100 add byte ptr [rcx], 0 -;; f93f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f948: 800100 add byte ptr [rcx], 0 -;; f94b: aa stosb byte ptr [rdi], al -;; f94c: 800100 add byte ptr [rcx], 0 -;; f94f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f958: 800100 add byte ptr [rcx], 0 -;; f95b: aa stosb byte ptr [rdi], al -;; f95c: 800100 add byte ptr [rcx], 0 -;; f95f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f968: 800100 add byte ptr [rcx], 0 -;; f96b: aa stosb byte ptr [rdi], al -;; f96c: 800100 add byte ptr [rcx], 0 -;; f96f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f978: 800100 add byte ptr [rcx], 0 -;; f97b: aa stosb byte ptr [rdi], al -;; f97c: 800100 add byte ptr [rcx], 0 -;; f97f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f988: 800100 add byte ptr [rcx], 0 -;; f98b: aa stosb byte ptr [rdi], al -;; f98c: 800100 add byte ptr [rcx], 0 -;; f98f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f998: 800100 add byte ptr [rcx], 0 -;; f99b: aa stosb byte ptr [rdi], al -;; f99c: 800100 add byte ptr [rcx], 0 -;; f99f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f9a8: 800100 add byte ptr [rcx], 0 -;; f9ab: aa stosb byte ptr [rdi], al -;; f9ac: 800100 add byte ptr [rcx], 0 -;; f9af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f9b8: 800100 add byte ptr [rcx], 0 -;; f9bb: aa stosb byte ptr [rdi], al -;; f9bc: 800100 add byte ptr [rcx], 0 -;; f9bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f9c8: 800100 add byte ptr [rcx], 0 -;; f9cb: aa stosb byte ptr [rdi], al -;; f9cc: 800100 add byte ptr [rcx], 0 -;; f9cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f9d8: 800100 add byte ptr [rcx], 0 -;; f9db: aa stosb byte ptr [rdi], al -;; f9dc: 800100 add byte ptr [rcx], 0 -;; f9df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f9e8: 800100 add byte ptr [rcx], 0 -;; f9eb: aa stosb byte ptr [rdi], al -;; f9ec: 800100 add byte ptr [rcx], 0 -;; f9ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; f9f8: 800100 add byte ptr [rcx], 0 -;; f9fb: aa stosb byte ptr [rdi], al -;; f9fc: 800100 add byte ptr [rcx], 0 -;; f9ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fa08: 800100 add byte ptr [rcx], 0 -;; fa0b: aa stosb byte ptr [rdi], al -;; fa0c: 800100 add byte ptr [rcx], 0 -;; fa0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fa18: 800100 add byte ptr [rcx], 0 -;; fa1b: aa stosb byte ptr [rdi], al -;; fa1c: 800100 add byte ptr [rcx], 0 -;; fa1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fa28: 800100 add byte ptr [rcx], 0 -;; fa2b: aa stosb byte ptr [rdi], al -;; fa2c: 800100 add byte ptr [rcx], 0 -;; fa2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fa38: 800100 add byte ptr [rcx], 0 -;; fa3b: aa stosb byte ptr [rdi], al -;; fa3c: 800100 add byte ptr [rcx], 0 -;; fa3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fa48: 800100 add byte ptr [rcx], 0 -;; fa4b: aa stosb byte ptr [rdi], al -;; fa4c: 800100 add byte ptr [rcx], 0 -;; fa4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fa58: 800100 add byte ptr [rcx], 0 -;; fa5b: aa stosb byte ptr [rdi], al -;; fa5c: 800100 add byte ptr [rcx], 0 -;; fa5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fa68: 800100 add byte ptr [rcx], 0 -;; fa6b: aa stosb byte ptr [rdi], al -;; fa6c: 800100 add byte ptr [rcx], 0 -;; fa6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fa78: 800100 add byte ptr [rcx], 0 -;; fa7b: aa stosb byte ptr [rdi], al -;; fa7c: 800100 add byte ptr [rcx], 0 -;; fa7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fa88: 800100 add byte ptr [rcx], 0 -;; fa8b: aa stosb byte ptr [rdi], al -;; fa8c: 800100 add byte ptr [rcx], 0 -;; fa8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fa98: 800100 add byte ptr [rcx], 0 -;; fa9b: aa stosb byte ptr [rdi], al -;; fa9c: 800100 add byte ptr [rcx], 0 -;; fa9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; faa8: 800100 add byte ptr [rcx], 0 -;; faab: aa stosb byte ptr [rdi], al -;; faac: 800100 add byte ptr [rcx], 0 -;; faaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fab8: 800100 add byte ptr [rcx], 0 -;; fabb: aa stosb byte ptr [rdi], al -;; fabc: 800100 add byte ptr [rcx], 0 -;; fabf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fac8: 800100 add byte ptr [rcx], 0 -;; facb: aa stosb byte ptr [rdi], al -;; facc: 800100 add byte ptr [rcx], 0 -;; facf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fad8: 800100 add byte ptr [rcx], 0 -;; fadb: aa stosb byte ptr [rdi], al -;; fadc: 800100 add byte ptr [rcx], 0 -;; fadf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fae8: 800100 add byte ptr [rcx], 0 -;; faeb: aa stosb byte ptr [rdi], al -;; faec: 800100 add byte ptr [rcx], 0 -;; faef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; faf8: 800100 add byte ptr [rcx], 0 -;; fafb: aa stosb byte ptr [rdi], al -;; fafc: 800100 add byte ptr [rcx], 0 -;; faff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fb08: 800100 add byte ptr [rcx], 0 -;; fb0b: aa stosb byte ptr [rdi], al -;; fb0c: 800100 add byte ptr [rcx], 0 -;; fb0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fb18: 800100 add byte ptr [rcx], 0 -;; fb1b: aa stosb byte ptr [rdi], al -;; fb1c: 800100 add byte ptr [rcx], 0 -;; fb1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fb28: 800100 add byte ptr [rcx], 0 -;; fb2b: aa stosb byte ptr [rdi], al -;; fb2c: 800100 add byte ptr [rcx], 0 -;; fb2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fb38: 800100 add byte ptr [rcx], 0 -;; fb3b: aa stosb byte ptr [rdi], al -;; fb3c: 800100 add byte ptr [rcx], 0 -;; fb3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fb48: 800100 add byte ptr [rcx], 0 -;; fb4b: aa stosb byte ptr [rdi], al -;; fb4c: 800100 add byte ptr [rcx], 0 -;; fb4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fb58: 800100 add byte ptr [rcx], 0 -;; fb5b: aa stosb byte ptr [rdi], al -;; fb5c: 800100 add byte ptr [rcx], 0 -;; fb5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fb68: 800100 add byte ptr [rcx], 0 -;; fb6b: aa stosb byte ptr [rdi], al -;; fb6c: 800100 add byte ptr [rcx], 0 -;; fb6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fb78: 800100 add byte ptr [rcx], 0 -;; fb7b: aa stosb byte ptr [rdi], al -;; fb7c: 800100 add byte ptr [rcx], 0 -;; fb7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fb88: 800100 add byte ptr [rcx], 0 -;; fb8b: aa stosb byte ptr [rdi], al -;; fb8c: 800100 add byte ptr [rcx], 0 -;; fb8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fb98: 800100 add byte ptr [rcx], 0 -;; fb9b: aa stosb byte ptr [rdi], al -;; fb9c: 800100 add byte ptr [rcx], 0 -;; fb9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fba8: 800100 add byte ptr [rcx], 0 -;; fbab: aa stosb byte ptr [rdi], al -;; fbac: 800100 add byte ptr [rcx], 0 -;; fbaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fbb8: 800100 add byte ptr [rcx], 0 -;; fbbb: aa stosb byte ptr [rdi], al -;; fbbc: 800100 add byte ptr [rcx], 0 -;; fbbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fbc8: 800100 add byte ptr [rcx], 0 -;; fbcb: aa stosb byte ptr [rdi], al -;; fbcc: 800100 add byte ptr [rcx], 0 -;; fbcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fbd8: 800100 add byte ptr [rcx], 0 -;; fbdb: aa stosb byte ptr [rdi], al -;; fbdc: 800100 add byte ptr [rcx], 0 -;; fbdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fbe8: 800100 add byte ptr [rcx], 0 -;; fbeb: aa stosb byte ptr [rdi], al -;; fbec: 800100 add byte ptr [rcx], 0 -;; fbef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fbf8: 800100 add byte ptr [rcx], 0 -;; fbfb: aa stosb byte ptr [rdi], al -;; fbfc: 800100 add byte ptr [rcx], 0 -;; fbff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fc08: 800100 add byte ptr [rcx], 0 -;; fc0b: aa stosb byte ptr [rdi], al -;; fc0c: 800100 add byte ptr [rcx], 0 -;; fc0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fc18: 800100 add byte ptr [rcx], 0 -;; fc1b: aa stosb byte ptr [rdi], al -;; fc1c: 800100 add byte ptr [rcx], 0 -;; fc1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fc28: 800100 add byte ptr [rcx], 0 -;; fc2b: aa stosb byte ptr [rdi], al -;; fc2c: 800100 add byte ptr [rcx], 0 -;; fc2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fc38: 800100 add byte ptr [rcx], 0 -;; fc3b: aa stosb byte ptr [rdi], al -;; fc3c: 800100 add byte ptr [rcx], 0 -;; fc3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fc48: 800100 add byte ptr [rcx], 0 -;; fc4b: aa stosb byte ptr [rdi], al -;; fc4c: 800100 add byte ptr [rcx], 0 -;; fc4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fc58: 800100 add byte ptr [rcx], 0 -;; fc5b: aa stosb byte ptr [rdi], al -;; fc5c: 800100 add byte ptr [rcx], 0 -;; fc5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fc68: 800100 add byte ptr [rcx], 0 -;; fc6b: aa stosb byte ptr [rdi], al -;; fc6c: 800100 add byte ptr [rcx], 0 -;; fc6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fc78: 800100 add byte ptr [rcx], 0 -;; fc7b: aa stosb byte ptr [rdi], al -;; fc7c: 800100 add byte ptr [rcx], 0 -;; fc7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fc88: 800100 add byte ptr [rcx], 0 -;; fc8b: aa stosb byte ptr [rdi], al -;; fc8c: 800100 add byte ptr [rcx], 0 -;; fc8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fc98: 800100 add byte ptr [rcx], 0 -;; fc9b: aa stosb byte ptr [rdi], al -;; fc9c: 800100 add byte ptr [rcx], 0 -;; fc9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fca8: 800100 add byte ptr [rcx], 0 -;; fcab: aa stosb byte ptr [rdi], al -;; fcac: 800100 add byte ptr [rcx], 0 -;; fcaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fcb8: 800100 add byte ptr [rcx], 0 -;; fcbb: aa stosb byte ptr [rdi], al -;; fcbc: 800100 add byte ptr [rcx], 0 -;; fcbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fcc8: 800100 add byte ptr [rcx], 0 -;; fccb: aa stosb byte ptr [rdi], al -;; fccc: 800100 add byte ptr [rcx], 0 -;; fccf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fcd8: 800100 add byte ptr [rcx], 0 -;; fcdb: aa stosb byte ptr [rdi], al -;; fcdc: 800100 add byte ptr [rcx], 0 -;; fcdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fce8: 800100 add byte ptr [rcx], 0 -;; fceb: aa stosb byte ptr [rdi], al -;; fcec: 800100 add byte ptr [rcx], 0 -;; fcef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fcf8: 800100 add byte ptr [rcx], 0 -;; fcfb: aa stosb byte ptr [rdi], al -;; fcfc: 800100 add byte ptr [rcx], 0 -;; fcff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fd08: 800100 add byte ptr [rcx], 0 -;; fd0b: aa stosb byte ptr [rdi], al -;; fd0c: 800100 add byte ptr [rcx], 0 -;; fd0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fd18: 800100 add byte ptr [rcx], 0 -;; fd1b: aa stosb byte ptr [rdi], al -;; fd1c: 800100 add byte ptr [rcx], 0 -;; fd1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fd28: 800100 add byte ptr [rcx], 0 -;; fd2b: aa stosb byte ptr [rdi], al -;; fd2c: 800100 add byte ptr [rcx], 0 -;; fd2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fd38: 800100 add byte ptr [rcx], 0 -;; fd3b: aa stosb byte ptr [rdi], al -;; fd3c: 800100 add byte ptr [rcx], 0 -;; fd3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fd48: 800100 add byte ptr [rcx], 0 -;; fd4b: aa stosb byte ptr [rdi], al -;; fd4c: 800100 add byte ptr [rcx], 0 -;; fd4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fd58: 800100 add byte ptr [rcx], 0 -;; fd5b: aa stosb byte ptr [rdi], al -;; fd5c: 800100 add byte ptr [rcx], 0 -;; fd5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fd68: 800100 add byte ptr [rcx], 0 -;; fd6b: aa stosb byte ptr [rdi], al -;; fd6c: 800100 add byte ptr [rcx], 0 -;; fd6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fd78: 800100 add byte ptr [rcx], 0 -;; fd7b: aa stosb byte ptr [rdi], al -;; fd7c: 800100 add byte ptr [rcx], 0 -;; fd7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fd88: 800100 add byte ptr [rcx], 0 -;; fd8b: aa stosb byte ptr [rdi], al -;; fd8c: 800100 add byte ptr [rcx], 0 -;; fd8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fd98: 800100 add byte ptr [rcx], 0 -;; fd9b: aa stosb byte ptr [rdi], al -;; fd9c: 800100 add byte ptr [rcx], 0 -;; fd9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fda8: 800100 add byte ptr [rcx], 0 -;; fdab: aa stosb byte ptr [rdi], al -;; fdac: 800100 add byte ptr [rcx], 0 -;; fdaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fdb8: 800100 add byte ptr [rcx], 0 -;; fdbb: aa stosb byte ptr [rdi], al -;; fdbc: 800100 add byte ptr [rcx], 0 -;; fdbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fdc8: 800100 add byte ptr [rcx], 0 -;; fdcb: aa stosb byte ptr [rdi], al -;; fdcc: 800100 add byte ptr [rcx], 0 -;; fdcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fdd8: 800100 add byte ptr [rcx], 0 -;; fddb: aa stosb byte ptr [rdi], al -;; fddc: 800100 add byte ptr [rcx], 0 -;; fddf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fde8: 800100 add byte ptr [rcx], 0 -;; fdeb: aa stosb byte ptr [rdi], al -;; fdec: 800100 add byte ptr [rcx], 0 -;; fdef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fdf8: 800100 add byte ptr [rcx], 0 -;; fdfb: aa stosb byte ptr [rdi], al -;; fdfc: 800100 add byte ptr [rcx], 0 -;; fdff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fe08: 800100 add byte ptr [rcx], 0 -;; fe0b: aa stosb byte ptr [rdi], al -;; fe0c: 800100 add byte ptr [rcx], 0 -;; fe0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fe18: 800100 add byte ptr [rcx], 0 -;; fe1b: aa stosb byte ptr [rdi], al -;; fe1c: 800100 add byte ptr [rcx], 0 -;; fe1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fe28: 800100 add byte ptr [rcx], 0 -;; fe2b: aa stosb byte ptr [rdi], al -;; fe2c: 800100 add byte ptr [rcx], 0 -;; fe2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fe38: 800100 add byte ptr [rcx], 0 -;; fe3b: aa stosb byte ptr [rdi], al -;; fe3c: 800100 add byte ptr [rcx], 0 -;; fe3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fe48: 800100 add byte ptr [rcx], 0 -;; fe4b: aa stosb byte ptr [rdi], al -;; fe4c: 800100 add byte ptr [rcx], 0 -;; fe4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fe58: 800100 add byte ptr [rcx], 0 -;; fe5b: aa stosb byte ptr [rdi], al -;; fe5c: 800100 add byte ptr [rcx], 0 -;; fe5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fe68: 800100 add byte ptr [rcx], 0 -;; fe6b: aa stosb byte ptr [rdi], al -;; fe6c: 800100 add byte ptr [rcx], 0 -;; fe6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fe78: 800100 add byte ptr [rcx], 0 -;; fe7b: aa stosb byte ptr [rdi], al -;; fe7c: 800100 add byte ptr [rcx], 0 -;; fe7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fe88: 800100 add byte ptr [rcx], 0 -;; fe8b: aa stosb byte ptr [rdi], al -;; fe8c: 800100 add byte ptr [rcx], 0 -;; fe8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fe98: 800100 add byte ptr [rcx], 0 -;; fe9b: aa stosb byte ptr [rdi], al -;; fe9c: 800100 add byte ptr [rcx], 0 -;; fe9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fea8: 800100 add byte ptr [rcx], 0 -;; feab: aa stosb byte ptr [rdi], al -;; feac: 800100 add byte ptr [rcx], 0 -;; feaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; feb8: 800100 add byte ptr [rcx], 0 -;; febb: aa stosb byte ptr [rdi], al -;; febc: 800100 add byte ptr [rcx], 0 -;; febf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fec8: 800100 add byte ptr [rcx], 0 -;; fecb: aa stosb byte ptr [rdi], al -;; fecc: 800100 add byte ptr [rcx], 0 -;; fecf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fed8: 800100 add byte ptr [rcx], 0 -;; fedb: aa stosb byte ptr [rdi], al -;; fedc: 800100 add byte ptr [rcx], 0 -;; fedf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fee8: 800100 add byte ptr [rcx], 0 -;; feeb: aa stosb byte ptr [rdi], al -;; feec: 800100 add byte ptr [rcx], 0 -;; feef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fef8: 800100 add byte ptr [rcx], 0 -;; fefb: aa stosb byte ptr [rdi], al -;; fefc: 800100 add byte ptr [rcx], 0 -;; feff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ff08: 800100 add byte ptr [rcx], 0 -;; ff0b: aa stosb byte ptr [rdi], al -;; ff0c: 800100 add byte ptr [rcx], 0 -;; ff0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ff18: 800100 add byte ptr [rcx], 0 -;; ff1b: aa stosb byte ptr [rdi], al -;; ff1c: 800100 add byte ptr [rcx], 0 -;; ff1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ff28: 800100 add byte ptr [rcx], 0 -;; ff2b: aa stosb byte ptr [rdi], al -;; ff2c: 800100 add byte ptr [rcx], 0 -;; ff2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ff38: 800100 add byte ptr [rcx], 0 -;; ff3b: aa stosb byte ptr [rdi], al -;; ff3c: 800100 add byte ptr [rcx], 0 -;; ff3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ff48: 800100 add byte ptr [rcx], 0 -;; ff4b: aa stosb byte ptr [rdi], al -;; ff4c: 800100 add byte ptr [rcx], 0 -;; ff4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ff58: 800100 add byte ptr [rcx], 0 -;; ff5b: aa stosb byte ptr [rdi], al -;; ff5c: 800100 add byte ptr [rcx], 0 -;; ff5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ff68: 800100 add byte ptr [rcx], 0 -;; ff6b: aa stosb byte ptr [rdi], al -;; ff6c: 800100 add byte ptr [rcx], 0 -;; ff6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ff78: 800100 add byte ptr [rcx], 0 -;; ff7b: aa stosb byte ptr [rdi], al -;; ff7c: 800100 add byte ptr [rcx], 0 -;; ff7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ff88: 800100 add byte ptr [rcx], 0 -;; ff8b: aa stosb byte ptr [rdi], al -;; ff8c: 800100 add byte ptr [rcx], 0 -;; ff8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ff98: 800100 add byte ptr [rcx], 0 -;; ff9b: aa stosb byte ptr [rdi], al -;; ff9c: 800100 add byte ptr [rcx], 0 -;; ff9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ffa8: 800100 add byte ptr [rcx], 0 -;; ffab: aa stosb byte ptr [rdi], al -;; ffac: 800100 add byte ptr [rcx], 0 -;; ffaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ffb8: 800100 add byte ptr [rcx], 0 -;; ffbb: aa stosb byte ptr [rdi], al -;; ffbc: 800100 add byte ptr [rcx], 0 -;; ffbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ffc8: 800100 add byte ptr [rcx], 0 -;; ffcb: aa stosb byte ptr [rdi], al -;; ffcc: 800100 add byte ptr [rcx], 0 -;; ffcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ffd8: 800100 add byte ptr [rcx], 0 -;; ffdb: aa stosb byte ptr [rdi], al -;; ffdc: 800100 add byte ptr [rcx], 0 -;; ffdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; ffe8: 800100 add byte ptr [rcx], 0 -;; ffeb: aa stosb byte ptr [rdi], al -;; ffec: 800100 add byte ptr [rcx], 0 -;; ffef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; fff8: 800100 add byte ptr [rcx], 0 -;; fffb: aa stosb byte ptr [rdi], al -;; fffc: 800100 add byte ptr [rcx], 0 -;; ffff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10008: 800100 add byte ptr [rcx], 0 -;; 1000b: aa stosb byte ptr [rdi], al -;; 1000c: 800100 add byte ptr [rcx], 0 -;; 1000f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10018: 800100 add byte ptr [rcx], 0 -;; 1001b: aa stosb byte ptr [rdi], al -;; 1001c: 800100 add byte ptr [rcx], 0 -;; 1001f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10028: 800100 add byte ptr [rcx], 0 -;; 1002b: aa stosb byte ptr [rdi], al -;; 1002c: 800100 add byte ptr [rcx], 0 -;; 1002f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10038: 800100 add byte ptr [rcx], 0 -;; 1003b: aa stosb byte ptr [rdi], al -;; 1003c: 800100 add byte ptr [rcx], 0 -;; 1003f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10048: 800100 add byte ptr [rcx], 0 -;; 1004b: aa stosb byte ptr [rdi], al -;; 1004c: 800100 add byte ptr [rcx], 0 -;; 1004f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10058: 800100 add byte ptr [rcx], 0 -;; 1005b: aa stosb byte ptr [rdi], al -;; 1005c: 800100 add byte ptr [rcx], 0 -;; 1005f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10068: 800100 add byte ptr [rcx], 0 -;; 1006b: aa stosb byte ptr [rdi], al -;; 1006c: 800100 add byte ptr [rcx], 0 -;; 1006f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10078: 800100 add byte ptr [rcx], 0 -;; 1007b: aa stosb byte ptr [rdi], al -;; 1007c: 800100 add byte ptr [rcx], 0 -;; 1007f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10088: 800100 add byte ptr [rcx], 0 -;; 1008b: aa stosb byte ptr [rdi], al -;; 1008c: 800100 add byte ptr [rcx], 0 -;; 1008f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10098: 800100 add byte ptr [rcx], 0 -;; 1009b: aa stosb byte ptr [rdi], al -;; 1009c: 800100 add byte ptr [rcx], 0 -;; 1009f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 100a8: 800100 add byte ptr [rcx], 0 -;; 100ab: aa stosb byte ptr [rdi], al -;; 100ac: 800100 add byte ptr [rcx], 0 -;; 100af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 100b8: 800100 add byte ptr [rcx], 0 -;; 100bb: aa stosb byte ptr [rdi], al -;; 100bc: 800100 add byte ptr [rcx], 0 -;; 100bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 100c8: 800100 add byte ptr [rcx], 0 -;; 100cb: aa stosb byte ptr [rdi], al -;; 100cc: 800100 add byte ptr [rcx], 0 -;; 100cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 100d8: 800100 add byte ptr [rcx], 0 -;; 100db: aa stosb byte ptr [rdi], al -;; 100dc: 800100 add byte ptr [rcx], 0 -;; 100df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 100e8: 800100 add byte ptr [rcx], 0 -;; 100eb: aa stosb byte ptr [rdi], al -;; 100ec: 800100 add byte ptr [rcx], 0 -;; 100ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 100f8: 800100 add byte ptr [rcx], 0 -;; 100fb: aa stosb byte ptr [rdi], al -;; 100fc: 800100 add byte ptr [rcx], 0 -;; 100ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10108: 800100 add byte ptr [rcx], 0 -;; 1010b: aa stosb byte ptr [rdi], al -;; 1010c: 800100 add byte ptr [rcx], 0 -;; 1010f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10118: 800100 add byte ptr [rcx], 0 -;; 1011b: aa stosb byte ptr [rdi], al -;; 1011c: 800100 add byte ptr [rcx], 0 -;; 1011f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10128: 800100 add byte ptr [rcx], 0 -;; 1012b: aa stosb byte ptr [rdi], al -;; 1012c: 800100 add byte ptr [rcx], 0 -;; 1012f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10138: 800100 add byte ptr [rcx], 0 -;; 1013b: aa stosb byte ptr [rdi], al -;; 1013c: 800100 add byte ptr [rcx], 0 -;; 1013f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10148: 800100 add byte ptr [rcx], 0 -;; 1014b: aa stosb byte ptr [rdi], al -;; 1014c: 800100 add byte ptr [rcx], 0 -;; 1014f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10158: 800100 add byte ptr [rcx], 0 -;; 1015b: aa stosb byte ptr [rdi], al -;; 1015c: 800100 add byte ptr [rcx], 0 -;; 1015f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10168: 800100 add byte ptr [rcx], 0 -;; 1016b: aa stosb byte ptr [rdi], al -;; 1016c: 800100 add byte ptr [rcx], 0 -;; 1016f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10178: 800100 add byte ptr [rcx], 0 -;; 1017b: aa stosb byte ptr [rdi], al -;; 1017c: 800100 add byte ptr [rcx], 0 -;; 1017f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10188: 800100 add byte ptr [rcx], 0 -;; 1018b: aa stosb byte ptr [rdi], al -;; 1018c: 800100 add byte ptr [rcx], 0 -;; 1018f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10198: 800100 add byte ptr [rcx], 0 -;; 1019b: aa stosb byte ptr [rdi], al -;; 1019c: 800100 add byte ptr [rcx], 0 -;; 1019f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 101a8: 800100 add byte ptr [rcx], 0 -;; 101ab: aa stosb byte ptr [rdi], al -;; 101ac: 800100 add byte ptr [rcx], 0 -;; 101af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 101b8: 800100 add byte ptr [rcx], 0 -;; 101bb: aa stosb byte ptr [rdi], al -;; 101bc: 800100 add byte ptr [rcx], 0 -;; 101bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 101c8: 800100 add byte ptr [rcx], 0 -;; 101cb: aa stosb byte ptr [rdi], al -;; 101cc: 800100 add byte ptr [rcx], 0 -;; 101cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 101d8: 800100 add byte ptr [rcx], 0 -;; 101db: aa stosb byte ptr [rdi], al -;; 101dc: 800100 add byte ptr [rcx], 0 -;; 101df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 101e8: 800100 add byte ptr [rcx], 0 -;; 101eb: aa stosb byte ptr [rdi], al -;; 101ec: 800100 add byte ptr [rcx], 0 -;; 101ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 101f8: 800100 add byte ptr [rcx], 0 -;; 101fb: aa stosb byte ptr [rdi], al -;; 101fc: 800100 add byte ptr [rcx], 0 -;; 101ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10208: 800100 add byte ptr [rcx], 0 -;; 1020b: aa stosb byte ptr [rdi], al -;; 1020c: 800100 add byte ptr [rcx], 0 -;; 1020f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10218: 800100 add byte ptr [rcx], 0 -;; 1021b: aa stosb byte ptr [rdi], al -;; 1021c: 800100 add byte ptr [rcx], 0 -;; 1021f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10228: 800100 add byte ptr [rcx], 0 -;; 1022b: aa stosb byte ptr [rdi], al -;; 1022c: 800100 add byte ptr [rcx], 0 -;; 1022f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10238: 800100 add byte ptr [rcx], 0 -;; 1023b: aa stosb byte ptr [rdi], al -;; 1023c: 800100 add byte ptr [rcx], 0 -;; 1023f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10248: 800100 add byte ptr [rcx], 0 -;; 1024b: aa stosb byte ptr [rdi], al -;; 1024c: 800100 add byte ptr [rcx], 0 -;; 1024f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10258: 800100 add byte ptr [rcx], 0 -;; 1025b: aa stosb byte ptr [rdi], al -;; 1025c: 800100 add byte ptr [rcx], 0 -;; 1025f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10268: 800100 add byte ptr [rcx], 0 -;; 1026b: aa stosb byte ptr [rdi], al -;; 1026c: 800100 add byte ptr [rcx], 0 -;; 1026f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10278: 800100 add byte ptr [rcx], 0 -;; 1027b: aa stosb byte ptr [rdi], al -;; 1027c: 800100 add byte ptr [rcx], 0 -;; 1027f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10288: 800100 add byte ptr [rcx], 0 -;; 1028b: aa stosb byte ptr [rdi], al -;; 1028c: 800100 add byte ptr [rcx], 0 -;; 1028f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10298: 800100 add byte ptr [rcx], 0 -;; 1029b: aa stosb byte ptr [rdi], al -;; 1029c: 800100 add byte ptr [rcx], 0 -;; 1029f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 102a8: 800100 add byte ptr [rcx], 0 -;; 102ab: aa stosb byte ptr [rdi], al -;; 102ac: 800100 add byte ptr [rcx], 0 -;; 102af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 102b8: 800100 add byte ptr [rcx], 0 -;; 102bb: aa stosb byte ptr [rdi], al -;; 102bc: 800100 add byte ptr [rcx], 0 -;; 102bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 102c8: 800100 add byte ptr [rcx], 0 -;; 102cb: aa stosb byte ptr [rdi], al -;; 102cc: 800100 add byte ptr [rcx], 0 -;; 102cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 102d8: 800100 add byte ptr [rcx], 0 -;; 102db: aa stosb byte ptr [rdi], al -;; 102dc: 800100 add byte ptr [rcx], 0 -;; 102df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 102e8: 800100 add byte ptr [rcx], 0 -;; 102eb: aa stosb byte ptr [rdi], al -;; 102ec: 800100 add byte ptr [rcx], 0 -;; 102ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 102f8: 800100 add byte ptr [rcx], 0 -;; 102fb: aa stosb byte ptr [rdi], al -;; 102fc: 800100 add byte ptr [rcx], 0 -;; 102ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10308: 800100 add byte ptr [rcx], 0 -;; 1030b: aa stosb byte ptr [rdi], al -;; 1030c: 800100 add byte ptr [rcx], 0 -;; 1030f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10318: 800100 add byte ptr [rcx], 0 -;; 1031b: aa stosb byte ptr [rdi], al -;; 1031c: 800100 add byte ptr [rcx], 0 -;; 1031f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10328: 800100 add byte ptr [rcx], 0 -;; 1032b: aa stosb byte ptr [rdi], al -;; 1032c: 800100 add byte ptr [rcx], 0 -;; 1032f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10338: 800100 add byte ptr [rcx], 0 -;; 1033b: aa stosb byte ptr [rdi], al -;; 1033c: 800100 add byte ptr [rcx], 0 -;; 1033f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10348: 800100 add byte ptr [rcx], 0 -;; 1034b: aa stosb byte ptr [rdi], al -;; 1034c: 800100 add byte ptr [rcx], 0 -;; 1034f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10358: 800100 add byte ptr [rcx], 0 -;; 1035b: aa stosb byte ptr [rdi], al -;; 1035c: 800100 add byte ptr [rcx], 0 -;; 1035f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10368: 800100 add byte ptr [rcx], 0 -;; 1036b: aa stosb byte ptr [rdi], al -;; 1036c: 800100 add byte ptr [rcx], 0 -;; 1036f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10378: 800100 add byte ptr [rcx], 0 -;; 1037b: aa stosb byte ptr [rdi], al -;; 1037c: 800100 add byte ptr [rcx], 0 -;; 1037f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10388: 800100 add byte ptr [rcx], 0 -;; 1038b: aa stosb byte ptr [rdi], al -;; 1038c: 800100 add byte ptr [rcx], 0 -;; 1038f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10398: 800100 add byte ptr [rcx], 0 -;; 1039b: aa stosb byte ptr [rdi], al -;; 1039c: 800100 add byte ptr [rcx], 0 -;; 1039f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 103a8: 800100 add byte ptr [rcx], 0 -;; 103ab: aa stosb byte ptr [rdi], al -;; 103ac: 800100 add byte ptr [rcx], 0 -;; 103af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 103b8: 800100 add byte ptr [rcx], 0 -;; 103bb: aa stosb byte ptr [rdi], al -;; 103bc: 800100 add byte ptr [rcx], 0 -;; 103bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 103c8: 800100 add byte ptr [rcx], 0 -;; 103cb: aa stosb byte ptr [rdi], al -;; 103cc: 800100 add byte ptr [rcx], 0 -;; 103cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 103d8: 800100 add byte ptr [rcx], 0 -;; 103db: aa stosb byte ptr [rdi], al -;; 103dc: 800100 add byte ptr [rcx], 0 -;; 103df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 103e8: 800100 add byte ptr [rcx], 0 -;; 103eb: aa stosb byte ptr [rdi], al -;; 103ec: 800100 add byte ptr [rcx], 0 -;; 103ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 103f8: 800100 add byte ptr [rcx], 0 -;; 103fb: aa stosb byte ptr [rdi], al -;; 103fc: 800100 add byte ptr [rcx], 0 -;; 103ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10408: 800100 add byte ptr [rcx], 0 -;; 1040b: aa stosb byte ptr [rdi], al -;; 1040c: 800100 add byte ptr [rcx], 0 -;; 1040f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10418: 800100 add byte ptr [rcx], 0 -;; 1041b: aa stosb byte ptr [rdi], al -;; 1041c: 800100 add byte ptr [rcx], 0 -;; 1041f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10428: 800100 add byte ptr [rcx], 0 -;; 1042b: aa stosb byte ptr [rdi], al -;; 1042c: 800100 add byte ptr [rcx], 0 -;; 1042f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10438: 800100 add byte ptr [rcx], 0 -;; 1043b: aa stosb byte ptr [rdi], al -;; 1043c: 800100 add byte ptr [rcx], 0 -;; 1043f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10448: 800100 add byte ptr [rcx], 0 -;; 1044b: aa stosb byte ptr [rdi], al -;; 1044c: 800100 add byte ptr [rcx], 0 -;; 1044f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10458: 800100 add byte ptr [rcx], 0 -;; 1045b: aa stosb byte ptr [rdi], al -;; 1045c: 800100 add byte ptr [rcx], 0 -;; 1045f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10468: 800100 add byte ptr [rcx], 0 -;; 1046b: aa stosb byte ptr [rdi], al -;; 1046c: 800100 add byte ptr [rcx], 0 -;; 1046f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10478: 800100 add byte ptr [rcx], 0 -;; 1047b: aa stosb byte ptr [rdi], al -;; 1047c: 800100 add byte ptr [rcx], 0 -;; 1047f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10488: 800100 add byte ptr [rcx], 0 -;; 1048b: aa stosb byte ptr [rdi], al -;; 1048c: 800100 add byte ptr [rcx], 0 -;; 1048f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10498: 800100 add byte ptr [rcx], 0 -;; 1049b: aa stosb byte ptr [rdi], al -;; 1049c: 800100 add byte ptr [rcx], 0 -;; 1049f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 104a8: 800100 add byte ptr [rcx], 0 -;; 104ab: aa stosb byte ptr [rdi], al -;; 104ac: 800100 add byte ptr [rcx], 0 -;; 104af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 104b8: 800100 add byte ptr [rcx], 0 -;; 104bb: aa stosb byte ptr [rdi], al -;; 104bc: 800100 add byte ptr [rcx], 0 -;; 104bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 104c8: 800100 add byte ptr [rcx], 0 -;; 104cb: aa stosb byte ptr [rdi], al -;; 104cc: 800100 add byte ptr [rcx], 0 -;; 104cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 104d8: 800100 add byte ptr [rcx], 0 -;; 104db: aa stosb byte ptr [rdi], al -;; 104dc: 800100 add byte ptr [rcx], 0 -;; 104df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 104e8: 800100 add byte ptr [rcx], 0 -;; 104eb: aa stosb byte ptr [rdi], al -;; 104ec: 800100 add byte ptr [rcx], 0 -;; 104ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 104f8: 800100 add byte ptr [rcx], 0 -;; 104fb: aa stosb byte ptr [rdi], al -;; 104fc: 800100 add byte ptr [rcx], 0 -;; 104ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10508: 800100 add byte ptr [rcx], 0 -;; 1050b: aa stosb byte ptr [rdi], al -;; 1050c: 800100 add byte ptr [rcx], 0 -;; 1050f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10518: 800100 add byte ptr [rcx], 0 -;; 1051b: aa stosb byte ptr [rdi], al -;; 1051c: 800100 add byte ptr [rcx], 0 -;; 1051f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10528: 800100 add byte ptr [rcx], 0 -;; 1052b: aa stosb byte ptr [rdi], al -;; 1052c: 800100 add byte ptr [rcx], 0 -;; 1052f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10538: 800100 add byte ptr [rcx], 0 -;; 1053b: aa stosb byte ptr [rdi], al -;; 1053c: 800100 add byte ptr [rcx], 0 -;; 1053f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10548: 800100 add byte ptr [rcx], 0 -;; 1054b: aa stosb byte ptr [rdi], al -;; 1054c: 800100 add byte ptr [rcx], 0 -;; 1054f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10558: 800100 add byte ptr [rcx], 0 -;; 1055b: aa stosb byte ptr [rdi], al -;; 1055c: 800100 add byte ptr [rcx], 0 -;; 1055f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10568: 800100 add byte ptr [rcx], 0 -;; 1056b: aa stosb byte ptr [rdi], al -;; 1056c: 800100 add byte ptr [rcx], 0 -;; 1056f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10578: 800100 add byte ptr [rcx], 0 -;; 1057b: aa stosb byte ptr [rdi], al -;; 1057c: 800100 add byte ptr [rcx], 0 -;; 1057f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10588: 800100 add byte ptr [rcx], 0 -;; 1058b: aa stosb byte ptr [rdi], al -;; 1058c: 800100 add byte ptr [rcx], 0 -;; 1058f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10598: 800100 add byte ptr [rcx], 0 -;; 1059b: aa stosb byte ptr [rdi], al -;; 1059c: 800100 add byte ptr [rcx], 0 -;; 1059f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 105a8: 800100 add byte ptr [rcx], 0 -;; 105ab: aa stosb byte ptr [rdi], al -;; 105ac: 800100 add byte ptr [rcx], 0 -;; 105af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 105b8: 800100 add byte ptr [rcx], 0 -;; 105bb: aa stosb byte ptr [rdi], al -;; 105bc: 800100 add byte ptr [rcx], 0 -;; 105bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 105c8: 800100 add byte ptr [rcx], 0 -;; 105cb: aa stosb byte ptr [rdi], al -;; 105cc: 800100 add byte ptr [rcx], 0 -;; 105cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 105d8: 800100 add byte ptr [rcx], 0 -;; 105db: aa stosb byte ptr [rdi], al -;; 105dc: 800100 add byte ptr [rcx], 0 -;; 105df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 105e8: 800100 add byte ptr [rcx], 0 -;; 105eb: aa stosb byte ptr [rdi], al -;; 105ec: 800100 add byte ptr [rcx], 0 -;; 105ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 105f8: 800100 add byte ptr [rcx], 0 -;; 105fb: aa stosb byte ptr [rdi], al -;; 105fc: 800100 add byte ptr [rcx], 0 -;; 105ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10608: 800100 add byte ptr [rcx], 0 -;; 1060b: aa stosb byte ptr [rdi], al -;; 1060c: 800100 add byte ptr [rcx], 0 -;; 1060f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10618: 800100 add byte ptr [rcx], 0 -;; 1061b: aa stosb byte ptr [rdi], al -;; 1061c: 800100 add byte ptr [rcx], 0 -;; 1061f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10628: 800100 add byte ptr [rcx], 0 -;; 1062b: aa stosb byte ptr [rdi], al -;; 1062c: 800100 add byte ptr [rcx], 0 -;; 1062f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10638: 800100 add byte ptr [rcx], 0 -;; 1063b: aa stosb byte ptr [rdi], al -;; 1063c: 800100 add byte ptr [rcx], 0 -;; 1063f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10648: 800100 add byte ptr [rcx], 0 -;; 1064b: aa stosb byte ptr [rdi], al -;; 1064c: 800100 add byte ptr [rcx], 0 -;; 1064f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10658: 800100 add byte ptr [rcx], 0 -;; 1065b: aa stosb byte ptr [rdi], al -;; 1065c: 800100 add byte ptr [rcx], 0 -;; 1065f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10668: 800100 add byte ptr [rcx], 0 -;; 1066b: aa stosb byte ptr [rdi], al -;; 1066c: 800100 add byte ptr [rcx], 0 -;; 1066f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10678: 800100 add byte ptr [rcx], 0 -;; 1067b: aa stosb byte ptr [rdi], al -;; 1067c: 800100 add byte ptr [rcx], 0 -;; 1067f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10688: 800100 add byte ptr [rcx], 0 -;; 1068b: aa stosb byte ptr [rdi], al -;; 1068c: 800100 add byte ptr [rcx], 0 -;; 1068f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10698: 800100 add byte ptr [rcx], 0 -;; 1069b: aa stosb byte ptr [rdi], al -;; 1069c: 800100 add byte ptr [rcx], 0 -;; 1069f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 106a8: 800100 add byte ptr [rcx], 0 -;; 106ab: aa stosb byte ptr [rdi], al -;; 106ac: 800100 add byte ptr [rcx], 0 -;; 106af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 106b8: 800100 add byte ptr [rcx], 0 -;; 106bb: aa stosb byte ptr [rdi], al -;; 106bc: 800100 add byte ptr [rcx], 0 -;; 106bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 106c8: 800100 add byte ptr [rcx], 0 -;; 106cb: aa stosb byte ptr [rdi], al -;; 106cc: 800100 add byte ptr [rcx], 0 -;; 106cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 106d8: 800100 add byte ptr [rcx], 0 -;; 106db: aa stosb byte ptr [rdi], al -;; 106dc: 800100 add byte ptr [rcx], 0 -;; 106df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 106e8: 800100 add byte ptr [rcx], 0 -;; 106eb: aa stosb byte ptr [rdi], al -;; 106ec: 800100 add byte ptr [rcx], 0 -;; 106ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 106f8: 800100 add byte ptr [rcx], 0 -;; 106fb: aa stosb byte ptr [rdi], al -;; 106fc: 800100 add byte ptr [rcx], 0 -;; 106ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10708: 800100 add byte ptr [rcx], 0 -;; 1070b: aa stosb byte ptr [rdi], al -;; 1070c: 800100 add byte ptr [rcx], 0 -;; 1070f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10718: 800100 add byte ptr [rcx], 0 -;; 1071b: aa stosb byte ptr [rdi], al -;; 1071c: 800100 add byte ptr [rcx], 0 -;; 1071f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10728: 800100 add byte ptr [rcx], 0 -;; 1072b: aa stosb byte ptr [rdi], al -;; 1072c: 800100 add byte ptr [rcx], 0 -;; 1072f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10738: 800100 add byte ptr [rcx], 0 -;; 1073b: aa stosb byte ptr [rdi], al -;; 1073c: 800100 add byte ptr [rcx], 0 -;; 1073f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10748: 800100 add byte ptr [rcx], 0 -;; 1074b: aa stosb byte ptr [rdi], al -;; 1074c: 800100 add byte ptr [rcx], 0 -;; 1074f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10758: 800100 add byte ptr [rcx], 0 -;; 1075b: aa stosb byte ptr [rdi], al -;; 1075c: 800100 add byte ptr [rcx], 0 -;; 1075f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10768: 800100 add byte ptr [rcx], 0 -;; 1076b: aa stosb byte ptr [rdi], al -;; 1076c: 800100 add byte ptr [rcx], 0 -;; 1076f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10778: 800100 add byte ptr [rcx], 0 -;; 1077b: aa stosb byte ptr [rdi], al -;; 1077c: 800100 add byte ptr [rcx], 0 -;; 1077f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10788: 800100 add byte ptr [rcx], 0 -;; 1078b: aa stosb byte ptr [rdi], al -;; 1078c: 800100 add byte ptr [rcx], 0 -;; 1078f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10798: 800100 add byte ptr [rcx], 0 -;; 1079b: aa stosb byte ptr [rdi], al -;; 1079c: 800100 add byte ptr [rcx], 0 -;; 1079f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 107a8: 800100 add byte ptr [rcx], 0 -;; 107ab: aa stosb byte ptr [rdi], al -;; 107ac: 800100 add byte ptr [rcx], 0 -;; 107af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 107b8: 800100 add byte ptr [rcx], 0 -;; 107bb: aa stosb byte ptr [rdi], al -;; 107bc: 800100 add byte ptr [rcx], 0 -;; 107bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 107c8: 800100 add byte ptr [rcx], 0 -;; 107cb: aa stosb byte ptr [rdi], al -;; 107cc: 800100 add byte ptr [rcx], 0 -;; 107cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 107d8: 800100 add byte ptr [rcx], 0 -;; 107db: aa stosb byte ptr [rdi], al -;; 107dc: 800100 add byte ptr [rcx], 0 -;; 107df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 107e8: 800100 add byte ptr [rcx], 0 -;; 107eb: aa stosb byte ptr [rdi], al -;; 107ec: 800100 add byte ptr [rcx], 0 -;; 107ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 107f8: 800100 add byte ptr [rcx], 0 -;; 107fb: aa stosb byte ptr [rdi], al -;; 107fc: 800100 add byte ptr [rcx], 0 -;; 107ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10808: 800100 add byte ptr [rcx], 0 -;; 1080b: aa stosb byte ptr [rdi], al -;; 1080c: 800100 add byte ptr [rcx], 0 -;; 1080f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10818: 800100 add byte ptr [rcx], 0 -;; 1081b: aa stosb byte ptr [rdi], al -;; 1081c: 800100 add byte ptr [rcx], 0 -;; 1081f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10828: 800100 add byte ptr [rcx], 0 -;; 1082b: aa stosb byte ptr [rdi], al -;; 1082c: 800100 add byte ptr [rcx], 0 -;; 1082f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10838: 800100 add byte ptr [rcx], 0 -;; 1083b: aa stosb byte ptr [rdi], al -;; 1083c: 800100 add byte ptr [rcx], 0 -;; 1083f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10848: 800100 add byte ptr [rcx], 0 -;; 1084b: aa stosb byte ptr [rdi], al -;; 1084c: 800100 add byte ptr [rcx], 0 -;; 1084f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10858: 800100 add byte ptr [rcx], 0 -;; 1085b: aa stosb byte ptr [rdi], al -;; 1085c: 800100 add byte ptr [rcx], 0 -;; 1085f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10868: 800100 add byte ptr [rcx], 0 -;; 1086b: aa stosb byte ptr [rdi], al -;; 1086c: 800100 add byte ptr [rcx], 0 -;; 1086f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10878: 800100 add byte ptr [rcx], 0 -;; 1087b: aa stosb byte ptr [rdi], al -;; 1087c: 800100 add byte ptr [rcx], 0 -;; 1087f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10888: 800100 add byte ptr [rcx], 0 -;; 1088b: aa stosb byte ptr [rdi], al -;; 1088c: 800100 add byte ptr [rcx], 0 -;; 1088f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10898: 800100 add byte ptr [rcx], 0 -;; 1089b: aa stosb byte ptr [rdi], al -;; 1089c: 800100 add byte ptr [rcx], 0 -;; 1089f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 108a8: 800100 add byte ptr [rcx], 0 -;; 108ab: aa stosb byte ptr [rdi], al -;; 108ac: 800100 add byte ptr [rcx], 0 -;; 108af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 108b8: 800100 add byte ptr [rcx], 0 -;; 108bb: aa stosb byte ptr [rdi], al -;; 108bc: 800100 add byte ptr [rcx], 0 -;; 108bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 108c8: 800100 add byte ptr [rcx], 0 -;; 108cb: aa stosb byte ptr [rdi], al -;; 108cc: 800100 add byte ptr [rcx], 0 -;; 108cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 108d8: 800100 add byte ptr [rcx], 0 -;; 108db: aa stosb byte ptr [rdi], al -;; 108dc: 800100 add byte ptr [rcx], 0 -;; 108df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 108e8: 800100 add byte ptr [rcx], 0 -;; 108eb: aa stosb byte ptr [rdi], al -;; 108ec: 800100 add byte ptr [rcx], 0 -;; 108ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 108f8: 800100 add byte ptr [rcx], 0 -;; 108fb: aa stosb byte ptr [rdi], al -;; 108fc: 800100 add byte ptr [rcx], 0 -;; 108ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10908: 800100 add byte ptr [rcx], 0 -;; 1090b: aa stosb byte ptr [rdi], al -;; 1090c: 800100 add byte ptr [rcx], 0 -;; 1090f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10918: 800100 add byte ptr [rcx], 0 -;; 1091b: aa stosb byte ptr [rdi], al -;; 1091c: 800100 add byte ptr [rcx], 0 -;; 1091f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10928: 800100 add byte ptr [rcx], 0 -;; 1092b: aa stosb byte ptr [rdi], al -;; 1092c: 800100 add byte ptr [rcx], 0 -;; 1092f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10938: 800100 add byte ptr [rcx], 0 -;; 1093b: aa stosb byte ptr [rdi], al -;; 1093c: 800100 add byte ptr [rcx], 0 -;; 1093f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10948: 800100 add byte ptr [rcx], 0 -;; 1094b: aa stosb byte ptr [rdi], al -;; 1094c: 800100 add byte ptr [rcx], 0 -;; 1094f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10958: 800100 add byte ptr [rcx], 0 -;; 1095b: aa stosb byte ptr [rdi], al -;; 1095c: 800100 add byte ptr [rcx], 0 -;; 1095f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10968: 800100 add byte ptr [rcx], 0 -;; 1096b: aa stosb byte ptr [rdi], al -;; 1096c: 800100 add byte ptr [rcx], 0 -;; 1096f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10978: 800100 add byte ptr [rcx], 0 -;; 1097b: aa stosb byte ptr [rdi], al -;; 1097c: 800100 add byte ptr [rcx], 0 -;; 1097f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10988: 800100 add byte ptr [rcx], 0 -;; 1098b: aa stosb byte ptr [rdi], al -;; 1098c: 800100 add byte ptr [rcx], 0 -;; 1098f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10998: 800100 add byte ptr [rcx], 0 -;; 1099b: aa stosb byte ptr [rdi], al -;; 1099c: 800100 add byte ptr [rcx], 0 -;; 1099f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 109a8: 800100 add byte ptr [rcx], 0 -;; 109ab: aa stosb byte ptr [rdi], al -;; 109ac: 800100 add byte ptr [rcx], 0 -;; 109af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 109b8: 800100 add byte ptr [rcx], 0 -;; 109bb: aa stosb byte ptr [rdi], al -;; 109bc: 800100 add byte ptr [rcx], 0 -;; 109bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 109c8: 800100 add byte ptr [rcx], 0 -;; 109cb: aa stosb byte ptr [rdi], al -;; 109cc: 800100 add byte ptr [rcx], 0 -;; 109cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 109d8: 800100 add byte ptr [rcx], 0 -;; 109db: aa stosb byte ptr [rdi], al -;; 109dc: 800100 add byte ptr [rcx], 0 -;; 109df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 109e8: 800100 add byte ptr [rcx], 0 -;; 109eb: aa stosb byte ptr [rdi], al -;; 109ec: 800100 add byte ptr [rcx], 0 -;; 109ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 109f8: 800100 add byte ptr [rcx], 0 -;; 109fb: aa stosb byte ptr [rdi], al -;; 109fc: 800100 add byte ptr [rcx], 0 -;; 109ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10a08: 800100 add byte ptr [rcx], 0 -;; 10a0b: aa stosb byte ptr [rdi], al -;; 10a0c: 800100 add byte ptr [rcx], 0 -;; 10a0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10a18: 800100 add byte ptr [rcx], 0 -;; 10a1b: aa stosb byte ptr [rdi], al -;; 10a1c: 800100 add byte ptr [rcx], 0 -;; 10a1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10a28: 800100 add byte ptr [rcx], 0 -;; 10a2b: aa stosb byte ptr [rdi], al -;; 10a2c: 800100 add byte ptr [rcx], 0 -;; 10a2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10a38: 800100 add byte ptr [rcx], 0 -;; 10a3b: aa stosb byte ptr [rdi], al -;; 10a3c: 800100 add byte ptr [rcx], 0 -;; 10a3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10a48: 800100 add byte ptr [rcx], 0 -;; 10a4b: aa stosb byte ptr [rdi], al -;; 10a4c: 800100 add byte ptr [rcx], 0 -;; 10a4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10a58: 800100 add byte ptr [rcx], 0 -;; 10a5b: aa stosb byte ptr [rdi], al -;; 10a5c: 800100 add byte ptr [rcx], 0 -;; 10a5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10a68: 800100 add byte ptr [rcx], 0 -;; 10a6b: aa stosb byte ptr [rdi], al -;; 10a6c: 800100 add byte ptr [rcx], 0 -;; 10a6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10a78: 800100 add byte ptr [rcx], 0 -;; 10a7b: aa stosb byte ptr [rdi], al -;; 10a7c: 800100 add byte ptr [rcx], 0 -;; 10a7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10a88: 800100 add byte ptr [rcx], 0 -;; 10a8b: aa stosb byte ptr [rdi], al -;; 10a8c: 800100 add byte ptr [rcx], 0 -;; 10a8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10a98: 800100 add byte ptr [rcx], 0 -;; 10a9b: aa stosb byte ptr [rdi], al -;; 10a9c: 800100 add byte ptr [rcx], 0 -;; 10a9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10aa8: 800100 add byte ptr [rcx], 0 -;; 10aab: aa stosb byte ptr [rdi], al -;; 10aac: 800100 add byte ptr [rcx], 0 -;; 10aaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10ab8: 800100 add byte ptr [rcx], 0 -;; 10abb: aa stosb byte ptr [rdi], al -;; 10abc: 800100 add byte ptr [rcx], 0 -;; 10abf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10ac8: 800100 add byte ptr [rcx], 0 -;; 10acb: aa stosb byte ptr [rdi], al -;; 10acc: 800100 add byte ptr [rcx], 0 -;; 10acf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10ad8: 800100 add byte ptr [rcx], 0 -;; 10adb: aa stosb byte ptr [rdi], al -;; 10adc: 800100 add byte ptr [rcx], 0 -;; 10adf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10ae8: 800100 add byte ptr [rcx], 0 -;; 10aeb: aa stosb byte ptr [rdi], al -;; 10aec: 800100 add byte ptr [rcx], 0 -;; 10aef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10af8: 800100 add byte ptr [rcx], 0 -;; 10afb: aa stosb byte ptr [rdi], al -;; 10afc: 800100 add byte ptr [rcx], 0 -;; 10aff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10b08: 800100 add byte ptr [rcx], 0 -;; 10b0b: aa stosb byte ptr [rdi], al -;; 10b0c: 800100 add byte ptr [rcx], 0 -;; 10b0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10b18: 800100 add byte ptr [rcx], 0 -;; 10b1b: aa stosb byte ptr [rdi], al -;; 10b1c: 800100 add byte ptr [rcx], 0 -;; 10b1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10b28: 800100 add byte ptr [rcx], 0 -;; 10b2b: aa stosb byte ptr [rdi], al -;; 10b2c: 800100 add byte ptr [rcx], 0 -;; 10b2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10b38: 800100 add byte ptr [rcx], 0 -;; 10b3b: aa stosb byte ptr [rdi], al -;; 10b3c: 800100 add byte ptr [rcx], 0 -;; 10b3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10b48: 800100 add byte ptr [rcx], 0 -;; 10b4b: aa stosb byte ptr [rdi], al -;; 10b4c: 800100 add byte ptr [rcx], 0 -;; 10b4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10b58: 800100 add byte ptr [rcx], 0 -;; 10b5b: aa stosb byte ptr [rdi], al -;; 10b5c: 800100 add byte ptr [rcx], 0 -;; 10b5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10b68: 800100 add byte ptr [rcx], 0 -;; 10b6b: aa stosb byte ptr [rdi], al -;; 10b6c: 800100 add byte ptr [rcx], 0 -;; 10b6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10b78: 800100 add byte ptr [rcx], 0 -;; 10b7b: aa stosb byte ptr [rdi], al -;; 10b7c: 800100 add byte ptr [rcx], 0 -;; 10b7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10b88: 800100 add byte ptr [rcx], 0 -;; 10b8b: aa stosb byte ptr [rdi], al -;; 10b8c: 800100 add byte ptr [rcx], 0 -;; 10b8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10b98: 800100 add byte ptr [rcx], 0 -;; 10b9b: aa stosb byte ptr [rdi], al -;; 10b9c: 800100 add byte ptr [rcx], 0 -;; 10b9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10ba8: 800100 add byte ptr [rcx], 0 -;; 10bab: aa stosb byte ptr [rdi], al -;; 10bac: 800100 add byte ptr [rcx], 0 -;; 10baf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10bb8: 800100 add byte ptr [rcx], 0 -;; 10bbb: aa stosb byte ptr [rdi], al -;; 10bbc: 800100 add byte ptr [rcx], 0 -;; 10bbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10bc8: 800100 add byte ptr [rcx], 0 -;; 10bcb: aa stosb byte ptr [rdi], al -;; 10bcc: 800100 add byte ptr [rcx], 0 -;; 10bcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10bd8: 800100 add byte ptr [rcx], 0 -;; 10bdb: aa stosb byte ptr [rdi], al -;; 10bdc: 800100 add byte ptr [rcx], 0 -;; 10bdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10be8: 800100 add byte ptr [rcx], 0 -;; 10beb: aa stosb byte ptr [rdi], al -;; 10bec: 800100 add byte ptr [rcx], 0 -;; 10bef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10bf8: 800100 add byte ptr [rcx], 0 -;; 10bfb: aa stosb byte ptr [rdi], al -;; 10bfc: 800100 add byte ptr [rcx], 0 -;; 10bff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10c08: 800100 add byte ptr [rcx], 0 -;; 10c0b: aa stosb byte ptr [rdi], al -;; 10c0c: 800100 add byte ptr [rcx], 0 -;; 10c0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10c18: 800100 add byte ptr [rcx], 0 -;; 10c1b: aa stosb byte ptr [rdi], al -;; 10c1c: 800100 add byte ptr [rcx], 0 -;; 10c1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10c28: 800100 add byte ptr [rcx], 0 -;; 10c2b: aa stosb byte ptr [rdi], al -;; 10c2c: 800100 add byte ptr [rcx], 0 -;; 10c2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10c38: 800100 add byte ptr [rcx], 0 -;; 10c3b: aa stosb byte ptr [rdi], al -;; 10c3c: 800100 add byte ptr [rcx], 0 -;; 10c3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10c48: 800100 add byte ptr [rcx], 0 -;; 10c4b: aa stosb byte ptr [rdi], al -;; 10c4c: 800100 add byte ptr [rcx], 0 -;; 10c4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10c58: 800100 add byte ptr [rcx], 0 -;; 10c5b: aa stosb byte ptr [rdi], al -;; 10c5c: 800100 add byte ptr [rcx], 0 -;; 10c5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10c68: 800100 add byte ptr [rcx], 0 -;; 10c6b: aa stosb byte ptr [rdi], al -;; 10c6c: 800100 add byte ptr [rcx], 0 -;; 10c6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10c78: 800100 add byte ptr [rcx], 0 -;; 10c7b: aa stosb byte ptr [rdi], al -;; 10c7c: 800100 add byte ptr [rcx], 0 -;; 10c7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10c88: 800100 add byte ptr [rcx], 0 -;; 10c8b: aa stosb byte ptr [rdi], al -;; 10c8c: 800100 add byte ptr [rcx], 0 -;; 10c8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10c98: 800100 add byte ptr [rcx], 0 -;; 10c9b: aa stosb byte ptr [rdi], al -;; 10c9c: 800100 add byte ptr [rcx], 0 -;; 10c9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10ca8: 800100 add byte ptr [rcx], 0 -;; 10cab: aa stosb byte ptr [rdi], al -;; 10cac: 800100 add byte ptr [rcx], 0 -;; 10caf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10cb8: 800100 add byte ptr [rcx], 0 -;; 10cbb: aa stosb byte ptr [rdi], al -;; 10cbc: 800100 add byte ptr [rcx], 0 -;; 10cbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10cc8: 800100 add byte ptr [rcx], 0 -;; 10ccb: aa stosb byte ptr [rdi], al -;; 10ccc: 800100 add byte ptr [rcx], 0 -;; 10ccf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10cd8: 800100 add byte ptr [rcx], 0 -;; 10cdb: aa stosb byte ptr [rdi], al -;; 10cdc: 800100 add byte ptr [rcx], 0 -;; 10cdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10ce8: 800100 add byte ptr [rcx], 0 -;; 10ceb: aa stosb byte ptr [rdi], al -;; 10cec: 800100 add byte ptr [rcx], 0 -;; 10cef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10cf8: 800100 add byte ptr [rcx], 0 -;; 10cfb: aa stosb byte ptr [rdi], al -;; 10cfc: 800100 add byte ptr [rcx], 0 -;; 10cff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10d08: 800100 add byte ptr [rcx], 0 -;; 10d0b: aa stosb byte ptr [rdi], al -;; 10d0c: 800100 add byte ptr [rcx], 0 -;; 10d0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10d18: 800100 add byte ptr [rcx], 0 -;; 10d1b: aa stosb byte ptr [rdi], al -;; 10d1c: 800100 add byte ptr [rcx], 0 -;; 10d1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10d28: 800100 add byte ptr [rcx], 0 -;; 10d2b: aa stosb byte ptr [rdi], al -;; 10d2c: 800100 add byte ptr [rcx], 0 -;; 10d2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10d38: 800100 add byte ptr [rcx], 0 -;; 10d3b: aa stosb byte ptr [rdi], al -;; 10d3c: 800100 add byte ptr [rcx], 0 -;; 10d3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10d48: 800100 add byte ptr [rcx], 0 -;; 10d4b: aa stosb byte ptr [rdi], al -;; 10d4c: 800100 add byte ptr [rcx], 0 -;; 10d4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10d58: 800100 add byte ptr [rcx], 0 -;; 10d5b: aa stosb byte ptr [rdi], al -;; 10d5c: 800100 add byte ptr [rcx], 0 -;; 10d5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10d68: 800100 add byte ptr [rcx], 0 -;; 10d6b: aa stosb byte ptr [rdi], al -;; 10d6c: 800100 add byte ptr [rcx], 0 -;; 10d6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10d78: 800100 add byte ptr [rcx], 0 -;; 10d7b: aa stosb byte ptr [rdi], al -;; 10d7c: 800100 add byte ptr [rcx], 0 -;; 10d7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10d88: 800100 add byte ptr [rcx], 0 -;; 10d8b: aa stosb byte ptr [rdi], al -;; 10d8c: 800100 add byte ptr [rcx], 0 -;; 10d8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10d98: 800100 add byte ptr [rcx], 0 -;; 10d9b: aa stosb byte ptr [rdi], al -;; 10d9c: 800100 add byte ptr [rcx], 0 -;; 10d9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10da8: 800100 add byte ptr [rcx], 0 -;; 10dab: aa stosb byte ptr [rdi], al -;; 10dac: 800100 add byte ptr [rcx], 0 -;; 10daf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10db8: 800100 add byte ptr [rcx], 0 -;; 10dbb: aa stosb byte ptr [rdi], al -;; 10dbc: 800100 add byte ptr [rcx], 0 -;; 10dbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10dc8: 800100 add byte ptr [rcx], 0 -;; 10dcb: aa stosb byte ptr [rdi], al -;; 10dcc: 800100 add byte ptr [rcx], 0 -;; 10dcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10dd8: 800100 add byte ptr [rcx], 0 -;; 10ddb: aa stosb byte ptr [rdi], al -;; 10ddc: 800100 add byte ptr [rcx], 0 -;; 10ddf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10de8: 800100 add byte ptr [rcx], 0 -;; 10deb: aa stosb byte ptr [rdi], al -;; 10dec: 800100 add byte ptr [rcx], 0 -;; 10def: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10df8: 800100 add byte ptr [rcx], 0 -;; 10dfb: aa stosb byte ptr [rdi], al -;; 10dfc: 800100 add byte ptr [rcx], 0 -;; 10dff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10e08: 800100 add byte ptr [rcx], 0 -;; 10e0b: aa stosb byte ptr [rdi], al -;; 10e0c: 800100 add byte ptr [rcx], 0 -;; 10e0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10e18: 800100 add byte ptr [rcx], 0 -;; 10e1b: aa stosb byte ptr [rdi], al -;; 10e1c: 800100 add byte ptr [rcx], 0 -;; 10e1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10e28: 800100 add byte ptr [rcx], 0 -;; 10e2b: aa stosb byte ptr [rdi], al -;; 10e2c: 800100 add byte ptr [rcx], 0 -;; 10e2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10e38: 800100 add byte ptr [rcx], 0 -;; 10e3b: aa stosb byte ptr [rdi], al -;; 10e3c: 800100 add byte ptr [rcx], 0 -;; 10e3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10e48: 800100 add byte ptr [rcx], 0 -;; 10e4b: aa stosb byte ptr [rdi], al -;; 10e4c: 800100 add byte ptr [rcx], 0 -;; 10e4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10e58: 800100 add byte ptr [rcx], 0 -;; 10e5b: aa stosb byte ptr [rdi], al -;; 10e5c: 800100 add byte ptr [rcx], 0 -;; 10e5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10e68: 800100 add byte ptr [rcx], 0 -;; 10e6b: aa stosb byte ptr [rdi], al -;; 10e6c: 800100 add byte ptr [rcx], 0 -;; 10e6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10e78: 800100 add byte ptr [rcx], 0 -;; 10e7b: aa stosb byte ptr [rdi], al -;; 10e7c: 800100 add byte ptr [rcx], 0 -;; 10e7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10e88: 800100 add byte ptr [rcx], 0 -;; 10e8b: aa stosb byte ptr [rdi], al -;; 10e8c: 800100 add byte ptr [rcx], 0 -;; 10e8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10e98: 800100 add byte ptr [rcx], 0 -;; 10e9b: aa stosb byte ptr [rdi], al -;; 10e9c: 800100 add byte ptr [rcx], 0 -;; 10e9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10ea8: 800100 add byte ptr [rcx], 0 -;; 10eab: aa stosb byte ptr [rdi], al -;; 10eac: 800100 add byte ptr [rcx], 0 -;; 10eaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10eb8: 800100 add byte ptr [rcx], 0 -;; 10ebb: aa stosb byte ptr [rdi], al -;; 10ebc: 800100 add byte ptr [rcx], 0 -;; 10ebf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10ec8: 800100 add byte ptr [rcx], 0 -;; 10ecb: aa stosb byte ptr [rdi], al -;; 10ecc: 800100 add byte ptr [rcx], 0 -;; 10ecf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10ed8: 800100 add byte ptr [rcx], 0 -;; 10edb: aa stosb byte ptr [rdi], al -;; 10edc: 800100 add byte ptr [rcx], 0 -;; 10edf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10ee8: 800100 add byte ptr [rcx], 0 -;; 10eeb: aa stosb byte ptr [rdi], al -;; 10eec: 800100 add byte ptr [rcx], 0 -;; 10eef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10ef8: 800100 add byte ptr [rcx], 0 -;; 10efb: aa stosb byte ptr [rdi], al -;; 10efc: 800100 add byte ptr [rcx], 0 -;; 10eff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10f08: 800100 add byte ptr [rcx], 0 -;; 10f0b: aa stosb byte ptr [rdi], al -;; 10f0c: 800100 add byte ptr [rcx], 0 -;; 10f0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10f18: 800100 add byte ptr [rcx], 0 -;; 10f1b: aa stosb byte ptr [rdi], al -;; 10f1c: 800100 add byte ptr [rcx], 0 -;; 10f1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10f28: 800100 add byte ptr [rcx], 0 -;; 10f2b: aa stosb byte ptr [rdi], al -;; 10f2c: 800100 add byte ptr [rcx], 0 -;; 10f2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10f38: 800100 add byte ptr [rcx], 0 -;; 10f3b: aa stosb byte ptr [rdi], al -;; 10f3c: 800100 add byte ptr [rcx], 0 -;; 10f3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10f48: 800100 add byte ptr [rcx], 0 -;; 10f4b: aa stosb byte ptr [rdi], al -;; 10f4c: 800100 add byte ptr [rcx], 0 -;; 10f4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10f58: 800100 add byte ptr [rcx], 0 -;; 10f5b: aa stosb byte ptr [rdi], al -;; 10f5c: 800100 add byte ptr [rcx], 0 -;; 10f5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10f68: 800100 add byte ptr [rcx], 0 -;; 10f6b: aa stosb byte ptr [rdi], al -;; 10f6c: 800100 add byte ptr [rcx], 0 -;; 10f6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10f78: 800100 add byte ptr [rcx], 0 -;; 10f7b: aa stosb byte ptr [rdi], al -;; 10f7c: 800100 add byte ptr [rcx], 0 -;; 10f7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10f88: 800100 add byte ptr [rcx], 0 -;; 10f8b: aa stosb byte ptr [rdi], al -;; 10f8c: 800100 add byte ptr [rcx], 0 -;; 10f8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10f98: 800100 add byte ptr [rcx], 0 -;; 10f9b: aa stosb byte ptr [rdi], al -;; 10f9c: 800100 add byte ptr [rcx], 0 -;; 10f9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10fa8: 800100 add byte ptr [rcx], 0 -;; 10fab: aa stosb byte ptr [rdi], al -;; 10fac: 800100 add byte ptr [rcx], 0 -;; 10faf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10fb8: 800100 add byte ptr [rcx], 0 -;; 10fbb: aa stosb byte ptr [rdi], al -;; 10fbc: 800100 add byte ptr [rcx], 0 -;; 10fbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10fc8: 800100 add byte ptr [rcx], 0 -;; 10fcb: aa stosb byte ptr [rdi], al -;; 10fcc: 800100 add byte ptr [rcx], 0 -;; 10fcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10fd8: 800100 add byte ptr [rcx], 0 -;; 10fdb: aa stosb byte ptr [rdi], al -;; 10fdc: 800100 add byte ptr [rcx], 0 -;; 10fdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10fe8: 800100 add byte ptr [rcx], 0 -;; 10feb: aa stosb byte ptr [rdi], al -;; 10fec: 800100 add byte ptr [rcx], 0 -;; 10fef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 10ff8: 800100 add byte ptr [rcx], 0 -;; 10ffb: aa stosb byte ptr [rdi], al -;; 10ffc: 800100 add byte ptr [rcx], 0 -;; 10fff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11008: 800100 add byte ptr [rcx], 0 -;; 1100b: aa stosb byte ptr [rdi], al -;; 1100c: 800100 add byte ptr [rcx], 0 -;; 1100f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11018: 800100 add byte ptr [rcx], 0 -;; 1101b: aa stosb byte ptr [rdi], al -;; 1101c: 800100 add byte ptr [rcx], 0 -;; 1101f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11028: 800100 add byte ptr [rcx], 0 -;; 1102b: aa stosb byte ptr [rdi], al -;; 1102c: 800100 add byte ptr [rcx], 0 -;; 1102f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11038: 800100 add byte ptr [rcx], 0 -;; 1103b: aa stosb byte ptr [rdi], al -;; 1103c: 800100 add byte ptr [rcx], 0 -;; 1103f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11048: 800100 add byte ptr [rcx], 0 -;; 1104b: aa stosb byte ptr [rdi], al -;; 1104c: 800100 add byte ptr [rcx], 0 -;; 1104f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11058: 800100 add byte ptr [rcx], 0 -;; 1105b: aa stosb byte ptr [rdi], al -;; 1105c: 800100 add byte ptr [rcx], 0 -;; 1105f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11068: 800100 add byte ptr [rcx], 0 -;; 1106b: aa stosb byte ptr [rdi], al -;; 1106c: 800100 add byte ptr [rcx], 0 -;; 1106f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11078: 800100 add byte ptr [rcx], 0 -;; 1107b: aa stosb byte ptr [rdi], al -;; 1107c: 800100 add byte ptr [rcx], 0 -;; 1107f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11088: 800100 add byte ptr [rcx], 0 -;; 1108b: aa stosb byte ptr [rdi], al -;; 1108c: 800100 add byte ptr [rcx], 0 -;; 1108f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11098: 800100 add byte ptr [rcx], 0 -;; 1109b: aa stosb byte ptr [rdi], al -;; 1109c: 800100 add byte ptr [rcx], 0 -;; 1109f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 110a8: 800100 add byte ptr [rcx], 0 -;; 110ab: aa stosb byte ptr [rdi], al -;; 110ac: 800100 add byte ptr [rcx], 0 -;; 110af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 110b8: 800100 add byte ptr [rcx], 0 -;; 110bb: aa stosb byte ptr [rdi], al -;; 110bc: 800100 add byte ptr [rcx], 0 -;; 110bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 110c8: 800100 add byte ptr [rcx], 0 -;; 110cb: aa stosb byte ptr [rdi], al -;; 110cc: 800100 add byte ptr [rcx], 0 -;; 110cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 110d8: 800100 add byte ptr [rcx], 0 -;; 110db: aa stosb byte ptr [rdi], al -;; 110dc: 800100 add byte ptr [rcx], 0 -;; 110df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 110e8: 800100 add byte ptr [rcx], 0 -;; 110eb: aa stosb byte ptr [rdi], al -;; 110ec: 800100 add byte ptr [rcx], 0 -;; 110ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 110f8: 800100 add byte ptr [rcx], 0 -;; 110fb: aa stosb byte ptr [rdi], al -;; 110fc: 800100 add byte ptr [rcx], 0 -;; 110ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11108: 800100 add byte ptr [rcx], 0 -;; 1110b: aa stosb byte ptr [rdi], al -;; 1110c: 800100 add byte ptr [rcx], 0 -;; 1110f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11118: 800100 add byte ptr [rcx], 0 -;; 1111b: aa stosb byte ptr [rdi], al -;; 1111c: 800100 add byte ptr [rcx], 0 -;; 1111f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11128: 800100 add byte ptr [rcx], 0 -;; 1112b: aa stosb byte ptr [rdi], al -;; 1112c: 800100 add byte ptr [rcx], 0 -;; 1112f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11138: 800100 add byte ptr [rcx], 0 -;; 1113b: aa stosb byte ptr [rdi], al -;; 1113c: 800100 add byte ptr [rcx], 0 -;; 1113f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11148: 800100 add byte ptr [rcx], 0 -;; 1114b: aa stosb byte ptr [rdi], al -;; 1114c: 800100 add byte ptr [rcx], 0 -;; 1114f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11158: 800100 add byte ptr [rcx], 0 -;; 1115b: aa stosb byte ptr [rdi], al -;; 1115c: 800100 add byte ptr [rcx], 0 -;; 1115f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11168: 800100 add byte ptr [rcx], 0 -;; 1116b: aa stosb byte ptr [rdi], al -;; 1116c: 800100 add byte ptr [rcx], 0 -;; 1116f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11178: 800100 add byte ptr [rcx], 0 -;; 1117b: aa stosb byte ptr [rdi], al -;; 1117c: 800100 add byte ptr [rcx], 0 -;; 1117f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11188: 800100 add byte ptr [rcx], 0 -;; 1118b: aa stosb byte ptr [rdi], al -;; 1118c: 800100 add byte ptr [rcx], 0 -;; 1118f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11198: 800100 add byte ptr [rcx], 0 -;; 1119b: aa stosb byte ptr [rdi], al -;; 1119c: 800100 add byte ptr [rcx], 0 -;; 1119f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 111a8: 800100 add byte ptr [rcx], 0 -;; 111ab: aa stosb byte ptr [rdi], al -;; 111ac: 800100 add byte ptr [rcx], 0 -;; 111af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 111b8: 800100 add byte ptr [rcx], 0 -;; 111bb: aa stosb byte ptr [rdi], al -;; 111bc: 800100 add byte ptr [rcx], 0 -;; 111bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 111c8: 800100 add byte ptr [rcx], 0 -;; 111cb: aa stosb byte ptr [rdi], al -;; 111cc: 800100 add byte ptr [rcx], 0 -;; 111cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 111d8: 800100 add byte ptr [rcx], 0 -;; 111db: aa stosb byte ptr [rdi], al -;; 111dc: 800100 add byte ptr [rcx], 0 -;; 111df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 111e8: 800100 add byte ptr [rcx], 0 -;; 111eb: aa stosb byte ptr [rdi], al -;; 111ec: 800100 add byte ptr [rcx], 0 -;; 111ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 111f8: 800100 add byte ptr [rcx], 0 -;; 111fb: aa stosb byte ptr [rdi], al -;; 111fc: 800100 add byte ptr [rcx], 0 -;; 111ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11208: 800100 add byte ptr [rcx], 0 -;; 1120b: aa stosb byte ptr [rdi], al -;; 1120c: 800100 add byte ptr [rcx], 0 -;; 1120f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11218: 800100 add byte ptr [rcx], 0 -;; 1121b: aa stosb byte ptr [rdi], al -;; 1121c: 800100 add byte ptr [rcx], 0 -;; 1121f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11228: 800100 add byte ptr [rcx], 0 -;; 1122b: aa stosb byte ptr [rdi], al -;; 1122c: 800100 add byte ptr [rcx], 0 -;; 1122f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11238: 800100 add byte ptr [rcx], 0 -;; 1123b: aa stosb byte ptr [rdi], al -;; 1123c: 800100 add byte ptr [rcx], 0 -;; 1123f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11248: 800100 add byte ptr [rcx], 0 -;; 1124b: aa stosb byte ptr [rdi], al -;; 1124c: 800100 add byte ptr [rcx], 0 -;; 1124f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11258: 800100 add byte ptr [rcx], 0 -;; 1125b: aa stosb byte ptr [rdi], al -;; 1125c: 800100 add byte ptr [rcx], 0 -;; 1125f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11268: 800100 add byte ptr [rcx], 0 -;; 1126b: aa stosb byte ptr [rdi], al -;; 1126c: 800100 add byte ptr [rcx], 0 -;; 1126f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11278: 800100 add byte ptr [rcx], 0 -;; 1127b: aa stosb byte ptr [rdi], al -;; 1127c: 800100 add byte ptr [rcx], 0 -;; 1127f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11288: 800100 add byte ptr [rcx], 0 -;; 1128b: aa stosb byte ptr [rdi], al -;; 1128c: 800100 add byte ptr [rcx], 0 -;; 1128f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11298: 800100 add byte ptr [rcx], 0 -;; 1129b: aa stosb byte ptr [rdi], al -;; 1129c: 800100 add byte ptr [rcx], 0 -;; 1129f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 112a8: 800100 add byte ptr [rcx], 0 -;; 112ab: aa stosb byte ptr [rdi], al -;; 112ac: 800100 add byte ptr [rcx], 0 -;; 112af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 112b8: 800100 add byte ptr [rcx], 0 -;; 112bb: aa stosb byte ptr [rdi], al -;; 112bc: 800100 add byte ptr [rcx], 0 -;; 112bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 112c8: 800100 add byte ptr [rcx], 0 -;; 112cb: aa stosb byte ptr [rdi], al -;; 112cc: 800100 add byte ptr [rcx], 0 -;; 112cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 112d8: 800100 add byte ptr [rcx], 0 -;; 112db: aa stosb byte ptr [rdi], al -;; 112dc: 800100 add byte ptr [rcx], 0 -;; 112df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 112e8: 800100 add byte ptr [rcx], 0 -;; 112eb: aa stosb byte ptr [rdi], al -;; 112ec: 800100 add byte ptr [rcx], 0 -;; 112ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 112f8: 800100 add byte ptr [rcx], 0 -;; 112fb: aa stosb byte ptr [rdi], al -;; 112fc: 800100 add byte ptr [rcx], 0 -;; 112ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11308: 800100 add byte ptr [rcx], 0 -;; 1130b: aa stosb byte ptr [rdi], al -;; 1130c: 800100 add byte ptr [rcx], 0 -;; 1130f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11318: 800100 add byte ptr [rcx], 0 -;; 1131b: aa stosb byte ptr [rdi], al -;; 1131c: 800100 add byte ptr [rcx], 0 -;; 1131f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11328: 800100 add byte ptr [rcx], 0 -;; 1132b: aa stosb byte ptr [rdi], al -;; 1132c: 800100 add byte ptr [rcx], 0 -;; 1132f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11338: 800100 add byte ptr [rcx], 0 -;; 1133b: aa stosb byte ptr [rdi], al -;; 1133c: 800100 add byte ptr [rcx], 0 -;; 1133f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11348: 800100 add byte ptr [rcx], 0 -;; 1134b: aa stosb byte ptr [rdi], al -;; 1134c: 800100 add byte ptr [rcx], 0 -;; 1134f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11358: 800100 add byte ptr [rcx], 0 -;; 1135b: aa stosb byte ptr [rdi], al -;; 1135c: 800100 add byte ptr [rcx], 0 -;; 1135f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11368: 800100 add byte ptr [rcx], 0 -;; 1136b: aa stosb byte ptr [rdi], al -;; 1136c: 800100 add byte ptr [rcx], 0 -;; 1136f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11378: 800100 add byte ptr [rcx], 0 -;; 1137b: aa stosb byte ptr [rdi], al -;; 1137c: 800100 add byte ptr [rcx], 0 -;; 1137f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11388: 800100 add byte ptr [rcx], 0 -;; 1138b: aa stosb byte ptr [rdi], al -;; 1138c: 800100 add byte ptr [rcx], 0 -;; 1138f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11398: 800100 add byte ptr [rcx], 0 -;; 1139b: aa stosb byte ptr [rdi], al -;; 1139c: 800100 add byte ptr [rcx], 0 -;; 1139f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 113a8: 800100 add byte ptr [rcx], 0 -;; 113ab: aa stosb byte ptr [rdi], al -;; 113ac: 800100 add byte ptr [rcx], 0 -;; 113af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 113b8: 800100 add byte ptr [rcx], 0 -;; 113bb: aa stosb byte ptr [rdi], al -;; 113bc: 800100 add byte ptr [rcx], 0 -;; 113bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 113c8: 800100 add byte ptr [rcx], 0 -;; 113cb: aa stosb byte ptr [rdi], al -;; 113cc: 800100 add byte ptr [rcx], 0 -;; 113cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 113d8: 800100 add byte ptr [rcx], 0 -;; 113db: aa stosb byte ptr [rdi], al -;; 113dc: 800100 add byte ptr [rcx], 0 -;; 113df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 113e8: 800100 add byte ptr [rcx], 0 -;; 113eb: aa stosb byte ptr [rdi], al -;; 113ec: 800100 add byte ptr [rcx], 0 -;; 113ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 113f8: 800100 add byte ptr [rcx], 0 -;; 113fb: aa stosb byte ptr [rdi], al -;; 113fc: 800100 add byte ptr [rcx], 0 -;; 113ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11408: 800100 add byte ptr [rcx], 0 -;; 1140b: aa stosb byte ptr [rdi], al -;; 1140c: 800100 add byte ptr [rcx], 0 -;; 1140f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11418: 800100 add byte ptr [rcx], 0 -;; 1141b: aa stosb byte ptr [rdi], al -;; 1141c: 800100 add byte ptr [rcx], 0 -;; 1141f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11428: 800100 add byte ptr [rcx], 0 -;; 1142b: aa stosb byte ptr [rdi], al -;; 1142c: 800100 add byte ptr [rcx], 0 -;; 1142f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11438: 800100 add byte ptr [rcx], 0 -;; 1143b: aa stosb byte ptr [rdi], al -;; 1143c: 800100 add byte ptr [rcx], 0 -;; 1143f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11448: 800100 add byte ptr [rcx], 0 -;; 1144b: aa stosb byte ptr [rdi], al -;; 1144c: 800100 add byte ptr [rcx], 0 -;; 1144f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11458: 800100 add byte ptr [rcx], 0 -;; 1145b: aa stosb byte ptr [rdi], al -;; 1145c: 800100 add byte ptr [rcx], 0 -;; 1145f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11468: 800100 add byte ptr [rcx], 0 -;; 1146b: aa stosb byte ptr [rdi], al -;; 1146c: 800100 add byte ptr [rcx], 0 -;; 1146f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11478: 800100 add byte ptr [rcx], 0 -;; 1147b: aa stosb byte ptr [rdi], al -;; 1147c: 800100 add byte ptr [rcx], 0 -;; 1147f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11488: 800100 add byte ptr [rcx], 0 -;; 1148b: aa stosb byte ptr [rdi], al -;; 1148c: 800100 add byte ptr [rcx], 0 -;; 1148f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11498: 800100 add byte ptr [rcx], 0 -;; 1149b: aa stosb byte ptr [rdi], al -;; 1149c: 800100 add byte ptr [rcx], 0 -;; 1149f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 114a8: 800100 add byte ptr [rcx], 0 -;; 114ab: aa stosb byte ptr [rdi], al -;; 114ac: 800100 add byte ptr [rcx], 0 -;; 114af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 114b8: 800100 add byte ptr [rcx], 0 -;; 114bb: aa stosb byte ptr [rdi], al -;; 114bc: 800100 add byte ptr [rcx], 0 -;; 114bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 114c8: 800100 add byte ptr [rcx], 0 -;; 114cb: aa stosb byte ptr [rdi], al -;; 114cc: 800100 add byte ptr [rcx], 0 -;; 114cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 114d8: 800100 add byte ptr [rcx], 0 -;; 114db: aa stosb byte ptr [rdi], al -;; 114dc: 800100 add byte ptr [rcx], 0 -;; 114df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 114e8: 800100 add byte ptr [rcx], 0 -;; 114eb: aa stosb byte ptr [rdi], al -;; 114ec: 800100 add byte ptr [rcx], 0 -;; 114ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 114f8: 800100 add byte ptr [rcx], 0 -;; 114fb: aa stosb byte ptr [rdi], al -;; 114fc: 800100 add byte ptr [rcx], 0 -;; 114ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11508: 800100 add byte ptr [rcx], 0 -;; 1150b: aa stosb byte ptr [rdi], al -;; 1150c: 800100 add byte ptr [rcx], 0 -;; 1150f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11518: 800100 add byte ptr [rcx], 0 -;; 1151b: aa stosb byte ptr [rdi], al -;; 1151c: 800100 add byte ptr [rcx], 0 -;; 1151f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11528: 800100 add byte ptr [rcx], 0 -;; 1152b: aa stosb byte ptr [rdi], al -;; 1152c: 800100 add byte ptr [rcx], 0 -;; 1152f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11538: 800100 add byte ptr [rcx], 0 -;; 1153b: aa stosb byte ptr [rdi], al -;; 1153c: 800100 add byte ptr [rcx], 0 -;; 1153f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11548: 800100 add byte ptr [rcx], 0 -;; 1154b: aa stosb byte ptr [rdi], al -;; 1154c: 800100 add byte ptr [rcx], 0 -;; 1154f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11558: 800100 add byte ptr [rcx], 0 -;; 1155b: aa stosb byte ptr [rdi], al -;; 1155c: 800100 add byte ptr [rcx], 0 -;; 1155f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11568: 800100 add byte ptr [rcx], 0 -;; 1156b: aa stosb byte ptr [rdi], al -;; 1156c: 800100 add byte ptr [rcx], 0 -;; 1156f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11578: 800100 add byte ptr [rcx], 0 -;; 1157b: aa stosb byte ptr [rdi], al -;; 1157c: 800100 add byte ptr [rcx], 0 -;; 1157f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11588: 800100 add byte ptr [rcx], 0 -;; 1158b: aa stosb byte ptr [rdi], al -;; 1158c: 800100 add byte ptr [rcx], 0 -;; 1158f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11598: 800100 add byte ptr [rcx], 0 -;; 1159b: aa stosb byte ptr [rdi], al -;; 1159c: 800100 add byte ptr [rcx], 0 -;; 1159f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 115a8: 800100 add byte ptr [rcx], 0 -;; 115ab: aa stosb byte ptr [rdi], al -;; 115ac: 800100 add byte ptr [rcx], 0 -;; 115af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 115b8: 800100 add byte ptr [rcx], 0 -;; 115bb: aa stosb byte ptr [rdi], al -;; 115bc: 800100 add byte ptr [rcx], 0 -;; 115bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 115c8: 800100 add byte ptr [rcx], 0 -;; 115cb: aa stosb byte ptr [rdi], al -;; 115cc: 800100 add byte ptr [rcx], 0 -;; 115cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 115d8: 800100 add byte ptr [rcx], 0 -;; 115db: aa stosb byte ptr [rdi], al -;; 115dc: 800100 add byte ptr [rcx], 0 -;; 115df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 115e8: 800100 add byte ptr [rcx], 0 -;; 115eb: aa stosb byte ptr [rdi], al -;; 115ec: 800100 add byte ptr [rcx], 0 -;; 115ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 115f8: 800100 add byte ptr [rcx], 0 -;; 115fb: aa stosb byte ptr [rdi], al -;; 115fc: 800100 add byte ptr [rcx], 0 -;; 115ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11608: 800100 add byte ptr [rcx], 0 -;; 1160b: aa stosb byte ptr [rdi], al -;; 1160c: 800100 add byte ptr [rcx], 0 -;; 1160f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11618: 800100 add byte ptr [rcx], 0 -;; 1161b: aa stosb byte ptr [rdi], al -;; 1161c: 800100 add byte ptr [rcx], 0 -;; 1161f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11628: 800100 add byte ptr [rcx], 0 -;; 1162b: aa stosb byte ptr [rdi], al -;; 1162c: 800100 add byte ptr [rcx], 0 -;; 1162f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11638: 800100 add byte ptr [rcx], 0 -;; 1163b: aa stosb byte ptr [rdi], al -;; 1163c: 800100 add byte ptr [rcx], 0 -;; 1163f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11648: 800100 add byte ptr [rcx], 0 -;; 1164b: aa stosb byte ptr [rdi], al -;; 1164c: 800100 add byte ptr [rcx], 0 -;; 1164f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11658: 800100 add byte ptr [rcx], 0 -;; 1165b: aa stosb byte ptr [rdi], al -;; 1165c: 800100 add byte ptr [rcx], 0 -;; 1165f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11668: 800100 add byte ptr [rcx], 0 -;; 1166b: aa stosb byte ptr [rdi], al -;; 1166c: 800100 add byte ptr [rcx], 0 -;; 1166f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11678: 800100 add byte ptr [rcx], 0 -;; 1167b: aa stosb byte ptr [rdi], al -;; 1167c: 800100 add byte ptr [rcx], 0 -;; 1167f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11688: 800100 add byte ptr [rcx], 0 -;; 1168b: aa stosb byte ptr [rdi], al -;; 1168c: 800100 add byte ptr [rcx], 0 -;; 1168f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11698: 800100 add byte ptr [rcx], 0 -;; 1169b: aa stosb byte ptr [rdi], al -;; 1169c: 800100 add byte ptr [rcx], 0 -;; 1169f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 116a8: 800100 add byte ptr [rcx], 0 -;; 116ab: aa stosb byte ptr [rdi], al -;; 116ac: 800100 add byte ptr [rcx], 0 -;; 116af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 116b8: 800100 add byte ptr [rcx], 0 -;; 116bb: aa stosb byte ptr [rdi], al -;; 116bc: 800100 add byte ptr [rcx], 0 -;; 116bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 116c8: 800100 add byte ptr [rcx], 0 -;; 116cb: aa stosb byte ptr [rdi], al -;; 116cc: 800100 add byte ptr [rcx], 0 -;; 116cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 116d8: 800100 add byte ptr [rcx], 0 -;; 116db: aa stosb byte ptr [rdi], al -;; 116dc: 800100 add byte ptr [rcx], 0 -;; 116df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 116e8: 800100 add byte ptr [rcx], 0 -;; 116eb: aa stosb byte ptr [rdi], al -;; 116ec: 800100 add byte ptr [rcx], 0 -;; 116ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 116f8: 800100 add byte ptr [rcx], 0 -;; 116fb: aa stosb byte ptr [rdi], al -;; 116fc: 800100 add byte ptr [rcx], 0 -;; 116ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11708: 800100 add byte ptr [rcx], 0 -;; 1170b: aa stosb byte ptr [rdi], al -;; 1170c: 800100 add byte ptr [rcx], 0 -;; 1170f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11718: 800100 add byte ptr [rcx], 0 -;; 1171b: aa stosb byte ptr [rdi], al -;; 1171c: 800100 add byte ptr [rcx], 0 -;; 1171f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11728: 800100 add byte ptr [rcx], 0 -;; 1172b: aa stosb byte ptr [rdi], al -;; 1172c: 800100 add byte ptr [rcx], 0 -;; 1172f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11738: 800100 add byte ptr [rcx], 0 -;; 1173b: aa stosb byte ptr [rdi], al -;; 1173c: 800100 add byte ptr [rcx], 0 -;; 1173f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11748: 800100 add byte ptr [rcx], 0 -;; 1174b: aa stosb byte ptr [rdi], al -;; 1174c: 800100 add byte ptr [rcx], 0 -;; 1174f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11758: 800100 add byte ptr [rcx], 0 -;; 1175b: aa stosb byte ptr [rdi], al -;; 1175c: 800100 add byte ptr [rcx], 0 -;; 1175f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11768: 800100 add byte ptr [rcx], 0 -;; 1176b: aa stosb byte ptr [rdi], al -;; 1176c: 800100 add byte ptr [rcx], 0 -;; 1176f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11778: 800100 add byte ptr [rcx], 0 -;; 1177b: aa stosb byte ptr [rdi], al -;; 1177c: 800100 add byte ptr [rcx], 0 -;; 1177f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11788: 800100 add byte ptr [rcx], 0 -;; 1178b: aa stosb byte ptr [rdi], al -;; 1178c: 800100 add byte ptr [rcx], 0 -;; 1178f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11798: 800100 add byte ptr [rcx], 0 -;; 1179b: aa stosb byte ptr [rdi], al -;; 1179c: 800100 add byte ptr [rcx], 0 -;; 1179f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 117a8: 800100 add byte ptr [rcx], 0 -;; 117ab: aa stosb byte ptr [rdi], al -;; 117ac: 800100 add byte ptr [rcx], 0 -;; 117af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 117b8: 800100 add byte ptr [rcx], 0 -;; 117bb: aa stosb byte ptr [rdi], al -;; 117bc: 800100 add byte ptr [rcx], 0 -;; 117bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 117c8: 800100 add byte ptr [rcx], 0 -;; 117cb: aa stosb byte ptr [rdi], al -;; 117cc: 800100 add byte ptr [rcx], 0 -;; 117cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 117d8: 800100 add byte ptr [rcx], 0 -;; 117db: aa stosb byte ptr [rdi], al -;; 117dc: 800100 add byte ptr [rcx], 0 -;; 117df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 117e8: 800100 add byte ptr [rcx], 0 -;; 117eb: aa stosb byte ptr [rdi], al -;; 117ec: 800100 add byte ptr [rcx], 0 -;; 117ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 117f8: 800100 add byte ptr [rcx], 0 -;; 117fb: aa stosb byte ptr [rdi], al -;; 117fc: 800100 add byte ptr [rcx], 0 -;; 117ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11808: 800100 add byte ptr [rcx], 0 -;; 1180b: aa stosb byte ptr [rdi], al -;; 1180c: 800100 add byte ptr [rcx], 0 -;; 1180f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11818: 800100 add byte ptr [rcx], 0 -;; 1181b: aa stosb byte ptr [rdi], al -;; 1181c: 800100 add byte ptr [rcx], 0 -;; 1181f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11828: 800100 add byte ptr [rcx], 0 -;; 1182b: aa stosb byte ptr [rdi], al -;; 1182c: 800100 add byte ptr [rcx], 0 -;; 1182f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11838: 800100 add byte ptr [rcx], 0 -;; 1183b: aa stosb byte ptr [rdi], al -;; 1183c: 800100 add byte ptr [rcx], 0 -;; 1183f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11848: 800100 add byte ptr [rcx], 0 -;; 1184b: aa stosb byte ptr [rdi], al -;; 1184c: 800100 add byte ptr [rcx], 0 -;; 1184f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11858: 800100 add byte ptr [rcx], 0 -;; 1185b: aa stosb byte ptr [rdi], al -;; 1185c: 800100 add byte ptr [rcx], 0 -;; 1185f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11868: 800100 add byte ptr [rcx], 0 -;; 1186b: aa stosb byte ptr [rdi], al -;; 1186c: 800100 add byte ptr [rcx], 0 -;; 1186f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11878: 800100 add byte ptr [rcx], 0 -;; 1187b: aa stosb byte ptr [rdi], al -;; 1187c: 800100 add byte ptr [rcx], 0 -;; 1187f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11888: 800100 add byte ptr [rcx], 0 -;; 1188b: aa stosb byte ptr [rdi], al -;; 1188c: 800100 add byte ptr [rcx], 0 -;; 1188f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11898: 800100 add byte ptr [rcx], 0 -;; 1189b: aa stosb byte ptr [rdi], al -;; 1189c: 800100 add byte ptr [rcx], 0 -;; 1189f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 118a8: 800100 add byte ptr [rcx], 0 -;; 118ab: aa stosb byte ptr [rdi], al -;; 118ac: 800100 add byte ptr [rcx], 0 -;; 118af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 118b8: 800100 add byte ptr [rcx], 0 -;; 118bb: aa stosb byte ptr [rdi], al -;; 118bc: 800100 add byte ptr [rcx], 0 -;; 118bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 118c8: 800100 add byte ptr [rcx], 0 -;; 118cb: aa stosb byte ptr [rdi], al -;; 118cc: 800100 add byte ptr [rcx], 0 -;; 118cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 118d8: 800100 add byte ptr [rcx], 0 -;; 118db: aa stosb byte ptr [rdi], al -;; 118dc: 800100 add byte ptr [rcx], 0 -;; 118df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 118e8: 800100 add byte ptr [rcx], 0 -;; 118eb: aa stosb byte ptr [rdi], al -;; 118ec: 800100 add byte ptr [rcx], 0 -;; 118ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 118f8: 800100 add byte ptr [rcx], 0 -;; 118fb: aa stosb byte ptr [rdi], al -;; 118fc: 800100 add byte ptr [rcx], 0 -;; 118ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11908: 800100 add byte ptr [rcx], 0 -;; 1190b: aa stosb byte ptr [rdi], al -;; 1190c: 800100 add byte ptr [rcx], 0 -;; 1190f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11918: 800100 add byte ptr [rcx], 0 -;; 1191b: aa stosb byte ptr [rdi], al -;; 1191c: 800100 add byte ptr [rcx], 0 -;; 1191f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11928: 800100 add byte ptr [rcx], 0 -;; 1192b: aa stosb byte ptr [rdi], al -;; 1192c: 800100 add byte ptr [rcx], 0 -;; 1192f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11938: 800100 add byte ptr [rcx], 0 -;; 1193b: aa stosb byte ptr [rdi], al -;; 1193c: 800100 add byte ptr [rcx], 0 -;; 1193f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11948: 800100 add byte ptr [rcx], 0 -;; 1194b: aa stosb byte ptr [rdi], al -;; 1194c: 800100 add byte ptr [rcx], 0 -;; 1194f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11958: 800100 add byte ptr [rcx], 0 -;; 1195b: aa stosb byte ptr [rdi], al -;; 1195c: 800100 add byte ptr [rcx], 0 -;; 1195f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11968: 800100 add byte ptr [rcx], 0 -;; 1196b: aa stosb byte ptr [rdi], al -;; 1196c: 800100 add byte ptr [rcx], 0 -;; 1196f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11978: 800100 add byte ptr [rcx], 0 -;; 1197b: aa stosb byte ptr [rdi], al -;; 1197c: 800100 add byte ptr [rcx], 0 -;; 1197f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11988: 800100 add byte ptr [rcx], 0 -;; 1198b: aa stosb byte ptr [rdi], al -;; 1198c: 800100 add byte ptr [rcx], 0 -;; 1198f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11998: 800100 add byte ptr [rcx], 0 -;; 1199b: aa stosb byte ptr [rdi], al -;; 1199c: 800100 add byte ptr [rcx], 0 -;; 1199f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 119a8: 800100 add byte ptr [rcx], 0 -;; 119ab: aa stosb byte ptr [rdi], al -;; 119ac: 800100 add byte ptr [rcx], 0 -;; 119af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 119b8: 800100 add byte ptr [rcx], 0 -;; 119bb: aa stosb byte ptr [rdi], al -;; 119bc: 800100 add byte ptr [rcx], 0 -;; 119bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 119c8: 800100 add byte ptr [rcx], 0 -;; 119cb: aa stosb byte ptr [rdi], al -;; 119cc: 800100 add byte ptr [rcx], 0 -;; 119cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 119d8: 800100 add byte ptr [rcx], 0 -;; 119db: aa stosb byte ptr [rdi], al -;; 119dc: 800100 add byte ptr [rcx], 0 -;; 119df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 119e8: 800100 add byte ptr [rcx], 0 -;; 119eb: aa stosb byte ptr [rdi], al -;; 119ec: 800100 add byte ptr [rcx], 0 -;; 119ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 119f8: 800100 add byte ptr [rcx], 0 -;; 119fb: aa stosb byte ptr [rdi], al -;; 119fc: 800100 add byte ptr [rcx], 0 -;; 119ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11a08: 800100 add byte ptr [rcx], 0 -;; 11a0b: aa stosb byte ptr [rdi], al -;; 11a0c: 800100 add byte ptr [rcx], 0 -;; 11a0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11a18: 800100 add byte ptr [rcx], 0 -;; 11a1b: aa stosb byte ptr [rdi], al -;; 11a1c: 800100 add byte ptr [rcx], 0 -;; 11a1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11a28: 800100 add byte ptr [rcx], 0 -;; 11a2b: aa stosb byte ptr [rdi], al -;; 11a2c: 800100 add byte ptr [rcx], 0 -;; 11a2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11a38: 800100 add byte ptr [rcx], 0 -;; 11a3b: aa stosb byte ptr [rdi], al -;; 11a3c: 800100 add byte ptr [rcx], 0 -;; 11a3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11a48: 800100 add byte ptr [rcx], 0 -;; 11a4b: aa stosb byte ptr [rdi], al -;; 11a4c: 800100 add byte ptr [rcx], 0 -;; 11a4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11a58: 800100 add byte ptr [rcx], 0 -;; 11a5b: aa stosb byte ptr [rdi], al -;; 11a5c: 800100 add byte ptr [rcx], 0 -;; 11a5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11a68: 800100 add byte ptr [rcx], 0 -;; 11a6b: aa stosb byte ptr [rdi], al -;; 11a6c: 800100 add byte ptr [rcx], 0 -;; 11a6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11a78: 800100 add byte ptr [rcx], 0 -;; 11a7b: aa stosb byte ptr [rdi], al -;; 11a7c: 800100 add byte ptr [rcx], 0 -;; 11a7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11a88: 800100 add byte ptr [rcx], 0 -;; 11a8b: aa stosb byte ptr [rdi], al -;; 11a8c: 800100 add byte ptr [rcx], 0 -;; 11a8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11a98: 800100 add byte ptr [rcx], 0 -;; 11a9b: aa stosb byte ptr [rdi], al -;; 11a9c: 800100 add byte ptr [rcx], 0 -;; 11a9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11aa8: 800100 add byte ptr [rcx], 0 -;; 11aab: aa stosb byte ptr [rdi], al -;; 11aac: 800100 add byte ptr [rcx], 0 -;; 11aaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11ab8: 800100 add byte ptr [rcx], 0 -;; 11abb: aa stosb byte ptr [rdi], al -;; 11abc: 800100 add byte ptr [rcx], 0 -;; 11abf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11ac8: 800100 add byte ptr [rcx], 0 -;; 11acb: aa stosb byte ptr [rdi], al -;; 11acc: 800100 add byte ptr [rcx], 0 -;; 11acf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11ad8: 800100 add byte ptr [rcx], 0 -;; 11adb: aa stosb byte ptr [rdi], al -;; 11adc: 800100 add byte ptr [rcx], 0 -;; 11adf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11ae8: 800100 add byte ptr [rcx], 0 -;; 11aeb: aa stosb byte ptr [rdi], al -;; 11aec: 800100 add byte ptr [rcx], 0 -;; 11aef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11af8: 800100 add byte ptr [rcx], 0 -;; 11afb: aa stosb byte ptr [rdi], al -;; 11afc: 800100 add byte ptr [rcx], 0 -;; 11aff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11b08: 800100 add byte ptr [rcx], 0 -;; 11b0b: aa stosb byte ptr [rdi], al -;; 11b0c: 800100 add byte ptr [rcx], 0 -;; 11b0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11b18: 800100 add byte ptr [rcx], 0 -;; 11b1b: aa stosb byte ptr [rdi], al -;; 11b1c: 800100 add byte ptr [rcx], 0 -;; 11b1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11b28: 800100 add byte ptr [rcx], 0 -;; 11b2b: aa stosb byte ptr [rdi], al -;; 11b2c: 800100 add byte ptr [rcx], 0 -;; 11b2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11b38: 800100 add byte ptr [rcx], 0 -;; 11b3b: aa stosb byte ptr [rdi], al -;; 11b3c: 800100 add byte ptr [rcx], 0 -;; 11b3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11b48: 800100 add byte ptr [rcx], 0 -;; 11b4b: aa stosb byte ptr [rdi], al -;; 11b4c: 800100 add byte ptr [rcx], 0 -;; 11b4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11b58: 800100 add byte ptr [rcx], 0 -;; 11b5b: aa stosb byte ptr [rdi], al -;; 11b5c: 800100 add byte ptr [rcx], 0 -;; 11b5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11b68: 800100 add byte ptr [rcx], 0 -;; 11b6b: aa stosb byte ptr [rdi], al -;; 11b6c: 800100 add byte ptr [rcx], 0 -;; 11b6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11b78: 800100 add byte ptr [rcx], 0 -;; 11b7b: aa stosb byte ptr [rdi], al -;; 11b7c: 800100 add byte ptr [rcx], 0 -;; 11b7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11b88: 800100 add byte ptr [rcx], 0 -;; 11b8b: aa stosb byte ptr [rdi], al -;; 11b8c: 800100 add byte ptr [rcx], 0 -;; 11b8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11b98: 800100 add byte ptr [rcx], 0 -;; 11b9b: aa stosb byte ptr [rdi], al -;; 11b9c: 800100 add byte ptr [rcx], 0 -;; 11b9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11ba8: 800100 add byte ptr [rcx], 0 -;; 11bab: aa stosb byte ptr [rdi], al -;; 11bac: 800100 add byte ptr [rcx], 0 -;; 11baf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11bb8: 800100 add byte ptr [rcx], 0 -;; 11bbb: aa stosb byte ptr [rdi], al -;; 11bbc: 800100 add byte ptr [rcx], 0 -;; 11bbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11bc8: 800100 add byte ptr [rcx], 0 -;; 11bcb: aa stosb byte ptr [rdi], al -;; 11bcc: 800100 add byte ptr [rcx], 0 -;; 11bcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11bd8: 800100 add byte ptr [rcx], 0 -;; 11bdb: aa stosb byte ptr [rdi], al -;; 11bdc: 800100 add byte ptr [rcx], 0 -;; 11bdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11be8: 800100 add byte ptr [rcx], 0 -;; 11beb: aa stosb byte ptr [rdi], al -;; 11bec: 800100 add byte ptr [rcx], 0 -;; 11bef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11bf8: 800100 add byte ptr [rcx], 0 -;; 11bfb: aa stosb byte ptr [rdi], al -;; 11bfc: 800100 add byte ptr [rcx], 0 -;; 11bff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11c08: 800100 add byte ptr [rcx], 0 -;; 11c0b: aa stosb byte ptr [rdi], al -;; 11c0c: 800100 add byte ptr [rcx], 0 -;; 11c0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11c18: 800100 add byte ptr [rcx], 0 -;; 11c1b: aa stosb byte ptr [rdi], al -;; 11c1c: 800100 add byte ptr [rcx], 0 -;; 11c1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11c28: 800100 add byte ptr [rcx], 0 -;; 11c2b: aa stosb byte ptr [rdi], al -;; 11c2c: 800100 add byte ptr [rcx], 0 -;; 11c2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11c38: 800100 add byte ptr [rcx], 0 -;; 11c3b: aa stosb byte ptr [rdi], al -;; 11c3c: 800100 add byte ptr [rcx], 0 -;; 11c3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11c48: 800100 add byte ptr [rcx], 0 -;; 11c4b: aa stosb byte ptr [rdi], al -;; 11c4c: 800100 add byte ptr [rcx], 0 -;; 11c4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11c58: 800100 add byte ptr [rcx], 0 -;; 11c5b: aa stosb byte ptr [rdi], al -;; 11c5c: 800100 add byte ptr [rcx], 0 -;; 11c5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11c68: 800100 add byte ptr [rcx], 0 -;; 11c6b: aa stosb byte ptr [rdi], al -;; 11c6c: 800100 add byte ptr [rcx], 0 -;; 11c6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11c78: 800100 add byte ptr [rcx], 0 -;; 11c7b: aa stosb byte ptr [rdi], al -;; 11c7c: 800100 add byte ptr [rcx], 0 -;; 11c7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11c88: 800100 add byte ptr [rcx], 0 -;; 11c8b: aa stosb byte ptr [rdi], al -;; 11c8c: 800100 add byte ptr [rcx], 0 -;; 11c8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11c98: 800100 add byte ptr [rcx], 0 -;; 11c9b: aa stosb byte ptr [rdi], al -;; 11c9c: 800100 add byte ptr [rcx], 0 -;; 11c9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11ca8: 800100 add byte ptr [rcx], 0 -;; 11cab: aa stosb byte ptr [rdi], al -;; 11cac: 800100 add byte ptr [rcx], 0 -;; 11caf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11cb8: 800100 add byte ptr [rcx], 0 -;; 11cbb: aa stosb byte ptr [rdi], al -;; 11cbc: 800100 add byte ptr [rcx], 0 -;; 11cbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11cc8: 800100 add byte ptr [rcx], 0 -;; 11ccb: aa stosb byte ptr [rdi], al -;; 11ccc: 800100 add byte ptr [rcx], 0 -;; 11ccf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11cd8: 800100 add byte ptr [rcx], 0 -;; 11cdb: aa stosb byte ptr [rdi], al -;; 11cdc: 800100 add byte ptr [rcx], 0 -;; 11cdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11ce8: 800100 add byte ptr [rcx], 0 -;; 11ceb: aa stosb byte ptr [rdi], al -;; 11cec: 800100 add byte ptr [rcx], 0 -;; 11cef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11cf8: 800100 add byte ptr [rcx], 0 -;; 11cfb: aa stosb byte ptr [rdi], al -;; 11cfc: 800100 add byte ptr [rcx], 0 -;; 11cff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11d08: 800100 add byte ptr [rcx], 0 -;; 11d0b: aa stosb byte ptr [rdi], al -;; 11d0c: 800100 add byte ptr [rcx], 0 -;; 11d0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11d18: 800100 add byte ptr [rcx], 0 -;; 11d1b: aa stosb byte ptr [rdi], al -;; 11d1c: 800100 add byte ptr [rcx], 0 -;; 11d1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11d28: 800100 add byte ptr [rcx], 0 -;; 11d2b: aa stosb byte ptr [rdi], al -;; 11d2c: 800100 add byte ptr [rcx], 0 -;; 11d2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11d38: 800100 add byte ptr [rcx], 0 -;; 11d3b: aa stosb byte ptr [rdi], al -;; 11d3c: 800100 add byte ptr [rcx], 0 -;; 11d3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11d48: 800100 add byte ptr [rcx], 0 -;; 11d4b: aa stosb byte ptr [rdi], al -;; 11d4c: 800100 add byte ptr [rcx], 0 -;; 11d4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11d58: 800100 add byte ptr [rcx], 0 -;; 11d5b: aa stosb byte ptr [rdi], al -;; 11d5c: 800100 add byte ptr [rcx], 0 -;; 11d5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11d68: 800100 add byte ptr [rcx], 0 -;; 11d6b: aa stosb byte ptr [rdi], al -;; 11d6c: 800100 add byte ptr [rcx], 0 -;; 11d6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11d78: 800100 add byte ptr [rcx], 0 -;; 11d7b: aa stosb byte ptr [rdi], al -;; 11d7c: 800100 add byte ptr [rcx], 0 -;; 11d7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11d88: 800100 add byte ptr [rcx], 0 -;; 11d8b: aa stosb byte ptr [rdi], al -;; 11d8c: 800100 add byte ptr [rcx], 0 -;; 11d8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11d98: 800100 add byte ptr [rcx], 0 -;; 11d9b: aa stosb byte ptr [rdi], al -;; 11d9c: 800100 add byte ptr [rcx], 0 -;; 11d9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11da8: 800100 add byte ptr [rcx], 0 -;; 11dab: aa stosb byte ptr [rdi], al -;; 11dac: 800100 add byte ptr [rcx], 0 -;; 11daf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11db8: 800100 add byte ptr [rcx], 0 -;; 11dbb: aa stosb byte ptr [rdi], al -;; 11dbc: 800100 add byte ptr [rcx], 0 -;; 11dbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11dc8: 800100 add byte ptr [rcx], 0 -;; 11dcb: aa stosb byte ptr [rdi], al -;; 11dcc: 800100 add byte ptr [rcx], 0 -;; 11dcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11dd8: 800100 add byte ptr [rcx], 0 -;; 11ddb: aa stosb byte ptr [rdi], al -;; 11ddc: 800100 add byte ptr [rcx], 0 -;; 11ddf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11de8: 800100 add byte ptr [rcx], 0 -;; 11deb: aa stosb byte ptr [rdi], al -;; 11dec: 800100 add byte ptr [rcx], 0 -;; 11def: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11df8: 800100 add byte ptr [rcx], 0 -;; 11dfb: aa stosb byte ptr [rdi], al -;; 11dfc: 800100 add byte ptr [rcx], 0 -;; 11dff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11e08: 800100 add byte ptr [rcx], 0 -;; 11e0b: aa stosb byte ptr [rdi], al -;; 11e0c: 800100 add byte ptr [rcx], 0 -;; 11e0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11e18: 800100 add byte ptr [rcx], 0 -;; 11e1b: aa stosb byte ptr [rdi], al -;; 11e1c: 800100 add byte ptr [rcx], 0 -;; 11e1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11e28: 800100 add byte ptr [rcx], 0 -;; 11e2b: aa stosb byte ptr [rdi], al -;; 11e2c: 800100 add byte ptr [rcx], 0 -;; 11e2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11e38: 800100 add byte ptr [rcx], 0 -;; 11e3b: aa stosb byte ptr [rdi], al -;; 11e3c: 800100 add byte ptr [rcx], 0 -;; 11e3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11e48: 800100 add byte ptr [rcx], 0 -;; 11e4b: aa stosb byte ptr [rdi], al -;; 11e4c: 800100 add byte ptr [rcx], 0 -;; 11e4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11e58: 800100 add byte ptr [rcx], 0 -;; 11e5b: aa stosb byte ptr [rdi], al -;; 11e5c: 800100 add byte ptr [rcx], 0 -;; 11e5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11e68: 800100 add byte ptr [rcx], 0 -;; 11e6b: aa stosb byte ptr [rdi], al -;; 11e6c: 800100 add byte ptr [rcx], 0 -;; 11e6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11e78: 800100 add byte ptr [rcx], 0 -;; 11e7b: aa stosb byte ptr [rdi], al -;; 11e7c: 800100 add byte ptr [rcx], 0 -;; 11e7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11e88: 800100 add byte ptr [rcx], 0 -;; 11e8b: aa stosb byte ptr [rdi], al -;; 11e8c: 800100 add byte ptr [rcx], 0 -;; 11e8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11e98: 800100 add byte ptr [rcx], 0 -;; 11e9b: aa stosb byte ptr [rdi], al -;; 11e9c: 800100 add byte ptr [rcx], 0 -;; 11e9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11ea8: 800100 add byte ptr [rcx], 0 -;; 11eab: aa stosb byte ptr [rdi], al -;; 11eac: 800100 add byte ptr [rcx], 0 -;; 11eaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11eb8: 800100 add byte ptr [rcx], 0 -;; 11ebb: aa stosb byte ptr [rdi], al -;; 11ebc: 800100 add byte ptr [rcx], 0 -;; 11ebf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11ec8: 800100 add byte ptr [rcx], 0 -;; 11ecb: aa stosb byte ptr [rdi], al -;; 11ecc: 800100 add byte ptr [rcx], 0 -;; 11ecf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11ed8: 800100 add byte ptr [rcx], 0 -;; 11edb: aa stosb byte ptr [rdi], al -;; 11edc: 800100 add byte ptr [rcx], 0 -;; 11edf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11ee8: 800100 add byte ptr [rcx], 0 -;; 11eeb: aa stosb byte ptr [rdi], al -;; 11eec: 800100 add byte ptr [rcx], 0 -;; 11eef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11ef8: 800100 add byte ptr [rcx], 0 -;; 11efb: aa stosb byte ptr [rdi], al -;; 11efc: 800100 add byte ptr [rcx], 0 -;; 11eff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11f08: 800100 add byte ptr [rcx], 0 -;; 11f0b: aa stosb byte ptr [rdi], al -;; 11f0c: 800100 add byte ptr [rcx], 0 -;; 11f0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11f18: 800100 add byte ptr [rcx], 0 -;; 11f1b: aa stosb byte ptr [rdi], al -;; 11f1c: 800100 add byte ptr [rcx], 0 -;; 11f1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11f28: 800100 add byte ptr [rcx], 0 -;; 11f2b: aa stosb byte ptr [rdi], al -;; 11f2c: 800100 add byte ptr [rcx], 0 -;; 11f2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11f38: 800100 add byte ptr [rcx], 0 -;; 11f3b: aa stosb byte ptr [rdi], al -;; 11f3c: 800100 add byte ptr [rcx], 0 -;; 11f3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11f48: 800100 add byte ptr [rcx], 0 -;; 11f4b: aa stosb byte ptr [rdi], al -;; 11f4c: 800100 add byte ptr [rcx], 0 -;; 11f4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11f58: 800100 add byte ptr [rcx], 0 -;; 11f5b: aa stosb byte ptr [rdi], al -;; 11f5c: 800100 add byte ptr [rcx], 0 -;; 11f5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11f68: 800100 add byte ptr [rcx], 0 -;; 11f6b: aa stosb byte ptr [rdi], al -;; 11f6c: 800100 add byte ptr [rcx], 0 -;; 11f6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11f78: 800100 add byte ptr [rcx], 0 -;; 11f7b: aa stosb byte ptr [rdi], al -;; 11f7c: 800100 add byte ptr [rcx], 0 -;; 11f7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11f88: 800100 add byte ptr [rcx], 0 -;; 11f8b: aa stosb byte ptr [rdi], al -;; 11f8c: 800100 add byte ptr [rcx], 0 -;; 11f8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11f98: 800100 add byte ptr [rcx], 0 -;; 11f9b: aa stosb byte ptr [rdi], al -;; 11f9c: 800100 add byte ptr [rcx], 0 -;; 11f9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11fa8: 800100 add byte ptr [rcx], 0 -;; 11fab: aa stosb byte ptr [rdi], al -;; 11fac: 800100 add byte ptr [rcx], 0 -;; 11faf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11fb8: 800100 add byte ptr [rcx], 0 -;; 11fbb: aa stosb byte ptr [rdi], al -;; 11fbc: 800100 add byte ptr [rcx], 0 -;; 11fbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11fc8: 800100 add byte ptr [rcx], 0 -;; 11fcb: aa stosb byte ptr [rdi], al -;; 11fcc: 800100 add byte ptr [rcx], 0 -;; 11fcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11fd8: 800100 add byte ptr [rcx], 0 -;; 11fdb: aa stosb byte ptr [rdi], al -;; 11fdc: 800100 add byte ptr [rcx], 0 -;; 11fdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11fe8: 800100 add byte ptr [rcx], 0 -;; 11feb: aa stosb byte ptr [rdi], al -;; 11fec: 800100 add byte ptr [rcx], 0 -;; 11fef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 11ff8: 800100 add byte ptr [rcx], 0 -;; 11ffb: aa stosb byte ptr [rdi], al -;; 11ffc: 800100 add byte ptr [rcx], 0 -;; 11fff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12008: 800100 add byte ptr [rcx], 0 -;; 1200b: aa stosb byte ptr [rdi], al -;; 1200c: 800100 add byte ptr [rcx], 0 -;; 1200f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12018: 800100 add byte ptr [rcx], 0 -;; 1201b: aa stosb byte ptr [rdi], al -;; 1201c: 800100 add byte ptr [rcx], 0 -;; 1201f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12028: 800100 add byte ptr [rcx], 0 -;; 1202b: aa stosb byte ptr [rdi], al -;; 1202c: 800100 add byte ptr [rcx], 0 -;; 1202f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12038: 800100 add byte ptr [rcx], 0 -;; 1203b: aa stosb byte ptr [rdi], al -;; 1203c: 800100 add byte ptr [rcx], 0 -;; 1203f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12048: 800100 add byte ptr [rcx], 0 -;; 1204b: aa stosb byte ptr [rdi], al -;; 1204c: 800100 add byte ptr [rcx], 0 -;; 1204f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12058: 800100 add byte ptr [rcx], 0 -;; 1205b: aa stosb byte ptr [rdi], al -;; 1205c: 800100 add byte ptr [rcx], 0 -;; 1205f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12068: 800100 add byte ptr [rcx], 0 -;; 1206b: aa stosb byte ptr [rdi], al -;; 1206c: 800100 add byte ptr [rcx], 0 -;; 1206f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12078: 800100 add byte ptr [rcx], 0 -;; 1207b: aa stosb byte ptr [rdi], al -;; 1207c: 800100 add byte ptr [rcx], 0 -;; 1207f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12088: 800100 add byte ptr [rcx], 0 -;; 1208b: aa stosb byte ptr [rdi], al -;; 1208c: 800100 add byte ptr [rcx], 0 -;; 1208f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12098: 800100 add byte ptr [rcx], 0 -;; 1209b: aa stosb byte ptr [rdi], al -;; 1209c: 800100 add byte ptr [rcx], 0 -;; 1209f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 120a8: 800100 add byte ptr [rcx], 0 -;; 120ab: aa stosb byte ptr [rdi], al -;; 120ac: 800100 add byte ptr [rcx], 0 -;; 120af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 120b8: 800100 add byte ptr [rcx], 0 -;; 120bb: aa stosb byte ptr [rdi], al -;; 120bc: 800100 add byte ptr [rcx], 0 -;; 120bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 120c8: 800100 add byte ptr [rcx], 0 -;; 120cb: aa stosb byte ptr [rdi], al -;; 120cc: 800100 add byte ptr [rcx], 0 -;; 120cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 120d8: 800100 add byte ptr [rcx], 0 -;; 120db: aa stosb byte ptr [rdi], al -;; 120dc: 800100 add byte ptr [rcx], 0 -;; 120df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 120e8: 800100 add byte ptr [rcx], 0 -;; 120eb: aa stosb byte ptr [rdi], al -;; 120ec: 800100 add byte ptr [rcx], 0 -;; 120ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 120f8: 800100 add byte ptr [rcx], 0 -;; 120fb: aa stosb byte ptr [rdi], al -;; 120fc: 800100 add byte ptr [rcx], 0 -;; 120ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12108: 800100 add byte ptr [rcx], 0 -;; 1210b: aa stosb byte ptr [rdi], al -;; 1210c: 800100 add byte ptr [rcx], 0 -;; 1210f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12118: 800100 add byte ptr [rcx], 0 -;; 1211b: aa stosb byte ptr [rdi], al -;; 1211c: 800100 add byte ptr [rcx], 0 -;; 1211f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12128: 800100 add byte ptr [rcx], 0 -;; 1212b: aa stosb byte ptr [rdi], al -;; 1212c: 800100 add byte ptr [rcx], 0 -;; 1212f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12138: 800100 add byte ptr [rcx], 0 -;; 1213b: aa stosb byte ptr [rdi], al -;; 1213c: 800100 add byte ptr [rcx], 0 -;; 1213f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12148: 800100 add byte ptr [rcx], 0 -;; 1214b: aa stosb byte ptr [rdi], al -;; 1214c: 800100 add byte ptr [rcx], 0 -;; 1214f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12158: 800100 add byte ptr [rcx], 0 -;; 1215b: aa stosb byte ptr [rdi], al -;; 1215c: 800100 add byte ptr [rcx], 0 -;; 1215f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12168: 800100 add byte ptr [rcx], 0 -;; 1216b: aa stosb byte ptr [rdi], al -;; 1216c: 800100 add byte ptr [rcx], 0 -;; 1216f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12178: 800100 add byte ptr [rcx], 0 -;; 1217b: aa stosb byte ptr [rdi], al -;; 1217c: 800100 add byte ptr [rcx], 0 -;; 1217f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12188: 800100 add byte ptr [rcx], 0 -;; 1218b: aa stosb byte ptr [rdi], al -;; 1218c: 800100 add byte ptr [rcx], 0 -;; 1218f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12198: 800100 add byte ptr [rcx], 0 -;; 1219b: aa stosb byte ptr [rdi], al -;; 1219c: 800100 add byte ptr [rcx], 0 -;; 1219f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 121a8: 800100 add byte ptr [rcx], 0 -;; 121ab: aa stosb byte ptr [rdi], al -;; 121ac: 800100 add byte ptr [rcx], 0 -;; 121af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 121b8: 800100 add byte ptr [rcx], 0 -;; 121bb: aa stosb byte ptr [rdi], al -;; 121bc: 800100 add byte ptr [rcx], 0 -;; 121bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 121c8: 800100 add byte ptr [rcx], 0 -;; 121cb: aa stosb byte ptr [rdi], al -;; 121cc: 800100 add byte ptr [rcx], 0 -;; 121cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 121d8: 800100 add byte ptr [rcx], 0 -;; 121db: aa stosb byte ptr [rdi], al -;; 121dc: 800100 add byte ptr [rcx], 0 -;; 121df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 121e8: 800100 add byte ptr [rcx], 0 -;; 121eb: aa stosb byte ptr [rdi], al -;; 121ec: 800100 add byte ptr [rcx], 0 -;; 121ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 121f8: 800100 add byte ptr [rcx], 0 -;; 121fb: aa stosb byte ptr [rdi], al -;; 121fc: 800100 add byte ptr [rcx], 0 -;; 121ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12208: 800100 add byte ptr [rcx], 0 -;; 1220b: aa stosb byte ptr [rdi], al -;; 1220c: 800100 add byte ptr [rcx], 0 -;; 1220f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12218: 800100 add byte ptr [rcx], 0 -;; 1221b: aa stosb byte ptr [rdi], al -;; 1221c: 800100 add byte ptr [rcx], 0 -;; 1221f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12228: 800100 add byte ptr [rcx], 0 -;; 1222b: aa stosb byte ptr [rdi], al -;; 1222c: 800100 add byte ptr [rcx], 0 -;; 1222f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12238: 800100 add byte ptr [rcx], 0 -;; 1223b: aa stosb byte ptr [rdi], al -;; 1223c: 800100 add byte ptr [rcx], 0 -;; 1223f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12248: 800100 add byte ptr [rcx], 0 -;; 1224b: aa stosb byte ptr [rdi], al -;; 1224c: 800100 add byte ptr [rcx], 0 -;; 1224f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12258: 800100 add byte ptr [rcx], 0 -;; 1225b: aa stosb byte ptr [rdi], al -;; 1225c: 800100 add byte ptr [rcx], 0 -;; 1225f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12268: 800100 add byte ptr [rcx], 0 -;; 1226b: aa stosb byte ptr [rdi], al -;; 1226c: 800100 add byte ptr [rcx], 0 -;; 1226f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12278: 800100 add byte ptr [rcx], 0 -;; 1227b: aa stosb byte ptr [rdi], al -;; 1227c: 800100 add byte ptr [rcx], 0 -;; 1227f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12288: 800100 add byte ptr [rcx], 0 -;; 1228b: aa stosb byte ptr [rdi], al -;; 1228c: 800100 add byte ptr [rcx], 0 -;; 1228f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12298: 800100 add byte ptr [rcx], 0 -;; 1229b: aa stosb byte ptr [rdi], al -;; 1229c: 800100 add byte ptr [rcx], 0 -;; 1229f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 122a8: 800100 add byte ptr [rcx], 0 -;; 122ab: aa stosb byte ptr [rdi], al -;; 122ac: 800100 add byte ptr [rcx], 0 -;; 122af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 122b8: 800100 add byte ptr [rcx], 0 -;; 122bb: aa stosb byte ptr [rdi], al -;; 122bc: 800100 add byte ptr [rcx], 0 -;; 122bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 122c8: 800100 add byte ptr [rcx], 0 -;; 122cb: aa stosb byte ptr [rdi], al -;; 122cc: 800100 add byte ptr [rcx], 0 -;; 122cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 122d8: 800100 add byte ptr [rcx], 0 -;; 122db: aa stosb byte ptr [rdi], al -;; 122dc: 800100 add byte ptr [rcx], 0 -;; 122df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 122e8: 800100 add byte ptr [rcx], 0 -;; 122eb: aa stosb byte ptr [rdi], al -;; 122ec: 800100 add byte ptr [rcx], 0 -;; 122ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 122f8: 800100 add byte ptr [rcx], 0 -;; 122fb: aa stosb byte ptr [rdi], al -;; 122fc: 800100 add byte ptr [rcx], 0 -;; 122ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12308: 800100 add byte ptr [rcx], 0 -;; 1230b: aa stosb byte ptr [rdi], al -;; 1230c: 800100 add byte ptr [rcx], 0 -;; 1230f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12318: 800100 add byte ptr [rcx], 0 -;; 1231b: aa stosb byte ptr [rdi], al -;; 1231c: 800100 add byte ptr [rcx], 0 -;; 1231f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12328: 800100 add byte ptr [rcx], 0 -;; 1232b: aa stosb byte ptr [rdi], al -;; 1232c: 800100 add byte ptr [rcx], 0 -;; 1232f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12338: 800100 add byte ptr [rcx], 0 -;; 1233b: aa stosb byte ptr [rdi], al -;; 1233c: 800100 add byte ptr [rcx], 0 -;; 1233f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12348: 800100 add byte ptr [rcx], 0 -;; 1234b: aa stosb byte ptr [rdi], al -;; 1234c: 800100 add byte ptr [rcx], 0 -;; 1234f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12358: 800100 add byte ptr [rcx], 0 -;; 1235b: aa stosb byte ptr [rdi], al -;; 1235c: 800100 add byte ptr [rcx], 0 -;; 1235f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12368: 800100 add byte ptr [rcx], 0 -;; 1236b: aa stosb byte ptr [rdi], al -;; 1236c: 800100 add byte ptr [rcx], 0 -;; 1236f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12378: 800100 add byte ptr [rcx], 0 -;; 1237b: aa stosb byte ptr [rdi], al -;; 1237c: 800100 add byte ptr [rcx], 0 -;; 1237f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12388: 800100 add byte ptr [rcx], 0 -;; 1238b: aa stosb byte ptr [rdi], al -;; 1238c: 800100 add byte ptr [rcx], 0 -;; 1238f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12398: 800100 add byte ptr [rcx], 0 -;; 1239b: aa stosb byte ptr [rdi], al -;; 1239c: 800100 add byte ptr [rcx], 0 -;; 1239f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 123a8: 800100 add byte ptr [rcx], 0 -;; 123ab: aa stosb byte ptr [rdi], al -;; 123ac: 800100 add byte ptr [rcx], 0 -;; 123af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 123b8: 800100 add byte ptr [rcx], 0 -;; 123bb: aa stosb byte ptr [rdi], al -;; 123bc: 800100 add byte ptr [rcx], 0 -;; 123bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 123c8: 800100 add byte ptr [rcx], 0 -;; 123cb: aa stosb byte ptr [rdi], al -;; 123cc: 800100 add byte ptr [rcx], 0 -;; 123cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 123d8: 800100 add byte ptr [rcx], 0 -;; 123db: aa stosb byte ptr [rdi], al -;; 123dc: 800100 add byte ptr [rcx], 0 -;; 123df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 123e8: 800100 add byte ptr [rcx], 0 -;; 123eb: aa stosb byte ptr [rdi], al -;; 123ec: 800100 add byte ptr [rcx], 0 -;; 123ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 123f8: 800100 add byte ptr [rcx], 0 -;; 123fb: aa stosb byte ptr [rdi], al -;; 123fc: 800100 add byte ptr [rcx], 0 -;; 123ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12408: 800100 add byte ptr [rcx], 0 -;; 1240b: aa stosb byte ptr [rdi], al -;; 1240c: 800100 add byte ptr [rcx], 0 -;; 1240f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12418: 800100 add byte ptr [rcx], 0 -;; 1241b: aa stosb byte ptr [rdi], al -;; 1241c: 800100 add byte ptr [rcx], 0 -;; 1241f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12428: 800100 add byte ptr [rcx], 0 -;; 1242b: aa stosb byte ptr [rdi], al -;; 1242c: 800100 add byte ptr [rcx], 0 -;; 1242f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12438: 800100 add byte ptr [rcx], 0 -;; 1243b: aa stosb byte ptr [rdi], al -;; 1243c: 800100 add byte ptr [rcx], 0 -;; 1243f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12448: 800100 add byte ptr [rcx], 0 -;; 1244b: aa stosb byte ptr [rdi], al -;; 1244c: 800100 add byte ptr [rcx], 0 -;; 1244f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12458: 800100 add byte ptr [rcx], 0 -;; 1245b: aa stosb byte ptr [rdi], al -;; 1245c: 800100 add byte ptr [rcx], 0 -;; 1245f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12468: 800100 add byte ptr [rcx], 0 -;; 1246b: aa stosb byte ptr [rdi], al -;; 1246c: 800100 add byte ptr [rcx], 0 -;; 1246f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12478: 800100 add byte ptr [rcx], 0 -;; 1247b: aa stosb byte ptr [rdi], al -;; 1247c: 800100 add byte ptr [rcx], 0 -;; 1247f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12488: 800100 add byte ptr [rcx], 0 -;; 1248b: aa stosb byte ptr [rdi], al -;; 1248c: 800100 add byte ptr [rcx], 0 -;; 1248f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12498: 800100 add byte ptr [rcx], 0 -;; 1249b: aa stosb byte ptr [rdi], al -;; 1249c: 800100 add byte ptr [rcx], 0 -;; 1249f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 124a8: 800100 add byte ptr [rcx], 0 -;; 124ab: aa stosb byte ptr [rdi], al -;; 124ac: 800100 add byte ptr [rcx], 0 -;; 124af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 124b8: 800100 add byte ptr [rcx], 0 -;; 124bb: aa stosb byte ptr [rdi], al -;; 124bc: 800100 add byte ptr [rcx], 0 -;; 124bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 124c8: 800100 add byte ptr [rcx], 0 -;; 124cb: aa stosb byte ptr [rdi], al -;; 124cc: 800100 add byte ptr [rcx], 0 -;; 124cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 124d8: 800100 add byte ptr [rcx], 0 -;; 124db: aa stosb byte ptr [rdi], al -;; 124dc: 800100 add byte ptr [rcx], 0 -;; 124df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 124e8: 800100 add byte ptr [rcx], 0 -;; 124eb: aa stosb byte ptr [rdi], al -;; 124ec: 800100 add byte ptr [rcx], 0 -;; 124ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 124f8: 800100 add byte ptr [rcx], 0 -;; 124fb: aa stosb byte ptr [rdi], al -;; 124fc: 800100 add byte ptr [rcx], 0 -;; 124ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12508: 800100 add byte ptr [rcx], 0 -;; 1250b: aa stosb byte ptr [rdi], al -;; 1250c: 800100 add byte ptr [rcx], 0 -;; 1250f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12518: 800100 add byte ptr [rcx], 0 -;; 1251b: aa stosb byte ptr [rdi], al -;; 1251c: 800100 add byte ptr [rcx], 0 -;; 1251f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12528: 800100 add byte ptr [rcx], 0 -;; 1252b: aa stosb byte ptr [rdi], al -;; 1252c: 800100 add byte ptr [rcx], 0 -;; 1252f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12538: 800100 add byte ptr [rcx], 0 -;; 1253b: aa stosb byte ptr [rdi], al -;; 1253c: 800100 add byte ptr [rcx], 0 -;; 1253f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12548: 800100 add byte ptr [rcx], 0 -;; 1254b: aa stosb byte ptr [rdi], al -;; 1254c: 800100 add byte ptr [rcx], 0 -;; 1254f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12558: 800100 add byte ptr [rcx], 0 -;; 1255b: aa stosb byte ptr [rdi], al -;; 1255c: 800100 add byte ptr [rcx], 0 -;; 1255f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12568: 800100 add byte ptr [rcx], 0 -;; 1256b: aa stosb byte ptr [rdi], al -;; 1256c: 800100 add byte ptr [rcx], 0 -;; 1256f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12578: 800100 add byte ptr [rcx], 0 -;; 1257b: aa stosb byte ptr [rdi], al -;; 1257c: 800100 add byte ptr [rcx], 0 -;; 1257f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12588: 800100 add byte ptr [rcx], 0 -;; 1258b: aa stosb byte ptr [rdi], al -;; 1258c: 800100 add byte ptr [rcx], 0 -;; 1258f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12598: 800100 add byte ptr [rcx], 0 -;; 1259b: aa stosb byte ptr [rdi], al -;; 1259c: 800100 add byte ptr [rcx], 0 -;; 1259f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 125a8: 800100 add byte ptr [rcx], 0 -;; 125ab: aa stosb byte ptr [rdi], al -;; 125ac: 800100 add byte ptr [rcx], 0 -;; 125af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 125b8: 800100 add byte ptr [rcx], 0 -;; 125bb: aa stosb byte ptr [rdi], al -;; 125bc: 800100 add byte ptr [rcx], 0 -;; 125bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 125c8: 800100 add byte ptr [rcx], 0 -;; 125cb: aa stosb byte ptr [rdi], al -;; 125cc: 800100 add byte ptr [rcx], 0 -;; 125cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 125d8: 800100 add byte ptr [rcx], 0 -;; 125db: aa stosb byte ptr [rdi], al -;; 125dc: 800100 add byte ptr [rcx], 0 -;; 125df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 125e8: 800100 add byte ptr [rcx], 0 -;; 125eb: aa stosb byte ptr [rdi], al -;; 125ec: 800100 add byte ptr [rcx], 0 -;; 125ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 125f8: 800100 add byte ptr [rcx], 0 -;; 125fb: aa stosb byte ptr [rdi], al -;; 125fc: 800100 add byte ptr [rcx], 0 -;; 125ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12608: 800100 add byte ptr [rcx], 0 -;; 1260b: aa stosb byte ptr [rdi], al -;; 1260c: 800100 add byte ptr [rcx], 0 -;; 1260f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12618: 800100 add byte ptr [rcx], 0 -;; 1261b: aa stosb byte ptr [rdi], al -;; 1261c: 800100 add byte ptr [rcx], 0 -;; 1261f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12628: 800100 add byte ptr [rcx], 0 -;; 1262b: aa stosb byte ptr [rdi], al -;; 1262c: 800100 add byte ptr [rcx], 0 -;; 1262f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12638: 800100 add byte ptr [rcx], 0 -;; 1263b: aa stosb byte ptr [rdi], al -;; 1263c: 800100 add byte ptr [rcx], 0 -;; 1263f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12648: 800100 add byte ptr [rcx], 0 -;; 1264b: aa stosb byte ptr [rdi], al -;; 1264c: 800100 add byte ptr [rcx], 0 -;; 1264f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12658: 800100 add byte ptr [rcx], 0 -;; 1265b: aa stosb byte ptr [rdi], al -;; 1265c: 800100 add byte ptr [rcx], 0 -;; 1265f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12668: 800100 add byte ptr [rcx], 0 -;; 1266b: aa stosb byte ptr [rdi], al -;; 1266c: 800100 add byte ptr [rcx], 0 -;; 1266f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12678: 800100 add byte ptr [rcx], 0 -;; 1267b: aa stosb byte ptr [rdi], al -;; 1267c: 800100 add byte ptr [rcx], 0 -;; 1267f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12688: 800100 add byte ptr [rcx], 0 -;; 1268b: aa stosb byte ptr [rdi], al -;; 1268c: 800100 add byte ptr [rcx], 0 -;; 1268f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12698: 800100 add byte ptr [rcx], 0 -;; 1269b: aa stosb byte ptr [rdi], al -;; 1269c: 800100 add byte ptr [rcx], 0 -;; 1269f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 126a8: 800100 add byte ptr [rcx], 0 -;; 126ab: aa stosb byte ptr [rdi], al -;; 126ac: 800100 add byte ptr [rcx], 0 -;; 126af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 126b8: 800100 add byte ptr [rcx], 0 -;; 126bb: aa stosb byte ptr [rdi], al -;; 126bc: 800100 add byte ptr [rcx], 0 -;; 126bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 126c8: 800100 add byte ptr [rcx], 0 -;; 126cb: aa stosb byte ptr [rdi], al -;; 126cc: 800100 add byte ptr [rcx], 0 -;; 126cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 126d8: 800100 add byte ptr [rcx], 0 -;; 126db: aa stosb byte ptr [rdi], al -;; 126dc: 800100 add byte ptr [rcx], 0 -;; 126df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 126e8: 800100 add byte ptr [rcx], 0 -;; 126eb: aa stosb byte ptr [rdi], al -;; 126ec: 800100 add byte ptr [rcx], 0 -;; 126ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 126f8: 800100 add byte ptr [rcx], 0 -;; 126fb: aa stosb byte ptr [rdi], al -;; 126fc: 800100 add byte ptr [rcx], 0 -;; 126ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12708: 800100 add byte ptr [rcx], 0 -;; 1270b: aa stosb byte ptr [rdi], al -;; 1270c: 800100 add byte ptr [rcx], 0 -;; 1270f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12718: 800100 add byte ptr [rcx], 0 -;; 1271b: aa stosb byte ptr [rdi], al -;; 1271c: 800100 add byte ptr [rcx], 0 -;; 1271f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12728: 800100 add byte ptr [rcx], 0 -;; 1272b: aa stosb byte ptr [rdi], al -;; 1272c: 800100 add byte ptr [rcx], 0 -;; 1272f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12738: 800100 add byte ptr [rcx], 0 -;; 1273b: aa stosb byte ptr [rdi], al -;; 1273c: 800100 add byte ptr [rcx], 0 -;; 1273f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12748: 800100 add byte ptr [rcx], 0 -;; 1274b: aa stosb byte ptr [rdi], al -;; 1274c: 800100 add byte ptr [rcx], 0 -;; 1274f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12758: 800100 add byte ptr [rcx], 0 -;; 1275b: aa stosb byte ptr [rdi], al -;; 1275c: 800100 add byte ptr [rcx], 0 -;; 1275f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12768: 800100 add byte ptr [rcx], 0 -;; 1276b: aa stosb byte ptr [rdi], al -;; 1276c: 800100 add byte ptr [rcx], 0 -;; 1276f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12778: 800100 add byte ptr [rcx], 0 -;; 1277b: aa stosb byte ptr [rdi], al -;; 1277c: 800100 add byte ptr [rcx], 0 -;; 1277f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12788: 800100 add byte ptr [rcx], 0 -;; 1278b: aa stosb byte ptr [rdi], al -;; 1278c: 800100 add byte ptr [rcx], 0 -;; 1278f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12798: 800100 add byte ptr [rcx], 0 -;; 1279b: aa stosb byte ptr [rdi], al -;; 1279c: 800100 add byte ptr [rcx], 0 -;; 1279f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 127a8: 800100 add byte ptr [rcx], 0 -;; 127ab: aa stosb byte ptr [rdi], al -;; 127ac: 800100 add byte ptr [rcx], 0 -;; 127af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 127b8: 800100 add byte ptr [rcx], 0 -;; 127bb: aa stosb byte ptr [rdi], al -;; 127bc: 800100 add byte ptr [rcx], 0 -;; 127bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 127c8: 800100 add byte ptr [rcx], 0 -;; 127cb: aa stosb byte ptr [rdi], al -;; 127cc: 800100 add byte ptr [rcx], 0 -;; 127cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 127d8: 800100 add byte ptr [rcx], 0 -;; 127db: aa stosb byte ptr [rdi], al -;; 127dc: 800100 add byte ptr [rcx], 0 -;; 127df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 127e8: 800100 add byte ptr [rcx], 0 -;; 127eb: aa stosb byte ptr [rdi], al -;; 127ec: 800100 add byte ptr [rcx], 0 -;; 127ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 127f8: 800100 add byte ptr [rcx], 0 -;; 127fb: aa stosb byte ptr [rdi], al -;; 127fc: 800100 add byte ptr [rcx], 0 -;; 127ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12808: 800100 add byte ptr [rcx], 0 -;; 1280b: aa stosb byte ptr [rdi], al -;; 1280c: 800100 add byte ptr [rcx], 0 -;; 1280f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12818: 800100 add byte ptr [rcx], 0 -;; 1281b: aa stosb byte ptr [rdi], al -;; 1281c: 800100 add byte ptr [rcx], 0 -;; 1281f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12828: 800100 add byte ptr [rcx], 0 -;; 1282b: aa stosb byte ptr [rdi], al -;; 1282c: 800100 add byte ptr [rcx], 0 -;; 1282f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12838: 800100 add byte ptr [rcx], 0 -;; 1283b: aa stosb byte ptr [rdi], al -;; 1283c: 800100 add byte ptr [rcx], 0 -;; 1283f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12848: 800100 add byte ptr [rcx], 0 -;; 1284b: aa stosb byte ptr [rdi], al -;; 1284c: 800100 add byte ptr [rcx], 0 -;; 1284f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12858: 800100 add byte ptr [rcx], 0 -;; 1285b: aa stosb byte ptr [rdi], al -;; 1285c: 800100 add byte ptr [rcx], 0 -;; 1285f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12868: 800100 add byte ptr [rcx], 0 -;; 1286b: aa stosb byte ptr [rdi], al -;; 1286c: 800100 add byte ptr [rcx], 0 -;; 1286f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12878: 800100 add byte ptr [rcx], 0 -;; 1287b: aa stosb byte ptr [rdi], al -;; 1287c: 800100 add byte ptr [rcx], 0 -;; 1287f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12888: 800100 add byte ptr [rcx], 0 -;; 1288b: aa stosb byte ptr [rdi], al -;; 1288c: 800100 add byte ptr [rcx], 0 -;; 1288f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12898: 800100 add byte ptr [rcx], 0 -;; 1289b: aa stosb byte ptr [rdi], al -;; 1289c: 800100 add byte ptr [rcx], 0 -;; 1289f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 128a8: 800100 add byte ptr [rcx], 0 -;; 128ab: aa stosb byte ptr [rdi], al -;; 128ac: 800100 add byte ptr [rcx], 0 -;; 128af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 128b8: 800100 add byte ptr [rcx], 0 -;; 128bb: aa stosb byte ptr [rdi], al -;; 128bc: 800100 add byte ptr [rcx], 0 -;; 128bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 128c8: 800100 add byte ptr [rcx], 0 -;; 128cb: aa stosb byte ptr [rdi], al -;; 128cc: 800100 add byte ptr [rcx], 0 -;; 128cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 128d8: 800100 add byte ptr [rcx], 0 -;; 128db: aa stosb byte ptr [rdi], al -;; 128dc: 800100 add byte ptr [rcx], 0 -;; 128df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 128e8: 800100 add byte ptr [rcx], 0 -;; 128eb: aa stosb byte ptr [rdi], al -;; 128ec: 800100 add byte ptr [rcx], 0 -;; 128ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 128f8: 800100 add byte ptr [rcx], 0 -;; 128fb: aa stosb byte ptr [rdi], al -;; 128fc: 800100 add byte ptr [rcx], 0 -;; 128ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12908: 800100 add byte ptr [rcx], 0 -;; 1290b: aa stosb byte ptr [rdi], al -;; 1290c: 800100 add byte ptr [rcx], 0 -;; 1290f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12918: 800100 add byte ptr [rcx], 0 -;; 1291b: aa stosb byte ptr [rdi], al -;; 1291c: 800100 add byte ptr [rcx], 0 -;; 1291f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12928: 800100 add byte ptr [rcx], 0 -;; 1292b: aa stosb byte ptr [rdi], al -;; 1292c: 800100 add byte ptr [rcx], 0 -;; 1292f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12938: 800100 add byte ptr [rcx], 0 -;; 1293b: aa stosb byte ptr [rdi], al -;; 1293c: 800100 add byte ptr [rcx], 0 -;; 1293f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12948: 800100 add byte ptr [rcx], 0 -;; 1294b: aa stosb byte ptr [rdi], al -;; 1294c: 800100 add byte ptr [rcx], 0 -;; 1294f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12958: 800100 add byte ptr [rcx], 0 -;; 1295b: aa stosb byte ptr [rdi], al -;; 1295c: 800100 add byte ptr [rcx], 0 -;; 1295f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12968: 800100 add byte ptr [rcx], 0 -;; 1296b: aa stosb byte ptr [rdi], al -;; 1296c: 800100 add byte ptr [rcx], 0 -;; 1296f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12978: 800100 add byte ptr [rcx], 0 -;; 1297b: aa stosb byte ptr [rdi], al -;; 1297c: 800100 add byte ptr [rcx], 0 -;; 1297f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12988: 800100 add byte ptr [rcx], 0 -;; 1298b: aa stosb byte ptr [rdi], al -;; 1298c: 800100 add byte ptr [rcx], 0 -;; 1298f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12998: 800100 add byte ptr [rcx], 0 -;; 1299b: aa stosb byte ptr [rdi], al -;; 1299c: 800100 add byte ptr [rcx], 0 -;; 1299f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 129a8: 800100 add byte ptr [rcx], 0 -;; 129ab: aa stosb byte ptr [rdi], al -;; 129ac: 800100 add byte ptr [rcx], 0 -;; 129af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 129b8: 800100 add byte ptr [rcx], 0 -;; 129bb: aa stosb byte ptr [rdi], al -;; 129bc: 800100 add byte ptr [rcx], 0 -;; 129bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 129c8: 800100 add byte ptr [rcx], 0 -;; 129cb: aa stosb byte ptr [rdi], al -;; 129cc: 800100 add byte ptr [rcx], 0 -;; 129cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 129d8: 800100 add byte ptr [rcx], 0 -;; 129db: aa stosb byte ptr [rdi], al -;; 129dc: 800100 add byte ptr [rcx], 0 -;; 129df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 129e8: 800100 add byte ptr [rcx], 0 -;; 129eb: aa stosb byte ptr [rdi], al -;; 129ec: 800100 add byte ptr [rcx], 0 -;; 129ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 129f8: 800100 add byte ptr [rcx], 0 -;; 129fb: aa stosb byte ptr [rdi], al -;; 129fc: 800100 add byte ptr [rcx], 0 -;; 129ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12a08: 800100 add byte ptr [rcx], 0 -;; 12a0b: aa stosb byte ptr [rdi], al -;; 12a0c: 800100 add byte ptr [rcx], 0 -;; 12a0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12a18: 800100 add byte ptr [rcx], 0 -;; 12a1b: aa stosb byte ptr [rdi], al -;; 12a1c: 800100 add byte ptr [rcx], 0 -;; 12a1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12a28: 800100 add byte ptr [rcx], 0 -;; 12a2b: aa stosb byte ptr [rdi], al -;; 12a2c: 800100 add byte ptr [rcx], 0 -;; 12a2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12a38: 800100 add byte ptr [rcx], 0 -;; 12a3b: aa stosb byte ptr [rdi], al -;; 12a3c: 800100 add byte ptr [rcx], 0 -;; 12a3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12a48: 800100 add byte ptr [rcx], 0 -;; 12a4b: aa stosb byte ptr [rdi], al -;; 12a4c: 800100 add byte ptr [rcx], 0 -;; 12a4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12a58: 800100 add byte ptr [rcx], 0 -;; 12a5b: aa stosb byte ptr [rdi], al -;; 12a5c: 800100 add byte ptr [rcx], 0 -;; 12a5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12a68: 800100 add byte ptr [rcx], 0 -;; 12a6b: aa stosb byte ptr [rdi], al -;; 12a6c: 800100 add byte ptr [rcx], 0 -;; 12a6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12a78: 800100 add byte ptr [rcx], 0 -;; 12a7b: aa stosb byte ptr [rdi], al -;; 12a7c: 800100 add byte ptr [rcx], 0 -;; 12a7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12a88: 800100 add byte ptr [rcx], 0 -;; 12a8b: aa stosb byte ptr [rdi], al -;; 12a8c: 800100 add byte ptr [rcx], 0 -;; 12a8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12a98: 800100 add byte ptr [rcx], 0 -;; 12a9b: aa stosb byte ptr [rdi], al -;; 12a9c: 800100 add byte ptr [rcx], 0 -;; 12a9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12aa8: 800100 add byte ptr [rcx], 0 -;; 12aab: aa stosb byte ptr [rdi], al -;; 12aac: 800100 add byte ptr [rcx], 0 -;; 12aaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12ab8: 800100 add byte ptr [rcx], 0 -;; 12abb: aa stosb byte ptr [rdi], al -;; 12abc: 800100 add byte ptr [rcx], 0 -;; 12abf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12ac8: 800100 add byte ptr [rcx], 0 -;; 12acb: aa stosb byte ptr [rdi], al -;; 12acc: 800100 add byte ptr [rcx], 0 -;; 12acf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12ad8: 800100 add byte ptr [rcx], 0 -;; 12adb: aa stosb byte ptr [rdi], al -;; 12adc: 800100 add byte ptr [rcx], 0 -;; 12adf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12ae8: 800100 add byte ptr [rcx], 0 -;; 12aeb: aa stosb byte ptr [rdi], al -;; 12aec: 800100 add byte ptr [rcx], 0 -;; 12aef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12af8: 800100 add byte ptr [rcx], 0 -;; 12afb: aa stosb byte ptr [rdi], al -;; 12afc: 800100 add byte ptr [rcx], 0 -;; 12aff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12b08: 800100 add byte ptr [rcx], 0 -;; 12b0b: aa stosb byte ptr [rdi], al -;; 12b0c: 800100 add byte ptr [rcx], 0 -;; 12b0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12b18: 800100 add byte ptr [rcx], 0 -;; 12b1b: aa stosb byte ptr [rdi], al -;; 12b1c: 800100 add byte ptr [rcx], 0 -;; 12b1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12b28: 800100 add byte ptr [rcx], 0 -;; 12b2b: aa stosb byte ptr [rdi], al -;; 12b2c: 800100 add byte ptr [rcx], 0 -;; 12b2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12b38: 800100 add byte ptr [rcx], 0 -;; 12b3b: aa stosb byte ptr [rdi], al -;; 12b3c: 800100 add byte ptr [rcx], 0 -;; 12b3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12b48: 800100 add byte ptr [rcx], 0 -;; 12b4b: aa stosb byte ptr [rdi], al -;; 12b4c: 800100 add byte ptr [rcx], 0 -;; 12b4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12b58: 800100 add byte ptr [rcx], 0 -;; 12b5b: aa stosb byte ptr [rdi], al -;; 12b5c: 800100 add byte ptr [rcx], 0 -;; 12b5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12b68: 800100 add byte ptr [rcx], 0 -;; 12b6b: aa stosb byte ptr [rdi], al -;; 12b6c: 800100 add byte ptr [rcx], 0 -;; 12b6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12b78: 800100 add byte ptr [rcx], 0 -;; 12b7b: aa stosb byte ptr [rdi], al -;; 12b7c: 800100 add byte ptr [rcx], 0 -;; 12b7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12b88: 800100 add byte ptr [rcx], 0 -;; 12b8b: aa stosb byte ptr [rdi], al -;; 12b8c: 800100 add byte ptr [rcx], 0 -;; 12b8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12b98: 800100 add byte ptr [rcx], 0 -;; 12b9b: aa stosb byte ptr [rdi], al -;; 12b9c: 800100 add byte ptr [rcx], 0 -;; 12b9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12ba8: 800100 add byte ptr [rcx], 0 -;; 12bab: aa stosb byte ptr [rdi], al -;; 12bac: 800100 add byte ptr [rcx], 0 -;; 12baf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12bb8: 800100 add byte ptr [rcx], 0 -;; 12bbb: aa stosb byte ptr [rdi], al -;; 12bbc: 800100 add byte ptr [rcx], 0 -;; 12bbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12bc8: 800100 add byte ptr [rcx], 0 -;; 12bcb: aa stosb byte ptr [rdi], al -;; 12bcc: 800100 add byte ptr [rcx], 0 -;; 12bcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12bd8: 800100 add byte ptr [rcx], 0 -;; 12bdb: aa stosb byte ptr [rdi], al -;; 12bdc: 800100 add byte ptr [rcx], 0 -;; 12bdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12be8: 800100 add byte ptr [rcx], 0 -;; 12beb: aa stosb byte ptr [rdi], al -;; 12bec: 800100 add byte ptr [rcx], 0 -;; 12bef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12bf8: 800100 add byte ptr [rcx], 0 -;; 12bfb: aa stosb byte ptr [rdi], al -;; 12bfc: 800100 add byte ptr [rcx], 0 -;; 12bff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12c08: 800100 add byte ptr [rcx], 0 -;; 12c0b: aa stosb byte ptr [rdi], al -;; 12c0c: 800100 add byte ptr [rcx], 0 -;; 12c0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12c18: 800100 add byte ptr [rcx], 0 -;; 12c1b: aa stosb byte ptr [rdi], al -;; 12c1c: 800100 add byte ptr [rcx], 0 -;; 12c1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12c28: 800100 add byte ptr [rcx], 0 -;; 12c2b: aa stosb byte ptr [rdi], al -;; 12c2c: 800100 add byte ptr [rcx], 0 -;; 12c2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12c38: 800100 add byte ptr [rcx], 0 -;; 12c3b: aa stosb byte ptr [rdi], al -;; 12c3c: 800100 add byte ptr [rcx], 0 -;; 12c3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12c48: 800100 add byte ptr [rcx], 0 -;; 12c4b: aa stosb byte ptr [rdi], al -;; 12c4c: 800100 add byte ptr [rcx], 0 -;; 12c4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12c58: 800100 add byte ptr [rcx], 0 -;; 12c5b: aa stosb byte ptr [rdi], al -;; 12c5c: 800100 add byte ptr [rcx], 0 -;; 12c5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12c68: 800100 add byte ptr [rcx], 0 -;; 12c6b: aa stosb byte ptr [rdi], al -;; 12c6c: 800100 add byte ptr [rcx], 0 -;; 12c6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12c78: 800100 add byte ptr [rcx], 0 -;; 12c7b: aa stosb byte ptr [rdi], al -;; 12c7c: 800100 add byte ptr [rcx], 0 -;; 12c7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12c88: 800100 add byte ptr [rcx], 0 -;; 12c8b: aa stosb byte ptr [rdi], al -;; 12c8c: 800100 add byte ptr [rcx], 0 -;; 12c8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12c98: 800100 add byte ptr [rcx], 0 -;; 12c9b: aa stosb byte ptr [rdi], al -;; 12c9c: 800100 add byte ptr [rcx], 0 -;; 12c9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12ca8: 800100 add byte ptr [rcx], 0 -;; 12cab: aa stosb byte ptr [rdi], al -;; 12cac: 800100 add byte ptr [rcx], 0 -;; 12caf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12cb8: 800100 add byte ptr [rcx], 0 -;; 12cbb: aa stosb byte ptr [rdi], al -;; 12cbc: 800100 add byte ptr [rcx], 0 -;; 12cbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12cc8: 800100 add byte ptr [rcx], 0 -;; 12ccb: aa stosb byte ptr [rdi], al -;; 12ccc: 800100 add byte ptr [rcx], 0 -;; 12ccf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12cd8: 800100 add byte ptr [rcx], 0 -;; 12cdb: aa stosb byte ptr [rdi], al -;; 12cdc: 800100 add byte ptr [rcx], 0 -;; 12cdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12ce8: 800100 add byte ptr [rcx], 0 -;; 12ceb: aa stosb byte ptr [rdi], al -;; 12cec: 800100 add byte ptr [rcx], 0 -;; 12cef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12cf8: 800100 add byte ptr [rcx], 0 -;; 12cfb: aa stosb byte ptr [rdi], al -;; 12cfc: 800100 add byte ptr [rcx], 0 -;; 12cff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12d08: 800100 add byte ptr [rcx], 0 -;; 12d0b: aa stosb byte ptr [rdi], al -;; 12d0c: 800100 add byte ptr [rcx], 0 -;; 12d0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12d18: 800100 add byte ptr [rcx], 0 -;; 12d1b: aa stosb byte ptr [rdi], al -;; 12d1c: 800100 add byte ptr [rcx], 0 -;; 12d1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12d28: 800100 add byte ptr [rcx], 0 -;; 12d2b: aa stosb byte ptr [rdi], al -;; 12d2c: 800100 add byte ptr [rcx], 0 -;; 12d2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12d38: 800100 add byte ptr [rcx], 0 -;; 12d3b: aa stosb byte ptr [rdi], al -;; 12d3c: 800100 add byte ptr [rcx], 0 -;; 12d3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12d48: 800100 add byte ptr [rcx], 0 -;; 12d4b: aa stosb byte ptr [rdi], al -;; 12d4c: 800100 add byte ptr [rcx], 0 -;; 12d4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12d58: 800100 add byte ptr [rcx], 0 -;; 12d5b: aa stosb byte ptr [rdi], al -;; 12d5c: 800100 add byte ptr [rcx], 0 -;; 12d5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12d68: 800100 add byte ptr [rcx], 0 -;; 12d6b: aa stosb byte ptr [rdi], al -;; 12d6c: 800100 add byte ptr [rcx], 0 -;; 12d6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12d78: 800100 add byte ptr [rcx], 0 -;; 12d7b: aa stosb byte ptr [rdi], al -;; 12d7c: 800100 add byte ptr [rcx], 0 -;; 12d7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12d88: 800100 add byte ptr [rcx], 0 -;; 12d8b: aa stosb byte ptr [rdi], al -;; 12d8c: 800100 add byte ptr [rcx], 0 -;; 12d8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12d98: 800100 add byte ptr [rcx], 0 -;; 12d9b: aa stosb byte ptr [rdi], al -;; 12d9c: 800100 add byte ptr [rcx], 0 -;; 12d9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12da8: 800100 add byte ptr [rcx], 0 -;; 12dab: aa stosb byte ptr [rdi], al -;; 12dac: 800100 add byte ptr [rcx], 0 -;; 12daf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12db8: 800100 add byte ptr [rcx], 0 -;; 12dbb: aa stosb byte ptr [rdi], al -;; 12dbc: 800100 add byte ptr [rcx], 0 -;; 12dbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12dc8: 800100 add byte ptr [rcx], 0 -;; 12dcb: aa stosb byte ptr [rdi], al -;; 12dcc: 800100 add byte ptr [rcx], 0 -;; 12dcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12dd8: 800100 add byte ptr [rcx], 0 -;; 12ddb: aa stosb byte ptr [rdi], al -;; 12ddc: 800100 add byte ptr [rcx], 0 -;; 12ddf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12de8: 800100 add byte ptr [rcx], 0 -;; 12deb: aa stosb byte ptr [rdi], al -;; 12dec: 800100 add byte ptr [rcx], 0 -;; 12def: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12df8: 800100 add byte ptr [rcx], 0 -;; 12dfb: aa stosb byte ptr [rdi], al -;; 12dfc: 800100 add byte ptr [rcx], 0 -;; 12dff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12e08: 800100 add byte ptr [rcx], 0 -;; 12e0b: aa stosb byte ptr [rdi], al -;; 12e0c: 800100 add byte ptr [rcx], 0 -;; 12e0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12e18: 800100 add byte ptr [rcx], 0 -;; 12e1b: aa stosb byte ptr [rdi], al -;; 12e1c: 800100 add byte ptr [rcx], 0 -;; 12e1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12e28: 800100 add byte ptr [rcx], 0 -;; 12e2b: aa stosb byte ptr [rdi], al -;; 12e2c: 800100 add byte ptr [rcx], 0 -;; 12e2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12e38: 800100 add byte ptr [rcx], 0 -;; 12e3b: aa stosb byte ptr [rdi], al -;; 12e3c: 800100 add byte ptr [rcx], 0 -;; 12e3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12e48: 800100 add byte ptr [rcx], 0 -;; 12e4b: aa stosb byte ptr [rdi], al -;; 12e4c: 800100 add byte ptr [rcx], 0 -;; 12e4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12e58: 800100 add byte ptr [rcx], 0 -;; 12e5b: aa stosb byte ptr [rdi], al -;; 12e5c: 800100 add byte ptr [rcx], 0 -;; 12e5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12e68: 800100 add byte ptr [rcx], 0 -;; 12e6b: aa stosb byte ptr [rdi], al -;; 12e6c: 800100 add byte ptr [rcx], 0 -;; 12e6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12e78: 800100 add byte ptr [rcx], 0 -;; 12e7b: aa stosb byte ptr [rdi], al -;; 12e7c: 800100 add byte ptr [rcx], 0 -;; 12e7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12e88: 800100 add byte ptr [rcx], 0 -;; 12e8b: aa stosb byte ptr [rdi], al -;; 12e8c: 800100 add byte ptr [rcx], 0 -;; 12e8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12e98: 800100 add byte ptr [rcx], 0 -;; 12e9b: aa stosb byte ptr [rdi], al -;; 12e9c: 800100 add byte ptr [rcx], 0 -;; 12e9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12ea8: 800100 add byte ptr [rcx], 0 -;; 12eab: aa stosb byte ptr [rdi], al -;; 12eac: 800100 add byte ptr [rcx], 0 -;; 12eaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12eb8: 800100 add byte ptr [rcx], 0 -;; 12ebb: aa stosb byte ptr [rdi], al -;; 12ebc: 800100 add byte ptr [rcx], 0 -;; 12ebf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12ec8: 800100 add byte ptr [rcx], 0 -;; 12ecb: aa stosb byte ptr [rdi], al -;; 12ecc: 800100 add byte ptr [rcx], 0 -;; 12ecf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12ed8: 800100 add byte ptr [rcx], 0 -;; 12edb: aa stosb byte ptr [rdi], al -;; 12edc: 800100 add byte ptr [rcx], 0 -;; 12edf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12ee8: 800100 add byte ptr [rcx], 0 -;; 12eeb: aa stosb byte ptr [rdi], al -;; 12eec: 800100 add byte ptr [rcx], 0 -;; 12eef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12ef8: 800100 add byte ptr [rcx], 0 -;; 12efb: aa stosb byte ptr [rdi], al -;; 12efc: 800100 add byte ptr [rcx], 0 -;; 12eff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12f08: 800100 add byte ptr [rcx], 0 -;; 12f0b: aa stosb byte ptr [rdi], al -;; 12f0c: 800100 add byte ptr [rcx], 0 -;; 12f0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12f18: 800100 add byte ptr [rcx], 0 -;; 12f1b: aa stosb byte ptr [rdi], al -;; 12f1c: 800100 add byte ptr [rcx], 0 -;; 12f1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12f28: 800100 add byte ptr [rcx], 0 -;; 12f2b: aa stosb byte ptr [rdi], al -;; 12f2c: 800100 add byte ptr [rcx], 0 -;; 12f2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12f38: 800100 add byte ptr [rcx], 0 -;; 12f3b: aa stosb byte ptr [rdi], al -;; 12f3c: 800100 add byte ptr [rcx], 0 -;; 12f3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12f48: 800100 add byte ptr [rcx], 0 -;; 12f4b: aa stosb byte ptr [rdi], al -;; 12f4c: 800100 add byte ptr [rcx], 0 -;; 12f4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12f58: 800100 add byte ptr [rcx], 0 -;; 12f5b: aa stosb byte ptr [rdi], al -;; 12f5c: 800100 add byte ptr [rcx], 0 -;; 12f5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12f68: 800100 add byte ptr [rcx], 0 -;; 12f6b: aa stosb byte ptr [rdi], al -;; 12f6c: 800100 add byte ptr [rcx], 0 -;; 12f6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12f78: 800100 add byte ptr [rcx], 0 -;; 12f7b: aa stosb byte ptr [rdi], al -;; 12f7c: 800100 add byte ptr [rcx], 0 -;; 12f7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12f88: 800100 add byte ptr [rcx], 0 -;; 12f8b: aa stosb byte ptr [rdi], al -;; 12f8c: 800100 add byte ptr [rcx], 0 -;; 12f8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12f98: 800100 add byte ptr [rcx], 0 -;; 12f9b: aa stosb byte ptr [rdi], al -;; 12f9c: 800100 add byte ptr [rcx], 0 -;; 12f9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12fa8: 800100 add byte ptr [rcx], 0 -;; 12fab: aa stosb byte ptr [rdi], al -;; 12fac: 800100 add byte ptr [rcx], 0 -;; 12faf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12fb8: 800100 add byte ptr [rcx], 0 -;; 12fbb: aa stosb byte ptr [rdi], al -;; 12fbc: 800100 add byte ptr [rcx], 0 -;; 12fbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12fc8: 800100 add byte ptr [rcx], 0 -;; 12fcb: aa stosb byte ptr [rdi], al -;; 12fcc: 800100 add byte ptr [rcx], 0 -;; 12fcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12fd8: 800100 add byte ptr [rcx], 0 -;; 12fdb: aa stosb byte ptr [rdi], al -;; 12fdc: 800100 add byte ptr [rcx], 0 -;; 12fdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12fe8: 800100 add byte ptr [rcx], 0 -;; 12feb: aa stosb byte ptr [rdi], al -;; 12fec: 800100 add byte ptr [rcx], 0 -;; 12fef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 12ff8: 800100 add byte ptr [rcx], 0 -;; 12ffb: aa stosb byte ptr [rdi], al -;; 12ffc: 800100 add byte ptr [rcx], 0 -;; 12fff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13008: 800100 add byte ptr [rcx], 0 -;; 1300b: aa stosb byte ptr [rdi], al -;; 1300c: 800100 add byte ptr [rcx], 0 -;; 1300f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13018: 800100 add byte ptr [rcx], 0 -;; 1301b: aa stosb byte ptr [rdi], al -;; 1301c: 800100 add byte ptr [rcx], 0 -;; 1301f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13028: 800100 add byte ptr [rcx], 0 -;; 1302b: aa stosb byte ptr [rdi], al -;; 1302c: 800100 add byte ptr [rcx], 0 -;; 1302f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13038: 800100 add byte ptr [rcx], 0 -;; 1303b: aa stosb byte ptr [rdi], al -;; 1303c: 800100 add byte ptr [rcx], 0 -;; 1303f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13048: 800100 add byte ptr [rcx], 0 -;; 1304b: aa stosb byte ptr [rdi], al -;; 1304c: 800100 add byte ptr [rcx], 0 -;; 1304f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13058: 800100 add byte ptr [rcx], 0 -;; 1305b: aa stosb byte ptr [rdi], al -;; 1305c: 800100 add byte ptr [rcx], 0 -;; 1305f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13068: 800100 add byte ptr [rcx], 0 -;; 1306b: aa stosb byte ptr [rdi], al -;; 1306c: 800100 add byte ptr [rcx], 0 -;; 1306f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13078: 800100 add byte ptr [rcx], 0 -;; 1307b: aa stosb byte ptr [rdi], al -;; 1307c: 800100 add byte ptr [rcx], 0 -;; 1307f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13088: 800100 add byte ptr [rcx], 0 -;; 1308b: aa stosb byte ptr [rdi], al -;; 1308c: 800100 add byte ptr [rcx], 0 -;; 1308f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13098: 800100 add byte ptr [rcx], 0 -;; 1309b: aa stosb byte ptr [rdi], al -;; 1309c: 800100 add byte ptr [rcx], 0 -;; 1309f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 130a8: 800100 add byte ptr [rcx], 0 -;; 130ab: aa stosb byte ptr [rdi], al -;; 130ac: 800100 add byte ptr [rcx], 0 -;; 130af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 130b8: 800100 add byte ptr [rcx], 0 -;; 130bb: aa stosb byte ptr [rdi], al -;; 130bc: 800100 add byte ptr [rcx], 0 -;; 130bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 130c8: 800100 add byte ptr [rcx], 0 -;; 130cb: aa stosb byte ptr [rdi], al -;; 130cc: 800100 add byte ptr [rcx], 0 -;; 130cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 130d8: 800100 add byte ptr [rcx], 0 -;; 130db: aa stosb byte ptr [rdi], al -;; 130dc: 800100 add byte ptr [rcx], 0 -;; 130df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 130e8: 800100 add byte ptr [rcx], 0 -;; 130eb: aa stosb byte ptr [rdi], al -;; 130ec: 800100 add byte ptr [rcx], 0 -;; 130ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 130f8: 800100 add byte ptr [rcx], 0 -;; 130fb: aa stosb byte ptr [rdi], al -;; 130fc: 800100 add byte ptr [rcx], 0 -;; 130ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13108: 800100 add byte ptr [rcx], 0 -;; 1310b: aa stosb byte ptr [rdi], al -;; 1310c: 800100 add byte ptr [rcx], 0 -;; 1310f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13118: 800100 add byte ptr [rcx], 0 -;; 1311b: aa stosb byte ptr [rdi], al -;; 1311c: 800100 add byte ptr [rcx], 0 -;; 1311f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13128: 800100 add byte ptr [rcx], 0 -;; 1312b: aa stosb byte ptr [rdi], al -;; 1312c: 800100 add byte ptr [rcx], 0 -;; 1312f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13138: 800100 add byte ptr [rcx], 0 -;; 1313b: aa stosb byte ptr [rdi], al -;; 1313c: 800100 add byte ptr [rcx], 0 -;; 1313f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13148: 800100 add byte ptr [rcx], 0 -;; 1314b: aa stosb byte ptr [rdi], al -;; 1314c: 800100 add byte ptr [rcx], 0 -;; 1314f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13158: 800100 add byte ptr [rcx], 0 -;; 1315b: aa stosb byte ptr [rdi], al -;; 1315c: 800100 add byte ptr [rcx], 0 -;; 1315f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13168: 800100 add byte ptr [rcx], 0 -;; 1316b: aa stosb byte ptr [rdi], al -;; 1316c: 800100 add byte ptr [rcx], 0 -;; 1316f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13178: 800100 add byte ptr [rcx], 0 -;; 1317b: aa stosb byte ptr [rdi], al -;; 1317c: 800100 add byte ptr [rcx], 0 -;; 1317f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13188: 800100 add byte ptr [rcx], 0 -;; 1318b: aa stosb byte ptr [rdi], al -;; 1318c: 800100 add byte ptr [rcx], 0 -;; 1318f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13198: 800100 add byte ptr [rcx], 0 -;; 1319b: aa stosb byte ptr [rdi], al -;; 1319c: 800100 add byte ptr [rcx], 0 -;; 1319f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 131a8: 800100 add byte ptr [rcx], 0 -;; 131ab: aa stosb byte ptr [rdi], al -;; 131ac: 800100 add byte ptr [rcx], 0 -;; 131af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 131b8: 800100 add byte ptr [rcx], 0 -;; 131bb: aa stosb byte ptr [rdi], al -;; 131bc: 800100 add byte ptr [rcx], 0 -;; 131bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 131c8: 800100 add byte ptr [rcx], 0 -;; 131cb: aa stosb byte ptr [rdi], al -;; 131cc: 800100 add byte ptr [rcx], 0 -;; 131cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 131d8: 800100 add byte ptr [rcx], 0 -;; 131db: aa stosb byte ptr [rdi], al -;; 131dc: 800100 add byte ptr [rcx], 0 -;; 131df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 131e8: 800100 add byte ptr [rcx], 0 -;; 131eb: aa stosb byte ptr [rdi], al -;; 131ec: 800100 add byte ptr [rcx], 0 -;; 131ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 131f8: 800100 add byte ptr [rcx], 0 -;; 131fb: aa stosb byte ptr [rdi], al -;; 131fc: 800100 add byte ptr [rcx], 0 -;; 131ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13208: 800100 add byte ptr [rcx], 0 -;; 1320b: aa stosb byte ptr [rdi], al -;; 1320c: 800100 add byte ptr [rcx], 0 -;; 1320f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13218: 800100 add byte ptr [rcx], 0 -;; 1321b: aa stosb byte ptr [rdi], al -;; 1321c: 800100 add byte ptr [rcx], 0 -;; 1321f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13228: 800100 add byte ptr [rcx], 0 -;; 1322b: aa stosb byte ptr [rdi], al -;; 1322c: 800100 add byte ptr [rcx], 0 -;; 1322f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13238: 800100 add byte ptr [rcx], 0 -;; 1323b: aa stosb byte ptr [rdi], al -;; 1323c: 800100 add byte ptr [rcx], 0 -;; 1323f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13248: 800100 add byte ptr [rcx], 0 -;; 1324b: aa stosb byte ptr [rdi], al -;; 1324c: 800100 add byte ptr [rcx], 0 -;; 1324f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13258: 800100 add byte ptr [rcx], 0 -;; 1325b: aa stosb byte ptr [rdi], al -;; 1325c: 800100 add byte ptr [rcx], 0 -;; 1325f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13268: 800100 add byte ptr [rcx], 0 -;; 1326b: aa stosb byte ptr [rdi], al -;; 1326c: 800100 add byte ptr [rcx], 0 -;; 1326f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13278: 800100 add byte ptr [rcx], 0 -;; 1327b: aa stosb byte ptr [rdi], al -;; 1327c: 800100 add byte ptr [rcx], 0 -;; 1327f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13288: 800100 add byte ptr [rcx], 0 -;; 1328b: aa stosb byte ptr [rdi], al -;; 1328c: 800100 add byte ptr [rcx], 0 -;; 1328f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13298: 800100 add byte ptr [rcx], 0 -;; 1329b: aa stosb byte ptr [rdi], al -;; 1329c: 800100 add byte ptr [rcx], 0 -;; 1329f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 132a8: 800100 add byte ptr [rcx], 0 -;; 132ab: aa stosb byte ptr [rdi], al -;; 132ac: 800100 add byte ptr [rcx], 0 -;; 132af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 132b8: 800100 add byte ptr [rcx], 0 -;; 132bb: aa stosb byte ptr [rdi], al -;; 132bc: 800100 add byte ptr [rcx], 0 -;; 132bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 132c8: 800100 add byte ptr [rcx], 0 -;; 132cb: aa stosb byte ptr [rdi], al -;; 132cc: 800100 add byte ptr [rcx], 0 -;; 132cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 132d8: 800100 add byte ptr [rcx], 0 -;; 132db: aa stosb byte ptr [rdi], al -;; 132dc: 800100 add byte ptr [rcx], 0 -;; 132df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 132e8: 800100 add byte ptr [rcx], 0 -;; 132eb: aa stosb byte ptr [rdi], al -;; 132ec: 800100 add byte ptr [rcx], 0 -;; 132ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 132f8: 800100 add byte ptr [rcx], 0 -;; 132fb: aa stosb byte ptr [rdi], al -;; 132fc: 800100 add byte ptr [rcx], 0 -;; 132ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13308: 800100 add byte ptr [rcx], 0 -;; 1330b: aa stosb byte ptr [rdi], al -;; 1330c: 800100 add byte ptr [rcx], 0 -;; 1330f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13318: 800100 add byte ptr [rcx], 0 -;; 1331b: aa stosb byte ptr [rdi], al -;; 1331c: 800100 add byte ptr [rcx], 0 -;; 1331f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13328: 800100 add byte ptr [rcx], 0 -;; 1332b: aa stosb byte ptr [rdi], al -;; 1332c: 800100 add byte ptr [rcx], 0 -;; 1332f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13338: 800100 add byte ptr [rcx], 0 -;; 1333b: aa stosb byte ptr [rdi], al -;; 1333c: 800100 add byte ptr [rcx], 0 -;; 1333f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13348: 800100 add byte ptr [rcx], 0 -;; 1334b: aa stosb byte ptr [rdi], al -;; 1334c: 800100 add byte ptr [rcx], 0 -;; 1334f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13358: 800100 add byte ptr [rcx], 0 -;; 1335b: aa stosb byte ptr [rdi], al -;; 1335c: 800100 add byte ptr [rcx], 0 -;; 1335f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13368: 800100 add byte ptr [rcx], 0 -;; 1336b: aa stosb byte ptr [rdi], al -;; 1336c: 800100 add byte ptr [rcx], 0 -;; 1336f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13378: 800100 add byte ptr [rcx], 0 -;; 1337b: aa stosb byte ptr [rdi], al -;; 1337c: 800100 add byte ptr [rcx], 0 -;; 1337f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13388: 800100 add byte ptr [rcx], 0 -;; 1338b: aa stosb byte ptr [rdi], al -;; 1338c: 800100 add byte ptr [rcx], 0 -;; 1338f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13398: 800100 add byte ptr [rcx], 0 -;; 1339b: aa stosb byte ptr [rdi], al -;; 1339c: 800100 add byte ptr [rcx], 0 -;; 1339f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 133a8: 800100 add byte ptr [rcx], 0 -;; 133ab: aa stosb byte ptr [rdi], al -;; 133ac: 800100 add byte ptr [rcx], 0 -;; 133af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 133b8: 800100 add byte ptr [rcx], 0 -;; 133bb: aa stosb byte ptr [rdi], al -;; 133bc: 800100 add byte ptr [rcx], 0 -;; 133bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 133c8: 800100 add byte ptr [rcx], 0 -;; 133cb: aa stosb byte ptr [rdi], al -;; 133cc: 800100 add byte ptr [rcx], 0 -;; 133cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 133d8: 800100 add byte ptr [rcx], 0 -;; 133db: aa stosb byte ptr [rdi], al -;; 133dc: 800100 add byte ptr [rcx], 0 -;; 133df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 133e8: 800100 add byte ptr [rcx], 0 -;; 133eb: aa stosb byte ptr [rdi], al -;; 133ec: 800100 add byte ptr [rcx], 0 -;; 133ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 133f8: 800100 add byte ptr [rcx], 0 -;; 133fb: aa stosb byte ptr [rdi], al -;; 133fc: 800100 add byte ptr [rcx], 0 -;; 133ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13408: 800100 add byte ptr [rcx], 0 -;; 1340b: aa stosb byte ptr [rdi], al -;; 1340c: 800100 add byte ptr [rcx], 0 -;; 1340f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13418: 800100 add byte ptr [rcx], 0 -;; 1341b: aa stosb byte ptr [rdi], al -;; 1341c: 800100 add byte ptr [rcx], 0 -;; 1341f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13428: 800100 add byte ptr [rcx], 0 -;; 1342b: aa stosb byte ptr [rdi], al -;; 1342c: 800100 add byte ptr [rcx], 0 -;; 1342f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13438: 800100 add byte ptr [rcx], 0 -;; 1343b: aa stosb byte ptr [rdi], al -;; 1343c: 800100 add byte ptr [rcx], 0 -;; 1343f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13448: 800100 add byte ptr [rcx], 0 -;; 1344b: aa stosb byte ptr [rdi], al -;; 1344c: 800100 add byte ptr [rcx], 0 -;; 1344f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13458: 800100 add byte ptr [rcx], 0 -;; 1345b: aa stosb byte ptr [rdi], al -;; 1345c: 800100 add byte ptr [rcx], 0 -;; 1345f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13468: 800100 add byte ptr [rcx], 0 -;; 1346b: aa stosb byte ptr [rdi], al -;; 1346c: 800100 add byte ptr [rcx], 0 -;; 1346f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13478: 800100 add byte ptr [rcx], 0 -;; 1347b: aa stosb byte ptr [rdi], al -;; 1347c: 800100 add byte ptr [rcx], 0 -;; 1347f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13488: 800100 add byte ptr [rcx], 0 -;; 1348b: aa stosb byte ptr [rdi], al -;; 1348c: 800100 add byte ptr [rcx], 0 -;; 1348f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13498: 800100 add byte ptr [rcx], 0 -;; 1349b: aa stosb byte ptr [rdi], al -;; 1349c: 800100 add byte ptr [rcx], 0 -;; 1349f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 134a8: 800100 add byte ptr [rcx], 0 -;; 134ab: aa stosb byte ptr [rdi], al -;; 134ac: 800100 add byte ptr [rcx], 0 -;; 134af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 134b8: 800100 add byte ptr [rcx], 0 -;; 134bb: aa stosb byte ptr [rdi], al -;; 134bc: 800100 add byte ptr [rcx], 0 -;; 134bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 134c8: 800100 add byte ptr [rcx], 0 -;; 134cb: aa stosb byte ptr [rdi], al -;; 134cc: 800100 add byte ptr [rcx], 0 -;; 134cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 134d8: 800100 add byte ptr [rcx], 0 -;; 134db: aa stosb byte ptr [rdi], al -;; 134dc: 800100 add byte ptr [rcx], 0 -;; 134df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 134e8: 800100 add byte ptr [rcx], 0 -;; 134eb: aa stosb byte ptr [rdi], al -;; 134ec: 800100 add byte ptr [rcx], 0 -;; 134ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 134f8: 800100 add byte ptr [rcx], 0 -;; 134fb: aa stosb byte ptr [rdi], al -;; 134fc: 800100 add byte ptr [rcx], 0 -;; 134ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13508: 800100 add byte ptr [rcx], 0 -;; 1350b: aa stosb byte ptr [rdi], al -;; 1350c: 800100 add byte ptr [rcx], 0 -;; 1350f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13518: 800100 add byte ptr [rcx], 0 -;; 1351b: aa stosb byte ptr [rdi], al -;; 1351c: 800100 add byte ptr [rcx], 0 -;; 1351f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13528: 800100 add byte ptr [rcx], 0 -;; 1352b: aa stosb byte ptr [rdi], al -;; 1352c: 800100 add byte ptr [rcx], 0 -;; 1352f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13538: 800100 add byte ptr [rcx], 0 -;; 1353b: aa stosb byte ptr [rdi], al -;; 1353c: 800100 add byte ptr [rcx], 0 -;; 1353f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13548: 800100 add byte ptr [rcx], 0 -;; 1354b: aa stosb byte ptr [rdi], al -;; 1354c: 800100 add byte ptr [rcx], 0 -;; 1354f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13558: 800100 add byte ptr [rcx], 0 -;; 1355b: aa stosb byte ptr [rdi], al -;; 1355c: 800100 add byte ptr [rcx], 0 -;; 1355f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13568: 800100 add byte ptr [rcx], 0 -;; 1356b: aa stosb byte ptr [rdi], al -;; 1356c: 800100 add byte ptr [rcx], 0 -;; 1356f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13578: 800100 add byte ptr [rcx], 0 -;; 1357b: aa stosb byte ptr [rdi], al -;; 1357c: 800100 add byte ptr [rcx], 0 -;; 1357f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13588: 800100 add byte ptr [rcx], 0 -;; 1358b: aa stosb byte ptr [rdi], al -;; 1358c: 800100 add byte ptr [rcx], 0 -;; 1358f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13598: 800100 add byte ptr [rcx], 0 -;; 1359b: aa stosb byte ptr [rdi], al -;; 1359c: 800100 add byte ptr [rcx], 0 -;; 1359f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 135a8: 800100 add byte ptr [rcx], 0 -;; 135ab: aa stosb byte ptr [rdi], al -;; 135ac: 800100 add byte ptr [rcx], 0 -;; 135af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 135b8: 800100 add byte ptr [rcx], 0 -;; 135bb: aa stosb byte ptr [rdi], al -;; 135bc: 800100 add byte ptr [rcx], 0 -;; 135bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 135c8: 800100 add byte ptr [rcx], 0 -;; 135cb: aa stosb byte ptr [rdi], al -;; 135cc: 800100 add byte ptr [rcx], 0 -;; 135cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 135d8: 800100 add byte ptr [rcx], 0 -;; 135db: aa stosb byte ptr [rdi], al -;; 135dc: 800100 add byte ptr [rcx], 0 -;; 135df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 135e8: 800100 add byte ptr [rcx], 0 -;; 135eb: aa stosb byte ptr [rdi], al -;; 135ec: 800100 add byte ptr [rcx], 0 -;; 135ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 135f8: 800100 add byte ptr [rcx], 0 -;; 135fb: aa stosb byte ptr [rdi], al -;; 135fc: 800100 add byte ptr [rcx], 0 -;; 135ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13608: 800100 add byte ptr [rcx], 0 -;; 1360b: aa stosb byte ptr [rdi], al -;; 1360c: 800100 add byte ptr [rcx], 0 -;; 1360f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13618: 800100 add byte ptr [rcx], 0 -;; 1361b: aa stosb byte ptr [rdi], al -;; 1361c: 800100 add byte ptr [rcx], 0 -;; 1361f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13628: 800100 add byte ptr [rcx], 0 -;; 1362b: aa stosb byte ptr [rdi], al -;; 1362c: 800100 add byte ptr [rcx], 0 -;; 1362f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13638: 800100 add byte ptr [rcx], 0 -;; 1363b: aa stosb byte ptr [rdi], al -;; 1363c: 800100 add byte ptr [rcx], 0 -;; 1363f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13648: 800100 add byte ptr [rcx], 0 -;; 1364b: aa stosb byte ptr [rdi], al -;; 1364c: 800100 add byte ptr [rcx], 0 -;; 1364f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13658: 800100 add byte ptr [rcx], 0 -;; 1365b: aa stosb byte ptr [rdi], al -;; 1365c: 800100 add byte ptr [rcx], 0 -;; 1365f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13668: 800100 add byte ptr [rcx], 0 -;; 1366b: aa stosb byte ptr [rdi], al -;; 1366c: 800100 add byte ptr [rcx], 0 -;; 1366f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13678: 800100 add byte ptr [rcx], 0 -;; 1367b: aa stosb byte ptr [rdi], al -;; 1367c: 800100 add byte ptr [rcx], 0 -;; 1367f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13688: 800100 add byte ptr [rcx], 0 -;; 1368b: aa stosb byte ptr [rdi], al -;; 1368c: 800100 add byte ptr [rcx], 0 -;; 1368f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13698: 800100 add byte ptr [rcx], 0 -;; 1369b: aa stosb byte ptr [rdi], al -;; 1369c: 800100 add byte ptr [rcx], 0 -;; 1369f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 136a8: 800100 add byte ptr [rcx], 0 -;; 136ab: aa stosb byte ptr [rdi], al -;; 136ac: 800100 add byte ptr [rcx], 0 -;; 136af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 136b8: 800100 add byte ptr [rcx], 0 -;; 136bb: aa stosb byte ptr [rdi], al -;; 136bc: 800100 add byte ptr [rcx], 0 -;; 136bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 136c8: 800100 add byte ptr [rcx], 0 -;; 136cb: aa stosb byte ptr [rdi], al -;; 136cc: 800100 add byte ptr [rcx], 0 -;; 136cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 136d8: 800100 add byte ptr [rcx], 0 -;; 136db: aa stosb byte ptr [rdi], al -;; 136dc: 800100 add byte ptr [rcx], 0 -;; 136df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 136e8: 800100 add byte ptr [rcx], 0 -;; 136eb: aa stosb byte ptr [rdi], al -;; 136ec: 800100 add byte ptr [rcx], 0 -;; 136ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 136f8: 800100 add byte ptr [rcx], 0 -;; 136fb: aa stosb byte ptr [rdi], al -;; 136fc: 800100 add byte ptr [rcx], 0 -;; 136ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13708: 800100 add byte ptr [rcx], 0 -;; 1370b: aa stosb byte ptr [rdi], al -;; 1370c: 800100 add byte ptr [rcx], 0 -;; 1370f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13718: 800100 add byte ptr [rcx], 0 -;; 1371b: aa stosb byte ptr [rdi], al -;; 1371c: 800100 add byte ptr [rcx], 0 -;; 1371f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13728: 800100 add byte ptr [rcx], 0 -;; 1372b: aa stosb byte ptr [rdi], al -;; 1372c: 800100 add byte ptr [rcx], 0 -;; 1372f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13738: 800100 add byte ptr [rcx], 0 -;; 1373b: aa stosb byte ptr [rdi], al -;; 1373c: 800100 add byte ptr [rcx], 0 -;; 1373f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13748: 800100 add byte ptr [rcx], 0 -;; 1374b: aa stosb byte ptr [rdi], al -;; 1374c: 800100 add byte ptr [rcx], 0 -;; 1374f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13758: 800100 add byte ptr [rcx], 0 -;; 1375b: aa stosb byte ptr [rdi], al -;; 1375c: 800100 add byte ptr [rcx], 0 -;; 1375f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13768: 800100 add byte ptr [rcx], 0 -;; 1376b: aa stosb byte ptr [rdi], al -;; 1376c: 800100 add byte ptr [rcx], 0 -;; 1376f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13778: 800100 add byte ptr [rcx], 0 -;; 1377b: aa stosb byte ptr [rdi], al -;; 1377c: 800100 add byte ptr [rcx], 0 -;; 1377f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13788: 800100 add byte ptr [rcx], 0 -;; 1378b: aa stosb byte ptr [rdi], al -;; 1378c: 800100 add byte ptr [rcx], 0 -;; 1378f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13798: 800100 add byte ptr [rcx], 0 -;; 1379b: aa stosb byte ptr [rdi], al -;; 1379c: 800100 add byte ptr [rcx], 0 -;; 1379f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 137a8: 800100 add byte ptr [rcx], 0 -;; 137ab: aa stosb byte ptr [rdi], al -;; 137ac: 800100 add byte ptr [rcx], 0 -;; 137af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 137b8: 800100 add byte ptr [rcx], 0 -;; 137bb: aa stosb byte ptr [rdi], al -;; 137bc: 800100 add byte ptr [rcx], 0 -;; 137bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 137c8: 800100 add byte ptr [rcx], 0 -;; 137cb: aa stosb byte ptr [rdi], al -;; 137cc: 800100 add byte ptr [rcx], 0 -;; 137cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 137d8: 800100 add byte ptr [rcx], 0 -;; 137db: aa stosb byte ptr [rdi], al -;; 137dc: 800100 add byte ptr [rcx], 0 -;; 137df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 137e8: 800100 add byte ptr [rcx], 0 -;; 137eb: aa stosb byte ptr [rdi], al -;; 137ec: 800100 add byte ptr [rcx], 0 -;; 137ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 137f8: 800100 add byte ptr [rcx], 0 -;; 137fb: aa stosb byte ptr [rdi], al -;; 137fc: 800100 add byte ptr [rcx], 0 -;; 137ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13808: 800100 add byte ptr [rcx], 0 -;; 1380b: aa stosb byte ptr [rdi], al -;; 1380c: 800100 add byte ptr [rcx], 0 -;; 1380f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13818: 800100 add byte ptr [rcx], 0 -;; 1381b: aa stosb byte ptr [rdi], al -;; 1381c: 800100 add byte ptr [rcx], 0 -;; 1381f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13828: 800100 add byte ptr [rcx], 0 -;; 1382b: aa stosb byte ptr [rdi], al -;; 1382c: 800100 add byte ptr [rcx], 0 -;; 1382f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13838: 800100 add byte ptr [rcx], 0 -;; 1383b: aa stosb byte ptr [rdi], al -;; 1383c: 800100 add byte ptr [rcx], 0 -;; 1383f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13848: 800100 add byte ptr [rcx], 0 -;; 1384b: aa stosb byte ptr [rdi], al -;; 1384c: 800100 add byte ptr [rcx], 0 -;; 1384f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13858: 800100 add byte ptr [rcx], 0 -;; 1385b: aa stosb byte ptr [rdi], al -;; 1385c: 800100 add byte ptr [rcx], 0 -;; 1385f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13868: 800100 add byte ptr [rcx], 0 -;; 1386b: aa stosb byte ptr [rdi], al -;; 1386c: 800100 add byte ptr [rcx], 0 -;; 1386f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13878: 800100 add byte ptr [rcx], 0 -;; 1387b: aa stosb byte ptr [rdi], al -;; 1387c: 800100 add byte ptr [rcx], 0 -;; 1387f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13888: 800100 add byte ptr [rcx], 0 -;; 1388b: aa stosb byte ptr [rdi], al -;; 1388c: 800100 add byte ptr [rcx], 0 -;; 1388f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13898: 800100 add byte ptr [rcx], 0 -;; 1389b: aa stosb byte ptr [rdi], al -;; 1389c: 800100 add byte ptr [rcx], 0 -;; 1389f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 138a8: 800100 add byte ptr [rcx], 0 -;; 138ab: aa stosb byte ptr [rdi], al -;; 138ac: 800100 add byte ptr [rcx], 0 -;; 138af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 138b8: 800100 add byte ptr [rcx], 0 -;; 138bb: aa stosb byte ptr [rdi], al -;; 138bc: 800100 add byte ptr [rcx], 0 -;; 138bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 138c8: 800100 add byte ptr [rcx], 0 -;; 138cb: aa stosb byte ptr [rdi], al -;; 138cc: 800100 add byte ptr [rcx], 0 -;; 138cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 138d8: 800100 add byte ptr [rcx], 0 -;; 138db: aa stosb byte ptr [rdi], al -;; 138dc: 800100 add byte ptr [rcx], 0 -;; 138df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 138e8: 800100 add byte ptr [rcx], 0 -;; 138eb: aa stosb byte ptr [rdi], al -;; 138ec: 800100 add byte ptr [rcx], 0 -;; 138ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 138f8: 800100 add byte ptr [rcx], 0 -;; 138fb: aa stosb byte ptr [rdi], al -;; 138fc: 800100 add byte ptr [rcx], 0 -;; 138ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13908: 800100 add byte ptr [rcx], 0 -;; 1390b: aa stosb byte ptr [rdi], al -;; 1390c: 800100 add byte ptr [rcx], 0 -;; 1390f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13918: 800100 add byte ptr [rcx], 0 -;; 1391b: aa stosb byte ptr [rdi], al -;; 1391c: 800100 add byte ptr [rcx], 0 -;; 1391f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13928: 800100 add byte ptr [rcx], 0 -;; 1392b: aa stosb byte ptr [rdi], al -;; 1392c: 800100 add byte ptr [rcx], 0 -;; 1392f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13938: 800100 add byte ptr [rcx], 0 -;; 1393b: aa stosb byte ptr [rdi], al -;; 1393c: 800100 add byte ptr [rcx], 0 -;; 1393f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13948: 800100 add byte ptr [rcx], 0 -;; 1394b: aa stosb byte ptr [rdi], al -;; 1394c: 800100 add byte ptr [rcx], 0 -;; 1394f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13958: 800100 add byte ptr [rcx], 0 -;; 1395b: aa stosb byte ptr [rdi], al -;; 1395c: 800100 add byte ptr [rcx], 0 -;; 1395f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13968: 800100 add byte ptr [rcx], 0 -;; 1396b: aa stosb byte ptr [rdi], al -;; 1396c: 800100 add byte ptr [rcx], 0 -;; 1396f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13978: 800100 add byte ptr [rcx], 0 -;; 1397b: aa stosb byte ptr [rdi], al -;; 1397c: 800100 add byte ptr [rcx], 0 -;; 1397f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13988: 800100 add byte ptr [rcx], 0 -;; 1398b: aa stosb byte ptr [rdi], al -;; 1398c: 800100 add byte ptr [rcx], 0 -;; 1398f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13998: 800100 add byte ptr [rcx], 0 -;; 1399b: aa stosb byte ptr [rdi], al -;; 1399c: 800100 add byte ptr [rcx], 0 -;; 1399f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 139a8: 800100 add byte ptr [rcx], 0 -;; 139ab: aa stosb byte ptr [rdi], al -;; 139ac: 800100 add byte ptr [rcx], 0 -;; 139af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 139b8: 800100 add byte ptr [rcx], 0 -;; 139bb: aa stosb byte ptr [rdi], al -;; 139bc: 800100 add byte ptr [rcx], 0 -;; 139bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 139c8: 800100 add byte ptr [rcx], 0 -;; 139cb: aa stosb byte ptr [rdi], al -;; 139cc: 800100 add byte ptr [rcx], 0 -;; 139cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 139d8: 800100 add byte ptr [rcx], 0 -;; 139db: aa stosb byte ptr [rdi], al -;; 139dc: 800100 add byte ptr [rcx], 0 -;; 139df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 139e8: 800100 add byte ptr [rcx], 0 -;; 139eb: aa stosb byte ptr [rdi], al -;; 139ec: 800100 add byte ptr [rcx], 0 -;; 139ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 139f8: 800100 add byte ptr [rcx], 0 -;; 139fb: aa stosb byte ptr [rdi], al -;; 139fc: 800100 add byte ptr [rcx], 0 -;; 139ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13a08: 800100 add byte ptr [rcx], 0 -;; 13a0b: aa stosb byte ptr [rdi], al -;; 13a0c: 800100 add byte ptr [rcx], 0 -;; 13a0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13a18: 800100 add byte ptr [rcx], 0 -;; 13a1b: aa stosb byte ptr [rdi], al -;; 13a1c: 800100 add byte ptr [rcx], 0 -;; 13a1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13a28: 800100 add byte ptr [rcx], 0 -;; 13a2b: aa stosb byte ptr [rdi], al -;; 13a2c: 800100 add byte ptr [rcx], 0 -;; 13a2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13a38: 800100 add byte ptr [rcx], 0 -;; 13a3b: aa stosb byte ptr [rdi], al -;; 13a3c: 800100 add byte ptr [rcx], 0 -;; 13a3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13a48: 800100 add byte ptr [rcx], 0 -;; 13a4b: aa stosb byte ptr [rdi], al -;; 13a4c: 800100 add byte ptr [rcx], 0 -;; 13a4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13a58: 800100 add byte ptr [rcx], 0 -;; 13a5b: aa stosb byte ptr [rdi], al -;; 13a5c: 800100 add byte ptr [rcx], 0 -;; 13a5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13a68: 800100 add byte ptr [rcx], 0 -;; 13a6b: aa stosb byte ptr [rdi], al -;; 13a6c: 800100 add byte ptr [rcx], 0 -;; 13a6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13a78: 800100 add byte ptr [rcx], 0 -;; 13a7b: aa stosb byte ptr [rdi], al -;; 13a7c: 800100 add byte ptr [rcx], 0 -;; 13a7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13a88: 800100 add byte ptr [rcx], 0 -;; 13a8b: aa stosb byte ptr [rdi], al -;; 13a8c: 800100 add byte ptr [rcx], 0 -;; 13a8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13a98: 800100 add byte ptr [rcx], 0 -;; 13a9b: aa stosb byte ptr [rdi], al -;; 13a9c: 800100 add byte ptr [rcx], 0 -;; 13a9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13aa8: 800100 add byte ptr [rcx], 0 -;; 13aab: aa stosb byte ptr [rdi], al -;; 13aac: 800100 add byte ptr [rcx], 0 -;; 13aaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13ab8: 800100 add byte ptr [rcx], 0 -;; 13abb: aa stosb byte ptr [rdi], al -;; 13abc: 800100 add byte ptr [rcx], 0 -;; 13abf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13ac8: 800100 add byte ptr [rcx], 0 -;; 13acb: aa stosb byte ptr [rdi], al -;; 13acc: 800100 add byte ptr [rcx], 0 -;; 13acf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13ad8: 800100 add byte ptr [rcx], 0 -;; 13adb: aa stosb byte ptr [rdi], al -;; 13adc: 800100 add byte ptr [rcx], 0 -;; 13adf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13ae8: 800100 add byte ptr [rcx], 0 -;; 13aeb: aa stosb byte ptr [rdi], al -;; 13aec: 800100 add byte ptr [rcx], 0 -;; 13aef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13af8: 800100 add byte ptr [rcx], 0 -;; 13afb: aa stosb byte ptr [rdi], al -;; 13afc: 800100 add byte ptr [rcx], 0 -;; 13aff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13b08: 800100 add byte ptr [rcx], 0 -;; 13b0b: aa stosb byte ptr [rdi], al -;; 13b0c: 800100 add byte ptr [rcx], 0 -;; 13b0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13b18: 800100 add byte ptr [rcx], 0 -;; 13b1b: aa stosb byte ptr [rdi], al -;; 13b1c: 800100 add byte ptr [rcx], 0 -;; 13b1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13b28: 800100 add byte ptr [rcx], 0 -;; 13b2b: aa stosb byte ptr [rdi], al -;; 13b2c: 800100 add byte ptr [rcx], 0 -;; 13b2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13b38: 800100 add byte ptr [rcx], 0 -;; 13b3b: aa stosb byte ptr [rdi], al -;; 13b3c: 800100 add byte ptr [rcx], 0 -;; 13b3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13b48: 800100 add byte ptr [rcx], 0 -;; 13b4b: aa stosb byte ptr [rdi], al -;; 13b4c: 800100 add byte ptr [rcx], 0 -;; 13b4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13b58: 800100 add byte ptr [rcx], 0 -;; 13b5b: aa stosb byte ptr [rdi], al -;; 13b5c: 800100 add byte ptr [rcx], 0 -;; 13b5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13b68: 800100 add byte ptr [rcx], 0 -;; 13b6b: aa stosb byte ptr [rdi], al -;; 13b6c: 800100 add byte ptr [rcx], 0 -;; 13b6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13b78: 800100 add byte ptr [rcx], 0 -;; 13b7b: aa stosb byte ptr [rdi], al -;; 13b7c: 800100 add byte ptr [rcx], 0 -;; 13b7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13b88: 800100 add byte ptr [rcx], 0 -;; 13b8b: aa stosb byte ptr [rdi], al -;; 13b8c: 800100 add byte ptr [rcx], 0 -;; 13b8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13b98: 800100 add byte ptr [rcx], 0 -;; 13b9b: aa stosb byte ptr [rdi], al -;; 13b9c: 800100 add byte ptr [rcx], 0 -;; 13b9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13ba8: 800100 add byte ptr [rcx], 0 -;; 13bab: aa stosb byte ptr [rdi], al -;; 13bac: 800100 add byte ptr [rcx], 0 -;; 13baf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13bb8: 800100 add byte ptr [rcx], 0 -;; 13bbb: aa stosb byte ptr [rdi], al -;; 13bbc: 800100 add byte ptr [rcx], 0 -;; 13bbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13bc8: 800100 add byte ptr [rcx], 0 -;; 13bcb: aa stosb byte ptr [rdi], al -;; 13bcc: 800100 add byte ptr [rcx], 0 -;; 13bcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13bd8: 800100 add byte ptr [rcx], 0 -;; 13bdb: aa stosb byte ptr [rdi], al -;; 13bdc: 800100 add byte ptr [rcx], 0 -;; 13bdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13be8: 800100 add byte ptr [rcx], 0 -;; 13beb: aa stosb byte ptr [rdi], al -;; 13bec: 800100 add byte ptr [rcx], 0 -;; 13bef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13bf8: 800100 add byte ptr [rcx], 0 -;; 13bfb: aa stosb byte ptr [rdi], al -;; 13bfc: 800100 add byte ptr [rcx], 0 -;; 13bff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13c08: 800100 add byte ptr [rcx], 0 -;; 13c0b: aa stosb byte ptr [rdi], al -;; 13c0c: 800100 add byte ptr [rcx], 0 -;; 13c0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13c18: 800100 add byte ptr [rcx], 0 -;; 13c1b: aa stosb byte ptr [rdi], al -;; 13c1c: 800100 add byte ptr [rcx], 0 -;; 13c1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13c28: 800100 add byte ptr [rcx], 0 -;; 13c2b: aa stosb byte ptr [rdi], al -;; 13c2c: 800100 add byte ptr [rcx], 0 -;; 13c2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13c38: 800100 add byte ptr [rcx], 0 -;; 13c3b: aa stosb byte ptr [rdi], al -;; 13c3c: 800100 add byte ptr [rcx], 0 -;; 13c3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13c48: 800100 add byte ptr [rcx], 0 -;; 13c4b: aa stosb byte ptr [rdi], al -;; 13c4c: 800100 add byte ptr [rcx], 0 -;; 13c4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13c58: 800100 add byte ptr [rcx], 0 -;; 13c5b: aa stosb byte ptr [rdi], al -;; 13c5c: 800100 add byte ptr [rcx], 0 -;; 13c5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13c68: 800100 add byte ptr [rcx], 0 -;; 13c6b: aa stosb byte ptr [rdi], al -;; 13c6c: 800100 add byte ptr [rcx], 0 -;; 13c6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13c78: 800100 add byte ptr [rcx], 0 -;; 13c7b: aa stosb byte ptr [rdi], al -;; 13c7c: 800100 add byte ptr [rcx], 0 -;; 13c7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13c88: 800100 add byte ptr [rcx], 0 -;; 13c8b: aa stosb byte ptr [rdi], al -;; 13c8c: 800100 add byte ptr [rcx], 0 -;; 13c8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13c98: 800100 add byte ptr [rcx], 0 -;; 13c9b: aa stosb byte ptr [rdi], al -;; 13c9c: 800100 add byte ptr [rcx], 0 -;; 13c9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13ca8: 800100 add byte ptr [rcx], 0 -;; 13cab: aa stosb byte ptr [rdi], al -;; 13cac: 800100 add byte ptr [rcx], 0 -;; 13caf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13cb8: 800100 add byte ptr [rcx], 0 -;; 13cbb: aa stosb byte ptr [rdi], al -;; 13cbc: 800100 add byte ptr [rcx], 0 -;; 13cbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13cc8: 800100 add byte ptr [rcx], 0 -;; 13ccb: aa stosb byte ptr [rdi], al -;; 13ccc: 800100 add byte ptr [rcx], 0 -;; 13ccf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13cd8: 800100 add byte ptr [rcx], 0 -;; 13cdb: aa stosb byte ptr [rdi], al -;; 13cdc: 800100 add byte ptr [rcx], 0 -;; 13cdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13ce8: 800100 add byte ptr [rcx], 0 -;; 13ceb: aa stosb byte ptr [rdi], al -;; 13cec: 800100 add byte ptr [rcx], 0 -;; 13cef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13cf8: 800100 add byte ptr [rcx], 0 -;; 13cfb: aa stosb byte ptr [rdi], al -;; 13cfc: 800100 add byte ptr [rcx], 0 -;; 13cff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13d08: 800100 add byte ptr [rcx], 0 -;; 13d0b: aa stosb byte ptr [rdi], al -;; 13d0c: 800100 add byte ptr [rcx], 0 -;; 13d0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13d18: 800100 add byte ptr [rcx], 0 -;; 13d1b: aa stosb byte ptr [rdi], al -;; 13d1c: 800100 add byte ptr [rcx], 0 -;; 13d1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13d28: 800100 add byte ptr [rcx], 0 -;; 13d2b: aa stosb byte ptr [rdi], al -;; 13d2c: 800100 add byte ptr [rcx], 0 -;; 13d2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13d38: 800100 add byte ptr [rcx], 0 -;; 13d3b: aa stosb byte ptr [rdi], al -;; 13d3c: 800100 add byte ptr [rcx], 0 -;; 13d3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13d48: 800100 add byte ptr [rcx], 0 -;; 13d4b: aa stosb byte ptr [rdi], al -;; 13d4c: 800100 add byte ptr [rcx], 0 -;; 13d4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13d58: 800100 add byte ptr [rcx], 0 -;; 13d5b: aa stosb byte ptr [rdi], al -;; 13d5c: 800100 add byte ptr [rcx], 0 -;; 13d5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13d68: 800100 add byte ptr [rcx], 0 -;; 13d6b: aa stosb byte ptr [rdi], al -;; 13d6c: 800100 add byte ptr [rcx], 0 -;; 13d6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13d78: 800100 add byte ptr [rcx], 0 -;; 13d7b: aa stosb byte ptr [rdi], al -;; 13d7c: 800100 add byte ptr [rcx], 0 -;; 13d7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13d88: 800100 add byte ptr [rcx], 0 -;; 13d8b: aa stosb byte ptr [rdi], al -;; 13d8c: 800100 add byte ptr [rcx], 0 -;; 13d8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13d98: 800100 add byte ptr [rcx], 0 -;; 13d9b: aa stosb byte ptr [rdi], al -;; 13d9c: 800100 add byte ptr [rcx], 0 -;; 13d9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13da8: 800100 add byte ptr [rcx], 0 -;; 13dab: aa stosb byte ptr [rdi], al -;; 13dac: 800100 add byte ptr [rcx], 0 -;; 13daf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13db8: 800100 add byte ptr [rcx], 0 -;; 13dbb: aa stosb byte ptr [rdi], al -;; 13dbc: 800100 add byte ptr [rcx], 0 -;; 13dbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13dc8: 800100 add byte ptr [rcx], 0 -;; 13dcb: aa stosb byte ptr [rdi], al -;; 13dcc: 800100 add byte ptr [rcx], 0 -;; 13dcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13dd8: 800100 add byte ptr [rcx], 0 -;; 13ddb: aa stosb byte ptr [rdi], al -;; 13ddc: 800100 add byte ptr [rcx], 0 -;; 13ddf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13de8: 800100 add byte ptr [rcx], 0 -;; 13deb: aa stosb byte ptr [rdi], al -;; 13dec: 800100 add byte ptr [rcx], 0 -;; 13def: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13df8: 800100 add byte ptr [rcx], 0 -;; 13dfb: aa stosb byte ptr [rdi], al -;; 13dfc: 800100 add byte ptr [rcx], 0 -;; 13dff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13e08: 800100 add byte ptr [rcx], 0 -;; 13e0b: aa stosb byte ptr [rdi], al -;; 13e0c: 800100 add byte ptr [rcx], 0 -;; 13e0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13e18: 800100 add byte ptr [rcx], 0 -;; 13e1b: aa stosb byte ptr [rdi], al -;; 13e1c: 800100 add byte ptr [rcx], 0 -;; 13e1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13e28: 800100 add byte ptr [rcx], 0 -;; 13e2b: aa stosb byte ptr [rdi], al -;; 13e2c: 800100 add byte ptr [rcx], 0 -;; 13e2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13e38: 800100 add byte ptr [rcx], 0 -;; 13e3b: aa stosb byte ptr [rdi], al -;; 13e3c: 800100 add byte ptr [rcx], 0 -;; 13e3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13e48: 800100 add byte ptr [rcx], 0 -;; 13e4b: aa stosb byte ptr [rdi], al -;; 13e4c: 800100 add byte ptr [rcx], 0 -;; 13e4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13e58: 800100 add byte ptr [rcx], 0 -;; 13e5b: aa stosb byte ptr [rdi], al -;; 13e5c: 800100 add byte ptr [rcx], 0 -;; 13e5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13e68: 800100 add byte ptr [rcx], 0 -;; 13e6b: aa stosb byte ptr [rdi], al -;; 13e6c: 800100 add byte ptr [rcx], 0 -;; 13e6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13e78: 800100 add byte ptr [rcx], 0 -;; 13e7b: aa stosb byte ptr [rdi], al -;; 13e7c: 800100 add byte ptr [rcx], 0 -;; 13e7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13e88: 800100 add byte ptr [rcx], 0 -;; 13e8b: aa stosb byte ptr [rdi], al -;; 13e8c: 800100 add byte ptr [rcx], 0 -;; 13e8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13e98: 800100 add byte ptr [rcx], 0 -;; 13e9b: aa stosb byte ptr [rdi], al -;; 13e9c: 800100 add byte ptr [rcx], 0 -;; 13e9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13ea8: 800100 add byte ptr [rcx], 0 -;; 13eab: aa stosb byte ptr [rdi], al -;; 13eac: 800100 add byte ptr [rcx], 0 -;; 13eaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13eb8: 800100 add byte ptr [rcx], 0 -;; 13ebb: aa stosb byte ptr [rdi], al -;; 13ebc: 800100 add byte ptr [rcx], 0 -;; 13ebf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13ec8: 800100 add byte ptr [rcx], 0 -;; 13ecb: aa stosb byte ptr [rdi], al -;; 13ecc: 800100 add byte ptr [rcx], 0 -;; 13ecf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13ed8: 800100 add byte ptr [rcx], 0 -;; 13edb: aa stosb byte ptr [rdi], al -;; 13edc: 800100 add byte ptr [rcx], 0 -;; 13edf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13ee8: 800100 add byte ptr [rcx], 0 -;; 13eeb: aa stosb byte ptr [rdi], al -;; 13eec: 800100 add byte ptr [rcx], 0 -;; 13eef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13ef8: 800100 add byte ptr [rcx], 0 -;; 13efb: aa stosb byte ptr [rdi], al -;; 13efc: 800100 add byte ptr [rcx], 0 -;; 13eff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13f08: 800100 add byte ptr [rcx], 0 -;; 13f0b: aa stosb byte ptr [rdi], al -;; 13f0c: 800100 add byte ptr [rcx], 0 -;; 13f0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13f18: 800100 add byte ptr [rcx], 0 -;; 13f1b: aa stosb byte ptr [rdi], al -;; 13f1c: 800100 add byte ptr [rcx], 0 -;; 13f1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13f28: 800100 add byte ptr [rcx], 0 -;; 13f2b: aa stosb byte ptr [rdi], al -;; 13f2c: 800100 add byte ptr [rcx], 0 -;; 13f2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13f38: 800100 add byte ptr [rcx], 0 -;; 13f3b: aa stosb byte ptr [rdi], al -;; 13f3c: 800100 add byte ptr [rcx], 0 -;; 13f3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13f48: 800100 add byte ptr [rcx], 0 -;; 13f4b: aa stosb byte ptr [rdi], al -;; 13f4c: 800100 add byte ptr [rcx], 0 -;; 13f4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13f58: 800100 add byte ptr [rcx], 0 -;; 13f5b: aa stosb byte ptr [rdi], al -;; 13f5c: 800100 add byte ptr [rcx], 0 -;; 13f5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13f68: 800100 add byte ptr [rcx], 0 -;; 13f6b: aa stosb byte ptr [rdi], al -;; 13f6c: 800100 add byte ptr [rcx], 0 -;; 13f6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13f78: 800100 add byte ptr [rcx], 0 -;; 13f7b: aa stosb byte ptr [rdi], al -;; 13f7c: 800100 add byte ptr [rcx], 0 -;; 13f7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13f88: 800100 add byte ptr [rcx], 0 -;; 13f8b: aa stosb byte ptr [rdi], al -;; 13f8c: 800100 add byte ptr [rcx], 0 -;; 13f8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13f98: 800100 add byte ptr [rcx], 0 -;; 13f9b: aa stosb byte ptr [rdi], al -;; 13f9c: 800100 add byte ptr [rcx], 0 -;; 13f9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13fa8: 800100 add byte ptr [rcx], 0 -;; 13fab: aa stosb byte ptr [rdi], al -;; 13fac: 800100 add byte ptr [rcx], 0 -;; 13faf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13fb8: 800100 add byte ptr [rcx], 0 -;; 13fbb: aa stosb byte ptr [rdi], al -;; 13fbc: 800100 add byte ptr [rcx], 0 -;; 13fbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13fc8: 800100 add byte ptr [rcx], 0 -;; 13fcb: aa stosb byte ptr [rdi], al -;; 13fcc: 800100 add byte ptr [rcx], 0 -;; 13fcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13fd8: 800100 add byte ptr [rcx], 0 -;; 13fdb: aa stosb byte ptr [rdi], al -;; 13fdc: 800100 add byte ptr [rcx], 0 -;; 13fdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13fe8: 800100 add byte ptr [rcx], 0 -;; 13feb: aa stosb byte ptr [rdi], al -;; 13fec: 800100 add byte ptr [rcx], 0 -;; 13fef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 13ff8: 800100 add byte ptr [rcx], 0 -;; 13ffb: aa stosb byte ptr [rdi], al -;; 13ffc: 800100 add byte ptr [rcx], 0 -;; 13fff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14008: 800100 add byte ptr [rcx], 0 -;; 1400b: aa stosb byte ptr [rdi], al -;; 1400c: 800100 add byte ptr [rcx], 0 -;; 1400f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14018: 800100 add byte ptr [rcx], 0 -;; 1401b: aa stosb byte ptr [rdi], al -;; 1401c: 800100 add byte ptr [rcx], 0 -;; 1401f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14028: 800100 add byte ptr [rcx], 0 -;; 1402b: aa stosb byte ptr [rdi], al -;; 1402c: 800100 add byte ptr [rcx], 0 -;; 1402f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14038: 800100 add byte ptr [rcx], 0 -;; 1403b: aa stosb byte ptr [rdi], al -;; 1403c: 800100 add byte ptr [rcx], 0 -;; 1403f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14048: 800100 add byte ptr [rcx], 0 -;; 1404b: aa stosb byte ptr [rdi], al -;; 1404c: 800100 add byte ptr [rcx], 0 -;; 1404f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14058: 800100 add byte ptr [rcx], 0 -;; 1405b: aa stosb byte ptr [rdi], al -;; 1405c: 800100 add byte ptr [rcx], 0 -;; 1405f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14068: 800100 add byte ptr [rcx], 0 -;; 1406b: aa stosb byte ptr [rdi], al -;; 1406c: 800100 add byte ptr [rcx], 0 -;; 1406f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14078: 800100 add byte ptr [rcx], 0 -;; 1407b: aa stosb byte ptr [rdi], al -;; 1407c: 800100 add byte ptr [rcx], 0 -;; 1407f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14088: 800100 add byte ptr [rcx], 0 -;; 1408b: aa stosb byte ptr [rdi], al -;; 1408c: 800100 add byte ptr [rcx], 0 -;; 1408f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14098: 800100 add byte ptr [rcx], 0 -;; 1409b: aa stosb byte ptr [rdi], al -;; 1409c: 800100 add byte ptr [rcx], 0 -;; 1409f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 140a8: 800100 add byte ptr [rcx], 0 -;; 140ab: aa stosb byte ptr [rdi], al -;; 140ac: 800100 add byte ptr [rcx], 0 -;; 140af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 140b8: 800100 add byte ptr [rcx], 0 -;; 140bb: aa stosb byte ptr [rdi], al -;; 140bc: 800100 add byte ptr [rcx], 0 -;; 140bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 140c8: 800100 add byte ptr [rcx], 0 -;; 140cb: aa stosb byte ptr [rdi], al -;; 140cc: 800100 add byte ptr [rcx], 0 -;; 140cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 140d8: 800100 add byte ptr [rcx], 0 -;; 140db: aa stosb byte ptr [rdi], al -;; 140dc: 800100 add byte ptr [rcx], 0 -;; 140df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 140e8: 800100 add byte ptr [rcx], 0 -;; 140eb: aa stosb byte ptr [rdi], al -;; 140ec: 800100 add byte ptr [rcx], 0 -;; 140ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 140f8: 800100 add byte ptr [rcx], 0 -;; 140fb: aa stosb byte ptr [rdi], al -;; 140fc: 800100 add byte ptr [rcx], 0 -;; 140ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14108: 800100 add byte ptr [rcx], 0 -;; 1410b: aa stosb byte ptr [rdi], al -;; 1410c: 800100 add byte ptr [rcx], 0 -;; 1410f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14118: 800100 add byte ptr [rcx], 0 -;; 1411b: aa stosb byte ptr [rdi], al -;; 1411c: 800100 add byte ptr [rcx], 0 -;; 1411f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14128: 800100 add byte ptr [rcx], 0 -;; 1412b: aa stosb byte ptr [rdi], al -;; 1412c: 800100 add byte ptr [rcx], 0 -;; 1412f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14138: 800100 add byte ptr [rcx], 0 -;; 1413b: aa stosb byte ptr [rdi], al -;; 1413c: 800100 add byte ptr [rcx], 0 -;; 1413f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14148: 800100 add byte ptr [rcx], 0 -;; 1414b: aa stosb byte ptr [rdi], al -;; 1414c: 800100 add byte ptr [rcx], 0 -;; 1414f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14158: 800100 add byte ptr [rcx], 0 -;; 1415b: aa stosb byte ptr [rdi], al -;; 1415c: 800100 add byte ptr [rcx], 0 -;; 1415f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14168: 800100 add byte ptr [rcx], 0 -;; 1416b: aa stosb byte ptr [rdi], al -;; 1416c: 800100 add byte ptr [rcx], 0 -;; 1416f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14178: 800100 add byte ptr [rcx], 0 -;; 1417b: aa stosb byte ptr [rdi], al -;; 1417c: 800100 add byte ptr [rcx], 0 -;; 1417f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14188: 800100 add byte ptr [rcx], 0 -;; 1418b: aa stosb byte ptr [rdi], al -;; 1418c: 800100 add byte ptr [rcx], 0 -;; 1418f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14198: 800100 add byte ptr [rcx], 0 -;; 1419b: aa stosb byte ptr [rdi], al -;; 1419c: 800100 add byte ptr [rcx], 0 -;; 1419f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 141a8: 800100 add byte ptr [rcx], 0 -;; 141ab: aa stosb byte ptr [rdi], al -;; 141ac: 800100 add byte ptr [rcx], 0 -;; 141af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 141b8: 800100 add byte ptr [rcx], 0 -;; 141bb: aa stosb byte ptr [rdi], al -;; 141bc: 800100 add byte ptr [rcx], 0 -;; 141bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 141c8: 800100 add byte ptr [rcx], 0 -;; 141cb: aa stosb byte ptr [rdi], al -;; 141cc: 800100 add byte ptr [rcx], 0 -;; 141cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 141d8: 800100 add byte ptr [rcx], 0 -;; 141db: aa stosb byte ptr [rdi], al -;; 141dc: 800100 add byte ptr [rcx], 0 -;; 141df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 141e8: 800100 add byte ptr [rcx], 0 -;; 141eb: aa stosb byte ptr [rdi], al -;; 141ec: 800100 add byte ptr [rcx], 0 -;; 141ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 141f8: 800100 add byte ptr [rcx], 0 -;; 141fb: aa stosb byte ptr [rdi], al -;; 141fc: 800100 add byte ptr [rcx], 0 -;; 141ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14208: 800100 add byte ptr [rcx], 0 -;; 1420b: aa stosb byte ptr [rdi], al -;; 1420c: 800100 add byte ptr [rcx], 0 -;; 1420f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14218: 800100 add byte ptr [rcx], 0 -;; 1421b: aa stosb byte ptr [rdi], al -;; 1421c: 800100 add byte ptr [rcx], 0 -;; 1421f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14228: 800100 add byte ptr [rcx], 0 -;; 1422b: aa stosb byte ptr [rdi], al -;; 1422c: 800100 add byte ptr [rcx], 0 -;; 1422f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14238: 800100 add byte ptr [rcx], 0 -;; 1423b: aa stosb byte ptr [rdi], al -;; 1423c: 800100 add byte ptr [rcx], 0 -;; 1423f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14248: 800100 add byte ptr [rcx], 0 -;; 1424b: aa stosb byte ptr [rdi], al -;; 1424c: 800100 add byte ptr [rcx], 0 -;; 1424f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14258: 800100 add byte ptr [rcx], 0 -;; 1425b: aa stosb byte ptr [rdi], al -;; 1425c: 800100 add byte ptr [rcx], 0 -;; 1425f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14268: 800100 add byte ptr [rcx], 0 -;; 1426b: aa stosb byte ptr [rdi], al -;; 1426c: 800100 add byte ptr [rcx], 0 -;; 1426f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14278: 800100 add byte ptr [rcx], 0 -;; 1427b: aa stosb byte ptr [rdi], al -;; 1427c: 800100 add byte ptr [rcx], 0 -;; 1427f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14288: 800100 add byte ptr [rcx], 0 -;; 1428b: aa stosb byte ptr [rdi], al -;; 1428c: 800100 add byte ptr [rcx], 0 -;; 1428f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14298: 800100 add byte ptr [rcx], 0 -;; 1429b: aa stosb byte ptr [rdi], al -;; 1429c: 800100 add byte ptr [rcx], 0 -;; 1429f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 142a8: 800100 add byte ptr [rcx], 0 -;; 142ab: aa stosb byte ptr [rdi], al -;; 142ac: 800100 add byte ptr [rcx], 0 -;; 142af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 142b8: 800100 add byte ptr [rcx], 0 -;; 142bb: aa stosb byte ptr [rdi], al -;; 142bc: 800100 add byte ptr [rcx], 0 -;; 142bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 142c8: 800100 add byte ptr [rcx], 0 -;; 142cb: aa stosb byte ptr [rdi], al -;; 142cc: 800100 add byte ptr [rcx], 0 -;; 142cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 142d8: 800100 add byte ptr [rcx], 0 -;; 142db: aa stosb byte ptr [rdi], al -;; 142dc: 800100 add byte ptr [rcx], 0 -;; 142df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 142e8: 800100 add byte ptr [rcx], 0 -;; 142eb: aa stosb byte ptr [rdi], al -;; 142ec: 800100 add byte ptr [rcx], 0 -;; 142ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 142f8: 800100 add byte ptr [rcx], 0 -;; 142fb: aa stosb byte ptr [rdi], al -;; 142fc: 800100 add byte ptr [rcx], 0 -;; 142ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14308: 800100 add byte ptr [rcx], 0 -;; 1430b: aa stosb byte ptr [rdi], al -;; 1430c: 800100 add byte ptr [rcx], 0 -;; 1430f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14318: 800100 add byte ptr [rcx], 0 -;; 1431b: aa stosb byte ptr [rdi], al -;; 1431c: 800100 add byte ptr [rcx], 0 -;; 1431f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14328: 800100 add byte ptr [rcx], 0 -;; 1432b: aa stosb byte ptr [rdi], al -;; 1432c: 800100 add byte ptr [rcx], 0 -;; 1432f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14338: 800100 add byte ptr [rcx], 0 -;; 1433b: aa stosb byte ptr [rdi], al -;; 1433c: 800100 add byte ptr [rcx], 0 -;; 1433f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14348: 800100 add byte ptr [rcx], 0 -;; 1434b: aa stosb byte ptr [rdi], al -;; 1434c: 800100 add byte ptr [rcx], 0 -;; 1434f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14358: 800100 add byte ptr [rcx], 0 -;; 1435b: aa stosb byte ptr [rdi], al -;; 1435c: 800100 add byte ptr [rcx], 0 -;; 1435f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14368: 800100 add byte ptr [rcx], 0 -;; 1436b: aa stosb byte ptr [rdi], al -;; 1436c: 800100 add byte ptr [rcx], 0 -;; 1436f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14378: 800100 add byte ptr [rcx], 0 -;; 1437b: aa stosb byte ptr [rdi], al -;; 1437c: 800100 add byte ptr [rcx], 0 -;; 1437f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14388: 800100 add byte ptr [rcx], 0 -;; 1438b: aa stosb byte ptr [rdi], al -;; 1438c: 800100 add byte ptr [rcx], 0 -;; 1438f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14398: 800100 add byte ptr [rcx], 0 -;; 1439b: aa stosb byte ptr [rdi], al -;; 1439c: 800100 add byte ptr [rcx], 0 -;; 1439f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 143a8: 800100 add byte ptr [rcx], 0 -;; 143ab: aa stosb byte ptr [rdi], al -;; 143ac: 800100 add byte ptr [rcx], 0 -;; 143af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 143b8: 800100 add byte ptr [rcx], 0 -;; 143bb: aa stosb byte ptr [rdi], al -;; 143bc: 800100 add byte ptr [rcx], 0 -;; 143bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 143c8: 800100 add byte ptr [rcx], 0 -;; 143cb: aa stosb byte ptr [rdi], al -;; 143cc: 800100 add byte ptr [rcx], 0 -;; 143cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 143d8: 800100 add byte ptr [rcx], 0 -;; 143db: aa stosb byte ptr [rdi], al -;; 143dc: 800100 add byte ptr [rcx], 0 -;; 143df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 143e8: 800100 add byte ptr [rcx], 0 -;; 143eb: aa stosb byte ptr [rdi], al -;; 143ec: 800100 add byte ptr [rcx], 0 -;; 143ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 143f8: 800100 add byte ptr [rcx], 0 -;; 143fb: aa stosb byte ptr [rdi], al -;; 143fc: 800100 add byte ptr [rcx], 0 -;; 143ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14408: 800100 add byte ptr [rcx], 0 -;; 1440b: aa stosb byte ptr [rdi], al -;; 1440c: 800100 add byte ptr [rcx], 0 -;; 1440f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14418: 800100 add byte ptr [rcx], 0 -;; 1441b: aa stosb byte ptr [rdi], al -;; 1441c: 800100 add byte ptr [rcx], 0 -;; 1441f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14428: 800100 add byte ptr [rcx], 0 -;; 1442b: aa stosb byte ptr [rdi], al -;; 1442c: 800100 add byte ptr [rcx], 0 -;; 1442f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14438: 800100 add byte ptr [rcx], 0 -;; 1443b: aa stosb byte ptr [rdi], al -;; 1443c: 800100 add byte ptr [rcx], 0 -;; 1443f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14448: 800100 add byte ptr [rcx], 0 -;; 1444b: aa stosb byte ptr [rdi], al -;; 1444c: 800100 add byte ptr [rcx], 0 -;; 1444f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14458: 800100 add byte ptr [rcx], 0 -;; 1445b: aa stosb byte ptr [rdi], al -;; 1445c: 800100 add byte ptr [rcx], 0 -;; 1445f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14468: 800100 add byte ptr [rcx], 0 -;; 1446b: aa stosb byte ptr [rdi], al -;; 1446c: 800100 add byte ptr [rcx], 0 -;; 1446f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14478: 800100 add byte ptr [rcx], 0 -;; 1447b: aa stosb byte ptr [rdi], al -;; 1447c: 800100 add byte ptr [rcx], 0 -;; 1447f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14488: 800100 add byte ptr [rcx], 0 -;; 1448b: aa stosb byte ptr [rdi], al -;; 1448c: 800100 add byte ptr [rcx], 0 -;; 1448f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14498: 800100 add byte ptr [rcx], 0 -;; 1449b: aa stosb byte ptr [rdi], al -;; 1449c: 800100 add byte ptr [rcx], 0 -;; 1449f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 144a8: 800100 add byte ptr [rcx], 0 -;; 144ab: aa stosb byte ptr [rdi], al -;; 144ac: 800100 add byte ptr [rcx], 0 -;; 144af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 144b8: 800100 add byte ptr [rcx], 0 -;; 144bb: aa stosb byte ptr [rdi], al -;; 144bc: 800100 add byte ptr [rcx], 0 -;; 144bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 144c8: 800100 add byte ptr [rcx], 0 -;; 144cb: aa stosb byte ptr [rdi], al -;; 144cc: 800100 add byte ptr [rcx], 0 -;; 144cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 144d8: 800100 add byte ptr [rcx], 0 -;; 144db: aa stosb byte ptr [rdi], al -;; 144dc: 800100 add byte ptr [rcx], 0 -;; 144df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 144e8: 800100 add byte ptr [rcx], 0 -;; 144eb: aa stosb byte ptr [rdi], al -;; 144ec: 800100 add byte ptr [rcx], 0 -;; 144ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 144f8: 800100 add byte ptr [rcx], 0 -;; 144fb: aa stosb byte ptr [rdi], al -;; 144fc: 800100 add byte ptr [rcx], 0 -;; 144ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14508: 800100 add byte ptr [rcx], 0 -;; 1450b: aa stosb byte ptr [rdi], al -;; 1450c: 800100 add byte ptr [rcx], 0 -;; 1450f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14518: 800100 add byte ptr [rcx], 0 -;; 1451b: aa stosb byte ptr [rdi], al -;; 1451c: 800100 add byte ptr [rcx], 0 -;; 1451f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14528: 800100 add byte ptr [rcx], 0 -;; 1452b: aa stosb byte ptr [rdi], al -;; 1452c: 800100 add byte ptr [rcx], 0 -;; 1452f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14538: 800100 add byte ptr [rcx], 0 -;; 1453b: aa stosb byte ptr [rdi], al -;; 1453c: 800100 add byte ptr [rcx], 0 -;; 1453f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14548: 800100 add byte ptr [rcx], 0 -;; 1454b: aa stosb byte ptr [rdi], al -;; 1454c: 800100 add byte ptr [rcx], 0 -;; 1454f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14558: 800100 add byte ptr [rcx], 0 -;; 1455b: aa stosb byte ptr [rdi], al -;; 1455c: 800100 add byte ptr [rcx], 0 -;; 1455f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14568: 800100 add byte ptr [rcx], 0 -;; 1456b: aa stosb byte ptr [rdi], al -;; 1456c: 800100 add byte ptr [rcx], 0 -;; 1456f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14578: 800100 add byte ptr [rcx], 0 -;; 1457b: aa stosb byte ptr [rdi], al -;; 1457c: 800100 add byte ptr [rcx], 0 -;; 1457f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14588: 800100 add byte ptr [rcx], 0 -;; 1458b: aa stosb byte ptr [rdi], al -;; 1458c: 800100 add byte ptr [rcx], 0 -;; 1458f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14598: 800100 add byte ptr [rcx], 0 -;; 1459b: aa stosb byte ptr [rdi], al -;; 1459c: 800100 add byte ptr [rcx], 0 -;; 1459f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 145a8: 800100 add byte ptr [rcx], 0 -;; 145ab: aa stosb byte ptr [rdi], al -;; 145ac: 800100 add byte ptr [rcx], 0 -;; 145af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 145b8: 800100 add byte ptr [rcx], 0 -;; 145bb: aa stosb byte ptr [rdi], al -;; 145bc: 800100 add byte ptr [rcx], 0 -;; 145bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 145c8: 800100 add byte ptr [rcx], 0 -;; 145cb: aa stosb byte ptr [rdi], al -;; 145cc: 800100 add byte ptr [rcx], 0 -;; 145cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 145d8: 800100 add byte ptr [rcx], 0 -;; 145db: aa stosb byte ptr [rdi], al -;; 145dc: 800100 add byte ptr [rcx], 0 -;; 145df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 145e8: 800100 add byte ptr [rcx], 0 -;; 145eb: aa stosb byte ptr [rdi], al -;; 145ec: 800100 add byte ptr [rcx], 0 -;; 145ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 145f8: 800100 add byte ptr [rcx], 0 -;; 145fb: aa stosb byte ptr [rdi], al -;; 145fc: 800100 add byte ptr [rcx], 0 -;; 145ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14608: 800100 add byte ptr [rcx], 0 -;; 1460b: aa stosb byte ptr [rdi], al -;; 1460c: 800100 add byte ptr [rcx], 0 -;; 1460f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14618: 800100 add byte ptr [rcx], 0 -;; 1461b: aa stosb byte ptr [rdi], al -;; 1461c: 800100 add byte ptr [rcx], 0 -;; 1461f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14628: 800100 add byte ptr [rcx], 0 -;; 1462b: aa stosb byte ptr [rdi], al -;; 1462c: 800100 add byte ptr [rcx], 0 -;; 1462f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14638: 800100 add byte ptr [rcx], 0 -;; 1463b: aa stosb byte ptr [rdi], al -;; 1463c: 800100 add byte ptr [rcx], 0 -;; 1463f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14648: 800100 add byte ptr [rcx], 0 -;; 1464b: aa stosb byte ptr [rdi], al -;; 1464c: 800100 add byte ptr [rcx], 0 -;; 1464f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14658: 800100 add byte ptr [rcx], 0 -;; 1465b: aa stosb byte ptr [rdi], al -;; 1465c: 800100 add byte ptr [rcx], 0 -;; 1465f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14668: 800100 add byte ptr [rcx], 0 -;; 1466b: aa stosb byte ptr [rdi], al -;; 1466c: 800100 add byte ptr [rcx], 0 -;; 1466f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14678: 800100 add byte ptr [rcx], 0 -;; 1467b: aa stosb byte ptr [rdi], al -;; 1467c: 800100 add byte ptr [rcx], 0 -;; 1467f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14688: 800100 add byte ptr [rcx], 0 -;; 1468b: aa stosb byte ptr [rdi], al -;; 1468c: 800100 add byte ptr [rcx], 0 -;; 1468f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14698: 800100 add byte ptr [rcx], 0 -;; 1469b: aa stosb byte ptr [rdi], al -;; 1469c: 800100 add byte ptr [rcx], 0 -;; 1469f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 146a8: 800100 add byte ptr [rcx], 0 -;; 146ab: aa stosb byte ptr [rdi], al -;; 146ac: 800100 add byte ptr [rcx], 0 -;; 146af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 146b8: 800100 add byte ptr [rcx], 0 -;; 146bb: aa stosb byte ptr [rdi], al -;; 146bc: 800100 add byte ptr [rcx], 0 -;; 146bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 146c8: 800100 add byte ptr [rcx], 0 -;; 146cb: aa stosb byte ptr [rdi], al -;; 146cc: 800100 add byte ptr [rcx], 0 -;; 146cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 146d8: 800100 add byte ptr [rcx], 0 -;; 146db: aa stosb byte ptr [rdi], al -;; 146dc: 800100 add byte ptr [rcx], 0 -;; 146df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 146e8: 800100 add byte ptr [rcx], 0 -;; 146eb: aa stosb byte ptr [rdi], al -;; 146ec: 800100 add byte ptr [rcx], 0 -;; 146ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 146f8: 800100 add byte ptr [rcx], 0 -;; 146fb: aa stosb byte ptr [rdi], al -;; 146fc: 800100 add byte ptr [rcx], 0 -;; 146ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14708: 800100 add byte ptr [rcx], 0 -;; 1470b: aa stosb byte ptr [rdi], al -;; 1470c: 800100 add byte ptr [rcx], 0 -;; 1470f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14718: 800100 add byte ptr [rcx], 0 -;; 1471b: aa stosb byte ptr [rdi], al -;; 1471c: 800100 add byte ptr [rcx], 0 -;; 1471f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14728: 800100 add byte ptr [rcx], 0 -;; 1472b: aa stosb byte ptr [rdi], al -;; 1472c: 800100 add byte ptr [rcx], 0 -;; 1472f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14738: 800100 add byte ptr [rcx], 0 -;; 1473b: aa stosb byte ptr [rdi], al -;; 1473c: 800100 add byte ptr [rcx], 0 -;; 1473f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14748: 800100 add byte ptr [rcx], 0 -;; 1474b: aa stosb byte ptr [rdi], al -;; 1474c: 800100 add byte ptr [rcx], 0 -;; 1474f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14758: 800100 add byte ptr [rcx], 0 -;; 1475b: aa stosb byte ptr [rdi], al -;; 1475c: 800100 add byte ptr [rcx], 0 -;; 1475f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14768: 800100 add byte ptr [rcx], 0 -;; 1476b: aa stosb byte ptr [rdi], al -;; 1476c: 800100 add byte ptr [rcx], 0 -;; 1476f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14778: 800100 add byte ptr [rcx], 0 -;; 1477b: aa stosb byte ptr [rdi], al -;; 1477c: 800100 add byte ptr [rcx], 0 -;; 1477f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14788: 800100 add byte ptr [rcx], 0 -;; 1478b: aa stosb byte ptr [rdi], al -;; 1478c: 800100 add byte ptr [rcx], 0 -;; 1478f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14798: 800100 add byte ptr [rcx], 0 -;; 1479b: aa stosb byte ptr [rdi], al -;; 1479c: 800100 add byte ptr [rcx], 0 -;; 1479f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 147a8: 800100 add byte ptr [rcx], 0 -;; 147ab: aa stosb byte ptr [rdi], al -;; 147ac: 800100 add byte ptr [rcx], 0 -;; 147af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 147b8: 800100 add byte ptr [rcx], 0 -;; 147bb: aa stosb byte ptr [rdi], al -;; 147bc: 800100 add byte ptr [rcx], 0 -;; 147bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 147c8: 800100 add byte ptr [rcx], 0 -;; 147cb: aa stosb byte ptr [rdi], al -;; 147cc: 800100 add byte ptr [rcx], 0 -;; 147cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 147d8: 800100 add byte ptr [rcx], 0 -;; 147db: aa stosb byte ptr [rdi], al -;; 147dc: 800100 add byte ptr [rcx], 0 -;; 147df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 147e8: 800100 add byte ptr [rcx], 0 -;; 147eb: aa stosb byte ptr [rdi], al -;; 147ec: 800100 add byte ptr [rcx], 0 -;; 147ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 147f8: 800100 add byte ptr [rcx], 0 -;; 147fb: aa stosb byte ptr [rdi], al -;; 147fc: 800100 add byte ptr [rcx], 0 -;; 147ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14808: 800100 add byte ptr [rcx], 0 -;; 1480b: aa stosb byte ptr [rdi], al -;; 1480c: 800100 add byte ptr [rcx], 0 -;; 1480f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14818: 800100 add byte ptr [rcx], 0 -;; 1481b: aa stosb byte ptr [rdi], al -;; 1481c: 800100 add byte ptr [rcx], 0 -;; 1481f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14828: 800100 add byte ptr [rcx], 0 -;; 1482b: aa stosb byte ptr [rdi], al -;; 1482c: 800100 add byte ptr [rcx], 0 -;; 1482f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14838: 800100 add byte ptr [rcx], 0 -;; 1483b: aa stosb byte ptr [rdi], al -;; 1483c: 800100 add byte ptr [rcx], 0 -;; 1483f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14848: 800100 add byte ptr [rcx], 0 -;; 1484b: aa stosb byte ptr [rdi], al -;; 1484c: 800100 add byte ptr [rcx], 0 -;; 1484f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14858: 800100 add byte ptr [rcx], 0 -;; 1485b: aa stosb byte ptr [rdi], al -;; 1485c: 800100 add byte ptr [rcx], 0 -;; 1485f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14868: 800100 add byte ptr [rcx], 0 -;; 1486b: aa stosb byte ptr [rdi], al -;; 1486c: 800100 add byte ptr [rcx], 0 -;; 1486f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14878: 800100 add byte ptr [rcx], 0 -;; 1487b: aa stosb byte ptr [rdi], al -;; 1487c: 800100 add byte ptr [rcx], 0 -;; 1487f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14888: 800100 add byte ptr [rcx], 0 -;; 1488b: aa stosb byte ptr [rdi], al -;; 1488c: 800100 add byte ptr [rcx], 0 -;; 1488f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14898: 800100 add byte ptr [rcx], 0 -;; 1489b: aa stosb byte ptr [rdi], al -;; 1489c: 800100 add byte ptr [rcx], 0 -;; 1489f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 148a8: 800100 add byte ptr [rcx], 0 -;; 148ab: aa stosb byte ptr [rdi], al -;; 148ac: 800100 add byte ptr [rcx], 0 -;; 148af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 148b8: 800100 add byte ptr [rcx], 0 -;; 148bb: aa stosb byte ptr [rdi], al -;; 148bc: 800100 add byte ptr [rcx], 0 -;; 148bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 148c8: 800100 add byte ptr [rcx], 0 -;; 148cb: aa stosb byte ptr [rdi], al -;; 148cc: 800100 add byte ptr [rcx], 0 -;; 148cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 148d8: 800100 add byte ptr [rcx], 0 -;; 148db: aa stosb byte ptr [rdi], al -;; 148dc: 800100 add byte ptr [rcx], 0 -;; 148df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 148e8: 800100 add byte ptr [rcx], 0 -;; 148eb: aa stosb byte ptr [rdi], al -;; 148ec: 800100 add byte ptr [rcx], 0 -;; 148ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 148f8: 800100 add byte ptr [rcx], 0 -;; 148fb: aa stosb byte ptr [rdi], al -;; 148fc: 800100 add byte ptr [rcx], 0 -;; 148ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14908: 800100 add byte ptr [rcx], 0 -;; 1490b: aa stosb byte ptr [rdi], al -;; 1490c: 800100 add byte ptr [rcx], 0 -;; 1490f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14918: 800100 add byte ptr [rcx], 0 -;; 1491b: aa stosb byte ptr [rdi], al -;; 1491c: 800100 add byte ptr [rcx], 0 -;; 1491f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14928: 800100 add byte ptr [rcx], 0 -;; 1492b: aa stosb byte ptr [rdi], al -;; 1492c: 800100 add byte ptr [rcx], 0 -;; 1492f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14938: 800100 add byte ptr [rcx], 0 -;; 1493b: aa stosb byte ptr [rdi], al -;; 1493c: 800100 add byte ptr [rcx], 0 -;; 1493f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14948: 800100 add byte ptr [rcx], 0 -;; 1494b: aa stosb byte ptr [rdi], al -;; 1494c: 800100 add byte ptr [rcx], 0 -;; 1494f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14958: 800100 add byte ptr [rcx], 0 -;; 1495b: aa stosb byte ptr [rdi], al -;; 1495c: 800100 add byte ptr [rcx], 0 -;; 1495f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14968: 800100 add byte ptr [rcx], 0 -;; 1496b: aa stosb byte ptr [rdi], al -;; 1496c: 800100 add byte ptr [rcx], 0 -;; 1496f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14978: 800100 add byte ptr [rcx], 0 -;; 1497b: aa stosb byte ptr [rdi], al -;; 1497c: 800100 add byte ptr [rcx], 0 -;; 1497f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14988: 800100 add byte ptr [rcx], 0 -;; 1498b: aa stosb byte ptr [rdi], al -;; 1498c: 800100 add byte ptr [rcx], 0 -;; 1498f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14998: 800100 add byte ptr [rcx], 0 -;; 1499b: aa stosb byte ptr [rdi], al -;; 1499c: 800100 add byte ptr [rcx], 0 -;; 1499f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 149a8: 800100 add byte ptr [rcx], 0 -;; 149ab: aa stosb byte ptr [rdi], al -;; 149ac: 800100 add byte ptr [rcx], 0 -;; 149af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 149b8: 800100 add byte ptr [rcx], 0 -;; 149bb: aa stosb byte ptr [rdi], al -;; 149bc: 800100 add byte ptr [rcx], 0 -;; 149bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 149c8: 800100 add byte ptr [rcx], 0 -;; 149cb: aa stosb byte ptr [rdi], al -;; 149cc: 800100 add byte ptr [rcx], 0 -;; 149cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 149d8: 800100 add byte ptr [rcx], 0 -;; 149db: aa stosb byte ptr [rdi], al -;; 149dc: 800100 add byte ptr [rcx], 0 -;; 149df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 149e8: 800100 add byte ptr [rcx], 0 -;; 149eb: aa stosb byte ptr [rdi], al -;; 149ec: 800100 add byte ptr [rcx], 0 -;; 149ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 149f8: 800100 add byte ptr [rcx], 0 -;; 149fb: aa stosb byte ptr [rdi], al -;; 149fc: 800100 add byte ptr [rcx], 0 -;; 149ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14a08: 800100 add byte ptr [rcx], 0 -;; 14a0b: aa stosb byte ptr [rdi], al -;; 14a0c: 800100 add byte ptr [rcx], 0 -;; 14a0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14a18: 800100 add byte ptr [rcx], 0 -;; 14a1b: aa stosb byte ptr [rdi], al -;; 14a1c: 800100 add byte ptr [rcx], 0 -;; 14a1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14a28: 800100 add byte ptr [rcx], 0 -;; 14a2b: aa stosb byte ptr [rdi], al -;; 14a2c: 800100 add byte ptr [rcx], 0 -;; 14a2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14a38: 800100 add byte ptr [rcx], 0 -;; 14a3b: aa stosb byte ptr [rdi], al -;; 14a3c: 800100 add byte ptr [rcx], 0 -;; 14a3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14a48: 800100 add byte ptr [rcx], 0 -;; 14a4b: aa stosb byte ptr [rdi], al -;; 14a4c: 800100 add byte ptr [rcx], 0 -;; 14a4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14a58: 800100 add byte ptr [rcx], 0 -;; 14a5b: aa stosb byte ptr [rdi], al -;; 14a5c: 800100 add byte ptr [rcx], 0 -;; 14a5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14a68: 800100 add byte ptr [rcx], 0 -;; 14a6b: aa stosb byte ptr [rdi], al -;; 14a6c: 800100 add byte ptr [rcx], 0 -;; 14a6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14a78: 800100 add byte ptr [rcx], 0 -;; 14a7b: aa stosb byte ptr [rdi], al -;; 14a7c: 800100 add byte ptr [rcx], 0 -;; 14a7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14a88: 800100 add byte ptr [rcx], 0 -;; 14a8b: aa stosb byte ptr [rdi], al -;; 14a8c: 800100 add byte ptr [rcx], 0 -;; 14a8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14a98: 800100 add byte ptr [rcx], 0 -;; 14a9b: aa stosb byte ptr [rdi], al -;; 14a9c: 800100 add byte ptr [rcx], 0 -;; 14a9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14aa8: 800100 add byte ptr [rcx], 0 -;; 14aab: aa stosb byte ptr [rdi], al -;; 14aac: 800100 add byte ptr [rcx], 0 -;; 14aaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14ab8: 800100 add byte ptr [rcx], 0 -;; 14abb: aa stosb byte ptr [rdi], al -;; 14abc: 800100 add byte ptr [rcx], 0 -;; 14abf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14ac8: 800100 add byte ptr [rcx], 0 -;; 14acb: aa stosb byte ptr [rdi], al -;; 14acc: 800100 add byte ptr [rcx], 0 -;; 14acf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14ad8: 800100 add byte ptr [rcx], 0 -;; 14adb: aa stosb byte ptr [rdi], al -;; 14adc: 800100 add byte ptr [rcx], 0 -;; 14adf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14ae8: 800100 add byte ptr [rcx], 0 -;; 14aeb: aa stosb byte ptr [rdi], al -;; 14aec: 800100 add byte ptr [rcx], 0 -;; 14aef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14af8: 800100 add byte ptr [rcx], 0 -;; 14afb: aa stosb byte ptr [rdi], al -;; 14afc: 800100 add byte ptr [rcx], 0 -;; 14aff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14b08: 800100 add byte ptr [rcx], 0 -;; 14b0b: aa stosb byte ptr [rdi], al -;; 14b0c: 800100 add byte ptr [rcx], 0 -;; 14b0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14b18: 800100 add byte ptr [rcx], 0 -;; 14b1b: aa stosb byte ptr [rdi], al -;; 14b1c: 800100 add byte ptr [rcx], 0 -;; 14b1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14b28: 800100 add byte ptr [rcx], 0 -;; 14b2b: aa stosb byte ptr [rdi], al -;; 14b2c: 800100 add byte ptr [rcx], 0 -;; 14b2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14b38: 800100 add byte ptr [rcx], 0 -;; 14b3b: aa stosb byte ptr [rdi], al -;; 14b3c: 800100 add byte ptr [rcx], 0 -;; 14b3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14b48: 800100 add byte ptr [rcx], 0 -;; 14b4b: aa stosb byte ptr [rdi], al -;; 14b4c: 800100 add byte ptr [rcx], 0 -;; 14b4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14b58: 800100 add byte ptr [rcx], 0 -;; 14b5b: aa stosb byte ptr [rdi], al -;; 14b5c: 800100 add byte ptr [rcx], 0 -;; 14b5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14b68: 800100 add byte ptr [rcx], 0 -;; 14b6b: aa stosb byte ptr [rdi], al -;; 14b6c: 800100 add byte ptr [rcx], 0 -;; 14b6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14b78: 800100 add byte ptr [rcx], 0 -;; 14b7b: aa stosb byte ptr [rdi], al -;; 14b7c: 800100 add byte ptr [rcx], 0 -;; 14b7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14b88: 800100 add byte ptr [rcx], 0 -;; 14b8b: aa stosb byte ptr [rdi], al -;; 14b8c: 800100 add byte ptr [rcx], 0 -;; 14b8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14b98: 800100 add byte ptr [rcx], 0 -;; 14b9b: aa stosb byte ptr [rdi], al -;; 14b9c: 800100 add byte ptr [rcx], 0 -;; 14b9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14ba8: 800100 add byte ptr [rcx], 0 -;; 14bab: aa stosb byte ptr [rdi], al -;; 14bac: 800100 add byte ptr [rcx], 0 -;; 14baf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14bb8: 800100 add byte ptr [rcx], 0 -;; 14bbb: aa stosb byte ptr [rdi], al -;; 14bbc: 800100 add byte ptr [rcx], 0 -;; 14bbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14bc8: 800100 add byte ptr [rcx], 0 -;; 14bcb: aa stosb byte ptr [rdi], al -;; 14bcc: 800100 add byte ptr [rcx], 0 -;; 14bcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14bd8: 800100 add byte ptr [rcx], 0 -;; 14bdb: aa stosb byte ptr [rdi], al -;; 14bdc: 800100 add byte ptr [rcx], 0 -;; 14bdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14be8: 800100 add byte ptr [rcx], 0 -;; 14beb: aa stosb byte ptr [rdi], al -;; 14bec: 800100 add byte ptr [rcx], 0 -;; 14bef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14bf8: 800100 add byte ptr [rcx], 0 -;; 14bfb: aa stosb byte ptr [rdi], al -;; 14bfc: 800100 add byte ptr [rcx], 0 -;; 14bff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14c08: 800100 add byte ptr [rcx], 0 -;; 14c0b: aa stosb byte ptr [rdi], al -;; 14c0c: 800100 add byte ptr [rcx], 0 -;; 14c0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14c18: 800100 add byte ptr [rcx], 0 -;; 14c1b: aa stosb byte ptr [rdi], al -;; 14c1c: 800100 add byte ptr [rcx], 0 -;; 14c1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14c28: 800100 add byte ptr [rcx], 0 -;; 14c2b: aa stosb byte ptr [rdi], al -;; 14c2c: 800100 add byte ptr [rcx], 0 -;; 14c2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14c38: 800100 add byte ptr [rcx], 0 -;; 14c3b: aa stosb byte ptr [rdi], al -;; 14c3c: 800100 add byte ptr [rcx], 0 -;; 14c3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14c48: 800100 add byte ptr [rcx], 0 -;; 14c4b: aa stosb byte ptr [rdi], al -;; 14c4c: 800100 add byte ptr [rcx], 0 -;; 14c4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14c58: 800100 add byte ptr [rcx], 0 -;; 14c5b: aa stosb byte ptr [rdi], al -;; 14c5c: 800100 add byte ptr [rcx], 0 -;; 14c5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14c68: 800100 add byte ptr [rcx], 0 -;; 14c6b: aa stosb byte ptr [rdi], al -;; 14c6c: 800100 add byte ptr [rcx], 0 -;; 14c6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14c78: 800100 add byte ptr [rcx], 0 -;; 14c7b: aa stosb byte ptr [rdi], al -;; 14c7c: 800100 add byte ptr [rcx], 0 -;; 14c7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14c88: 800100 add byte ptr [rcx], 0 -;; 14c8b: aa stosb byte ptr [rdi], al -;; 14c8c: 800100 add byte ptr [rcx], 0 -;; 14c8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14c98: 800100 add byte ptr [rcx], 0 -;; 14c9b: aa stosb byte ptr [rdi], al -;; 14c9c: 800100 add byte ptr [rcx], 0 -;; 14c9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14ca8: 800100 add byte ptr [rcx], 0 -;; 14cab: aa stosb byte ptr [rdi], al -;; 14cac: 800100 add byte ptr [rcx], 0 -;; 14caf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14cb8: 800100 add byte ptr [rcx], 0 -;; 14cbb: aa stosb byte ptr [rdi], al -;; 14cbc: 800100 add byte ptr [rcx], 0 -;; 14cbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14cc8: 800100 add byte ptr [rcx], 0 -;; 14ccb: aa stosb byte ptr [rdi], al -;; 14ccc: 800100 add byte ptr [rcx], 0 -;; 14ccf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14cd8: 800100 add byte ptr [rcx], 0 -;; 14cdb: aa stosb byte ptr [rdi], al -;; 14cdc: 800100 add byte ptr [rcx], 0 -;; 14cdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14ce8: 800100 add byte ptr [rcx], 0 -;; 14ceb: aa stosb byte ptr [rdi], al -;; 14cec: 800100 add byte ptr [rcx], 0 -;; 14cef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14cf8: 800100 add byte ptr [rcx], 0 -;; 14cfb: aa stosb byte ptr [rdi], al -;; 14cfc: 800100 add byte ptr [rcx], 0 -;; 14cff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14d08: 800100 add byte ptr [rcx], 0 -;; 14d0b: aa stosb byte ptr [rdi], al -;; 14d0c: 800100 add byte ptr [rcx], 0 -;; 14d0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14d18: 800100 add byte ptr [rcx], 0 -;; 14d1b: aa stosb byte ptr [rdi], al -;; 14d1c: 800100 add byte ptr [rcx], 0 -;; 14d1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14d28: 800100 add byte ptr [rcx], 0 -;; 14d2b: aa stosb byte ptr [rdi], al -;; 14d2c: 800100 add byte ptr [rcx], 0 -;; 14d2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14d38: 800100 add byte ptr [rcx], 0 -;; 14d3b: aa stosb byte ptr [rdi], al -;; 14d3c: 800100 add byte ptr [rcx], 0 -;; 14d3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14d48: 800100 add byte ptr [rcx], 0 -;; 14d4b: aa stosb byte ptr [rdi], al -;; 14d4c: 800100 add byte ptr [rcx], 0 -;; 14d4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14d58: 800100 add byte ptr [rcx], 0 -;; 14d5b: aa stosb byte ptr [rdi], al -;; 14d5c: 800100 add byte ptr [rcx], 0 -;; 14d5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14d68: 800100 add byte ptr [rcx], 0 -;; 14d6b: aa stosb byte ptr [rdi], al -;; 14d6c: 800100 add byte ptr [rcx], 0 -;; 14d6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14d78: 800100 add byte ptr [rcx], 0 -;; 14d7b: aa stosb byte ptr [rdi], al -;; 14d7c: 800100 add byte ptr [rcx], 0 -;; 14d7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14d88: 800100 add byte ptr [rcx], 0 -;; 14d8b: aa stosb byte ptr [rdi], al -;; 14d8c: 800100 add byte ptr [rcx], 0 -;; 14d8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14d98: 800100 add byte ptr [rcx], 0 -;; 14d9b: aa stosb byte ptr [rdi], al -;; 14d9c: 800100 add byte ptr [rcx], 0 -;; 14d9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14da8: 800100 add byte ptr [rcx], 0 -;; 14dab: aa stosb byte ptr [rdi], al -;; 14dac: 800100 add byte ptr [rcx], 0 -;; 14daf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14db8: 800100 add byte ptr [rcx], 0 -;; 14dbb: aa stosb byte ptr [rdi], al -;; 14dbc: 800100 add byte ptr [rcx], 0 -;; 14dbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14dc8: 800100 add byte ptr [rcx], 0 -;; 14dcb: aa stosb byte ptr [rdi], al -;; 14dcc: 800100 add byte ptr [rcx], 0 -;; 14dcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14dd8: 800100 add byte ptr [rcx], 0 -;; 14ddb: aa stosb byte ptr [rdi], al -;; 14ddc: 800100 add byte ptr [rcx], 0 -;; 14ddf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14de8: 800100 add byte ptr [rcx], 0 -;; 14deb: aa stosb byte ptr [rdi], al -;; 14dec: 800100 add byte ptr [rcx], 0 -;; 14def: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14df8: 800100 add byte ptr [rcx], 0 -;; 14dfb: aa stosb byte ptr [rdi], al -;; 14dfc: 800100 add byte ptr [rcx], 0 -;; 14dff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14e08: 800100 add byte ptr [rcx], 0 -;; 14e0b: aa stosb byte ptr [rdi], al -;; 14e0c: 800100 add byte ptr [rcx], 0 -;; 14e0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14e18: 800100 add byte ptr [rcx], 0 -;; 14e1b: aa stosb byte ptr [rdi], al -;; 14e1c: 800100 add byte ptr [rcx], 0 -;; 14e1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14e28: 800100 add byte ptr [rcx], 0 -;; 14e2b: aa stosb byte ptr [rdi], al -;; 14e2c: 800100 add byte ptr [rcx], 0 -;; 14e2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14e38: 800100 add byte ptr [rcx], 0 -;; 14e3b: aa stosb byte ptr [rdi], al -;; 14e3c: 800100 add byte ptr [rcx], 0 -;; 14e3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14e48: 800100 add byte ptr [rcx], 0 -;; 14e4b: aa stosb byte ptr [rdi], al -;; 14e4c: 800100 add byte ptr [rcx], 0 -;; 14e4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14e58: 800100 add byte ptr [rcx], 0 -;; 14e5b: aa stosb byte ptr [rdi], al -;; 14e5c: 800100 add byte ptr [rcx], 0 -;; 14e5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14e68: 800100 add byte ptr [rcx], 0 -;; 14e6b: aa stosb byte ptr [rdi], al -;; 14e6c: 800100 add byte ptr [rcx], 0 -;; 14e6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14e78: 800100 add byte ptr [rcx], 0 -;; 14e7b: aa stosb byte ptr [rdi], al -;; 14e7c: 800100 add byte ptr [rcx], 0 -;; 14e7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14e88: 800100 add byte ptr [rcx], 0 -;; 14e8b: aa stosb byte ptr [rdi], al -;; 14e8c: 800100 add byte ptr [rcx], 0 -;; 14e8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14e98: 800100 add byte ptr [rcx], 0 -;; 14e9b: aa stosb byte ptr [rdi], al -;; 14e9c: 800100 add byte ptr [rcx], 0 -;; 14e9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14ea8: 800100 add byte ptr [rcx], 0 -;; 14eab: aa stosb byte ptr [rdi], al -;; 14eac: 800100 add byte ptr [rcx], 0 -;; 14eaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14eb8: 800100 add byte ptr [rcx], 0 -;; 14ebb: aa stosb byte ptr [rdi], al -;; 14ebc: 800100 add byte ptr [rcx], 0 -;; 14ebf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14ec8: 800100 add byte ptr [rcx], 0 -;; 14ecb: aa stosb byte ptr [rdi], al -;; 14ecc: 800100 add byte ptr [rcx], 0 -;; 14ecf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14ed8: 800100 add byte ptr [rcx], 0 -;; 14edb: aa stosb byte ptr [rdi], al -;; 14edc: 800100 add byte ptr [rcx], 0 -;; 14edf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14ee8: 800100 add byte ptr [rcx], 0 -;; 14eeb: aa stosb byte ptr [rdi], al -;; 14eec: 800100 add byte ptr [rcx], 0 -;; 14eef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14ef8: 800100 add byte ptr [rcx], 0 -;; 14efb: aa stosb byte ptr [rdi], al -;; 14efc: 800100 add byte ptr [rcx], 0 -;; 14eff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14f08: 800100 add byte ptr [rcx], 0 -;; 14f0b: aa stosb byte ptr [rdi], al -;; 14f0c: 800100 add byte ptr [rcx], 0 -;; 14f0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14f18: 800100 add byte ptr [rcx], 0 -;; 14f1b: aa stosb byte ptr [rdi], al -;; 14f1c: 800100 add byte ptr [rcx], 0 -;; 14f1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14f28: 800100 add byte ptr [rcx], 0 -;; 14f2b: aa stosb byte ptr [rdi], al -;; 14f2c: 800100 add byte ptr [rcx], 0 -;; 14f2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14f38: 800100 add byte ptr [rcx], 0 -;; 14f3b: aa stosb byte ptr [rdi], al -;; 14f3c: 800100 add byte ptr [rcx], 0 -;; 14f3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14f48: 800100 add byte ptr [rcx], 0 -;; 14f4b: aa stosb byte ptr [rdi], al -;; 14f4c: 800100 add byte ptr [rcx], 0 -;; 14f4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14f58: 800100 add byte ptr [rcx], 0 -;; 14f5b: aa stosb byte ptr [rdi], al -;; 14f5c: 800100 add byte ptr [rcx], 0 -;; 14f5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14f68: 800100 add byte ptr [rcx], 0 -;; 14f6b: aa stosb byte ptr [rdi], al -;; 14f6c: 800100 add byte ptr [rcx], 0 -;; 14f6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14f78: 800100 add byte ptr [rcx], 0 -;; 14f7b: aa stosb byte ptr [rdi], al -;; 14f7c: 800100 add byte ptr [rcx], 0 -;; 14f7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14f88: 800100 add byte ptr [rcx], 0 -;; 14f8b: aa stosb byte ptr [rdi], al -;; 14f8c: 800100 add byte ptr [rcx], 0 -;; 14f8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14f98: 800100 add byte ptr [rcx], 0 -;; 14f9b: aa stosb byte ptr [rdi], al -;; 14f9c: 800100 add byte ptr [rcx], 0 -;; 14f9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14fa8: 800100 add byte ptr [rcx], 0 -;; 14fab: aa stosb byte ptr [rdi], al -;; 14fac: 800100 add byte ptr [rcx], 0 -;; 14faf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14fb8: 800100 add byte ptr [rcx], 0 -;; 14fbb: aa stosb byte ptr [rdi], al -;; 14fbc: 800100 add byte ptr [rcx], 0 -;; 14fbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14fc8: 800100 add byte ptr [rcx], 0 -;; 14fcb: aa stosb byte ptr [rdi], al -;; 14fcc: 800100 add byte ptr [rcx], 0 -;; 14fcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14fd8: 800100 add byte ptr [rcx], 0 -;; 14fdb: aa stosb byte ptr [rdi], al -;; 14fdc: 800100 add byte ptr [rcx], 0 -;; 14fdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14fe8: 800100 add byte ptr [rcx], 0 -;; 14feb: aa stosb byte ptr [rdi], al -;; 14fec: 800100 add byte ptr [rcx], 0 -;; 14fef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 14ff8: 800100 add byte ptr [rcx], 0 -;; 14ffb: aa stosb byte ptr [rdi], al -;; 14ffc: 800100 add byte ptr [rcx], 0 -;; 14fff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15008: 800100 add byte ptr [rcx], 0 -;; 1500b: aa stosb byte ptr [rdi], al -;; 1500c: 800100 add byte ptr [rcx], 0 -;; 1500f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15018: 800100 add byte ptr [rcx], 0 -;; 1501b: aa stosb byte ptr [rdi], al -;; 1501c: 800100 add byte ptr [rcx], 0 -;; 1501f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15028: 800100 add byte ptr [rcx], 0 -;; 1502b: aa stosb byte ptr [rdi], al -;; 1502c: 800100 add byte ptr [rcx], 0 -;; 1502f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15038: 800100 add byte ptr [rcx], 0 -;; 1503b: aa stosb byte ptr [rdi], al -;; 1503c: 800100 add byte ptr [rcx], 0 -;; 1503f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15048: 800100 add byte ptr [rcx], 0 -;; 1504b: aa stosb byte ptr [rdi], al -;; 1504c: 800100 add byte ptr [rcx], 0 -;; 1504f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15058: 800100 add byte ptr [rcx], 0 -;; 1505b: aa stosb byte ptr [rdi], al -;; 1505c: 800100 add byte ptr [rcx], 0 -;; 1505f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15068: 800100 add byte ptr [rcx], 0 -;; 1506b: aa stosb byte ptr [rdi], al -;; 1506c: 800100 add byte ptr [rcx], 0 -;; 1506f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15078: 800100 add byte ptr [rcx], 0 -;; 1507b: aa stosb byte ptr [rdi], al -;; 1507c: 800100 add byte ptr [rcx], 0 -;; 1507f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15088: 800100 add byte ptr [rcx], 0 -;; 1508b: aa stosb byte ptr [rdi], al -;; 1508c: 800100 add byte ptr [rcx], 0 -;; 1508f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15098: 800100 add byte ptr [rcx], 0 -;; 1509b: aa stosb byte ptr [rdi], al -;; 1509c: 800100 add byte ptr [rcx], 0 -;; 1509f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 150a8: 800100 add byte ptr [rcx], 0 -;; 150ab: aa stosb byte ptr [rdi], al -;; 150ac: 800100 add byte ptr [rcx], 0 -;; 150af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 150b8: 800100 add byte ptr [rcx], 0 -;; 150bb: aa stosb byte ptr [rdi], al -;; 150bc: 800100 add byte ptr [rcx], 0 -;; 150bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 150c8: 800100 add byte ptr [rcx], 0 -;; 150cb: aa stosb byte ptr [rdi], al -;; 150cc: 800100 add byte ptr [rcx], 0 -;; 150cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 150d8: 800100 add byte ptr [rcx], 0 -;; 150db: aa stosb byte ptr [rdi], al -;; 150dc: 800100 add byte ptr [rcx], 0 -;; 150df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 150e8: 800100 add byte ptr [rcx], 0 -;; 150eb: aa stosb byte ptr [rdi], al -;; 150ec: 800100 add byte ptr [rcx], 0 -;; 150ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 150f8: 800100 add byte ptr [rcx], 0 -;; 150fb: aa stosb byte ptr [rdi], al -;; 150fc: 800100 add byte ptr [rcx], 0 -;; 150ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15108: 800100 add byte ptr [rcx], 0 -;; 1510b: aa stosb byte ptr [rdi], al -;; 1510c: 800100 add byte ptr [rcx], 0 -;; 1510f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15118: 800100 add byte ptr [rcx], 0 -;; 1511b: aa stosb byte ptr [rdi], al -;; 1511c: 800100 add byte ptr [rcx], 0 -;; 1511f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15128: 800100 add byte ptr [rcx], 0 -;; 1512b: aa stosb byte ptr [rdi], al -;; 1512c: 800100 add byte ptr [rcx], 0 -;; 1512f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15138: 800100 add byte ptr [rcx], 0 -;; 1513b: aa stosb byte ptr [rdi], al -;; 1513c: 800100 add byte ptr [rcx], 0 -;; 1513f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15148: 800100 add byte ptr [rcx], 0 -;; 1514b: aa stosb byte ptr [rdi], al -;; 1514c: 800100 add byte ptr [rcx], 0 -;; 1514f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15158: 800100 add byte ptr [rcx], 0 -;; 1515b: aa stosb byte ptr [rdi], al -;; 1515c: 800100 add byte ptr [rcx], 0 -;; 1515f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15168: 800100 add byte ptr [rcx], 0 -;; 1516b: aa stosb byte ptr [rdi], al -;; 1516c: 800100 add byte ptr [rcx], 0 -;; 1516f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15178: 800100 add byte ptr [rcx], 0 -;; 1517b: aa stosb byte ptr [rdi], al -;; 1517c: 800100 add byte ptr [rcx], 0 -;; 1517f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15188: 800100 add byte ptr [rcx], 0 -;; 1518b: aa stosb byte ptr [rdi], al -;; 1518c: 800100 add byte ptr [rcx], 0 -;; 1518f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15198: 800100 add byte ptr [rcx], 0 -;; 1519b: aa stosb byte ptr [rdi], al -;; 1519c: 800100 add byte ptr [rcx], 0 -;; 1519f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 151a8: 800100 add byte ptr [rcx], 0 -;; 151ab: aa stosb byte ptr [rdi], al -;; 151ac: 800100 add byte ptr [rcx], 0 -;; 151af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 151b8: 800100 add byte ptr [rcx], 0 -;; 151bb: aa stosb byte ptr [rdi], al -;; 151bc: 800100 add byte ptr [rcx], 0 -;; 151bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 151c8: 800100 add byte ptr [rcx], 0 -;; 151cb: aa stosb byte ptr [rdi], al -;; 151cc: 800100 add byte ptr [rcx], 0 -;; 151cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 151d8: 800100 add byte ptr [rcx], 0 -;; 151db: aa stosb byte ptr [rdi], al -;; 151dc: 800100 add byte ptr [rcx], 0 -;; 151df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 151e8: 800100 add byte ptr [rcx], 0 -;; 151eb: aa stosb byte ptr [rdi], al -;; 151ec: 800100 add byte ptr [rcx], 0 -;; 151ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 151f8: 800100 add byte ptr [rcx], 0 -;; 151fb: aa stosb byte ptr [rdi], al -;; 151fc: 800100 add byte ptr [rcx], 0 -;; 151ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15208: 800100 add byte ptr [rcx], 0 -;; 1520b: aa stosb byte ptr [rdi], al -;; 1520c: 800100 add byte ptr [rcx], 0 -;; 1520f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15218: 800100 add byte ptr [rcx], 0 -;; 1521b: aa stosb byte ptr [rdi], al -;; 1521c: 800100 add byte ptr [rcx], 0 -;; 1521f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15228: 800100 add byte ptr [rcx], 0 -;; 1522b: aa stosb byte ptr [rdi], al -;; 1522c: 800100 add byte ptr [rcx], 0 -;; 1522f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15238: 800100 add byte ptr [rcx], 0 -;; 1523b: aa stosb byte ptr [rdi], al -;; 1523c: 800100 add byte ptr [rcx], 0 -;; 1523f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15248: 800100 add byte ptr [rcx], 0 -;; 1524b: aa stosb byte ptr [rdi], al -;; 1524c: 800100 add byte ptr [rcx], 0 -;; 1524f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15258: 800100 add byte ptr [rcx], 0 -;; 1525b: aa stosb byte ptr [rdi], al -;; 1525c: 800100 add byte ptr [rcx], 0 -;; 1525f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15268: 800100 add byte ptr [rcx], 0 -;; 1526b: aa stosb byte ptr [rdi], al -;; 1526c: 800100 add byte ptr [rcx], 0 -;; 1526f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15278: 800100 add byte ptr [rcx], 0 -;; 1527b: aa stosb byte ptr [rdi], al -;; 1527c: 800100 add byte ptr [rcx], 0 -;; 1527f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15288: 800100 add byte ptr [rcx], 0 -;; 1528b: aa stosb byte ptr [rdi], al -;; 1528c: 800100 add byte ptr [rcx], 0 -;; 1528f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15298: 800100 add byte ptr [rcx], 0 -;; 1529b: aa stosb byte ptr [rdi], al -;; 1529c: 800100 add byte ptr [rcx], 0 -;; 1529f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 152a8: 800100 add byte ptr [rcx], 0 -;; 152ab: aa stosb byte ptr [rdi], al -;; 152ac: 800100 add byte ptr [rcx], 0 -;; 152af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 152b8: 800100 add byte ptr [rcx], 0 -;; 152bb: aa stosb byte ptr [rdi], al -;; 152bc: 800100 add byte ptr [rcx], 0 -;; 152bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 152c8: 800100 add byte ptr [rcx], 0 -;; 152cb: aa stosb byte ptr [rdi], al -;; 152cc: 800100 add byte ptr [rcx], 0 -;; 152cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 152d8: 800100 add byte ptr [rcx], 0 -;; 152db: aa stosb byte ptr [rdi], al -;; 152dc: 800100 add byte ptr [rcx], 0 -;; 152df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 152e8: 800100 add byte ptr [rcx], 0 -;; 152eb: aa stosb byte ptr [rdi], al -;; 152ec: 800100 add byte ptr [rcx], 0 -;; 152ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 152f8: 800100 add byte ptr [rcx], 0 -;; 152fb: aa stosb byte ptr [rdi], al -;; 152fc: 800100 add byte ptr [rcx], 0 -;; 152ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15308: 800100 add byte ptr [rcx], 0 -;; 1530b: aa stosb byte ptr [rdi], al -;; 1530c: 800100 add byte ptr [rcx], 0 -;; 1530f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15318: 800100 add byte ptr [rcx], 0 -;; 1531b: aa stosb byte ptr [rdi], al -;; 1531c: 800100 add byte ptr [rcx], 0 -;; 1531f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15328: 800100 add byte ptr [rcx], 0 -;; 1532b: aa stosb byte ptr [rdi], al -;; 1532c: 800100 add byte ptr [rcx], 0 -;; 1532f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15338: 800100 add byte ptr [rcx], 0 -;; 1533b: aa stosb byte ptr [rdi], al -;; 1533c: 800100 add byte ptr [rcx], 0 -;; 1533f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15348: 800100 add byte ptr [rcx], 0 -;; 1534b: aa stosb byte ptr [rdi], al -;; 1534c: 800100 add byte ptr [rcx], 0 -;; 1534f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15358: 800100 add byte ptr [rcx], 0 -;; 1535b: aa stosb byte ptr [rdi], al -;; 1535c: 800100 add byte ptr [rcx], 0 -;; 1535f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15368: 800100 add byte ptr [rcx], 0 -;; 1536b: aa stosb byte ptr [rdi], al -;; 1536c: 800100 add byte ptr [rcx], 0 -;; 1536f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15378: 800100 add byte ptr [rcx], 0 -;; 1537b: aa stosb byte ptr [rdi], al -;; 1537c: 800100 add byte ptr [rcx], 0 -;; 1537f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15388: 800100 add byte ptr [rcx], 0 -;; 1538b: aa stosb byte ptr [rdi], al -;; 1538c: 800100 add byte ptr [rcx], 0 -;; 1538f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15398: 800100 add byte ptr [rcx], 0 -;; 1539b: aa stosb byte ptr [rdi], al -;; 1539c: 800100 add byte ptr [rcx], 0 -;; 1539f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 153a8: 800100 add byte ptr [rcx], 0 -;; 153ab: aa stosb byte ptr [rdi], al -;; 153ac: 800100 add byte ptr [rcx], 0 -;; 153af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 153b8: 800100 add byte ptr [rcx], 0 -;; 153bb: aa stosb byte ptr [rdi], al -;; 153bc: 800100 add byte ptr [rcx], 0 -;; 153bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 153c8: 800100 add byte ptr [rcx], 0 -;; 153cb: aa stosb byte ptr [rdi], al -;; 153cc: 800100 add byte ptr [rcx], 0 -;; 153cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 153d8: 800100 add byte ptr [rcx], 0 -;; 153db: aa stosb byte ptr [rdi], al -;; 153dc: 800100 add byte ptr [rcx], 0 -;; 153df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 153e8: 800100 add byte ptr [rcx], 0 -;; 153eb: aa stosb byte ptr [rdi], al -;; 153ec: 800100 add byte ptr [rcx], 0 -;; 153ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 153f8: 800100 add byte ptr [rcx], 0 -;; 153fb: aa stosb byte ptr [rdi], al -;; 153fc: 800100 add byte ptr [rcx], 0 -;; 153ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15408: 800100 add byte ptr [rcx], 0 -;; 1540b: aa stosb byte ptr [rdi], al -;; 1540c: 800100 add byte ptr [rcx], 0 -;; 1540f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15418: 800100 add byte ptr [rcx], 0 -;; 1541b: aa stosb byte ptr [rdi], al -;; 1541c: 800100 add byte ptr [rcx], 0 -;; 1541f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15428: 800100 add byte ptr [rcx], 0 -;; 1542b: aa stosb byte ptr [rdi], al -;; 1542c: 800100 add byte ptr [rcx], 0 -;; 1542f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15438: 800100 add byte ptr [rcx], 0 -;; 1543b: aa stosb byte ptr [rdi], al -;; 1543c: 800100 add byte ptr [rcx], 0 -;; 1543f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15448: 800100 add byte ptr [rcx], 0 -;; 1544b: aa stosb byte ptr [rdi], al -;; 1544c: 800100 add byte ptr [rcx], 0 -;; 1544f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15458: 800100 add byte ptr [rcx], 0 -;; 1545b: aa stosb byte ptr [rdi], al -;; 1545c: 800100 add byte ptr [rcx], 0 -;; 1545f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15468: 800100 add byte ptr [rcx], 0 -;; 1546b: aa stosb byte ptr [rdi], al -;; 1546c: 800100 add byte ptr [rcx], 0 -;; 1546f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15478: 800100 add byte ptr [rcx], 0 -;; 1547b: aa stosb byte ptr [rdi], al -;; 1547c: 800100 add byte ptr [rcx], 0 -;; 1547f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15488: 800100 add byte ptr [rcx], 0 -;; 1548b: aa stosb byte ptr [rdi], al -;; 1548c: 800100 add byte ptr [rcx], 0 -;; 1548f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15498: 800100 add byte ptr [rcx], 0 -;; 1549b: aa stosb byte ptr [rdi], al -;; 1549c: 800100 add byte ptr [rcx], 0 -;; 1549f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 154a8: 800100 add byte ptr [rcx], 0 -;; 154ab: aa stosb byte ptr [rdi], al -;; 154ac: 800100 add byte ptr [rcx], 0 -;; 154af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 154b8: 800100 add byte ptr [rcx], 0 -;; 154bb: aa stosb byte ptr [rdi], al -;; 154bc: 800100 add byte ptr [rcx], 0 -;; 154bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 154c8: 800100 add byte ptr [rcx], 0 -;; 154cb: aa stosb byte ptr [rdi], al -;; 154cc: 800100 add byte ptr [rcx], 0 -;; 154cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 154d8: 800100 add byte ptr [rcx], 0 -;; 154db: aa stosb byte ptr [rdi], al -;; 154dc: 800100 add byte ptr [rcx], 0 -;; 154df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 154e8: 800100 add byte ptr [rcx], 0 -;; 154eb: aa stosb byte ptr [rdi], al -;; 154ec: 800100 add byte ptr [rcx], 0 -;; 154ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 154f8: 800100 add byte ptr [rcx], 0 -;; 154fb: aa stosb byte ptr [rdi], al -;; 154fc: 800100 add byte ptr [rcx], 0 -;; 154ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15508: 800100 add byte ptr [rcx], 0 -;; 1550b: aa stosb byte ptr [rdi], al -;; 1550c: 800100 add byte ptr [rcx], 0 -;; 1550f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15518: 800100 add byte ptr [rcx], 0 -;; 1551b: aa stosb byte ptr [rdi], al -;; 1551c: 800100 add byte ptr [rcx], 0 -;; 1551f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15528: 800100 add byte ptr [rcx], 0 -;; 1552b: aa stosb byte ptr [rdi], al -;; 1552c: 800100 add byte ptr [rcx], 0 -;; 1552f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15538: 800100 add byte ptr [rcx], 0 -;; 1553b: aa stosb byte ptr [rdi], al -;; 1553c: 800100 add byte ptr [rcx], 0 -;; 1553f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15548: 800100 add byte ptr [rcx], 0 -;; 1554b: aa stosb byte ptr [rdi], al -;; 1554c: 800100 add byte ptr [rcx], 0 -;; 1554f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15558: 800100 add byte ptr [rcx], 0 -;; 1555b: aa stosb byte ptr [rdi], al -;; 1555c: 800100 add byte ptr [rcx], 0 -;; 1555f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15568: 800100 add byte ptr [rcx], 0 -;; 1556b: aa stosb byte ptr [rdi], al -;; 1556c: 800100 add byte ptr [rcx], 0 -;; 1556f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15578: 800100 add byte ptr [rcx], 0 -;; 1557b: aa stosb byte ptr [rdi], al -;; 1557c: 800100 add byte ptr [rcx], 0 -;; 1557f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15588: 800100 add byte ptr [rcx], 0 -;; 1558b: aa stosb byte ptr [rdi], al -;; 1558c: 800100 add byte ptr [rcx], 0 -;; 1558f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15598: 800100 add byte ptr [rcx], 0 -;; 1559b: aa stosb byte ptr [rdi], al -;; 1559c: 800100 add byte ptr [rcx], 0 -;; 1559f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 155a8: 800100 add byte ptr [rcx], 0 -;; 155ab: aa stosb byte ptr [rdi], al -;; 155ac: 800100 add byte ptr [rcx], 0 -;; 155af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 155b8: 800100 add byte ptr [rcx], 0 -;; 155bb: aa stosb byte ptr [rdi], al -;; 155bc: 800100 add byte ptr [rcx], 0 -;; 155bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 155c8: 800100 add byte ptr [rcx], 0 -;; 155cb: aa stosb byte ptr [rdi], al -;; 155cc: 800100 add byte ptr [rcx], 0 -;; 155cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 155d8: 800100 add byte ptr [rcx], 0 -;; 155db: aa stosb byte ptr [rdi], al -;; 155dc: 800100 add byte ptr [rcx], 0 -;; 155df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 155e8: 800100 add byte ptr [rcx], 0 -;; 155eb: aa stosb byte ptr [rdi], al -;; 155ec: 800100 add byte ptr [rcx], 0 -;; 155ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 155f8: 800100 add byte ptr [rcx], 0 -;; 155fb: aa stosb byte ptr [rdi], al -;; 155fc: 800100 add byte ptr [rcx], 0 -;; 155ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15608: 800100 add byte ptr [rcx], 0 -;; 1560b: aa stosb byte ptr [rdi], al -;; 1560c: 800100 add byte ptr [rcx], 0 -;; 1560f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15618: 800100 add byte ptr [rcx], 0 -;; 1561b: aa stosb byte ptr [rdi], al -;; 1561c: 800100 add byte ptr [rcx], 0 -;; 1561f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15628: 800100 add byte ptr [rcx], 0 -;; 1562b: aa stosb byte ptr [rdi], al -;; 1562c: 800100 add byte ptr [rcx], 0 -;; 1562f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15638: 800100 add byte ptr [rcx], 0 -;; 1563b: aa stosb byte ptr [rdi], al -;; 1563c: 800100 add byte ptr [rcx], 0 -;; 1563f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15648: 800100 add byte ptr [rcx], 0 -;; 1564b: aa stosb byte ptr [rdi], al -;; 1564c: 800100 add byte ptr [rcx], 0 -;; 1564f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15658: 800100 add byte ptr [rcx], 0 -;; 1565b: aa stosb byte ptr [rdi], al -;; 1565c: 800100 add byte ptr [rcx], 0 -;; 1565f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15668: 800100 add byte ptr [rcx], 0 -;; 1566b: aa stosb byte ptr [rdi], al -;; 1566c: 800100 add byte ptr [rcx], 0 -;; 1566f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15678: 800100 add byte ptr [rcx], 0 -;; 1567b: aa stosb byte ptr [rdi], al -;; 1567c: 800100 add byte ptr [rcx], 0 -;; 1567f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15688: 800100 add byte ptr [rcx], 0 -;; 1568b: aa stosb byte ptr [rdi], al -;; 1568c: 800100 add byte ptr [rcx], 0 -;; 1568f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15698: 800100 add byte ptr [rcx], 0 -;; 1569b: aa stosb byte ptr [rdi], al -;; 1569c: 800100 add byte ptr [rcx], 0 -;; 1569f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 156a8: 800100 add byte ptr [rcx], 0 -;; 156ab: aa stosb byte ptr [rdi], al -;; 156ac: 800100 add byte ptr [rcx], 0 -;; 156af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 156b8: 800100 add byte ptr [rcx], 0 -;; 156bb: aa stosb byte ptr [rdi], al -;; 156bc: 800100 add byte ptr [rcx], 0 -;; 156bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 156c8: 800100 add byte ptr [rcx], 0 -;; 156cb: aa stosb byte ptr [rdi], al -;; 156cc: 800100 add byte ptr [rcx], 0 -;; 156cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 156d8: 800100 add byte ptr [rcx], 0 -;; 156db: aa stosb byte ptr [rdi], al -;; 156dc: 800100 add byte ptr [rcx], 0 -;; 156df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 156e8: 800100 add byte ptr [rcx], 0 -;; 156eb: aa stosb byte ptr [rdi], al -;; 156ec: 800100 add byte ptr [rcx], 0 -;; 156ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 156f8: 800100 add byte ptr [rcx], 0 -;; 156fb: aa stosb byte ptr [rdi], al -;; 156fc: 800100 add byte ptr [rcx], 0 -;; 156ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15708: 800100 add byte ptr [rcx], 0 -;; 1570b: aa stosb byte ptr [rdi], al -;; 1570c: 800100 add byte ptr [rcx], 0 -;; 1570f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15718: 800100 add byte ptr [rcx], 0 -;; 1571b: aa stosb byte ptr [rdi], al -;; 1571c: 800100 add byte ptr [rcx], 0 -;; 1571f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15728: 800100 add byte ptr [rcx], 0 -;; 1572b: aa stosb byte ptr [rdi], al -;; 1572c: 800100 add byte ptr [rcx], 0 -;; 1572f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15738: 800100 add byte ptr [rcx], 0 -;; 1573b: aa stosb byte ptr [rdi], al -;; 1573c: 800100 add byte ptr [rcx], 0 -;; 1573f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15748: 800100 add byte ptr [rcx], 0 -;; 1574b: aa stosb byte ptr [rdi], al -;; 1574c: 800100 add byte ptr [rcx], 0 -;; 1574f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15758: 800100 add byte ptr [rcx], 0 -;; 1575b: aa stosb byte ptr [rdi], al -;; 1575c: 800100 add byte ptr [rcx], 0 -;; 1575f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15768: 800100 add byte ptr [rcx], 0 -;; 1576b: aa stosb byte ptr [rdi], al -;; 1576c: 800100 add byte ptr [rcx], 0 -;; 1576f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15778: 800100 add byte ptr [rcx], 0 -;; 1577b: aa stosb byte ptr [rdi], al -;; 1577c: 800100 add byte ptr [rcx], 0 -;; 1577f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15788: 800100 add byte ptr [rcx], 0 -;; 1578b: aa stosb byte ptr [rdi], al -;; 1578c: 800100 add byte ptr [rcx], 0 -;; 1578f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15798: 800100 add byte ptr [rcx], 0 -;; 1579b: aa stosb byte ptr [rdi], al -;; 1579c: 800100 add byte ptr [rcx], 0 -;; 1579f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 157a8: 800100 add byte ptr [rcx], 0 -;; 157ab: aa stosb byte ptr [rdi], al -;; 157ac: 800100 add byte ptr [rcx], 0 -;; 157af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 157b8: 800100 add byte ptr [rcx], 0 -;; 157bb: aa stosb byte ptr [rdi], al -;; 157bc: 800100 add byte ptr [rcx], 0 -;; 157bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 157c8: 800100 add byte ptr [rcx], 0 -;; 157cb: aa stosb byte ptr [rdi], al -;; 157cc: 800100 add byte ptr [rcx], 0 -;; 157cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 157d8: 800100 add byte ptr [rcx], 0 -;; 157db: aa stosb byte ptr [rdi], al -;; 157dc: 800100 add byte ptr [rcx], 0 -;; 157df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 157e8: 800100 add byte ptr [rcx], 0 -;; 157eb: aa stosb byte ptr [rdi], al -;; 157ec: 800100 add byte ptr [rcx], 0 -;; 157ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 157f8: 800100 add byte ptr [rcx], 0 -;; 157fb: aa stosb byte ptr [rdi], al -;; 157fc: 800100 add byte ptr [rcx], 0 -;; 157ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15808: 800100 add byte ptr [rcx], 0 -;; 1580b: aa stosb byte ptr [rdi], al -;; 1580c: 800100 add byte ptr [rcx], 0 -;; 1580f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15818: 800100 add byte ptr [rcx], 0 -;; 1581b: aa stosb byte ptr [rdi], al -;; 1581c: 800100 add byte ptr [rcx], 0 -;; 1581f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15828: 800100 add byte ptr [rcx], 0 -;; 1582b: aa stosb byte ptr [rdi], al -;; 1582c: 800100 add byte ptr [rcx], 0 -;; 1582f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15838: 800100 add byte ptr [rcx], 0 -;; 1583b: aa stosb byte ptr [rdi], al -;; 1583c: 800100 add byte ptr [rcx], 0 -;; 1583f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15848: 800100 add byte ptr [rcx], 0 -;; 1584b: aa stosb byte ptr [rdi], al -;; 1584c: 800100 add byte ptr [rcx], 0 -;; 1584f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15858: 800100 add byte ptr [rcx], 0 -;; 1585b: aa stosb byte ptr [rdi], al -;; 1585c: 800100 add byte ptr [rcx], 0 -;; 1585f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15868: 800100 add byte ptr [rcx], 0 -;; 1586b: aa stosb byte ptr [rdi], al -;; 1586c: 800100 add byte ptr [rcx], 0 -;; 1586f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15878: 800100 add byte ptr [rcx], 0 -;; 1587b: aa stosb byte ptr [rdi], al -;; 1587c: 800100 add byte ptr [rcx], 0 -;; 1587f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15888: 800100 add byte ptr [rcx], 0 -;; 1588b: aa stosb byte ptr [rdi], al -;; 1588c: 800100 add byte ptr [rcx], 0 -;; 1588f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15898: 800100 add byte ptr [rcx], 0 -;; 1589b: aa stosb byte ptr [rdi], al -;; 1589c: 800100 add byte ptr [rcx], 0 -;; 1589f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 158a8: 800100 add byte ptr [rcx], 0 -;; 158ab: aa stosb byte ptr [rdi], al -;; 158ac: 800100 add byte ptr [rcx], 0 -;; 158af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 158b8: 800100 add byte ptr [rcx], 0 -;; 158bb: aa stosb byte ptr [rdi], al -;; 158bc: 800100 add byte ptr [rcx], 0 -;; 158bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 158c8: 800100 add byte ptr [rcx], 0 -;; 158cb: aa stosb byte ptr [rdi], al -;; 158cc: 800100 add byte ptr [rcx], 0 -;; 158cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 158d8: 800100 add byte ptr [rcx], 0 -;; 158db: aa stosb byte ptr [rdi], al -;; 158dc: 800100 add byte ptr [rcx], 0 -;; 158df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 158e8: 800100 add byte ptr [rcx], 0 -;; 158eb: aa stosb byte ptr [rdi], al -;; 158ec: 800100 add byte ptr [rcx], 0 -;; 158ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 158f8: 800100 add byte ptr [rcx], 0 -;; 158fb: aa stosb byte ptr [rdi], al -;; 158fc: 800100 add byte ptr [rcx], 0 -;; 158ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15908: 800100 add byte ptr [rcx], 0 -;; 1590b: aa stosb byte ptr [rdi], al -;; 1590c: 800100 add byte ptr [rcx], 0 -;; 1590f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15918: 800100 add byte ptr [rcx], 0 -;; 1591b: aa stosb byte ptr [rdi], al -;; 1591c: 800100 add byte ptr [rcx], 0 -;; 1591f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15928: 800100 add byte ptr [rcx], 0 -;; 1592b: aa stosb byte ptr [rdi], al -;; 1592c: 800100 add byte ptr [rcx], 0 -;; 1592f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15938: 800100 add byte ptr [rcx], 0 -;; 1593b: aa stosb byte ptr [rdi], al -;; 1593c: 800100 add byte ptr [rcx], 0 -;; 1593f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15948: 800100 add byte ptr [rcx], 0 -;; 1594b: aa stosb byte ptr [rdi], al -;; 1594c: 800100 add byte ptr [rcx], 0 -;; 1594f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15958: 800100 add byte ptr [rcx], 0 -;; 1595b: aa stosb byte ptr [rdi], al -;; 1595c: 800100 add byte ptr [rcx], 0 -;; 1595f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15968: 800100 add byte ptr [rcx], 0 -;; 1596b: aa stosb byte ptr [rdi], al -;; 1596c: 800100 add byte ptr [rcx], 0 -;; 1596f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15978: 800100 add byte ptr [rcx], 0 -;; 1597b: aa stosb byte ptr [rdi], al -;; 1597c: 800100 add byte ptr [rcx], 0 -;; 1597f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15988: 800100 add byte ptr [rcx], 0 -;; 1598b: aa stosb byte ptr [rdi], al -;; 1598c: 800100 add byte ptr [rcx], 0 -;; 1598f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15998: 800100 add byte ptr [rcx], 0 -;; 1599b: aa stosb byte ptr [rdi], al -;; 1599c: 800100 add byte ptr [rcx], 0 -;; 1599f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 159a8: 800100 add byte ptr [rcx], 0 -;; 159ab: aa stosb byte ptr [rdi], al -;; 159ac: 800100 add byte ptr [rcx], 0 -;; 159af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 159b8: 800100 add byte ptr [rcx], 0 -;; 159bb: aa stosb byte ptr [rdi], al -;; 159bc: 800100 add byte ptr [rcx], 0 -;; 159bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 159c8: 800100 add byte ptr [rcx], 0 -;; 159cb: aa stosb byte ptr [rdi], al -;; 159cc: 800100 add byte ptr [rcx], 0 -;; 159cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 159d8: 800100 add byte ptr [rcx], 0 -;; 159db: aa stosb byte ptr [rdi], al -;; 159dc: 800100 add byte ptr [rcx], 0 -;; 159df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 159e8: 800100 add byte ptr [rcx], 0 -;; 159eb: aa stosb byte ptr [rdi], al -;; 159ec: 800100 add byte ptr [rcx], 0 -;; 159ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 159f8: 800100 add byte ptr [rcx], 0 -;; 159fb: aa stosb byte ptr [rdi], al -;; 159fc: 800100 add byte ptr [rcx], 0 -;; 159ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15a08: 800100 add byte ptr [rcx], 0 -;; 15a0b: aa stosb byte ptr [rdi], al -;; 15a0c: 800100 add byte ptr [rcx], 0 -;; 15a0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15a18: 800100 add byte ptr [rcx], 0 -;; 15a1b: aa stosb byte ptr [rdi], al -;; 15a1c: 800100 add byte ptr [rcx], 0 -;; 15a1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15a28: 800100 add byte ptr [rcx], 0 -;; 15a2b: aa stosb byte ptr [rdi], al -;; 15a2c: 800100 add byte ptr [rcx], 0 -;; 15a2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15a38: 800100 add byte ptr [rcx], 0 -;; 15a3b: aa stosb byte ptr [rdi], al -;; 15a3c: 800100 add byte ptr [rcx], 0 -;; 15a3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15a48: 800100 add byte ptr [rcx], 0 -;; 15a4b: aa stosb byte ptr [rdi], al -;; 15a4c: 800100 add byte ptr [rcx], 0 -;; 15a4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15a58: 800100 add byte ptr [rcx], 0 -;; 15a5b: aa stosb byte ptr [rdi], al -;; 15a5c: 800100 add byte ptr [rcx], 0 -;; 15a5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15a68: 800100 add byte ptr [rcx], 0 -;; 15a6b: aa stosb byte ptr [rdi], al -;; 15a6c: 800100 add byte ptr [rcx], 0 -;; 15a6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15a78: 800100 add byte ptr [rcx], 0 -;; 15a7b: aa stosb byte ptr [rdi], al -;; 15a7c: 800100 add byte ptr [rcx], 0 -;; 15a7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15a88: 800100 add byte ptr [rcx], 0 -;; 15a8b: aa stosb byte ptr [rdi], al -;; 15a8c: 800100 add byte ptr [rcx], 0 -;; 15a8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15a98: 800100 add byte ptr [rcx], 0 -;; 15a9b: aa stosb byte ptr [rdi], al -;; 15a9c: 800100 add byte ptr [rcx], 0 -;; 15a9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15aa8: 800100 add byte ptr [rcx], 0 -;; 15aab: aa stosb byte ptr [rdi], al -;; 15aac: 800100 add byte ptr [rcx], 0 -;; 15aaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15ab8: 800100 add byte ptr [rcx], 0 -;; 15abb: aa stosb byte ptr [rdi], al -;; 15abc: 800100 add byte ptr [rcx], 0 -;; 15abf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15ac8: 800100 add byte ptr [rcx], 0 -;; 15acb: aa stosb byte ptr [rdi], al -;; 15acc: 800100 add byte ptr [rcx], 0 -;; 15acf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15ad8: 800100 add byte ptr [rcx], 0 -;; 15adb: aa stosb byte ptr [rdi], al -;; 15adc: 800100 add byte ptr [rcx], 0 -;; 15adf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15ae8: 800100 add byte ptr [rcx], 0 -;; 15aeb: aa stosb byte ptr [rdi], al -;; 15aec: 800100 add byte ptr [rcx], 0 -;; 15aef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15af8: 800100 add byte ptr [rcx], 0 -;; 15afb: aa stosb byte ptr [rdi], al -;; 15afc: 800100 add byte ptr [rcx], 0 -;; 15aff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15b08: 800100 add byte ptr [rcx], 0 -;; 15b0b: aa stosb byte ptr [rdi], al -;; 15b0c: 800100 add byte ptr [rcx], 0 -;; 15b0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15b18: 800100 add byte ptr [rcx], 0 -;; 15b1b: aa stosb byte ptr [rdi], al -;; 15b1c: 800100 add byte ptr [rcx], 0 -;; 15b1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15b28: 800100 add byte ptr [rcx], 0 -;; 15b2b: aa stosb byte ptr [rdi], al -;; 15b2c: 800100 add byte ptr [rcx], 0 -;; 15b2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15b38: 800100 add byte ptr [rcx], 0 -;; 15b3b: aa stosb byte ptr [rdi], al -;; 15b3c: 800100 add byte ptr [rcx], 0 -;; 15b3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15b48: 800100 add byte ptr [rcx], 0 -;; 15b4b: aa stosb byte ptr [rdi], al -;; 15b4c: 800100 add byte ptr [rcx], 0 -;; 15b4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15b58: 800100 add byte ptr [rcx], 0 -;; 15b5b: aa stosb byte ptr [rdi], al -;; 15b5c: 800100 add byte ptr [rcx], 0 -;; 15b5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15b68: 800100 add byte ptr [rcx], 0 -;; 15b6b: aa stosb byte ptr [rdi], al -;; 15b6c: 800100 add byte ptr [rcx], 0 -;; 15b6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15b78: 800100 add byte ptr [rcx], 0 -;; 15b7b: aa stosb byte ptr [rdi], al -;; 15b7c: 800100 add byte ptr [rcx], 0 -;; 15b7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15b88: 800100 add byte ptr [rcx], 0 -;; 15b8b: aa stosb byte ptr [rdi], al -;; 15b8c: 800100 add byte ptr [rcx], 0 -;; 15b8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15b98: 800100 add byte ptr [rcx], 0 -;; 15b9b: aa stosb byte ptr [rdi], al -;; 15b9c: 800100 add byte ptr [rcx], 0 -;; 15b9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15ba8: 800100 add byte ptr [rcx], 0 -;; 15bab: aa stosb byte ptr [rdi], al -;; 15bac: 800100 add byte ptr [rcx], 0 -;; 15baf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15bb8: 800100 add byte ptr [rcx], 0 -;; 15bbb: aa stosb byte ptr [rdi], al -;; 15bbc: 800100 add byte ptr [rcx], 0 -;; 15bbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15bc8: 800100 add byte ptr [rcx], 0 -;; 15bcb: aa stosb byte ptr [rdi], al -;; 15bcc: 800100 add byte ptr [rcx], 0 -;; 15bcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15bd8: 800100 add byte ptr [rcx], 0 -;; 15bdb: aa stosb byte ptr [rdi], al -;; 15bdc: 800100 add byte ptr [rcx], 0 -;; 15bdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15be8: 800100 add byte ptr [rcx], 0 -;; 15beb: aa stosb byte ptr [rdi], al -;; 15bec: 800100 add byte ptr [rcx], 0 -;; 15bef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15bf8: 800100 add byte ptr [rcx], 0 -;; 15bfb: aa stosb byte ptr [rdi], al -;; 15bfc: 800100 add byte ptr [rcx], 0 -;; 15bff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15c08: 800100 add byte ptr [rcx], 0 -;; 15c0b: aa stosb byte ptr [rdi], al -;; 15c0c: 800100 add byte ptr [rcx], 0 -;; 15c0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15c18: 800100 add byte ptr [rcx], 0 -;; 15c1b: aa stosb byte ptr [rdi], al -;; 15c1c: 800100 add byte ptr [rcx], 0 -;; 15c1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15c28: 800100 add byte ptr [rcx], 0 -;; 15c2b: aa stosb byte ptr [rdi], al -;; 15c2c: 800100 add byte ptr [rcx], 0 -;; 15c2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15c38: 800100 add byte ptr [rcx], 0 -;; 15c3b: aa stosb byte ptr [rdi], al -;; 15c3c: 800100 add byte ptr [rcx], 0 -;; 15c3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15c48: 800100 add byte ptr [rcx], 0 -;; 15c4b: aa stosb byte ptr [rdi], al -;; 15c4c: 800100 add byte ptr [rcx], 0 -;; 15c4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15c58: 800100 add byte ptr [rcx], 0 -;; 15c5b: aa stosb byte ptr [rdi], al -;; 15c5c: 800100 add byte ptr [rcx], 0 -;; 15c5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15c68: 800100 add byte ptr [rcx], 0 -;; 15c6b: aa stosb byte ptr [rdi], al -;; 15c6c: 800100 add byte ptr [rcx], 0 -;; 15c6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15c78: 800100 add byte ptr [rcx], 0 -;; 15c7b: aa stosb byte ptr [rdi], al -;; 15c7c: 800100 add byte ptr [rcx], 0 -;; 15c7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15c88: 800100 add byte ptr [rcx], 0 -;; 15c8b: aa stosb byte ptr [rdi], al -;; 15c8c: 800100 add byte ptr [rcx], 0 -;; 15c8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15c98: 800100 add byte ptr [rcx], 0 -;; 15c9b: aa stosb byte ptr [rdi], al -;; 15c9c: 800100 add byte ptr [rcx], 0 -;; 15c9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15ca8: 800100 add byte ptr [rcx], 0 -;; 15cab: aa stosb byte ptr [rdi], al -;; 15cac: 800100 add byte ptr [rcx], 0 -;; 15caf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15cb8: 800100 add byte ptr [rcx], 0 -;; 15cbb: aa stosb byte ptr [rdi], al -;; 15cbc: 800100 add byte ptr [rcx], 0 -;; 15cbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15cc8: 800100 add byte ptr [rcx], 0 -;; 15ccb: aa stosb byte ptr [rdi], al -;; 15ccc: 800100 add byte ptr [rcx], 0 -;; 15ccf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15cd8: 800100 add byte ptr [rcx], 0 -;; 15cdb: aa stosb byte ptr [rdi], al -;; 15cdc: 800100 add byte ptr [rcx], 0 -;; 15cdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15ce8: 800100 add byte ptr [rcx], 0 -;; 15ceb: aa stosb byte ptr [rdi], al -;; 15cec: 800100 add byte ptr [rcx], 0 -;; 15cef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15cf8: 800100 add byte ptr [rcx], 0 -;; 15cfb: aa stosb byte ptr [rdi], al -;; 15cfc: 800100 add byte ptr [rcx], 0 -;; 15cff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15d08: 800100 add byte ptr [rcx], 0 -;; 15d0b: aa stosb byte ptr [rdi], al -;; 15d0c: 800100 add byte ptr [rcx], 0 -;; 15d0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15d18: 800100 add byte ptr [rcx], 0 -;; 15d1b: aa stosb byte ptr [rdi], al -;; 15d1c: 800100 add byte ptr [rcx], 0 -;; 15d1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15d28: 800100 add byte ptr [rcx], 0 -;; 15d2b: aa stosb byte ptr [rdi], al -;; 15d2c: 800100 add byte ptr [rcx], 0 -;; 15d2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15d38: 800100 add byte ptr [rcx], 0 -;; 15d3b: aa stosb byte ptr [rdi], al -;; 15d3c: 800100 add byte ptr [rcx], 0 -;; 15d3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15d48: 800100 add byte ptr [rcx], 0 -;; 15d4b: aa stosb byte ptr [rdi], al -;; 15d4c: 800100 add byte ptr [rcx], 0 -;; 15d4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15d58: 800100 add byte ptr [rcx], 0 -;; 15d5b: aa stosb byte ptr [rdi], al -;; 15d5c: 800100 add byte ptr [rcx], 0 -;; 15d5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15d68: 800100 add byte ptr [rcx], 0 -;; 15d6b: aa stosb byte ptr [rdi], al -;; 15d6c: 800100 add byte ptr [rcx], 0 -;; 15d6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15d78: 800100 add byte ptr [rcx], 0 -;; 15d7b: aa stosb byte ptr [rdi], al -;; 15d7c: 800100 add byte ptr [rcx], 0 -;; 15d7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15d88: 800100 add byte ptr [rcx], 0 -;; 15d8b: aa stosb byte ptr [rdi], al -;; 15d8c: 800100 add byte ptr [rcx], 0 -;; 15d8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15d98: 800100 add byte ptr [rcx], 0 -;; 15d9b: aa stosb byte ptr [rdi], al -;; 15d9c: 800100 add byte ptr [rcx], 0 -;; 15d9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15da8: 800100 add byte ptr [rcx], 0 -;; 15dab: aa stosb byte ptr [rdi], al -;; 15dac: 800100 add byte ptr [rcx], 0 -;; 15daf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15db8: 800100 add byte ptr [rcx], 0 -;; 15dbb: aa stosb byte ptr [rdi], al -;; 15dbc: 800100 add byte ptr [rcx], 0 -;; 15dbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15dc8: 800100 add byte ptr [rcx], 0 -;; 15dcb: aa stosb byte ptr [rdi], al -;; 15dcc: 800100 add byte ptr [rcx], 0 -;; 15dcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15dd8: 800100 add byte ptr [rcx], 0 -;; 15ddb: aa stosb byte ptr [rdi], al -;; 15ddc: 800100 add byte ptr [rcx], 0 -;; 15ddf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15de8: 800100 add byte ptr [rcx], 0 -;; 15deb: aa stosb byte ptr [rdi], al -;; 15dec: 800100 add byte ptr [rcx], 0 -;; 15def: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15df8: 800100 add byte ptr [rcx], 0 -;; 15dfb: aa stosb byte ptr [rdi], al -;; 15dfc: 800100 add byte ptr [rcx], 0 -;; 15dff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15e08: 800100 add byte ptr [rcx], 0 -;; 15e0b: aa stosb byte ptr [rdi], al -;; 15e0c: 800100 add byte ptr [rcx], 0 -;; 15e0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15e18: 800100 add byte ptr [rcx], 0 -;; 15e1b: aa stosb byte ptr [rdi], al -;; 15e1c: 800100 add byte ptr [rcx], 0 -;; 15e1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15e28: 800100 add byte ptr [rcx], 0 -;; 15e2b: aa stosb byte ptr [rdi], al -;; 15e2c: 800100 add byte ptr [rcx], 0 -;; 15e2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15e38: 800100 add byte ptr [rcx], 0 -;; 15e3b: aa stosb byte ptr [rdi], al -;; 15e3c: 800100 add byte ptr [rcx], 0 -;; 15e3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15e48: 800100 add byte ptr [rcx], 0 -;; 15e4b: aa stosb byte ptr [rdi], al -;; 15e4c: 800100 add byte ptr [rcx], 0 -;; 15e4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15e58: 800100 add byte ptr [rcx], 0 -;; 15e5b: aa stosb byte ptr [rdi], al -;; 15e5c: 800100 add byte ptr [rcx], 0 -;; 15e5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15e68: 800100 add byte ptr [rcx], 0 -;; 15e6b: aa stosb byte ptr [rdi], al -;; 15e6c: 800100 add byte ptr [rcx], 0 -;; 15e6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15e78: 800100 add byte ptr [rcx], 0 -;; 15e7b: aa stosb byte ptr [rdi], al -;; 15e7c: 800100 add byte ptr [rcx], 0 -;; 15e7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15e88: 800100 add byte ptr [rcx], 0 -;; 15e8b: aa stosb byte ptr [rdi], al -;; 15e8c: 800100 add byte ptr [rcx], 0 -;; 15e8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15e98: 800100 add byte ptr [rcx], 0 -;; 15e9b: aa stosb byte ptr [rdi], al -;; 15e9c: 800100 add byte ptr [rcx], 0 -;; 15e9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15ea8: 800100 add byte ptr [rcx], 0 -;; 15eab: aa stosb byte ptr [rdi], al -;; 15eac: 800100 add byte ptr [rcx], 0 -;; 15eaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15eb8: 800100 add byte ptr [rcx], 0 -;; 15ebb: aa stosb byte ptr [rdi], al -;; 15ebc: 800100 add byte ptr [rcx], 0 -;; 15ebf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15ec8: 800100 add byte ptr [rcx], 0 -;; 15ecb: aa stosb byte ptr [rdi], al -;; 15ecc: 800100 add byte ptr [rcx], 0 -;; 15ecf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15ed8: 800100 add byte ptr [rcx], 0 -;; 15edb: aa stosb byte ptr [rdi], al -;; 15edc: 800100 add byte ptr [rcx], 0 -;; 15edf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15ee8: 800100 add byte ptr [rcx], 0 -;; 15eeb: aa stosb byte ptr [rdi], al -;; 15eec: 800100 add byte ptr [rcx], 0 -;; 15eef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15ef8: 800100 add byte ptr [rcx], 0 -;; 15efb: aa stosb byte ptr [rdi], al -;; 15efc: 800100 add byte ptr [rcx], 0 -;; 15eff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15f08: 800100 add byte ptr [rcx], 0 -;; 15f0b: aa stosb byte ptr [rdi], al -;; 15f0c: 800100 add byte ptr [rcx], 0 -;; 15f0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15f18: 800100 add byte ptr [rcx], 0 -;; 15f1b: aa stosb byte ptr [rdi], al -;; 15f1c: 800100 add byte ptr [rcx], 0 -;; 15f1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15f28: 800100 add byte ptr [rcx], 0 -;; 15f2b: aa stosb byte ptr [rdi], al -;; 15f2c: 800100 add byte ptr [rcx], 0 -;; 15f2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15f38: 800100 add byte ptr [rcx], 0 -;; 15f3b: aa stosb byte ptr [rdi], al -;; 15f3c: 800100 add byte ptr [rcx], 0 -;; 15f3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15f48: 800100 add byte ptr [rcx], 0 -;; 15f4b: aa stosb byte ptr [rdi], al -;; 15f4c: 800100 add byte ptr [rcx], 0 -;; 15f4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15f58: 800100 add byte ptr [rcx], 0 -;; 15f5b: aa stosb byte ptr [rdi], al -;; 15f5c: 800100 add byte ptr [rcx], 0 -;; 15f5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15f68: 800100 add byte ptr [rcx], 0 -;; 15f6b: aa stosb byte ptr [rdi], al -;; 15f6c: 800100 add byte ptr [rcx], 0 -;; 15f6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15f78: 800100 add byte ptr [rcx], 0 -;; 15f7b: aa stosb byte ptr [rdi], al -;; 15f7c: 800100 add byte ptr [rcx], 0 -;; 15f7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15f88: 800100 add byte ptr [rcx], 0 -;; 15f8b: aa stosb byte ptr [rdi], al -;; 15f8c: 800100 add byte ptr [rcx], 0 -;; 15f8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15f98: 800100 add byte ptr [rcx], 0 -;; 15f9b: aa stosb byte ptr [rdi], al -;; 15f9c: 800100 add byte ptr [rcx], 0 -;; 15f9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15fa8: 800100 add byte ptr [rcx], 0 -;; 15fab: aa stosb byte ptr [rdi], al -;; 15fac: 800100 add byte ptr [rcx], 0 -;; 15faf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15fb8: 800100 add byte ptr [rcx], 0 -;; 15fbb: aa stosb byte ptr [rdi], al -;; 15fbc: 800100 add byte ptr [rcx], 0 -;; 15fbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15fc8: 800100 add byte ptr [rcx], 0 -;; 15fcb: aa stosb byte ptr [rdi], al -;; 15fcc: 800100 add byte ptr [rcx], 0 -;; 15fcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15fd8: 800100 add byte ptr [rcx], 0 -;; 15fdb: aa stosb byte ptr [rdi], al -;; 15fdc: 800100 add byte ptr [rcx], 0 -;; 15fdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15fe8: 800100 add byte ptr [rcx], 0 -;; 15feb: aa stosb byte ptr [rdi], al -;; 15fec: 800100 add byte ptr [rcx], 0 -;; 15fef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 15ff8: 800100 add byte ptr [rcx], 0 -;; 15ffb: aa stosb byte ptr [rdi], al -;; 15ffc: 800100 add byte ptr [rcx], 0 -;; 15fff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16008: 800100 add byte ptr [rcx], 0 -;; 1600b: aa stosb byte ptr [rdi], al -;; 1600c: 800100 add byte ptr [rcx], 0 -;; 1600f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16018: 800100 add byte ptr [rcx], 0 -;; 1601b: aa stosb byte ptr [rdi], al -;; 1601c: 800100 add byte ptr [rcx], 0 -;; 1601f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16028: 800100 add byte ptr [rcx], 0 -;; 1602b: aa stosb byte ptr [rdi], al -;; 1602c: 800100 add byte ptr [rcx], 0 -;; 1602f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16038: 800100 add byte ptr [rcx], 0 -;; 1603b: aa stosb byte ptr [rdi], al -;; 1603c: 800100 add byte ptr [rcx], 0 -;; 1603f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16048: 800100 add byte ptr [rcx], 0 -;; 1604b: aa stosb byte ptr [rdi], al -;; 1604c: 800100 add byte ptr [rcx], 0 -;; 1604f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16058: 800100 add byte ptr [rcx], 0 -;; 1605b: aa stosb byte ptr [rdi], al -;; 1605c: 800100 add byte ptr [rcx], 0 -;; 1605f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16068: 800100 add byte ptr [rcx], 0 -;; 1606b: aa stosb byte ptr [rdi], al -;; 1606c: 800100 add byte ptr [rcx], 0 -;; 1606f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16078: 800100 add byte ptr [rcx], 0 -;; 1607b: aa stosb byte ptr [rdi], al -;; 1607c: 800100 add byte ptr [rcx], 0 -;; 1607f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16088: 800100 add byte ptr [rcx], 0 -;; 1608b: aa stosb byte ptr [rdi], al -;; 1608c: 800100 add byte ptr [rcx], 0 -;; 1608f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16098: 800100 add byte ptr [rcx], 0 -;; 1609b: aa stosb byte ptr [rdi], al -;; 1609c: 800100 add byte ptr [rcx], 0 -;; 1609f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 160a8: 800100 add byte ptr [rcx], 0 -;; 160ab: aa stosb byte ptr [rdi], al -;; 160ac: 800100 add byte ptr [rcx], 0 -;; 160af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 160b8: 800100 add byte ptr [rcx], 0 -;; 160bb: aa stosb byte ptr [rdi], al -;; 160bc: 800100 add byte ptr [rcx], 0 -;; 160bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 160c8: 800100 add byte ptr [rcx], 0 -;; 160cb: aa stosb byte ptr [rdi], al -;; 160cc: 800100 add byte ptr [rcx], 0 -;; 160cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 160d8: 800100 add byte ptr [rcx], 0 -;; 160db: aa stosb byte ptr [rdi], al -;; 160dc: 800100 add byte ptr [rcx], 0 -;; 160df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 160e8: 800100 add byte ptr [rcx], 0 -;; 160eb: aa stosb byte ptr [rdi], al -;; 160ec: 800100 add byte ptr [rcx], 0 -;; 160ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 160f8: 800100 add byte ptr [rcx], 0 -;; 160fb: aa stosb byte ptr [rdi], al -;; 160fc: 800100 add byte ptr [rcx], 0 -;; 160ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16108: 800100 add byte ptr [rcx], 0 -;; 1610b: aa stosb byte ptr [rdi], al -;; 1610c: 800100 add byte ptr [rcx], 0 -;; 1610f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16118: 800100 add byte ptr [rcx], 0 -;; 1611b: aa stosb byte ptr [rdi], al -;; 1611c: 800100 add byte ptr [rcx], 0 -;; 1611f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16128: 800100 add byte ptr [rcx], 0 -;; 1612b: aa stosb byte ptr [rdi], al -;; 1612c: 800100 add byte ptr [rcx], 0 -;; 1612f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16138: 800100 add byte ptr [rcx], 0 -;; 1613b: aa stosb byte ptr [rdi], al -;; 1613c: 800100 add byte ptr [rcx], 0 -;; 1613f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16148: 800100 add byte ptr [rcx], 0 -;; 1614b: aa stosb byte ptr [rdi], al -;; 1614c: 800100 add byte ptr [rcx], 0 -;; 1614f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16158: 800100 add byte ptr [rcx], 0 -;; 1615b: aa stosb byte ptr [rdi], al -;; 1615c: 800100 add byte ptr [rcx], 0 -;; 1615f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16168: 800100 add byte ptr [rcx], 0 -;; 1616b: aa stosb byte ptr [rdi], al -;; 1616c: 800100 add byte ptr [rcx], 0 -;; 1616f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16178: 800100 add byte ptr [rcx], 0 -;; 1617b: aa stosb byte ptr [rdi], al -;; 1617c: 800100 add byte ptr [rcx], 0 -;; 1617f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16188: 800100 add byte ptr [rcx], 0 -;; 1618b: aa stosb byte ptr [rdi], al -;; 1618c: 800100 add byte ptr [rcx], 0 -;; 1618f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16198: 800100 add byte ptr [rcx], 0 -;; 1619b: aa stosb byte ptr [rdi], al -;; 1619c: 800100 add byte ptr [rcx], 0 -;; 1619f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 161a8: 800100 add byte ptr [rcx], 0 -;; 161ab: aa stosb byte ptr [rdi], al -;; 161ac: 800100 add byte ptr [rcx], 0 -;; 161af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 161b8: 800100 add byte ptr [rcx], 0 -;; 161bb: aa stosb byte ptr [rdi], al -;; 161bc: 800100 add byte ptr [rcx], 0 -;; 161bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 161c8: 800100 add byte ptr [rcx], 0 -;; 161cb: aa stosb byte ptr [rdi], al -;; 161cc: 800100 add byte ptr [rcx], 0 -;; 161cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 161d8: 800100 add byte ptr [rcx], 0 -;; 161db: aa stosb byte ptr [rdi], al -;; 161dc: 800100 add byte ptr [rcx], 0 -;; 161df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 161e8: 800100 add byte ptr [rcx], 0 -;; 161eb: aa stosb byte ptr [rdi], al -;; 161ec: 800100 add byte ptr [rcx], 0 -;; 161ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 161f8: 800100 add byte ptr [rcx], 0 -;; 161fb: aa stosb byte ptr [rdi], al -;; 161fc: 800100 add byte ptr [rcx], 0 -;; 161ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16208: 800100 add byte ptr [rcx], 0 -;; 1620b: aa stosb byte ptr [rdi], al -;; 1620c: 800100 add byte ptr [rcx], 0 -;; 1620f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16218: 800100 add byte ptr [rcx], 0 -;; 1621b: aa stosb byte ptr [rdi], al -;; 1621c: 800100 add byte ptr [rcx], 0 -;; 1621f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16228: 800100 add byte ptr [rcx], 0 -;; 1622b: aa stosb byte ptr [rdi], al -;; 1622c: 800100 add byte ptr [rcx], 0 -;; 1622f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16238: 800100 add byte ptr [rcx], 0 -;; 1623b: aa stosb byte ptr [rdi], al -;; 1623c: 800100 add byte ptr [rcx], 0 -;; 1623f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16248: 800100 add byte ptr [rcx], 0 -;; 1624b: aa stosb byte ptr [rdi], al -;; 1624c: 800100 add byte ptr [rcx], 0 -;; 1624f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16258: 800100 add byte ptr [rcx], 0 -;; 1625b: aa stosb byte ptr [rdi], al -;; 1625c: 800100 add byte ptr [rcx], 0 -;; 1625f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16268: 800100 add byte ptr [rcx], 0 -;; 1626b: aa stosb byte ptr [rdi], al -;; 1626c: 800100 add byte ptr [rcx], 0 -;; 1626f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16278: 800100 add byte ptr [rcx], 0 -;; 1627b: aa stosb byte ptr [rdi], al -;; 1627c: 800100 add byte ptr [rcx], 0 -;; 1627f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16288: 800100 add byte ptr [rcx], 0 -;; 1628b: aa stosb byte ptr [rdi], al -;; 1628c: 800100 add byte ptr [rcx], 0 -;; 1628f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16298: 800100 add byte ptr [rcx], 0 -;; 1629b: aa stosb byte ptr [rdi], al -;; 1629c: 800100 add byte ptr [rcx], 0 -;; 1629f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 162a8: 800100 add byte ptr [rcx], 0 -;; 162ab: aa stosb byte ptr [rdi], al -;; 162ac: 800100 add byte ptr [rcx], 0 -;; 162af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 162b8: 800100 add byte ptr [rcx], 0 -;; 162bb: aa stosb byte ptr [rdi], al -;; 162bc: 800100 add byte ptr [rcx], 0 -;; 162bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 162c8: 800100 add byte ptr [rcx], 0 -;; 162cb: aa stosb byte ptr [rdi], al -;; 162cc: 800100 add byte ptr [rcx], 0 -;; 162cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 162d8: 800100 add byte ptr [rcx], 0 -;; 162db: aa stosb byte ptr [rdi], al -;; 162dc: 800100 add byte ptr [rcx], 0 -;; 162df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 162e8: 800100 add byte ptr [rcx], 0 -;; 162eb: aa stosb byte ptr [rdi], al -;; 162ec: 800100 add byte ptr [rcx], 0 -;; 162ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 162f8: 800100 add byte ptr [rcx], 0 -;; 162fb: aa stosb byte ptr [rdi], al -;; 162fc: 800100 add byte ptr [rcx], 0 -;; 162ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16308: 800100 add byte ptr [rcx], 0 -;; 1630b: aa stosb byte ptr [rdi], al -;; 1630c: 800100 add byte ptr [rcx], 0 -;; 1630f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16318: 800100 add byte ptr [rcx], 0 -;; 1631b: aa stosb byte ptr [rdi], al -;; 1631c: 800100 add byte ptr [rcx], 0 -;; 1631f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16328: 800100 add byte ptr [rcx], 0 -;; 1632b: aa stosb byte ptr [rdi], al -;; 1632c: 800100 add byte ptr [rcx], 0 -;; 1632f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16338: 800100 add byte ptr [rcx], 0 -;; 1633b: aa stosb byte ptr [rdi], al -;; 1633c: 800100 add byte ptr [rcx], 0 -;; 1633f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16348: 800100 add byte ptr [rcx], 0 -;; 1634b: aa stosb byte ptr [rdi], al -;; 1634c: 800100 add byte ptr [rcx], 0 -;; 1634f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16358: 800100 add byte ptr [rcx], 0 -;; 1635b: aa stosb byte ptr [rdi], al -;; 1635c: 800100 add byte ptr [rcx], 0 -;; 1635f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16368: 800100 add byte ptr [rcx], 0 -;; 1636b: aa stosb byte ptr [rdi], al -;; 1636c: 800100 add byte ptr [rcx], 0 -;; 1636f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16378: 800100 add byte ptr [rcx], 0 -;; 1637b: aa stosb byte ptr [rdi], al -;; 1637c: 800100 add byte ptr [rcx], 0 -;; 1637f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16388: 800100 add byte ptr [rcx], 0 -;; 1638b: aa stosb byte ptr [rdi], al -;; 1638c: 800100 add byte ptr [rcx], 0 -;; 1638f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16398: 800100 add byte ptr [rcx], 0 -;; 1639b: aa stosb byte ptr [rdi], al -;; 1639c: 800100 add byte ptr [rcx], 0 -;; 1639f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 163a8: 800100 add byte ptr [rcx], 0 -;; 163ab: aa stosb byte ptr [rdi], al -;; 163ac: 800100 add byte ptr [rcx], 0 -;; 163af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 163b8: 800100 add byte ptr [rcx], 0 -;; 163bb: aa stosb byte ptr [rdi], al -;; 163bc: 800100 add byte ptr [rcx], 0 -;; 163bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 163c8: 800100 add byte ptr [rcx], 0 -;; 163cb: aa stosb byte ptr [rdi], al -;; 163cc: 800100 add byte ptr [rcx], 0 -;; 163cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 163d8: 800100 add byte ptr [rcx], 0 -;; 163db: aa stosb byte ptr [rdi], al -;; 163dc: 800100 add byte ptr [rcx], 0 -;; 163df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 163e8: 800100 add byte ptr [rcx], 0 -;; 163eb: aa stosb byte ptr [rdi], al -;; 163ec: 800100 add byte ptr [rcx], 0 -;; 163ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 163f8: 800100 add byte ptr [rcx], 0 -;; 163fb: aa stosb byte ptr [rdi], al -;; 163fc: 800100 add byte ptr [rcx], 0 -;; 163ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16408: 800100 add byte ptr [rcx], 0 -;; 1640b: aa stosb byte ptr [rdi], al -;; 1640c: 800100 add byte ptr [rcx], 0 -;; 1640f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16418: 800100 add byte ptr [rcx], 0 -;; 1641b: aa stosb byte ptr [rdi], al -;; 1641c: 800100 add byte ptr [rcx], 0 -;; 1641f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16428: 800100 add byte ptr [rcx], 0 -;; 1642b: aa stosb byte ptr [rdi], al -;; 1642c: 800100 add byte ptr [rcx], 0 -;; 1642f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16438: 800100 add byte ptr [rcx], 0 -;; 1643b: aa stosb byte ptr [rdi], al -;; 1643c: 800100 add byte ptr [rcx], 0 -;; 1643f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16448: 800100 add byte ptr [rcx], 0 -;; 1644b: aa stosb byte ptr [rdi], al -;; 1644c: 800100 add byte ptr [rcx], 0 -;; 1644f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16458: 800100 add byte ptr [rcx], 0 -;; 1645b: aa stosb byte ptr [rdi], al -;; 1645c: 800100 add byte ptr [rcx], 0 -;; 1645f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16468: 800100 add byte ptr [rcx], 0 -;; 1646b: aa stosb byte ptr [rdi], al -;; 1646c: 800100 add byte ptr [rcx], 0 -;; 1646f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16478: 800100 add byte ptr [rcx], 0 -;; 1647b: aa stosb byte ptr [rdi], al -;; 1647c: 800100 add byte ptr [rcx], 0 -;; 1647f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16488: 800100 add byte ptr [rcx], 0 -;; 1648b: aa stosb byte ptr [rdi], al -;; 1648c: 800100 add byte ptr [rcx], 0 -;; 1648f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16498: 800100 add byte ptr [rcx], 0 -;; 1649b: aa stosb byte ptr [rdi], al -;; 1649c: 800100 add byte ptr [rcx], 0 -;; 1649f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 164a8: 800100 add byte ptr [rcx], 0 -;; 164ab: aa stosb byte ptr [rdi], al -;; 164ac: 800100 add byte ptr [rcx], 0 -;; 164af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 164b8: 800100 add byte ptr [rcx], 0 -;; 164bb: aa stosb byte ptr [rdi], al -;; 164bc: 800100 add byte ptr [rcx], 0 -;; 164bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 164c8: 800100 add byte ptr [rcx], 0 -;; 164cb: aa stosb byte ptr [rdi], al -;; 164cc: 800100 add byte ptr [rcx], 0 -;; 164cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 164d8: 800100 add byte ptr [rcx], 0 -;; 164db: aa stosb byte ptr [rdi], al -;; 164dc: 800100 add byte ptr [rcx], 0 -;; 164df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 164e8: 800100 add byte ptr [rcx], 0 -;; 164eb: aa stosb byte ptr [rdi], al -;; 164ec: 800100 add byte ptr [rcx], 0 -;; 164ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 164f8: 800100 add byte ptr [rcx], 0 -;; 164fb: aa stosb byte ptr [rdi], al -;; 164fc: 800100 add byte ptr [rcx], 0 -;; 164ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16508: 800100 add byte ptr [rcx], 0 -;; 1650b: aa stosb byte ptr [rdi], al -;; 1650c: 800100 add byte ptr [rcx], 0 -;; 1650f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16518: 800100 add byte ptr [rcx], 0 -;; 1651b: aa stosb byte ptr [rdi], al -;; 1651c: 800100 add byte ptr [rcx], 0 -;; 1651f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16528: 800100 add byte ptr [rcx], 0 -;; 1652b: aa stosb byte ptr [rdi], al -;; 1652c: 800100 add byte ptr [rcx], 0 -;; 1652f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16538: 800100 add byte ptr [rcx], 0 -;; 1653b: aa stosb byte ptr [rdi], al -;; 1653c: 800100 add byte ptr [rcx], 0 -;; 1653f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16548: 800100 add byte ptr [rcx], 0 -;; 1654b: aa stosb byte ptr [rdi], al -;; 1654c: 800100 add byte ptr [rcx], 0 -;; 1654f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16558: 800100 add byte ptr [rcx], 0 -;; 1655b: aa stosb byte ptr [rdi], al -;; 1655c: 800100 add byte ptr [rcx], 0 -;; 1655f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16568: 800100 add byte ptr [rcx], 0 -;; 1656b: aa stosb byte ptr [rdi], al -;; 1656c: 800100 add byte ptr [rcx], 0 -;; 1656f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16578: 800100 add byte ptr [rcx], 0 -;; 1657b: aa stosb byte ptr [rdi], al -;; 1657c: 800100 add byte ptr [rcx], 0 -;; 1657f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16588: 800100 add byte ptr [rcx], 0 -;; 1658b: aa stosb byte ptr [rdi], al -;; 1658c: 800100 add byte ptr [rcx], 0 -;; 1658f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16598: 800100 add byte ptr [rcx], 0 -;; 1659b: aa stosb byte ptr [rdi], al -;; 1659c: 800100 add byte ptr [rcx], 0 -;; 1659f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 165a8: 800100 add byte ptr [rcx], 0 -;; 165ab: aa stosb byte ptr [rdi], al -;; 165ac: 800100 add byte ptr [rcx], 0 -;; 165af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 165b8: 800100 add byte ptr [rcx], 0 -;; 165bb: aa stosb byte ptr [rdi], al -;; 165bc: 800100 add byte ptr [rcx], 0 -;; 165bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 165c8: 800100 add byte ptr [rcx], 0 -;; 165cb: aa stosb byte ptr [rdi], al -;; 165cc: 800100 add byte ptr [rcx], 0 -;; 165cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 165d8: 800100 add byte ptr [rcx], 0 -;; 165db: aa stosb byte ptr [rdi], al -;; 165dc: 800100 add byte ptr [rcx], 0 -;; 165df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 165e8: 800100 add byte ptr [rcx], 0 -;; 165eb: aa stosb byte ptr [rdi], al -;; 165ec: 800100 add byte ptr [rcx], 0 -;; 165ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 165f8: 800100 add byte ptr [rcx], 0 -;; 165fb: aa stosb byte ptr [rdi], al -;; 165fc: 800100 add byte ptr [rcx], 0 -;; 165ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16608: 800100 add byte ptr [rcx], 0 -;; 1660b: aa stosb byte ptr [rdi], al -;; 1660c: 800100 add byte ptr [rcx], 0 -;; 1660f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16618: 800100 add byte ptr [rcx], 0 -;; 1661b: aa stosb byte ptr [rdi], al -;; 1661c: 800100 add byte ptr [rcx], 0 -;; 1661f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16628: 800100 add byte ptr [rcx], 0 -;; 1662b: aa stosb byte ptr [rdi], al -;; 1662c: 800100 add byte ptr [rcx], 0 -;; 1662f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16638: 800100 add byte ptr [rcx], 0 -;; 1663b: aa stosb byte ptr [rdi], al -;; 1663c: 800100 add byte ptr [rcx], 0 -;; 1663f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16648: 800100 add byte ptr [rcx], 0 -;; 1664b: aa stosb byte ptr [rdi], al -;; 1664c: 800100 add byte ptr [rcx], 0 -;; 1664f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16658: 800100 add byte ptr [rcx], 0 -;; 1665b: aa stosb byte ptr [rdi], al -;; 1665c: 800100 add byte ptr [rcx], 0 -;; 1665f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16668: 800100 add byte ptr [rcx], 0 -;; 1666b: aa stosb byte ptr [rdi], al -;; 1666c: 800100 add byte ptr [rcx], 0 -;; 1666f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16678: 800100 add byte ptr [rcx], 0 -;; 1667b: aa stosb byte ptr [rdi], al -;; 1667c: 800100 add byte ptr [rcx], 0 -;; 1667f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16688: 800100 add byte ptr [rcx], 0 -;; 1668b: aa stosb byte ptr [rdi], al -;; 1668c: 800100 add byte ptr [rcx], 0 -;; 1668f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16698: 800100 add byte ptr [rcx], 0 -;; 1669b: aa stosb byte ptr [rdi], al -;; 1669c: 800100 add byte ptr [rcx], 0 -;; 1669f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 166a8: 800100 add byte ptr [rcx], 0 -;; 166ab: aa stosb byte ptr [rdi], al -;; 166ac: 800100 add byte ptr [rcx], 0 -;; 166af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 166b8: 800100 add byte ptr [rcx], 0 -;; 166bb: aa stosb byte ptr [rdi], al -;; 166bc: 800100 add byte ptr [rcx], 0 -;; 166bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 166c8: 800100 add byte ptr [rcx], 0 -;; 166cb: aa stosb byte ptr [rdi], al -;; 166cc: 800100 add byte ptr [rcx], 0 -;; 166cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 166d8: 800100 add byte ptr [rcx], 0 -;; 166db: aa stosb byte ptr [rdi], al -;; 166dc: 800100 add byte ptr [rcx], 0 -;; 166df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 166e8: 800100 add byte ptr [rcx], 0 -;; 166eb: aa stosb byte ptr [rdi], al -;; 166ec: 800100 add byte ptr [rcx], 0 -;; 166ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 166f8: 800100 add byte ptr [rcx], 0 -;; 166fb: aa stosb byte ptr [rdi], al -;; 166fc: 800100 add byte ptr [rcx], 0 -;; 166ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16708: 800100 add byte ptr [rcx], 0 -;; 1670b: aa stosb byte ptr [rdi], al -;; 1670c: 800100 add byte ptr [rcx], 0 -;; 1670f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16718: 800100 add byte ptr [rcx], 0 -;; 1671b: aa stosb byte ptr [rdi], al -;; 1671c: 800100 add byte ptr [rcx], 0 -;; 1671f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16728: 800100 add byte ptr [rcx], 0 -;; 1672b: aa stosb byte ptr [rdi], al -;; 1672c: 800100 add byte ptr [rcx], 0 -;; 1672f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16738: 800100 add byte ptr [rcx], 0 -;; 1673b: aa stosb byte ptr [rdi], al -;; 1673c: 800100 add byte ptr [rcx], 0 -;; 1673f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16748: 800100 add byte ptr [rcx], 0 -;; 1674b: aa stosb byte ptr [rdi], al -;; 1674c: 800100 add byte ptr [rcx], 0 -;; 1674f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16758: 800100 add byte ptr [rcx], 0 -;; 1675b: aa stosb byte ptr [rdi], al -;; 1675c: 800100 add byte ptr [rcx], 0 -;; 1675f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16768: 800100 add byte ptr [rcx], 0 -;; 1676b: aa stosb byte ptr [rdi], al -;; 1676c: 800100 add byte ptr [rcx], 0 -;; 1676f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16778: 800100 add byte ptr [rcx], 0 -;; 1677b: aa stosb byte ptr [rdi], al -;; 1677c: 800100 add byte ptr [rcx], 0 -;; 1677f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16788: 800100 add byte ptr [rcx], 0 -;; 1678b: aa stosb byte ptr [rdi], al -;; 1678c: 800100 add byte ptr [rcx], 0 -;; 1678f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16798: 800100 add byte ptr [rcx], 0 -;; 1679b: aa stosb byte ptr [rdi], al -;; 1679c: 800100 add byte ptr [rcx], 0 -;; 1679f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 167a8: 800100 add byte ptr [rcx], 0 -;; 167ab: aa stosb byte ptr [rdi], al -;; 167ac: 800100 add byte ptr [rcx], 0 -;; 167af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 167b8: 800100 add byte ptr [rcx], 0 -;; 167bb: aa stosb byte ptr [rdi], al -;; 167bc: 800100 add byte ptr [rcx], 0 -;; 167bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 167c8: 800100 add byte ptr [rcx], 0 -;; 167cb: aa stosb byte ptr [rdi], al -;; 167cc: 800100 add byte ptr [rcx], 0 -;; 167cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 167d8: 800100 add byte ptr [rcx], 0 -;; 167db: aa stosb byte ptr [rdi], al -;; 167dc: 800100 add byte ptr [rcx], 0 -;; 167df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 167e8: 800100 add byte ptr [rcx], 0 -;; 167eb: aa stosb byte ptr [rdi], al -;; 167ec: 800100 add byte ptr [rcx], 0 -;; 167ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 167f8: 800100 add byte ptr [rcx], 0 -;; 167fb: aa stosb byte ptr [rdi], al -;; 167fc: 800100 add byte ptr [rcx], 0 -;; 167ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16808: 800100 add byte ptr [rcx], 0 -;; 1680b: aa stosb byte ptr [rdi], al -;; 1680c: 800100 add byte ptr [rcx], 0 -;; 1680f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16818: 800100 add byte ptr [rcx], 0 -;; 1681b: aa stosb byte ptr [rdi], al -;; 1681c: 800100 add byte ptr [rcx], 0 -;; 1681f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16828: 800100 add byte ptr [rcx], 0 -;; 1682b: aa stosb byte ptr [rdi], al -;; 1682c: 800100 add byte ptr [rcx], 0 -;; 1682f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16838: 800100 add byte ptr [rcx], 0 -;; 1683b: aa stosb byte ptr [rdi], al -;; 1683c: 800100 add byte ptr [rcx], 0 -;; 1683f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16848: 800100 add byte ptr [rcx], 0 -;; 1684b: aa stosb byte ptr [rdi], al -;; 1684c: 800100 add byte ptr [rcx], 0 -;; 1684f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16858: 800100 add byte ptr [rcx], 0 -;; 1685b: aa stosb byte ptr [rdi], al -;; 1685c: 800100 add byte ptr [rcx], 0 -;; 1685f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16868: 800100 add byte ptr [rcx], 0 -;; 1686b: aa stosb byte ptr [rdi], al -;; 1686c: 800100 add byte ptr [rcx], 0 -;; 1686f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16878: 800100 add byte ptr [rcx], 0 -;; 1687b: aa stosb byte ptr [rdi], al -;; 1687c: 800100 add byte ptr [rcx], 0 -;; 1687f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16888: 800100 add byte ptr [rcx], 0 -;; 1688b: aa stosb byte ptr [rdi], al -;; 1688c: 800100 add byte ptr [rcx], 0 -;; 1688f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16898: 800100 add byte ptr [rcx], 0 -;; 1689b: aa stosb byte ptr [rdi], al -;; 1689c: 800100 add byte ptr [rcx], 0 -;; 1689f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 168a8: 800100 add byte ptr [rcx], 0 -;; 168ab: aa stosb byte ptr [rdi], al -;; 168ac: 800100 add byte ptr [rcx], 0 -;; 168af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 168b8: 800100 add byte ptr [rcx], 0 -;; 168bb: aa stosb byte ptr [rdi], al -;; 168bc: 800100 add byte ptr [rcx], 0 -;; 168bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 168c8: 800100 add byte ptr [rcx], 0 -;; 168cb: aa stosb byte ptr [rdi], al -;; 168cc: 800100 add byte ptr [rcx], 0 -;; 168cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 168d8: 800100 add byte ptr [rcx], 0 -;; 168db: aa stosb byte ptr [rdi], al -;; 168dc: 800100 add byte ptr [rcx], 0 -;; 168df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 168e8: 800100 add byte ptr [rcx], 0 -;; 168eb: aa stosb byte ptr [rdi], al -;; 168ec: 800100 add byte ptr [rcx], 0 -;; 168ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 168f8: 800100 add byte ptr [rcx], 0 -;; 168fb: aa stosb byte ptr [rdi], al -;; 168fc: 800100 add byte ptr [rcx], 0 -;; 168ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16908: 800100 add byte ptr [rcx], 0 -;; 1690b: aa stosb byte ptr [rdi], al -;; 1690c: 800100 add byte ptr [rcx], 0 -;; 1690f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16918: 800100 add byte ptr [rcx], 0 -;; 1691b: aa stosb byte ptr [rdi], al -;; 1691c: 800100 add byte ptr [rcx], 0 -;; 1691f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16928: 800100 add byte ptr [rcx], 0 -;; 1692b: aa stosb byte ptr [rdi], al -;; 1692c: 800100 add byte ptr [rcx], 0 -;; 1692f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16938: 800100 add byte ptr [rcx], 0 -;; 1693b: aa stosb byte ptr [rdi], al -;; 1693c: 800100 add byte ptr [rcx], 0 -;; 1693f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16948: 800100 add byte ptr [rcx], 0 -;; 1694b: aa stosb byte ptr [rdi], al -;; 1694c: 800100 add byte ptr [rcx], 0 -;; 1694f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16958: 800100 add byte ptr [rcx], 0 -;; 1695b: aa stosb byte ptr [rdi], al -;; 1695c: 800100 add byte ptr [rcx], 0 -;; 1695f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16968: 800100 add byte ptr [rcx], 0 -;; 1696b: aa stosb byte ptr [rdi], al -;; 1696c: 800100 add byte ptr [rcx], 0 -;; 1696f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16978: 800100 add byte ptr [rcx], 0 -;; 1697b: aa stosb byte ptr [rdi], al -;; 1697c: 800100 add byte ptr [rcx], 0 -;; 1697f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16988: 800100 add byte ptr [rcx], 0 -;; 1698b: aa stosb byte ptr [rdi], al -;; 1698c: 800100 add byte ptr [rcx], 0 -;; 1698f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16998: 800100 add byte ptr [rcx], 0 -;; 1699b: aa stosb byte ptr [rdi], al -;; 1699c: 800100 add byte ptr [rcx], 0 -;; 1699f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 169a8: 800100 add byte ptr [rcx], 0 -;; 169ab: aa stosb byte ptr [rdi], al -;; 169ac: 800100 add byte ptr [rcx], 0 -;; 169af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 169b8: 800100 add byte ptr [rcx], 0 -;; 169bb: aa stosb byte ptr [rdi], al -;; 169bc: 800100 add byte ptr [rcx], 0 -;; 169bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 169c8: 800100 add byte ptr [rcx], 0 -;; 169cb: aa stosb byte ptr [rdi], al -;; 169cc: 800100 add byte ptr [rcx], 0 -;; 169cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 169d8: 800100 add byte ptr [rcx], 0 -;; 169db: aa stosb byte ptr [rdi], al -;; 169dc: 800100 add byte ptr [rcx], 0 -;; 169df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 169e8: 800100 add byte ptr [rcx], 0 -;; 169eb: aa stosb byte ptr [rdi], al -;; 169ec: 800100 add byte ptr [rcx], 0 -;; 169ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 169f8: 800100 add byte ptr [rcx], 0 -;; 169fb: aa stosb byte ptr [rdi], al -;; 169fc: 800100 add byte ptr [rcx], 0 -;; 169ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16a08: 800100 add byte ptr [rcx], 0 -;; 16a0b: aa stosb byte ptr [rdi], al -;; 16a0c: 800100 add byte ptr [rcx], 0 -;; 16a0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16a18: 800100 add byte ptr [rcx], 0 -;; 16a1b: aa stosb byte ptr [rdi], al -;; 16a1c: 800100 add byte ptr [rcx], 0 -;; 16a1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16a28: 800100 add byte ptr [rcx], 0 -;; 16a2b: aa stosb byte ptr [rdi], al -;; 16a2c: 800100 add byte ptr [rcx], 0 -;; 16a2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16a38: 800100 add byte ptr [rcx], 0 -;; 16a3b: aa stosb byte ptr [rdi], al -;; 16a3c: 800100 add byte ptr [rcx], 0 -;; 16a3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16a48: 800100 add byte ptr [rcx], 0 -;; 16a4b: aa stosb byte ptr [rdi], al -;; 16a4c: 800100 add byte ptr [rcx], 0 -;; 16a4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16a58: 800100 add byte ptr [rcx], 0 -;; 16a5b: aa stosb byte ptr [rdi], al -;; 16a5c: 800100 add byte ptr [rcx], 0 -;; 16a5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16a68: 800100 add byte ptr [rcx], 0 -;; 16a6b: aa stosb byte ptr [rdi], al -;; 16a6c: 800100 add byte ptr [rcx], 0 -;; 16a6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16a78: 800100 add byte ptr [rcx], 0 -;; 16a7b: aa stosb byte ptr [rdi], al -;; 16a7c: 800100 add byte ptr [rcx], 0 -;; 16a7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16a88: 800100 add byte ptr [rcx], 0 -;; 16a8b: aa stosb byte ptr [rdi], al -;; 16a8c: 800100 add byte ptr [rcx], 0 -;; 16a8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16a98: 800100 add byte ptr [rcx], 0 -;; 16a9b: aa stosb byte ptr [rdi], al -;; 16a9c: 800100 add byte ptr [rcx], 0 -;; 16a9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16aa8: 800100 add byte ptr [rcx], 0 -;; 16aab: aa stosb byte ptr [rdi], al -;; 16aac: 800100 add byte ptr [rcx], 0 -;; 16aaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16ab8: 800100 add byte ptr [rcx], 0 -;; 16abb: aa stosb byte ptr [rdi], al -;; 16abc: 800100 add byte ptr [rcx], 0 -;; 16abf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16ac8: 800100 add byte ptr [rcx], 0 -;; 16acb: aa stosb byte ptr [rdi], al -;; 16acc: 800100 add byte ptr [rcx], 0 -;; 16acf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16ad8: 800100 add byte ptr [rcx], 0 -;; 16adb: aa stosb byte ptr [rdi], al -;; 16adc: 800100 add byte ptr [rcx], 0 -;; 16adf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16ae8: 800100 add byte ptr [rcx], 0 -;; 16aeb: aa stosb byte ptr [rdi], al -;; 16aec: 800100 add byte ptr [rcx], 0 -;; 16aef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16af8: 800100 add byte ptr [rcx], 0 -;; 16afb: aa stosb byte ptr [rdi], al -;; 16afc: 800100 add byte ptr [rcx], 0 -;; 16aff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16b08: 800100 add byte ptr [rcx], 0 -;; 16b0b: aa stosb byte ptr [rdi], al -;; 16b0c: 800100 add byte ptr [rcx], 0 -;; 16b0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16b18: 800100 add byte ptr [rcx], 0 -;; 16b1b: aa stosb byte ptr [rdi], al -;; 16b1c: 800100 add byte ptr [rcx], 0 -;; 16b1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16b28: 800100 add byte ptr [rcx], 0 -;; 16b2b: aa stosb byte ptr [rdi], al -;; 16b2c: 800100 add byte ptr [rcx], 0 -;; 16b2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16b38: 800100 add byte ptr [rcx], 0 -;; 16b3b: aa stosb byte ptr [rdi], al -;; 16b3c: 800100 add byte ptr [rcx], 0 -;; 16b3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16b48: 800100 add byte ptr [rcx], 0 -;; 16b4b: aa stosb byte ptr [rdi], al -;; 16b4c: 800100 add byte ptr [rcx], 0 -;; 16b4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16b58: 800100 add byte ptr [rcx], 0 -;; 16b5b: aa stosb byte ptr [rdi], al -;; 16b5c: 800100 add byte ptr [rcx], 0 -;; 16b5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16b68: 800100 add byte ptr [rcx], 0 -;; 16b6b: aa stosb byte ptr [rdi], al -;; 16b6c: 800100 add byte ptr [rcx], 0 -;; 16b6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16b78: 800100 add byte ptr [rcx], 0 -;; 16b7b: aa stosb byte ptr [rdi], al -;; 16b7c: 800100 add byte ptr [rcx], 0 -;; 16b7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16b88: 800100 add byte ptr [rcx], 0 -;; 16b8b: aa stosb byte ptr [rdi], al -;; 16b8c: 800100 add byte ptr [rcx], 0 -;; 16b8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16b98: 800100 add byte ptr [rcx], 0 -;; 16b9b: aa stosb byte ptr [rdi], al -;; 16b9c: 800100 add byte ptr [rcx], 0 -;; 16b9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16ba8: 800100 add byte ptr [rcx], 0 -;; 16bab: aa stosb byte ptr [rdi], al -;; 16bac: 800100 add byte ptr [rcx], 0 -;; 16baf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16bb8: 800100 add byte ptr [rcx], 0 -;; 16bbb: aa stosb byte ptr [rdi], al -;; 16bbc: 800100 add byte ptr [rcx], 0 -;; 16bbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16bc8: 800100 add byte ptr [rcx], 0 -;; 16bcb: aa stosb byte ptr [rdi], al -;; 16bcc: 800100 add byte ptr [rcx], 0 -;; 16bcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16bd8: 800100 add byte ptr [rcx], 0 -;; 16bdb: aa stosb byte ptr [rdi], al -;; 16bdc: 800100 add byte ptr [rcx], 0 -;; 16bdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16be8: 800100 add byte ptr [rcx], 0 -;; 16beb: aa stosb byte ptr [rdi], al -;; 16bec: 800100 add byte ptr [rcx], 0 -;; 16bef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16bf8: 800100 add byte ptr [rcx], 0 -;; 16bfb: aa stosb byte ptr [rdi], al -;; 16bfc: 800100 add byte ptr [rcx], 0 -;; 16bff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16c08: 800100 add byte ptr [rcx], 0 -;; 16c0b: aa stosb byte ptr [rdi], al -;; 16c0c: 800100 add byte ptr [rcx], 0 -;; 16c0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16c18: 800100 add byte ptr [rcx], 0 -;; 16c1b: aa stosb byte ptr [rdi], al -;; 16c1c: 800100 add byte ptr [rcx], 0 -;; 16c1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16c28: 800100 add byte ptr [rcx], 0 -;; 16c2b: aa stosb byte ptr [rdi], al -;; 16c2c: 800100 add byte ptr [rcx], 0 -;; 16c2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16c38: 800100 add byte ptr [rcx], 0 -;; 16c3b: aa stosb byte ptr [rdi], al -;; 16c3c: 800100 add byte ptr [rcx], 0 -;; 16c3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16c48: 800100 add byte ptr [rcx], 0 -;; 16c4b: aa stosb byte ptr [rdi], al -;; 16c4c: 800100 add byte ptr [rcx], 0 -;; 16c4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16c58: 800100 add byte ptr [rcx], 0 -;; 16c5b: aa stosb byte ptr [rdi], al -;; 16c5c: 800100 add byte ptr [rcx], 0 -;; 16c5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16c68: 800100 add byte ptr [rcx], 0 -;; 16c6b: aa stosb byte ptr [rdi], al -;; 16c6c: 800100 add byte ptr [rcx], 0 -;; 16c6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16c78: 800100 add byte ptr [rcx], 0 -;; 16c7b: aa stosb byte ptr [rdi], al -;; 16c7c: 800100 add byte ptr [rcx], 0 -;; 16c7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16c88: 800100 add byte ptr [rcx], 0 -;; 16c8b: aa stosb byte ptr [rdi], al -;; 16c8c: 800100 add byte ptr [rcx], 0 -;; 16c8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16c98: 800100 add byte ptr [rcx], 0 -;; 16c9b: aa stosb byte ptr [rdi], al -;; 16c9c: 800100 add byte ptr [rcx], 0 -;; 16c9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16ca8: 800100 add byte ptr [rcx], 0 -;; 16cab: aa stosb byte ptr [rdi], al -;; 16cac: 800100 add byte ptr [rcx], 0 -;; 16caf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16cb8: 800100 add byte ptr [rcx], 0 -;; 16cbb: aa stosb byte ptr [rdi], al -;; 16cbc: 800100 add byte ptr [rcx], 0 -;; 16cbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16cc8: 800100 add byte ptr [rcx], 0 -;; 16ccb: aa stosb byte ptr [rdi], al -;; 16ccc: 800100 add byte ptr [rcx], 0 -;; 16ccf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16cd8: 800100 add byte ptr [rcx], 0 -;; 16cdb: aa stosb byte ptr [rdi], al -;; 16cdc: 800100 add byte ptr [rcx], 0 -;; 16cdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16ce8: 800100 add byte ptr [rcx], 0 -;; 16ceb: aa stosb byte ptr [rdi], al -;; 16cec: 800100 add byte ptr [rcx], 0 -;; 16cef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16cf8: 800100 add byte ptr [rcx], 0 -;; 16cfb: aa stosb byte ptr [rdi], al -;; 16cfc: 800100 add byte ptr [rcx], 0 -;; 16cff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16d08: 800100 add byte ptr [rcx], 0 -;; 16d0b: aa stosb byte ptr [rdi], al -;; 16d0c: 800100 add byte ptr [rcx], 0 -;; 16d0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16d18: 800100 add byte ptr [rcx], 0 -;; 16d1b: aa stosb byte ptr [rdi], al -;; 16d1c: 800100 add byte ptr [rcx], 0 -;; 16d1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16d28: 800100 add byte ptr [rcx], 0 -;; 16d2b: aa stosb byte ptr [rdi], al -;; 16d2c: 800100 add byte ptr [rcx], 0 -;; 16d2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16d38: 800100 add byte ptr [rcx], 0 -;; 16d3b: aa stosb byte ptr [rdi], al -;; 16d3c: 800100 add byte ptr [rcx], 0 -;; 16d3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16d48: 800100 add byte ptr [rcx], 0 -;; 16d4b: aa stosb byte ptr [rdi], al -;; 16d4c: 800100 add byte ptr [rcx], 0 -;; 16d4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16d58: 800100 add byte ptr [rcx], 0 -;; 16d5b: aa stosb byte ptr [rdi], al -;; 16d5c: 800100 add byte ptr [rcx], 0 -;; 16d5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16d68: 800100 add byte ptr [rcx], 0 -;; 16d6b: aa stosb byte ptr [rdi], al -;; 16d6c: 800100 add byte ptr [rcx], 0 -;; 16d6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16d78: 800100 add byte ptr [rcx], 0 -;; 16d7b: aa stosb byte ptr [rdi], al -;; 16d7c: 800100 add byte ptr [rcx], 0 -;; 16d7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16d88: 800100 add byte ptr [rcx], 0 -;; 16d8b: aa stosb byte ptr [rdi], al -;; 16d8c: 800100 add byte ptr [rcx], 0 -;; 16d8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16d98: 800100 add byte ptr [rcx], 0 -;; 16d9b: aa stosb byte ptr [rdi], al -;; 16d9c: 800100 add byte ptr [rcx], 0 -;; 16d9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16da8: 800100 add byte ptr [rcx], 0 -;; 16dab: aa stosb byte ptr [rdi], al -;; 16dac: 800100 add byte ptr [rcx], 0 -;; 16daf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16db8: 800100 add byte ptr [rcx], 0 -;; 16dbb: aa stosb byte ptr [rdi], al -;; 16dbc: 800100 add byte ptr [rcx], 0 -;; 16dbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16dc8: 800100 add byte ptr [rcx], 0 -;; 16dcb: aa stosb byte ptr [rdi], al -;; 16dcc: 800100 add byte ptr [rcx], 0 -;; 16dcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16dd8: 800100 add byte ptr [rcx], 0 -;; 16ddb: aa stosb byte ptr [rdi], al -;; 16ddc: 800100 add byte ptr [rcx], 0 -;; 16ddf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16de8: 800100 add byte ptr [rcx], 0 -;; 16deb: aa stosb byte ptr [rdi], al -;; 16dec: 800100 add byte ptr [rcx], 0 -;; 16def: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16df8: 800100 add byte ptr [rcx], 0 -;; 16dfb: aa stosb byte ptr [rdi], al -;; 16dfc: 800100 add byte ptr [rcx], 0 -;; 16dff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16e08: 800100 add byte ptr [rcx], 0 -;; 16e0b: aa stosb byte ptr [rdi], al -;; 16e0c: 800100 add byte ptr [rcx], 0 -;; 16e0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16e18: 800100 add byte ptr [rcx], 0 -;; 16e1b: aa stosb byte ptr [rdi], al -;; 16e1c: 800100 add byte ptr [rcx], 0 -;; 16e1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16e28: 800100 add byte ptr [rcx], 0 -;; 16e2b: aa stosb byte ptr [rdi], al -;; 16e2c: 800100 add byte ptr [rcx], 0 -;; 16e2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16e38: 800100 add byte ptr [rcx], 0 -;; 16e3b: aa stosb byte ptr [rdi], al -;; 16e3c: 800100 add byte ptr [rcx], 0 -;; 16e3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16e48: 800100 add byte ptr [rcx], 0 -;; 16e4b: aa stosb byte ptr [rdi], al -;; 16e4c: 800100 add byte ptr [rcx], 0 -;; 16e4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16e58: 800100 add byte ptr [rcx], 0 -;; 16e5b: aa stosb byte ptr [rdi], al -;; 16e5c: 800100 add byte ptr [rcx], 0 -;; 16e5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16e68: 800100 add byte ptr [rcx], 0 -;; 16e6b: aa stosb byte ptr [rdi], al -;; 16e6c: 800100 add byte ptr [rcx], 0 -;; 16e6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16e78: 800100 add byte ptr [rcx], 0 -;; 16e7b: aa stosb byte ptr [rdi], al -;; 16e7c: 800100 add byte ptr [rcx], 0 -;; 16e7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16e88: 800100 add byte ptr [rcx], 0 -;; 16e8b: aa stosb byte ptr [rdi], al -;; 16e8c: 800100 add byte ptr [rcx], 0 -;; 16e8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16e98: 800100 add byte ptr [rcx], 0 -;; 16e9b: aa stosb byte ptr [rdi], al -;; 16e9c: 800100 add byte ptr [rcx], 0 -;; 16e9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16ea8: 800100 add byte ptr [rcx], 0 -;; 16eab: aa stosb byte ptr [rdi], al -;; 16eac: 800100 add byte ptr [rcx], 0 -;; 16eaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16eb8: 800100 add byte ptr [rcx], 0 -;; 16ebb: aa stosb byte ptr [rdi], al -;; 16ebc: 800100 add byte ptr [rcx], 0 -;; 16ebf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16ec8: 800100 add byte ptr [rcx], 0 -;; 16ecb: aa stosb byte ptr [rdi], al -;; 16ecc: 800100 add byte ptr [rcx], 0 -;; 16ecf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16ed8: 800100 add byte ptr [rcx], 0 -;; 16edb: aa stosb byte ptr [rdi], al -;; 16edc: 800100 add byte ptr [rcx], 0 -;; 16edf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16ee8: 800100 add byte ptr [rcx], 0 -;; 16eeb: aa stosb byte ptr [rdi], al -;; 16eec: 800100 add byte ptr [rcx], 0 -;; 16eef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16ef8: 800100 add byte ptr [rcx], 0 -;; 16efb: aa stosb byte ptr [rdi], al -;; 16efc: 800100 add byte ptr [rcx], 0 -;; 16eff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16f08: 800100 add byte ptr [rcx], 0 -;; 16f0b: aa stosb byte ptr [rdi], al -;; 16f0c: 800100 add byte ptr [rcx], 0 -;; 16f0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16f18: 800100 add byte ptr [rcx], 0 -;; 16f1b: aa stosb byte ptr [rdi], al -;; 16f1c: 800100 add byte ptr [rcx], 0 -;; 16f1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16f28: 800100 add byte ptr [rcx], 0 -;; 16f2b: aa stosb byte ptr [rdi], al -;; 16f2c: 800100 add byte ptr [rcx], 0 -;; 16f2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16f38: 800100 add byte ptr [rcx], 0 -;; 16f3b: aa stosb byte ptr [rdi], al -;; 16f3c: 800100 add byte ptr [rcx], 0 -;; 16f3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16f48: 800100 add byte ptr [rcx], 0 -;; 16f4b: aa stosb byte ptr [rdi], al -;; 16f4c: 800100 add byte ptr [rcx], 0 -;; 16f4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16f58: 800100 add byte ptr [rcx], 0 -;; 16f5b: aa stosb byte ptr [rdi], al -;; 16f5c: 800100 add byte ptr [rcx], 0 -;; 16f5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16f68: 800100 add byte ptr [rcx], 0 -;; 16f6b: aa stosb byte ptr [rdi], al -;; 16f6c: 800100 add byte ptr [rcx], 0 -;; 16f6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16f78: 800100 add byte ptr [rcx], 0 -;; 16f7b: aa stosb byte ptr [rdi], al -;; 16f7c: 800100 add byte ptr [rcx], 0 -;; 16f7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16f88: 800100 add byte ptr [rcx], 0 -;; 16f8b: aa stosb byte ptr [rdi], al -;; 16f8c: 800100 add byte ptr [rcx], 0 -;; 16f8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16f98: 800100 add byte ptr [rcx], 0 -;; 16f9b: aa stosb byte ptr [rdi], al -;; 16f9c: 800100 add byte ptr [rcx], 0 -;; 16f9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16fa8: 800100 add byte ptr [rcx], 0 -;; 16fab: aa stosb byte ptr [rdi], al -;; 16fac: 800100 add byte ptr [rcx], 0 -;; 16faf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16fb8: 800100 add byte ptr [rcx], 0 -;; 16fbb: aa stosb byte ptr [rdi], al -;; 16fbc: 800100 add byte ptr [rcx], 0 -;; 16fbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16fc8: 800100 add byte ptr [rcx], 0 -;; 16fcb: aa stosb byte ptr [rdi], al -;; 16fcc: 800100 add byte ptr [rcx], 0 -;; 16fcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16fd8: 800100 add byte ptr [rcx], 0 -;; 16fdb: aa stosb byte ptr [rdi], al -;; 16fdc: 800100 add byte ptr [rcx], 0 -;; 16fdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16fe8: 800100 add byte ptr [rcx], 0 -;; 16feb: aa stosb byte ptr [rdi], al -;; 16fec: 800100 add byte ptr [rcx], 0 -;; 16fef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 16ff8: 800100 add byte ptr [rcx], 0 -;; 16ffb: aa stosb byte ptr [rdi], al -;; 16ffc: 800100 add byte ptr [rcx], 0 -;; 16fff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17008: 800100 add byte ptr [rcx], 0 -;; 1700b: aa stosb byte ptr [rdi], al -;; 1700c: 800100 add byte ptr [rcx], 0 -;; 1700f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17018: 800100 add byte ptr [rcx], 0 -;; 1701b: aa stosb byte ptr [rdi], al -;; 1701c: 800100 add byte ptr [rcx], 0 -;; 1701f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17028: 800100 add byte ptr [rcx], 0 -;; 1702b: aa stosb byte ptr [rdi], al -;; 1702c: 800100 add byte ptr [rcx], 0 -;; 1702f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17038: 800100 add byte ptr [rcx], 0 -;; 1703b: aa stosb byte ptr [rdi], al -;; 1703c: 800100 add byte ptr [rcx], 0 -;; 1703f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17048: 800100 add byte ptr [rcx], 0 -;; 1704b: aa stosb byte ptr [rdi], al -;; 1704c: 800100 add byte ptr [rcx], 0 -;; 1704f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17058: 800100 add byte ptr [rcx], 0 -;; 1705b: aa stosb byte ptr [rdi], al -;; 1705c: 800100 add byte ptr [rcx], 0 -;; 1705f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17068: 800100 add byte ptr [rcx], 0 -;; 1706b: aa stosb byte ptr [rdi], al -;; 1706c: 800100 add byte ptr [rcx], 0 -;; 1706f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17078: 800100 add byte ptr [rcx], 0 -;; 1707b: aa stosb byte ptr [rdi], al -;; 1707c: 800100 add byte ptr [rcx], 0 -;; 1707f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17088: 800100 add byte ptr [rcx], 0 -;; 1708b: aa stosb byte ptr [rdi], al -;; 1708c: 800100 add byte ptr [rcx], 0 -;; 1708f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17098: 800100 add byte ptr [rcx], 0 -;; 1709b: aa stosb byte ptr [rdi], al -;; 1709c: 800100 add byte ptr [rcx], 0 -;; 1709f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 170a8: 800100 add byte ptr [rcx], 0 -;; 170ab: aa stosb byte ptr [rdi], al -;; 170ac: 800100 add byte ptr [rcx], 0 -;; 170af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 170b8: 800100 add byte ptr [rcx], 0 -;; 170bb: aa stosb byte ptr [rdi], al -;; 170bc: 800100 add byte ptr [rcx], 0 -;; 170bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 170c8: 800100 add byte ptr [rcx], 0 -;; 170cb: aa stosb byte ptr [rdi], al -;; 170cc: 800100 add byte ptr [rcx], 0 -;; 170cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 170d8: 800100 add byte ptr [rcx], 0 -;; 170db: aa stosb byte ptr [rdi], al -;; 170dc: 800100 add byte ptr [rcx], 0 -;; 170df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 170e8: 800100 add byte ptr [rcx], 0 -;; 170eb: aa stosb byte ptr [rdi], al -;; 170ec: 800100 add byte ptr [rcx], 0 -;; 170ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 170f8: 800100 add byte ptr [rcx], 0 -;; 170fb: aa stosb byte ptr [rdi], al -;; 170fc: 800100 add byte ptr [rcx], 0 -;; 170ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17108: 800100 add byte ptr [rcx], 0 -;; 1710b: aa stosb byte ptr [rdi], al -;; 1710c: 800100 add byte ptr [rcx], 0 -;; 1710f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17118: 800100 add byte ptr [rcx], 0 -;; 1711b: aa stosb byte ptr [rdi], al -;; 1711c: 800100 add byte ptr [rcx], 0 -;; 1711f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17128: 800100 add byte ptr [rcx], 0 -;; 1712b: aa stosb byte ptr [rdi], al -;; 1712c: 800100 add byte ptr [rcx], 0 -;; 1712f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17138: 800100 add byte ptr [rcx], 0 -;; 1713b: aa stosb byte ptr [rdi], al -;; 1713c: 800100 add byte ptr [rcx], 0 -;; 1713f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17148: 800100 add byte ptr [rcx], 0 -;; 1714b: aa stosb byte ptr [rdi], al -;; 1714c: 800100 add byte ptr [rcx], 0 -;; 1714f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17158: 800100 add byte ptr [rcx], 0 -;; 1715b: aa stosb byte ptr [rdi], al -;; 1715c: 800100 add byte ptr [rcx], 0 -;; 1715f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17168: 800100 add byte ptr [rcx], 0 -;; 1716b: aa stosb byte ptr [rdi], al -;; 1716c: 800100 add byte ptr [rcx], 0 -;; 1716f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17178: 800100 add byte ptr [rcx], 0 -;; 1717b: aa stosb byte ptr [rdi], al -;; 1717c: 800100 add byte ptr [rcx], 0 -;; 1717f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17188: 800100 add byte ptr [rcx], 0 -;; 1718b: aa stosb byte ptr [rdi], al -;; 1718c: 800100 add byte ptr [rcx], 0 -;; 1718f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17198: 800100 add byte ptr [rcx], 0 -;; 1719b: aa stosb byte ptr [rdi], al -;; 1719c: 800100 add byte ptr [rcx], 0 -;; 1719f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 171a8: 800100 add byte ptr [rcx], 0 -;; 171ab: aa stosb byte ptr [rdi], al -;; 171ac: 800100 add byte ptr [rcx], 0 -;; 171af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 171b8: 800100 add byte ptr [rcx], 0 -;; 171bb: aa stosb byte ptr [rdi], al -;; 171bc: 800100 add byte ptr [rcx], 0 -;; 171bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 171c8: 800100 add byte ptr [rcx], 0 -;; 171cb: aa stosb byte ptr [rdi], al -;; 171cc: 800100 add byte ptr [rcx], 0 -;; 171cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 171d8: 800100 add byte ptr [rcx], 0 -;; 171db: aa stosb byte ptr [rdi], al -;; 171dc: 800100 add byte ptr [rcx], 0 -;; 171df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 171e8: 800100 add byte ptr [rcx], 0 -;; 171eb: aa stosb byte ptr [rdi], al -;; 171ec: 800100 add byte ptr [rcx], 0 -;; 171ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 171f8: 800100 add byte ptr [rcx], 0 -;; 171fb: aa stosb byte ptr [rdi], al -;; 171fc: 800100 add byte ptr [rcx], 0 -;; 171ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17208: 800100 add byte ptr [rcx], 0 -;; 1720b: aa stosb byte ptr [rdi], al -;; 1720c: 800100 add byte ptr [rcx], 0 -;; 1720f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17218: 800100 add byte ptr [rcx], 0 -;; 1721b: aa stosb byte ptr [rdi], al -;; 1721c: 800100 add byte ptr [rcx], 0 -;; 1721f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17228: 800100 add byte ptr [rcx], 0 -;; 1722b: aa stosb byte ptr [rdi], al -;; 1722c: 800100 add byte ptr [rcx], 0 -;; 1722f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17238: 800100 add byte ptr [rcx], 0 -;; 1723b: aa stosb byte ptr [rdi], al -;; 1723c: 800100 add byte ptr [rcx], 0 -;; 1723f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17248: 800100 add byte ptr [rcx], 0 -;; 1724b: aa stosb byte ptr [rdi], al -;; 1724c: 800100 add byte ptr [rcx], 0 -;; 1724f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17258: 800100 add byte ptr [rcx], 0 -;; 1725b: aa stosb byte ptr [rdi], al -;; 1725c: 800100 add byte ptr [rcx], 0 -;; 1725f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17268: 800100 add byte ptr [rcx], 0 -;; 1726b: aa stosb byte ptr [rdi], al -;; 1726c: 800100 add byte ptr [rcx], 0 -;; 1726f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17278: 800100 add byte ptr [rcx], 0 -;; 1727b: aa stosb byte ptr [rdi], al -;; 1727c: 800100 add byte ptr [rcx], 0 -;; 1727f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17288: 800100 add byte ptr [rcx], 0 -;; 1728b: aa stosb byte ptr [rdi], al -;; 1728c: 800100 add byte ptr [rcx], 0 -;; 1728f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17298: 800100 add byte ptr [rcx], 0 -;; 1729b: aa stosb byte ptr [rdi], al -;; 1729c: 800100 add byte ptr [rcx], 0 -;; 1729f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 172a8: 800100 add byte ptr [rcx], 0 -;; 172ab: aa stosb byte ptr [rdi], al -;; 172ac: 800100 add byte ptr [rcx], 0 -;; 172af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 172b8: 800100 add byte ptr [rcx], 0 -;; 172bb: aa stosb byte ptr [rdi], al -;; 172bc: 800100 add byte ptr [rcx], 0 -;; 172bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 172c8: 800100 add byte ptr [rcx], 0 -;; 172cb: aa stosb byte ptr [rdi], al -;; 172cc: 800100 add byte ptr [rcx], 0 -;; 172cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 172d8: 800100 add byte ptr [rcx], 0 -;; 172db: aa stosb byte ptr [rdi], al -;; 172dc: 800100 add byte ptr [rcx], 0 -;; 172df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 172e8: 800100 add byte ptr [rcx], 0 -;; 172eb: aa stosb byte ptr [rdi], al -;; 172ec: 800100 add byte ptr [rcx], 0 -;; 172ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 172f8: 800100 add byte ptr [rcx], 0 -;; 172fb: aa stosb byte ptr [rdi], al -;; 172fc: 800100 add byte ptr [rcx], 0 -;; 172ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17308: 800100 add byte ptr [rcx], 0 -;; 1730b: aa stosb byte ptr [rdi], al -;; 1730c: 800100 add byte ptr [rcx], 0 -;; 1730f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17318: 800100 add byte ptr [rcx], 0 -;; 1731b: aa stosb byte ptr [rdi], al -;; 1731c: 800100 add byte ptr [rcx], 0 -;; 1731f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17328: 800100 add byte ptr [rcx], 0 -;; 1732b: aa stosb byte ptr [rdi], al -;; 1732c: 800100 add byte ptr [rcx], 0 -;; 1732f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17338: 800100 add byte ptr [rcx], 0 -;; 1733b: aa stosb byte ptr [rdi], al -;; 1733c: 800100 add byte ptr [rcx], 0 -;; 1733f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17348: 800100 add byte ptr [rcx], 0 -;; 1734b: aa stosb byte ptr [rdi], al -;; 1734c: 800100 add byte ptr [rcx], 0 -;; 1734f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17358: 800100 add byte ptr [rcx], 0 -;; 1735b: aa stosb byte ptr [rdi], al -;; 1735c: 800100 add byte ptr [rcx], 0 -;; 1735f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17368: 800100 add byte ptr [rcx], 0 -;; 1736b: aa stosb byte ptr [rdi], al -;; 1736c: 800100 add byte ptr [rcx], 0 -;; 1736f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17378: 800100 add byte ptr [rcx], 0 -;; 1737b: aa stosb byte ptr [rdi], al -;; 1737c: 800100 add byte ptr [rcx], 0 -;; 1737f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17388: 800100 add byte ptr [rcx], 0 -;; 1738b: aa stosb byte ptr [rdi], al -;; 1738c: 800100 add byte ptr [rcx], 0 -;; 1738f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17398: 800100 add byte ptr [rcx], 0 -;; 1739b: aa stosb byte ptr [rdi], al -;; 1739c: 800100 add byte ptr [rcx], 0 -;; 1739f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 173a8: 800100 add byte ptr [rcx], 0 -;; 173ab: aa stosb byte ptr [rdi], al -;; 173ac: 800100 add byte ptr [rcx], 0 -;; 173af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 173b8: 800100 add byte ptr [rcx], 0 -;; 173bb: aa stosb byte ptr [rdi], al -;; 173bc: 800100 add byte ptr [rcx], 0 -;; 173bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 173c8: 800100 add byte ptr [rcx], 0 -;; 173cb: aa stosb byte ptr [rdi], al -;; 173cc: 800100 add byte ptr [rcx], 0 -;; 173cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 173d8: 800100 add byte ptr [rcx], 0 -;; 173db: aa stosb byte ptr [rdi], al -;; 173dc: 800100 add byte ptr [rcx], 0 -;; 173df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 173e8: 800100 add byte ptr [rcx], 0 -;; 173eb: aa stosb byte ptr [rdi], al -;; 173ec: 800100 add byte ptr [rcx], 0 -;; 173ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 173f8: 800100 add byte ptr [rcx], 0 -;; 173fb: aa stosb byte ptr [rdi], al -;; 173fc: 800100 add byte ptr [rcx], 0 -;; 173ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17408: 800100 add byte ptr [rcx], 0 -;; 1740b: aa stosb byte ptr [rdi], al -;; 1740c: 800100 add byte ptr [rcx], 0 -;; 1740f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17418: 800100 add byte ptr [rcx], 0 -;; 1741b: aa stosb byte ptr [rdi], al -;; 1741c: 800100 add byte ptr [rcx], 0 -;; 1741f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17428: 800100 add byte ptr [rcx], 0 -;; 1742b: aa stosb byte ptr [rdi], al -;; 1742c: 800100 add byte ptr [rcx], 0 -;; 1742f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17438: 800100 add byte ptr [rcx], 0 -;; 1743b: aa stosb byte ptr [rdi], al -;; 1743c: 800100 add byte ptr [rcx], 0 -;; 1743f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17448: 800100 add byte ptr [rcx], 0 -;; 1744b: aa stosb byte ptr [rdi], al -;; 1744c: 800100 add byte ptr [rcx], 0 -;; 1744f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17458: 800100 add byte ptr [rcx], 0 -;; 1745b: aa stosb byte ptr [rdi], al -;; 1745c: 800100 add byte ptr [rcx], 0 -;; 1745f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17468: 800100 add byte ptr [rcx], 0 -;; 1746b: aa stosb byte ptr [rdi], al -;; 1746c: 800100 add byte ptr [rcx], 0 -;; 1746f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17478: 800100 add byte ptr [rcx], 0 -;; 1747b: aa stosb byte ptr [rdi], al -;; 1747c: 800100 add byte ptr [rcx], 0 -;; 1747f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17488: 800100 add byte ptr [rcx], 0 -;; 1748b: aa stosb byte ptr [rdi], al -;; 1748c: 800100 add byte ptr [rcx], 0 -;; 1748f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17498: 800100 add byte ptr [rcx], 0 -;; 1749b: aa stosb byte ptr [rdi], al -;; 1749c: 800100 add byte ptr [rcx], 0 -;; 1749f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 174a8: 800100 add byte ptr [rcx], 0 -;; 174ab: aa stosb byte ptr [rdi], al -;; 174ac: 800100 add byte ptr [rcx], 0 -;; 174af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 174b8: 800100 add byte ptr [rcx], 0 -;; 174bb: aa stosb byte ptr [rdi], al -;; 174bc: 800100 add byte ptr [rcx], 0 -;; 174bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 174c8: 800100 add byte ptr [rcx], 0 -;; 174cb: aa stosb byte ptr [rdi], al -;; 174cc: 800100 add byte ptr [rcx], 0 -;; 174cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 174d8: 800100 add byte ptr [rcx], 0 -;; 174db: aa stosb byte ptr [rdi], al -;; 174dc: 800100 add byte ptr [rcx], 0 -;; 174df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 174e8: 800100 add byte ptr [rcx], 0 -;; 174eb: aa stosb byte ptr [rdi], al -;; 174ec: 800100 add byte ptr [rcx], 0 -;; 174ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 174f8: 800100 add byte ptr [rcx], 0 -;; 174fb: aa stosb byte ptr [rdi], al -;; 174fc: 800100 add byte ptr [rcx], 0 -;; 174ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17508: 800100 add byte ptr [rcx], 0 -;; 1750b: aa stosb byte ptr [rdi], al -;; 1750c: 800100 add byte ptr [rcx], 0 -;; 1750f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17518: 800100 add byte ptr [rcx], 0 -;; 1751b: aa stosb byte ptr [rdi], al -;; 1751c: 800100 add byte ptr [rcx], 0 -;; 1751f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17528: 800100 add byte ptr [rcx], 0 -;; 1752b: aa stosb byte ptr [rdi], al -;; 1752c: 800100 add byte ptr [rcx], 0 -;; 1752f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17538: 800100 add byte ptr [rcx], 0 -;; 1753b: aa stosb byte ptr [rdi], al -;; 1753c: 800100 add byte ptr [rcx], 0 -;; 1753f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17548: 800100 add byte ptr [rcx], 0 -;; 1754b: aa stosb byte ptr [rdi], al -;; 1754c: 800100 add byte ptr [rcx], 0 -;; 1754f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17558: 800100 add byte ptr [rcx], 0 -;; 1755b: aa stosb byte ptr [rdi], al -;; 1755c: 800100 add byte ptr [rcx], 0 -;; 1755f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17568: 800100 add byte ptr [rcx], 0 -;; 1756b: aa stosb byte ptr [rdi], al -;; 1756c: 800100 add byte ptr [rcx], 0 -;; 1756f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17578: 800100 add byte ptr [rcx], 0 -;; 1757b: aa stosb byte ptr [rdi], al -;; 1757c: 800100 add byte ptr [rcx], 0 -;; 1757f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17588: 800100 add byte ptr [rcx], 0 -;; 1758b: aa stosb byte ptr [rdi], al -;; 1758c: 800100 add byte ptr [rcx], 0 -;; 1758f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17598: 800100 add byte ptr [rcx], 0 -;; 1759b: aa stosb byte ptr [rdi], al -;; 1759c: 800100 add byte ptr [rcx], 0 -;; 1759f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 175a8: 800100 add byte ptr [rcx], 0 -;; 175ab: aa stosb byte ptr [rdi], al -;; 175ac: 800100 add byte ptr [rcx], 0 -;; 175af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 175b8: 800100 add byte ptr [rcx], 0 -;; 175bb: aa stosb byte ptr [rdi], al -;; 175bc: 800100 add byte ptr [rcx], 0 -;; 175bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 175c8: 800100 add byte ptr [rcx], 0 -;; 175cb: aa stosb byte ptr [rdi], al -;; 175cc: 800100 add byte ptr [rcx], 0 -;; 175cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 175d8: 800100 add byte ptr [rcx], 0 -;; 175db: aa stosb byte ptr [rdi], al -;; 175dc: 800100 add byte ptr [rcx], 0 -;; 175df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 175e8: 800100 add byte ptr [rcx], 0 -;; 175eb: aa stosb byte ptr [rdi], al -;; 175ec: 800100 add byte ptr [rcx], 0 -;; 175ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 175f8: 800100 add byte ptr [rcx], 0 -;; 175fb: aa stosb byte ptr [rdi], al -;; 175fc: 800100 add byte ptr [rcx], 0 -;; 175ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17608: 800100 add byte ptr [rcx], 0 -;; 1760b: aa stosb byte ptr [rdi], al -;; 1760c: 800100 add byte ptr [rcx], 0 -;; 1760f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17618: 800100 add byte ptr [rcx], 0 -;; 1761b: aa stosb byte ptr [rdi], al -;; 1761c: 800100 add byte ptr [rcx], 0 -;; 1761f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17628: 800100 add byte ptr [rcx], 0 -;; 1762b: aa stosb byte ptr [rdi], al -;; 1762c: 800100 add byte ptr [rcx], 0 -;; 1762f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17638: 800100 add byte ptr [rcx], 0 -;; 1763b: aa stosb byte ptr [rdi], al -;; 1763c: 800100 add byte ptr [rcx], 0 -;; 1763f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17648: 800100 add byte ptr [rcx], 0 -;; 1764b: aa stosb byte ptr [rdi], al -;; 1764c: 800100 add byte ptr [rcx], 0 -;; 1764f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17658: 800100 add byte ptr [rcx], 0 -;; 1765b: aa stosb byte ptr [rdi], al -;; 1765c: 800100 add byte ptr [rcx], 0 -;; 1765f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17668: 800100 add byte ptr [rcx], 0 -;; 1766b: aa stosb byte ptr [rdi], al -;; 1766c: 800100 add byte ptr [rcx], 0 -;; 1766f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17678: 800100 add byte ptr [rcx], 0 -;; 1767b: aa stosb byte ptr [rdi], al -;; 1767c: 800100 add byte ptr [rcx], 0 -;; 1767f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17688: 800100 add byte ptr [rcx], 0 -;; 1768b: aa stosb byte ptr [rdi], al -;; 1768c: 800100 add byte ptr [rcx], 0 -;; 1768f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17698: 800100 add byte ptr [rcx], 0 -;; 1769b: aa stosb byte ptr [rdi], al -;; 1769c: 800100 add byte ptr [rcx], 0 -;; 1769f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 176a8: 800100 add byte ptr [rcx], 0 -;; 176ab: aa stosb byte ptr [rdi], al -;; 176ac: 800100 add byte ptr [rcx], 0 -;; 176af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 176b8: 800100 add byte ptr [rcx], 0 -;; 176bb: aa stosb byte ptr [rdi], al -;; 176bc: 800100 add byte ptr [rcx], 0 -;; 176bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 176c8: 800100 add byte ptr [rcx], 0 -;; 176cb: aa stosb byte ptr [rdi], al -;; 176cc: 800100 add byte ptr [rcx], 0 -;; 176cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 176d8: 800100 add byte ptr [rcx], 0 -;; 176db: aa stosb byte ptr [rdi], al -;; 176dc: 800100 add byte ptr [rcx], 0 -;; 176df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 176e8: 800100 add byte ptr [rcx], 0 -;; 176eb: aa stosb byte ptr [rdi], al -;; 176ec: 800100 add byte ptr [rcx], 0 -;; 176ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 176f8: 800100 add byte ptr [rcx], 0 -;; 176fb: aa stosb byte ptr [rdi], al -;; 176fc: 800100 add byte ptr [rcx], 0 -;; 176ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17708: 800100 add byte ptr [rcx], 0 -;; 1770b: aa stosb byte ptr [rdi], al -;; 1770c: 800100 add byte ptr [rcx], 0 -;; 1770f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17718: 800100 add byte ptr [rcx], 0 -;; 1771b: aa stosb byte ptr [rdi], al -;; 1771c: 800100 add byte ptr [rcx], 0 -;; 1771f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17728: 800100 add byte ptr [rcx], 0 -;; 1772b: aa stosb byte ptr [rdi], al -;; 1772c: 800100 add byte ptr [rcx], 0 -;; 1772f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17738: 800100 add byte ptr [rcx], 0 -;; 1773b: aa stosb byte ptr [rdi], al -;; 1773c: 800100 add byte ptr [rcx], 0 -;; 1773f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17748: 800100 add byte ptr [rcx], 0 -;; 1774b: aa stosb byte ptr [rdi], al -;; 1774c: 800100 add byte ptr [rcx], 0 -;; 1774f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17758: 800100 add byte ptr [rcx], 0 -;; 1775b: aa stosb byte ptr [rdi], al -;; 1775c: 800100 add byte ptr [rcx], 0 -;; 1775f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17768: 800100 add byte ptr [rcx], 0 -;; 1776b: aa stosb byte ptr [rdi], al -;; 1776c: 800100 add byte ptr [rcx], 0 -;; 1776f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17778: 800100 add byte ptr [rcx], 0 -;; 1777b: aa stosb byte ptr [rdi], al -;; 1777c: 800100 add byte ptr [rcx], 0 -;; 1777f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17788: 800100 add byte ptr [rcx], 0 -;; 1778b: aa stosb byte ptr [rdi], al -;; 1778c: 800100 add byte ptr [rcx], 0 -;; 1778f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17798: 800100 add byte ptr [rcx], 0 -;; 1779b: aa stosb byte ptr [rdi], al -;; 1779c: 800100 add byte ptr [rcx], 0 -;; 1779f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 177a8: 800100 add byte ptr [rcx], 0 -;; 177ab: aa stosb byte ptr [rdi], al -;; 177ac: 800100 add byte ptr [rcx], 0 -;; 177af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 177b8: 800100 add byte ptr [rcx], 0 -;; 177bb: aa stosb byte ptr [rdi], al -;; 177bc: 800100 add byte ptr [rcx], 0 -;; 177bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 177c8: 800100 add byte ptr [rcx], 0 -;; 177cb: aa stosb byte ptr [rdi], al -;; 177cc: 800100 add byte ptr [rcx], 0 -;; 177cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 177d8: 800100 add byte ptr [rcx], 0 -;; 177db: aa stosb byte ptr [rdi], al -;; 177dc: 800100 add byte ptr [rcx], 0 -;; 177df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 177e8: 800100 add byte ptr [rcx], 0 -;; 177eb: aa stosb byte ptr [rdi], al -;; 177ec: 800100 add byte ptr [rcx], 0 -;; 177ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 177f8: 800100 add byte ptr [rcx], 0 -;; 177fb: aa stosb byte ptr [rdi], al -;; 177fc: 800100 add byte ptr [rcx], 0 -;; 177ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17808: 800100 add byte ptr [rcx], 0 -;; 1780b: aa stosb byte ptr [rdi], al -;; 1780c: 800100 add byte ptr [rcx], 0 -;; 1780f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17818: 800100 add byte ptr [rcx], 0 -;; 1781b: aa stosb byte ptr [rdi], al -;; 1781c: 800100 add byte ptr [rcx], 0 -;; 1781f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17828: 800100 add byte ptr [rcx], 0 -;; 1782b: aa stosb byte ptr [rdi], al -;; 1782c: 800100 add byte ptr [rcx], 0 -;; 1782f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17838: 800100 add byte ptr [rcx], 0 -;; 1783b: aa stosb byte ptr [rdi], al -;; 1783c: 800100 add byte ptr [rcx], 0 -;; 1783f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17848: 800100 add byte ptr [rcx], 0 -;; 1784b: aa stosb byte ptr [rdi], al -;; 1784c: 800100 add byte ptr [rcx], 0 -;; 1784f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17858: 800100 add byte ptr [rcx], 0 -;; 1785b: aa stosb byte ptr [rdi], al -;; 1785c: 800100 add byte ptr [rcx], 0 -;; 1785f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17868: 800100 add byte ptr [rcx], 0 -;; 1786b: aa stosb byte ptr [rdi], al -;; 1786c: 800100 add byte ptr [rcx], 0 -;; 1786f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17878: 800100 add byte ptr [rcx], 0 -;; 1787b: aa stosb byte ptr [rdi], al -;; 1787c: 800100 add byte ptr [rcx], 0 -;; 1787f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17888: 800100 add byte ptr [rcx], 0 -;; 1788b: aa stosb byte ptr [rdi], al -;; 1788c: 800100 add byte ptr [rcx], 0 -;; 1788f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17898: 800100 add byte ptr [rcx], 0 -;; 1789b: aa stosb byte ptr [rdi], al -;; 1789c: 800100 add byte ptr [rcx], 0 -;; 1789f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 178a8: 800100 add byte ptr [rcx], 0 -;; 178ab: aa stosb byte ptr [rdi], al -;; 178ac: 800100 add byte ptr [rcx], 0 -;; 178af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 178b8: 800100 add byte ptr [rcx], 0 -;; 178bb: aa stosb byte ptr [rdi], al -;; 178bc: 800100 add byte ptr [rcx], 0 -;; 178bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 178c8: 800100 add byte ptr [rcx], 0 -;; 178cb: aa stosb byte ptr [rdi], al -;; 178cc: 800100 add byte ptr [rcx], 0 -;; 178cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 178d8: 800100 add byte ptr [rcx], 0 -;; 178db: aa stosb byte ptr [rdi], al -;; 178dc: 800100 add byte ptr [rcx], 0 -;; 178df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 178e8: 800100 add byte ptr [rcx], 0 -;; 178eb: aa stosb byte ptr [rdi], al -;; 178ec: 800100 add byte ptr [rcx], 0 -;; 178ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 178f8: 800100 add byte ptr [rcx], 0 -;; 178fb: aa stosb byte ptr [rdi], al -;; 178fc: 800100 add byte ptr [rcx], 0 -;; 178ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17908: 800100 add byte ptr [rcx], 0 -;; 1790b: aa stosb byte ptr [rdi], al -;; 1790c: 800100 add byte ptr [rcx], 0 -;; 1790f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17918: 800100 add byte ptr [rcx], 0 -;; 1791b: aa stosb byte ptr [rdi], al -;; 1791c: 800100 add byte ptr [rcx], 0 -;; 1791f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17928: 800100 add byte ptr [rcx], 0 -;; 1792b: aa stosb byte ptr [rdi], al -;; 1792c: 800100 add byte ptr [rcx], 0 -;; 1792f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17938: 800100 add byte ptr [rcx], 0 -;; 1793b: aa stosb byte ptr [rdi], al -;; 1793c: 800100 add byte ptr [rcx], 0 -;; 1793f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17948: 800100 add byte ptr [rcx], 0 -;; 1794b: aa stosb byte ptr [rdi], al -;; 1794c: 800100 add byte ptr [rcx], 0 -;; 1794f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17958: 800100 add byte ptr [rcx], 0 -;; 1795b: aa stosb byte ptr [rdi], al -;; 1795c: 800100 add byte ptr [rcx], 0 -;; 1795f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17968: 800100 add byte ptr [rcx], 0 -;; 1796b: aa stosb byte ptr [rdi], al -;; 1796c: 800100 add byte ptr [rcx], 0 -;; 1796f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17978: 800100 add byte ptr [rcx], 0 -;; 1797b: aa stosb byte ptr [rdi], al -;; 1797c: 800100 add byte ptr [rcx], 0 -;; 1797f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17988: 800100 add byte ptr [rcx], 0 -;; 1798b: aa stosb byte ptr [rdi], al -;; 1798c: 800100 add byte ptr [rcx], 0 -;; 1798f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17998: 800100 add byte ptr [rcx], 0 -;; 1799b: aa stosb byte ptr [rdi], al -;; 1799c: 800100 add byte ptr [rcx], 0 -;; 1799f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 179a8: 800100 add byte ptr [rcx], 0 -;; 179ab: aa stosb byte ptr [rdi], al -;; 179ac: 800100 add byte ptr [rcx], 0 -;; 179af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 179b8: 800100 add byte ptr [rcx], 0 -;; 179bb: aa stosb byte ptr [rdi], al -;; 179bc: 800100 add byte ptr [rcx], 0 -;; 179bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 179c8: 800100 add byte ptr [rcx], 0 -;; 179cb: aa stosb byte ptr [rdi], al -;; 179cc: 800100 add byte ptr [rcx], 0 -;; 179cf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 179d8: 800100 add byte ptr [rcx], 0 -;; 179db: aa stosb byte ptr [rdi], al -;; 179dc: 800100 add byte ptr [rcx], 0 -;; 179df: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 179e8: 800100 add byte ptr [rcx], 0 -;; 179eb: aa stosb byte ptr [rdi], al -;; 179ec: 800100 add byte ptr [rcx], 0 -;; 179ef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 179f8: 800100 add byte ptr [rcx], 0 -;; 179fb: aa stosb byte ptr [rdi], al -;; 179fc: 800100 add byte ptr [rcx], 0 -;; 179ff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17a08: 800100 add byte ptr [rcx], 0 -;; 17a0b: aa stosb byte ptr [rdi], al -;; 17a0c: 800100 add byte ptr [rcx], 0 -;; 17a0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17a18: 800100 add byte ptr [rcx], 0 -;; 17a1b: aa stosb byte ptr [rdi], al -;; 17a1c: 800100 add byte ptr [rcx], 0 -;; 17a1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17a28: 800100 add byte ptr [rcx], 0 -;; 17a2b: aa stosb byte ptr [rdi], al -;; 17a2c: 800100 add byte ptr [rcx], 0 -;; 17a2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17a38: 800100 add byte ptr [rcx], 0 -;; 17a3b: aa stosb byte ptr [rdi], al -;; 17a3c: 800100 add byte ptr [rcx], 0 -;; 17a3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17a48: 800100 add byte ptr [rcx], 0 -;; 17a4b: aa stosb byte ptr [rdi], al -;; 17a4c: 800100 add byte ptr [rcx], 0 -;; 17a4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17a58: 800100 add byte ptr [rcx], 0 -;; 17a5b: aa stosb byte ptr [rdi], al -;; 17a5c: 800100 add byte ptr [rcx], 0 -;; 17a5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17a68: 800100 add byte ptr [rcx], 0 -;; 17a6b: aa stosb byte ptr [rdi], al -;; 17a6c: 800100 add byte ptr [rcx], 0 -;; 17a6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17a78: 800100 add byte ptr [rcx], 0 -;; 17a7b: aa stosb byte ptr [rdi], al -;; 17a7c: 800100 add byte ptr [rcx], 0 -;; 17a7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17a88: 800100 add byte ptr [rcx], 0 -;; 17a8b: aa stosb byte ptr [rdi], al -;; 17a8c: 800100 add byte ptr [rcx], 0 -;; 17a8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17a98: 800100 add byte ptr [rcx], 0 -;; 17a9b: aa stosb byte ptr [rdi], al -;; 17a9c: 800100 add byte ptr [rcx], 0 -;; 17a9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17aa8: 800100 add byte ptr [rcx], 0 -;; 17aab: aa stosb byte ptr [rdi], al -;; 17aac: 800100 add byte ptr [rcx], 0 -;; 17aaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17ab8: 800100 add byte ptr [rcx], 0 -;; 17abb: aa stosb byte ptr [rdi], al -;; 17abc: 800100 add byte ptr [rcx], 0 -;; 17abf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17ac8: 800100 add byte ptr [rcx], 0 -;; 17acb: aa stosb byte ptr [rdi], al -;; 17acc: 800100 add byte ptr [rcx], 0 -;; 17acf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17ad8: 800100 add byte ptr [rcx], 0 -;; 17adb: aa stosb byte ptr [rdi], al -;; 17adc: 800100 add byte ptr [rcx], 0 -;; 17adf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17ae8: 800100 add byte ptr [rcx], 0 -;; 17aeb: aa stosb byte ptr [rdi], al -;; 17aec: 800100 add byte ptr [rcx], 0 -;; 17aef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17af8: 800100 add byte ptr [rcx], 0 -;; 17afb: aa stosb byte ptr [rdi], al -;; 17afc: 800100 add byte ptr [rcx], 0 -;; 17aff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17b08: 800100 add byte ptr [rcx], 0 -;; 17b0b: aa stosb byte ptr [rdi], al -;; 17b0c: 800100 add byte ptr [rcx], 0 -;; 17b0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17b18: 800100 add byte ptr [rcx], 0 -;; 17b1b: aa stosb byte ptr [rdi], al -;; 17b1c: 800100 add byte ptr [rcx], 0 -;; 17b1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17b28: 800100 add byte ptr [rcx], 0 -;; 17b2b: aa stosb byte ptr [rdi], al -;; 17b2c: 800100 add byte ptr [rcx], 0 -;; 17b2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17b38: 800100 add byte ptr [rcx], 0 -;; 17b3b: aa stosb byte ptr [rdi], al -;; 17b3c: 800100 add byte ptr [rcx], 0 -;; 17b3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17b48: 800100 add byte ptr [rcx], 0 -;; 17b4b: aa stosb byte ptr [rdi], al -;; 17b4c: 800100 add byte ptr [rcx], 0 -;; 17b4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17b58: 800100 add byte ptr [rcx], 0 -;; 17b5b: aa stosb byte ptr [rdi], al -;; 17b5c: 800100 add byte ptr [rcx], 0 -;; 17b5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17b68: 800100 add byte ptr [rcx], 0 -;; 17b6b: aa stosb byte ptr [rdi], al -;; 17b6c: 800100 add byte ptr [rcx], 0 -;; 17b6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17b78: 800100 add byte ptr [rcx], 0 -;; 17b7b: aa stosb byte ptr [rdi], al -;; 17b7c: 800100 add byte ptr [rcx], 0 -;; 17b7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17b88: 800100 add byte ptr [rcx], 0 -;; 17b8b: aa stosb byte ptr [rdi], al -;; 17b8c: 800100 add byte ptr [rcx], 0 -;; 17b8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17b98: 800100 add byte ptr [rcx], 0 -;; 17b9b: aa stosb byte ptr [rdi], al -;; 17b9c: 800100 add byte ptr [rcx], 0 -;; 17b9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17ba8: 800100 add byte ptr [rcx], 0 -;; 17bab: aa stosb byte ptr [rdi], al -;; 17bac: 800100 add byte ptr [rcx], 0 -;; 17baf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17bb8: 800100 add byte ptr [rcx], 0 -;; 17bbb: aa stosb byte ptr [rdi], al -;; 17bbc: 800100 add byte ptr [rcx], 0 -;; 17bbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17bc8: 800100 add byte ptr [rcx], 0 -;; 17bcb: aa stosb byte ptr [rdi], al -;; 17bcc: 800100 add byte ptr [rcx], 0 -;; 17bcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17bd8: 800100 add byte ptr [rcx], 0 -;; 17bdb: aa stosb byte ptr [rdi], al -;; 17bdc: 800100 add byte ptr [rcx], 0 -;; 17bdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17be8: 800100 add byte ptr [rcx], 0 -;; 17beb: aa stosb byte ptr [rdi], al -;; 17bec: 800100 add byte ptr [rcx], 0 -;; 17bef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17bf8: 800100 add byte ptr [rcx], 0 -;; 17bfb: aa stosb byte ptr [rdi], al -;; 17bfc: 800100 add byte ptr [rcx], 0 -;; 17bff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17c08: 800100 add byte ptr [rcx], 0 -;; 17c0b: aa stosb byte ptr [rdi], al -;; 17c0c: 800100 add byte ptr [rcx], 0 -;; 17c0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17c18: 800100 add byte ptr [rcx], 0 -;; 17c1b: aa stosb byte ptr [rdi], al -;; 17c1c: 800100 add byte ptr [rcx], 0 -;; 17c1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17c28: 800100 add byte ptr [rcx], 0 -;; 17c2b: aa stosb byte ptr [rdi], al -;; 17c2c: 800100 add byte ptr [rcx], 0 -;; 17c2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17c38: 800100 add byte ptr [rcx], 0 -;; 17c3b: aa stosb byte ptr [rdi], al -;; 17c3c: 800100 add byte ptr [rcx], 0 -;; 17c3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17c48: 800100 add byte ptr [rcx], 0 -;; 17c4b: aa stosb byte ptr [rdi], al -;; 17c4c: 800100 add byte ptr [rcx], 0 -;; 17c4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17c58: 800100 add byte ptr [rcx], 0 -;; 17c5b: aa stosb byte ptr [rdi], al -;; 17c5c: 800100 add byte ptr [rcx], 0 -;; 17c5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17c68: 800100 add byte ptr [rcx], 0 -;; 17c6b: aa stosb byte ptr [rdi], al -;; 17c6c: 800100 add byte ptr [rcx], 0 -;; 17c6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17c78: 800100 add byte ptr [rcx], 0 -;; 17c7b: aa stosb byte ptr [rdi], al -;; 17c7c: 800100 add byte ptr [rcx], 0 -;; 17c7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17c88: 800100 add byte ptr [rcx], 0 -;; 17c8b: aa stosb byte ptr [rdi], al -;; 17c8c: 800100 add byte ptr [rcx], 0 -;; 17c8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17c98: 800100 add byte ptr [rcx], 0 -;; 17c9b: aa stosb byte ptr [rdi], al -;; 17c9c: 800100 add byte ptr [rcx], 0 -;; 17c9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17ca8: 800100 add byte ptr [rcx], 0 -;; 17cab: aa stosb byte ptr [rdi], al -;; 17cac: 800100 add byte ptr [rcx], 0 -;; 17caf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17cb8: 800100 add byte ptr [rcx], 0 -;; 17cbb: aa stosb byte ptr [rdi], al -;; 17cbc: 800100 add byte ptr [rcx], 0 -;; 17cbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17cc8: 800100 add byte ptr [rcx], 0 -;; 17ccb: aa stosb byte ptr [rdi], al -;; 17ccc: 800100 add byte ptr [rcx], 0 -;; 17ccf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17cd8: 800100 add byte ptr [rcx], 0 -;; 17cdb: aa stosb byte ptr [rdi], al -;; 17cdc: 800100 add byte ptr [rcx], 0 -;; 17cdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17ce8: 800100 add byte ptr [rcx], 0 -;; 17ceb: aa stosb byte ptr [rdi], al -;; 17cec: 800100 add byte ptr [rcx], 0 -;; 17cef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17cf8: 800100 add byte ptr [rcx], 0 -;; 17cfb: aa stosb byte ptr [rdi], al -;; 17cfc: 800100 add byte ptr [rcx], 0 -;; 17cff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17d08: 800100 add byte ptr [rcx], 0 -;; 17d0b: aa stosb byte ptr [rdi], al -;; 17d0c: 800100 add byte ptr [rcx], 0 -;; 17d0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17d18: 800100 add byte ptr [rcx], 0 -;; 17d1b: aa stosb byte ptr [rdi], al -;; 17d1c: 800100 add byte ptr [rcx], 0 -;; 17d1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17d28: 800100 add byte ptr [rcx], 0 -;; 17d2b: aa stosb byte ptr [rdi], al -;; 17d2c: 800100 add byte ptr [rcx], 0 -;; 17d2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17d38: 800100 add byte ptr [rcx], 0 -;; 17d3b: aa stosb byte ptr [rdi], al -;; 17d3c: 800100 add byte ptr [rcx], 0 -;; 17d3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17d48: 800100 add byte ptr [rcx], 0 -;; 17d4b: aa stosb byte ptr [rdi], al -;; 17d4c: 800100 add byte ptr [rcx], 0 -;; 17d4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17d58: 800100 add byte ptr [rcx], 0 -;; 17d5b: aa stosb byte ptr [rdi], al -;; 17d5c: 800100 add byte ptr [rcx], 0 -;; 17d5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17d68: 800100 add byte ptr [rcx], 0 -;; 17d6b: aa stosb byte ptr [rdi], al -;; 17d6c: 800100 add byte ptr [rcx], 0 -;; 17d6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17d78: 800100 add byte ptr [rcx], 0 -;; 17d7b: aa stosb byte ptr [rdi], al -;; 17d7c: 800100 add byte ptr [rcx], 0 -;; 17d7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17d88: 800100 add byte ptr [rcx], 0 -;; 17d8b: aa stosb byte ptr [rdi], al -;; 17d8c: 800100 add byte ptr [rcx], 0 -;; 17d8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17d98: 800100 add byte ptr [rcx], 0 -;; 17d9b: aa stosb byte ptr [rdi], al -;; 17d9c: 800100 add byte ptr [rcx], 0 -;; 17d9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17da8: 800100 add byte ptr [rcx], 0 -;; 17dab: aa stosb byte ptr [rdi], al -;; 17dac: 800100 add byte ptr [rcx], 0 -;; 17daf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17db8: 800100 add byte ptr [rcx], 0 -;; 17dbb: aa stosb byte ptr [rdi], al -;; 17dbc: 800100 add byte ptr [rcx], 0 -;; 17dbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17dc8: 800100 add byte ptr [rcx], 0 -;; 17dcb: aa stosb byte ptr [rdi], al -;; 17dcc: 800100 add byte ptr [rcx], 0 -;; 17dcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17dd8: 800100 add byte ptr [rcx], 0 -;; 17ddb: aa stosb byte ptr [rdi], al -;; 17ddc: 800100 add byte ptr [rcx], 0 -;; 17ddf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17de8: 800100 add byte ptr [rcx], 0 -;; 17deb: aa stosb byte ptr [rdi], al -;; 17dec: 800100 add byte ptr [rcx], 0 -;; 17def: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17df8: 800100 add byte ptr [rcx], 0 -;; 17dfb: aa stosb byte ptr [rdi], al -;; 17dfc: 800100 add byte ptr [rcx], 0 -;; 17dff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17e08: 800100 add byte ptr [rcx], 0 -;; 17e0b: aa stosb byte ptr [rdi], al -;; 17e0c: 800100 add byte ptr [rcx], 0 -;; 17e0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17e18: 800100 add byte ptr [rcx], 0 -;; 17e1b: aa stosb byte ptr [rdi], al -;; 17e1c: 800100 add byte ptr [rcx], 0 -;; 17e1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17e28: 800100 add byte ptr [rcx], 0 -;; 17e2b: aa stosb byte ptr [rdi], al -;; 17e2c: 800100 add byte ptr [rcx], 0 -;; 17e2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17e38: 800100 add byte ptr [rcx], 0 -;; 17e3b: aa stosb byte ptr [rdi], al -;; 17e3c: 800100 add byte ptr [rcx], 0 -;; 17e3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17e48: 800100 add byte ptr [rcx], 0 -;; 17e4b: aa stosb byte ptr [rdi], al -;; 17e4c: 800100 add byte ptr [rcx], 0 -;; 17e4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17e58: 800100 add byte ptr [rcx], 0 -;; 17e5b: aa stosb byte ptr [rdi], al -;; 17e5c: 800100 add byte ptr [rcx], 0 -;; 17e5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17e68: 800100 add byte ptr [rcx], 0 -;; 17e6b: aa stosb byte ptr [rdi], al -;; 17e6c: 800100 add byte ptr [rcx], 0 -;; 17e6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17e78: 800100 add byte ptr [rcx], 0 -;; 17e7b: aa stosb byte ptr [rdi], al -;; 17e7c: 800100 add byte ptr [rcx], 0 -;; 17e7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17e88: 800100 add byte ptr [rcx], 0 -;; 17e8b: aa stosb byte ptr [rdi], al -;; 17e8c: 800100 add byte ptr [rcx], 0 -;; 17e8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17e98: 800100 add byte ptr [rcx], 0 -;; 17e9b: aa stosb byte ptr [rdi], al -;; 17e9c: 800100 add byte ptr [rcx], 0 -;; 17e9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17ea8: 800100 add byte ptr [rcx], 0 -;; 17eab: aa stosb byte ptr [rdi], al -;; 17eac: 800100 add byte ptr [rcx], 0 -;; 17eaf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17eb8: 800100 add byte ptr [rcx], 0 -;; 17ebb: aa stosb byte ptr [rdi], al -;; 17ebc: 800100 add byte ptr [rcx], 0 -;; 17ebf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17ec8: 800100 add byte ptr [rcx], 0 -;; 17ecb: aa stosb byte ptr [rdi], al -;; 17ecc: 800100 add byte ptr [rcx], 0 -;; 17ecf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17ed8: 800100 add byte ptr [rcx], 0 -;; 17edb: aa stosb byte ptr [rdi], al -;; 17edc: 800100 add byte ptr [rcx], 0 -;; 17edf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17ee8: 800100 add byte ptr [rcx], 0 -;; 17eeb: aa stosb byte ptr [rdi], al -;; 17eec: 800100 add byte ptr [rcx], 0 -;; 17eef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17ef8: 800100 add byte ptr [rcx], 0 -;; 17efb: aa stosb byte ptr [rdi], al -;; 17efc: 800100 add byte ptr [rcx], 0 -;; 17eff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17f08: 800100 add byte ptr [rcx], 0 -;; 17f0b: aa stosb byte ptr [rdi], al -;; 17f0c: 800100 add byte ptr [rcx], 0 -;; 17f0f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17f18: 800100 add byte ptr [rcx], 0 -;; 17f1b: aa stosb byte ptr [rdi], al -;; 17f1c: 800100 add byte ptr [rcx], 0 -;; 17f1f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17f28: 800100 add byte ptr [rcx], 0 -;; 17f2b: aa stosb byte ptr [rdi], al -;; 17f2c: 800100 add byte ptr [rcx], 0 -;; 17f2f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17f38: 800100 add byte ptr [rcx], 0 -;; 17f3b: aa stosb byte ptr [rdi], al -;; 17f3c: 800100 add byte ptr [rcx], 0 -;; 17f3f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17f48: 800100 add byte ptr [rcx], 0 -;; 17f4b: aa stosb byte ptr [rdi], al -;; 17f4c: 800100 add byte ptr [rcx], 0 -;; 17f4f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17f58: 800100 add byte ptr [rcx], 0 -;; 17f5b: aa stosb byte ptr [rdi], al -;; 17f5c: 800100 add byte ptr [rcx], 0 -;; 17f5f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17f68: 800100 add byte ptr [rcx], 0 -;; 17f6b: aa stosb byte ptr [rdi], al -;; 17f6c: 800100 add byte ptr [rcx], 0 -;; 17f6f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17f78: 800100 add byte ptr [rcx], 0 -;; 17f7b: aa stosb byte ptr [rdi], al -;; 17f7c: 800100 add byte ptr [rcx], 0 -;; 17f7f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17f88: 800100 add byte ptr [rcx], 0 -;; 17f8b: aa stosb byte ptr [rdi], al -;; 17f8c: 800100 add byte ptr [rcx], 0 -;; 17f8f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17f98: 800100 add byte ptr [rcx], 0 -;; 17f9b: aa stosb byte ptr [rdi], al -;; 17f9c: 800100 add byte ptr [rcx], 0 -;; 17f9f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17fa8: 800100 add byte ptr [rcx], 0 -;; 17fab: aa stosb byte ptr [rdi], al -;; 17fac: 800100 add byte ptr [rcx], 0 -;; 17faf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17fb8: 800100 add byte ptr [rcx], 0 -;; 17fbb: aa stosb byte ptr [rdi], al -;; 17fbc: 800100 add byte ptr [rcx], 0 -;; 17fbf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17fc8: 800100 add byte ptr [rcx], 0 -;; 17fcb: aa stosb byte ptr [rdi], al -;; 17fcc: 800100 add byte ptr [rcx], 0 -;; 17fcf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17fd8: 800100 add byte ptr [rcx], 0 -;; 17fdb: aa stosb byte ptr [rdi], al -;; 17fdc: 800100 add byte ptr [rcx], 0 -;; 17fdf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17fe8: 800100 add byte ptr [rcx], 0 -;; 17feb: aa stosb byte ptr [rdi], al -;; 17fec: 800100 add byte ptr [rcx], 0 -;; 17fef: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 17ff8: 800100 add byte ptr [rcx], 0 -;; 17ffb: aa stosb byte ptr [rdi], al -;; 17ffc: 800100 add byte ptr [rcx], 0 -;; 17fff: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 18008: 800100 add byte ptr [rcx], 0 -;; 1800b: aa stosb byte ptr [rdi], al -;; 1800c: 800100 add byte ptr [rcx], 0 -;; 1800f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 18018: 800100 add byte ptr [rcx], 0 -;; 1801b: aa stosb byte ptr [rdi], al -;; 1801c: 800100 add byte ptr [rcx], 0 -;; 1801f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 18028: 800100 add byte ptr [rcx], 0 -;; 1802b: aa stosb byte ptr [rdi], al -;; 1802c: 800100 add byte ptr [rcx], 0 -;; 1802f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 18038: 800100 add byte ptr [rcx], 0 -;; 1803b: aa stosb byte ptr [rdi], al -;; 1803c: 800100 add byte ptr [rcx], 0 -;; 1803f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 18048: 800100 add byte ptr [rcx], 0 -;; 1804b: aa stosb byte ptr [rdi], al -;; 1804c: 800100 add byte ptr [rcx], 0 -;; 1804f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 18058: 800100 add byte ptr [rcx], 0 -;; 1805b: aa stosb byte ptr [rdi], al -;; 1805c: 800100 add byte ptr [rcx], 0 -;; 1805f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 18068: 800100 add byte ptr [rcx], 0 -;; 1806b: aa stosb byte ptr [rdi], al -;; 1806c: 800100 add byte ptr [rcx], 0 -;; 1806f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 18078: 800100 add byte ptr [rcx], 0 -;; 1807b: aa stosb byte ptr [rdi], al -;; 1807c: 800100 add byte ptr [rcx], 0 -;; 1807f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 18088: 800100 add byte ptr [rcx], 0 -;; 1808b: aa stosb byte ptr [rdi], al -;; 1808c: 800100 add byte ptr [rcx], 0 -;; 1808f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 18098: 800100 add byte ptr [rcx], 0 -;; 1809b: aa stosb byte ptr [rdi], al -;; 1809c: 800100 add byte ptr [rcx], 0 -;; 1809f: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 180a8: 800100 add byte ptr [rcx], 0 -;; 180ab: aa stosb byte ptr [rdi], al -;; 180ac: 800100 add byte ptr [rcx], 0 -;; 180af: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 180b8: 800100 add byte ptr [rcx], 0 -;; 180bb: aa stosb byte ptr [rdi], al -;; 180bc: 800100 add byte ptr [rcx], 0 -;; 180bf: a0800100aa800100a0 -;; movabs al, byte ptr [0xa0000180aa000180] -;; 180c8: 800100 add byte ptr [rcx], 0 -;; 180cb: aa stosb byte ptr [rdi], al -;; 180cc: 800100 add byte ptr [rcx], 0 -;; 180cf: b800000000 mov eax, 0 -;; 180d4: e905000000 jmp 0x180de -;; 180d9: b801000000 mov eax, 1 -;; 180de: 4883c410 add rsp, 0x10 -;; 180e2: 5d pop rbp -;; 180e3: c3 ret +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; a0800100aa800100a0 +;; movabs al, byte ptr [0xa0000180aa000180] +;; 800100 add byte ptr [rcx], 0 +;; aa stosb byte ptr [rdi], al +;; 800100 add byte ptr [rcx], 0 +;; b800000000 mov eax, 0 +;; e905000000 jmp 0x180ee +;; 180e9: b801000000 mov eax, 1 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 180f4: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/br_table/nested_br_table_loop_block.wat b/winch/filetests/filetests/x64/br_table/nested_br_table_loop_block.wat index f0740d11a3f2..7140f47486b7 100644 --- a/winch/filetests/filetests/x64/br_table/nested_br_table_loop_block.wat +++ b/winch/filetests/filetests/x64/br_table/nested_br_table_loop_block.wat @@ -17,17 +17,21 @@ ) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 4c893424 mov qword ptr [rsp], r14 -;; 10: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 14: b902000000 mov ecx, 2 -;; 19: 39c1 cmp ecx, eax -;; 1b: 0f42c1 cmovb eax, ecx -;; 1e: 4c8d1d0a000000 lea r11, [rip + 0xa] -;; 25: 49630c83 movsxd rcx, dword ptr [r11 + rax*4] -;; 29: 4901cb add r11, rcx -;; 2c: 41ffe3 jmp r11 -;; 2f: e1ff loope 0x30 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8777000000 ja 0x8f +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; b902000000 mov ecx, 2 +;; 39c1 cmp ecx, eax +;; 0f42c1 cmovb eax, ecx +;; 4c8d1d0a000000 lea r11, [rip + 0xa] +;; 49630c83 movsxd rcx, dword ptr [r11 + rax*4] +;; 4901cb add r11, rcx +;; 41ffe3 jmp r11 +;; 3f: e1ff loope 0x40 diff --git a/winch/filetests/filetests/x64/br_table/stack_handling.wat b/winch/filetests/filetests/x64/br_table/stack_handling.wat index e16c598b4448..61754fe092b7 100644 --- a/winch/filetests/filetests/x64/br_table/stack_handling.wat +++ b/winch/filetests/filetests/x64/br_table/stack_handling.wat @@ -10,29 +10,37 @@ ) (export "main" (func 0)) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 4c893424 mov qword ptr [rsp], r14 -;; 10: 448b5c240c mov r11d, dword ptr [rsp + 0xc] -;; 15: 4883ec04 sub rsp, 4 -;; 19: 44891c24 mov dword ptr [rsp], r11d -;; 1d: b839343430 mov eax, 0x30343439 -;; 22: b902000000 mov ecx, 2 -;; 27: 39c1 cmp ecx, eax -;; 29: 0f42c1 cmovb eax, ecx -;; 2c: 4c8d1d0a000000 lea r11, [rip + 0xa] -;; 33: 49630c83 movsxd rcx, dword ptr [r11 + rax*4] -;; 37: 4901cb add r11, rcx -;; 3a: 41ffe3 jmp r11 -;; 3d: 0c00 or al, 0 -;; 3f: 0000 add byte ptr [rax], al -;; 41: 1000 adc byte ptr [rax], al -;; 43: 0000 add byte ptr [rax], al -;; 45: 0c00 or al, 0 -;; 47: 0000 add byte ptr [rax], al -;; 49: 4883c404 add rsp, 4 -;; 4d: 4883c410 add rsp, 0x10 -;; 51: 5d pop rbp -;; 52: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8759000000 ja 0x71 +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 448b5c240c mov r11d, dword ptr [rsp + 0xc] +;; 4883ec04 sub rsp, 4 +;; 44891c24 mov dword ptr [rsp], r11d +;; b839343430 mov eax, 0x30343439 +;; b902000000 mov ecx, 2 +;; 39c1 cmp ecx, eax +;; 0f42c1 cmovb eax, ecx +;; 4c8d1d0a000000 lea r11, [rip + 0xa] +;; 49630c83 movsxd rcx, dword ptr [r11 + rax*4] +;; 4901cb add r11, rcx +;; 41ffe3 jmp r11 +;; 4d: 1a00 sbb al, byte ptr [rax] +;; 0000 add byte ptr [rax], al +;; 1100 adc dword ptr [rax], eax +;; 0000 add byte ptr [rax], al +;; 1a00 sbb al, byte ptr [rax] +;; 0000 add byte ptr [rax], al +;; e909000000 jmp 0x67 +;; 5e: 4883c404 add rsp, 4 +;; e904000000 jmp 0x6b +;; 67: 4883c404 add rsp, 4 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 71: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/call/params.wat b/winch/filetests/filetests/x64/call/params.wat index e0bbd8718abb..f2da734b9380 100644 --- a/winch/filetests/filetests/x64/call/params.wat +++ b/winch/filetests/filetests/x64/call/params.wat @@ -35,98 +35,108 @@ (i32.add) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 18: 8b442408 mov eax, dword ptr [rsp + 8] -;; 1c: 31d2 xor edx, edx -;; 1e: f7f1 div ecx -;; 20: 4883ec04 sub rsp, 4 -;; 24: 890424 mov dword ptr [rsp], eax -;; 27: 4883ec2c sub rsp, 0x2c -;; 2b: 8b7c242c mov edi, dword ptr [rsp + 0x2c] -;; 2f: be01000000 mov esi, 1 -;; 34: ba02000000 mov edx, 2 -;; 39: b903000000 mov ecx, 3 -;; 3e: 41b804000000 mov r8d, 4 -;; 44: 41b905000000 mov r9d, 5 -;; 4a: 41bb06000000 mov r11d, 6 -;; 50: 44891c24 mov dword ptr [rsp], r11d -;; 54: 41bb07000000 mov r11d, 7 -;; 5a: 44895c2408 mov dword ptr [rsp + 8], r11d -;; 5f: 41bb08000000 mov r11d, 8 -;; 65: 44895c2410 mov dword ptr [rsp + 0x10], r11d -;; 6a: e800000000 call 0x6f -;; 6f: 4883c42c add rsp, 0x2c -;; 73: 4883c404 add rsp, 4 -;; 77: 4883ec04 sub rsp, 4 -;; 7b: 890424 mov dword ptr [rsp], eax -;; 7e: 448b5c240c mov r11d, dword ptr [rsp + 0xc] -;; 83: 4883ec04 sub rsp, 4 -;; 87: 44891c24 mov dword ptr [rsp], r11d -;; 8b: 448b5c2414 mov r11d, dword ptr [rsp + 0x14] -;; 90: 4883ec04 sub rsp, 4 -;; 94: 44891c24 mov dword ptr [rsp], r11d -;; 98: 8b0c24 mov ecx, dword ptr [rsp] -;; 9b: 4883c404 add rsp, 4 -;; 9f: 8b0424 mov eax, dword ptr [rsp] -;; a2: 4883c404 add rsp, 4 -;; a6: 31d2 xor edx, edx -;; a8: f7f1 div ecx -;; aa: 4883ec04 sub rsp, 4 -;; ae: 890424 mov dword ptr [rsp], eax -;; b1: 4883ec28 sub rsp, 0x28 -;; b5: 8b7c242c mov edi, dword ptr [rsp + 0x2c] -;; b9: 8b742428 mov esi, dword ptr [rsp + 0x28] -;; bd: ba02000000 mov edx, 2 -;; c2: b903000000 mov ecx, 3 -;; c7: 41b804000000 mov r8d, 4 -;; cd: 41b905000000 mov r9d, 5 -;; d3: 41bb06000000 mov r11d, 6 -;; d9: 44891c24 mov dword ptr [rsp], r11d -;; dd: 41bb07000000 mov r11d, 7 -;; e3: 44895c2408 mov dword ptr [rsp + 8], r11d -;; e8: 41bb08000000 mov r11d, 8 -;; ee: 44895c2410 mov dword ptr [rsp + 0x10], r11d -;; f3: e800000000 call 0xf8 -;; f8: 4883c428 add rsp, 0x28 -;; fc: 4883c408 add rsp, 8 -;; 100: 4883c410 add rsp, 0x10 -;; 104: 5d pop rbp -;; 105: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f87fe000000 ja 0x116 +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 31d2 xor edx, edx +;; f7f1 div ecx +;; 4883ec04 sub rsp, 4 +;; 890424 mov dword ptr [rsp], eax +;; 4883ec2c sub rsp, 0x2c +;; 8b7c242c mov edi, dword ptr [rsp + 0x2c] +;; be01000000 mov esi, 1 +;; ba02000000 mov edx, 2 +;; b903000000 mov ecx, 3 +;; 41b804000000 mov r8d, 4 +;; 41b905000000 mov r9d, 5 +;; 41bb06000000 mov r11d, 6 +;; 44891c24 mov dword ptr [rsp], r11d +;; 41bb07000000 mov r11d, 7 +;; 44895c2408 mov dword ptr [rsp + 8], r11d +;; 41bb08000000 mov r11d, 8 +;; 44895c2410 mov dword ptr [rsp + 0x10], r11d +;; e800000000 call 0x7f +;; 4883c42c add rsp, 0x2c +;; 4883c404 add rsp, 4 +;; 4883ec04 sub rsp, 4 +;; 890424 mov dword ptr [rsp], eax +;; 448b5c240c mov r11d, dword ptr [rsp + 0xc] +;; 4883ec04 sub rsp, 4 +;; 44891c24 mov dword ptr [rsp], r11d +;; 448b5c2414 mov r11d, dword ptr [rsp + 0x14] +;; 4883ec04 sub rsp, 4 +;; 44891c24 mov dword ptr [rsp], r11d +;; 8b0c24 mov ecx, dword ptr [rsp] +;; 4883c404 add rsp, 4 +;; 8b0424 mov eax, dword ptr [rsp] +;; 4883c404 add rsp, 4 +;; 31d2 xor edx, edx +;; f7f1 div ecx +;; 4883ec04 sub rsp, 4 +;; 890424 mov dword ptr [rsp], eax +;; 4883ec28 sub rsp, 0x28 +;; 8b7c242c mov edi, dword ptr [rsp + 0x2c] +;; 8b742428 mov esi, dword ptr [rsp + 0x28] +;; ba02000000 mov edx, 2 +;; b903000000 mov ecx, 3 +;; 41b804000000 mov r8d, 4 +;; 41b905000000 mov r9d, 5 +;; 41bb06000000 mov r11d, 6 +;; 44891c24 mov dword ptr [rsp], r11d +;; 41bb07000000 mov r11d, 7 +;; 44895c2408 mov dword ptr [rsp + 8], r11d +;; 41bb08000000 mov r11d, 8 +;; 44895c2410 mov dword ptr [rsp + 0x10], r11d +;; e800000000 call 0x108 +;; 4883c428 add rsp, 0x28 +;; 4883c408 add rsp, 8 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 116: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec20 sub rsp, 0x20 -;; 8: 897c241c mov dword ptr [rsp + 0x1c], edi -;; c: 89742418 mov dword ptr [rsp + 0x18], esi -;; 10: 89542414 mov dword ptr [rsp + 0x14], edx -;; 14: 894c2410 mov dword ptr [rsp + 0x10], ecx -;; 18: 448944240c mov dword ptr [rsp + 0xc], r8d -;; 1d: 44894c2408 mov dword ptr [rsp + 8], r9d -;; 22: 4c893424 mov qword ptr [rsp], r14 -;; 26: 8b442418 mov eax, dword ptr [rsp + 0x18] -;; 2a: 8b4c241c mov ecx, dword ptr [rsp + 0x1c] -;; 2e: 01c1 add ecx, eax -;; 30: 8b442414 mov eax, dword ptr [rsp + 0x14] -;; 34: 01c1 add ecx, eax -;; 36: 8b442410 mov eax, dword ptr [rsp + 0x10] -;; 3a: 01c1 add ecx, eax -;; 3c: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 40: 01c1 add ecx, eax -;; 42: 8b442408 mov eax, dword ptr [rsp + 8] -;; 46: 01c1 add ecx, eax -;; 48: 8b4510 mov eax, dword ptr [rbp + 0x10] -;; 4b: 01c1 add ecx, eax -;; 4d: 8b4518 mov eax, dword ptr [rbp + 0x18] -;; 50: 01c1 add ecx, eax -;; 52: 8b4520 mov eax, dword ptr [rbp + 0x20] -;; 55: 01c1 add ecx, eax -;; 57: 89c8 mov eax, ecx -;; 59: 4883c420 add rsp, 0x20 -;; 5d: 5d pop rbp -;; 5e: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec20 sub rsp, 0x20 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8757000000 ja 0x6f +;; 18: 897c241c mov dword ptr [rsp + 0x1c], edi +;; 89742418 mov dword ptr [rsp + 0x18], esi +;; 89542414 mov dword ptr [rsp + 0x14], edx +;; 894c2410 mov dword ptr [rsp + 0x10], ecx +;; 448944240c mov dword ptr [rsp + 0xc], r8d +;; 44894c2408 mov dword ptr [rsp + 8], r9d +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b442418 mov eax, dword ptr [rsp + 0x18] +;; 8b4c241c mov ecx, dword ptr [rsp + 0x1c] +;; 01c1 add ecx, eax +;; 8b442414 mov eax, dword ptr [rsp + 0x14] +;; 01c1 add ecx, eax +;; 8b442410 mov eax, dword ptr [rsp + 0x10] +;; 01c1 add ecx, eax +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 01c1 add ecx, eax +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 01c1 add ecx, eax +;; 8b4510 mov eax, dword ptr [rbp + 0x10] +;; 01c1 add ecx, eax +;; 8b4518 mov eax, dword ptr [rbp + 0x18] +;; 01c1 add ecx, eax +;; 8b4520 mov eax, dword ptr [rbp + 0x20] +;; 01c1 add ecx, eax +;; 89c8 mov eax, ecx +;; 4883c420 add rsp, 0x20 +;; 5d pop rbp +;; c3 ret +;; 6f: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/call/recursive.wat b/winch/filetests/filetests/x64/call/recursive.wat index 4cae2ee24bf1..e25ed4c3b4b2 100644 --- a/winch/filetests/filetests/x64/call/recursive.wat +++ b/winch/filetests/filetests/x64/call/recursive.wat @@ -22,43 +22,48 @@ ) (export "fib" (func $fibonacci8)) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 4c893424 mov qword ptr [rsp], r14 -;; 10: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 14: 83f801 cmp eax, 1 -;; 17: b800000000 mov eax, 0 -;; 1c: 400f9ec0 setle al -;; 20: 85c0 test eax, eax -;; 22: 0f8409000000 je 0x31 -;; 28: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 2c: e958000000 jmp 0x89 -;; 31: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 35: 83e801 sub eax, 1 -;; 38: 4883ec04 sub rsp, 4 -;; 3c: 890424 mov dword ptr [rsp], eax -;; 3f: 4883ec0c sub rsp, 0xc -;; 43: 8b7c240c mov edi, dword ptr [rsp + 0xc] -;; 47: e800000000 call 0x4c -;; 4c: 4883c40c add rsp, 0xc -;; 50: 4883c404 add rsp, 4 -;; 54: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 58: 83e902 sub ecx, 2 -;; 5b: 4883ec04 sub rsp, 4 -;; 5f: 890424 mov dword ptr [rsp], eax -;; 62: 4883ec04 sub rsp, 4 -;; 66: 890c24 mov dword ptr [rsp], ecx -;; 69: 4883ec08 sub rsp, 8 -;; 6d: 8b7c2408 mov edi, dword ptr [rsp + 8] -;; 71: e800000000 call 0x76 -;; 76: 4883c408 add rsp, 8 -;; 7a: 4883c404 add rsp, 4 -;; 7e: 8b0c24 mov ecx, dword ptr [rsp] -;; 81: 4883c404 add rsp, 4 -;; 85: 01c1 add ecx, eax -;; 87: 89c8 mov eax, ecx -;; 89: 4883c410 add rsp, 0x10 -;; 8d: 5d pop rbp -;; 8e: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8787000000 ja 0x9f +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 83f801 cmp eax, 1 +;; b800000000 mov eax, 0 +;; 400f9ec0 setle al +;; 85c0 test eax, eax +;; 0f8409000000 je 0x41 +;; 38: 8b44240c mov eax, dword ptr [rsp + 0xc] +;; e958000000 jmp 0x99 +;; 41: 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 83e801 sub eax, 1 +;; 4883ec04 sub rsp, 4 +;; 890424 mov dword ptr [rsp], eax +;; 4883ec0c sub rsp, 0xc +;; 8b7c240c mov edi, dword ptr [rsp + 0xc] +;; e800000000 call 0x5c +;; 4883c40c add rsp, 0xc +;; 4883c404 add rsp, 4 +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 83e902 sub ecx, 2 +;; 4883ec04 sub rsp, 4 +;; 890424 mov dword ptr [rsp], eax +;; 4883ec04 sub rsp, 4 +;; 890c24 mov dword ptr [rsp], ecx +;; 4883ec08 sub rsp, 8 +;; 8b7c2408 mov edi, dword ptr [rsp + 8] +;; e800000000 call 0x86 +;; 4883c408 add rsp, 8 +;; 4883c404 add rsp, 4 +;; 8b0c24 mov ecx, dword ptr [rsp] +;; 4883c404 add rsp, 4 +;; 01c1 add ecx, eax +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 9f: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/call/reg_on_stack.wat b/winch/filetests/filetests/x64/call/reg_on_stack.wat new file mode 100644 index 000000000000..cbe4d14da628 --- /dev/null +++ b/winch/filetests/filetests/x64/call/reg_on_stack.wat @@ -0,0 +1,49 @@ +;;! target = "x86_64" +(module + (func (export "") (param i32) (result i32) + local.get 0 + i32.const 1 + call 0 + i32.const 1 + call 0 + br_if 0 (;@0;) + unreachable + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f876e000000 ja 0x86 +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 448b5c240c mov r11d, dword ptr [rsp + 0xc] +;; 4883ec04 sub rsp, 4 +;; 44891c24 mov dword ptr [rsp], r11d +;; 4883ec0c sub rsp, 0xc +;; bf01000000 mov edi, 1 +;; e800000000 call 0x3b +;; 4883c40c add rsp, 0xc +;; 4883ec04 sub rsp, 4 +;; 890424 mov dword ptr [rsp], eax +;; 4883ec08 sub rsp, 8 +;; bf01000000 mov edi, 1 +;; e800000000 call 0x54 +;; 4883c408 add rsp, 8 +;; 4883ec04 sub rsp, 4 +;; 890424 mov dword ptr [rsp], eax +;; 8b0c24 mov ecx, dword ptr [rsp] +;; 4883c404 add rsp, 4 +;; 8b0424 mov eax, dword ptr [rsp] +;; 4883c404 add rsp, 4 +;; 85c9 test ecx, ecx +;; 0f8409000000 je 0x7e +;; 75: 4883c404 add rsp, 4 +;; e902000000 jmp 0x80 +;; 7e: 0f0b ud2 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 86: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/call/simple.wat b/winch/filetests/filetests/x64/call/simple.wat index 5af062072933..538bcdde296d 100644 --- a/winch/filetests/filetests/x64/call/simple.wat +++ b/winch/filetests/filetests/x64/call/simple.wat @@ -13,42 +13,52 @@ (local.get 1) (i32.mul)) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8751000000 ja 0x69 +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: bf14000000 mov edi, 0x14 -;; 1a: be50000000 mov esi, 0x50 -;; 1f: e800000000 call 0x24 -;; 24: b902000000 mov ecx, 2 -;; 29: 894c240c mov dword ptr [rsp + 0xc], ecx -;; 2d: 4883ec04 sub rsp, 4 -;; 31: 890424 mov dword ptr [rsp], eax -;; 34: 448b5c2410 mov r11d, dword ptr [rsp + 0x10] -;; 39: 4883ec04 sub rsp, 4 -;; 3d: 44891c24 mov dword ptr [rsp], r11d -;; 41: 8b0c24 mov ecx, dword ptr [rsp] -;; 44: 4883c404 add rsp, 4 -;; 48: 8b0424 mov eax, dword ptr [rsp] -;; 4b: 4883c404 add rsp, 4 -;; 4f: 31d2 xor edx, edx -;; 51: f7f1 div ecx -;; 53: 4883c410 add rsp, 0x10 -;; 57: 5d pop rbp -;; 58: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; bf14000000 mov edi, 0x14 +;; be50000000 mov esi, 0x50 +;; e800000000 call 0x34 +;; b902000000 mov ecx, 2 +;; 894c240c mov dword ptr [rsp + 0xc], ecx +;; 4883ec04 sub rsp, 4 +;; 890424 mov dword ptr [rsp], eax +;; 448b5c2410 mov r11d, dword ptr [rsp + 0x10] +;; 4883ec04 sub rsp, 4 +;; 44891c24 mov dword ptr [rsp], r11d +;; 8b0c24 mov ecx, dword ptr [rsp] +;; 4883c404 add rsp, 4 +;; 8b0424 mov eax, dword ptr [rsp] +;; 4883c404 add rsp, 4 +;; 31d2 xor edx, edx +;; f7f1 div ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 69: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b442408 mov eax, dword ptr [rsp + 8] -;; 18: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 1c: 0fafc8 imul ecx, eax -;; 1f: 89c8 mov eax, ecx -;; 21: 4883c410 add rsp, 0x10 -;; 25: 5d pop rbp -;; 26: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871f000000 ja 0x37 +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 0fafc8 imul ecx, eax +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 37: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/call_indirect/call_indirect.wat b/winch/filetests/filetests/x64/call_indirect/call_indirect.wat index 9bc3a7c22525..74ed19e4b67b 100644 --- a/winch/filetests/filetests/x64/call_indirect/call_indirect.wat +++ b/winch/filetests/filetests/x64/call_indirect/call_indirect.wat @@ -29,125 +29,130 @@ ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 4c893424 mov qword ptr [rsp], r14 -;; 10: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 14: 83f801 cmp eax, 1 -;; 17: b800000000 mov eax, 0 -;; 1c: 400f96c0 setbe al -;; 20: 85c0 test eax, eax -;; 22: 0f840a000000 je 0x32 -;; 28: b801000000 mov eax, 1 -;; 2d: e963010000 jmp 0x195 -;; 32: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 36: 83e802 sub eax, 2 -;; 39: 4883ec04 sub rsp, 4 -;; 3d: 890424 mov dword ptr [rsp], eax -;; 40: b900000000 mov ecx, 0 -;; 45: 4c89f2 mov rdx, r14 -;; 48: 8b5a50 mov ebx, dword ptr [rdx + 0x50] -;; 4b: 39d9 cmp ecx, ebx -;; 4d: 0f8348010000 jae 0x19b -;; 53: 4189cb mov r11d, ecx -;; 56: 4d6bdb08 imul r11, r11, 8 -;; 5a: 488b5248 mov rdx, qword ptr [rdx + 0x48] -;; 5e: 4889d6 mov rsi, rdx -;; 61: 4c01da add rdx, r11 -;; 64: 39d9 cmp ecx, ebx -;; 66: 480f43d6 cmovae rdx, rsi -;; 6a: 488b02 mov rax, qword ptr [rdx] -;; 6d: 4885c0 test rax, rax -;; 70: 0f8529000000 jne 0x9f -;; 76: 4d8b5e38 mov r11, qword ptr [r14 + 0x38] -;; 7a: 498b5b48 mov rbx, qword ptr [r11 + 0x48] -;; 7e: 4156 push r14 -;; 80: 4883ec04 sub rsp, 4 -;; 84: 890c24 mov dword ptr [rsp], ecx -;; 87: 488b7c2404 mov rdi, qword ptr [rsp + 4] -;; 8c: be00000000 mov esi, 0 -;; 91: 8b1424 mov edx, dword ptr [rsp] -;; 94: ffd3 call rbx -;; 96: 4883c40c add rsp, 0xc -;; 9a: e904000000 jmp 0xa3 -;; 9f: 4883e0fe and rax, 0xfffffffffffffffe -;; a3: 4885c0 test rax, rax -;; a6: 0f84f1000000 je 0x19d -;; ac: 4d8b5e40 mov r11, qword ptr [r14 + 0x40] -;; b0: 418b0b mov ecx, dword ptr [r11] -;; b3: 8b5018 mov edx, dword ptr [rax + 0x18] -;; b6: 39d1 cmp ecx, edx -;; b8: 0f85e1000000 jne 0x19f -;; be: 50 push rax -;; bf: 59 pop rcx -;; c0: 488b5110 mov rdx, qword ptr [rcx + 0x10] -;; c4: 4883ec0c sub rsp, 0xc -;; c8: 8b7c240c mov edi, dword ptr [rsp + 0xc] -;; cc: ffd2 call rdx -;; ce: 4883c40c add rsp, 0xc -;; d2: 4883c404 add rsp, 4 -;; d6: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; da: 83e901 sub ecx, 1 -;; dd: 4883ec04 sub rsp, 4 -;; e1: 890424 mov dword ptr [rsp], eax -;; e4: 4883ec04 sub rsp, 4 -;; e8: 890c24 mov dword ptr [rsp], ecx -;; eb: b900000000 mov ecx, 0 -;; f0: 4c89f2 mov rdx, r14 -;; f3: 8b5a50 mov ebx, dword ptr [rdx + 0x50] -;; f6: 39d9 cmp ecx, ebx -;; f8: 0f83a3000000 jae 0x1a1 -;; fe: 4189cb mov r11d, ecx -;; 101: 4d6bdb08 imul r11, r11, 8 -;; 105: 488b5248 mov rdx, qword ptr [rdx + 0x48] -;; 109: 4889d6 mov rsi, rdx -;; 10c: 4c01da add rdx, r11 -;; 10f: 39d9 cmp ecx, ebx -;; 111: 480f43d6 cmovae rdx, rsi -;; 115: 488b02 mov rax, qword ptr [rdx] -;; 118: 4885c0 test rax, rax -;; 11b: 0f8532000000 jne 0x153 -;; 121: 4d8b5e38 mov r11, qword ptr [r14 + 0x38] -;; 125: 498b5b48 mov rbx, qword ptr [r11 + 0x48] -;; 129: 4156 push r14 -;; 12b: 4883ec04 sub rsp, 4 -;; 12f: 890c24 mov dword ptr [rsp], ecx -;; 132: 4883ec0c sub rsp, 0xc -;; 136: 488b7c2410 mov rdi, qword ptr [rsp + 0x10] -;; 13b: be00000000 mov esi, 0 -;; 140: 8b54240c mov edx, dword ptr [rsp + 0xc] -;; 144: ffd3 call rbx -;; 146: 4883c40c add rsp, 0xc -;; 14a: 4883c40c add rsp, 0xc -;; 14e: e904000000 jmp 0x157 -;; 153: 4883e0fe and rax, 0xfffffffffffffffe -;; 157: 4885c0 test rax, rax -;; 15a: 0f8443000000 je 0x1a3 -;; 160: 4d8b5e40 mov r11, qword ptr [r14 + 0x40] -;; 164: 418b0b mov ecx, dword ptr [r11] -;; 167: 8b5018 mov edx, dword ptr [rax + 0x18] -;; 16a: 39d1 cmp ecx, edx -;; 16c: 0f8533000000 jne 0x1a5 -;; 172: 50 push rax -;; 173: 59 pop rcx -;; 174: 488b5110 mov rdx, qword ptr [rcx + 0x10] -;; 178: 4883ec08 sub rsp, 8 -;; 17c: 8b7c2408 mov edi, dword ptr [rsp + 8] -;; 180: ffd2 call rdx -;; 182: 4883c408 add rsp, 8 -;; 186: 4883c404 add rsp, 4 -;; 18a: 8b0c24 mov ecx, dword ptr [rsp] -;; 18d: 4883c404 add rsp, 4 -;; 191: 01c1 add ecx, eax -;; 193: 89c8 mov eax, ecx -;; 195: 4883c410 add rsp, 0x10 -;; 199: 5d pop rbp -;; 19a: c3 ret -;; 19b: 0f0b ud2 -;; 19d: 0f0b ud2 -;; 19f: 0f0b ud2 -;; 1a1: 0f0b ud2 -;; 1a3: 0f0b ud2 -;; 1a5: 0f0b ud2 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8793010000 ja 0x1ab +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 83f801 cmp eax, 1 +;; b800000000 mov eax, 0 +;; 400f96c0 setbe al +;; 85c0 test eax, eax +;; 0f840a000000 je 0x42 +;; 38: b801000000 mov eax, 1 +;; e963010000 jmp 0x1a5 +;; 42: 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 83e802 sub eax, 2 +;; 4883ec04 sub rsp, 4 +;; 890424 mov dword ptr [rsp], eax +;; b900000000 mov ecx, 0 +;; 4c89f2 mov rdx, r14 +;; 8b5a50 mov ebx, dword ptr [rdx + 0x50] +;; 39d9 cmp ecx, ebx +;; 0f834a010000 jae 0x1ad +;; 63: 4189cb mov r11d, ecx +;; 4d6bdb08 imul r11, r11, 8 +;; 488b5248 mov rdx, qword ptr [rdx + 0x48] +;; 4889d6 mov rsi, rdx +;; 4c01da add rdx, r11 +;; 39d9 cmp ecx, ebx +;; 480f43d6 cmovae rdx, rsi +;; 488b02 mov rax, qword ptr [rdx] +;; 4885c0 test rax, rax +;; 0f8529000000 jne 0xaf +;; 86: 4d8b5e38 mov r11, qword ptr [r14 + 0x38] +;; 498b5b48 mov rbx, qword ptr [r11 + 0x48] +;; 4156 push r14 +;; 4883ec04 sub rsp, 4 +;; 890c24 mov dword ptr [rsp], ecx +;; 488b7c2404 mov rdi, qword ptr [rsp + 4] +;; be00000000 mov esi, 0 +;; 8b1424 mov edx, dword ptr [rsp] +;; ffd3 call rbx +;; 4883c40c add rsp, 0xc +;; e904000000 jmp 0xb3 +;; af: 4883e0fe and rax, 0xfffffffffffffffe +;; 4885c0 test rax, rax +;; 0f84f3000000 je 0x1af +;; bc: 4d8b5e40 mov r11, qword ptr [r14 + 0x40] +;; 418b0b mov ecx, dword ptr [r11] +;; 8b5018 mov edx, dword ptr [rax + 0x18] +;; 39d1 cmp ecx, edx +;; 0f85e3000000 jne 0x1b1 +;; ce: 50 push rax +;; 59 pop rcx +;; 488b5110 mov rdx, qword ptr [rcx + 0x10] +;; 4883ec0c sub rsp, 0xc +;; 8b7c240c mov edi, dword ptr [rsp + 0xc] +;; ffd2 call rdx +;; 4883c40c add rsp, 0xc +;; 4883c404 add rsp, 4 +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 83e901 sub ecx, 1 +;; 4883ec04 sub rsp, 4 +;; 890424 mov dword ptr [rsp], eax +;; 4883ec04 sub rsp, 4 +;; 890c24 mov dword ptr [rsp], ecx +;; b900000000 mov ecx, 0 +;; 4c89f2 mov rdx, r14 +;; 8b5a50 mov ebx, dword ptr [rdx + 0x50] +;; 39d9 cmp ecx, ebx +;; 0f83a5000000 jae 0x1b3 +;; 10e: 4189cb mov r11d, ecx +;; 4d6bdb08 imul r11, r11, 8 +;; 488b5248 mov rdx, qword ptr [rdx + 0x48] +;; 4889d6 mov rsi, rdx +;; 4c01da add rdx, r11 +;; 39d9 cmp ecx, ebx +;; 480f43d6 cmovae rdx, rsi +;; 488b02 mov rax, qword ptr [rdx] +;; 4885c0 test rax, rax +;; 0f8532000000 jne 0x163 +;; 131: 4d8b5e38 mov r11, qword ptr [r14 + 0x38] +;; 498b5b48 mov rbx, qword ptr [r11 + 0x48] +;; 4156 push r14 +;; 4883ec04 sub rsp, 4 +;; 890c24 mov dword ptr [rsp], ecx +;; 4883ec0c sub rsp, 0xc +;; 488b7c2410 mov rdi, qword ptr [rsp + 0x10] +;; be00000000 mov esi, 0 +;; 8b54240c mov edx, dword ptr [rsp + 0xc] +;; ffd3 call rbx +;; 4883c40c add rsp, 0xc +;; 4883c40c add rsp, 0xc +;; e904000000 jmp 0x167 +;; 163: 4883e0fe and rax, 0xfffffffffffffffe +;; 4885c0 test rax, rax +;; 0f8445000000 je 0x1b5 +;; 170: 4d8b5e40 mov r11, qword ptr [r14 + 0x40] +;; 418b0b mov ecx, dword ptr [r11] +;; 8b5018 mov edx, dword ptr [rax + 0x18] +;; 39d1 cmp ecx, edx +;; 0f8535000000 jne 0x1b7 +;; 182: 50 push rax +;; 59 pop rcx +;; 488b5110 mov rdx, qword ptr [rcx + 0x10] +;; 4883ec08 sub rsp, 8 +;; 8b7c2408 mov edi, dword ptr [rsp + 8] +;; ffd2 call rdx +;; 4883c408 add rsp, 8 +;; 4883c404 add rsp, 4 +;; 8b0c24 mov ecx, dword ptr [rsp] +;; 4883c404 add rsp, 4 +;; 01c1 add ecx, eax +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 1ab: 0f0b ud2 +;; 1ad: 0f0b ud2 +;; 1af: 0f0b ud2 +;; 1b1: 0f0b ud2 +;; 1b3: 0f0b ud2 +;; 1b5: 0f0b ud2 +;; 1b7: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/call_indirect/local_arg.wat b/winch/filetests/filetests/x64/call_indirect/local_arg.wat new file mode 100644 index 000000000000..fe95da74e1fb --- /dev/null +++ b/winch/filetests/filetests/x64/call_indirect/local_arg.wat @@ -0,0 +1,150 @@ +;;! target="x86_64" + +(module + (type $param-i32 (func (param i32))) + + (func $param-i32 (type $param-i32)) + (func (export "") + (local i32) + local.get 0 + (call_indirect (type $param-i32) (i32.const 0)) + ) + + (table funcref + (elem + $param-i32) + ) +) +;; 0: 55 push rbp +;; 1: 4889e5 mov rbp, rsp +;; 4: 4883ec10 sub rsp, 0x10 +;; 8: 897c240c mov dword ptr [rsp + 0xc], edi +;; c: 4c893424 mov qword ptr [rsp], r14 +;; 10: 4883c410 add rsp, 0x10 +;; 14: 5d pop rbp +;; 15: c3 ret +;; +;; 0: 55 push rbp +;; 1: 4889e5 mov rbp, rsp +;; 4: 4883ec10 sub rsp, 0x10 +;; 8: 48c744240800000000 +;; mov qword ptr [rsp + 8], 0 +;; 11: 4c893424 mov qword ptr [rsp], r14 +;; 15: b900000000 mov ecx, 0 +;; 1a: 4c89f2 mov rdx, r14 +;; 1d: 8b5a50 mov ebx, dword ptr [rdx + 0x50] +;; 20: 39d9 cmp ecx, ebx +;; 22: 0f8394000000 jae 0xbc +;; 28: 4189cb mov r11d, ecx +;; 2b: 4d6bdb08 imul r11, r11, 8 +;; 2f: 488b5248 mov rdx, qword ptr [rdx + 0x48] +;; 33: 4889d6 mov rsi, rdx +;; 36: 4c01da add rdx, r11 +;; 39: 39d9 cmp ecx, ebx +;; 3b: 480f43d6 cmovae rdx, rsi +;; 3f: 488b02 mov rax, qword ptr [rdx] +;; 42: 4885c0 test rax, rax +;; 45: 0f8536000000 jne 0x81 +;; 4b: 4d8b5e38 mov r11, qword ptr [r14 + 0x38] +;; 4f: 498b5b48 mov rbx, qword ptr [r11 + 0x48] +;; 53: 448b5c240c mov r11d, dword ptr [rsp + 0xc] +;; 58: 4883ec04 sub rsp, 4 +;; 5c: 44891c24 mov dword ptr [rsp], r11d +;; 60: 4156 push r14 +;; 62: 4883ec04 sub rsp, 4 +;; 66: 890c24 mov dword ptr [rsp], ecx +;; 69: 488b7c2404 mov rdi, qword ptr [rsp + 4] +;; 6e: be00000000 mov esi, 0 +;; 73: 8b1424 mov edx, dword ptr [rsp] +;; 76: ffd3 call rbx +;; 78: 4883c40c add rsp, 0xc +;; 7c: e904000000 jmp 0x85 +;; 81: 4883e0fe and rax, 0xfffffffffffffffe +;; 85: 4885c0 test rax, rax +;; 88: 0f8430000000 je 0xbe +;; 8e: 4d8b5e40 mov r11, qword ptr [r14 + 0x40] +;; 92: 418b0b mov ecx, dword ptr [r11] +;; 95: 8b5018 mov edx, dword ptr [rax + 0x18] +;; 98: 39d1 cmp ecx, edx +;; 9a: 0f8520000000 jne 0xc0 +;; a0: 488b4810 mov rcx, qword ptr [rax + 0x10] +;; a4: 4883ec0c sub rsp, 0xc +;; a8: 8b7c240c mov edi, dword ptr [rsp + 0xc] +;; ac: ffd1 call rcx +;; ae: 4883c40c add rsp, 0xc +;; b2: 4883c404 add rsp, 4 + +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870e000000 ja 0x26 +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 26: 0f0b ud2 +;; +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f87b4000000 ja 0xcc +;; 18: 48c744240800000000 +;; mov qword ptr [rsp + 8], 0 +;; 4c893424 mov qword ptr [rsp], r14 +;; 448b5c240c mov r11d, dword ptr [rsp + 0xc] +;; 4883ec04 sub rsp, 4 +;; 44891c24 mov dword ptr [rsp], r11d +;; b900000000 mov ecx, 0 +;; 4c89f2 mov rdx, r14 +;; 8b5a50 mov ebx, dword ptr [rdx + 0x50] +;; 39d9 cmp ecx, ebx +;; 0f8389000000 jae 0xce +;; 45: 4189cb mov r11d, ecx +;; 4d6bdb08 imul r11, r11, 8 +;; 488b5248 mov rdx, qword ptr [rdx + 0x48] +;; 4889d6 mov rsi, rdx +;; 4c01da add rdx, r11 +;; 39d9 cmp ecx, ebx +;; 480f43d6 cmovae rdx, rsi +;; 488b02 mov rax, qword ptr [rdx] +;; 4885c0 test rax, rax +;; 0f8529000000 jne 0x91 +;; 68: 4d8b5e38 mov r11, qword ptr [r14 + 0x38] +;; 498b5b48 mov rbx, qword ptr [r11 + 0x48] +;; 4156 push r14 +;; 4883ec04 sub rsp, 4 +;; 890c24 mov dword ptr [rsp], ecx +;; 488b7c2404 mov rdi, qword ptr [rsp + 4] +;; be00000000 mov esi, 0 +;; 8b1424 mov edx, dword ptr [rsp] +;; ffd3 call rbx +;; 4883c40c add rsp, 0xc +;; e904000000 jmp 0x95 +;; 91: 4883e0fe and rax, 0xfffffffffffffffe +;; 4885c0 test rax, rax +;; 0f8432000000 je 0xd0 +;; 9e: 4d8b5e40 mov r11, qword ptr [r14 + 0x40] +;; 418b0b mov ecx, dword ptr [r11] +;; 8b5018 mov edx, dword ptr [rax + 0x18] +;; 39d1 cmp ecx, edx +;; 0f8522000000 jne 0xd2 +;; b0: 488b4810 mov rcx, qword ptr [rax + 0x10] +;; 4883ec0c sub rsp, 0xc +;; 8b7c240c mov edi, dword ptr [rsp + 0xc] +;; ffd1 call rcx +;; 4883c40c add rsp, 0xc +;; 4883c404 add rsp, 4 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; cc: 0f0b ud2 +;; ce: 0f0b ud2 +;; d0: 0f0b ud2 +;; d2: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_abs/f32_abs_const.wat b/winch/filetests/filetests/x64/f32_abs/f32_abs_const.wat index 7500e7a462b2..8181f70b04c7 100644 --- a/winch/filetests/filetests/x64/f32_abs/f32_abs_const.wat +++ b/winch/filetests/filetests/x64/f32_abs/f32_abs_const.wat @@ -6,20 +6,24 @@ (f32.abs) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f30f10051c000000 movss xmm0, dword ptr [rip + 0x1c] -;; 14: 41bbffffff7f mov r11d, 0x7fffffff -;; 1a: 66450f6efb movd xmm15, r11d -;; 1f: 410f54c7 andps xmm0, xmm15 -;; 23: 4883c408 add rsp, 8 -;; 27: 5d pop rbp -;; 28: c3 ret -;; 29: 0000 add byte ptr [rax], al -;; 2b: 0000 add byte ptr [rax], al -;; 2d: 0000 add byte ptr [rax], al -;; 2f: 00c3 add bl, al -;; 31: f5 cmc -;; 32: a8bf test al, 0xbf +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8721000000 ja 0x39 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f30f10051c000000 movss xmm0, dword ptr [rip + 0x1c] +;; 41bbffffff7f mov r11d, 0x7fffffff +;; 66450f6efb movd xmm15, r11d +;; 410f54c7 andps xmm0, xmm15 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 39: 0f0b ud2 +;; 3b: 0000 add byte ptr [rax], al +;; 3d: 0000 add byte ptr [rax], al +;; 3f: 00c3 add bl, al +;; 41: f5 cmc +;; 42: a8bf test al, 0xbf diff --git a/winch/filetests/filetests/x64/f32_abs/f32_abs_param.wat b/winch/filetests/filetests/x64/f32_abs/f32_abs_param.wat index decaf5146794..26cc8722a1f4 100644 --- a/winch/filetests/filetests/x64/f32_abs/f32_abs_param.wat +++ b/winch/filetests/filetests/x64/f32_abs/f32_abs_param.wat @@ -6,15 +6,20 @@ (f32.abs) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; e: 4c893424 mov qword ptr [rsp], r14 -;; 12: f30f1044240c movss xmm0, dword ptr [rsp + 0xc] -;; 18: 41bbffffff7f mov r11d, 0x7fffffff -;; 1e: 66450f6efb movd xmm15, r11d -;; 23: 410f54c7 andps xmm0, xmm15 -;; 27: 4883c410 add rsp, 0x10 -;; 2b: 5d pop rbp -;; 2c: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8725000000 ja 0x3d +;; 18: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f1044240c movss xmm0, dword ptr [rsp + 0xc] +;; 41bbffffff7f mov r11d, 0x7fffffff +;; 66450f6efb movd xmm15, r11d +;; 410f54c7 andps xmm0, xmm15 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 3d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_add/const.wat b/winch/filetests/filetests/x64/f32_add/const.wat index 866494e07946..2c68c2e5e6fc 100644 --- a/winch/filetests/filetests/x64/f32_add/const.wat +++ b/winch/filetests/filetests/x64/f32_add/const.wat @@ -7,23 +7,27 @@ (f32.add) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f30f10051c000000 movss xmm0, dword ptr [rip + 0x1c] -;; 14: f30f100d1c000000 movss xmm1, dword ptr [rip + 0x1c] -;; 1c: f30f58c8 addss xmm1, xmm0 -;; 20: 0f28c1 movaps xmm0, xmm1 -;; 23: 4883c408 add rsp, 8 -;; 27: 5d pop rbp -;; 28: c3 ret -;; 29: 0000 add byte ptr [rax], al -;; 2b: 0000 add byte ptr [rax], al -;; 2d: 0000 add byte ptr [rax], al -;; 2f: 00cd add ch, cl -;; 31: cc int3 -;; 32: 0c40 or al, 0x40 -;; 34: 0000 add byte ptr [rax], al -;; 36: 0000 add byte ptr [rax], al -;; 38: cdcc int 0xcc +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8721000000 ja 0x39 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f30f10051c000000 movss xmm0, dword ptr [rip + 0x1c] +;; f30f100d1c000000 movss xmm1, dword ptr [rip + 0x1c] +;; f30f58c8 addss xmm1, xmm0 +;; 0f28c1 movaps xmm0, xmm1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 39: 0f0b ud2 +;; 3b: 0000 add byte ptr [rax], al +;; 3d: 0000 add byte ptr [rax], al +;; 3f: 00cd add ch, cl +;; 41: cc int3 +;; 42: 0c40 or al, 0x40 +;; 44: 0000 add byte ptr [rax], al +;; 46: 0000 add byte ptr [rax], al +;; 48: cdcc int 0xcc diff --git a/winch/filetests/filetests/x64/f32_add/locals.wat b/winch/filetests/filetests/x64/f32_add/locals.wat index ff1aeb1b478f..244683b01635 100644 --- a/winch/filetests/filetests/x64/f32_add/locals.wat +++ b/winch/filetests/filetests/x64/f32_add/locals.wat @@ -16,24 +16,28 @@ f32.add ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8742000000 ja 0x5a +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: f30f100533000000 movss xmm0, dword ptr [rip + 0x33] -;; 1d: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; 23: f30f10052d000000 movss xmm0, dword ptr [rip + 0x2d] -;; 2b: f30f11442408 movss dword ptr [rsp + 8], xmm0 -;; 31: f30f10442408 movss xmm0, dword ptr [rsp + 8] -;; 37: f30f104c240c movss xmm1, dword ptr [rsp + 0xc] -;; 3d: f30f58c8 addss xmm1, xmm0 -;; 41: 0f28c1 movaps xmm0, xmm1 -;; 44: 4883c410 add rsp, 0x10 -;; 48: 5d pop rbp -;; 49: c3 ret -;; 4a: 0000 add byte ptr [rax], al -;; 4c: 0000 add byte ptr [rax], al -;; 4e: 0000 add byte ptr [rax], al -;; 50: cdcc int 0xcc +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f100533000000 movss xmm0, dword ptr [rip + 0x33] +;; f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; f30f10052d000000 movss xmm0, dword ptr [rip + 0x2d] +;; f30f11442408 movss dword ptr [rsp + 8], xmm0 +;; f30f10442408 movss xmm0, dword ptr [rsp + 8] +;; f30f104c240c movss xmm1, dword ptr [rsp + 0xc] +;; f30f58c8 addss xmm1, xmm0 +;; 0f28c1 movaps xmm0, xmm1 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 5a: 0f0b ud2 +;; 5c: 0000 add byte ptr [rax], al +;; 5e: 0000 add byte ptr [rax], al +;; 60: cdcc int 0xcc diff --git a/winch/filetests/filetests/x64/f32_add/params.wat b/winch/filetests/filetests/x64/f32_add/params.wat index d5606c63f908..72bd9a4a139a 100644 --- a/winch/filetests/filetests/x64/f32_add/params.wat +++ b/winch/filetests/filetests/x64/f32_add/params.wat @@ -7,16 +7,21 @@ (f32.add) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; e: f30f114c2408 movss dword ptr [rsp + 8], xmm1 -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: f30f10442408 movss xmm0, dword ptr [rsp + 8] -;; 1e: f30f104c240c movss xmm1, dword ptr [rsp + 0xc] -;; 24: f30f58c8 addss xmm1, xmm0 -;; 28: 0f28c1 movaps xmm0, xmm1 -;; 2b: 4883c410 add rsp, 0x10 -;; 2f: 5d pop rbp -;; 30: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8729000000 ja 0x41 +;; 18: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; f30f114c2408 movss dword ptr [rsp + 8], xmm1 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f10442408 movss xmm0, dword ptr [rsp + 8] +;; f30f104c240c movss xmm1, dword ptr [rsp + 0xc] +;; f30f58c8 addss xmm1, xmm0 +;; 0f28c1 movaps xmm0, xmm1 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 41: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_ceil/f32_ceil_const_sse41.wat b/winch/filetests/filetests/x64/f32_ceil/f32_ceil_const_sse41.wat index 857140aee665..c30bb344b490 100644 --- a/winch/filetests/filetests/x64/f32_ceil/f32_ceil_const_sse41.wat +++ b/winch/filetests/filetests/x64/f32_ceil/f32_ceil_const_sse41.wat @@ -7,15 +7,23 @@ (f32.ceil) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f30f10050c000000 movss xmm0, dword ptr [rip + 0xc] -;; 14: 660f3a0ac002 roundss xmm0, xmm0, 2 -;; 1a: 4883c408 add rsp, 8 -;; 1e: 5d pop rbp -;; 1f: c3 ret -;; 20: c3 ret -;; 21: f5 cmc -;; 22: a8bf test al, 0xbf +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8718000000 ja 0x30 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f30f100514000000 movss xmm0, dword ptr [rip + 0x14] +;; 660f3a0ac002 roundss xmm0, xmm0, 2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 30: 0f0b ud2 +;; 32: 0000 add byte ptr [rax], al +;; 34: 0000 add byte ptr [rax], al +;; 36: 0000 add byte ptr [rax], al +;; 38: c3 ret +;; 39: f5 cmc +;; 3a: a8bf test al, 0xbf diff --git a/winch/filetests/filetests/x64/f32_ceil/f32_ceil_param.wat b/winch/filetests/filetests/x64/f32_ceil/f32_ceil_param.wat index 024eb6b29014..dee7b1302c48 100644 --- a/winch/filetests/filetests/x64/f32_ceil/f32_ceil_param.wat +++ b/winch/filetests/filetests/x64/f32_ceil/f32_ceil_param.wat @@ -6,13 +6,24 @@ (f32.ceil) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; e: 4c893424 mov qword ptr [rsp], r14 -;; 12: f30f1044240c movss xmm0, dword ptr [rsp + 0xc] -;; 18: e800000000 call 0x1d -;; 1d: 4883c410 add rsp, 0x10 -;; 21: 5d pop rbp -;; 22: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8738000000 ja 0x50 +;; 18: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f3440f107c240c movss xmm15, dword ptr [rsp + 0xc] +;; 4883ec04 sub rsp, 4 +;; f3440f113c24 movss dword ptr [rsp], xmm15 +;; 4883ec0c sub rsp, 0xc +;; f30f1044240c movss xmm0, dword ptr [rsp + 0xc] +;; e800000000 call 0x42 +;; 4883c40c add rsp, 0xc +;; 4883c404 add rsp, 4 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 50: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_ceil/f32_ceil_param_sse41.wat b/winch/filetests/filetests/x64/f32_ceil/f32_ceil_param_sse41.wat index 5cbb491e3b34..e815b018f873 100644 --- a/winch/filetests/filetests/x64/f32_ceil/f32_ceil_param_sse41.wat +++ b/winch/filetests/filetests/x64/f32_ceil/f32_ceil_param_sse41.wat @@ -7,13 +7,18 @@ (f32.ceil) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; e: 4c893424 mov qword ptr [rsp], r14 -;; 12: f30f1044240c movss xmm0, dword ptr [rsp + 0xc] -;; 18: 660f3a0ac002 roundss xmm0, xmm0, 2 -;; 1e: 4883c410 add rsp, 0x10 -;; 22: 5d pop rbp -;; 23: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871c000000 ja 0x34 +;; 18: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f1044240c movss xmm0, dword ptr [rsp + 0xc] +;; 660f3a0ac002 roundss xmm0, xmm0, 2 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 34: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_const/call_id.wat b/winch/filetests/filetests/x64/f32_const/call_id.wat index 347303965ae2..faf817f5486a 100644 --- a/winch/filetests/filetests/x64/f32_const/call_id.wat +++ b/winch/filetests/filetests/x64/f32_const/call_id.wat @@ -4,27 +4,40 @@ (func $id-f32 (param f32) (result f32) (local.get 0)) (func (export "type-first-f32") (result f32) (call $id-f32 (f32.const 1.32))) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; e: 4c893424 mov qword ptr [rsp], r14 -;; 12: f30f1044240c movss xmm0, dword ptr [rsp + 0xc] -;; 18: 4883c410 add rsp, 0x10 -;; 1c: 5d pop rbp -;; 1d: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8716000000 ja 0x2e +;; 18: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f1044240c movss xmm0, dword ptr [rsp + 0xc] +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 2e: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883ec08 sub rsp, 8 -;; 10: f30f100510000000 movss xmm0, dword ptr [rip + 0x10] -;; 18: e800000000 call 0x1d -;; 1d: 4883c408 add rsp, 8 -;; 21: 4883c408 add rsp, 8 -;; 25: 5d pop rbp -;; 26: c3 ret -;; 27: 00c3 add bl, al -;; 29: f5 cmc -;; 2a: a83f test al, 0x3f +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871f000000 ja 0x37 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883ec08 sub rsp, 8 +;; f30f100518000000 movss xmm0, dword ptr [rip + 0x18] +;; e800000000 call 0x2d +;; 4883c408 add rsp, 8 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 37: 0f0b ud2 +;; 39: 0000 add byte ptr [rax], al +;; 3b: 0000 add byte ptr [rax], al +;; 3d: 0000 add byte ptr [rax], al +;; 3f: 00c3 add bl, al +;; 41: f5 cmc +;; 42: a83f test al, 0x3f diff --git a/winch/filetests/filetests/x64/f32_const/id.wat b/winch/filetests/filetests/x64/f32_const/id.wat index 494e7161d78d..62b5cf15bb3b 100644 --- a/winch/filetests/filetests/x64/f32_const/id.wat +++ b/winch/filetests/filetests/x64/f32_const/id.wat @@ -3,12 +3,17 @@ (module (func (param f32) (result f32) (local.get 0)) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; e: 4c893424 mov qword ptr [rsp], r14 -;; 12: f30f1044240c movss xmm0, dword ptr [rsp + 0xc] -;; 18: 4883c410 add rsp, 0x10 -;; 1c: 5d pop rbp -;; 1d: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8716000000 ja 0x2e +;; 18: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f1044240c movss xmm0, dword ptr [rsp + 0xc] +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 2e: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_convert_i32_s/const.wat b/winch/filetests/filetests/x64/f32_convert_i32_s/const.wat new file mode 100644 index 000000000000..20cd67a56ad8 --- /dev/null +++ b/winch/filetests/filetests/x64/f32_convert_i32_s/const.wat @@ -0,0 +1,22 @@ +;;! target = "x86_64" + +(module + (func (result f32) + (i32.const 1) + (f32.convert_i32_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8713000000 ja 0x2b +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; f30f2ac0 cvtsi2ss xmm0, eax +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2b: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_convert_i32_s/locals.wat b/winch/filetests/filetests/x64/f32_convert_i32_s/locals.wat new file mode 100644 index 000000000000..afc943673e46 --- /dev/null +++ b/winch/filetests/filetests/x64/f32_convert_i32_s/locals.wat @@ -0,0 +1,26 @@ +;;! target = "x86_64" + +(module + (func (result f32) + (local i32) + + (local.get 0) + (f32.convert_i32_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871b000000 ja 0x33 +;; 18: 48c744240800000000 +;; mov qword ptr [rsp + 8], 0 +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; f30f2ac0 cvtsi2ss xmm0, eax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 33: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_convert_i32_s/params.wat b/winch/filetests/filetests/x64/f32_convert_i32_s/params.wat new file mode 100644 index 000000000000..40d4607dd8bf --- /dev/null +++ b/winch/filetests/filetests/x64/f32_convert_i32_s/params.wat @@ -0,0 +1,23 @@ +;;! target = "x86_64" + +(module + (func (param i32) (result f32) + (local.get 0) + (f32.convert_i32_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8716000000 ja 0x2e +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; f30f2ac0 cvtsi2ss xmm0, eax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 2e: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_convert_i32_s/spilled.wat b/winch/filetests/filetests/x64/f32_convert_i32_s/spilled.wat new file mode 100644 index 000000000000..f928dc0f7dc3 --- /dev/null +++ b/winch/filetests/filetests/x64/f32_convert_i32_s/spilled.wat @@ -0,0 +1,28 @@ +;;! target = "x86_64" + +(module + (func (result f32) + i32.const 1 + f32.convert_i32_s + block + end + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8725000000 ja 0x3d +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; f30f2ac0 cvtsi2ss xmm0, eax +;; 4883ec04 sub rsp, 4 +;; f30f110424 movss dword ptr [rsp], xmm0 +;; f30f100424 movss xmm0, dword ptr [rsp] +;; 4883c404 add rsp, 4 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 3d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_convert_i32_u/const.wat b/winch/filetests/filetests/x64/f32_convert_i32_u/const.wat new file mode 100644 index 000000000000..04fb7bacebe6 --- /dev/null +++ b/winch/filetests/filetests/x64/f32_convert_i32_u/const.wat @@ -0,0 +1,33 @@ +;;! target = "x86_64" + +(module + (func (result f32) + (i32.const 1) + (f32.convert_i32_u) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f873f000000 ja 0x57 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b901000000 mov ecx, 1 +;; 8bc9 mov ecx, ecx +;; 4883f900 cmp rcx, 0 +;; 0f8c0a000000 jl 0x37 +;; 2d: f3480f2ac1 cvtsi2ss xmm0, rcx +;; e91a000000 jmp 0x51 +;; 37: 4989cb mov r11, rcx +;; 49c1eb01 shr r11, 1 +;; 4889c8 mov rax, rcx +;; 4883e001 and rax, 1 +;; 4c09d8 or rax, r11 +;; f3480f2ac0 cvtsi2ss xmm0, rax +;; f30f58c0 addss xmm0, xmm0 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 57: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_convert_i32_u/locals.wat b/winch/filetests/filetests/x64/f32_convert_i32_u/locals.wat new file mode 100644 index 000000000000..a3e2dad2d1b3 --- /dev/null +++ b/winch/filetests/filetests/x64/f32_convert_i32_u/locals.wat @@ -0,0 +1,37 @@ +;;! target = "x86_64" + +(module + (func (result f32) + (local i32) + + (local.get 0) + (f32.convert_i32_u) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8747000000 ja 0x5f +;; 18: 48c744240800000000 +;; mov qword ptr [rsp + 8], 0 +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 8bc9 mov ecx, ecx +;; 4883f900 cmp rcx, 0 +;; 0f8c0a000000 jl 0x3f +;; 35: f3480f2ac1 cvtsi2ss xmm0, rcx +;; e91a000000 jmp 0x59 +;; 3f: 4989cb mov r11, rcx +;; 49c1eb01 shr r11, 1 +;; 4889c8 mov rax, rcx +;; 4883e001 and rax, 1 +;; 4c09d8 or rax, r11 +;; f3480f2ac0 cvtsi2ss xmm0, rax +;; f30f58c0 addss xmm0, xmm0 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 5f: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_convert_i32_u/params.wat b/winch/filetests/filetests/x64/f32_convert_i32_u/params.wat new file mode 100644 index 000000000000..c560bc6ddd1b --- /dev/null +++ b/winch/filetests/filetests/x64/f32_convert_i32_u/params.wat @@ -0,0 +1,34 @@ +;;! target = "x86_64" + +(module + (func (param i32) (result f32) + (local.get 0) + (f32.convert_i32_u) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8742000000 ja 0x5a +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 8bc9 mov ecx, ecx +;; 4883f900 cmp rcx, 0 +;; 0f8c0a000000 jl 0x3a +;; 30: f3480f2ac1 cvtsi2ss xmm0, rcx +;; e91a000000 jmp 0x54 +;; 3a: 4989cb mov r11, rcx +;; 49c1eb01 shr r11, 1 +;; 4889c8 mov rax, rcx +;; 4883e001 and rax, 1 +;; 4c09d8 or rax, r11 +;; f3480f2ac0 cvtsi2ss xmm0, rax +;; f30f58c0 addss xmm0, xmm0 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 5a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_convert_i32_u/spilled.wat b/winch/filetests/filetests/x64/f32_convert_i32_u/spilled.wat new file mode 100644 index 000000000000..5253f43d4374 --- /dev/null +++ b/winch/filetests/filetests/x64/f32_convert_i32_u/spilled.wat @@ -0,0 +1,39 @@ +;;! target = "x86_64" + +(module + (func (result f32) + i32.const 1 + f32.convert_i32_u + block + end + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8751000000 ja 0x69 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b901000000 mov ecx, 1 +;; 8bc9 mov ecx, ecx +;; 4883f900 cmp rcx, 0 +;; 0f8c0a000000 jl 0x37 +;; 2d: f3480f2ac1 cvtsi2ss xmm0, rcx +;; e91a000000 jmp 0x51 +;; 37: 4989cb mov r11, rcx +;; 49c1eb01 shr r11, 1 +;; 4889c8 mov rax, rcx +;; 4883e001 and rax, 1 +;; 4c09d8 or rax, r11 +;; f3480f2ac0 cvtsi2ss xmm0, rax +;; f30f58c0 addss xmm0, xmm0 +;; 4883ec04 sub rsp, 4 +;; f30f110424 movss dword ptr [rsp], xmm0 +;; f30f100424 movss xmm0, dword ptr [rsp] +;; 4883c404 add rsp, 4 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 69: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_convert_i64_s/const.wat b/winch/filetests/filetests/x64/f32_convert_i64_s/const.wat new file mode 100644 index 000000000000..a442ab9c7a8e --- /dev/null +++ b/winch/filetests/filetests/x64/f32_convert_i64_s/const.wat @@ -0,0 +1,22 @@ +;;! target = "x86_64" + +(module + (func (result f32) + (i64.const 1) + (f32.convert_i64_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8716000000 ja 0x2e +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; f3480f2ac0 cvtsi2ss xmm0, rax +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2e: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_convert_i64_s/locals.wat b/winch/filetests/filetests/x64/f32_convert_i64_s/locals.wat new file mode 100644 index 000000000000..e52557a50c3b --- /dev/null +++ b/winch/filetests/filetests/x64/f32_convert_i64_s/locals.wat @@ -0,0 +1,26 @@ +;;! target = "x86_64" + +(module + (func (result f32) + (local i64) + + (local.get 0) + (f32.convert_i64_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871d000000 ja 0x35 +;; 18: 48c744240800000000 +;; mov qword ptr [rsp + 8], 0 +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; f3480f2ac0 cvtsi2ss xmm0, rax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 35: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_convert_i64_s/params.wat b/winch/filetests/filetests/x64/f32_convert_i64_s/params.wat new file mode 100644 index 000000000000..06ea1aae1426 --- /dev/null +++ b/winch/filetests/filetests/x64/f32_convert_i64_s/params.wat @@ -0,0 +1,23 @@ +;;! target = "x86_64" + +(module + (func (param i64) (result f32) + (local.get 0) + (f32.convert_i64_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8719000000 ja 0x31 +;; 18: 48897c2408 mov qword ptr [rsp + 8], rdi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; f3480f2ac0 cvtsi2ss xmm0, rax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 31: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_convert_i64_s/spilled.wat b/winch/filetests/filetests/x64/f32_convert_i64_s/spilled.wat new file mode 100644 index 000000000000..0d445d07dde7 --- /dev/null +++ b/winch/filetests/filetests/x64/f32_convert_i64_s/spilled.wat @@ -0,0 +1,28 @@ +;;! target = "x86_64" + +(module + (func (result f32) + i64.const 1 + f32.convert_i64_s + block + end + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8728000000 ja 0x40 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; f3480f2ac0 cvtsi2ss xmm0, rax +;; 4883ec04 sub rsp, 4 +;; f30f110424 movss dword ptr [rsp], xmm0 +;; f30f100424 movss xmm0, dword ptr [rsp] +;; 4883c404 add rsp, 4 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 40: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_convert_i64_u/const.wat b/winch/filetests/filetests/x64/f32_convert_i64_u/const.wat new file mode 100644 index 000000000000..e5a832f10e9c --- /dev/null +++ b/winch/filetests/filetests/x64/f32_convert_i64_u/const.wat @@ -0,0 +1,32 @@ +;;! target = "x86_64" + +(module + (func (result f32) + (i64.const 1) + (f32.convert_i64_u) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f873f000000 ja 0x57 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c101000000 mov rcx, 1 +;; 4883f900 cmp rcx, 0 +;; 0f8c0a000000 jl 0x37 +;; 2d: f3480f2ac1 cvtsi2ss xmm0, rcx +;; e91a000000 jmp 0x51 +;; 37: 4989cb mov r11, rcx +;; 49c1eb01 shr r11, 1 +;; 4889c8 mov rax, rcx +;; 4883e001 and rax, 1 +;; 4c09d8 or rax, r11 +;; f3480f2ac0 cvtsi2ss xmm0, rax +;; f30f58c0 addss xmm0, xmm0 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 57: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_convert_i64_u/locals.wat b/winch/filetests/filetests/x64/f32_convert_i64_u/locals.wat new file mode 100644 index 000000000000..0d3fa71c9fd6 --- /dev/null +++ b/winch/filetests/filetests/x64/f32_convert_i64_u/locals.wat @@ -0,0 +1,36 @@ +;;! target = "x86_64" + +(module + (func (result f32) + (local i64) + + (local.get 0) + (f32.convert_i64_u) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8746000000 ja 0x5e +;; 18: 48c744240800000000 +;; mov qword ptr [rsp + 8], 0 +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b4c2408 mov rcx, qword ptr [rsp + 8] +;; 4883f900 cmp rcx, 0 +;; 0f8c0a000000 jl 0x3e +;; 34: f3480f2ac1 cvtsi2ss xmm0, rcx +;; e91a000000 jmp 0x58 +;; 3e: 4989cb mov r11, rcx +;; 49c1eb01 shr r11, 1 +;; 4889c8 mov rax, rcx +;; 4883e001 and rax, 1 +;; 4c09d8 or rax, r11 +;; f3480f2ac0 cvtsi2ss xmm0, rax +;; f30f58c0 addss xmm0, xmm0 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 5e: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_convert_i64_u/params.wat b/winch/filetests/filetests/x64/f32_convert_i64_u/params.wat new file mode 100644 index 000000000000..2c085c59575d --- /dev/null +++ b/winch/filetests/filetests/x64/f32_convert_i64_u/params.wat @@ -0,0 +1,33 @@ +;;! target = "x86_64" + +(module + (func (param i64) (result f32) + (local.get 0) + (f32.convert_i64_u) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8742000000 ja 0x5a +;; 18: 48897c2408 mov qword ptr [rsp + 8], rdi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b4c2408 mov rcx, qword ptr [rsp + 8] +;; 4883f900 cmp rcx, 0 +;; 0f8c0a000000 jl 0x3a +;; 30: f3480f2ac1 cvtsi2ss xmm0, rcx +;; e91a000000 jmp 0x54 +;; 3a: 4989cb mov r11, rcx +;; 49c1eb01 shr r11, 1 +;; 4889c8 mov rax, rcx +;; 4883e001 and rax, 1 +;; 4c09d8 or rax, r11 +;; f3480f2ac0 cvtsi2ss xmm0, rax +;; f30f58c0 addss xmm0, xmm0 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 5a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_convert_i64_u/spilled.wat b/winch/filetests/filetests/x64/f32_convert_i64_u/spilled.wat new file mode 100644 index 000000000000..d7f95d9c0ef3 --- /dev/null +++ b/winch/filetests/filetests/x64/f32_convert_i64_u/spilled.wat @@ -0,0 +1,38 @@ +;;! target = "x86_64" + +(module + (func (result f32) + i64.const 1 + f32.convert_i64_u + block + end + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8751000000 ja 0x69 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c101000000 mov rcx, 1 +;; 4883f900 cmp rcx, 0 +;; 0f8c0a000000 jl 0x37 +;; 2d: f3480f2ac1 cvtsi2ss xmm0, rcx +;; e91a000000 jmp 0x51 +;; 37: 4989cb mov r11, rcx +;; 49c1eb01 shr r11, 1 +;; 4889c8 mov rax, rcx +;; 4883e001 and rax, 1 +;; 4c09d8 or rax, r11 +;; f3480f2ac0 cvtsi2ss xmm0, rax +;; f30f58c0 addss xmm0, xmm0 +;; 4883ec04 sub rsp, 4 +;; f30f110424 movss dword ptr [rsp], xmm0 +;; f30f100424 movss xmm0, dword ptr [rsp] +;; 4883c404 add rsp, 4 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 69: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_copysign/const.wat b/winch/filetests/filetests/x64/f32_copysign/const.wat index 987b0cd5587e..9f37b5bbc1ae 100644 --- a/winch/filetests/filetests/x64/f32_copysign/const.wat +++ b/winch/filetests/filetests/x64/f32_copysign/const.wat @@ -7,25 +7,33 @@ (f32.copysign) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f30f10052c000000 movss xmm0, dword ptr [rip + 0x2c] -;; 14: f30f100d2c000000 movss xmm1, dword ptr [rip + 0x2c] -;; 1c: 41bb00000080 mov r11d, 0x80000000 -;; 22: 66450f6efb movd xmm15, r11d -;; 27: 410f54c7 andps xmm0, xmm15 -;; 2b: 440f55f9 andnps xmm15, xmm1 -;; 2f: 410f28cf movaps xmm1, xmm15 -;; 33: 0f56c8 orps xmm1, xmm0 -;; 36: 0f28c1 movaps xmm0, xmm1 -;; 39: 4883c408 add rsp, 8 -;; 3d: 5d pop rbp -;; 3e: c3 ret -;; 3f: 00cd add ch, cl -;; 41: cc int3 -;; 42: 0c40 or al, 0x40 -;; 44: 0000 add byte ptr [rax], al -;; 46: 0000 add byte ptr [rax], al -;; 48: cdcc int 0xcc +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8737000000 ja 0x4f +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f30f100534000000 movss xmm0, dword ptr [rip + 0x34] +;; f30f100d34000000 movss xmm1, dword ptr [rip + 0x34] +;; 41bb00000080 mov r11d, 0x80000000 +;; 66450f6efb movd xmm15, r11d +;; 410f54c7 andps xmm0, xmm15 +;; 440f55f9 andnps xmm15, xmm1 +;; 410f28cf movaps xmm1, xmm15 +;; 0f56c8 orps xmm1, xmm0 +;; 0f28c1 movaps xmm0, xmm1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 4f: 0f0b ud2 +;; 51: 0000 add byte ptr [rax], al +;; 53: 0000 add byte ptr [rax], al +;; 55: 0000 add byte ptr [rax], al +;; 57: 00cd add ch, cl +;; 59: cc int3 +;; 5a: 0c40 or al, 0x40 +;; 5c: 0000 add byte ptr [rax], al +;; 5e: 0000 add byte ptr [rax], al +;; 60: cdcc int 0xcc diff --git a/winch/filetests/filetests/x64/f32_copysign/locals.wat b/winch/filetests/filetests/x64/f32_copysign/locals.wat index a99433315bad..5685c47de8dd 100644 --- a/winch/filetests/filetests/x64/f32_copysign/locals.wat +++ b/winch/filetests/filetests/x64/f32_copysign/locals.wat @@ -16,26 +16,34 @@ f32.copysign ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8758000000 ja 0x70 +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: f30f100543000000 movss xmm0, dword ptr [rip + 0x43] -;; 1d: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; 23: f30f10053d000000 movss xmm0, dword ptr [rip + 0x3d] -;; 2b: f30f11442408 movss dword ptr [rsp + 8], xmm0 -;; 31: f30f10442408 movss xmm0, dword ptr [rsp + 8] -;; 37: f30f104c240c movss xmm1, dword ptr [rsp + 0xc] -;; 3d: 41bb00000080 mov r11d, 0x80000000 -;; 43: 66450f6efb movd xmm15, r11d -;; 48: 410f54c7 andps xmm0, xmm15 -;; 4c: 440f55f9 andnps xmm15, xmm1 -;; 50: 410f28cf movaps xmm1, xmm15 -;; 54: 0f56c8 orps xmm1, xmm0 -;; 57: 0f28c1 movaps xmm0, xmm1 -;; 5a: 4883c410 add rsp, 0x10 -;; 5e: 5d pop rbp -;; 5f: c3 ret -;; 60: cdcc int 0xcc +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f10054b000000 movss xmm0, dword ptr [rip + 0x4b] +;; f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; f30f100545000000 movss xmm0, dword ptr [rip + 0x45] +;; f30f11442408 movss dword ptr [rsp + 8], xmm0 +;; f30f10442408 movss xmm0, dword ptr [rsp + 8] +;; f30f104c240c movss xmm1, dword ptr [rsp + 0xc] +;; 41bb00000080 mov r11d, 0x80000000 +;; 66450f6efb movd xmm15, r11d +;; 410f54c7 andps xmm0, xmm15 +;; 440f55f9 andnps xmm15, xmm1 +;; 410f28cf movaps xmm1, xmm15 +;; 0f56c8 orps xmm1, xmm0 +;; 0f28c1 movaps xmm0, xmm1 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 70: 0f0b ud2 +;; 72: 0000 add byte ptr [rax], al +;; 74: 0000 add byte ptr [rax], al +;; 76: 0000 add byte ptr [rax], al +;; 78: cdcc int 0xcc diff --git a/winch/filetests/filetests/x64/f32_copysign/params.wat b/winch/filetests/filetests/x64/f32_copysign/params.wat index 2413e64edd3f..4557dbc74b35 100644 --- a/winch/filetests/filetests/x64/f32_copysign/params.wat +++ b/winch/filetests/filetests/x64/f32_copysign/params.wat @@ -7,21 +7,26 @@ (f32.copysign) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; e: f30f114c2408 movss dword ptr [rsp + 8], xmm1 -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: f30f10442408 movss xmm0, dword ptr [rsp + 8] -;; 1e: f30f104c240c movss xmm1, dword ptr [rsp + 0xc] -;; 24: 41bb00000080 mov r11d, 0x80000000 -;; 2a: 66450f6efb movd xmm15, r11d -;; 2f: 410f54c7 andps xmm0, xmm15 -;; 33: 440f55f9 andnps xmm15, xmm1 -;; 37: 410f28cf movaps xmm1, xmm15 -;; 3b: 0f56c8 orps xmm1, xmm0 -;; 3e: 0f28c1 movaps xmm0, xmm1 -;; 41: 4883c410 add rsp, 0x10 -;; 45: 5d pop rbp -;; 46: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f873f000000 ja 0x57 +;; 18: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; f30f114c2408 movss dword ptr [rsp + 8], xmm1 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f10442408 movss xmm0, dword ptr [rsp + 8] +;; f30f104c240c movss xmm1, dword ptr [rsp + 0xc] +;; 41bb00000080 mov r11d, 0x80000000 +;; 66450f6efb movd xmm15, r11d +;; 410f54c7 andps xmm0, xmm15 +;; 440f55f9 andnps xmm15, xmm1 +;; 410f28cf movaps xmm1, xmm15 +;; 0f56c8 orps xmm1, xmm0 +;; 0f28c1 movaps xmm0, xmm1 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 57: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_demote_f64/const.wat b/winch/filetests/filetests/x64/f32_demote_f64/const.wat new file mode 100644 index 000000000000..105e671c5443 --- /dev/null +++ b/winch/filetests/filetests/x64/f32_demote_f64/const.wat @@ -0,0 +1,25 @@ +;;! target = "x86_64" + +(module + (func (result f32) + (f64.const 1.0) + (f32.demote_f64) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8716000000 ja 0x2e +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f20f10050c000000 movsd xmm0, qword ptr [rip + 0xc] +;; f20f5ac0 cvtsd2ss xmm0, xmm0 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2e: 0f0b ud2 +;; 30: 0000 add byte ptr [rax], al +;; 32: 0000 add byte ptr [rax], al +;; 34: 0000 add byte ptr [rax], al diff --git a/winch/filetests/filetests/x64/f32_demote_f64/locals.wat b/winch/filetests/filetests/x64/f32_demote_f64/locals.wat new file mode 100644 index 000000000000..8b7888373b84 --- /dev/null +++ b/winch/filetests/filetests/x64/f32_demote_f64/locals.wat @@ -0,0 +1,26 @@ +;;! target = "x86_64" + +(module + (func (result f32) + (local f64) + + (local.get 0) + (f32.demote_f64) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871d000000 ja 0x35 +;; 18: 48c744240800000000 +;; mov qword ptr [rsp + 8], 0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; f20f5ac0 cvtsd2ss xmm0, xmm0 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 35: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_demote_f64/params.wat b/winch/filetests/filetests/x64/f32_demote_f64/params.wat new file mode 100644 index 000000000000..2a2728e023b6 --- /dev/null +++ b/winch/filetests/filetests/x64/f32_demote_f64/params.wat @@ -0,0 +1,23 @@ +;;! target = "x86_64" + +(module + (func (param f64) (result f32) + (local.get 0) + (f32.demote_f64) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871a000000 ja 0x32 +;; 18: f20f11442408 movsd qword ptr [rsp + 8], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; f20f5ac0 cvtsd2ss xmm0, xmm0 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 32: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_demote_f64/spilled.wat b/winch/filetests/filetests/x64/f32_demote_f64/spilled.wat new file mode 100644 index 000000000000..aa7714abbeb5 --- /dev/null +++ b/winch/filetests/filetests/x64/f32_demote_f64/spilled.wat @@ -0,0 +1,34 @@ +;;! target = "x86_64" + +(module + (func (result f32) + f64.const 1.0 + f32.demote_f64 + block + end + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8728000000 ja 0x40 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f20f100524000000 movsd xmm0, qword ptr [rip + 0x24] +;; f20f5ac0 cvtsd2ss xmm0, xmm0 +;; 4883ec04 sub rsp, 4 +;; f30f110424 movss dword ptr [rsp], xmm0 +;; f30f100424 movss xmm0, dword ptr [rsp] +;; 4883c404 add rsp, 4 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 40: 0f0b ud2 +;; 42: 0000 add byte ptr [rax], al +;; 44: 0000 add byte ptr [rax], al +;; 46: 0000 add byte ptr [rax], al +;; 48: 0000 add byte ptr [rax], al +;; 4a: 0000 add byte ptr [rax], al +;; 4c: 0000 add byte ptr [rax], al diff --git a/winch/filetests/filetests/x64/f32_div/const.wat b/winch/filetests/filetests/x64/f32_div/const.wat index 08bc25e3c7b1..961b339d24a4 100644 --- a/winch/filetests/filetests/x64/f32_div/const.wat +++ b/winch/filetests/filetests/x64/f32_div/const.wat @@ -7,23 +7,27 @@ (f32.div) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f30f10051c000000 movss xmm0, dword ptr [rip + 0x1c] -;; 14: f30f100d1c000000 movss xmm1, dword ptr [rip + 0x1c] -;; 1c: f30f5ec8 divss xmm1, xmm0 -;; 20: 0f28c1 movaps xmm0, xmm1 -;; 23: 4883c408 add rsp, 8 -;; 27: 5d pop rbp -;; 28: c3 ret -;; 29: 0000 add byte ptr [rax], al -;; 2b: 0000 add byte ptr [rax], al -;; 2d: 0000 add byte ptr [rax], al -;; 2f: 00cd add ch, cl -;; 31: cc int3 -;; 32: 0c40 or al, 0x40 -;; 34: 0000 add byte ptr [rax], al -;; 36: 0000 add byte ptr [rax], al -;; 38: cdcc int 0xcc +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8721000000 ja 0x39 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f30f10051c000000 movss xmm0, dword ptr [rip + 0x1c] +;; f30f100d1c000000 movss xmm1, dword ptr [rip + 0x1c] +;; f30f5ec8 divss xmm1, xmm0 +;; 0f28c1 movaps xmm0, xmm1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 39: 0f0b ud2 +;; 3b: 0000 add byte ptr [rax], al +;; 3d: 0000 add byte ptr [rax], al +;; 3f: 00cd add ch, cl +;; 41: cc int3 +;; 42: 0c40 or al, 0x40 +;; 44: 0000 add byte ptr [rax], al +;; 46: 0000 add byte ptr [rax], al +;; 48: cdcc int 0xcc diff --git a/winch/filetests/filetests/x64/f32_div/locals.wat b/winch/filetests/filetests/x64/f32_div/locals.wat index bbae5c9e8760..7f1b2001c2b4 100644 --- a/winch/filetests/filetests/x64/f32_div/locals.wat +++ b/winch/filetests/filetests/x64/f32_div/locals.wat @@ -16,24 +16,28 @@ f32.div ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8742000000 ja 0x5a +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: f30f100533000000 movss xmm0, dword ptr [rip + 0x33] -;; 1d: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; 23: f30f10052d000000 movss xmm0, dword ptr [rip + 0x2d] -;; 2b: f30f11442408 movss dword ptr [rsp + 8], xmm0 -;; 31: f30f10442408 movss xmm0, dword ptr [rsp + 8] -;; 37: f30f104c240c movss xmm1, dword ptr [rsp + 0xc] -;; 3d: f30f5ec8 divss xmm1, xmm0 -;; 41: 0f28c1 movaps xmm0, xmm1 -;; 44: 4883c410 add rsp, 0x10 -;; 48: 5d pop rbp -;; 49: c3 ret -;; 4a: 0000 add byte ptr [rax], al -;; 4c: 0000 add byte ptr [rax], al -;; 4e: 0000 add byte ptr [rax], al -;; 50: cdcc int 0xcc +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f100533000000 movss xmm0, dword ptr [rip + 0x33] +;; f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; f30f10052d000000 movss xmm0, dword ptr [rip + 0x2d] +;; f30f11442408 movss dword ptr [rsp + 8], xmm0 +;; f30f10442408 movss xmm0, dword ptr [rsp + 8] +;; f30f104c240c movss xmm1, dword ptr [rsp + 0xc] +;; f30f5ec8 divss xmm1, xmm0 +;; 0f28c1 movaps xmm0, xmm1 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 5a: 0f0b ud2 +;; 5c: 0000 add byte ptr [rax], al +;; 5e: 0000 add byte ptr [rax], al +;; 60: cdcc int 0xcc diff --git a/winch/filetests/filetests/x64/f32_div/params.wat b/winch/filetests/filetests/x64/f32_div/params.wat index 0789fdbbc5ce..a23713d3c3a8 100644 --- a/winch/filetests/filetests/x64/f32_div/params.wat +++ b/winch/filetests/filetests/x64/f32_div/params.wat @@ -7,16 +7,21 @@ (f32.div) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; e: f30f114c2408 movss dword ptr [rsp + 8], xmm1 -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: f30f10442408 movss xmm0, dword ptr [rsp + 8] -;; 1e: f30f104c240c movss xmm1, dword ptr [rsp + 0xc] -;; 24: f30f5ec8 divss xmm1, xmm0 -;; 28: 0f28c1 movaps xmm0, xmm1 -;; 2b: 4883c410 add rsp, 0x10 -;; 2f: 5d pop rbp -;; 30: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8729000000 ja 0x41 +;; 18: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; f30f114c2408 movss dword ptr [rsp + 8], xmm1 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f10442408 movss xmm0, dword ptr [rsp + 8] +;; f30f104c240c movss xmm1, dword ptr [rsp + 0xc] +;; f30f5ec8 divss xmm1, xmm0 +;; 0f28c1 movaps xmm0, xmm1 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 41: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_eq/const.wat b/winch/filetests/filetests/x64/f32_eq/const.wat index a43c065bf2a2..cd55f955a6e2 100644 --- a/winch/filetests/filetests/x64/f32_eq/const.wat +++ b/winch/filetests/filetests/x64/f32_eq/const.wat @@ -7,26 +7,30 @@ (f32.eq) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f30f10052c000000 movss xmm0, dword ptr [rip + 0x2c] -;; 14: f30f100d2c000000 movss xmm1, dword ptr [rip + 0x2c] -;; 1c: 0f2ec8 ucomiss xmm1, xmm0 -;; 1f: b800000000 mov eax, 0 -;; 24: 400f94c0 sete al -;; 28: 41bb00000000 mov r11d, 0 -;; 2e: 410f9bc3 setnp r11b -;; 32: 4421d8 and eax, r11d -;; 35: 4883c408 add rsp, 8 -;; 39: 5d pop rbp -;; 3a: c3 ret -;; 3b: 0000 add byte ptr [rax], al -;; 3d: 0000 add byte ptr [rax], al -;; 3f: 00cd add ch, cl -;; 41: cc int3 -;; 42: 0c40 or al, 0x40 -;; 44: 0000 add byte ptr [rax], al -;; 46: 0000 add byte ptr [rax], al -;; 48: cdcc int 0xcc +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8733000000 ja 0x4b +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f30f10052c000000 movss xmm0, dword ptr [rip + 0x2c] +;; f30f100d2c000000 movss xmm1, dword ptr [rip + 0x2c] +;; 0f2ec8 ucomiss xmm1, xmm0 +;; b800000000 mov eax, 0 +;; 400f94c0 sete al +;; 41bb00000000 mov r11d, 0 +;; 410f9bc3 setnp r11b +;; 4421d8 and eax, r11d +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 4b: 0f0b ud2 +;; 4d: 0000 add byte ptr [rax], al +;; 4f: 00cd add ch, cl +;; 51: cc int3 +;; 52: 0c40 or al, 0x40 +;; 54: 0000 add byte ptr [rax], al +;; 56: 0000 add byte ptr [rax], al +;; 58: cdcc int 0xcc diff --git a/winch/filetests/filetests/x64/f32_eq/locals.wat b/winch/filetests/filetests/x64/f32_eq/locals.wat index 8a35395b7839..ff0b16df059f 100644 --- a/winch/filetests/filetests/x64/f32_eq/locals.wat +++ b/winch/filetests/filetests/x64/f32_eq/locals.wat @@ -16,27 +16,31 @@ f32.eq ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8754000000 ja 0x6c +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: f30f100543000000 movss xmm0, dword ptr [rip + 0x43] -;; 1d: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; 23: f30f10053d000000 movss xmm0, dword ptr [rip + 0x3d] -;; 2b: f30f11442408 movss dword ptr [rsp + 8], xmm0 -;; 31: f30f10442408 movss xmm0, dword ptr [rsp + 8] -;; 37: f30f104c240c movss xmm1, dword ptr [rsp + 0xc] -;; 3d: 0f2ec8 ucomiss xmm1, xmm0 -;; 40: b800000000 mov eax, 0 -;; 45: 400f94c0 sete al -;; 49: 41bb00000000 mov r11d, 0 -;; 4f: 410f9bc3 setnp r11b -;; 53: 4421d8 and eax, r11d -;; 56: 4883c410 add rsp, 0x10 -;; 5a: 5d pop rbp -;; 5b: c3 ret -;; 5c: 0000 add byte ptr [rax], al -;; 5e: 0000 add byte ptr [rax], al -;; 60: cdcc int 0xcc +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f100543000000 movss xmm0, dword ptr [rip + 0x43] +;; f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; f30f10053d000000 movss xmm0, dword ptr [rip + 0x3d] +;; f30f11442408 movss dword ptr [rsp + 8], xmm0 +;; f30f10442408 movss xmm0, dword ptr [rsp + 8] +;; f30f104c240c movss xmm1, dword ptr [rsp + 0xc] +;; 0f2ec8 ucomiss xmm1, xmm0 +;; b800000000 mov eax, 0 +;; 400f94c0 sete al +;; 41bb00000000 mov r11d, 0 +;; 410f9bc3 setnp r11b +;; 4421d8 and eax, r11d +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 6c: 0f0b ud2 +;; 6e: 0000 add byte ptr [rax], al +;; 70: cdcc int 0xcc diff --git a/winch/filetests/filetests/x64/f32_eq/params.wat b/winch/filetests/filetests/x64/f32_eq/params.wat index 2d85d9e1dd3c..23789e499e66 100644 --- a/winch/filetests/filetests/x64/f32_eq/params.wat +++ b/winch/filetests/filetests/x64/f32_eq/params.wat @@ -7,20 +7,25 @@ (f32.eq) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; e: f30f114c2408 movss dword ptr [rsp + 8], xmm1 -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: f30f10442408 movss xmm0, dword ptr [rsp + 8] -;; 1e: f30f104c240c movss xmm1, dword ptr [rsp + 0xc] -;; 24: 0f2ec8 ucomiss xmm1, xmm0 -;; 27: b800000000 mov eax, 0 -;; 2c: 400f94c0 sete al -;; 30: 41bb00000000 mov r11d, 0 -;; 36: 410f9bc3 setnp r11b -;; 3a: 4421d8 and eax, r11d -;; 3d: 4883c410 add rsp, 0x10 -;; 41: 5d pop rbp -;; 42: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f873b000000 ja 0x53 +;; 18: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; f30f114c2408 movss dword ptr [rsp + 8], xmm1 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f10442408 movss xmm0, dword ptr [rsp + 8] +;; f30f104c240c movss xmm1, dword ptr [rsp + 0xc] +;; 0f2ec8 ucomiss xmm1, xmm0 +;; b800000000 mov eax, 0 +;; 400f94c0 sete al +;; 41bb00000000 mov r11d, 0 +;; 410f9bc3 setnp r11b +;; 4421d8 and eax, r11d +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 53: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_floor/f32_floor_const_sse41.wat b/winch/filetests/filetests/x64/f32_floor/f32_floor_const_sse41.wat index 5681b1e43225..3701cfffd0f1 100644 --- a/winch/filetests/filetests/x64/f32_floor/f32_floor_const_sse41.wat +++ b/winch/filetests/filetests/x64/f32_floor/f32_floor_const_sse41.wat @@ -7,15 +7,23 @@ (f32.floor) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f30f10050c000000 movss xmm0, dword ptr [rip + 0xc] -;; 14: 660f3a0ac001 roundss xmm0, xmm0, 1 -;; 1a: 4883c408 add rsp, 8 -;; 1e: 5d pop rbp -;; 1f: c3 ret -;; 20: c3 ret -;; 21: f5 cmc -;; 22: a8bf test al, 0xbf +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8718000000 ja 0x30 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f30f100514000000 movss xmm0, dword ptr [rip + 0x14] +;; 660f3a0ac001 roundss xmm0, xmm0, 1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 30: 0f0b ud2 +;; 32: 0000 add byte ptr [rax], al +;; 34: 0000 add byte ptr [rax], al +;; 36: 0000 add byte ptr [rax], al +;; 38: c3 ret +;; 39: f5 cmc +;; 3a: a8bf test al, 0xbf diff --git a/winch/filetests/filetests/x64/f32_floor/f32_floor_param.wat b/winch/filetests/filetests/x64/f32_floor/f32_floor_param.wat index 142ad010541e..235979279c07 100644 --- a/winch/filetests/filetests/x64/f32_floor/f32_floor_param.wat +++ b/winch/filetests/filetests/x64/f32_floor/f32_floor_param.wat @@ -6,13 +6,24 @@ (f32.floor) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; e: 4c893424 mov qword ptr [rsp], r14 -;; 12: f30f1044240c movss xmm0, dword ptr [rsp + 0xc] -;; 18: e800000000 call 0x1d -;; 1d: 4883c410 add rsp, 0x10 -;; 21: 5d pop rbp -;; 22: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8738000000 ja 0x50 +;; 18: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f3440f107c240c movss xmm15, dword ptr [rsp + 0xc] +;; 4883ec04 sub rsp, 4 +;; f3440f113c24 movss dword ptr [rsp], xmm15 +;; 4883ec0c sub rsp, 0xc +;; f30f1044240c movss xmm0, dword ptr [rsp + 0xc] +;; e800000000 call 0x42 +;; 4883c40c add rsp, 0xc +;; 4883c404 add rsp, 4 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 50: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_floor/f32_floor_param_sse41.wat b/winch/filetests/filetests/x64/f32_floor/f32_floor_param_sse41.wat index 5ec777694a44..21b7293e4b71 100644 --- a/winch/filetests/filetests/x64/f32_floor/f32_floor_param_sse41.wat +++ b/winch/filetests/filetests/x64/f32_floor/f32_floor_param_sse41.wat @@ -7,13 +7,18 @@ (f32.floor) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; e: 4c893424 mov qword ptr [rsp], r14 -;; 12: f30f1044240c movss xmm0, dword ptr [rsp + 0xc] -;; 18: 660f3a0ac001 roundss xmm0, xmm0, 1 -;; 1e: 4883c410 add rsp, 0x10 -;; 22: 5d pop rbp -;; 23: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871c000000 ja 0x34 +;; 18: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f1044240c movss xmm0, dword ptr [rsp + 0xc] +;; 660f3a0ac001 roundss xmm0, xmm0, 1 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 34: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_ge/const.wat b/winch/filetests/filetests/x64/f32_ge/const.wat index 6e5b09082dbf..7a301e74b841 100644 --- a/winch/filetests/filetests/x64/f32_ge/const.wat +++ b/winch/filetests/filetests/x64/f32_ge/const.wat @@ -7,26 +7,30 @@ (f32.ge) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f30f10052c000000 movss xmm0, dword ptr [rip + 0x2c] -;; 14: f30f100d2c000000 movss xmm1, dword ptr [rip + 0x2c] -;; 1c: 0f2ec8 ucomiss xmm1, xmm0 -;; 1f: b800000000 mov eax, 0 -;; 24: 400f93c0 setae al -;; 28: 41bb00000000 mov r11d, 0 -;; 2e: 410f9bc3 setnp r11b -;; 32: 4421d8 and eax, r11d -;; 35: 4883c408 add rsp, 8 -;; 39: 5d pop rbp -;; 3a: c3 ret -;; 3b: 0000 add byte ptr [rax], al -;; 3d: 0000 add byte ptr [rax], al -;; 3f: 00cd add ch, cl -;; 41: cc int3 -;; 42: 0c40 or al, 0x40 -;; 44: 0000 add byte ptr [rax], al -;; 46: 0000 add byte ptr [rax], al -;; 48: cdcc int 0xcc +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8733000000 ja 0x4b +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f30f10052c000000 movss xmm0, dword ptr [rip + 0x2c] +;; f30f100d2c000000 movss xmm1, dword ptr [rip + 0x2c] +;; 0f2ec8 ucomiss xmm1, xmm0 +;; b800000000 mov eax, 0 +;; 400f93c0 setae al +;; 41bb00000000 mov r11d, 0 +;; 410f9bc3 setnp r11b +;; 4421d8 and eax, r11d +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 4b: 0f0b ud2 +;; 4d: 0000 add byte ptr [rax], al +;; 4f: 00cd add ch, cl +;; 51: cc int3 +;; 52: 0c40 or al, 0x40 +;; 54: 0000 add byte ptr [rax], al +;; 56: 0000 add byte ptr [rax], al +;; 58: cdcc int 0xcc diff --git a/winch/filetests/filetests/x64/f32_ge/locals.wat b/winch/filetests/filetests/x64/f32_ge/locals.wat index 951a9cdf7cf9..a21167ef71a1 100644 --- a/winch/filetests/filetests/x64/f32_ge/locals.wat +++ b/winch/filetests/filetests/x64/f32_ge/locals.wat @@ -16,27 +16,31 @@ f32.ge ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8754000000 ja 0x6c +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: f30f100543000000 movss xmm0, dword ptr [rip + 0x43] -;; 1d: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; 23: f30f10053d000000 movss xmm0, dword ptr [rip + 0x3d] -;; 2b: f30f11442408 movss dword ptr [rsp + 8], xmm0 -;; 31: f30f10442408 movss xmm0, dword ptr [rsp + 8] -;; 37: f30f104c240c movss xmm1, dword ptr [rsp + 0xc] -;; 3d: 0f2ec8 ucomiss xmm1, xmm0 -;; 40: b800000000 mov eax, 0 -;; 45: 400f93c0 setae al -;; 49: 41bb00000000 mov r11d, 0 -;; 4f: 410f9bc3 setnp r11b -;; 53: 4421d8 and eax, r11d -;; 56: 4883c410 add rsp, 0x10 -;; 5a: 5d pop rbp -;; 5b: c3 ret -;; 5c: 0000 add byte ptr [rax], al -;; 5e: 0000 add byte ptr [rax], al -;; 60: cdcc int 0xcc +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f100543000000 movss xmm0, dword ptr [rip + 0x43] +;; f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; f30f10053d000000 movss xmm0, dword ptr [rip + 0x3d] +;; f30f11442408 movss dword ptr [rsp + 8], xmm0 +;; f30f10442408 movss xmm0, dword ptr [rsp + 8] +;; f30f104c240c movss xmm1, dword ptr [rsp + 0xc] +;; 0f2ec8 ucomiss xmm1, xmm0 +;; b800000000 mov eax, 0 +;; 400f93c0 setae al +;; 41bb00000000 mov r11d, 0 +;; 410f9bc3 setnp r11b +;; 4421d8 and eax, r11d +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 6c: 0f0b ud2 +;; 6e: 0000 add byte ptr [rax], al +;; 70: cdcc int 0xcc diff --git a/winch/filetests/filetests/x64/f32_ge/params.wat b/winch/filetests/filetests/x64/f32_ge/params.wat index 41aca2be5330..a02e759f15fa 100644 --- a/winch/filetests/filetests/x64/f32_ge/params.wat +++ b/winch/filetests/filetests/x64/f32_ge/params.wat @@ -7,20 +7,25 @@ (f32.ge) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; e: f30f114c2408 movss dword ptr [rsp + 8], xmm1 -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: f30f10442408 movss xmm0, dword ptr [rsp + 8] -;; 1e: f30f104c240c movss xmm1, dword ptr [rsp + 0xc] -;; 24: 0f2ec8 ucomiss xmm1, xmm0 -;; 27: b800000000 mov eax, 0 -;; 2c: 400f93c0 setae al -;; 30: 41bb00000000 mov r11d, 0 -;; 36: 410f9bc3 setnp r11b -;; 3a: 4421d8 and eax, r11d -;; 3d: 4883c410 add rsp, 0x10 -;; 41: 5d pop rbp -;; 42: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f873b000000 ja 0x53 +;; 18: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; f30f114c2408 movss dword ptr [rsp + 8], xmm1 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f10442408 movss xmm0, dword ptr [rsp + 8] +;; f30f104c240c movss xmm1, dword ptr [rsp + 0xc] +;; 0f2ec8 ucomiss xmm1, xmm0 +;; b800000000 mov eax, 0 +;; 400f93c0 setae al +;; 41bb00000000 mov r11d, 0 +;; 410f9bc3 setnp r11b +;; 4421d8 and eax, r11d +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 53: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_gt/const.wat b/winch/filetests/filetests/x64/f32_gt/const.wat index 58bf08f16f8f..682fec2dddb5 100644 --- a/winch/filetests/filetests/x64/f32_gt/const.wat +++ b/winch/filetests/filetests/x64/f32_gt/const.wat @@ -7,26 +7,30 @@ (f32.gt) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f30f10052c000000 movss xmm0, dword ptr [rip + 0x2c] -;; 14: f30f100d2c000000 movss xmm1, dword ptr [rip + 0x2c] -;; 1c: 0f2ec8 ucomiss xmm1, xmm0 -;; 1f: b800000000 mov eax, 0 -;; 24: 400f97c0 seta al -;; 28: 41bb00000000 mov r11d, 0 -;; 2e: 410f9bc3 setnp r11b -;; 32: 4421d8 and eax, r11d -;; 35: 4883c408 add rsp, 8 -;; 39: 5d pop rbp -;; 3a: c3 ret -;; 3b: 0000 add byte ptr [rax], al -;; 3d: 0000 add byte ptr [rax], al -;; 3f: 00cd add ch, cl -;; 41: cc int3 -;; 42: 0c40 or al, 0x40 -;; 44: 0000 add byte ptr [rax], al -;; 46: 0000 add byte ptr [rax], al -;; 48: cdcc int 0xcc +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8733000000 ja 0x4b +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f30f10052c000000 movss xmm0, dword ptr [rip + 0x2c] +;; f30f100d2c000000 movss xmm1, dword ptr [rip + 0x2c] +;; 0f2ec8 ucomiss xmm1, xmm0 +;; b800000000 mov eax, 0 +;; 400f97c0 seta al +;; 41bb00000000 mov r11d, 0 +;; 410f9bc3 setnp r11b +;; 4421d8 and eax, r11d +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 4b: 0f0b ud2 +;; 4d: 0000 add byte ptr [rax], al +;; 4f: 00cd add ch, cl +;; 51: cc int3 +;; 52: 0c40 or al, 0x40 +;; 54: 0000 add byte ptr [rax], al +;; 56: 0000 add byte ptr [rax], al +;; 58: cdcc int 0xcc diff --git a/winch/filetests/filetests/x64/f32_gt/locals.wat b/winch/filetests/filetests/x64/f32_gt/locals.wat index 6481f5d7231b..cc304e3c2253 100644 --- a/winch/filetests/filetests/x64/f32_gt/locals.wat +++ b/winch/filetests/filetests/x64/f32_gt/locals.wat @@ -16,27 +16,31 @@ f32.gt ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8754000000 ja 0x6c +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: f30f100543000000 movss xmm0, dword ptr [rip + 0x43] -;; 1d: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; 23: f30f10053d000000 movss xmm0, dword ptr [rip + 0x3d] -;; 2b: f30f11442408 movss dword ptr [rsp + 8], xmm0 -;; 31: f30f10442408 movss xmm0, dword ptr [rsp + 8] -;; 37: f30f104c240c movss xmm1, dword ptr [rsp + 0xc] -;; 3d: 0f2ec8 ucomiss xmm1, xmm0 -;; 40: b800000000 mov eax, 0 -;; 45: 400f97c0 seta al -;; 49: 41bb00000000 mov r11d, 0 -;; 4f: 410f9bc3 setnp r11b -;; 53: 4421d8 and eax, r11d -;; 56: 4883c410 add rsp, 0x10 -;; 5a: 5d pop rbp -;; 5b: c3 ret -;; 5c: 0000 add byte ptr [rax], al -;; 5e: 0000 add byte ptr [rax], al -;; 60: cdcc int 0xcc +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f100543000000 movss xmm0, dword ptr [rip + 0x43] +;; f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; f30f10053d000000 movss xmm0, dword ptr [rip + 0x3d] +;; f30f11442408 movss dword ptr [rsp + 8], xmm0 +;; f30f10442408 movss xmm0, dword ptr [rsp + 8] +;; f30f104c240c movss xmm1, dword ptr [rsp + 0xc] +;; 0f2ec8 ucomiss xmm1, xmm0 +;; b800000000 mov eax, 0 +;; 400f97c0 seta al +;; 41bb00000000 mov r11d, 0 +;; 410f9bc3 setnp r11b +;; 4421d8 and eax, r11d +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 6c: 0f0b ud2 +;; 6e: 0000 add byte ptr [rax], al +;; 70: cdcc int 0xcc diff --git a/winch/filetests/filetests/x64/f32_gt/params.wat b/winch/filetests/filetests/x64/f32_gt/params.wat index 2286a7b567c6..6e5c38d9e228 100644 --- a/winch/filetests/filetests/x64/f32_gt/params.wat +++ b/winch/filetests/filetests/x64/f32_gt/params.wat @@ -7,20 +7,25 @@ (f32.gt) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; e: f30f114c2408 movss dword ptr [rsp + 8], xmm1 -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: f30f10442408 movss xmm0, dword ptr [rsp + 8] -;; 1e: f30f104c240c movss xmm1, dword ptr [rsp + 0xc] -;; 24: 0f2ec8 ucomiss xmm1, xmm0 -;; 27: b800000000 mov eax, 0 -;; 2c: 400f97c0 seta al -;; 30: 41bb00000000 mov r11d, 0 -;; 36: 410f9bc3 setnp r11b -;; 3a: 4421d8 and eax, r11d -;; 3d: 4883c410 add rsp, 0x10 -;; 41: 5d pop rbp -;; 42: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f873b000000 ja 0x53 +;; 18: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; f30f114c2408 movss dword ptr [rsp + 8], xmm1 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f10442408 movss xmm0, dword ptr [rsp + 8] +;; f30f104c240c movss xmm1, dword ptr [rsp + 0xc] +;; 0f2ec8 ucomiss xmm1, xmm0 +;; b800000000 mov eax, 0 +;; 400f97c0 seta al +;; 41bb00000000 mov r11d, 0 +;; 410f9bc3 setnp r11b +;; 4421d8 and eax, r11d +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 53: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_le/const.wat b/winch/filetests/filetests/x64/f32_le/const.wat index a75a82d72299..17863ce52628 100644 --- a/winch/filetests/filetests/x64/f32_le/const.wat +++ b/winch/filetests/filetests/x64/f32_le/const.wat @@ -7,21 +7,25 @@ (f32.le) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f30f10051c000000 movss xmm0, dword ptr [rip + 0x1c] -;; 14: f30f100d1c000000 movss xmm1, dword ptr [rip + 0x1c] -;; 1c: 0f2ec1 ucomiss xmm0, xmm1 -;; 1f: b800000000 mov eax, 0 -;; 24: 400f93c0 setae al -;; 28: 4883c408 add rsp, 8 -;; 2c: 5d pop rbp -;; 2d: c3 ret -;; 2e: 0000 add byte ptr [rax], al -;; 30: cdcc int 0xcc -;; 32: 0c40 or al, 0x40 -;; 34: 0000 add byte ptr [rax], al -;; 36: 0000 add byte ptr [rax], al -;; 38: cdcc int 0xcc +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8726000000 ja 0x3e +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f30f10051c000000 movss xmm0, dword ptr [rip + 0x1c] +;; f30f100d1c000000 movss xmm1, dword ptr [rip + 0x1c] +;; 0f2ec1 ucomiss xmm0, xmm1 +;; b800000000 mov eax, 0 +;; 400f93c0 setae al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 3e: 0f0b ud2 +;; 40: cdcc int 0xcc +;; 42: 0c40 or al, 0x40 +;; 44: 0000 add byte ptr [rax], al +;; 46: 0000 add byte ptr [rax], al +;; 48: cdcc int 0xcc diff --git a/winch/filetests/filetests/x64/f32_le/locals.wat b/winch/filetests/filetests/x64/f32_le/locals.wat index 98a21193726f..d271f75022f9 100644 --- a/winch/filetests/filetests/x64/f32_le/locals.wat +++ b/winch/filetests/filetests/x64/f32_le/locals.wat @@ -16,23 +16,31 @@ f32.le ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8747000000 ja 0x5f +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: f30f100533000000 movss xmm0, dword ptr [rip + 0x33] -;; 1d: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; 23: f30f10052d000000 movss xmm0, dword ptr [rip + 0x2d] -;; 2b: f30f11442408 movss dword ptr [rsp + 8], xmm0 -;; 31: f30f10442408 movss xmm0, dword ptr [rsp + 8] -;; 37: f30f104c240c movss xmm1, dword ptr [rsp + 0xc] -;; 3d: 0f2ec1 ucomiss xmm0, xmm1 -;; 40: b800000000 mov eax, 0 -;; 45: 400f93c0 setae al -;; 49: 4883c410 add rsp, 0x10 -;; 4d: 5d pop rbp -;; 4e: c3 ret -;; 4f: 00cd add ch, cl -;; 51: cc int3 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f10053b000000 movss xmm0, dword ptr [rip + 0x3b] +;; f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; f30f100535000000 movss xmm0, dword ptr [rip + 0x35] +;; f30f11442408 movss dword ptr [rsp + 8], xmm0 +;; f30f10442408 movss xmm0, dword ptr [rsp + 8] +;; f30f104c240c movss xmm1, dword ptr [rsp + 0xc] +;; 0f2ec1 ucomiss xmm0, xmm1 +;; b800000000 mov eax, 0 +;; 400f93c0 setae al +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 5f: 0f0b ud2 +;; 61: 0000 add byte ptr [rax], al +;; 63: 0000 add byte ptr [rax], al +;; 65: 0000 add byte ptr [rax], al +;; 67: 00cd add ch, cl +;; 69: cc int3 diff --git a/winch/filetests/filetests/x64/f32_le/params.wat b/winch/filetests/filetests/x64/f32_le/params.wat index f7c88c295449..329e51de141a 100644 --- a/winch/filetests/filetests/x64/f32_le/params.wat +++ b/winch/filetests/filetests/x64/f32_le/params.wat @@ -7,17 +7,22 @@ (f32.le) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; e: f30f114c2408 movss dword ptr [rsp + 8], xmm1 -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: f30f10442408 movss xmm0, dword ptr [rsp + 8] -;; 1e: f30f104c240c movss xmm1, dword ptr [rsp + 0xc] -;; 24: 0f2ec1 ucomiss xmm0, xmm1 -;; 27: b800000000 mov eax, 0 -;; 2c: 400f93c0 setae al -;; 30: 4883c410 add rsp, 0x10 -;; 34: 5d pop rbp -;; 35: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872e000000 ja 0x46 +;; 18: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; f30f114c2408 movss dword ptr [rsp + 8], xmm1 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f10442408 movss xmm0, dword ptr [rsp + 8] +;; f30f104c240c movss xmm1, dword ptr [rsp + 0xc] +;; 0f2ec1 ucomiss xmm0, xmm1 +;; b800000000 mov eax, 0 +;; 400f93c0 setae al +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 46: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_lt/const.wat b/winch/filetests/filetests/x64/f32_lt/const.wat index d1531ac68914..ee61267bedae 100644 --- a/winch/filetests/filetests/x64/f32_lt/const.wat +++ b/winch/filetests/filetests/x64/f32_lt/const.wat @@ -7,21 +7,25 @@ (f32.lt) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f30f10051c000000 movss xmm0, dword ptr [rip + 0x1c] -;; 14: f30f100d1c000000 movss xmm1, dword ptr [rip + 0x1c] -;; 1c: 0f2ec1 ucomiss xmm0, xmm1 -;; 1f: b800000000 mov eax, 0 -;; 24: 400f97c0 seta al -;; 28: 4883c408 add rsp, 8 -;; 2c: 5d pop rbp -;; 2d: c3 ret -;; 2e: 0000 add byte ptr [rax], al -;; 30: cdcc int 0xcc -;; 32: 0c40 or al, 0x40 -;; 34: 0000 add byte ptr [rax], al -;; 36: 0000 add byte ptr [rax], al -;; 38: cdcc int 0xcc +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8726000000 ja 0x3e +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f30f10051c000000 movss xmm0, dword ptr [rip + 0x1c] +;; f30f100d1c000000 movss xmm1, dword ptr [rip + 0x1c] +;; 0f2ec1 ucomiss xmm0, xmm1 +;; b800000000 mov eax, 0 +;; 400f97c0 seta al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 3e: 0f0b ud2 +;; 40: cdcc int 0xcc +;; 42: 0c40 or al, 0x40 +;; 44: 0000 add byte ptr [rax], al +;; 46: 0000 add byte ptr [rax], al +;; 48: cdcc int 0xcc diff --git a/winch/filetests/filetests/x64/f32_lt/locals.wat b/winch/filetests/filetests/x64/f32_lt/locals.wat index 872a9fc1ebaa..c04338f310ac 100644 --- a/winch/filetests/filetests/x64/f32_lt/locals.wat +++ b/winch/filetests/filetests/x64/f32_lt/locals.wat @@ -16,23 +16,31 @@ f32.lt ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8747000000 ja 0x5f +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: f30f100533000000 movss xmm0, dword ptr [rip + 0x33] -;; 1d: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; 23: f30f10052d000000 movss xmm0, dword ptr [rip + 0x2d] -;; 2b: f30f11442408 movss dword ptr [rsp + 8], xmm0 -;; 31: f30f10442408 movss xmm0, dword ptr [rsp + 8] -;; 37: f30f104c240c movss xmm1, dword ptr [rsp + 0xc] -;; 3d: 0f2ec1 ucomiss xmm0, xmm1 -;; 40: b800000000 mov eax, 0 -;; 45: 400f97c0 seta al -;; 49: 4883c410 add rsp, 0x10 -;; 4d: 5d pop rbp -;; 4e: c3 ret -;; 4f: 00cd add ch, cl -;; 51: cc int3 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f10053b000000 movss xmm0, dword ptr [rip + 0x3b] +;; f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; f30f100535000000 movss xmm0, dword ptr [rip + 0x35] +;; f30f11442408 movss dword ptr [rsp + 8], xmm0 +;; f30f10442408 movss xmm0, dword ptr [rsp + 8] +;; f30f104c240c movss xmm1, dword ptr [rsp + 0xc] +;; 0f2ec1 ucomiss xmm0, xmm1 +;; b800000000 mov eax, 0 +;; 400f97c0 seta al +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 5f: 0f0b ud2 +;; 61: 0000 add byte ptr [rax], al +;; 63: 0000 add byte ptr [rax], al +;; 65: 0000 add byte ptr [rax], al +;; 67: 00cd add ch, cl +;; 69: cc int3 diff --git a/winch/filetests/filetests/x64/f32_lt/params.wat b/winch/filetests/filetests/x64/f32_lt/params.wat index 32de598fec29..3498a64e1526 100644 --- a/winch/filetests/filetests/x64/f32_lt/params.wat +++ b/winch/filetests/filetests/x64/f32_lt/params.wat @@ -7,17 +7,22 @@ (f32.lt) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; e: f30f114c2408 movss dword ptr [rsp + 8], xmm1 -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: f30f10442408 movss xmm0, dword ptr [rsp + 8] -;; 1e: f30f104c240c movss xmm1, dword ptr [rsp + 0xc] -;; 24: 0f2ec1 ucomiss xmm0, xmm1 -;; 27: b800000000 mov eax, 0 -;; 2c: 400f97c0 seta al -;; 30: 4883c410 add rsp, 0x10 -;; 34: 5d pop rbp -;; 35: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872e000000 ja 0x46 +;; 18: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; f30f114c2408 movss dword ptr [rsp + 8], xmm1 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f10442408 movss xmm0, dword ptr [rsp + 8] +;; f30f104c240c movss xmm1, dword ptr [rsp + 0xc] +;; 0f2ec1 ucomiss xmm0, xmm1 +;; b800000000 mov eax, 0 +;; 400f97c0 seta al +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 46: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_max/const.wat b/winch/filetests/filetests/x64/f32_max/const.wat index 27116057f724..b1c37121afa5 100644 --- a/winch/filetests/filetests/x64/f32_max/const.wat +++ b/winch/filetests/filetests/x64/f32_max/const.wat @@ -7,29 +7,33 @@ (f32.max) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f30f10053c000000 movss xmm0, dword ptr [rip + 0x3c] -;; 14: f30f100d3c000000 movss xmm1, dword ptr [rip + 0x3c] -;; 1c: 0f2ec8 ucomiss xmm1, xmm0 -;; 1f: 0f8518000000 jne 0x3d -;; 25: 0f8a08000000 jp 0x33 -;; 2b: 0f54c8 andps xmm1, xmm0 -;; 2e: e90e000000 jmp 0x41 -;; 33: f30f58c8 addss xmm1, xmm0 -;; 37: 0f8a04000000 jp 0x41 -;; 3d: f30f5fc8 maxss xmm1, xmm0 -;; 41: 0f28c1 movaps xmm0, xmm1 -;; 44: 4883c408 add rsp, 8 -;; 48: 5d pop rbp -;; 49: c3 ret -;; 4a: 0000 add byte ptr [rax], al -;; 4c: 0000 add byte ptr [rax], al -;; 4e: 0000 add byte ptr [rax], al -;; 50: cdcc int 0xcc -;; 52: 0c40 or al, 0x40 -;; 54: 0000 add byte ptr [rax], al -;; 56: 0000 add byte ptr [rax], al -;; 58: cdcc int 0xcc +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8742000000 ja 0x5a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f30f10053c000000 movss xmm0, dword ptr [rip + 0x3c] +;; f30f100d3c000000 movss xmm1, dword ptr [rip + 0x3c] +;; 0f2ec8 ucomiss xmm1, xmm0 +;; 0f8518000000 jne 0x4d +;; 0f8a08000000 jp 0x43 +;; 3b: 0f54c8 andps xmm1, xmm0 +;; e90e000000 jmp 0x51 +;; 43: f30f58c8 addss xmm1, xmm0 +;; 0f8a04000000 jp 0x51 +;; 4d: f30f5fc8 maxss xmm1, xmm0 +;; 0f28c1 movaps xmm0, xmm1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 5a: 0f0b ud2 +;; 5c: 0000 add byte ptr [rax], al +;; 5e: 0000 add byte ptr [rax], al +;; 60: cdcc int 0xcc +;; 62: 0c40 or al, 0x40 +;; 64: 0000 add byte ptr [rax], al +;; 66: 0000 add byte ptr [rax], al +;; 68: cdcc int 0xcc diff --git a/winch/filetests/filetests/x64/f32_max/locals.wat b/winch/filetests/filetests/x64/f32_max/locals.wat index f47fdc2accb6..668981d68d00 100644 --- a/winch/filetests/filetests/x64/f32_max/locals.wat +++ b/winch/filetests/filetests/x64/f32_max/locals.wat @@ -16,31 +16,35 @@ f32.max ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8763000000 ja 0x7b +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: f30f100553000000 movss xmm0, dword ptr [rip + 0x53] -;; 1d: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; 23: f30f10054d000000 movss xmm0, dword ptr [rip + 0x4d] -;; 2b: f30f11442408 movss dword ptr [rsp + 8], xmm0 -;; 31: f30f10442408 movss xmm0, dword ptr [rsp + 8] -;; 37: f30f104c240c movss xmm1, dword ptr [rsp + 0xc] -;; 3d: 0f2ec8 ucomiss xmm1, xmm0 -;; 40: 0f8518000000 jne 0x5e -;; 46: 0f8a08000000 jp 0x54 -;; 4c: 0f54c8 andps xmm1, xmm0 -;; 4f: e90e000000 jmp 0x62 -;; 54: f30f58c8 addss xmm1, xmm0 -;; 58: 0f8a04000000 jp 0x62 -;; 5e: f30f5fc8 maxss xmm1, xmm0 -;; 62: 0f28c1 movaps xmm0, xmm1 -;; 65: 4883c410 add rsp, 0x10 -;; 69: 5d pop rbp -;; 6a: c3 ret -;; 6b: 0000 add byte ptr [rax], al -;; 6d: 0000 add byte ptr [rax], al -;; 6f: 00cd add ch, cl -;; 71: cc int3 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f100553000000 movss xmm0, dword ptr [rip + 0x53] +;; f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; f30f10054d000000 movss xmm0, dword ptr [rip + 0x4d] +;; f30f11442408 movss dword ptr [rsp + 8], xmm0 +;; f30f10442408 movss xmm0, dword ptr [rsp + 8] +;; f30f104c240c movss xmm1, dword ptr [rsp + 0xc] +;; 0f2ec8 ucomiss xmm1, xmm0 +;; 0f8518000000 jne 0x6e +;; 0f8a08000000 jp 0x64 +;; 5c: 0f54c8 andps xmm1, xmm0 +;; e90e000000 jmp 0x72 +;; 64: f30f58c8 addss xmm1, xmm0 +;; 0f8a04000000 jp 0x72 +;; 6e: f30f5fc8 maxss xmm1, xmm0 +;; 0f28c1 movaps xmm0, xmm1 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 7b: 0f0b ud2 +;; 7d: 0000 add byte ptr [rax], al +;; 7f: 00cd add ch, cl +;; 81: cc int3 diff --git a/winch/filetests/filetests/x64/f32_max/params.wat b/winch/filetests/filetests/x64/f32_max/params.wat index 9c77973705df..1c17ef3cb9da 100644 --- a/winch/filetests/filetests/x64/f32_max/params.wat +++ b/winch/filetests/filetests/x64/f32_max/params.wat @@ -7,23 +7,28 @@ (f32.max) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; e: f30f114c2408 movss dword ptr [rsp + 8], xmm1 -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: f30f10442408 movss xmm0, dword ptr [rsp + 8] -;; 1e: f30f104c240c movss xmm1, dword ptr [rsp + 0xc] -;; 24: 0f2ec8 ucomiss xmm1, xmm0 -;; 27: 0f8518000000 jne 0x45 -;; 2d: 0f8a08000000 jp 0x3b -;; 33: 0f54c8 andps xmm1, xmm0 -;; 36: e90e000000 jmp 0x49 -;; 3b: f30f58c8 addss xmm1, xmm0 -;; 3f: 0f8a04000000 jp 0x49 -;; 45: f30f5fc8 maxss xmm1, xmm0 -;; 49: 0f28c1 movaps xmm0, xmm1 -;; 4c: 4883c410 add rsp, 0x10 -;; 50: 5d pop rbp -;; 51: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f874a000000 ja 0x62 +;; 18: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; f30f114c2408 movss dword ptr [rsp + 8], xmm1 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f10442408 movss xmm0, dword ptr [rsp + 8] +;; f30f104c240c movss xmm1, dword ptr [rsp + 0xc] +;; 0f2ec8 ucomiss xmm1, xmm0 +;; 0f8518000000 jne 0x55 +;; 0f8a08000000 jp 0x4b +;; 43: 0f54c8 andps xmm1, xmm0 +;; e90e000000 jmp 0x59 +;; 4b: f30f58c8 addss xmm1, xmm0 +;; 0f8a04000000 jp 0x59 +;; 55: f30f5fc8 maxss xmm1, xmm0 +;; 0f28c1 movaps xmm0, xmm1 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 62: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_min/const.wat b/winch/filetests/filetests/x64/f32_min/const.wat index 59c8a94fb887..7b193ed52969 100644 --- a/winch/filetests/filetests/x64/f32_min/const.wat +++ b/winch/filetests/filetests/x64/f32_min/const.wat @@ -7,29 +7,33 @@ (f32.min) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f30f10053c000000 movss xmm0, dword ptr [rip + 0x3c] -;; 14: f30f100d3c000000 movss xmm1, dword ptr [rip + 0x3c] -;; 1c: 0f2ec8 ucomiss xmm1, xmm0 -;; 1f: 0f8518000000 jne 0x3d -;; 25: 0f8a08000000 jp 0x33 -;; 2b: 0f56c8 orps xmm1, xmm0 -;; 2e: e90e000000 jmp 0x41 -;; 33: f30f58c8 addss xmm1, xmm0 -;; 37: 0f8a04000000 jp 0x41 -;; 3d: f30f5dc8 minss xmm1, xmm0 -;; 41: 0f28c1 movaps xmm0, xmm1 -;; 44: 4883c408 add rsp, 8 -;; 48: 5d pop rbp -;; 49: c3 ret -;; 4a: 0000 add byte ptr [rax], al -;; 4c: 0000 add byte ptr [rax], al -;; 4e: 0000 add byte ptr [rax], al -;; 50: cdcc int 0xcc -;; 52: 0c40 or al, 0x40 -;; 54: 0000 add byte ptr [rax], al -;; 56: 0000 add byte ptr [rax], al -;; 58: cdcc int 0xcc +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8742000000 ja 0x5a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f30f10053c000000 movss xmm0, dword ptr [rip + 0x3c] +;; f30f100d3c000000 movss xmm1, dword ptr [rip + 0x3c] +;; 0f2ec8 ucomiss xmm1, xmm0 +;; 0f8518000000 jne 0x4d +;; 0f8a08000000 jp 0x43 +;; 3b: 0f56c8 orps xmm1, xmm0 +;; e90e000000 jmp 0x51 +;; 43: f30f58c8 addss xmm1, xmm0 +;; 0f8a04000000 jp 0x51 +;; 4d: f30f5dc8 minss xmm1, xmm0 +;; 0f28c1 movaps xmm0, xmm1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 5a: 0f0b ud2 +;; 5c: 0000 add byte ptr [rax], al +;; 5e: 0000 add byte ptr [rax], al +;; 60: cdcc int 0xcc +;; 62: 0c40 or al, 0x40 +;; 64: 0000 add byte ptr [rax], al +;; 66: 0000 add byte ptr [rax], al +;; 68: cdcc int 0xcc diff --git a/winch/filetests/filetests/x64/f32_min/locals.wat b/winch/filetests/filetests/x64/f32_min/locals.wat index bd591c201e4b..e7807bbb1d01 100644 --- a/winch/filetests/filetests/x64/f32_min/locals.wat +++ b/winch/filetests/filetests/x64/f32_min/locals.wat @@ -16,31 +16,35 @@ f32.min ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8763000000 ja 0x7b +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: f30f100553000000 movss xmm0, dword ptr [rip + 0x53] -;; 1d: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; 23: f30f10054d000000 movss xmm0, dword ptr [rip + 0x4d] -;; 2b: f30f11442408 movss dword ptr [rsp + 8], xmm0 -;; 31: f30f10442408 movss xmm0, dword ptr [rsp + 8] -;; 37: f30f104c240c movss xmm1, dword ptr [rsp + 0xc] -;; 3d: 0f2ec8 ucomiss xmm1, xmm0 -;; 40: 0f8518000000 jne 0x5e -;; 46: 0f8a08000000 jp 0x54 -;; 4c: 0f56c8 orps xmm1, xmm0 -;; 4f: e90e000000 jmp 0x62 -;; 54: f30f58c8 addss xmm1, xmm0 -;; 58: 0f8a04000000 jp 0x62 -;; 5e: f30f5dc8 minss xmm1, xmm0 -;; 62: 0f28c1 movaps xmm0, xmm1 -;; 65: 4883c410 add rsp, 0x10 -;; 69: 5d pop rbp -;; 6a: c3 ret -;; 6b: 0000 add byte ptr [rax], al -;; 6d: 0000 add byte ptr [rax], al -;; 6f: 00cd add ch, cl -;; 71: cc int3 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f100553000000 movss xmm0, dword ptr [rip + 0x53] +;; f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; f30f10054d000000 movss xmm0, dword ptr [rip + 0x4d] +;; f30f11442408 movss dword ptr [rsp + 8], xmm0 +;; f30f10442408 movss xmm0, dword ptr [rsp + 8] +;; f30f104c240c movss xmm1, dword ptr [rsp + 0xc] +;; 0f2ec8 ucomiss xmm1, xmm0 +;; 0f8518000000 jne 0x6e +;; 0f8a08000000 jp 0x64 +;; 5c: 0f56c8 orps xmm1, xmm0 +;; e90e000000 jmp 0x72 +;; 64: f30f58c8 addss xmm1, xmm0 +;; 0f8a04000000 jp 0x72 +;; 6e: f30f5dc8 minss xmm1, xmm0 +;; 0f28c1 movaps xmm0, xmm1 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 7b: 0f0b ud2 +;; 7d: 0000 add byte ptr [rax], al +;; 7f: 00cd add ch, cl +;; 81: cc int3 diff --git a/winch/filetests/filetests/x64/f32_min/params.wat b/winch/filetests/filetests/x64/f32_min/params.wat index 3ee32384ebad..ac448da89240 100644 --- a/winch/filetests/filetests/x64/f32_min/params.wat +++ b/winch/filetests/filetests/x64/f32_min/params.wat @@ -7,23 +7,28 @@ (f32.min) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; e: f30f114c2408 movss dword ptr [rsp + 8], xmm1 -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: f30f10442408 movss xmm0, dword ptr [rsp + 8] -;; 1e: f30f104c240c movss xmm1, dword ptr [rsp + 0xc] -;; 24: 0f2ec8 ucomiss xmm1, xmm0 -;; 27: 0f8518000000 jne 0x45 -;; 2d: 0f8a08000000 jp 0x3b -;; 33: 0f56c8 orps xmm1, xmm0 -;; 36: e90e000000 jmp 0x49 -;; 3b: f30f58c8 addss xmm1, xmm0 -;; 3f: 0f8a04000000 jp 0x49 -;; 45: f30f5dc8 minss xmm1, xmm0 -;; 49: 0f28c1 movaps xmm0, xmm1 -;; 4c: 4883c410 add rsp, 0x10 -;; 50: 5d pop rbp -;; 51: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f874a000000 ja 0x62 +;; 18: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; f30f114c2408 movss dword ptr [rsp + 8], xmm1 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f10442408 movss xmm0, dword ptr [rsp + 8] +;; f30f104c240c movss xmm1, dword ptr [rsp + 0xc] +;; 0f2ec8 ucomiss xmm1, xmm0 +;; 0f8518000000 jne 0x55 +;; 0f8a08000000 jp 0x4b +;; 43: 0f56c8 orps xmm1, xmm0 +;; e90e000000 jmp 0x59 +;; 4b: f30f58c8 addss xmm1, xmm0 +;; 0f8a04000000 jp 0x59 +;; 55: f30f5dc8 minss xmm1, xmm0 +;; 0f28c1 movaps xmm0, xmm1 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 62: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_mul/const.wat b/winch/filetests/filetests/x64/f32_mul/const.wat index 090264bb08ad..e205c61588fa 100644 --- a/winch/filetests/filetests/x64/f32_mul/const.wat +++ b/winch/filetests/filetests/x64/f32_mul/const.wat @@ -7,23 +7,27 @@ (f32.mul) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f30f10051c000000 movss xmm0, dword ptr [rip + 0x1c] -;; 14: f30f100d1c000000 movss xmm1, dword ptr [rip + 0x1c] -;; 1c: f30f59c8 mulss xmm1, xmm0 -;; 20: 0f28c1 movaps xmm0, xmm1 -;; 23: 4883c408 add rsp, 8 -;; 27: 5d pop rbp -;; 28: c3 ret -;; 29: 0000 add byte ptr [rax], al -;; 2b: 0000 add byte ptr [rax], al -;; 2d: 0000 add byte ptr [rax], al -;; 2f: 00cd add ch, cl -;; 31: cc int3 -;; 32: 0c40 or al, 0x40 -;; 34: 0000 add byte ptr [rax], al -;; 36: 0000 add byte ptr [rax], al -;; 38: cdcc int 0xcc +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8721000000 ja 0x39 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f30f10051c000000 movss xmm0, dword ptr [rip + 0x1c] +;; f30f100d1c000000 movss xmm1, dword ptr [rip + 0x1c] +;; f30f59c8 mulss xmm1, xmm0 +;; 0f28c1 movaps xmm0, xmm1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 39: 0f0b ud2 +;; 3b: 0000 add byte ptr [rax], al +;; 3d: 0000 add byte ptr [rax], al +;; 3f: 00cd add ch, cl +;; 41: cc int3 +;; 42: 0c40 or al, 0x40 +;; 44: 0000 add byte ptr [rax], al +;; 46: 0000 add byte ptr [rax], al +;; 48: cdcc int 0xcc diff --git a/winch/filetests/filetests/x64/f32_mul/locals.wat b/winch/filetests/filetests/x64/f32_mul/locals.wat index 30fe20f868e5..544540619ac7 100644 --- a/winch/filetests/filetests/x64/f32_mul/locals.wat +++ b/winch/filetests/filetests/x64/f32_mul/locals.wat @@ -16,24 +16,28 @@ f32.mul ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8742000000 ja 0x5a +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: f30f100533000000 movss xmm0, dword ptr [rip + 0x33] -;; 1d: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; 23: f30f10052d000000 movss xmm0, dword ptr [rip + 0x2d] -;; 2b: f30f11442408 movss dword ptr [rsp + 8], xmm0 -;; 31: f30f10442408 movss xmm0, dword ptr [rsp + 8] -;; 37: f30f104c240c movss xmm1, dword ptr [rsp + 0xc] -;; 3d: f30f59c8 mulss xmm1, xmm0 -;; 41: 0f28c1 movaps xmm0, xmm1 -;; 44: 4883c410 add rsp, 0x10 -;; 48: 5d pop rbp -;; 49: c3 ret -;; 4a: 0000 add byte ptr [rax], al -;; 4c: 0000 add byte ptr [rax], al -;; 4e: 0000 add byte ptr [rax], al -;; 50: cdcc int 0xcc +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f100533000000 movss xmm0, dword ptr [rip + 0x33] +;; f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; f30f10052d000000 movss xmm0, dword ptr [rip + 0x2d] +;; f30f11442408 movss dword ptr [rsp + 8], xmm0 +;; f30f10442408 movss xmm0, dword ptr [rsp + 8] +;; f30f104c240c movss xmm1, dword ptr [rsp + 0xc] +;; f30f59c8 mulss xmm1, xmm0 +;; 0f28c1 movaps xmm0, xmm1 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 5a: 0f0b ud2 +;; 5c: 0000 add byte ptr [rax], al +;; 5e: 0000 add byte ptr [rax], al +;; 60: cdcc int 0xcc diff --git a/winch/filetests/filetests/x64/f32_mul/params.wat b/winch/filetests/filetests/x64/f32_mul/params.wat index 4fb433c6e2f8..a778e077c849 100644 --- a/winch/filetests/filetests/x64/f32_mul/params.wat +++ b/winch/filetests/filetests/x64/f32_mul/params.wat @@ -7,16 +7,21 @@ (f32.mul) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; e: f30f114c2408 movss dword ptr [rsp + 8], xmm1 -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: f30f10442408 movss xmm0, dword ptr [rsp + 8] -;; 1e: f30f104c240c movss xmm1, dword ptr [rsp + 0xc] -;; 24: f30f59c8 mulss xmm1, xmm0 -;; 28: 0f28c1 movaps xmm0, xmm1 -;; 2b: 4883c410 add rsp, 0x10 -;; 2f: 5d pop rbp -;; 30: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8729000000 ja 0x41 +;; 18: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; f30f114c2408 movss dword ptr [rsp + 8], xmm1 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f10442408 movss xmm0, dword ptr [rsp + 8] +;; f30f104c240c movss xmm1, dword ptr [rsp + 0xc] +;; f30f59c8 mulss xmm1, xmm0 +;; 0f28c1 movaps xmm0, xmm1 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 41: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_ne/const.wat b/winch/filetests/filetests/x64/f32_ne/const.wat index dfd4e0de9938..3f6342e85c96 100644 --- a/winch/filetests/filetests/x64/f32_ne/const.wat +++ b/winch/filetests/filetests/x64/f32_ne/const.wat @@ -7,26 +7,30 @@ (f32.ne) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f30f10052c000000 movss xmm0, dword ptr [rip + 0x2c] -;; 14: f30f100d2c000000 movss xmm1, dword ptr [rip + 0x2c] -;; 1c: 0f2ec8 ucomiss xmm1, xmm0 -;; 1f: b800000000 mov eax, 0 -;; 24: 400f95c0 setne al -;; 28: 41bb00000000 mov r11d, 0 -;; 2e: 410f9ac3 setp r11b -;; 32: 4409d8 or eax, r11d -;; 35: 4883c408 add rsp, 8 -;; 39: 5d pop rbp -;; 3a: c3 ret -;; 3b: 0000 add byte ptr [rax], al -;; 3d: 0000 add byte ptr [rax], al -;; 3f: 00cd add ch, cl -;; 41: cc int3 -;; 42: 0c40 or al, 0x40 -;; 44: 0000 add byte ptr [rax], al -;; 46: 0000 add byte ptr [rax], al -;; 48: cdcc int 0xcc +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8733000000 ja 0x4b +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f30f10052c000000 movss xmm0, dword ptr [rip + 0x2c] +;; f30f100d2c000000 movss xmm1, dword ptr [rip + 0x2c] +;; 0f2ec8 ucomiss xmm1, xmm0 +;; b800000000 mov eax, 0 +;; 400f95c0 setne al +;; 41bb00000000 mov r11d, 0 +;; 410f9ac3 setp r11b +;; 4409d8 or eax, r11d +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 4b: 0f0b ud2 +;; 4d: 0000 add byte ptr [rax], al +;; 4f: 00cd add ch, cl +;; 51: cc int3 +;; 52: 0c40 or al, 0x40 +;; 54: 0000 add byte ptr [rax], al +;; 56: 0000 add byte ptr [rax], al +;; 58: cdcc int 0xcc diff --git a/winch/filetests/filetests/x64/f32_ne/locals.wat b/winch/filetests/filetests/x64/f32_ne/locals.wat index e27972cdfbd3..c658f9704e0b 100644 --- a/winch/filetests/filetests/x64/f32_ne/locals.wat +++ b/winch/filetests/filetests/x64/f32_ne/locals.wat @@ -16,27 +16,31 @@ f32.ne ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8754000000 ja 0x6c +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: f30f100543000000 movss xmm0, dword ptr [rip + 0x43] -;; 1d: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; 23: f30f10053d000000 movss xmm0, dword ptr [rip + 0x3d] -;; 2b: f30f11442408 movss dword ptr [rsp + 8], xmm0 -;; 31: f30f10442408 movss xmm0, dword ptr [rsp + 8] -;; 37: f30f104c240c movss xmm1, dword ptr [rsp + 0xc] -;; 3d: 0f2ec8 ucomiss xmm1, xmm0 -;; 40: b800000000 mov eax, 0 -;; 45: 400f95c0 setne al -;; 49: 41bb00000000 mov r11d, 0 -;; 4f: 410f9ac3 setp r11b -;; 53: 4409d8 or eax, r11d -;; 56: 4883c410 add rsp, 0x10 -;; 5a: 5d pop rbp -;; 5b: c3 ret -;; 5c: 0000 add byte ptr [rax], al -;; 5e: 0000 add byte ptr [rax], al -;; 60: cdcc int 0xcc +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f100543000000 movss xmm0, dword ptr [rip + 0x43] +;; f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; f30f10053d000000 movss xmm0, dword ptr [rip + 0x3d] +;; f30f11442408 movss dword ptr [rsp + 8], xmm0 +;; f30f10442408 movss xmm0, dword ptr [rsp + 8] +;; f30f104c240c movss xmm1, dword ptr [rsp + 0xc] +;; 0f2ec8 ucomiss xmm1, xmm0 +;; b800000000 mov eax, 0 +;; 400f95c0 setne al +;; 41bb00000000 mov r11d, 0 +;; 410f9ac3 setp r11b +;; 4409d8 or eax, r11d +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 6c: 0f0b ud2 +;; 6e: 0000 add byte ptr [rax], al +;; 70: cdcc int 0xcc diff --git a/winch/filetests/filetests/x64/f32_ne/params.wat b/winch/filetests/filetests/x64/f32_ne/params.wat index c8d17316dab9..cf9ed1dd2015 100644 --- a/winch/filetests/filetests/x64/f32_ne/params.wat +++ b/winch/filetests/filetests/x64/f32_ne/params.wat @@ -7,20 +7,25 @@ (f32.ne) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; e: f30f114c2408 movss dword ptr [rsp + 8], xmm1 -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: f30f10442408 movss xmm0, dword ptr [rsp + 8] -;; 1e: f30f104c240c movss xmm1, dword ptr [rsp + 0xc] -;; 24: 0f2ec8 ucomiss xmm1, xmm0 -;; 27: b800000000 mov eax, 0 -;; 2c: 400f95c0 setne al -;; 30: 41bb00000000 mov r11d, 0 -;; 36: 410f9ac3 setp r11b -;; 3a: 4409d8 or eax, r11d -;; 3d: 4883c410 add rsp, 0x10 -;; 41: 5d pop rbp -;; 42: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f873b000000 ja 0x53 +;; 18: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; f30f114c2408 movss dword ptr [rsp + 8], xmm1 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f10442408 movss xmm0, dword ptr [rsp + 8] +;; f30f104c240c movss xmm1, dword ptr [rsp + 0xc] +;; 0f2ec8 ucomiss xmm1, xmm0 +;; b800000000 mov eax, 0 +;; 400f95c0 setne al +;; 41bb00000000 mov r11d, 0 +;; 410f9ac3 setp r11b +;; 4409d8 or eax, r11d +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 53: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_nearest/f32_floor_const_sse41.wat b/winch/filetests/filetests/x64/f32_nearest/f32_floor_const_sse41.wat index 45b51bb08c42..62107b8b6d07 100644 --- a/winch/filetests/filetests/x64/f32_nearest/f32_floor_const_sse41.wat +++ b/winch/filetests/filetests/x64/f32_nearest/f32_floor_const_sse41.wat @@ -7,15 +7,23 @@ (f32.nearest) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f30f10050c000000 movss xmm0, dword ptr [rip + 0xc] -;; 14: 660f3a0ac000 roundss xmm0, xmm0, 0 -;; 1a: 4883c408 add rsp, 8 -;; 1e: 5d pop rbp -;; 1f: c3 ret -;; 20: c3 ret -;; 21: f5 cmc -;; 22: a8bf test al, 0xbf +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8718000000 ja 0x30 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f30f100514000000 movss xmm0, dword ptr [rip + 0x14] +;; 660f3a0ac000 roundss xmm0, xmm0, 0 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 30: 0f0b ud2 +;; 32: 0000 add byte ptr [rax], al +;; 34: 0000 add byte ptr [rax], al +;; 36: 0000 add byte ptr [rax], al +;; 38: c3 ret +;; 39: f5 cmc +;; 3a: a8bf test al, 0xbf diff --git a/winch/filetests/filetests/x64/f32_nearest/f32_floor_param_sse41.wat b/winch/filetests/filetests/x64/f32_nearest/f32_floor_param_sse41.wat index ecee244adebc..c043b7604cc2 100644 --- a/winch/filetests/filetests/x64/f32_nearest/f32_floor_param_sse41.wat +++ b/winch/filetests/filetests/x64/f32_nearest/f32_floor_param_sse41.wat @@ -7,13 +7,18 @@ (f32.nearest) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; e: 4c893424 mov qword ptr [rsp], r14 -;; 12: f30f1044240c movss xmm0, dword ptr [rsp + 0xc] -;; 18: 660f3a0ac000 roundss xmm0, xmm0, 0 -;; 1e: 4883c410 add rsp, 0x10 -;; 22: 5d pop rbp -;; 23: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871c000000 ja 0x34 +;; 18: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f1044240c movss xmm0, dword ptr [rsp + 0xc] +;; 660f3a0ac000 roundss xmm0, xmm0, 0 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 34: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_nearest/f32_nearest_param.wat b/winch/filetests/filetests/x64/f32_nearest/f32_nearest_param.wat index b34f8fc2c2a9..ab3f2c39e025 100644 --- a/winch/filetests/filetests/x64/f32_nearest/f32_nearest_param.wat +++ b/winch/filetests/filetests/x64/f32_nearest/f32_nearest_param.wat @@ -6,13 +6,24 @@ (f32.nearest) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; e: 4c893424 mov qword ptr [rsp], r14 -;; 12: f30f1044240c movss xmm0, dword ptr [rsp + 0xc] -;; 18: e800000000 call 0x1d -;; 1d: 4883c410 add rsp, 0x10 -;; 21: 5d pop rbp -;; 22: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8738000000 ja 0x50 +;; 18: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f3440f107c240c movss xmm15, dword ptr [rsp + 0xc] +;; 4883ec04 sub rsp, 4 +;; f3440f113c24 movss dword ptr [rsp], xmm15 +;; 4883ec0c sub rsp, 0xc +;; f30f1044240c movss xmm0, dword ptr [rsp + 0xc] +;; e800000000 call 0x42 +;; 4883c40c add rsp, 0xc +;; 4883c404 add rsp, 4 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 50: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_neg/f32_neg_const.wat b/winch/filetests/filetests/x64/f32_neg/f32_neg_const.wat index 07d16db3a524..c711838a7a6f 100644 --- a/winch/filetests/filetests/x64/f32_neg/f32_neg_const.wat +++ b/winch/filetests/filetests/x64/f32_neg/f32_neg_const.wat @@ -6,20 +6,24 @@ (f32.neg) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f30f10051c000000 movss xmm0, dword ptr [rip + 0x1c] -;; 14: 41bb00000080 mov r11d, 0x80000000 -;; 1a: 66450f6efb movd xmm15, r11d -;; 1f: 410f57c7 xorps xmm0, xmm15 -;; 23: 4883c408 add rsp, 8 -;; 27: 5d pop rbp -;; 28: c3 ret -;; 29: 0000 add byte ptr [rax], al -;; 2b: 0000 add byte ptr [rax], al -;; 2d: 0000 add byte ptr [rax], al -;; 2f: 00c3 add bl, al -;; 31: f5 cmc -;; 32: a8bf test al, 0xbf +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8721000000 ja 0x39 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f30f10051c000000 movss xmm0, dword ptr [rip + 0x1c] +;; 41bb00000080 mov r11d, 0x80000000 +;; 66450f6efb movd xmm15, r11d +;; 410f57c7 xorps xmm0, xmm15 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 39: 0f0b ud2 +;; 3b: 0000 add byte ptr [rax], al +;; 3d: 0000 add byte ptr [rax], al +;; 3f: 00c3 add bl, al +;; 41: f5 cmc +;; 42: a8bf test al, 0xbf diff --git a/winch/filetests/filetests/x64/f32_neg/f32_neg_param.wat b/winch/filetests/filetests/x64/f32_neg/f32_neg_param.wat index 0e76b479cf3a..dd0d48677114 100644 --- a/winch/filetests/filetests/x64/f32_neg/f32_neg_param.wat +++ b/winch/filetests/filetests/x64/f32_neg/f32_neg_param.wat @@ -6,15 +6,20 @@ (f32.neg) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; e: 4c893424 mov qword ptr [rsp], r14 -;; 12: f30f1044240c movss xmm0, dword ptr [rsp + 0xc] -;; 18: 41bb00000080 mov r11d, 0x80000000 -;; 1e: 66450f6efb movd xmm15, r11d -;; 23: 410f57c7 xorps xmm0, xmm15 -;; 27: 4883c410 add rsp, 0x10 -;; 2b: 5d pop rbp -;; 2c: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8725000000 ja 0x3d +;; 18: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f1044240c movss xmm0, dword ptr [rsp + 0xc] +;; 41bb00000080 mov r11d, 0x80000000 +;; 66450f6efb movd xmm15, r11d +;; 410f57c7 xorps xmm0, xmm15 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 3d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_reinterpret_i32/const.wat b/winch/filetests/filetests/x64/f32_reinterpret_i32/const.wat new file mode 100644 index 000000000000..63d7c0ccdda1 --- /dev/null +++ b/winch/filetests/filetests/x64/f32_reinterpret_i32/const.wat @@ -0,0 +1,22 @@ +;;! target = "x86_64" + +(module + (func (result f32) + (i32.const 1) + (f32.reinterpret_i32) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8713000000 ja 0x2b +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 660f6ec0 movd xmm0, eax +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2b: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_reinterpret_i32/locals.wat b/winch/filetests/filetests/x64/f32_reinterpret_i32/locals.wat new file mode 100644 index 000000000000..4cc5f7dcb5c2 --- /dev/null +++ b/winch/filetests/filetests/x64/f32_reinterpret_i32/locals.wat @@ -0,0 +1,26 @@ +;;! target = "x86_64" + +(module + (func (result f32) + (local i32) + + (local.get 0) + (f32.reinterpret_i32) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871b000000 ja 0x33 +;; 18: 48c744240800000000 +;; mov qword ptr [rsp + 8], 0 +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 660f6ec0 movd xmm0, eax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 33: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_reinterpret_i32/params.wat b/winch/filetests/filetests/x64/f32_reinterpret_i32/params.wat new file mode 100644 index 000000000000..a15f8810bc9c --- /dev/null +++ b/winch/filetests/filetests/x64/f32_reinterpret_i32/params.wat @@ -0,0 +1,23 @@ +;;! target = "x86_64" + +(module + (func (param i32) (result f32) + (local.get 0) + (f32.reinterpret_i32) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8716000000 ja 0x2e +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 660f6ec0 movd xmm0, eax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 2e: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_reinterpret_i32/ret_int.wat b/winch/filetests/filetests/x64/f32_reinterpret_i32/ret_int.wat new file mode 100644 index 000000000000..e3c47703c3f6 --- /dev/null +++ b/winch/filetests/filetests/x64/f32_reinterpret_i32/ret_int.wat @@ -0,0 +1,25 @@ +;;! target = "x86_64" + +(module + (func (result i32) + i32.const 1 + f32.reinterpret_i32 + drop + i32.const 1 + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8718000000 ja 0x30 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 660f6ec0 movd xmm0, eax +;; b801000000 mov eax, 1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 30: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_reinterpret_i32/spilled.wat b/winch/filetests/filetests/x64/f32_reinterpret_i32/spilled.wat new file mode 100644 index 000000000000..f037a5bab749 --- /dev/null +++ b/winch/filetests/filetests/x64/f32_reinterpret_i32/spilled.wat @@ -0,0 +1,28 @@ +;;! target = "x86_64" + +(module + (func (result f32) + i32.const 1 + f32.reinterpret_i32 + block + end + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8725000000 ja 0x3d +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 660f6ec0 movd xmm0, eax +;; 4883ec04 sub rsp, 4 +;; f30f110424 movss dword ptr [rsp], xmm0 +;; f30f100424 movss xmm0, dword ptr [rsp] +;; 4883c404 add rsp, 4 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 3d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_sqrt/f32_sqrt_const.wat b/winch/filetests/filetests/x64/f32_sqrt/f32_sqrt_const.wat index 0cc61434bab0..9a96e4a4aff0 100644 --- a/winch/filetests/filetests/x64/f32_sqrt/f32_sqrt_const.wat +++ b/winch/filetests/filetests/x64/f32_sqrt/f32_sqrt_const.wat @@ -6,16 +6,20 @@ (f32.sqrt) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f30f10050c000000 movss xmm0, dword ptr [rip + 0xc] -;; 14: f30f51c0 sqrtss xmm0, xmm0 -;; 18: 4883c408 add rsp, 8 -;; 1c: 5d pop rbp -;; 1d: c3 ret -;; 1e: 0000 add byte ptr [rax], al -;; 20: c3 ret -;; 21: f5 cmc -;; 22: a83f test al, 0x3f +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8716000000 ja 0x2e +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f30f10050c000000 movss xmm0, dword ptr [rip + 0xc] +;; f30f51c0 sqrtss xmm0, xmm0 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2e: 0f0b ud2 +;; 30: c3 ret +;; 31: f5 cmc +;; 32: a83f test al, 0x3f diff --git a/winch/filetests/filetests/x64/f32_sqrt/f32_sqrt_param.wat b/winch/filetests/filetests/x64/f32_sqrt/f32_sqrt_param.wat index 7ca3bdb78e61..84b130bb1fee 100644 --- a/winch/filetests/filetests/x64/f32_sqrt/f32_sqrt_param.wat +++ b/winch/filetests/filetests/x64/f32_sqrt/f32_sqrt_param.wat @@ -6,13 +6,18 @@ (f32.sqrt) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; e: 4c893424 mov qword ptr [rsp], r14 -;; 12: f30f1044240c movss xmm0, dword ptr [rsp + 0xc] -;; 18: f30f51c0 sqrtss xmm0, xmm0 -;; 1c: 4883c410 add rsp, 0x10 -;; 20: 5d pop rbp -;; 21: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871a000000 ja 0x32 +;; 18: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f1044240c movss xmm0, dword ptr [rsp + 0xc] +;; f30f51c0 sqrtss xmm0, xmm0 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 32: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_sub/const.wat b/winch/filetests/filetests/x64/f32_sub/const.wat index 1a5ff8edabbd..3a8e3a04006f 100644 --- a/winch/filetests/filetests/x64/f32_sub/const.wat +++ b/winch/filetests/filetests/x64/f32_sub/const.wat @@ -7,23 +7,27 @@ (f32.sub) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f30f10051c000000 movss xmm0, dword ptr [rip + 0x1c] -;; 14: f30f100d1c000000 movss xmm1, dword ptr [rip + 0x1c] -;; 1c: f30f5cc8 subss xmm1, xmm0 -;; 20: 0f28c1 movaps xmm0, xmm1 -;; 23: 4883c408 add rsp, 8 -;; 27: 5d pop rbp -;; 28: c3 ret -;; 29: 0000 add byte ptr [rax], al -;; 2b: 0000 add byte ptr [rax], al -;; 2d: 0000 add byte ptr [rax], al -;; 2f: 00cd add ch, cl -;; 31: cc int3 -;; 32: 0c40 or al, 0x40 -;; 34: 0000 add byte ptr [rax], al -;; 36: 0000 add byte ptr [rax], al -;; 38: cdcc int 0xcc +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8721000000 ja 0x39 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f30f10051c000000 movss xmm0, dword ptr [rip + 0x1c] +;; f30f100d1c000000 movss xmm1, dword ptr [rip + 0x1c] +;; f30f5cc8 subss xmm1, xmm0 +;; 0f28c1 movaps xmm0, xmm1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 39: 0f0b ud2 +;; 3b: 0000 add byte ptr [rax], al +;; 3d: 0000 add byte ptr [rax], al +;; 3f: 00cd add ch, cl +;; 41: cc int3 +;; 42: 0c40 or al, 0x40 +;; 44: 0000 add byte ptr [rax], al +;; 46: 0000 add byte ptr [rax], al +;; 48: cdcc int 0xcc diff --git a/winch/filetests/filetests/x64/f32_sub/locals.wat b/winch/filetests/filetests/x64/f32_sub/locals.wat index 07ae1d968b58..e6baa0083117 100644 --- a/winch/filetests/filetests/x64/f32_sub/locals.wat +++ b/winch/filetests/filetests/x64/f32_sub/locals.wat @@ -16,24 +16,28 @@ f32.sub ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8742000000 ja 0x5a +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: f30f100533000000 movss xmm0, dword ptr [rip + 0x33] -;; 1d: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; 23: f30f10052d000000 movss xmm0, dword ptr [rip + 0x2d] -;; 2b: f30f11442408 movss dword ptr [rsp + 8], xmm0 -;; 31: f30f10442408 movss xmm0, dword ptr [rsp + 8] -;; 37: f30f104c240c movss xmm1, dword ptr [rsp + 0xc] -;; 3d: f30f5cc8 subss xmm1, xmm0 -;; 41: 0f28c1 movaps xmm0, xmm1 -;; 44: 4883c410 add rsp, 0x10 -;; 48: 5d pop rbp -;; 49: c3 ret -;; 4a: 0000 add byte ptr [rax], al -;; 4c: 0000 add byte ptr [rax], al -;; 4e: 0000 add byte ptr [rax], al -;; 50: cdcc int 0xcc +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f100533000000 movss xmm0, dword ptr [rip + 0x33] +;; f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; f30f10052d000000 movss xmm0, dword ptr [rip + 0x2d] +;; f30f11442408 movss dword ptr [rsp + 8], xmm0 +;; f30f10442408 movss xmm0, dword ptr [rsp + 8] +;; f30f104c240c movss xmm1, dword ptr [rsp + 0xc] +;; f30f5cc8 subss xmm1, xmm0 +;; 0f28c1 movaps xmm0, xmm1 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 5a: 0f0b ud2 +;; 5c: 0000 add byte ptr [rax], al +;; 5e: 0000 add byte ptr [rax], al +;; 60: cdcc int 0xcc diff --git a/winch/filetests/filetests/x64/f32_sub/params.wat b/winch/filetests/filetests/x64/f32_sub/params.wat index 18c77dba3452..7d6f2b7d1fb7 100644 --- a/winch/filetests/filetests/x64/f32_sub/params.wat +++ b/winch/filetests/filetests/x64/f32_sub/params.wat @@ -7,16 +7,21 @@ (f32.sub) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; e: f30f114c2408 movss dword ptr [rsp + 8], xmm1 -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: f30f10442408 movss xmm0, dword ptr [rsp + 8] -;; 1e: f30f104c240c movss xmm1, dword ptr [rsp + 0xc] -;; 24: f30f5cc8 subss xmm1, xmm0 -;; 28: 0f28c1 movaps xmm0, xmm1 -;; 2b: 4883c410 add rsp, 0x10 -;; 2f: 5d pop rbp -;; 30: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8729000000 ja 0x41 +;; 18: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; f30f114c2408 movss dword ptr [rsp + 8], xmm1 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f10442408 movss xmm0, dword ptr [rsp + 8] +;; f30f104c240c movss xmm1, dword ptr [rsp + 0xc] +;; f30f5cc8 subss xmm1, xmm0 +;; 0f28c1 movaps xmm0, xmm1 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 41: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_trunc/f32_trunc_const_sse41.wat b/winch/filetests/filetests/x64/f32_trunc/f32_trunc_const_sse41.wat index 5ce9541f055b..a90d1709029c 100644 --- a/winch/filetests/filetests/x64/f32_trunc/f32_trunc_const_sse41.wat +++ b/winch/filetests/filetests/x64/f32_trunc/f32_trunc_const_sse41.wat @@ -7,15 +7,23 @@ (f32.trunc) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f30f10050c000000 movss xmm0, dword ptr [rip + 0xc] -;; 14: 660f3a0ac003 roundss xmm0, xmm0, 3 -;; 1a: 4883c408 add rsp, 8 -;; 1e: 5d pop rbp -;; 1f: c3 ret -;; 20: c3 ret -;; 21: f5 cmc -;; 22: a8bf test al, 0xbf +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8718000000 ja 0x30 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f30f100514000000 movss xmm0, dword ptr [rip + 0x14] +;; 660f3a0ac003 roundss xmm0, xmm0, 3 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 30: 0f0b ud2 +;; 32: 0000 add byte ptr [rax], al +;; 34: 0000 add byte ptr [rax], al +;; 36: 0000 add byte ptr [rax], al +;; 38: c3 ret +;; 39: f5 cmc +;; 3a: a8bf test al, 0xbf diff --git a/winch/filetests/filetests/x64/f32_trunc/f32_trunc_param.wat b/winch/filetests/filetests/x64/f32_trunc/f32_trunc_param.wat index 91dea4867719..b7a36ae1f2d0 100644 --- a/winch/filetests/filetests/x64/f32_trunc/f32_trunc_param.wat +++ b/winch/filetests/filetests/x64/f32_trunc/f32_trunc_param.wat @@ -6,13 +6,24 @@ (f32.trunc) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; e: 4c893424 mov qword ptr [rsp], r14 -;; 12: f30f1044240c movss xmm0, dword ptr [rsp + 0xc] -;; 18: e800000000 call 0x1d -;; 1d: 4883c410 add rsp, 0x10 -;; 21: 5d pop rbp -;; 22: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8738000000 ja 0x50 +;; 18: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f3440f107c240c movss xmm15, dword ptr [rsp + 0xc] +;; 4883ec04 sub rsp, 4 +;; f3440f113c24 movss dword ptr [rsp], xmm15 +;; 4883ec0c sub rsp, 0xc +;; f30f1044240c movss xmm0, dword ptr [rsp + 0xc] +;; e800000000 call 0x42 +;; 4883c40c add rsp, 0xc +;; 4883c404 add rsp, 4 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 50: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f32_trunc/f32_trunc_param_sse41.wat b/winch/filetests/filetests/x64/f32_trunc/f32_trunc_param_sse41.wat index 81ca6ce0862d..1864e5e122ed 100644 --- a/winch/filetests/filetests/x64/f32_trunc/f32_trunc_param_sse41.wat +++ b/winch/filetests/filetests/x64/f32_trunc/f32_trunc_param_sse41.wat @@ -7,13 +7,18 @@ (f32.trunc) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 -;; e: 4c893424 mov qword ptr [rsp], r14 -;; 12: f30f1044240c movss xmm0, dword ptr [rsp + 0xc] -;; 18: 660f3a0ac003 roundss xmm0, xmm0, 3 -;; 1e: 4883c410 add rsp, 0x10 -;; 22: 5d pop rbp -;; 23: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871c000000 ja 0x34 +;; 18: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f1044240c movss xmm0, dword ptr [rsp + 0xc] +;; 660f3a0ac003 roundss xmm0, xmm0, 3 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 34: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_abs/f64_abs_const.wat b/winch/filetests/filetests/x64/f64_abs/f64_abs_const.wat index 991651614d09..cf4a2bc8a8f9 100644 --- a/winch/filetests/filetests/x64/f64_abs/f64_abs_const.wat +++ b/winch/filetests/filetests/x64/f64_abs/f64_abs_const.wat @@ -6,16 +6,20 @@ (f64.abs) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f20f10051c000000 movsd xmm0, qword ptr [rip + 0x1c] -;; 14: 49bbffffffffffffff7f +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8726000000 ja 0x3e +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f20f10051c000000 movsd xmm0, qword ptr [rip + 0x1c] +;; 49bbffffffffffffff7f ;; movabs r11, 0x7fffffffffffffff -;; 1e: 664d0f6efb movq xmm15, r11 -;; 23: 66410f54c7 andpd xmm0, xmm15 -;; 28: 4883c408 add rsp, 8 -;; 2c: 5d pop rbp -;; 2d: c3 ret -;; 2e: 0000 add byte ptr [rax], al +;; 664d0f6efb movq xmm15, r11 +;; 66410f54c7 andpd xmm0, xmm15 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 3e: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_abs/f64_abs_param.wat b/winch/filetests/filetests/x64/f64_abs/f64_abs_param.wat index 117a045de256..0d44046e58c2 100644 --- a/winch/filetests/filetests/x64/f64_abs/f64_abs_param.wat +++ b/winch/filetests/filetests/x64/f64_abs/f64_abs_param.wat @@ -6,16 +6,21 @@ (f64.abs) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f20f11442408 movsd qword ptr [rsp + 8], xmm0 -;; e: 4c893424 mov qword ptr [rsp], r14 -;; 12: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 18: 49bbffffffffffffff7f +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872a000000 ja 0x42 +;; 18: f20f11442408 movsd qword ptr [rsp + 8], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; 49bbffffffffffffff7f ;; movabs r11, 0x7fffffffffffffff -;; 22: 664d0f6efb movq xmm15, r11 -;; 27: 66410f54c7 andpd xmm0, xmm15 -;; 2c: 4883c410 add rsp, 0x10 -;; 30: 5d pop rbp -;; 31: c3 ret +;; 664d0f6efb movq xmm15, r11 +;; 66410f54c7 andpd xmm0, xmm15 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 42: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_add/const.wat b/winch/filetests/filetests/x64/f64_add/const.wat index 47f8521e7f9d..890abb74a842 100644 --- a/winch/filetests/filetests/x64/f64_add/const.wat +++ b/winch/filetests/filetests/x64/f64_add/const.wat @@ -7,17 +7,21 @@ (f64.add) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f20f10051c000000 movsd xmm0, qword ptr [rip + 0x1c] -;; 14: f20f100d1c000000 movsd xmm1, qword ptr [rip + 0x1c] -;; 1c: f20f58c8 addsd xmm1, xmm0 -;; 20: 660f28c1 movapd xmm0, xmm1 -;; 24: 4883c408 add rsp, 8 -;; 28: 5d pop rbp -;; 29: c3 ret -;; 2a: 0000 add byte ptr [rax], al -;; 2c: 0000 add byte ptr [rax], al -;; 2e: 0000 add byte ptr [rax], al +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8722000000 ja 0x3a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f20f10051c000000 movsd xmm0, qword ptr [rip + 0x1c] +;; f20f100d1c000000 movsd xmm1, qword ptr [rip + 0x1c] +;; f20f58c8 addsd xmm1, xmm0 +;; 660f28c1 movapd xmm0, xmm1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 3a: 0f0b ud2 +;; 3c: 0000 add byte ptr [rax], al +;; 3e: 0000 add byte ptr [rax], al diff --git a/winch/filetests/filetests/x64/f64_add/locals.wat b/winch/filetests/filetests/x64/f64_add/locals.wat index 1ed3cb42fa55..9b122f0b59d3 100644 --- a/winch/filetests/filetests/x64/f64_add/locals.wat +++ b/winch/filetests/filetests/x64/f64_add/locals.wat @@ -16,24 +16,32 @@ f64.add ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 4531db xor r11d, r11d -;; b: 4c895c2410 mov qword ptr [rsp + 0x10], r11 -;; 10: 4c895c2408 mov qword ptr [rsp + 8], r11 -;; 15: 4c893424 mov qword ptr [rsp], r14 -;; 19: f20f10052f000000 movsd xmm0, qword ptr [rip + 0x2f] -;; 21: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 -;; 27: f20f100529000000 movsd xmm0, qword ptr [rip + 0x29] -;; 2f: f20f11442408 movsd qword ptr [rsp + 8], xmm0 -;; 35: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 3b: f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] -;; 41: f20f58c8 addsd xmm1, xmm0 -;; 45: 660f28c1 movapd xmm0, xmm1 -;; 49: 4883c418 add rsp, 0x18 -;; 4d: 5d pop rbp -;; 4e: c3 ret -;; 4f: 009a99999999 add byte ptr [rdx - 0x66666667], bl -;; 55: 99 cdq -;; 56: f1 int1 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8747000000 ja 0x5f +;; 18: 4531db xor r11d, r11d +;; 4c895c2410 mov qword ptr [rsp + 0x10], r11 +;; 4c895c2408 mov qword ptr [rsp + 8], r11 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f100537000000 movsd xmm0, qword ptr [rip + 0x37] +;; f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 +;; f20f100531000000 movsd xmm0, qword ptr [rip + 0x31] +;; f20f11442408 movsd qword ptr [rsp + 8], xmm0 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] +;; f20f58c8 addsd xmm1, xmm0 +;; 660f28c1 movapd xmm0, xmm1 +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 5f: 0f0b ud2 +;; 61: 0000 add byte ptr [rax], al +;; 63: 0000 add byte ptr [rax], al +;; 65: 0000 add byte ptr [rax], al +;; 67: 009a99999999 add byte ptr [rdx - 0x66666667], bl +;; 6d: 99 cdq +;; 6e: f1 int1 diff --git a/winch/filetests/filetests/x64/f64_add/params.wat b/winch/filetests/filetests/x64/f64_add/params.wat index 076a8c0e0eb6..40759232c0c0 100644 --- a/winch/filetests/filetests/x64/f64_add/params.wat +++ b/winch/filetests/filetests/x64/f64_add/params.wat @@ -7,16 +7,21 @@ (f64.add) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 -;; e: f20f114c2408 movsd qword ptr [rsp + 8], xmm1 -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 1e: f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] -;; 24: f20f58c8 addsd xmm1, xmm0 -;; 28: 660f28c1 movapd xmm0, xmm1 -;; 2c: 4883c418 add rsp, 0x18 -;; 30: 5d pop rbp -;; 31: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872a000000 ja 0x42 +;; 18: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 +;; f20f114c2408 movsd qword ptr [rsp + 8], xmm1 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] +;; f20f58c8 addsd xmm1, xmm0 +;; 660f28c1 movapd xmm0, xmm1 +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 42: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_ceil/f64_ceil_const_sse41.wat b/winch/filetests/filetests/x64/f64_ceil/f64_ceil_const_sse41.wat index b6f669c9c8ad..1020eaad73e0 100644 --- a/winch/filetests/filetests/x64/f64_ceil/f64_ceil_const_sse41.wat +++ b/winch/filetests/filetests/x64/f64_ceil/f64_ceil_const_sse41.wat @@ -7,12 +7,20 @@ (f64.ceil) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f20f10050c000000 movsd xmm0, qword ptr [rip + 0xc] -;; 14: 660f3a0bc002 roundsd xmm0, xmm0, 2 -;; 1a: 4883c408 add rsp, 8 -;; 1e: 5d pop rbp -;; 1f: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8718000000 ja 0x30 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f20f100514000000 movsd xmm0, qword ptr [rip + 0x14] +;; 660f3a0bc002 roundsd xmm0, xmm0, 2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 30: 0f0b ud2 +;; 32: 0000 add byte ptr [rax], al +;; 34: 0000 add byte ptr [rax], al +;; 36: 0000 add byte ptr [rax], al diff --git a/winch/filetests/filetests/x64/f64_ceil/f64_ceil_param.wat b/winch/filetests/filetests/x64/f64_ceil/f64_ceil_param.wat index c08fae754a1e..7395b354cfdb 100644 --- a/winch/filetests/filetests/x64/f64_ceil/f64_ceil_param.wat +++ b/winch/filetests/filetests/x64/f64_ceil/f64_ceil_param.wat @@ -6,13 +6,24 @@ (f64.ceil) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f20f11442408 movsd qword ptr [rsp + 8], xmm0 -;; e: 4c893424 mov qword ptr [rsp], r14 -;; 12: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 18: e800000000 call 0x1d -;; 1d: 4883c410 add rsp, 0x10 -;; 21: 5d pop rbp -;; 22: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8738000000 ja 0x50 +;; 18: f20f11442408 movsd qword ptr [rsp + 8], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f2440f107c2408 movsd xmm15, qword ptr [rsp + 8] +;; 4883ec08 sub rsp, 8 +;; f2440f113c24 movsd qword ptr [rsp], xmm15 +;; 4883ec08 sub rsp, 8 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; e800000000 call 0x42 +;; 4883c408 add rsp, 8 +;; 4883c408 add rsp, 8 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 50: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_ceil/f64_ceil_param_sse41.wat b/winch/filetests/filetests/x64/f64_ceil/f64_ceil_param_sse41.wat index 4ff72595c57a..ca8a52bce675 100644 --- a/winch/filetests/filetests/x64/f64_ceil/f64_ceil_param_sse41.wat +++ b/winch/filetests/filetests/x64/f64_ceil/f64_ceil_param_sse41.wat @@ -7,13 +7,18 @@ (f64.ceil) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f20f11442408 movsd qword ptr [rsp + 8], xmm0 -;; e: 4c893424 mov qword ptr [rsp], r14 -;; 12: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 18: 660f3a0bc002 roundsd xmm0, xmm0, 2 -;; 1e: 4883c410 add rsp, 0x10 -;; 22: 5d pop rbp -;; 23: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871c000000 ja 0x34 +;; 18: f20f11442408 movsd qword ptr [rsp + 8], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; 660f3a0bc002 roundsd xmm0, xmm0, 2 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 34: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_const/call_id.wat b/winch/filetests/filetests/x64/f64_const/call_id.wat index 4b5bd51b8280..b13170568b89 100644 --- a/winch/filetests/filetests/x64/f64_const/call_id.wat +++ b/winch/filetests/filetests/x64/f64_const/call_id.wat @@ -4,27 +4,40 @@ (func $id-f64 (param f64) (result f64) (local.get 0)) (func (export "type-first-f64") (result f64) (call $id-f64 (f64.const 1.32))) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f20f11442408 movsd qword ptr [rsp + 8], xmm0 -;; e: 4c893424 mov qword ptr [rsp], r14 -;; 12: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 18: 4883c410 add rsp, 0x10 -;; 1c: 5d pop rbp -;; 1d: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8716000000 ja 0x2e +;; 18: f20f11442408 movsd qword ptr [rsp + 8], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 2e: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883ec08 sub rsp, 8 -;; 10: f20f100510000000 movsd xmm0, qword ptr [rip + 0x10] -;; 18: e800000000 call 0x1d -;; 1d: 4883c408 add rsp, 8 -;; 21: 4883c408 add rsp, 8 -;; 25: 5d pop rbp -;; 26: c3 ret -;; 27: 001f add byte ptr [rdi], bl -;; 29: 85eb test ebx, ebp -;; 2b: 51 push rcx +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871f000000 ja 0x37 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883ec08 sub rsp, 8 +;; f20f100518000000 movsd xmm0, qword ptr [rip + 0x18] +;; e800000000 call 0x2d +;; 4883c408 add rsp, 8 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 37: 0f0b ud2 +;; 39: 0000 add byte ptr [rax], al +;; 3b: 0000 add byte ptr [rax], al +;; 3d: 0000 add byte ptr [rax], al +;; 3f: 001f add byte ptr [rdi], bl +;; 41: 85eb test ebx, ebp +;; 43: 51 push rcx diff --git a/winch/filetests/filetests/x64/f64_const/id.wat b/winch/filetests/filetests/x64/f64_const/id.wat index 191f88940cd3..0e125eb0ac8d 100644 --- a/winch/filetests/filetests/x64/f64_const/id.wat +++ b/winch/filetests/filetests/x64/f64_const/id.wat @@ -3,12 +3,17 @@ (module (func (param f64) (result f64) (local.get 0)) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f20f11442408 movsd qword ptr [rsp + 8], xmm0 -;; e: 4c893424 mov qword ptr [rsp], r14 -;; 12: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 18: 4883c410 add rsp, 0x10 -;; 1c: 5d pop rbp -;; 1d: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8716000000 ja 0x2e +;; 18: f20f11442408 movsd qword ptr [rsp + 8], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 2e: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_convert_i32_s/const.wat b/winch/filetests/filetests/x64/f64_convert_i32_s/const.wat new file mode 100644 index 000000000000..c87efa1201f8 --- /dev/null +++ b/winch/filetests/filetests/x64/f64_convert_i32_s/const.wat @@ -0,0 +1,22 @@ +;;! target = "x86_64" + +(module + (func (result f64) + (i32.const 1) + (f64.convert_i32_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8713000000 ja 0x2b +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; f20f2ac0 cvtsi2sd xmm0, eax +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2b: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_convert_i32_s/locals.wat b/winch/filetests/filetests/x64/f64_convert_i32_s/locals.wat new file mode 100644 index 000000000000..fc952130e4b8 --- /dev/null +++ b/winch/filetests/filetests/x64/f64_convert_i32_s/locals.wat @@ -0,0 +1,26 @@ +;;! target = "x86_64" + +(module + (func (result f64) + (local i32) + + (local.get 0) + (f64.convert_i32_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871b000000 ja 0x33 +;; 18: 48c744240800000000 +;; mov qword ptr [rsp + 8], 0 +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; f20f2ac0 cvtsi2sd xmm0, eax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 33: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_convert_i32_s/params.wat b/winch/filetests/filetests/x64/f64_convert_i32_s/params.wat new file mode 100644 index 000000000000..3ff4b4377435 --- /dev/null +++ b/winch/filetests/filetests/x64/f64_convert_i32_s/params.wat @@ -0,0 +1,23 @@ +;;! target = "x86_64" + +(module + (func (param i32) (result f64) + (local.get 0) + (f64.convert_i32_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8716000000 ja 0x2e +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; f20f2ac0 cvtsi2sd xmm0, eax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 2e: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_convert_i32_s/spilled.wat b/winch/filetests/filetests/x64/f64_convert_i32_s/spilled.wat new file mode 100644 index 000000000000..4d8eb7abb181 --- /dev/null +++ b/winch/filetests/filetests/x64/f64_convert_i32_s/spilled.wat @@ -0,0 +1,28 @@ +;;! target = "x86_64" + +(module + (func (result f64) + i32.const 1 + f64.convert_i32_s + block + end + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8725000000 ja 0x3d +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; f20f2ac0 cvtsi2sd xmm0, eax +;; 4883ec08 sub rsp, 8 +;; f20f110424 movsd qword ptr [rsp], xmm0 +;; f20f100424 movsd xmm0, qword ptr [rsp] +;; 4883c408 add rsp, 8 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 3d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_convert_i32_u/const.wat b/winch/filetests/filetests/x64/f64_convert_i32_u/const.wat new file mode 100644 index 000000000000..ab50fd8ed29b --- /dev/null +++ b/winch/filetests/filetests/x64/f64_convert_i32_u/const.wat @@ -0,0 +1,33 @@ +;;! target = "x86_64" + +(module + (func (result f64) + (i32.const 1) + (f64.convert_i32_u) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f873f000000 ja 0x57 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b901000000 mov ecx, 1 +;; 8bc9 mov ecx, ecx +;; 4883f900 cmp rcx, 0 +;; 0f8c0a000000 jl 0x37 +;; 2d: f2480f2ac1 cvtsi2sd xmm0, rcx +;; e91a000000 jmp 0x51 +;; 37: 4989cb mov r11, rcx +;; 49c1eb01 shr r11, 1 +;; 4889c8 mov rax, rcx +;; 4883e001 and rax, 1 +;; 4c09d8 or rax, r11 +;; f2480f2ac0 cvtsi2sd xmm0, rax +;; f20f58c0 addsd xmm0, xmm0 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 57: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_convert_i32_u/locals.wat b/winch/filetests/filetests/x64/f64_convert_i32_u/locals.wat new file mode 100644 index 000000000000..f821e669abe5 --- /dev/null +++ b/winch/filetests/filetests/x64/f64_convert_i32_u/locals.wat @@ -0,0 +1,37 @@ +;;! target = "x86_64" + +(module + (func (result f64) + (local i32) + + (local.get 0) + (f64.convert_i32_u) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8747000000 ja 0x5f +;; 18: 48c744240800000000 +;; mov qword ptr [rsp + 8], 0 +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 8bc9 mov ecx, ecx +;; 4883f900 cmp rcx, 0 +;; 0f8c0a000000 jl 0x3f +;; 35: f2480f2ac1 cvtsi2sd xmm0, rcx +;; e91a000000 jmp 0x59 +;; 3f: 4989cb mov r11, rcx +;; 49c1eb01 shr r11, 1 +;; 4889c8 mov rax, rcx +;; 4883e001 and rax, 1 +;; 4c09d8 or rax, r11 +;; f2480f2ac0 cvtsi2sd xmm0, rax +;; f20f58c0 addsd xmm0, xmm0 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 5f: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_convert_i32_u/params.wat b/winch/filetests/filetests/x64/f64_convert_i32_u/params.wat new file mode 100644 index 000000000000..cf148343f88e --- /dev/null +++ b/winch/filetests/filetests/x64/f64_convert_i32_u/params.wat @@ -0,0 +1,34 @@ +;;! target = "x86_64" + +(module + (func (param i32) (result f64) + (local.get 0) + (f64.convert_i32_u) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8742000000 ja 0x5a +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 8bc9 mov ecx, ecx +;; 4883f900 cmp rcx, 0 +;; 0f8c0a000000 jl 0x3a +;; 30: f2480f2ac1 cvtsi2sd xmm0, rcx +;; e91a000000 jmp 0x54 +;; 3a: 4989cb mov r11, rcx +;; 49c1eb01 shr r11, 1 +;; 4889c8 mov rax, rcx +;; 4883e001 and rax, 1 +;; 4c09d8 or rax, r11 +;; f2480f2ac0 cvtsi2sd xmm0, rax +;; f20f58c0 addsd xmm0, xmm0 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 5a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_convert_i32_u/spilled.wat b/winch/filetests/filetests/x64/f64_convert_i32_u/spilled.wat new file mode 100644 index 000000000000..663243a15f9d --- /dev/null +++ b/winch/filetests/filetests/x64/f64_convert_i32_u/spilled.wat @@ -0,0 +1,39 @@ +;;! target = "x86_64" + +(module + (func (result f64) + i32.const 1 + f64.convert_i32_u + block + end + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8751000000 ja 0x69 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b901000000 mov ecx, 1 +;; 8bc9 mov ecx, ecx +;; 4883f900 cmp rcx, 0 +;; 0f8c0a000000 jl 0x37 +;; 2d: f2480f2ac1 cvtsi2sd xmm0, rcx +;; e91a000000 jmp 0x51 +;; 37: 4989cb mov r11, rcx +;; 49c1eb01 shr r11, 1 +;; 4889c8 mov rax, rcx +;; 4883e001 and rax, 1 +;; 4c09d8 or rax, r11 +;; f2480f2ac0 cvtsi2sd xmm0, rax +;; f20f58c0 addsd xmm0, xmm0 +;; 4883ec08 sub rsp, 8 +;; f20f110424 movsd qword ptr [rsp], xmm0 +;; f20f100424 movsd xmm0, qword ptr [rsp] +;; 4883c408 add rsp, 8 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 69: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_convert_i64_s/const.wat b/winch/filetests/filetests/x64/f64_convert_i64_s/const.wat new file mode 100644 index 000000000000..983770f68441 --- /dev/null +++ b/winch/filetests/filetests/x64/f64_convert_i64_s/const.wat @@ -0,0 +1,22 @@ +;;! target = "x86_64" + +(module + (func (result f64) + (i64.const 1) + (f64.convert_i64_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8716000000 ja 0x2e +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; f2480f2ac0 cvtsi2sd xmm0, rax +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2e: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_convert_i64_s/locals.wat b/winch/filetests/filetests/x64/f64_convert_i64_s/locals.wat new file mode 100644 index 000000000000..d5a4b4aab53d --- /dev/null +++ b/winch/filetests/filetests/x64/f64_convert_i64_s/locals.wat @@ -0,0 +1,26 @@ +;;! target = "x86_64" + +(module + (func (result f64) + (local i64) + + (local.get 0) + (f64.convert_i64_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871d000000 ja 0x35 +;; 18: 48c744240800000000 +;; mov qword ptr [rsp + 8], 0 +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; f2480f2ac0 cvtsi2sd xmm0, rax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 35: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_convert_i64_s/params.wat b/winch/filetests/filetests/x64/f64_convert_i64_s/params.wat new file mode 100644 index 000000000000..1ad391d5ff8b --- /dev/null +++ b/winch/filetests/filetests/x64/f64_convert_i64_s/params.wat @@ -0,0 +1,23 @@ +;;! target = "x86_64" + +(module + (func (param i64) (result f64) + (local.get 0) + (f64.convert_i64_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8719000000 ja 0x31 +;; 18: 48897c2408 mov qword ptr [rsp + 8], rdi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; f2480f2ac0 cvtsi2sd xmm0, rax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 31: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_convert_i64_s/spilled.wat b/winch/filetests/filetests/x64/f64_convert_i64_s/spilled.wat new file mode 100644 index 000000000000..4561ada63f4e --- /dev/null +++ b/winch/filetests/filetests/x64/f64_convert_i64_s/spilled.wat @@ -0,0 +1,28 @@ +;;! target = "x86_64" + +(module + (func (result f64) + i64.const 1 + f64.convert_i64_s + block + end + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8728000000 ja 0x40 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; f2480f2ac0 cvtsi2sd xmm0, rax +;; 4883ec08 sub rsp, 8 +;; f20f110424 movsd qword ptr [rsp], xmm0 +;; f20f100424 movsd xmm0, qword ptr [rsp] +;; 4883c408 add rsp, 8 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 40: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_convert_i64_u/const.wat b/winch/filetests/filetests/x64/f64_convert_i64_u/const.wat new file mode 100644 index 000000000000..d8eae8e1c564 --- /dev/null +++ b/winch/filetests/filetests/x64/f64_convert_i64_u/const.wat @@ -0,0 +1,32 @@ +;;! target = "x86_64" + +(module + (func (result f64) + (i64.const 1) + (f64.convert_i64_u) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f873f000000 ja 0x57 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c101000000 mov rcx, 1 +;; 4883f900 cmp rcx, 0 +;; 0f8c0a000000 jl 0x37 +;; 2d: f2480f2ac1 cvtsi2sd xmm0, rcx +;; e91a000000 jmp 0x51 +;; 37: 4989cb mov r11, rcx +;; 49c1eb01 shr r11, 1 +;; 4889c8 mov rax, rcx +;; 4883e001 and rax, 1 +;; 4c09d8 or rax, r11 +;; f2480f2ac0 cvtsi2sd xmm0, rax +;; f20f58c0 addsd xmm0, xmm0 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 57: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_convert_i64_u/locals.wat b/winch/filetests/filetests/x64/f64_convert_i64_u/locals.wat new file mode 100644 index 000000000000..d3ea2b132734 --- /dev/null +++ b/winch/filetests/filetests/x64/f64_convert_i64_u/locals.wat @@ -0,0 +1,36 @@ +;;! target = "x86_64" + +(module + (func (result f64) + (local i64) + + (local.get 0) + (f64.convert_i64_u) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8746000000 ja 0x5e +;; 18: 48c744240800000000 +;; mov qword ptr [rsp + 8], 0 +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b4c2408 mov rcx, qword ptr [rsp + 8] +;; 4883f900 cmp rcx, 0 +;; 0f8c0a000000 jl 0x3e +;; 34: f2480f2ac1 cvtsi2sd xmm0, rcx +;; e91a000000 jmp 0x58 +;; 3e: 4989cb mov r11, rcx +;; 49c1eb01 shr r11, 1 +;; 4889c8 mov rax, rcx +;; 4883e001 and rax, 1 +;; 4c09d8 or rax, r11 +;; f2480f2ac0 cvtsi2sd xmm0, rax +;; f20f58c0 addsd xmm0, xmm0 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 5e: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_convert_i64_u/params.wat b/winch/filetests/filetests/x64/f64_convert_i64_u/params.wat new file mode 100644 index 000000000000..7dd0cdc5b9f2 --- /dev/null +++ b/winch/filetests/filetests/x64/f64_convert_i64_u/params.wat @@ -0,0 +1,33 @@ +;;! target = "x86_64" + +(module + (func (param i64) (result f64) + (local.get 0) + (f64.convert_i64_u) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8742000000 ja 0x5a +;; 18: 48897c2408 mov qword ptr [rsp + 8], rdi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b4c2408 mov rcx, qword ptr [rsp + 8] +;; 4883f900 cmp rcx, 0 +;; 0f8c0a000000 jl 0x3a +;; 30: f2480f2ac1 cvtsi2sd xmm0, rcx +;; e91a000000 jmp 0x54 +;; 3a: 4989cb mov r11, rcx +;; 49c1eb01 shr r11, 1 +;; 4889c8 mov rax, rcx +;; 4883e001 and rax, 1 +;; 4c09d8 or rax, r11 +;; f2480f2ac0 cvtsi2sd xmm0, rax +;; f20f58c0 addsd xmm0, xmm0 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 5a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_convert_i64_u/spilled.wat b/winch/filetests/filetests/x64/f64_convert_i64_u/spilled.wat new file mode 100644 index 000000000000..142078fd353f --- /dev/null +++ b/winch/filetests/filetests/x64/f64_convert_i64_u/spilled.wat @@ -0,0 +1,38 @@ +;;! target = "x86_64" + +(module + (func (result f64) + i64.const 1 + f64.convert_i64_u + block + end + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8751000000 ja 0x69 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c101000000 mov rcx, 1 +;; 4883f900 cmp rcx, 0 +;; 0f8c0a000000 jl 0x37 +;; 2d: f2480f2ac1 cvtsi2sd xmm0, rcx +;; e91a000000 jmp 0x51 +;; 37: 4989cb mov r11, rcx +;; 49c1eb01 shr r11, 1 +;; 4889c8 mov rax, rcx +;; 4883e001 and rax, 1 +;; 4c09d8 or rax, r11 +;; f2480f2ac0 cvtsi2sd xmm0, rax +;; f20f58c0 addsd xmm0, xmm0 +;; 4883ec08 sub rsp, 8 +;; f20f110424 movsd qword ptr [rsp], xmm0 +;; f20f100424 movsd xmm0, qword ptr [rsp] +;; 4883c408 add rsp, 8 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 69: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_copysign/const.wat b/winch/filetests/filetests/x64/f64_copysign/const.wat index 418fd6f77321..5ac7a1a2858c 100644 --- a/winch/filetests/filetests/x64/f64_copysign/const.wat +++ b/winch/filetests/filetests/x64/f64_copysign/const.wat @@ -7,20 +7,28 @@ (f64.copysign) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f20f100534000000 movsd xmm0, qword ptr [rip + 0x34] -;; 14: f20f100d34000000 movsd xmm1, qword ptr [rip + 0x34] -;; 1c: 49bb0000000000000080 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8740000000 ja 0x58 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f20f10053c000000 movsd xmm0, qword ptr [rip + 0x3c] +;; f20f100d3c000000 movsd xmm1, qword ptr [rip + 0x3c] +;; 49bb0000000000000080 ;; movabs r11, 0x8000000000000000 -;; 26: 664d0f6efb movq xmm15, r11 -;; 2b: 66410f54c7 andpd xmm0, xmm15 -;; 30: 66440f55f9 andnpd xmm15, xmm1 -;; 35: 66410f28cf movapd xmm1, xmm15 -;; 3a: 660f56c8 orpd xmm1, xmm0 -;; 3e: 660f28c1 movapd xmm0, xmm1 -;; 42: 4883c408 add rsp, 8 -;; 46: 5d pop rbp -;; 47: c3 ret +;; 664d0f6efb movq xmm15, r11 +;; 66410f54c7 andpd xmm0, xmm15 +;; 66440f55f9 andnpd xmm15, xmm1 +;; 66410f28cf movapd xmm1, xmm15 +;; 660f56c8 orpd xmm1, xmm0 +;; 660f28c1 movapd xmm0, xmm1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 58: 0f0b ud2 +;; 5a: 0000 add byte ptr [rax], al +;; 5c: 0000 add byte ptr [rax], al +;; 5e: 0000 add byte ptr [rax], al diff --git a/winch/filetests/filetests/x64/f64_copysign/locals.wat b/winch/filetests/filetests/x64/f64_copysign/locals.wat index 6c0f2e053201..c04c5d61d02a 100644 --- a/winch/filetests/filetests/x64/f64_copysign/locals.wat +++ b/winch/filetests/filetests/x64/f64_copysign/locals.wat @@ -16,34 +16,38 @@ f64.copysign ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 4531db xor r11d, r11d -;; b: 4c895c2410 mov qword ptr [rsp + 0x10], r11 -;; 10: 4c895c2408 mov qword ptr [rsp + 8], r11 -;; 15: 4c893424 mov qword ptr [rsp], r14 -;; 19: f20f10054f000000 movsd xmm0, qword ptr [rip + 0x4f] -;; 21: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 -;; 27: f20f100549000000 movsd xmm0, qword ptr [rip + 0x49] -;; 2f: f20f11442408 movsd qword ptr [rsp + 8], xmm0 -;; 35: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 3b: f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] -;; 41: 49bb0000000000000080 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8765000000 ja 0x7d +;; 18: 4531db xor r11d, r11d +;; 4c895c2410 mov qword ptr [rsp + 0x10], r11 +;; 4c895c2408 mov qword ptr [rsp + 8], r11 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f10054f000000 movsd xmm0, qword ptr [rip + 0x4f] +;; f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 +;; f20f100549000000 movsd xmm0, qword ptr [rip + 0x49] +;; f20f11442408 movsd qword ptr [rsp + 8], xmm0 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] +;; 49bb0000000000000080 ;; movabs r11, 0x8000000000000000 -;; 4b: 664d0f6efb movq xmm15, r11 -;; 50: 66410f54c7 andpd xmm0, xmm15 -;; 55: 66440f55f9 andnpd xmm15, xmm1 -;; 5a: 66410f28cf movapd xmm1, xmm15 -;; 5f: 660f56c8 orpd xmm1, xmm0 -;; 63: 660f28c1 movapd xmm0, xmm1 -;; 67: 4883c418 add rsp, 0x18 -;; 6b: 5d pop rbp -;; 6c: c3 ret -;; 6d: 0000 add byte ptr [rax], al -;; 6f: 009a99999999 add byte ptr [rdx - 0x66666667], bl -;; 75: 99 cdq -;; 76: f1 int1 -;; 77: bf9a999999 mov edi, 0x9999999a -;; 7c: 99 cdq -;; 7d: 99 cdq +;; 664d0f6efb movq xmm15, r11 +;; 66410f54c7 andpd xmm0, xmm15 +;; 66440f55f9 andnpd xmm15, xmm1 +;; 66410f28cf movapd xmm1, xmm15 +;; 660f56c8 orpd xmm1, xmm0 +;; 660f28c1 movapd xmm0, xmm1 +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 7d: 0f0b ud2 +;; 7f: 009a99999999 add byte ptr [rdx - 0x66666667], bl +;; 85: 99 cdq +;; 86: f1 int1 +;; 87: bf9a999999 mov edi, 0x9999999a +;; 8c: 99 cdq +;; 8d: 99 cdq diff --git a/winch/filetests/filetests/x64/f64_copysign/params.wat b/winch/filetests/filetests/x64/f64_copysign/params.wat index ddf7ff2af612..7b18d0dac316 100644 --- a/winch/filetests/filetests/x64/f64_copysign/params.wat +++ b/winch/filetests/filetests/x64/f64_copysign/params.wat @@ -7,22 +7,27 @@ (f64.copysign) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 -;; e: f20f114c2408 movsd qword ptr [rsp + 8], xmm1 -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 1e: f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] -;; 24: 49bb0000000000000080 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8748000000 ja 0x60 +;; 18: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 +;; f20f114c2408 movsd qword ptr [rsp + 8], xmm1 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] +;; 49bb0000000000000080 ;; movabs r11, 0x8000000000000000 -;; 2e: 664d0f6efb movq xmm15, r11 -;; 33: 66410f54c7 andpd xmm0, xmm15 -;; 38: 66440f55f9 andnpd xmm15, xmm1 -;; 3d: 66410f28cf movapd xmm1, xmm15 -;; 42: 660f56c8 orpd xmm1, xmm0 -;; 46: 660f28c1 movapd xmm0, xmm1 -;; 4a: 4883c418 add rsp, 0x18 -;; 4e: 5d pop rbp -;; 4f: c3 ret +;; 664d0f6efb movq xmm15, r11 +;; 66410f54c7 andpd xmm0, xmm15 +;; 66440f55f9 andnpd xmm15, xmm1 +;; 66410f28cf movapd xmm1, xmm15 +;; 660f56c8 orpd xmm1, xmm0 +;; 660f28c1 movapd xmm0, xmm1 +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 60: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_div/const.wat b/winch/filetests/filetests/x64/f64_div/const.wat index f29a6d25dd58..33b7f5398054 100644 --- a/winch/filetests/filetests/x64/f64_div/const.wat +++ b/winch/filetests/filetests/x64/f64_div/const.wat @@ -7,17 +7,21 @@ (f64.div) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f20f10051c000000 movsd xmm0, qword ptr [rip + 0x1c] -;; 14: f20f100d1c000000 movsd xmm1, qword ptr [rip + 0x1c] -;; 1c: f20f5ec8 divsd xmm1, xmm0 -;; 20: 660f28c1 movapd xmm0, xmm1 -;; 24: 4883c408 add rsp, 8 -;; 28: 5d pop rbp -;; 29: c3 ret -;; 2a: 0000 add byte ptr [rax], al -;; 2c: 0000 add byte ptr [rax], al -;; 2e: 0000 add byte ptr [rax], al +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8722000000 ja 0x3a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f20f10051c000000 movsd xmm0, qword ptr [rip + 0x1c] +;; f20f100d1c000000 movsd xmm1, qword ptr [rip + 0x1c] +;; f20f5ec8 divsd xmm1, xmm0 +;; 660f28c1 movapd xmm0, xmm1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 3a: 0f0b ud2 +;; 3c: 0000 add byte ptr [rax], al +;; 3e: 0000 add byte ptr [rax], al diff --git a/winch/filetests/filetests/x64/f64_div/locals.wat b/winch/filetests/filetests/x64/f64_div/locals.wat index a8ffb3e618b7..acca89b403fd 100644 --- a/winch/filetests/filetests/x64/f64_div/locals.wat +++ b/winch/filetests/filetests/x64/f64_div/locals.wat @@ -16,24 +16,32 @@ f64.div ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 4531db xor r11d, r11d -;; b: 4c895c2410 mov qword ptr [rsp + 0x10], r11 -;; 10: 4c895c2408 mov qword ptr [rsp + 8], r11 -;; 15: 4c893424 mov qword ptr [rsp], r14 -;; 19: f20f10052f000000 movsd xmm0, qword ptr [rip + 0x2f] -;; 21: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 -;; 27: f20f100529000000 movsd xmm0, qword ptr [rip + 0x29] -;; 2f: f20f11442408 movsd qword ptr [rsp + 8], xmm0 -;; 35: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 3b: f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] -;; 41: f20f5ec8 divsd xmm1, xmm0 -;; 45: 660f28c1 movapd xmm0, xmm1 -;; 49: 4883c418 add rsp, 0x18 -;; 4d: 5d pop rbp -;; 4e: c3 ret -;; 4f: 009a99999999 add byte ptr [rdx - 0x66666667], bl -;; 55: 99 cdq -;; 56: f1 int1 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8747000000 ja 0x5f +;; 18: 4531db xor r11d, r11d +;; 4c895c2410 mov qword ptr [rsp + 0x10], r11 +;; 4c895c2408 mov qword ptr [rsp + 8], r11 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f100537000000 movsd xmm0, qword ptr [rip + 0x37] +;; f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 +;; f20f100531000000 movsd xmm0, qword ptr [rip + 0x31] +;; f20f11442408 movsd qword ptr [rsp + 8], xmm0 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] +;; f20f5ec8 divsd xmm1, xmm0 +;; 660f28c1 movapd xmm0, xmm1 +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 5f: 0f0b ud2 +;; 61: 0000 add byte ptr [rax], al +;; 63: 0000 add byte ptr [rax], al +;; 65: 0000 add byte ptr [rax], al +;; 67: 009a99999999 add byte ptr [rdx - 0x66666667], bl +;; 6d: 99 cdq +;; 6e: f1 int1 diff --git a/winch/filetests/filetests/x64/f64_div/params.wat b/winch/filetests/filetests/x64/f64_div/params.wat index 2b0beadd141a..4403b08bf49d 100644 --- a/winch/filetests/filetests/x64/f64_div/params.wat +++ b/winch/filetests/filetests/x64/f64_div/params.wat @@ -7,16 +7,21 @@ (f64.div) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 -;; e: f20f114c2408 movsd qword ptr [rsp + 8], xmm1 -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 1e: f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] -;; 24: f20f5ec8 divsd xmm1, xmm0 -;; 28: 660f28c1 movapd xmm0, xmm1 -;; 2c: 4883c418 add rsp, 0x18 -;; 30: 5d pop rbp -;; 31: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872a000000 ja 0x42 +;; 18: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 +;; f20f114c2408 movsd qword ptr [rsp + 8], xmm1 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] +;; f20f5ec8 divsd xmm1, xmm0 +;; 660f28c1 movapd xmm0, xmm1 +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 42: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_eq/const.wat b/winch/filetests/filetests/x64/f64_eq/const.wat index e66d344b475a..043019514b94 100644 --- a/winch/filetests/filetests/x64/f64_eq/const.wat +++ b/winch/filetests/filetests/x64/f64_eq/const.wat @@ -7,20 +7,24 @@ (f64.eq) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f20f10052c000000 movsd xmm0, qword ptr [rip + 0x2c] -;; 14: f20f100d2c000000 movsd xmm1, qword ptr [rip + 0x2c] -;; 1c: 660f2ec8 ucomisd xmm1, xmm0 -;; 20: b800000000 mov eax, 0 -;; 25: 400f94c0 sete al -;; 29: 41bb00000000 mov r11d, 0 -;; 2f: 410f9bc3 setnp r11b -;; 33: 4c21d8 and rax, r11 -;; 36: 4883c408 add rsp, 8 -;; 3a: 5d pop rbp -;; 3b: c3 ret -;; 3c: 0000 add byte ptr [rax], al -;; 3e: 0000 add byte ptr [rax], al +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8734000000 ja 0x4c +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f20f10052c000000 movsd xmm0, qword ptr [rip + 0x2c] +;; f20f100d2c000000 movsd xmm1, qword ptr [rip + 0x2c] +;; 660f2ec8 ucomisd xmm1, xmm0 +;; b800000000 mov eax, 0 +;; 400f94c0 sete al +;; 41bb00000000 mov r11d, 0 +;; 410f9bc3 setnp r11b +;; 4c21d8 and rax, r11 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 4c: 0f0b ud2 +;; 4e: 0000 add byte ptr [rax], al diff --git a/winch/filetests/filetests/x64/f64_eq/locals.wat b/winch/filetests/filetests/x64/f64_eq/locals.wat index 54e6724e3ee6..9bd583e15347 100644 --- a/winch/filetests/filetests/x64/f64_eq/locals.wat +++ b/winch/filetests/filetests/x64/f64_eq/locals.wat @@ -16,31 +16,35 @@ f64.eq ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 4531db xor r11d, r11d -;; b: 4c895c2410 mov qword ptr [rsp + 0x10], r11 -;; 10: 4c895c2408 mov qword ptr [rsp + 8], r11 -;; 15: 4c893424 mov qword ptr [rsp], r14 -;; 19: f20f100547000000 movsd xmm0, qword ptr [rip + 0x47] -;; 21: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 -;; 27: f20f100541000000 movsd xmm0, qword ptr [rip + 0x41] -;; 2f: f20f11442408 movsd qword ptr [rsp + 8], xmm0 -;; 35: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 3b: f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] -;; 41: 660f2ec8 ucomisd xmm1, xmm0 -;; 45: b800000000 mov eax, 0 -;; 4a: 400f94c0 sete al -;; 4e: 41bb00000000 mov r11d, 0 -;; 54: 410f9bc3 setnp r11b -;; 58: 4c21d8 and rax, r11 -;; 5b: 4883c418 add rsp, 0x18 -;; 5f: 5d pop rbp -;; 60: c3 ret -;; 61: 0000 add byte ptr [rax], al -;; 63: 0000 add byte ptr [rax], al -;; 65: 0000 add byte ptr [rax], al -;; 67: 009a99999999 add byte ptr [rdx - 0x66666667], bl -;; 6d: 99 cdq -;; 6e: f1 int1 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8759000000 ja 0x71 +;; 18: 4531db xor r11d, r11d +;; 4c895c2410 mov qword ptr [rsp + 0x10], r11 +;; 4c895c2408 mov qword ptr [rsp + 8], r11 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f100547000000 movsd xmm0, qword ptr [rip + 0x47] +;; f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 +;; f20f100541000000 movsd xmm0, qword ptr [rip + 0x41] +;; f20f11442408 movsd qword ptr [rsp + 8], xmm0 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] +;; 660f2ec8 ucomisd xmm1, xmm0 +;; b800000000 mov eax, 0 +;; 400f94c0 sete al +;; 41bb00000000 mov r11d, 0 +;; 410f9bc3 setnp r11b +;; 4c21d8 and rax, r11 +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 71: 0f0b ud2 +;; 73: 0000 add byte ptr [rax], al +;; 75: 0000 add byte ptr [rax], al +;; 77: 009a99999999 add byte ptr [rdx - 0x66666667], bl +;; 7d: 99 cdq +;; 7e: f1 int1 diff --git a/winch/filetests/filetests/x64/f64_eq/params.wat b/winch/filetests/filetests/x64/f64_eq/params.wat index 68ef77e076eb..843dae0f7736 100644 --- a/winch/filetests/filetests/x64/f64_eq/params.wat +++ b/winch/filetests/filetests/x64/f64_eq/params.wat @@ -7,20 +7,25 @@ (f64.eq) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 -;; e: f20f114c2408 movsd qword ptr [rsp + 8], xmm1 -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 1e: f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] -;; 24: 660f2ec8 ucomisd xmm1, xmm0 -;; 28: b800000000 mov eax, 0 -;; 2d: 400f94c0 sete al -;; 31: 41bb00000000 mov r11d, 0 -;; 37: 410f9bc3 setnp r11b -;; 3b: 4c21d8 and rax, r11 -;; 3e: 4883c418 add rsp, 0x18 -;; 42: 5d pop rbp -;; 43: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f873c000000 ja 0x54 +;; 18: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 +;; f20f114c2408 movsd qword ptr [rsp + 8], xmm1 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] +;; 660f2ec8 ucomisd xmm1, xmm0 +;; b800000000 mov eax, 0 +;; 400f94c0 sete al +;; 41bb00000000 mov r11d, 0 +;; 410f9bc3 setnp r11b +;; 4c21d8 and rax, r11 +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 54: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_floor/f64_floor_const_sse41.wat b/winch/filetests/filetests/x64/f64_floor/f64_floor_const_sse41.wat index d08b70469c1d..26a4a18b8d75 100644 --- a/winch/filetests/filetests/x64/f64_floor/f64_floor_const_sse41.wat +++ b/winch/filetests/filetests/x64/f64_floor/f64_floor_const_sse41.wat @@ -7,12 +7,20 @@ (f64.floor) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f20f10050c000000 movsd xmm0, qword ptr [rip + 0xc] -;; 14: 660f3a0bc001 roundsd xmm0, xmm0, 1 -;; 1a: 4883c408 add rsp, 8 -;; 1e: 5d pop rbp -;; 1f: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8718000000 ja 0x30 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f20f100514000000 movsd xmm0, qword ptr [rip + 0x14] +;; 660f3a0bc001 roundsd xmm0, xmm0, 1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 30: 0f0b ud2 +;; 32: 0000 add byte ptr [rax], al +;; 34: 0000 add byte ptr [rax], al +;; 36: 0000 add byte ptr [rax], al diff --git a/winch/filetests/filetests/x64/f64_floor/f64_floor_param.wat b/winch/filetests/filetests/x64/f64_floor/f64_floor_param.wat index 01b6e9517c0f..4e7c6c19817e 100644 --- a/winch/filetests/filetests/x64/f64_floor/f64_floor_param.wat +++ b/winch/filetests/filetests/x64/f64_floor/f64_floor_param.wat @@ -6,13 +6,24 @@ (f64.floor) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f20f11442408 movsd qword ptr [rsp + 8], xmm0 -;; e: 4c893424 mov qword ptr [rsp], r14 -;; 12: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 18: e800000000 call 0x1d -;; 1d: 4883c410 add rsp, 0x10 -;; 21: 5d pop rbp -;; 22: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8738000000 ja 0x50 +;; 18: f20f11442408 movsd qword ptr [rsp + 8], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f2440f107c2408 movsd xmm15, qword ptr [rsp + 8] +;; 4883ec08 sub rsp, 8 +;; f2440f113c24 movsd qword ptr [rsp], xmm15 +;; 4883ec08 sub rsp, 8 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; e800000000 call 0x42 +;; 4883c408 add rsp, 8 +;; 4883c408 add rsp, 8 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 50: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_floor/f64_floor_param_sse41.wat b/winch/filetests/filetests/x64/f64_floor/f64_floor_param_sse41.wat index 26a64cd9790f..40376f44b76c 100644 --- a/winch/filetests/filetests/x64/f64_floor/f64_floor_param_sse41.wat +++ b/winch/filetests/filetests/x64/f64_floor/f64_floor_param_sse41.wat @@ -7,13 +7,18 @@ (f64.floor) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f20f11442408 movsd qword ptr [rsp + 8], xmm0 -;; e: 4c893424 mov qword ptr [rsp], r14 -;; 12: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 18: 660f3a0bc001 roundsd xmm0, xmm0, 1 -;; 1e: 4883c410 add rsp, 0x10 -;; 22: 5d pop rbp -;; 23: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871c000000 ja 0x34 +;; 18: f20f11442408 movsd qword ptr [rsp + 8], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; 660f3a0bc001 roundsd xmm0, xmm0, 1 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 34: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_ge/const.wat b/winch/filetests/filetests/x64/f64_ge/const.wat index babc26b1cff2..f8253730b7c4 100644 --- a/winch/filetests/filetests/x64/f64_ge/const.wat +++ b/winch/filetests/filetests/x64/f64_ge/const.wat @@ -7,20 +7,24 @@ (f64.ge) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f20f10052c000000 movsd xmm0, qword ptr [rip + 0x2c] -;; 14: f20f100d2c000000 movsd xmm1, qword ptr [rip + 0x2c] -;; 1c: 660f2ec8 ucomisd xmm1, xmm0 -;; 20: b800000000 mov eax, 0 -;; 25: 400f93c0 setae al -;; 29: 41bb00000000 mov r11d, 0 -;; 2f: 410f9bc3 setnp r11b -;; 33: 4c21d8 and rax, r11 -;; 36: 4883c408 add rsp, 8 -;; 3a: 5d pop rbp -;; 3b: c3 ret -;; 3c: 0000 add byte ptr [rax], al -;; 3e: 0000 add byte ptr [rax], al +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8734000000 ja 0x4c +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f20f10052c000000 movsd xmm0, qword ptr [rip + 0x2c] +;; f20f100d2c000000 movsd xmm1, qword ptr [rip + 0x2c] +;; 660f2ec8 ucomisd xmm1, xmm0 +;; b800000000 mov eax, 0 +;; 400f93c0 setae al +;; 41bb00000000 mov r11d, 0 +;; 410f9bc3 setnp r11b +;; 4c21d8 and rax, r11 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 4c: 0f0b ud2 +;; 4e: 0000 add byte ptr [rax], al diff --git a/winch/filetests/filetests/x64/f64_ge/locals.wat b/winch/filetests/filetests/x64/f64_ge/locals.wat index 4bc63797ecad..c9ffa3755788 100644 --- a/winch/filetests/filetests/x64/f64_ge/locals.wat +++ b/winch/filetests/filetests/x64/f64_ge/locals.wat @@ -16,31 +16,35 @@ f64.ge ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 4531db xor r11d, r11d -;; b: 4c895c2410 mov qword ptr [rsp + 0x10], r11 -;; 10: 4c895c2408 mov qword ptr [rsp + 8], r11 -;; 15: 4c893424 mov qword ptr [rsp], r14 -;; 19: f20f100547000000 movsd xmm0, qword ptr [rip + 0x47] -;; 21: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 -;; 27: f20f100541000000 movsd xmm0, qword ptr [rip + 0x41] -;; 2f: f20f11442408 movsd qword ptr [rsp + 8], xmm0 -;; 35: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 3b: f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] -;; 41: 660f2ec8 ucomisd xmm1, xmm0 -;; 45: b800000000 mov eax, 0 -;; 4a: 400f93c0 setae al -;; 4e: 41bb00000000 mov r11d, 0 -;; 54: 410f9bc3 setnp r11b -;; 58: 4c21d8 and rax, r11 -;; 5b: 4883c418 add rsp, 0x18 -;; 5f: 5d pop rbp -;; 60: c3 ret -;; 61: 0000 add byte ptr [rax], al -;; 63: 0000 add byte ptr [rax], al -;; 65: 0000 add byte ptr [rax], al -;; 67: 009a99999999 add byte ptr [rdx - 0x66666667], bl -;; 6d: 99 cdq -;; 6e: f1 int1 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8759000000 ja 0x71 +;; 18: 4531db xor r11d, r11d +;; 4c895c2410 mov qword ptr [rsp + 0x10], r11 +;; 4c895c2408 mov qword ptr [rsp + 8], r11 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f100547000000 movsd xmm0, qword ptr [rip + 0x47] +;; f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 +;; f20f100541000000 movsd xmm0, qword ptr [rip + 0x41] +;; f20f11442408 movsd qword ptr [rsp + 8], xmm0 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] +;; 660f2ec8 ucomisd xmm1, xmm0 +;; b800000000 mov eax, 0 +;; 400f93c0 setae al +;; 41bb00000000 mov r11d, 0 +;; 410f9bc3 setnp r11b +;; 4c21d8 and rax, r11 +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 71: 0f0b ud2 +;; 73: 0000 add byte ptr [rax], al +;; 75: 0000 add byte ptr [rax], al +;; 77: 009a99999999 add byte ptr [rdx - 0x66666667], bl +;; 7d: 99 cdq +;; 7e: f1 int1 diff --git a/winch/filetests/filetests/x64/f64_ge/params.wat b/winch/filetests/filetests/x64/f64_ge/params.wat index 87c4dd9f741c..c4f974e695af 100644 --- a/winch/filetests/filetests/x64/f64_ge/params.wat +++ b/winch/filetests/filetests/x64/f64_ge/params.wat @@ -7,20 +7,25 @@ (f64.ge) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 -;; e: f20f114c2408 movsd qword ptr [rsp + 8], xmm1 -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 1e: f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] -;; 24: 660f2ec8 ucomisd xmm1, xmm0 -;; 28: b800000000 mov eax, 0 -;; 2d: 400f93c0 setae al -;; 31: 41bb00000000 mov r11d, 0 -;; 37: 410f9bc3 setnp r11b -;; 3b: 4c21d8 and rax, r11 -;; 3e: 4883c418 add rsp, 0x18 -;; 42: 5d pop rbp -;; 43: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f873c000000 ja 0x54 +;; 18: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 +;; f20f114c2408 movsd qword ptr [rsp + 8], xmm1 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] +;; 660f2ec8 ucomisd xmm1, xmm0 +;; b800000000 mov eax, 0 +;; 400f93c0 setae al +;; 41bb00000000 mov r11d, 0 +;; 410f9bc3 setnp r11b +;; 4c21d8 and rax, r11 +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 54: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_gt/const.wat b/winch/filetests/filetests/x64/f64_gt/const.wat index c335eb301183..0f5ef0cb29a6 100644 --- a/winch/filetests/filetests/x64/f64_gt/const.wat +++ b/winch/filetests/filetests/x64/f64_gt/const.wat @@ -7,20 +7,24 @@ (f64.gt) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f20f10052c000000 movsd xmm0, qword ptr [rip + 0x2c] -;; 14: f20f100d2c000000 movsd xmm1, qword ptr [rip + 0x2c] -;; 1c: 660f2ec8 ucomisd xmm1, xmm0 -;; 20: b800000000 mov eax, 0 -;; 25: 400f97c0 seta al -;; 29: 41bb00000000 mov r11d, 0 -;; 2f: 410f9bc3 setnp r11b -;; 33: 4c21d8 and rax, r11 -;; 36: 4883c408 add rsp, 8 -;; 3a: 5d pop rbp -;; 3b: c3 ret -;; 3c: 0000 add byte ptr [rax], al -;; 3e: 0000 add byte ptr [rax], al +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8734000000 ja 0x4c +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f20f10052c000000 movsd xmm0, qword ptr [rip + 0x2c] +;; f20f100d2c000000 movsd xmm1, qword ptr [rip + 0x2c] +;; 660f2ec8 ucomisd xmm1, xmm0 +;; b800000000 mov eax, 0 +;; 400f97c0 seta al +;; 41bb00000000 mov r11d, 0 +;; 410f9bc3 setnp r11b +;; 4c21d8 and rax, r11 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 4c: 0f0b ud2 +;; 4e: 0000 add byte ptr [rax], al diff --git a/winch/filetests/filetests/x64/f64_gt/locals.wat b/winch/filetests/filetests/x64/f64_gt/locals.wat index 89707c693a69..88e344375774 100644 --- a/winch/filetests/filetests/x64/f64_gt/locals.wat +++ b/winch/filetests/filetests/x64/f64_gt/locals.wat @@ -16,31 +16,35 @@ f64.gt ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 4531db xor r11d, r11d -;; b: 4c895c2410 mov qword ptr [rsp + 0x10], r11 -;; 10: 4c895c2408 mov qword ptr [rsp + 8], r11 -;; 15: 4c893424 mov qword ptr [rsp], r14 -;; 19: f20f100547000000 movsd xmm0, qword ptr [rip + 0x47] -;; 21: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 -;; 27: f20f100541000000 movsd xmm0, qword ptr [rip + 0x41] -;; 2f: f20f11442408 movsd qword ptr [rsp + 8], xmm0 -;; 35: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 3b: f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] -;; 41: 660f2ec8 ucomisd xmm1, xmm0 -;; 45: b800000000 mov eax, 0 -;; 4a: 400f97c0 seta al -;; 4e: 41bb00000000 mov r11d, 0 -;; 54: 410f9bc3 setnp r11b -;; 58: 4c21d8 and rax, r11 -;; 5b: 4883c418 add rsp, 0x18 -;; 5f: 5d pop rbp -;; 60: c3 ret -;; 61: 0000 add byte ptr [rax], al -;; 63: 0000 add byte ptr [rax], al -;; 65: 0000 add byte ptr [rax], al -;; 67: 009a99999999 add byte ptr [rdx - 0x66666667], bl -;; 6d: 99 cdq -;; 6e: f1 int1 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8759000000 ja 0x71 +;; 18: 4531db xor r11d, r11d +;; 4c895c2410 mov qword ptr [rsp + 0x10], r11 +;; 4c895c2408 mov qword ptr [rsp + 8], r11 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f100547000000 movsd xmm0, qword ptr [rip + 0x47] +;; f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 +;; f20f100541000000 movsd xmm0, qword ptr [rip + 0x41] +;; f20f11442408 movsd qword ptr [rsp + 8], xmm0 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] +;; 660f2ec8 ucomisd xmm1, xmm0 +;; b800000000 mov eax, 0 +;; 400f97c0 seta al +;; 41bb00000000 mov r11d, 0 +;; 410f9bc3 setnp r11b +;; 4c21d8 and rax, r11 +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 71: 0f0b ud2 +;; 73: 0000 add byte ptr [rax], al +;; 75: 0000 add byte ptr [rax], al +;; 77: 009a99999999 add byte ptr [rdx - 0x66666667], bl +;; 7d: 99 cdq +;; 7e: f1 int1 diff --git a/winch/filetests/filetests/x64/f64_gt/params.wat b/winch/filetests/filetests/x64/f64_gt/params.wat index 8785734d7026..c9427e4f491b 100644 --- a/winch/filetests/filetests/x64/f64_gt/params.wat +++ b/winch/filetests/filetests/x64/f64_gt/params.wat @@ -7,20 +7,25 @@ (f64.gt) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 -;; e: f20f114c2408 movsd qword ptr [rsp + 8], xmm1 -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 1e: f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] -;; 24: 660f2ec8 ucomisd xmm1, xmm0 -;; 28: b800000000 mov eax, 0 -;; 2d: 400f97c0 seta al -;; 31: 41bb00000000 mov r11d, 0 -;; 37: 410f9bc3 setnp r11b -;; 3b: 4c21d8 and rax, r11 -;; 3e: 4883c418 add rsp, 0x18 -;; 42: 5d pop rbp -;; 43: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f873c000000 ja 0x54 +;; 18: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 +;; f20f114c2408 movsd qword ptr [rsp + 8], xmm1 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] +;; 660f2ec8 ucomisd xmm1, xmm0 +;; b800000000 mov eax, 0 +;; 400f97c0 seta al +;; 41bb00000000 mov r11d, 0 +;; 410f9bc3 setnp r11b +;; 4c21d8 and rax, r11 +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 54: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_le/const.wat b/winch/filetests/filetests/x64/f64_le/const.wat index 87f260ba9166..e897840fdfdf 100644 --- a/winch/filetests/filetests/x64/f64_le/const.wat +++ b/winch/filetests/filetests/x64/f64_le/const.wat @@ -7,24 +7,32 @@ (f64.le) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f20f10051c000000 movsd xmm0, qword ptr [rip + 0x1c] -;; 14: f20f100d1c000000 movsd xmm1, qword ptr [rip + 0x1c] -;; 1c: 660f2ec1 ucomisd xmm0, xmm1 -;; 20: b800000000 mov eax, 0 -;; 25: 400f93c0 setae al -;; 29: 4883c408 add rsp, 8 -;; 2d: 5d pop rbp -;; 2e: c3 ret -;; 2f: 009a99999999 add byte ptr [rdx - 0x66666667], bl -;; 35: 99 cdq -;; 36: 01409a add dword ptr [rax - 0x66], eax -;; 39: 99 cdq -;; 3a: 99 cdq -;; 3b: 99 cdq -;; 3c: 99 cdq -;; 3d: 99 cdq -;; 3e: f1 int1 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8727000000 ja 0x3f +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f20f100524000000 movsd xmm0, qword ptr [rip + 0x24] +;; f20f100d24000000 movsd xmm1, qword ptr [rip + 0x24] +;; 660f2ec1 ucomisd xmm0, xmm1 +;; b800000000 mov eax, 0 +;; 400f93c0 setae al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 3f: 0f0b ud2 +;; 41: 0000 add byte ptr [rax], al +;; 43: 0000 add byte ptr [rax], al +;; 45: 0000 add byte ptr [rax], al +;; 47: 009a99999999 add byte ptr [rdx - 0x66666667], bl +;; 4d: 99 cdq +;; 4e: 01409a add dword ptr [rax - 0x66], eax +;; 51: 99 cdq +;; 52: 99 cdq +;; 53: 99 cdq +;; 54: 99 cdq +;; 55: 99 cdq +;; 56: f1 int1 diff --git a/winch/filetests/filetests/x64/f64_le/locals.wat b/winch/filetests/filetests/x64/f64_le/locals.wat index 892e85acd3c8..562d212f69f4 100644 --- a/winch/filetests/filetests/x64/f64_le/locals.wat +++ b/winch/filetests/filetests/x64/f64_le/locals.wat @@ -16,24 +16,28 @@ f64.le ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 4531db xor r11d, r11d -;; b: 4c895c2410 mov qword ptr [rsp + 0x10], r11 -;; 10: 4c895c2408 mov qword ptr [rsp + 8], r11 -;; 15: 4c893424 mov qword ptr [rsp], r14 -;; 19: f20f100537000000 movsd xmm0, qword ptr [rip + 0x37] -;; 21: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 -;; 27: f20f100531000000 movsd xmm0, qword ptr [rip + 0x31] -;; 2f: f20f11442408 movsd qword ptr [rsp + 8], xmm0 -;; 35: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 3b: f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] -;; 41: 660f2ec1 ucomisd xmm0, xmm1 -;; 45: b800000000 mov eax, 0 -;; 4a: 400f93c0 setae al -;; 4e: 4883c418 add rsp, 0x18 -;; 52: 5d pop rbp -;; 53: c3 ret -;; 54: 0000 add byte ptr [rax], al -;; 56: 0000 add byte ptr [rax], al +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f874c000000 ja 0x64 +;; 18: 4531db xor r11d, r11d +;; 4c895c2410 mov qword ptr [rsp + 0x10], r11 +;; 4c895c2408 mov qword ptr [rsp + 8], r11 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f100537000000 movsd xmm0, qword ptr [rip + 0x37] +;; f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 +;; f20f100531000000 movsd xmm0, qword ptr [rip + 0x31] +;; f20f11442408 movsd qword ptr [rsp + 8], xmm0 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] +;; 660f2ec1 ucomisd xmm0, xmm1 +;; b800000000 mov eax, 0 +;; 400f93c0 setae al +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 64: 0f0b ud2 +;; 66: 0000 add byte ptr [rax], al diff --git a/winch/filetests/filetests/x64/f64_le/params.wat b/winch/filetests/filetests/x64/f64_le/params.wat index 892e85acd3c8..562d212f69f4 100644 --- a/winch/filetests/filetests/x64/f64_le/params.wat +++ b/winch/filetests/filetests/x64/f64_le/params.wat @@ -16,24 +16,28 @@ f64.le ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 4531db xor r11d, r11d -;; b: 4c895c2410 mov qword ptr [rsp + 0x10], r11 -;; 10: 4c895c2408 mov qword ptr [rsp + 8], r11 -;; 15: 4c893424 mov qword ptr [rsp], r14 -;; 19: f20f100537000000 movsd xmm0, qword ptr [rip + 0x37] -;; 21: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 -;; 27: f20f100531000000 movsd xmm0, qword ptr [rip + 0x31] -;; 2f: f20f11442408 movsd qword ptr [rsp + 8], xmm0 -;; 35: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 3b: f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] -;; 41: 660f2ec1 ucomisd xmm0, xmm1 -;; 45: b800000000 mov eax, 0 -;; 4a: 400f93c0 setae al -;; 4e: 4883c418 add rsp, 0x18 -;; 52: 5d pop rbp -;; 53: c3 ret -;; 54: 0000 add byte ptr [rax], al -;; 56: 0000 add byte ptr [rax], al +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f874c000000 ja 0x64 +;; 18: 4531db xor r11d, r11d +;; 4c895c2410 mov qword ptr [rsp + 0x10], r11 +;; 4c895c2408 mov qword ptr [rsp + 8], r11 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f100537000000 movsd xmm0, qword ptr [rip + 0x37] +;; f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 +;; f20f100531000000 movsd xmm0, qword ptr [rip + 0x31] +;; f20f11442408 movsd qword ptr [rsp + 8], xmm0 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] +;; 660f2ec1 ucomisd xmm0, xmm1 +;; b800000000 mov eax, 0 +;; 400f93c0 setae al +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 64: 0f0b ud2 +;; 66: 0000 add byte ptr [rax], al diff --git a/winch/filetests/filetests/x64/f64_lt/const.wat b/winch/filetests/filetests/x64/f64_lt/const.wat index f95ce8491e71..eae3e81b1152 100644 --- a/winch/filetests/filetests/x64/f64_lt/const.wat +++ b/winch/filetests/filetests/x64/f64_lt/const.wat @@ -7,24 +7,32 @@ (f64.lt) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f20f10051c000000 movsd xmm0, qword ptr [rip + 0x1c] -;; 14: f20f100d1c000000 movsd xmm1, qword ptr [rip + 0x1c] -;; 1c: 660f2ec1 ucomisd xmm0, xmm1 -;; 20: b800000000 mov eax, 0 -;; 25: 400f97c0 seta al -;; 29: 4883c408 add rsp, 8 -;; 2d: 5d pop rbp -;; 2e: c3 ret -;; 2f: 009a99999999 add byte ptr [rdx - 0x66666667], bl -;; 35: 99 cdq -;; 36: 01409a add dword ptr [rax - 0x66], eax -;; 39: 99 cdq -;; 3a: 99 cdq -;; 3b: 99 cdq -;; 3c: 99 cdq -;; 3d: 99 cdq -;; 3e: f1 int1 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8727000000 ja 0x3f +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f20f100524000000 movsd xmm0, qword ptr [rip + 0x24] +;; f20f100d24000000 movsd xmm1, qword ptr [rip + 0x24] +;; 660f2ec1 ucomisd xmm0, xmm1 +;; b800000000 mov eax, 0 +;; 400f97c0 seta al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 3f: 0f0b ud2 +;; 41: 0000 add byte ptr [rax], al +;; 43: 0000 add byte ptr [rax], al +;; 45: 0000 add byte ptr [rax], al +;; 47: 009a99999999 add byte ptr [rdx - 0x66666667], bl +;; 4d: 99 cdq +;; 4e: 01409a add dword ptr [rax - 0x66], eax +;; 51: 99 cdq +;; 52: 99 cdq +;; 53: 99 cdq +;; 54: 99 cdq +;; 55: 99 cdq +;; 56: f1 int1 diff --git a/winch/filetests/filetests/x64/f64_lt/locals.wat b/winch/filetests/filetests/x64/f64_lt/locals.wat index be6b7432d3e9..c3025a94da04 100644 --- a/winch/filetests/filetests/x64/f64_lt/locals.wat +++ b/winch/filetests/filetests/x64/f64_lt/locals.wat @@ -16,24 +16,28 @@ f64.lt ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 4531db xor r11d, r11d -;; b: 4c895c2410 mov qword ptr [rsp + 0x10], r11 -;; 10: 4c895c2408 mov qword ptr [rsp + 8], r11 -;; 15: 4c893424 mov qword ptr [rsp], r14 -;; 19: f20f100537000000 movsd xmm0, qword ptr [rip + 0x37] -;; 21: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 -;; 27: f20f100531000000 movsd xmm0, qword ptr [rip + 0x31] -;; 2f: f20f11442408 movsd qword ptr [rsp + 8], xmm0 -;; 35: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 3b: f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] -;; 41: 660f2ec1 ucomisd xmm0, xmm1 -;; 45: b800000000 mov eax, 0 -;; 4a: 400f97c0 seta al -;; 4e: 4883c418 add rsp, 0x18 -;; 52: 5d pop rbp -;; 53: c3 ret -;; 54: 0000 add byte ptr [rax], al -;; 56: 0000 add byte ptr [rax], al +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f874c000000 ja 0x64 +;; 18: 4531db xor r11d, r11d +;; 4c895c2410 mov qword ptr [rsp + 0x10], r11 +;; 4c895c2408 mov qword ptr [rsp + 8], r11 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f100537000000 movsd xmm0, qword ptr [rip + 0x37] +;; f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 +;; f20f100531000000 movsd xmm0, qword ptr [rip + 0x31] +;; f20f11442408 movsd qword ptr [rsp + 8], xmm0 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] +;; 660f2ec1 ucomisd xmm0, xmm1 +;; b800000000 mov eax, 0 +;; 400f97c0 seta al +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 64: 0f0b ud2 +;; 66: 0000 add byte ptr [rax], al diff --git a/winch/filetests/filetests/x64/f64_lt/params.wat b/winch/filetests/filetests/x64/f64_lt/params.wat index 284f8bb77084..d856308decf6 100644 --- a/winch/filetests/filetests/x64/f64_lt/params.wat +++ b/winch/filetests/filetests/x64/f64_lt/params.wat @@ -7,17 +7,22 @@ (f64.lt) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 -;; e: f20f114c2408 movsd qword ptr [rsp + 8], xmm1 -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 1e: f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] -;; 24: 660f2ec1 ucomisd xmm0, xmm1 -;; 28: b800000000 mov eax, 0 -;; 2d: 400f97c0 seta al -;; 31: 4883c418 add rsp, 0x18 -;; 35: 5d pop rbp -;; 36: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872f000000 ja 0x47 +;; 18: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 +;; f20f114c2408 movsd qword ptr [rsp + 8], xmm1 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] +;; 660f2ec1 ucomisd xmm0, xmm1 +;; b800000000 mov eax, 0 +;; 400f97c0 seta al +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 47: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_max/const.wat b/winch/filetests/filetests/x64/f64_max/const.wat index 6f83eb06f607..65c730029400 100644 --- a/winch/filetests/filetests/x64/f64_max/const.wat +++ b/winch/filetests/filetests/x64/f64_max/const.wat @@ -7,31 +7,35 @@ (f64.max) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f20f10053c000000 movsd xmm0, qword ptr [rip + 0x3c] -;; 14: f20f100d3c000000 movsd xmm1, qword ptr [rip + 0x3c] -;; 1c: 660f2ec8 ucomisd xmm1, xmm0 -;; 20: 0f8519000000 jne 0x3f -;; 26: 0f8a09000000 jp 0x35 -;; 2c: 660f54c8 andpd xmm1, xmm0 -;; 30: e90e000000 jmp 0x43 -;; 35: f20f58c8 addsd xmm1, xmm0 -;; 39: 0f8a04000000 jp 0x43 -;; 3f: f20f5fc8 maxsd xmm1, xmm0 -;; 43: 660f28c1 movapd xmm0, xmm1 -;; 47: 4883c408 add rsp, 8 -;; 4b: 5d pop rbp -;; 4c: c3 ret -;; 4d: 0000 add byte ptr [rax], al -;; 4f: 009a99999999 add byte ptr [rdx - 0x66666667], bl -;; 55: 99 cdq -;; 56: 01409a add dword ptr [rax - 0x66], eax -;; 59: 99 cdq -;; 5a: 99 cdq -;; 5b: 99 cdq -;; 5c: 99 cdq -;; 5d: 99 cdq -;; 5e: f1 int1 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8745000000 ja 0x5d +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f20f10053c000000 movsd xmm0, qword ptr [rip + 0x3c] +;; f20f100d3c000000 movsd xmm1, qword ptr [rip + 0x3c] +;; 660f2ec8 ucomisd xmm1, xmm0 +;; 0f8519000000 jne 0x4f +;; 0f8a09000000 jp 0x45 +;; 3c: 660f54c8 andpd xmm1, xmm0 +;; e90e000000 jmp 0x53 +;; 45: f20f58c8 addsd xmm1, xmm0 +;; 0f8a04000000 jp 0x53 +;; 4f: f20f5fc8 maxsd xmm1, xmm0 +;; 660f28c1 movapd xmm0, xmm1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 5d: 0f0b ud2 +;; 5f: 009a99999999 add byte ptr [rdx - 0x66666667], bl +;; 65: 99 cdq +;; 66: 01409a add dword ptr [rax - 0x66], eax +;; 69: 99 cdq +;; 6a: 99 cdq +;; 6b: 99 cdq +;; 6c: 99 cdq +;; 6d: 99 cdq +;; 6e: f1 int1 diff --git a/winch/filetests/filetests/x64/f64_max/locals.wat b/winch/filetests/filetests/x64/f64_max/locals.wat index 9822729ffd67..212b4df08fd8 100644 --- a/winch/filetests/filetests/x64/f64_max/locals.wat +++ b/winch/filetests/filetests/x64/f64_max/locals.wat @@ -16,31 +16,35 @@ f64.max ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 4531db xor r11d, r11d -;; b: 4c895c2410 mov qword ptr [rsp + 0x10], r11 -;; 10: 4c895c2408 mov qword ptr [rsp + 8], r11 -;; 15: 4c893424 mov qword ptr [rsp], r14 -;; 19: f20f100557000000 movsd xmm0, qword ptr [rip + 0x57] -;; 21: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 -;; 27: f20f100551000000 movsd xmm0, qword ptr [rip + 0x51] -;; 2f: f20f11442408 movsd qword ptr [rsp + 8], xmm0 -;; 35: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 3b: f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] -;; 41: 660f2ec8 ucomisd xmm1, xmm0 -;; 45: 0f8519000000 jne 0x64 -;; 4b: 0f8a09000000 jp 0x5a -;; 51: 660f54c8 andpd xmm1, xmm0 -;; 55: e90e000000 jmp 0x68 -;; 5a: f20f58c8 addsd xmm1, xmm0 -;; 5e: 0f8a04000000 jp 0x68 -;; 64: f20f5fc8 maxsd xmm1, xmm0 -;; 68: 660f28c1 movapd xmm0, xmm1 -;; 6c: 4883c418 add rsp, 0x18 -;; 70: 5d pop rbp -;; 71: c3 ret -;; 72: 0000 add byte ptr [rax], al -;; 74: 0000 add byte ptr [rax], al -;; 76: 0000 add byte ptr [rax], al +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f876a000000 ja 0x82 +;; 18: 4531db xor r11d, r11d +;; 4c895c2410 mov qword ptr [rsp + 0x10], r11 +;; 4c895c2408 mov qword ptr [rsp + 8], r11 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f100557000000 movsd xmm0, qword ptr [rip + 0x57] +;; f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 +;; f20f100551000000 movsd xmm0, qword ptr [rip + 0x51] +;; f20f11442408 movsd qword ptr [rsp + 8], xmm0 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] +;; 660f2ec8 ucomisd xmm1, xmm0 +;; 0f8519000000 jne 0x74 +;; 0f8a09000000 jp 0x6a +;; 61: 660f54c8 andpd xmm1, xmm0 +;; e90e000000 jmp 0x78 +;; 6a: f20f58c8 addsd xmm1, xmm0 +;; 0f8a04000000 jp 0x78 +;; 74: f20f5fc8 maxsd xmm1, xmm0 +;; 660f28c1 movapd xmm0, xmm1 +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 82: 0f0b ud2 +;; 84: 0000 add byte ptr [rax], al +;; 86: 0000 add byte ptr [rax], al diff --git a/winch/filetests/filetests/x64/f64_max/params.wat b/winch/filetests/filetests/x64/f64_max/params.wat index c7a97a58d99d..a5202e8b7430 100644 --- a/winch/filetests/filetests/x64/f64_max/params.wat +++ b/winch/filetests/filetests/x64/f64_max/params.wat @@ -7,23 +7,28 @@ (f64.max) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 -;; e: f20f114c2408 movsd qword ptr [rsp + 8], xmm1 -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 1e: f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] -;; 24: 660f2ec8 ucomisd xmm1, xmm0 -;; 28: 0f8519000000 jne 0x47 -;; 2e: 0f8a09000000 jp 0x3d -;; 34: 660f54c8 andpd xmm1, xmm0 -;; 38: e90e000000 jmp 0x4b -;; 3d: f20f58c8 addsd xmm1, xmm0 -;; 41: 0f8a04000000 jp 0x4b -;; 47: f20f5fc8 maxsd xmm1, xmm0 -;; 4b: 660f28c1 movapd xmm0, xmm1 -;; 4f: 4883c418 add rsp, 0x18 -;; 53: 5d pop rbp -;; 54: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f874d000000 ja 0x65 +;; 18: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 +;; f20f114c2408 movsd qword ptr [rsp + 8], xmm1 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] +;; 660f2ec8 ucomisd xmm1, xmm0 +;; 0f8519000000 jne 0x57 +;; 0f8a09000000 jp 0x4d +;; 44: 660f54c8 andpd xmm1, xmm0 +;; e90e000000 jmp 0x5b +;; 4d: f20f58c8 addsd xmm1, xmm0 +;; 0f8a04000000 jp 0x5b +;; 57: f20f5fc8 maxsd xmm1, xmm0 +;; 660f28c1 movapd xmm0, xmm1 +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 65: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_min/const.wat b/winch/filetests/filetests/x64/f64_min/const.wat index 2711f73b6187..6a0223a7c589 100644 --- a/winch/filetests/filetests/x64/f64_min/const.wat +++ b/winch/filetests/filetests/x64/f64_min/const.wat @@ -7,31 +7,35 @@ (f64.min) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f20f10053c000000 movsd xmm0, qword ptr [rip + 0x3c] -;; 14: f20f100d3c000000 movsd xmm1, qword ptr [rip + 0x3c] -;; 1c: 660f2ec8 ucomisd xmm1, xmm0 -;; 20: 0f8519000000 jne 0x3f -;; 26: 0f8a09000000 jp 0x35 -;; 2c: 660f56c8 orpd xmm1, xmm0 -;; 30: e90e000000 jmp 0x43 -;; 35: f20f58c8 addsd xmm1, xmm0 -;; 39: 0f8a04000000 jp 0x43 -;; 3f: f20f5dc8 minsd xmm1, xmm0 -;; 43: 660f28c1 movapd xmm0, xmm1 -;; 47: 4883c408 add rsp, 8 -;; 4b: 5d pop rbp -;; 4c: c3 ret -;; 4d: 0000 add byte ptr [rax], al -;; 4f: 009a99999999 add byte ptr [rdx - 0x66666667], bl -;; 55: 99 cdq -;; 56: 01409a add dword ptr [rax - 0x66], eax -;; 59: 99 cdq -;; 5a: 99 cdq -;; 5b: 99 cdq -;; 5c: 99 cdq -;; 5d: 99 cdq -;; 5e: f1 int1 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8745000000 ja 0x5d +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f20f10053c000000 movsd xmm0, qword ptr [rip + 0x3c] +;; f20f100d3c000000 movsd xmm1, qword ptr [rip + 0x3c] +;; 660f2ec8 ucomisd xmm1, xmm0 +;; 0f8519000000 jne 0x4f +;; 0f8a09000000 jp 0x45 +;; 3c: 660f56c8 orpd xmm1, xmm0 +;; e90e000000 jmp 0x53 +;; 45: f20f58c8 addsd xmm1, xmm0 +;; 0f8a04000000 jp 0x53 +;; 4f: f20f5dc8 minsd xmm1, xmm0 +;; 660f28c1 movapd xmm0, xmm1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 5d: 0f0b ud2 +;; 5f: 009a99999999 add byte ptr [rdx - 0x66666667], bl +;; 65: 99 cdq +;; 66: 01409a add dword ptr [rax - 0x66], eax +;; 69: 99 cdq +;; 6a: 99 cdq +;; 6b: 99 cdq +;; 6c: 99 cdq +;; 6d: 99 cdq +;; 6e: f1 int1 diff --git a/winch/filetests/filetests/x64/f64_min/locals.wat b/winch/filetests/filetests/x64/f64_min/locals.wat index 46409ead152d..96163c82ec1c 100644 --- a/winch/filetests/filetests/x64/f64_min/locals.wat +++ b/winch/filetests/filetests/x64/f64_min/locals.wat @@ -16,31 +16,35 @@ f64.min ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 4531db xor r11d, r11d -;; b: 4c895c2410 mov qword ptr [rsp + 0x10], r11 -;; 10: 4c895c2408 mov qword ptr [rsp + 8], r11 -;; 15: 4c893424 mov qword ptr [rsp], r14 -;; 19: f20f100557000000 movsd xmm0, qword ptr [rip + 0x57] -;; 21: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 -;; 27: f20f100551000000 movsd xmm0, qword ptr [rip + 0x51] -;; 2f: f20f11442408 movsd qword ptr [rsp + 8], xmm0 -;; 35: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 3b: f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] -;; 41: 660f2ec8 ucomisd xmm1, xmm0 -;; 45: 0f8519000000 jne 0x64 -;; 4b: 0f8a09000000 jp 0x5a -;; 51: 660f56c8 orpd xmm1, xmm0 -;; 55: e90e000000 jmp 0x68 -;; 5a: f20f58c8 addsd xmm1, xmm0 -;; 5e: 0f8a04000000 jp 0x68 -;; 64: f20f5dc8 minsd xmm1, xmm0 -;; 68: 660f28c1 movapd xmm0, xmm1 -;; 6c: 4883c418 add rsp, 0x18 -;; 70: 5d pop rbp -;; 71: c3 ret -;; 72: 0000 add byte ptr [rax], al -;; 74: 0000 add byte ptr [rax], al -;; 76: 0000 add byte ptr [rax], al +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f876a000000 ja 0x82 +;; 18: 4531db xor r11d, r11d +;; 4c895c2410 mov qword ptr [rsp + 0x10], r11 +;; 4c895c2408 mov qword ptr [rsp + 8], r11 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f100557000000 movsd xmm0, qword ptr [rip + 0x57] +;; f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 +;; f20f100551000000 movsd xmm0, qword ptr [rip + 0x51] +;; f20f11442408 movsd qword ptr [rsp + 8], xmm0 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] +;; 660f2ec8 ucomisd xmm1, xmm0 +;; 0f8519000000 jne 0x74 +;; 0f8a09000000 jp 0x6a +;; 61: 660f56c8 orpd xmm1, xmm0 +;; e90e000000 jmp 0x78 +;; 6a: f20f58c8 addsd xmm1, xmm0 +;; 0f8a04000000 jp 0x78 +;; 74: f20f5dc8 minsd xmm1, xmm0 +;; 660f28c1 movapd xmm0, xmm1 +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 82: 0f0b ud2 +;; 84: 0000 add byte ptr [rax], al +;; 86: 0000 add byte ptr [rax], al diff --git a/winch/filetests/filetests/x64/f64_min/params.wat b/winch/filetests/filetests/x64/f64_min/params.wat index 98f5f35bd163..03279576e4f3 100644 --- a/winch/filetests/filetests/x64/f64_min/params.wat +++ b/winch/filetests/filetests/x64/f64_min/params.wat @@ -7,23 +7,28 @@ (f64.min) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 -;; e: f20f114c2408 movsd qword ptr [rsp + 8], xmm1 -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 1e: f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] -;; 24: 660f2ec8 ucomisd xmm1, xmm0 -;; 28: 0f8519000000 jne 0x47 -;; 2e: 0f8a09000000 jp 0x3d -;; 34: 660f56c8 orpd xmm1, xmm0 -;; 38: e90e000000 jmp 0x4b -;; 3d: f20f58c8 addsd xmm1, xmm0 -;; 41: 0f8a04000000 jp 0x4b -;; 47: f20f5dc8 minsd xmm1, xmm0 -;; 4b: 660f28c1 movapd xmm0, xmm1 -;; 4f: 4883c418 add rsp, 0x18 -;; 53: 5d pop rbp -;; 54: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f874d000000 ja 0x65 +;; 18: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 +;; f20f114c2408 movsd qword ptr [rsp + 8], xmm1 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] +;; 660f2ec8 ucomisd xmm1, xmm0 +;; 0f8519000000 jne 0x57 +;; 0f8a09000000 jp 0x4d +;; 44: 660f56c8 orpd xmm1, xmm0 +;; e90e000000 jmp 0x5b +;; 4d: f20f58c8 addsd xmm1, xmm0 +;; 0f8a04000000 jp 0x5b +;; 57: f20f5dc8 minsd xmm1, xmm0 +;; 660f28c1 movapd xmm0, xmm1 +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 65: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_mul/const.wat b/winch/filetests/filetests/x64/f64_mul/const.wat index 7fb68dc1359e..b02a430b34ea 100644 --- a/winch/filetests/filetests/x64/f64_mul/const.wat +++ b/winch/filetests/filetests/x64/f64_mul/const.wat @@ -7,17 +7,21 @@ (f64.mul) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f20f10051c000000 movsd xmm0, qword ptr [rip + 0x1c] -;; 14: f20f100d1c000000 movsd xmm1, qword ptr [rip + 0x1c] -;; 1c: f20f59c8 mulsd xmm1, xmm0 -;; 20: 660f28c1 movapd xmm0, xmm1 -;; 24: 4883c408 add rsp, 8 -;; 28: 5d pop rbp -;; 29: c3 ret -;; 2a: 0000 add byte ptr [rax], al -;; 2c: 0000 add byte ptr [rax], al -;; 2e: 0000 add byte ptr [rax], al +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8722000000 ja 0x3a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f20f10051c000000 movsd xmm0, qword ptr [rip + 0x1c] +;; f20f100d1c000000 movsd xmm1, qword ptr [rip + 0x1c] +;; f20f59c8 mulsd xmm1, xmm0 +;; 660f28c1 movapd xmm0, xmm1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 3a: 0f0b ud2 +;; 3c: 0000 add byte ptr [rax], al +;; 3e: 0000 add byte ptr [rax], al diff --git a/winch/filetests/filetests/x64/f64_mul/locals.wat b/winch/filetests/filetests/x64/f64_mul/locals.wat index 1f82a81a6695..1ab5443df778 100644 --- a/winch/filetests/filetests/x64/f64_mul/locals.wat +++ b/winch/filetests/filetests/x64/f64_mul/locals.wat @@ -16,24 +16,32 @@ f64.mul ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 4531db xor r11d, r11d -;; b: 4c895c2410 mov qword ptr [rsp + 0x10], r11 -;; 10: 4c895c2408 mov qword ptr [rsp + 8], r11 -;; 15: 4c893424 mov qword ptr [rsp], r14 -;; 19: f20f10052f000000 movsd xmm0, qword ptr [rip + 0x2f] -;; 21: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 -;; 27: f20f100529000000 movsd xmm0, qword ptr [rip + 0x29] -;; 2f: f20f11442408 movsd qword ptr [rsp + 8], xmm0 -;; 35: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 3b: f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] -;; 41: f20f59c8 mulsd xmm1, xmm0 -;; 45: 660f28c1 movapd xmm0, xmm1 -;; 49: 4883c418 add rsp, 0x18 -;; 4d: 5d pop rbp -;; 4e: c3 ret -;; 4f: 009a99999999 add byte ptr [rdx - 0x66666667], bl -;; 55: 99 cdq -;; 56: f1 int1 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8747000000 ja 0x5f +;; 18: 4531db xor r11d, r11d +;; 4c895c2410 mov qword ptr [rsp + 0x10], r11 +;; 4c895c2408 mov qword ptr [rsp + 8], r11 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f100537000000 movsd xmm0, qword ptr [rip + 0x37] +;; f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 +;; f20f100531000000 movsd xmm0, qword ptr [rip + 0x31] +;; f20f11442408 movsd qword ptr [rsp + 8], xmm0 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] +;; f20f59c8 mulsd xmm1, xmm0 +;; 660f28c1 movapd xmm0, xmm1 +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 5f: 0f0b ud2 +;; 61: 0000 add byte ptr [rax], al +;; 63: 0000 add byte ptr [rax], al +;; 65: 0000 add byte ptr [rax], al +;; 67: 009a99999999 add byte ptr [rdx - 0x66666667], bl +;; 6d: 99 cdq +;; 6e: f1 int1 diff --git a/winch/filetests/filetests/x64/f64_mul/params.wat b/winch/filetests/filetests/x64/f64_mul/params.wat index e927a9333022..8fa12a618583 100644 --- a/winch/filetests/filetests/x64/f64_mul/params.wat +++ b/winch/filetests/filetests/x64/f64_mul/params.wat @@ -7,16 +7,21 @@ (f64.mul) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 -;; e: f20f114c2408 movsd qword ptr [rsp + 8], xmm1 -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 1e: f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] -;; 24: f20f59c8 mulsd xmm1, xmm0 -;; 28: 660f28c1 movapd xmm0, xmm1 -;; 2c: 4883c418 add rsp, 0x18 -;; 30: 5d pop rbp -;; 31: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872a000000 ja 0x42 +;; 18: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 +;; f20f114c2408 movsd qword ptr [rsp + 8], xmm1 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] +;; f20f59c8 mulsd xmm1, xmm0 +;; 660f28c1 movapd xmm0, xmm1 +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 42: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_ne/const.wat b/winch/filetests/filetests/x64/f64_ne/const.wat index 8ba744d9a9dd..fdbd0050c493 100644 --- a/winch/filetests/filetests/x64/f64_ne/const.wat +++ b/winch/filetests/filetests/x64/f64_ne/const.wat @@ -7,20 +7,24 @@ (f64.ne) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f20f10052c000000 movsd xmm0, qword ptr [rip + 0x2c] -;; 14: f20f100d2c000000 movsd xmm1, qword ptr [rip + 0x2c] -;; 1c: 660f2ec8 ucomisd xmm1, xmm0 -;; 20: b800000000 mov eax, 0 -;; 25: 400f95c0 setne al -;; 29: 41bb00000000 mov r11d, 0 -;; 2f: 410f9ac3 setp r11b -;; 33: 4c09d8 or rax, r11 -;; 36: 4883c408 add rsp, 8 -;; 3a: 5d pop rbp -;; 3b: c3 ret -;; 3c: 0000 add byte ptr [rax], al -;; 3e: 0000 add byte ptr [rax], al +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8734000000 ja 0x4c +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f20f10052c000000 movsd xmm0, qword ptr [rip + 0x2c] +;; f20f100d2c000000 movsd xmm1, qword ptr [rip + 0x2c] +;; 660f2ec8 ucomisd xmm1, xmm0 +;; b800000000 mov eax, 0 +;; 400f95c0 setne al +;; 41bb00000000 mov r11d, 0 +;; 410f9ac3 setp r11b +;; 4c09d8 or rax, r11 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 4c: 0f0b ud2 +;; 4e: 0000 add byte ptr [rax], al diff --git a/winch/filetests/filetests/x64/f64_ne/locals.wat b/winch/filetests/filetests/x64/f64_ne/locals.wat index 2c0253f843ff..057cc351f1c7 100644 --- a/winch/filetests/filetests/x64/f64_ne/locals.wat +++ b/winch/filetests/filetests/x64/f64_ne/locals.wat @@ -16,31 +16,35 @@ f64.ne ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 4531db xor r11d, r11d -;; b: 4c895c2410 mov qword ptr [rsp + 0x10], r11 -;; 10: 4c895c2408 mov qword ptr [rsp + 8], r11 -;; 15: 4c893424 mov qword ptr [rsp], r14 -;; 19: f20f100547000000 movsd xmm0, qword ptr [rip + 0x47] -;; 21: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 -;; 27: f20f100541000000 movsd xmm0, qword ptr [rip + 0x41] -;; 2f: f20f11442408 movsd qword ptr [rsp + 8], xmm0 -;; 35: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 3b: f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] -;; 41: 660f2ec8 ucomisd xmm1, xmm0 -;; 45: b800000000 mov eax, 0 -;; 4a: 400f95c0 setne al -;; 4e: 41bb00000000 mov r11d, 0 -;; 54: 410f9ac3 setp r11b -;; 58: 4c09d8 or rax, r11 -;; 5b: 4883c418 add rsp, 0x18 -;; 5f: 5d pop rbp -;; 60: c3 ret -;; 61: 0000 add byte ptr [rax], al -;; 63: 0000 add byte ptr [rax], al -;; 65: 0000 add byte ptr [rax], al -;; 67: 009a99999999 add byte ptr [rdx - 0x66666667], bl -;; 6d: 99 cdq -;; 6e: f1 int1 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8759000000 ja 0x71 +;; 18: 4531db xor r11d, r11d +;; 4c895c2410 mov qword ptr [rsp + 0x10], r11 +;; 4c895c2408 mov qword ptr [rsp + 8], r11 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f100547000000 movsd xmm0, qword ptr [rip + 0x47] +;; f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 +;; f20f100541000000 movsd xmm0, qword ptr [rip + 0x41] +;; f20f11442408 movsd qword ptr [rsp + 8], xmm0 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] +;; 660f2ec8 ucomisd xmm1, xmm0 +;; b800000000 mov eax, 0 +;; 400f95c0 setne al +;; 41bb00000000 mov r11d, 0 +;; 410f9ac3 setp r11b +;; 4c09d8 or rax, r11 +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 71: 0f0b ud2 +;; 73: 0000 add byte ptr [rax], al +;; 75: 0000 add byte ptr [rax], al +;; 77: 009a99999999 add byte ptr [rdx - 0x66666667], bl +;; 7d: 99 cdq +;; 7e: f1 int1 diff --git a/winch/filetests/filetests/x64/f64_ne/params.wat b/winch/filetests/filetests/x64/f64_ne/params.wat index 2898773c1689..b68599f3c163 100644 --- a/winch/filetests/filetests/x64/f64_ne/params.wat +++ b/winch/filetests/filetests/x64/f64_ne/params.wat @@ -7,20 +7,25 @@ (f64.ne) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 -;; e: f20f114c2408 movsd qword ptr [rsp + 8], xmm1 -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 1e: f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] -;; 24: 660f2ec8 ucomisd xmm1, xmm0 -;; 28: b800000000 mov eax, 0 -;; 2d: 400f95c0 setne al -;; 31: 41bb00000000 mov r11d, 0 -;; 37: 410f9ac3 setp r11b -;; 3b: 4c09d8 or rax, r11 -;; 3e: 4883c418 add rsp, 0x18 -;; 42: 5d pop rbp -;; 43: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f873c000000 ja 0x54 +;; 18: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 +;; f20f114c2408 movsd qword ptr [rsp + 8], xmm1 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] +;; 660f2ec8 ucomisd xmm1, xmm0 +;; b800000000 mov eax, 0 +;; 400f95c0 setne al +;; 41bb00000000 mov r11d, 0 +;; 410f9ac3 setp r11b +;; 4c09d8 or rax, r11 +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 54: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_nearest/f64_nearest_const_sse41.wat b/winch/filetests/filetests/x64/f64_nearest/f64_nearest_const_sse41.wat index 7c5b7ea4fd42..27c170beebd2 100644 --- a/winch/filetests/filetests/x64/f64_nearest/f64_nearest_const_sse41.wat +++ b/winch/filetests/filetests/x64/f64_nearest/f64_nearest_const_sse41.wat @@ -7,12 +7,20 @@ (f64.nearest) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f20f10050c000000 movsd xmm0, qword ptr [rip + 0xc] -;; 14: 660f3a0bc000 roundsd xmm0, xmm0, 0 -;; 1a: 4883c408 add rsp, 8 -;; 1e: 5d pop rbp -;; 1f: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8718000000 ja 0x30 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f20f100514000000 movsd xmm0, qword ptr [rip + 0x14] +;; 660f3a0bc000 roundsd xmm0, xmm0, 0 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 30: 0f0b ud2 +;; 32: 0000 add byte ptr [rax], al +;; 34: 0000 add byte ptr [rax], al +;; 36: 0000 add byte ptr [rax], al diff --git a/winch/filetests/filetests/x64/f64_nearest/f64_nearest_param.wat b/winch/filetests/filetests/x64/f64_nearest/f64_nearest_param.wat index 7e957c10612b..d4a1e0182247 100644 --- a/winch/filetests/filetests/x64/f64_nearest/f64_nearest_param.wat +++ b/winch/filetests/filetests/x64/f64_nearest/f64_nearest_param.wat @@ -6,13 +6,24 @@ (f64.nearest) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f20f11442408 movsd qword ptr [rsp + 8], xmm0 -;; e: 4c893424 mov qword ptr [rsp], r14 -;; 12: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 18: e800000000 call 0x1d -;; 1d: 4883c410 add rsp, 0x10 -;; 21: 5d pop rbp -;; 22: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8738000000 ja 0x50 +;; 18: f20f11442408 movsd qword ptr [rsp + 8], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f2440f107c2408 movsd xmm15, qword ptr [rsp + 8] +;; 4883ec08 sub rsp, 8 +;; f2440f113c24 movsd qword ptr [rsp], xmm15 +;; 4883ec08 sub rsp, 8 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; e800000000 call 0x42 +;; 4883c408 add rsp, 8 +;; 4883c408 add rsp, 8 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 50: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_nearest/f64_nearest_param_sse41.wat b/winch/filetests/filetests/x64/f64_nearest/f64_nearest_param_sse41.wat index bd752b1d996b..f44d5463fbad 100644 --- a/winch/filetests/filetests/x64/f64_nearest/f64_nearest_param_sse41.wat +++ b/winch/filetests/filetests/x64/f64_nearest/f64_nearest_param_sse41.wat @@ -7,13 +7,18 @@ (f64.nearest) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f20f11442408 movsd qword ptr [rsp + 8], xmm0 -;; e: 4c893424 mov qword ptr [rsp], r14 -;; 12: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 18: 660f3a0bc000 roundsd xmm0, xmm0, 0 -;; 1e: 4883c410 add rsp, 0x10 -;; 22: 5d pop rbp -;; 23: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871c000000 ja 0x34 +;; 18: f20f11442408 movsd qword ptr [rsp + 8], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; 660f3a0bc000 roundsd xmm0, xmm0, 0 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 34: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_neg/f64_neg_const.wat b/winch/filetests/filetests/x64/f64_neg/f64_neg_const.wat index 41046ab377bc..c09a0098e587 100644 --- a/winch/filetests/filetests/x64/f64_neg/f64_neg_const.wat +++ b/winch/filetests/filetests/x64/f64_neg/f64_neg_const.wat @@ -6,16 +6,20 @@ (f64.neg) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f20f10051c000000 movsd xmm0, qword ptr [rip + 0x1c] -;; 14: 49bb0000000000000080 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8726000000 ja 0x3e +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f20f10051c000000 movsd xmm0, qword ptr [rip + 0x1c] +;; 49bb0000000000000080 ;; movabs r11, 0x8000000000000000 -;; 1e: 664d0f6efb movq xmm15, r11 -;; 23: 66410f57c7 xorpd xmm0, xmm15 -;; 28: 4883c408 add rsp, 8 -;; 2c: 5d pop rbp -;; 2d: c3 ret -;; 2e: 0000 add byte ptr [rax], al +;; 664d0f6efb movq xmm15, r11 +;; 66410f57c7 xorpd xmm0, xmm15 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 3e: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_neg/f64_neg_param.wat b/winch/filetests/filetests/x64/f64_neg/f64_neg_param.wat index 96c9b0fdce85..e99307d3c254 100644 --- a/winch/filetests/filetests/x64/f64_neg/f64_neg_param.wat +++ b/winch/filetests/filetests/x64/f64_neg/f64_neg_param.wat @@ -6,16 +6,21 @@ (f64.neg) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f20f11442408 movsd qword ptr [rsp + 8], xmm0 -;; e: 4c893424 mov qword ptr [rsp], r14 -;; 12: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 18: 49bb0000000000000080 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872a000000 ja 0x42 +;; 18: f20f11442408 movsd qword ptr [rsp + 8], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; 49bb0000000000000080 ;; movabs r11, 0x8000000000000000 -;; 22: 664d0f6efb movq xmm15, r11 -;; 27: 66410f57c7 xorpd xmm0, xmm15 -;; 2c: 4883c410 add rsp, 0x10 -;; 30: 5d pop rbp -;; 31: c3 ret +;; 664d0f6efb movq xmm15, r11 +;; 66410f57c7 xorpd xmm0, xmm15 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 42: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_promote_f32/const.wat b/winch/filetests/filetests/x64/f64_promote_f32/const.wat new file mode 100644 index 000000000000..156640661ce5 --- /dev/null +++ b/winch/filetests/filetests/x64/f64_promote_f32/const.wat @@ -0,0 +1,23 @@ +;;! target = "x86_64" + +(module + (func (result f64) + (f32.const 1.0) + (f64.promote_f32) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8716000000 ja 0x2e +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f30f10050c000000 movss xmm0, dword ptr [rip + 0xc] +;; f30f5ac0 cvtss2sd xmm0, xmm0 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2e: 0f0b ud2 +;; 30: 0000 add byte ptr [rax], al diff --git a/winch/filetests/filetests/x64/f64_promote_f32/locals.wat b/winch/filetests/filetests/x64/f64_promote_f32/locals.wat new file mode 100644 index 000000000000..404329dc3166 --- /dev/null +++ b/winch/filetests/filetests/x64/f64_promote_f32/locals.wat @@ -0,0 +1,26 @@ +;;! target = "x86_64" + +(module + (func (result f64) + (local f32) + + (local.get 0) + (f64.promote_f32) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871d000000 ja 0x35 +;; 18: 48c744240800000000 +;; mov qword ptr [rsp + 8], 0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f1044240c movss xmm0, dword ptr [rsp + 0xc] +;; f30f5ac0 cvtss2sd xmm0, xmm0 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 35: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_promote_f32/params.wat b/winch/filetests/filetests/x64/f64_promote_f32/params.wat new file mode 100644 index 000000000000..77cbd4ea3459 --- /dev/null +++ b/winch/filetests/filetests/x64/f64_promote_f32/params.wat @@ -0,0 +1,23 @@ +;;! target = "x86_64" + +(module + (func (param f32) (result f64) + (local.get 0) + (f64.promote_f32) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871a000000 ja 0x32 +;; 18: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f1044240c movss xmm0, dword ptr [rsp + 0xc] +;; f30f5ac0 cvtss2sd xmm0, xmm0 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 32: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_promote_f32/spilled.wat b/winch/filetests/filetests/x64/f64_promote_f32/spilled.wat new file mode 100644 index 000000000000..977669ff3e3c --- /dev/null +++ b/winch/filetests/filetests/x64/f64_promote_f32/spilled.wat @@ -0,0 +1,32 @@ +;;! target = "x86_64" + +(module + (func (result f64) + f32.const 1.0 + f64.promote_f32 + block + end + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8728000000 ja 0x40 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f30f100524000000 movss xmm0, dword ptr [rip + 0x24] +;; f30f5ac0 cvtss2sd xmm0, xmm0 +;; 4883ec08 sub rsp, 8 +;; f20f110424 movsd qword ptr [rsp], xmm0 +;; f20f100424 movsd xmm0, qword ptr [rsp] +;; 4883c408 add rsp, 8 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 40: 0f0b ud2 +;; 42: 0000 add byte ptr [rax], al +;; 44: 0000 add byte ptr [rax], al +;; 46: 0000 add byte ptr [rax], al +;; 48: 0000 add byte ptr [rax], al diff --git a/winch/filetests/filetests/x64/f64_reinterpret_i64/const.wat b/winch/filetests/filetests/x64/f64_reinterpret_i64/const.wat new file mode 100644 index 000000000000..0b0e42833012 --- /dev/null +++ b/winch/filetests/filetests/x64/f64_reinterpret_i64/const.wat @@ -0,0 +1,22 @@ +;;! target = "x86_64" + +(module + (func (result f64) + (i64.const 1) + (f64.reinterpret_i64) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8716000000 ja 0x2e +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; 66480f6ec0 movq xmm0, rax +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2e: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_reinterpret_i64/locals.wat b/winch/filetests/filetests/x64/f64_reinterpret_i64/locals.wat new file mode 100644 index 000000000000..c7d335bc35a4 --- /dev/null +++ b/winch/filetests/filetests/x64/f64_reinterpret_i64/locals.wat @@ -0,0 +1,26 @@ +;;! target = "x86_64" + +(module + (func (result f64) + (local i64) + + (local.get 0) + (f64.reinterpret_i64) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871d000000 ja 0x35 +;; 18: 48c744240800000000 +;; mov qword ptr [rsp + 8], 0 +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 66480f6ec0 movq xmm0, rax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 35: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_reinterpret_i64/params.wat b/winch/filetests/filetests/x64/f64_reinterpret_i64/params.wat new file mode 100644 index 000000000000..25582d19deb5 --- /dev/null +++ b/winch/filetests/filetests/x64/f64_reinterpret_i64/params.wat @@ -0,0 +1,23 @@ +;;! target = "x86_64" + +(module + (func (param i64) (result f64) + (local.get 0) + (f64.reinterpret_i64) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8719000000 ja 0x31 +;; 18: 48897c2408 mov qword ptr [rsp + 8], rdi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 66480f6ec0 movq xmm0, rax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 31: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_reinterpret_i64/ret_int.wat b/winch/filetests/filetests/x64/f64_reinterpret_i64/ret_int.wat new file mode 100644 index 000000000000..138622ed79b2 --- /dev/null +++ b/winch/filetests/filetests/x64/f64_reinterpret_i64/ret_int.wat @@ -0,0 +1,25 @@ +;;! target = "x86_64" + +(module + (func (result i64) + i64.const 1 + f64.reinterpret_i64 + drop + i64.const 1 + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871d000000 ja 0x35 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; 66480f6ec0 movq xmm0, rax +;; 48c7c001000000 mov rax, 1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 35: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_reinterpret_i64/spilled.wat b/winch/filetests/filetests/x64/f64_reinterpret_i64/spilled.wat new file mode 100644 index 000000000000..573c1a9e4660 --- /dev/null +++ b/winch/filetests/filetests/x64/f64_reinterpret_i64/spilled.wat @@ -0,0 +1,28 @@ +;;! target = "x86_64" + +(module + (func (result f64) + i64.const 1 + f64.reinterpret_i64 + block + end + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8728000000 ja 0x40 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; 66480f6ec0 movq xmm0, rax +;; 4883ec08 sub rsp, 8 +;; f20f110424 movsd qword ptr [rsp], xmm0 +;; f20f100424 movsd xmm0, qword ptr [rsp] +;; 4883c408 add rsp, 8 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 40: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_sqrt/f64_sqrt_const.wat b/winch/filetests/filetests/x64/f64_sqrt/f64_sqrt_const.wat index 0b70b08850bc..fa351d2dffa5 100644 --- a/winch/filetests/filetests/x64/f64_sqrt/f64_sqrt_const.wat +++ b/winch/filetests/filetests/x64/f64_sqrt/f64_sqrt_const.wat @@ -6,13 +6,17 @@ (f64.sqrt) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f20f10050c000000 movsd xmm0, qword ptr [rip + 0xc] -;; 14: f20f51c0 sqrtsd xmm0, xmm0 -;; 18: 4883c408 add rsp, 8 -;; 1c: 5d pop rbp -;; 1d: c3 ret -;; 1e: 0000 add byte ptr [rax], al +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8716000000 ja 0x2e +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f20f10050c000000 movsd xmm0, qword ptr [rip + 0xc] +;; f20f51c0 sqrtsd xmm0, xmm0 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2e: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_sqrt/f64_sqrt_param.wat b/winch/filetests/filetests/x64/f64_sqrt/f64_sqrt_param.wat index 9b06a96375f9..17b865d3a59f 100644 --- a/winch/filetests/filetests/x64/f64_sqrt/f64_sqrt_param.wat +++ b/winch/filetests/filetests/x64/f64_sqrt/f64_sqrt_param.wat @@ -6,13 +6,18 @@ (f64.sqrt) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f20f11442408 movsd qword ptr [rsp + 8], xmm0 -;; e: 4c893424 mov qword ptr [rsp], r14 -;; 12: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 18: f20f51c0 sqrtsd xmm0, xmm0 -;; 1c: 4883c410 add rsp, 0x10 -;; 20: 5d pop rbp -;; 21: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871a000000 ja 0x32 +;; 18: f20f11442408 movsd qword ptr [rsp + 8], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; f20f51c0 sqrtsd xmm0, xmm0 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 32: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_sub/const.wat b/winch/filetests/filetests/x64/f64_sub/const.wat index ede4b5957040..7d7ef39693c8 100644 --- a/winch/filetests/filetests/x64/f64_sub/const.wat +++ b/winch/filetests/filetests/x64/f64_sub/const.wat @@ -7,17 +7,21 @@ (f64.sub) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f20f10051c000000 movsd xmm0, qword ptr [rip + 0x1c] -;; 14: f20f100d1c000000 movsd xmm1, qword ptr [rip + 0x1c] -;; 1c: f20f5cc8 subsd xmm1, xmm0 -;; 20: 660f28c1 movapd xmm0, xmm1 -;; 24: 4883c408 add rsp, 8 -;; 28: 5d pop rbp -;; 29: c3 ret -;; 2a: 0000 add byte ptr [rax], al -;; 2c: 0000 add byte ptr [rax], al -;; 2e: 0000 add byte ptr [rax], al +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8722000000 ja 0x3a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f20f10051c000000 movsd xmm0, qword ptr [rip + 0x1c] +;; f20f100d1c000000 movsd xmm1, qword ptr [rip + 0x1c] +;; f20f5cc8 subsd xmm1, xmm0 +;; 660f28c1 movapd xmm0, xmm1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 3a: 0f0b ud2 +;; 3c: 0000 add byte ptr [rax], al +;; 3e: 0000 add byte ptr [rax], al diff --git a/winch/filetests/filetests/x64/f64_sub/locals.wat b/winch/filetests/filetests/x64/f64_sub/locals.wat index d5a53faf352c..89c6e3e6c5fc 100644 --- a/winch/filetests/filetests/x64/f64_sub/locals.wat +++ b/winch/filetests/filetests/x64/f64_sub/locals.wat @@ -16,24 +16,32 @@ f64.sub ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 4531db xor r11d, r11d -;; b: 4c895c2410 mov qword ptr [rsp + 0x10], r11 -;; 10: 4c895c2408 mov qword ptr [rsp + 8], r11 -;; 15: 4c893424 mov qword ptr [rsp], r14 -;; 19: f20f10052f000000 movsd xmm0, qword ptr [rip + 0x2f] -;; 21: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 -;; 27: f20f100529000000 movsd xmm0, qword ptr [rip + 0x29] -;; 2f: f20f11442408 movsd qword ptr [rsp + 8], xmm0 -;; 35: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 3b: f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] -;; 41: f20f5cc8 subsd xmm1, xmm0 -;; 45: 660f28c1 movapd xmm0, xmm1 -;; 49: 4883c418 add rsp, 0x18 -;; 4d: 5d pop rbp -;; 4e: c3 ret -;; 4f: 009a99999999 add byte ptr [rdx - 0x66666667], bl -;; 55: 99 cdq -;; 56: f1 int1 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8747000000 ja 0x5f +;; 18: 4531db xor r11d, r11d +;; 4c895c2410 mov qword ptr [rsp + 0x10], r11 +;; 4c895c2408 mov qword ptr [rsp + 8], r11 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f100537000000 movsd xmm0, qword ptr [rip + 0x37] +;; f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 +;; f20f100531000000 movsd xmm0, qword ptr [rip + 0x31] +;; f20f11442408 movsd qword ptr [rsp + 8], xmm0 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] +;; f20f5cc8 subsd xmm1, xmm0 +;; 660f28c1 movapd xmm0, xmm1 +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 5f: 0f0b ud2 +;; 61: 0000 add byte ptr [rax], al +;; 63: 0000 add byte ptr [rax], al +;; 65: 0000 add byte ptr [rax], al +;; 67: 009a99999999 add byte ptr [rdx - 0x66666667], bl +;; 6d: 99 cdq +;; 6e: f1 int1 diff --git a/winch/filetests/filetests/x64/f64_sub/params.wat b/winch/filetests/filetests/x64/f64_sub/params.wat index 28a7cff80dd4..98597d457b6d 100644 --- a/winch/filetests/filetests/x64/f64_sub/params.wat +++ b/winch/filetests/filetests/x64/f64_sub/params.wat @@ -7,16 +7,21 @@ (f64.sub) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 -;; e: f20f114c2408 movsd qword ptr [rsp + 8], xmm1 -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 1e: f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] -;; 24: f20f5cc8 subsd xmm1, xmm0 -;; 28: 660f28c1 movapd xmm0, xmm1 -;; 2c: 4883c418 add rsp, 0x18 -;; 30: 5d pop rbp -;; 31: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872a000000 ja 0x42 +;; 18: f20f11442410 movsd qword ptr [rsp + 0x10], xmm0 +;; f20f114c2408 movsd qword ptr [rsp + 8], xmm1 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; f20f104c2410 movsd xmm1, qword ptr [rsp + 0x10] +;; f20f5cc8 subsd xmm1, xmm0 +;; 660f28c1 movapd xmm0, xmm1 +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 42: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_trunc/f64_trunc_const_sse41.wat b/winch/filetests/filetests/x64/f64_trunc/f64_trunc_const_sse41.wat index cc28e2c0523f..db578acf7bc2 100644 --- a/winch/filetests/filetests/x64/f64_trunc/f64_trunc_const_sse41.wat +++ b/winch/filetests/filetests/x64/f64_trunc/f64_trunc_const_sse41.wat @@ -7,12 +7,20 @@ (f64.trunc) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: f20f10050c000000 movsd xmm0, qword ptr [rip + 0xc] -;; 14: 660f3a0bc003 roundsd xmm0, xmm0, 3 -;; 1a: 4883c408 add rsp, 8 -;; 1e: 5d pop rbp -;; 1f: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8718000000 ja 0x30 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f20f100514000000 movsd xmm0, qword ptr [rip + 0x14] +;; 660f3a0bc003 roundsd xmm0, xmm0, 3 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 30: 0f0b ud2 +;; 32: 0000 add byte ptr [rax], al +;; 34: 0000 add byte ptr [rax], al +;; 36: 0000 add byte ptr [rax], al diff --git a/winch/filetests/filetests/x64/f64_trunc/f64_trunc_param.wat b/winch/filetests/filetests/x64/f64_trunc/f64_trunc_param.wat index 00d68f5ae80f..87d9f5efb675 100644 --- a/winch/filetests/filetests/x64/f64_trunc/f64_trunc_param.wat +++ b/winch/filetests/filetests/x64/f64_trunc/f64_trunc_param.wat @@ -6,13 +6,24 @@ (f64.trunc) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f20f11442408 movsd qword ptr [rsp + 8], xmm0 -;; e: 4c893424 mov qword ptr [rsp], r14 -;; 12: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 18: e800000000 call 0x1d -;; 1d: 4883c410 add rsp, 0x10 -;; 21: 5d pop rbp -;; 22: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8738000000 ja 0x50 +;; 18: f20f11442408 movsd qword ptr [rsp + 8], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f2440f107c2408 movsd xmm15, qword ptr [rsp + 8] +;; 4883ec08 sub rsp, 8 +;; f2440f113c24 movsd qword ptr [rsp], xmm15 +;; 4883ec08 sub rsp, 8 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; e800000000 call 0x42 +;; 4883c408 add rsp, 8 +;; 4883c408 add rsp, 8 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 50: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/f64_trunc/f64_trunc_param_sse41.wat b/winch/filetests/filetests/x64/f64_trunc/f64_trunc_param_sse41.wat index 67e945d45181..1b46d685638c 100644 --- a/winch/filetests/filetests/x64/f64_trunc/f64_trunc_param_sse41.wat +++ b/winch/filetests/filetests/x64/f64_trunc/f64_trunc_param_sse41.wat @@ -7,13 +7,18 @@ (f64.trunc) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: f20f11442408 movsd qword ptr [rsp + 8], xmm0 -;; e: 4c893424 mov qword ptr [rsp], r14 -;; 12: f20f10442408 movsd xmm0, qword ptr [rsp + 8] -;; 18: 660f3a0bc003 roundsd xmm0, xmm0, 3 -;; 1e: 4883c410 add rsp, 0x10 -;; 22: 5d pop rbp -;; 23: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871c000000 ja 0x34 +;; 18: f20f11442408 movsd qword ptr [rsp + 8], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; 660f3a0bc003 roundsd xmm0, xmm0, 3 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 34: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_add/const.wat b/winch/filetests/filetests/x64/i32_add/const.wat index 5d8f4779c4d3..2eefa7edda91 100644 --- a/winch/filetests/filetests/x64/i32_add/const.wat +++ b/winch/filetests/filetests/x64/i32_add/const.wat @@ -7,12 +7,17 @@ (i32.add) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b80a000000 mov eax, 0xa -;; 11: 83c014 add eax, 0x14 -;; 14: 4883c408 add rsp, 8 -;; 18: 5d pop rbp -;; 19: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8712000000 ja 0x2a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b80a000000 mov eax, 0xa +;; 83c014 add eax, 0x14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_add/locals.wat b/winch/filetests/filetests/x64/i32_add/locals.wat index f588a4b22a58..14e90bcca38a 100644 --- a/winch/filetests/filetests/x64/i32_add/locals.wat +++ b/winch/filetests/filetests/x64/i32_add/locals.wat @@ -16,20 +16,25 @@ i32.add ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8731000000 ja 0x49 +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: b80a000000 mov eax, 0xa -;; 1a: 8944240c mov dword ptr [rsp + 0xc], eax -;; 1e: b814000000 mov eax, 0x14 -;; 23: 89442408 mov dword ptr [rsp + 8], eax -;; 27: 8b442408 mov eax, dword ptr [rsp + 8] -;; 2b: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 2f: 01c1 add ecx, eax -;; 31: 89c8 mov eax, ecx -;; 33: 4883c410 add rsp, 0x10 -;; 37: 5d pop rbp -;; 38: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; b80a000000 mov eax, 0xa +;; 8944240c mov dword ptr [rsp + 0xc], eax +;; b814000000 mov eax, 0x14 +;; 89442408 mov dword ptr [rsp + 8], eax +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 01c1 add ecx, eax +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 49: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_add/max.wat b/winch/filetests/filetests/x64/i32_add/max.wat index 8887f4e336eb..46dc9e6f6072 100644 --- a/winch/filetests/filetests/x64/i32_add/max.wat +++ b/winch/filetests/filetests/x64/i32_add/max.wat @@ -6,12 +6,17 @@ (i32.add) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b8ffffff7f mov eax, 0x7fffffff -;; 11: 83c001 add eax, 1 -;; 14: 4883c408 add rsp, 8 -;; 18: 5d pop rbp -;; 19: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8712000000 ja 0x2a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b8ffffff7f mov eax, 0x7fffffff +;; 83c001 add eax, 1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_add/max_one.wat b/winch/filetests/filetests/x64/i32_add/max_one.wat index 10301746101b..b9627d64fafc 100644 --- a/winch/filetests/filetests/x64/i32_add/max_one.wat +++ b/winch/filetests/filetests/x64/i32_add/max_one.wat @@ -7,12 +7,17 @@ (i32.add) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b800000080 mov eax, 0x80000000 -;; 11: 83c0ff add eax, -1 -;; 14: 4883c408 add rsp, 8 -;; 18: 5d pop rbp -;; 19: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8712000000 ja 0x2a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b800000080 mov eax, 0x80000000 +;; 83c0ff add eax, -1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_add/mixed.wat b/winch/filetests/filetests/x64/i32_add/mixed.wat index b9c22b6cb1ba..fc9fb9da03fb 100644 --- a/winch/filetests/filetests/x64/i32_add/mixed.wat +++ b/winch/filetests/filetests/x64/i32_add/mixed.wat @@ -7,12 +7,17 @@ (i32.add) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b8ffffffff mov eax, 0xffffffff -;; 11: 83c001 add eax, 1 -;; 14: 4883c408 add rsp, 8 -;; 18: 5d pop rbp -;; 19: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8712000000 ja 0x2a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b8ffffffff mov eax, 0xffffffff +;; 83c001 add eax, 1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_add/params.wat b/winch/filetests/filetests/x64/i32_add/params.wat index d5b0647abd78..a6de6d2bb5fa 100644 --- a/winch/filetests/filetests/x64/i32_add/params.wat +++ b/winch/filetests/filetests/x64/i32_add/params.wat @@ -7,16 +7,21 @@ (i32.add) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b442408 mov eax, dword ptr [rsp + 8] -;; 18: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 1c: 01c1 add ecx, eax -;; 1e: 89c8 mov eax, ecx -;; 20: 4883c410 add rsp, 0x10 -;; 24: 5d pop rbp -;; 25: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871e000000 ja 0x36 +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 01c1 add ecx, eax +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 36: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_add/signed.wat b/winch/filetests/filetests/x64/i32_add/signed.wat index 306fe771682b..3aaefd510ed1 100644 --- a/winch/filetests/filetests/x64/i32_add/signed.wat +++ b/winch/filetests/filetests/x64/i32_add/signed.wat @@ -7,12 +7,17 @@ (i32.add) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b8ffffffff mov eax, 0xffffffff -;; 11: 83c0ff add eax, -1 -;; 14: 4883c408 add rsp, 8 -;; 18: 5d pop rbp -;; 19: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8712000000 ja 0x2a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b8ffffffff mov eax, 0xffffffff +;; 83c0ff add eax, -1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_add/unsigned_with_zero.wat b/winch/filetests/filetests/x64/i32_add/unsigned_with_zero.wat index 2ad5e3c2134f..83efe2c0ce48 100644 --- a/winch/filetests/filetests/x64/i32_add/unsigned_with_zero.wat +++ b/winch/filetests/filetests/x64/i32_add/unsigned_with_zero.wat @@ -7,12 +7,17 @@ (i32.add) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b801000000 mov eax, 1 -;; 11: 83c000 add eax, 0 -;; 14: 4883c408 add rsp, 8 -;; 18: 5d pop rbp -;; 19: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8712000000 ja 0x2a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 83c000 add eax, 0 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_and/const.wat b/winch/filetests/filetests/x64/i32_and/const.wat index 6f0559288cf0..7f4adc7f9f6d 100644 --- a/winch/filetests/filetests/x64/i32_and/const.wat +++ b/winch/filetests/filetests/x64/i32_and/const.wat @@ -7,12 +7,17 @@ (i32.and) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b801000000 mov eax, 1 -;; 11: 83e002 and eax, 2 -;; 14: 4883c408 add rsp, 8 -;; 18: 5d pop rbp -;; 19: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8712000000 ja 0x2a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 83e002 and eax, 2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_and/locals.wat b/winch/filetests/filetests/x64/i32_and/locals.wat index e4b7cfd0ceb5..6dffa9e2bfbe 100644 --- a/winch/filetests/filetests/x64/i32_and/locals.wat +++ b/winch/filetests/filetests/x64/i32_and/locals.wat @@ -16,20 +16,25 @@ (i32.and) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8731000000 ja 0x49 +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: b801000000 mov eax, 1 -;; 1a: 8944240c mov dword ptr [rsp + 0xc], eax -;; 1e: b802000000 mov eax, 2 -;; 23: 89442408 mov dword ptr [rsp + 8], eax -;; 27: 8b442408 mov eax, dword ptr [rsp + 8] -;; 2b: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 2f: 21c1 and ecx, eax -;; 31: 89c8 mov eax, ecx -;; 33: 4883c410 add rsp, 0x10 -;; 37: 5d pop rbp -;; 38: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 8944240c mov dword ptr [rsp + 0xc], eax +;; b802000000 mov eax, 2 +;; 89442408 mov dword ptr [rsp + 8], eax +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 21c1 and ecx, eax +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 49: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_and/params.wat b/winch/filetests/filetests/x64/i32_and/params.wat index 91dc71b32c3d..0ceade12cbb2 100644 --- a/winch/filetests/filetests/x64/i32_and/params.wat +++ b/winch/filetests/filetests/x64/i32_and/params.wat @@ -7,16 +7,21 @@ (i32.and) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b442408 mov eax, dword ptr [rsp + 8] -;; 18: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 1c: 21c1 and ecx, eax -;; 1e: 89c8 mov eax, ecx -;; 20: 4883c410 add rsp, 0x10 -;; 24: 5d pop rbp -;; 25: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871e000000 ja 0x36 +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 21c1 and ecx, eax +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 36: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_clz/lzcnt_const.wat b/winch/filetests/filetests/x64/i32_clz/lzcnt_const.wat index 0cb5d6a2e30d..c2d48ece6980 100644 --- a/winch/filetests/filetests/x64/i32_clz/lzcnt_const.wat +++ b/winch/filetests/filetests/x64/i32_clz/lzcnt_const.wat @@ -7,12 +7,17 @@ (i32.clz) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b801000000 mov eax, 1 -;; 11: f30fbdc0 lzcnt eax, eax -;; 15: 4883c408 add rsp, 8 -;; 19: 5d pop rbp -;; 1a: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8713000000 ja 0x2b +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; f30fbdc0 lzcnt eax, eax +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2b: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_clz/lzcnt_local.wat b/winch/filetests/filetests/x64/i32_clz/lzcnt_local.wat index 0df01c935bd4..1591cd127d52 100644 --- a/winch/filetests/filetests/x64/i32_clz/lzcnt_local.wat +++ b/winch/filetests/filetests/x64/i32_clz/lzcnt_local.wat @@ -12,16 +12,21 @@ (i32.clz) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8724000000 ja 0x3c +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: b802000000 mov eax, 2 -;; 1a: 8944240c mov dword ptr [rsp + 0xc], eax -;; 1e: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 22: f30fbdc0 lzcnt eax, eax -;; 26: 4883c410 add rsp, 0x10 -;; 2a: 5d pop rbp -;; 2b: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; b802000000 mov eax, 2 +;; 8944240c mov dword ptr [rsp + 0xc], eax +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; f30fbdc0 lzcnt eax, eax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 3c: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_clz/lzcnt_param.wat b/winch/filetests/filetests/x64/i32_clz/lzcnt_param.wat index d4063c39c1d0..b630ccc0a420 100644 --- a/winch/filetests/filetests/x64/i32_clz/lzcnt_param.wat +++ b/winch/filetests/filetests/x64/i32_clz/lzcnt_param.wat @@ -7,13 +7,18 @@ (i32.clz) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 4c893424 mov qword ptr [rsp], r14 -;; 10: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 14: f30fbdc0 lzcnt eax, eax -;; 18: 4883c410 add rsp, 0x10 -;; 1c: 5d pop rbp -;; 1d: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8716000000 ja 0x2e +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; f30fbdc0 lzcnt eax, eax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 2e: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_clz/no_lzcnt_const.wat b/winch/filetests/filetests/x64/i32_clz/no_lzcnt_const.wat index 7c68d949720a..25bc37119317 100644 --- a/winch/filetests/filetests/x64/i32_clz/no_lzcnt_const.wat +++ b/winch/filetests/filetests/x64/i32_clz/no_lzcnt_const.wat @@ -6,17 +6,22 @@ (i32.clz) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b801000000 mov eax, 1 -;; 11: 0fbdc0 bsr eax, eax -;; 14: 41bb00000000 mov r11d, 0 -;; 1a: 410f95c3 setne r11b -;; 1e: f7d8 neg eax -;; 20: 83c020 add eax, 0x20 -;; 23: 4429d8 sub eax, r11d -;; 26: 4883c408 add rsp, 8 -;; 2a: 5d pop rbp -;; 2b: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8724000000 ja 0x3c +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 0fbdc0 bsr eax, eax +;; 41bb00000000 mov r11d, 0 +;; 410f95c3 setne r11b +;; f7d8 neg eax +;; 83c020 add eax, 0x20 +;; 4429d8 sub eax, r11d +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 3c: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_clz/no_lzcnt_local.wat b/winch/filetests/filetests/x64/i32_clz/no_lzcnt_local.wat index 74c3cceee5f3..9fa242116e31 100644 --- a/winch/filetests/filetests/x64/i32_clz/no_lzcnt_local.wat +++ b/winch/filetests/filetests/x64/i32_clz/no_lzcnt_local.wat @@ -11,21 +11,26 @@ (i32.clz) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8735000000 ja 0x4d +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: b802000000 mov eax, 2 -;; 1a: 8944240c mov dword ptr [rsp + 0xc], eax -;; 1e: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 22: 0fbdc0 bsr eax, eax -;; 25: 41bb00000000 mov r11d, 0 -;; 2b: 410f95c3 setne r11b -;; 2f: f7d8 neg eax -;; 31: 83c020 add eax, 0x20 -;; 34: 4429d8 sub eax, r11d -;; 37: 4883c410 add rsp, 0x10 -;; 3b: 5d pop rbp -;; 3c: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; b802000000 mov eax, 2 +;; 8944240c mov dword ptr [rsp + 0xc], eax +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 0fbdc0 bsr eax, eax +;; 41bb00000000 mov r11d, 0 +;; 410f95c3 setne r11b +;; f7d8 neg eax +;; 83c020 add eax, 0x20 +;; 4429d8 sub eax, r11d +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 4d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_clz/no_lzcnt_param.wat b/winch/filetests/filetests/x64/i32_clz/no_lzcnt_param.wat index 79ba02684102..64a0107718f6 100644 --- a/winch/filetests/filetests/x64/i32_clz/no_lzcnt_param.wat +++ b/winch/filetests/filetests/x64/i32_clz/no_lzcnt_param.wat @@ -6,18 +6,23 @@ (i32.clz) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 4c893424 mov qword ptr [rsp], r14 -;; 10: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 14: 0fbdc0 bsr eax, eax -;; 17: 41bb00000000 mov r11d, 0 -;; 1d: 410f95c3 setne r11b -;; 21: f7d8 neg eax -;; 23: 83c020 add eax, 0x20 -;; 26: 4429d8 sub eax, r11d -;; 29: 4883c410 add rsp, 0x10 -;; 2d: 5d pop rbp -;; 2e: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8727000000 ja 0x3f +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 0fbdc0 bsr eax, eax +;; 41bb00000000 mov r11d, 0 +;; 410f95c3 setne r11b +;; f7d8 neg eax +;; 83c020 add eax, 0x20 +;; 4429d8 sub eax, r11d +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 3f: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_ctz/bmi1_const.wat b/winch/filetests/filetests/x64/i32_ctz/bmi1_const.wat index 6cc13634fd23..28e436b963c0 100644 --- a/winch/filetests/filetests/x64/i32_ctz/bmi1_const.wat +++ b/winch/filetests/filetests/x64/i32_ctz/bmi1_const.wat @@ -7,12 +7,17 @@ (i32.ctz) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b801000000 mov eax, 1 -;; 11: f30fbcc0 tzcnt eax, eax -;; 15: 4883c408 add rsp, 8 -;; 19: 5d pop rbp -;; 1a: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8713000000 ja 0x2b +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; f30fbcc0 tzcnt eax, eax +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2b: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_ctz/bmi1_local.wat b/winch/filetests/filetests/x64/i32_ctz/bmi1_local.wat index b97ef521d89e..25bcf1a46cd8 100644 --- a/winch/filetests/filetests/x64/i32_ctz/bmi1_local.wat +++ b/winch/filetests/filetests/x64/i32_ctz/bmi1_local.wat @@ -13,16 +13,21 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8724000000 ja 0x3c +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: b802000000 mov eax, 2 -;; 1a: 8944240c mov dword ptr [rsp + 0xc], eax -;; 1e: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 22: f30fbcc0 tzcnt eax, eax -;; 26: 4883c410 add rsp, 0x10 -;; 2a: 5d pop rbp -;; 2b: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; b802000000 mov eax, 2 +;; 8944240c mov dword ptr [rsp + 0xc], eax +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; f30fbcc0 tzcnt eax, eax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 3c: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_ctz/bmi1_param.wat b/winch/filetests/filetests/x64/i32_ctz/bmi1_param.wat index 697e73fa5fc0..59140cbcb59a 100644 --- a/winch/filetests/filetests/x64/i32_ctz/bmi1_param.wat +++ b/winch/filetests/filetests/x64/i32_ctz/bmi1_param.wat @@ -7,13 +7,18 @@ (i32.ctz) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 4c893424 mov qword ptr [rsp], r14 -;; 10: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 14: f30fbcc0 tzcnt eax, eax -;; 18: 4883c410 add rsp, 0x10 -;; 1c: 5d pop rbp -;; 1d: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8716000000 ja 0x2e +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; f30fbcc0 tzcnt eax, eax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 2e: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_ctz/no_bmi1_const.wat b/winch/filetests/filetests/x64/i32_ctz/no_bmi1_const.wat index 7a334760f74c..3ae0d6230c06 100644 --- a/winch/filetests/filetests/x64/i32_ctz/no_bmi1_const.wat +++ b/winch/filetests/filetests/x64/i32_ctz/no_bmi1_const.wat @@ -6,16 +6,21 @@ (i32.ctz) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b801000000 mov eax, 1 -;; 11: 0fbcc0 bsf eax, eax -;; 14: 41bb00000000 mov r11d, 0 -;; 1a: 410f94c3 sete r11b -;; 1e: 41c1e305 shl r11d, 5 -;; 22: 4401d8 add eax, r11d -;; 25: 4883c408 add rsp, 8 -;; 29: 5d pop rbp -;; 2a: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8723000000 ja 0x3b +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 0fbcc0 bsf eax, eax +;; 41bb00000000 mov r11d, 0 +;; 410f94c3 sete r11b +;; 41c1e305 shl r11d, 5 +;; 4401d8 add eax, r11d +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 3b: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_ctz/no_bmi1_local.wat b/winch/filetests/filetests/x64/i32_ctz/no_bmi1_local.wat index ec418c25723b..1f386b3aa9a5 100644 --- a/winch/filetests/filetests/x64/i32_ctz/no_bmi1_local.wat +++ b/winch/filetests/filetests/x64/i32_ctz/no_bmi1_local.wat @@ -11,20 +11,25 @@ (i32.ctz) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8734000000 ja 0x4c +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: b802000000 mov eax, 2 -;; 1a: 8944240c mov dword ptr [rsp + 0xc], eax -;; 1e: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 22: 0fbcc0 bsf eax, eax -;; 25: 41bb00000000 mov r11d, 0 -;; 2b: 410f94c3 sete r11b -;; 2f: 41c1e305 shl r11d, 5 -;; 33: 4401d8 add eax, r11d -;; 36: 4883c410 add rsp, 0x10 -;; 3a: 5d pop rbp -;; 3b: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; b802000000 mov eax, 2 +;; 8944240c mov dword ptr [rsp + 0xc], eax +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 0fbcc0 bsf eax, eax +;; 41bb00000000 mov r11d, 0 +;; 410f94c3 sete r11b +;; 41c1e305 shl r11d, 5 +;; 4401d8 add eax, r11d +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 4c: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_ctz/no_bmi1_param.wat b/winch/filetests/filetests/x64/i32_ctz/no_bmi1_param.wat index 9387e3ad24e7..de5347f4e475 100644 --- a/winch/filetests/filetests/x64/i32_ctz/no_bmi1_param.wat +++ b/winch/filetests/filetests/x64/i32_ctz/no_bmi1_param.wat @@ -6,17 +6,22 @@ (i32.ctz) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 4c893424 mov qword ptr [rsp], r14 -;; 10: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 14: 0fbcc0 bsf eax, eax -;; 17: 41bb00000000 mov r11d, 0 -;; 1d: 410f94c3 sete r11b -;; 21: 41c1e305 shl r11d, 5 -;; 25: 4401d8 add eax, r11d -;; 28: 4883c410 add rsp, 0x10 -;; 2c: 5d pop rbp -;; 2d: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8726000000 ja 0x3e +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 0fbcc0 bsf eax, eax +;; 41bb00000000 mov r11d, 0 +;; 410f94c3 sete r11b +;; 41c1e305 shl r11d, 5 +;; 4401d8 add eax, r11d +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 3e: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_divs/const.wat b/winch/filetests/filetests/x64/i32_divs/const.wat index a34457f0789a..65aeb0cd5799 100644 --- a/winch/filetests/filetests/x64/i32_divs/const.wat +++ b/winch/filetests/filetests/x64/i32_divs/const.wat @@ -7,17 +7,22 @@ (i32.div_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b90a000000 mov ecx, 0xa -;; 11: b814000000 mov eax, 0x14 -;; 16: 83f900 cmp ecx, 0 -;; 19: 0f8409000000 je 0x28 -;; 1f: 99 cdq -;; 20: f7f9 idiv ecx -;; 22: 4883c408 add rsp, 8 -;; 26: 5d pop rbp -;; 27: c3 ret -;; 28: 0f0b ud2 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8720000000 ja 0x38 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b90a000000 mov ecx, 0xa +;; b814000000 mov eax, 0x14 +;; 83f900 cmp ecx, 0 +;; 0f840b000000 je 0x3a +;; 2f: 99 cdq +;; f7f9 idiv ecx +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 38: 0f0b ud2 +;; 3a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_divs/one_zero.wat b/winch/filetests/filetests/x64/i32_divs/one_zero.wat index 3d310fba093b..c8fe543cc186 100644 --- a/winch/filetests/filetests/x64/i32_divs/one_zero.wat +++ b/winch/filetests/filetests/x64/i32_divs/one_zero.wat @@ -7,17 +7,22 @@ (i32.div_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b900000000 mov ecx, 0 -;; 11: b801000000 mov eax, 1 -;; 16: 83f900 cmp ecx, 0 -;; 19: 0f8409000000 je 0x28 -;; 1f: 99 cdq -;; 20: f7f9 idiv ecx -;; 22: 4883c408 add rsp, 8 -;; 26: 5d pop rbp -;; 27: c3 ret -;; 28: 0f0b ud2 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8720000000 ja 0x38 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b900000000 mov ecx, 0 +;; b801000000 mov eax, 1 +;; 83f900 cmp ecx, 0 +;; 0f840b000000 je 0x3a +;; 2f: 99 cdq +;; f7f9 idiv ecx +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 38: 0f0b ud2 +;; 3a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_divs/overflow.wat b/winch/filetests/filetests/x64/i32_divs/overflow.wat index 8237dfb92f23..e756bdb24df2 100644 --- a/winch/filetests/filetests/x64/i32_divs/overflow.wat +++ b/winch/filetests/filetests/x64/i32_divs/overflow.wat @@ -7,17 +7,22 @@ (i32.div_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b9ffffffff mov ecx, 0xffffffff -;; 11: b800000080 mov eax, 0x80000000 -;; 16: 83f900 cmp ecx, 0 -;; 19: 0f8409000000 je 0x28 -;; 1f: 99 cdq -;; 20: f7f9 idiv ecx -;; 22: 4883c408 add rsp, 8 -;; 26: 5d pop rbp -;; 27: c3 ret -;; 28: 0f0b ud2 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8720000000 ja 0x38 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b9ffffffff mov ecx, 0xffffffff +;; b800000080 mov eax, 0x80000000 +;; 83f900 cmp ecx, 0 +;; 0f840b000000 je 0x3a +;; 2f: 99 cdq +;; f7f9 idiv ecx +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 38: 0f0b ud2 +;; 3a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_divs/params.wat b/winch/filetests/filetests/x64/i32_divs/params.wat index 8dfff2bc2b9e..e1e05dd33753 100644 --- a/winch/filetests/filetests/x64/i32_divs/params.wat +++ b/winch/filetests/filetests/x64/i32_divs/params.wat @@ -7,19 +7,24 @@ (i32.div_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b4c2408 mov ecx, dword ptr [rsp + 8] -;; 18: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 1c: 83f900 cmp ecx, 0 -;; 1f: 0f8409000000 je 0x2e -;; 25: 99 cdq -;; 26: f7f9 idiv ecx -;; 28: 4883c410 add rsp, 0x10 -;; 2c: 5d pop rbp -;; 2d: c3 ret -;; 2e: 0f0b ud2 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8726000000 ja 0x3e +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b4c2408 mov ecx, dword ptr [rsp + 8] +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 83f900 cmp ecx, 0 +;; 0f840b000000 je 0x40 +;; 35: 99 cdq +;; f7f9 idiv ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 3e: 0f0b ud2 +;; 40: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_divs/zero_zero.wat b/winch/filetests/filetests/x64/i32_divs/zero_zero.wat index 8f4766020265..0321c72360ac 100644 --- a/winch/filetests/filetests/x64/i32_divs/zero_zero.wat +++ b/winch/filetests/filetests/x64/i32_divs/zero_zero.wat @@ -7,17 +7,22 @@ (i32.div_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b900000000 mov ecx, 0 -;; 11: b800000000 mov eax, 0 -;; 16: 83f900 cmp ecx, 0 -;; 19: 0f8409000000 je 0x28 -;; 1f: 99 cdq -;; 20: f7f9 idiv ecx -;; 22: 4883c408 add rsp, 8 -;; 26: 5d pop rbp -;; 27: c3 ret -;; 28: 0f0b ud2 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8720000000 ja 0x38 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b900000000 mov ecx, 0 +;; b800000000 mov eax, 0 +;; 83f900 cmp ecx, 0 +;; 0f840b000000 je 0x3a +;; 2f: 99 cdq +;; f7f9 idiv ecx +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 38: 0f0b ud2 +;; 3a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_divu/const.wat b/winch/filetests/filetests/x64/i32_divu/const.wat index f90362399d5a..2ed4218bea22 100644 --- a/winch/filetests/filetests/x64/i32_divu/const.wat +++ b/winch/filetests/filetests/x64/i32_divu/const.wat @@ -7,14 +7,19 @@ (i32.div_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b90a000000 mov ecx, 0xa -;; 11: b814000000 mov eax, 0x14 -;; 16: 31d2 xor edx, edx -;; 18: f7f1 div ecx -;; 1a: 4883c408 add rsp, 8 -;; 1e: 5d pop rbp -;; 1f: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8718000000 ja 0x30 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b90a000000 mov ecx, 0xa +;; b814000000 mov eax, 0x14 +;; 31d2 xor edx, edx +;; f7f1 div ecx +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 30: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_divu/one_zero.wat b/winch/filetests/filetests/x64/i32_divu/one_zero.wat index 6f463954b8cf..d06461843a59 100644 --- a/winch/filetests/filetests/x64/i32_divu/one_zero.wat +++ b/winch/filetests/filetests/x64/i32_divu/one_zero.wat @@ -7,14 +7,19 @@ (i32.div_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b900000000 mov ecx, 0 -;; 11: b801000000 mov eax, 1 -;; 16: 31d2 xor edx, edx -;; 18: f7f1 div ecx -;; 1a: 4883c408 add rsp, 8 -;; 1e: 5d pop rbp -;; 1f: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8718000000 ja 0x30 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b900000000 mov ecx, 0 +;; b801000000 mov eax, 1 +;; 31d2 xor edx, edx +;; f7f1 div ecx +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 30: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_divu/params.wat b/winch/filetests/filetests/x64/i32_divu/params.wat index 00c979d80763..cadd44d76920 100644 --- a/winch/filetests/filetests/x64/i32_divu/params.wat +++ b/winch/filetests/filetests/x64/i32_divu/params.wat @@ -7,16 +7,21 @@ (i32.div_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b4c2408 mov ecx, dword ptr [rsp + 8] -;; 18: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 1c: 31d2 xor edx, edx -;; 1e: f7f1 div ecx -;; 20: 4883c410 add rsp, 0x10 -;; 24: 5d pop rbp -;; 25: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871e000000 ja 0x36 +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b4c2408 mov ecx, dword ptr [rsp + 8] +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 31d2 xor edx, edx +;; f7f1 div ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 36: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_divu/signed.wat b/winch/filetests/filetests/x64/i32_divu/signed.wat index 31dfe5423a9e..36ad02adfbb0 100644 --- a/winch/filetests/filetests/x64/i32_divu/signed.wat +++ b/winch/filetests/filetests/x64/i32_divu/signed.wat @@ -7,14 +7,19 @@ (i32.div_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b9ffffffff mov ecx, 0xffffffff -;; 11: b8ffffffff mov eax, 0xffffffff -;; 16: 31d2 xor edx, edx -;; 18: f7f1 div ecx -;; 1a: 4883c408 add rsp, 8 -;; 1e: 5d pop rbp -;; 1f: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8718000000 ja 0x30 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b9ffffffff mov ecx, 0xffffffff +;; b8ffffffff mov eax, 0xffffffff +;; 31d2 xor edx, edx +;; f7f1 div ecx +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 30: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_divu/zero_zero.wat b/winch/filetests/filetests/x64/i32_divu/zero_zero.wat index 189be7acd08e..82618cc159ce 100644 --- a/winch/filetests/filetests/x64/i32_divu/zero_zero.wat +++ b/winch/filetests/filetests/x64/i32_divu/zero_zero.wat @@ -7,14 +7,19 @@ (i32.div_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b900000000 mov ecx, 0 -;; 11: b800000000 mov eax, 0 -;; 16: 31d2 xor edx, edx -;; 18: f7f1 div ecx -;; 1a: 4883c408 add rsp, 8 -;; 1e: 5d pop rbp -;; 1f: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8718000000 ja 0x30 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b900000000 mov ecx, 0 +;; b800000000 mov eax, 0 +;; 31d2 xor edx, edx +;; f7f1 div ecx +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 30: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_eq/const.wat b/winch/filetests/filetests/x64/i32_eq/const.wat index f3ebed6e8e51..9392f62fe0c4 100644 --- a/winch/filetests/filetests/x64/i32_eq/const.wat +++ b/winch/filetests/filetests/x64/i32_eq/const.wat @@ -7,14 +7,19 @@ (i32.eq) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b802000000 mov eax, 2 -;; 11: 83f803 cmp eax, 3 -;; 14: b800000000 mov eax, 0 -;; 19: 400f94c0 sete al -;; 1d: 4883c408 add rsp, 8 -;; 21: 5d pop rbp -;; 22: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871b000000 ja 0x33 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b802000000 mov eax, 2 +;; 83f803 cmp eax, 3 +;; b800000000 mov eax, 0 +;; 400f94c0 sete al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 33: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_eq/locals.wat b/winch/filetests/filetests/x64/i32_eq/locals.wat index 3e989893fe29..c663d00d2565 100644 --- a/winch/filetests/filetests/x64/i32_eq/locals.wat +++ b/winch/filetests/filetests/x64/i32_eq/locals.wat @@ -15,22 +15,27 @@ (i32.eq) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f873a000000 ja 0x52 +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: b802000000 mov eax, 2 -;; 1a: 8944240c mov dword ptr [rsp + 0xc], eax -;; 1e: b803000000 mov eax, 3 -;; 23: 89442408 mov dword ptr [rsp + 8], eax -;; 27: 8b442408 mov eax, dword ptr [rsp + 8] -;; 2b: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 2f: 39c1 cmp ecx, eax -;; 31: b900000000 mov ecx, 0 -;; 36: 400f94c1 sete cl -;; 3a: 89c8 mov eax, ecx -;; 3c: 4883c410 add rsp, 0x10 -;; 40: 5d pop rbp -;; 41: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; b802000000 mov eax, 2 +;; 8944240c mov dword ptr [rsp + 0xc], eax +;; b803000000 mov eax, 3 +;; 89442408 mov dword ptr [rsp + 8], eax +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 39c1 cmp ecx, eax +;; b900000000 mov ecx, 0 +;; 400f94c1 sete cl +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 52: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_eq/params.wat b/winch/filetests/filetests/x64/i32_eq/params.wat index 1dd06d350179..a1b72b18d666 100644 --- a/winch/filetests/filetests/x64/i32_eq/params.wat +++ b/winch/filetests/filetests/x64/i32_eq/params.wat @@ -7,18 +7,23 @@ (i32.eq) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b442408 mov eax, dword ptr [rsp + 8] -;; 18: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 1c: 39c1 cmp ecx, eax -;; 1e: b900000000 mov ecx, 0 -;; 23: 400f94c1 sete cl -;; 27: 89c8 mov eax, ecx -;; 29: 4883c410 add rsp, 0x10 -;; 2d: 5d pop rbp -;; 2e: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8727000000 ja 0x3f +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 39c1 cmp ecx, eax +;; b900000000 mov ecx, 0 +;; 400f94c1 sete cl +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 3f: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_eqz/const.wat b/winch/filetests/filetests/x64/i32_eqz/const.wat index d6624bef9cad..0f277434978d 100644 --- a/winch/filetests/filetests/x64/i32_eqz/const.wat +++ b/winch/filetests/filetests/x64/i32_eqz/const.wat @@ -6,14 +6,19 @@ (i32.eqz) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b801000000 mov eax, 1 -;; 11: 83f800 cmp eax, 0 -;; 14: b800000000 mov eax, 0 -;; 19: 400f94c0 sete al -;; 1d: 4883c408 add rsp, 8 -;; 21: 5d pop rbp -;; 22: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871b000000 ja 0x33 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 83f800 cmp eax, 0 +;; b800000000 mov eax, 0 +;; 400f94c0 sete al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 33: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_eqz/local.wat b/winch/filetests/filetests/x64/i32_eqz/local.wat index 7dca50c83e8d..a9faae77b930 100644 --- a/winch/filetests/filetests/x64/i32_eqz/local.wat +++ b/winch/filetests/filetests/x64/i32_eqz/local.wat @@ -11,18 +11,23 @@ (i32.eqz) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872c000000 ja 0x44 +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: b802000000 mov eax, 2 -;; 1a: 8944240c mov dword ptr [rsp + 0xc], eax -;; 1e: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 22: 83f800 cmp eax, 0 -;; 25: b800000000 mov eax, 0 -;; 2a: 400f94c0 sete al -;; 2e: 4883c410 add rsp, 0x10 -;; 32: 5d pop rbp -;; 33: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; b802000000 mov eax, 2 +;; 8944240c mov dword ptr [rsp + 0xc], eax +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 83f800 cmp eax, 0 +;; b800000000 mov eax, 0 +;; 400f94c0 sete al +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 44: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_eqz/param.wat b/winch/filetests/filetests/x64/i32_eqz/param.wat index d51000bb31d9..d171d9dc3155 100644 --- a/winch/filetests/filetests/x64/i32_eqz/param.wat +++ b/winch/filetests/filetests/x64/i32_eqz/param.wat @@ -6,15 +6,20 @@ (i32.eqz) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 4c893424 mov qword ptr [rsp], r14 -;; 10: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 14: 83f800 cmp eax, 0 -;; 17: b800000000 mov eax, 0 -;; 1c: 400f94c0 sete al -;; 20: 4883c410 add rsp, 0x10 -;; 24: 5d pop rbp -;; 25: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871e000000 ja 0x36 +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 83f800 cmp eax, 0 +;; b800000000 mov eax, 0 +;; 400f94c0 sete al +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 36: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_extend_16_s/const.wat b/winch/filetests/filetests/x64/i32_extend_16_s/const.wat new file mode 100644 index 000000000000..c40324eed763 --- /dev/null +++ b/winch/filetests/filetests/x64/i32_extend_16_s/const.wat @@ -0,0 +1,22 @@ +;;! target = "x86_64" + +(module + (func (result i32) + (i32.const 1) + (i32.extend16_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8712000000 ja 0x2a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 0fbfc0 movsx eax, ax +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_extend_16_s/locals.wat b/winch/filetests/filetests/x64/i32_extend_16_s/locals.wat new file mode 100644 index 000000000000..aa5dfb702111 --- /dev/null +++ b/winch/filetests/filetests/x64/i32_extend_16_s/locals.wat @@ -0,0 +1,26 @@ +;;! target = "x86_64" + +(module + (func (result i32) + (local i32) + + (local.get 0) + (i32.extend16_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871a000000 ja 0x32 +;; 18: 48c744240800000000 +;; mov qword ptr [rsp + 8], 0 +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 0fbfc0 movsx eax, ax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 32: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_extend_16_s/params.wat b/winch/filetests/filetests/x64/i32_extend_16_s/params.wat new file mode 100644 index 000000000000..ceceb0623585 --- /dev/null +++ b/winch/filetests/filetests/x64/i32_extend_16_s/params.wat @@ -0,0 +1,23 @@ +;;! target = "x86_64" + +(module + (func (param i32) (result i32) + (local.get 0) + (i32.extend16_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8715000000 ja 0x2d +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 0fbfc0 movsx eax, ax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 2d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_extend_8_s/const.wat b/winch/filetests/filetests/x64/i32_extend_8_s/const.wat new file mode 100644 index 000000000000..4bd5b9b46efc --- /dev/null +++ b/winch/filetests/filetests/x64/i32_extend_8_s/const.wat @@ -0,0 +1,22 @@ +;;! target = "x86_64" + +(module + (func (result i32) + (i32.const 1) + (i32.extend8_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8712000000 ja 0x2a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 0fbec0 movsx eax, al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_extend_8_s/locals.wat b/winch/filetests/filetests/x64/i32_extend_8_s/locals.wat new file mode 100644 index 000000000000..d74e2b068ed8 --- /dev/null +++ b/winch/filetests/filetests/x64/i32_extend_8_s/locals.wat @@ -0,0 +1,26 @@ +;;! target = "x86_64" + +(module + (func (result i32) + (local i32) + + (local.get 0) + (i32.extend8_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871a000000 ja 0x32 +;; 18: 48c744240800000000 +;; mov qword ptr [rsp + 8], 0 +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 0fbec0 movsx eax, al +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 32: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_extend_8_s/params.wat b/winch/filetests/filetests/x64/i32_extend_8_s/params.wat new file mode 100644 index 000000000000..fa762a8fd7e0 --- /dev/null +++ b/winch/filetests/filetests/x64/i32_extend_8_s/params.wat @@ -0,0 +1,23 @@ +;;! target = "x86_64" + +(module + (func (param i32) (result i32) + (local.get 0) + (i32.extend8_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8715000000 ja 0x2d +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 0fbec0 movsx eax, al +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 2d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_ge_s/const.wat b/winch/filetests/filetests/x64/i32_ge_s/const.wat index 9acb3ca8574c..5cde65a4c994 100644 --- a/winch/filetests/filetests/x64/i32_ge_s/const.wat +++ b/winch/filetests/filetests/x64/i32_ge_s/const.wat @@ -7,14 +7,19 @@ (i32.ge_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b802000000 mov eax, 2 -;; 11: 83f803 cmp eax, 3 -;; 14: b800000000 mov eax, 0 -;; 19: 400f9dc0 setge al -;; 1d: 4883c408 add rsp, 8 -;; 21: 5d pop rbp -;; 22: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871b000000 ja 0x33 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b802000000 mov eax, 2 +;; 83f803 cmp eax, 3 +;; b800000000 mov eax, 0 +;; 400f9dc0 setge al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 33: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_ge_s/locals.wat b/winch/filetests/filetests/x64/i32_ge_s/locals.wat index 8b98ffd97d8a..fafad56a9149 100644 --- a/winch/filetests/filetests/x64/i32_ge_s/locals.wat +++ b/winch/filetests/filetests/x64/i32_ge_s/locals.wat @@ -15,22 +15,27 @@ (i32.ge_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f873a000000 ja 0x52 +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: b802000000 mov eax, 2 -;; 1a: 8944240c mov dword ptr [rsp + 0xc], eax -;; 1e: b803000000 mov eax, 3 -;; 23: 89442408 mov dword ptr [rsp + 8], eax -;; 27: 8b442408 mov eax, dword ptr [rsp + 8] -;; 2b: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 2f: 39c1 cmp ecx, eax -;; 31: b900000000 mov ecx, 0 -;; 36: 400f9dc1 setge cl -;; 3a: 89c8 mov eax, ecx -;; 3c: 4883c410 add rsp, 0x10 -;; 40: 5d pop rbp -;; 41: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; b802000000 mov eax, 2 +;; 8944240c mov dword ptr [rsp + 0xc], eax +;; b803000000 mov eax, 3 +;; 89442408 mov dword ptr [rsp + 8], eax +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 39c1 cmp ecx, eax +;; b900000000 mov ecx, 0 +;; 400f9dc1 setge cl +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 52: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_ge_s/params.wat b/winch/filetests/filetests/x64/i32_ge_s/params.wat index d48e6f02047a..b5bbf4457e6e 100644 --- a/winch/filetests/filetests/x64/i32_ge_s/params.wat +++ b/winch/filetests/filetests/x64/i32_ge_s/params.wat @@ -7,18 +7,23 @@ (i32.ge_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b442408 mov eax, dword ptr [rsp + 8] -;; 18: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 1c: 39c1 cmp ecx, eax -;; 1e: b900000000 mov ecx, 0 -;; 23: 400f9dc1 setge cl -;; 27: 89c8 mov eax, ecx -;; 29: 4883c410 add rsp, 0x10 -;; 2d: 5d pop rbp -;; 2e: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8727000000 ja 0x3f +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 39c1 cmp ecx, eax +;; b900000000 mov ecx, 0 +;; 400f9dc1 setge cl +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 3f: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_ge_u/const.wat b/winch/filetests/filetests/x64/i32_ge_u/const.wat index a30e1cde0b8b..86f02c4843a0 100644 --- a/winch/filetests/filetests/x64/i32_ge_u/const.wat +++ b/winch/filetests/filetests/x64/i32_ge_u/const.wat @@ -7,14 +7,19 @@ (i32.ge_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b802000000 mov eax, 2 -;; 11: 83f803 cmp eax, 3 -;; 14: b800000000 mov eax, 0 -;; 19: 400f93c0 setae al -;; 1d: 4883c408 add rsp, 8 -;; 21: 5d pop rbp -;; 22: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871b000000 ja 0x33 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b802000000 mov eax, 2 +;; 83f803 cmp eax, 3 +;; b800000000 mov eax, 0 +;; 400f93c0 setae al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 33: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_ge_u/locals.wat b/winch/filetests/filetests/x64/i32_ge_u/locals.wat index 3b58fccc1dff..5c6c6b9a48a1 100644 --- a/winch/filetests/filetests/x64/i32_ge_u/locals.wat +++ b/winch/filetests/filetests/x64/i32_ge_u/locals.wat @@ -15,22 +15,27 @@ (i32.ge_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f873a000000 ja 0x52 +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: b802000000 mov eax, 2 -;; 1a: 8944240c mov dword ptr [rsp + 0xc], eax -;; 1e: b803000000 mov eax, 3 -;; 23: 89442408 mov dword ptr [rsp + 8], eax -;; 27: 8b442408 mov eax, dword ptr [rsp + 8] -;; 2b: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 2f: 39c1 cmp ecx, eax -;; 31: b900000000 mov ecx, 0 -;; 36: 400f93c1 setae cl -;; 3a: 89c8 mov eax, ecx -;; 3c: 4883c410 add rsp, 0x10 -;; 40: 5d pop rbp -;; 41: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; b802000000 mov eax, 2 +;; 8944240c mov dword ptr [rsp + 0xc], eax +;; b803000000 mov eax, 3 +;; 89442408 mov dword ptr [rsp + 8], eax +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 39c1 cmp ecx, eax +;; b900000000 mov ecx, 0 +;; 400f93c1 setae cl +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 52: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_ge_u/params.wat b/winch/filetests/filetests/x64/i32_ge_u/params.wat index 15113b4f4642..68d4384245c4 100644 --- a/winch/filetests/filetests/x64/i32_ge_u/params.wat +++ b/winch/filetests/filetests/x64/i32_ge_u/params.wat @@ -7,18 +7,23 @@ (i32.ge_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b442408 mov eax, dword ptr [rsp + 8] -;; 18: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 1c: 39c1 cmp ecx, eax -;; 1e: b900000000 mov ecx, 0 -;; 23: 400f93c1 setae cl -;; 27: 89c8 mov eax, ecx -;; 29: 4883c410 add rsp, 0x10 -;; 2d: 5d pop rbp -;; 2e: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8727000000 ja 0x3f +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 39c1 cmp ecx, eax +;; b900000000 mov ecx, 0 +;; 400f93c1 setae cl +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 3f: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_gt_s/const.wat b/winch/filetests/filetests/x64/i32_gt_s/const.wat index b17c30142da7..ae0205493506 100644 --- a/winch/filetests/filetests/x64/i32_gt_s/const.wat +++ b/winch/filetests/filetests/x64/i32_gt_s/const.wat @@ -7,14 +7,19 @@ (i32.gt_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b802000000 mov eax, 2 -;; 11: 83f803 cmp eax, 3 -;; 14: b800000000 mov eax, 0 -;; 19: 400f9fc0 setg al -;; 1d: 4883c408 add rsp, 8 -;; 21: 5d pop rbp -;; 22: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871b000000 ja 0x33 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b802000000 mov eax, 2 +;; 83f803 cmp eax, 3 +;; b800000000 mov eax, 0 +;; 400f9fc0 setg al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 33: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_gt_s/locals.wat b/winch/filetests/filetests/x64/i32_gt_s/locals.wat index 48326497a5ea..485c76a4dcc9 100644 --- a/winch/filetests/filetests/x64/i32_gt_s/locals.wat +++ b/winch/filetests/filetests/x64/i32_gt_s/locals.wat @@ -15,22 +15,27 @@ (i32.gt_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f873a000000 ja 0x52 +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: b802000000 mov eax, 2 -;; 1a: 8944240c mov dword ptr [rsp + 0xc], eax -;; 1e: b803000000 mov eax, 3 -;; 23: 89442408 mov dword ptr [rsp + 8], eax -;; 27: 8b442408 mov eax, dword ptr [rsp + 8] -;; 2b: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 2f: 39c1 cmp ecx, eax -;; 31: b900000000 mov ecx, 0 -;; 36: 400f9fc1 setg cl -;; 3a: 89c8 mov eax, ecx -;; 3c: 4883c410 add rsp, 0x10 -;; 40: 5d pop rbp -;; 41: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; b802000000 mov eax, 2 +;; 8944240c mov dword ptr [rsp + 0xc], eax +;; b803000000 mov eax, 3 +;; 89442408 mov dword ptr [rsp + 8], eax +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 39c1 cmp ecx, eax +;; b900000000 mov ecx, 0 +;; 400f9fc1 setg cl +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 52: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_gt_s/params.wat b/winch/filetests/filetests/x64/i32_gt_s/params.wat index 92aaa8c60d01..88631800193f 100644 --- a/winch/filetests/filetests/x64/i32_gt_s/params.wat +++ b/winch/filetests/filetests/x64/i32_gt_s/params.wat @@ -7,18 +7,23 @@ (i32.gt_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b442408 mov eax, dword ptr [rsp + 8] -;; 18: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 1c: 39c1 cmp ecx, eax -;; 1e: b900000000 mov ecx, 0 -;; 23: 400f9fc1 setg cl -;; 27: 89c8 mov eax, ecx -;; 29: 4883c410 add rsp, 0x10 -;; 2d: 5d pop rbp -;; 2e: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8727000000 ja 0x3f +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 39c1 cmp ecx, eax +;; b900000000 mov ecx, 0 +;; 400f9fc1 setg cl +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 3f: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_gt_u/const.wat b/winch/filetests/filetests/x64/i32_gt_u/const.wat index d0e958d65aeb..0f0a718f9302 100644 --- a/winch/filetests/filetests/x64/i32_gt_u/const.wat +++ b/winch/filetests/filetests/x64/i32_gt_u/const.wat @@ -7,14 +7,19 @@ (i32.gt_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b802000000 mov eax, 2 -;; 11: 83f803 cmp eax, 3 -;; 14: b800000000 mov eax, 0 -;; 19: 400f97c0 seta al -;; 1d: 4883c408 add rsp, 8 -;; 21: 5d pop rbp -;; 22: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871b000000 ja 0x33 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b802000000 mov eax, 2 +;; 83f803 cmp eax, 3 +;; b800000000 mov eax, 0 +;; 400f97c0 seta al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 33: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_gt_u/locals.wat b/winch/filetests/filetests/x64/i32_gt_u/locals.wat index 078cdf5d4b26..96d640be220e 100644 --- a/winch/filetests/filetests/x64/i32_gt_u/locals.wat +++ b/winch/filetests/filetests/x64/i32_gt_u/locals.wat @@ -15,22 +15,27 @@ (i32.gt_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f873a000000 ja 0x52 +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: b802000000 mov eax, 2 -;; 1a: 8944240c mov dword ptr [rsp + 0xc], eax -;; 1e: b803000000 mov eax, 3 -;; 23: 89442408 mov dword ptr [rsp + 8], eax -;; 27: 8b442408 mov eax, dword ptr [rsp + 8] -;; 2b: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 2f: 39c1 cmp ecx, eax -;; 31: b900000000 mov ecx, 0 -;; 36: 400f97c1 seta cl -;; 3a: 89c8 mov eax, ecx -;; 3c: 4883c410 add rsp, 0x10 -;; 40: 5d pop rbp -;; 41: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; b802000000 mov eax, 2 +;; 8944240c mov dword ptr [rsp + 0xc], eax +;; b803000000 mov eax, 3 +;; 89442408 mov dword ptr [rsp + 8], eax +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 39c1 cmp ecx, eax +;; b900000000 mov ecx, 0 +;; 400f97c1 seta cl +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 52: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_gt_u/params.wat b/winch/filetests/filetests/x64/i32_gt_u/params.wat index c88a487abfed..fa8b3bbcc6b7 100644 --- a/winch/filetests/filetests/x64/i32_gt_u/params.wat +++ b/winch/filetests/filetests/x64/i32_gt_u/params.wat @@ -7,18 +7,23 @@ (i32.gt_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b442408 mov eax, dword ptr [rsp + 8] -;; 18: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 1c: 39c1 cmp ecx, eax -;; 1e: b900000000 mov ecx, 0 -;; 23: 400f97c1 seta cl -;; 27: 89c8 mov eax, ecx -;; 29: 4883c410 add rsp, 0x10 -;; 2d: 5d pop rbp -;; 2e: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8727000000 ja 0x3f +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 39c1 cmp ecx, eax +;; b900000000 mov ecx, 0 +;; 400f97c1 seta cl +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 3f: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_le_s/const.wat b/winch/filetests/filetests/x64/i32_le_s/const.wat index 69346f153438..70a43175046e 100644 --- a/winch/filetests/filetests/x64/i32_le_s/const.wat +++ b/winch/filetests/filetests/x64/i32_le_s/const.wat @@ -7,14 +7,19 @@ (i32.le_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b802000000 mov eax, 2 -;; 11: 83f803 cmp eax, 3 -;; 14: b800000000 mov eax, 0 -;; 19: 400f9ec0 setle al -;; 1d: 4883c408 add rsp, 8 -;; 21: 5d pop rbp -;; 22: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871b000000 ja 0x33 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b802000000 mov eax, 2 +;; 83f803 cmp eax, 3 +;; b800000000 mov eax, 0 +;; 400f9ec0 setle al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 33: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_le_s/locals.wat b/winch/filetests/filetests/x64/i32_le_s/locals.wat index b75c90ff013e..0317c07e7c1a 100644 --- a/winch/filetests/filetests/x64/i32_le_s/locals.wat +++ b/winch/filetests/filetests/x64/i32_le_s/locals.wat @@ -15,22 +15,27 @@ (i32.le_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f873a000000 ja 0x52 +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: b802000000 mov eax, 2 -;; 1a: 8944240c mov dword ptr [rsp + 0xc], eax -;; 1e: b803000000 mov eax, 3 -;; 23: 89442408 mov dword ptr [rsp + 8], eax -;; 27: 8b442408 mov eax, dword ptr [rsp + 8] -;; 2b: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 2f: 39c1 cmp ecx, eax -;; 31: b900000000 mov ecx, 0 -;; 36: 400f9ec1 setle cl -;; 3a: 89c8 mov eax, ecx -;; 3c: 4883c410 add rsp, 0x10 -;; 40: 5d pop rbp -;; 41: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; b802000000 mov eax, 2 +;; 8944240c mov dword ptr [rsp + 0xc], eax +;; b803000000 mov eax, 3 +;; 89442408 mov dword ptr [rsp + 8], eax +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 39c1 cmp ecx, eax +;; b900000000 mov ecx, 0 +;; 400f9ec1 setle cl +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 52: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_le_s/params.wat b/winch/filetests/filetests/x64/i32_le_s/params.wat index ce246a347d72..50e40bc26fc8 100644 --- a/winch/filetests/filetests/x64/i32_le_s/params.wat +++ b/winch/filetests/filetests/x64/i32_le_s/params.wat @@ -7,18 +7,23 @@ (i32.le_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b442408 mov eax, dword ptr [rsp + 8] -;; 18: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 1c: 39c1 cmp ecx, eax -;; 1e: b900000000 mov ecx, 0 -;; 23: 400f9ec1 setle cl -;; 27: 89c8 mov eax, ecx -;; 29: 4883c410 add rsp, 0x10 -;; 2d: 5d pop rbp -;; 2e: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8727000000 ja 0x3f +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 39c1 cmp ecx, eax +;; b900000000 mov ecx, 0 +;; 400f9ec1 setle cl +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 3f: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_le_u/const.wat b/winch/filetests/filetests/x64/i32_le_u/const.wat index 99e66f46c2c0..de0e938e4c58 100644 --- a/winch/filetests/filetests/x64/i32_le_u/const.wat +++ b/winch/filetests/filetests/x64/i32_le_u/const.wat @@ -8,14 +8,19 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b802000000 mov eax, 2 -;; 11: 83f803 cmp eax, 3 -;; 14: b800000000 mov eax, 0 -;; 19: 400f96c0 setbe al -;; 1d: 4883c408 add rsp, 8 -;; 21: 5d pop rbp -;; 22: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871b000000 ja 0x33 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b802000000 mov eax, 2 +;; 83f803 cmp eax, 3 +;; b800000000 mov eax, 0 +;; 400f96c0 setbe al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 33: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_le_u/locals.wat b/winch/filetests/filetests/x64/i32_le_u/locals.wat index a4d89a53ac08..9f5db8742a77 100644 --- a/winch/filetests/filetests/x64/i32_le_u/locals.wat +++ b/winch/filetests/filetests/x64/i32_le_u/locals.wat @@ -16,22 +16,27 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f873a000000 ja 0x52 +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: b802000000 mov eax, 2 -;; 1a: 8944240c mov dword ptr [rsp + 0xc], eax -;; 1e: b803000000 mov eax, 3 -;; 23: 89442408 mov dword ptr [rsp + 8], eax -;; 27: 8b442408 mov eax, dword ptr [rsp + 8] -;; 2b: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 2f: 39c1 cmp ecx, eax -;; 31: b900000000 mov ecx, 0 -;; 36: 400f96c1 setbe cl -;; 3a: 89c8 mov eax, ecx -;; 3c: 4883c410 add rsp, 0x10 -;; 40: 5d pop rbp -;; 41: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; b802000000 mov eax, 2 +;; 8944240c mov dword ptr [rsp + 0xc], eax +;; b803000000 mov eax, 3 +;; 89442408 mov dword ptr [rsp + 8], eax +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 39c1 cmp ecx, eax +;; b900000000 mov ecx, 0 +;; 400f96c1 setbe cl +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 52: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_le_u/params.wat b/winch/filetests/filetests/x64/i32_le_u/params.wat index 7c9f2b9c5b9a..fa4ae1da3277 100644 --- a/winch/filetests/filetests/x64/i32_le_u/params.wat +++ b/winch/filetests/filetests/x64/i32_le_u/params.wat @@ -7,18 +7,23 @@ (i32.le_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b442408 mov eax, dword ptr [rsp + 8] -;; 18: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 1c: 39c1 cmp ecx, eax -;; 1e: b900000000 mov ecx, 0 -;; 23: 400f96c1 setbe cl -;; 27: 89c8 mov eax, ecx -;; 29: 4883c410 add rsp, 0x10 -;; 2d: 5d pop rbp -;; 2e: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8727000000 ja 0x3f +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 39c1 cmp ecx, eax +;; b900000000 mov ecx, 0 +;; 400f96c1 setbe cl +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 3f: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_lt_s/const.wat b/winch/filetests/filetests/x64/i32_lt_s/const.wat index 5a436151961f..cb616f29248b 100644 --- a/winch/filetests/filetests/x64/i32_lt_s/const.wat +++ b/winch/filetests/filetests/x64/i32_lt_s/const.wat @@ -7,14 +7,19 @@ (i32.lt_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b802000000 mov eax, 2 -;; 11: 83f803 cmp eax, 3 -;; 14: b800000000 mov eax, 0 -;; 19: 400f9cc0 setl al -;; 1d: 4883c408 add rsp, 8 -;; 21: 5d pop rbp -;; 22: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871b000000 ja 0x33 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b802000000 mov eax, 2 +;; 83f803 cmp eax, 3 +;; b800000000 mov eax, 0 +;; 400f9cc0 setl al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 33: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_lt_s/locals.wat b/winch/filetests/filetests/x64/i32_lt_s/locals.wat index f31c40fa8509..5d0a92df0846 100644 --- a/winch/filetests/filetests/x64/i32_lt_s/locals.wat +++ b/winch/filetests/filetests/x64/i32_lt_s/locals.wat @@ -15,22 +15,27 @@ (i32.lt_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f873a000000 ja 0x52 +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: b802000000 mov eax, 2 -;; 1a: 8944240c mov dword ptr [rsp + 0xc], eax -;; 1e: b803000000 mov eax, 3 -;; 23: 89442408 mov dword ptr [rsp + 8], eax -;; 27: 8b442408 mov eax, dword ptr [rsp + 8] -;; 2b: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 2f: 39c1 cmp ecx, eax -;; 31: b900000000 mov ecx, 0 -;; 36: 400f9cc1 setl cl -;; 3a: 89c8 mov eax, ecx -;; 3c: 4883c410 add rsp, 0x10 -;; 40: 5d pop rbp -;; 41: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; b802000000 mov eax, 2 +;; 8944240c mov dword ptr [rsp + 0xc], eax +;; b803000000 mov eax, 3 +;; 89442408 mov dword ptr [rsp + 8], eax +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 39c1 cmp ecx, eax +;; b900000000 mov ecx, 0 +;; 400f9cc1 setl cl +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 52: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_lt_s/params.wat b/winch/filetests/filetests/x64/i32_lt_s/params.wat index cc1975eca8de..b8addc7371e0 100644 --- a/winch/filetests/filetests/x64/i32_lt_s/params.wat +++ b/winch/filetests/filetests/x64/i32_lt_s/params.wat @@ -7,18 +7,23 @@ (i32.lt_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b442408 mov eax, dword ptr [rsp + 8] -;; 18: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 1c: 39c1 cmp ecx, eax -;; 1e: b900000000 mov ecx, 0 -;; 23: 400f9cc1 setl cl -;; 27: 89c8 mov eax, ecx -;; 29: 4883c410 add rsp, 0x10 -;; 2d: 5d pop rbp -;; 2e: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8727000000 ja 0x3f +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 39c1 cmp ecx, eax +;; b900000000 mov ecx, 0 +;; 400f9cc1 setl cl +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 3f: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_lt_u/const.wat b/winch/filetests/filetests/x64/i32_lt_u/const.wat index 853c47ab9314..4b621e896145 100644 --- a/winch/filetests/filetests/x64/i32_lt_u/const.wat +++ b/winch/filetests/filetests/x64/i32_lt_u/const.wat @@ -7,14 +7,19 @@ (i32.lt_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b802000000 mov eax, 2 -;; 11: 83f803 cmp eax, 3 -;; 14: b800000000 mov eax, 0 -;; 19: 400f92c0 setb al -;; 1d: 4883c408 add rsp, 8 -;; 21: 5d pop rbp -;; 22: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871b000000 ja 0x33 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b802000000 mov eax, 2 +;; 83f803 cmp eax, 3 +;; b800000000 mov eax, 0 +;; 400f92c0 setb al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 33: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_lt_u/locals.wat b/winch/filetests/filetests/x64/i32_lt_u/locals.wat index 0a82d4057feb..329883cda2af 100644 --- a/winch/filetests/filetests/x64/i32_lt_u/locals.wat +++ b/winch/filetests/filetests/x64/i32_lt_u/locals.wat @@ -16,22 +16,27 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f873a000000 ja 0x52 +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: b802000000 mov eax, 2 -;; 1a: 8944240c mov dword ptr [rsp + 0xc], eax -;; 1e: b803000000 mov eax, 3 -;; 23: 89442408 mov dword ptr [rsp + 8], eax -;; 27: 8b442408 mov eax, dword ptr [rsp + 8] -;; 2b: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 2f: 39c1 cmp ecx, eax -;; 31: b900000000 mov ecx, 0 -;; 36: 400f92c1 setb cl -;; 3a: 89c8 mov eax, ecx -;; 3c: 4883c410 add rsp, 0x10 -;; 40: 5d pop rbp -;; 41: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; b802000000 mov eax, 2 +;; 8944240c mov dword ptr [rsp + 0xc], eax +;; b803000000 mov eax, 3 +;; 89442408 mov dword ptr [rsp + 8], eax +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 39c1 cmp ecx, eax +;; b900000000 mov ecx, 0 +;; 400f92c1 setb cl +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 52: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_lt_u/params.wat b/winch/filetests/filetests/x64/i32_lt_u/params.wat index 37faf572285e..f52cd6419a50 100644 --- a/winch/filetests/filetests/x64/i32_lt_u/params.wat +++ b/winch/filetests/filetests/x64/i32_lt_u/params.wat @@ -7,18 +7,23 @@ (i32.lt_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b442408 mov eax, dword ptr [rsp + 8] -;; 18: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 1c: 39c1 cmp ecx, eax -;; 1e: b900000000 mov ecx, 0 -;; 23: 400f92c1 setb cl -;; 27: 89c8 mov eax, ecx -;; 29: 4883c410 add rsp, 0x10 -;; 2d: 5d pop rbp -;; 2e: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8727000000 ja 0x3f +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 39c1 cmp ecx, eax +;; b900000000 mov ecx, 0 +;; 400f92c1 setb cl +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 3f: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_mul/const.wat b/winch/filetests/filetests/x64/i32_mul/const.wat index cef93e5a1b5f..e318a3a72520 100644 --- a/winch/filetests/filetests/x64/i32_mul/const.wat +++ b/winch/filetests/filetests/x64/i32_mul/const.wat @@ -7,12 +7,17 @@ (i32.mul) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b80a000000 mov eax, 0xa -;; 11: 6bc014 imul eax, eax, 0x14 -;; 14: 4883c408 add rsp, 8 -;; 18: 5d pop rbp -;; 19: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8712000000 ja 0x2a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b80a000000 mov eax, 0xa +;; 6bc014 imul eax, eax, 0x14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_mul/locals.wat b/winch/filetests/filetests/x64/i32_mul/locals.wat index 32aab2b9e0e6..f65a023ba086 100644 --- a/winch/filetests/filetests/x64/i32_mul/locals.wat +++ b/winch/filetests/filetests/x64/i32_mul/locals.wat @@ -16,20 +16,25 @@ i32.mul ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8732000000 ja 0x4a +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: b80a000000 mov eax, 0xa -;; 1a: 8944240c mov dword ptr [rsp + 0xc], eax -;; 1e: b814000000 mov eax, 0x14 -;; 23: 89442408 mov dword ptr [rsp + 8], eax -;; 27: 8b442408 mov eax, dword ptr [rsp + 8] -;; 2b: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 2f: 0fafc8 imul ecx, eax -;; 32: 89c8 mov eax, ecx -;; 34: 4883c410 add rsp, 0x10 -;; 38: 5d pop rbp -;; 39: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; b80a000000 mov eax, 0xa +;; 8944240c mov dword ptr [rsp + 0xc], eax +;; b814000000 mov eax, 0x14 +;; 89442408 mov dword ptr [rsp + 8], eax +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 0fafc8 imul ecx, eax +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 4a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_mul/max.wat b/winch/filetests/filetests/x64/i32_mul/max.wat index 9b842365ef6b..3b00343d22dc 100644 --- a/winch/filetests/filetests/x64/i32_mul/max.wat +++ b/winch/filetests/filetests/x64/i32_mul/max.wat @@ -6,12 +6,17 @@ (i32.mul) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b8ffffff7f mov eax, 0x7fffffff -;; 11: 6bc0ff imul eax, eax, -1 -;; 14: 4883c408 add rsp, 8 -;; 18: 5d pop rbp -;; 19: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8712000000 ja 0x2a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b8ffffff7f mov eax, 0x7fffffff +;; 6bc0ff imul eax, eax, -1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_mul/max_one.wat b/winch/filetests/filetests/x64/i32_mul/max_one.wat index d384d6ab4397..e9a7361ad557 100644 --- a/winch/filetests/filetests/x64/i32_mul/max_one.wat +++ b/winch/filetests/filetests/x64/i32_mul/max_one.wat @@ -7,12 +7,17 @@ (i32.mul) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b800000080 mov eax, 0x80000000 -;; 11: 6bc0ff imul eax, eax, -1 -;; 14: 4883c408 add rsp, 8 -;; 18: 5d pop rbp -;; 19: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8712000000 ja 0x2a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b800000080 mov eax, 0x80000000 +;; 6bc0ff imul eax, eax, -1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_mul/mixed.wat b/winch/filetests/filetests/x64/i32_mul/mixed.wat index 063aa3214ca5..43bb6e1db7f6 100644 --- a/winch/filetests/filetests/x64/i32_mul/mixed.wat +++ b/winch/filetests/filetests/x64/i32_mul/mixed.wat @@ -7,12 +7,17 @@ (i32.mul) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b8ffffffff mov eax, 0xffffffff -;; 11: 6bc001 imul eax, eax, 1 -;; 14: 4883c408 add rsp, 8 -;; 18: 5d pop rbp -;; 19: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8712000000 ja 0x2a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b8ffffffff mov eax, 0xffffffff +;; 6bc001 imul eax, eax, 1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_mul/params.wat b/winch/filetests/filetests/x64/i32_mul/params.wat index 6ec764f3ca5c..5f7700eae899 100644 --- a/winch/filetests/filetests/x64/i32_mul/params.wat +++ b/winch/filetests/filetests/x64/i32_mul/params.wat @@ -7,16 +7,21 @@ (i32.mul) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b442408 mov eax, dword ptr [rsp + 8] -;; 18: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 1c: 0fafc8 imul ecx, eax -;; 1f: 89c8 mov eax, ecx -;; 21: 4883c410 add rsp, 0x10 -;; 25: 5d pop rbp -;; 26: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871f000000 ja 0x37 +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 0fafc8 imul ecx, eax +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 37: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_mul/signed.wat b/winch/filetests/filetests/x64/i32_mul/signed.wat index ef48e29706df..d1fc07a4d05b 100644 --- a/winch/filetests/filetests/x64/i32_mul/signed.wat +++ b/winch/filetests/filetests/x64/i32_mul/signed.wat @@ -7,12 +7,17 @@ (i32.mul) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b8ffffffff mov eax, 0xffffffff -;; 11: 6bc0ff imul eax, eax, -1 -;; 14: 4883c408 add rsp, 8 -;; 18: 5d pop rbp -;; 19: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8712000000 ja 0x2a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b8ffffffff mov eax, 0xffffffff +;; 6bc0ff imul eax, eax, -1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_mul/unsigned_with_zero.wat b/winch/filetests/filetests/x64/i32_mul/unsigned_with_zero.wat index 79cde3b2cddc..b1bc32184dcf 100644 --- a/winch/filetests/filetests/x64/i32_mul/unsigned_with_zero.wat +++ b/winch/filetests/filetests/x64/i32_mul/unsigned_with_zero.wat @@ -7,12 +7,17 @@ (i32.mul) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b801000000 mov eax, 1 -;; 11: 6bc000 imul eax, eax, 0 -;; 14: 4883c408 add rsp, 8 -;; 18: 5d pop rbp -;; 19: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8712000000 ja 0x2a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 6bc000 imul eax, eax, 0 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_ne/const.wat b/winch/filetests/filetests/x64/i32_ne/const.wat index 1f8e0c3f03a0..079ab834ee49 100644 --- a/winch/filetests/filetests/x64/i32_ne/const.wat +++ b/winch/filetests/filetests/x64/i32_ne/const.wat @@ -7,14 +7,19 @@ (i32.ne) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b802000000 mov eax, 2 -;; 11: 83f803 cmp eax, 3 -;; 14: b800000000 mov eax, 0 -;; 19: 400f95c0 setne al -;; 1d: 4883c408 add rsp, 8 -;; 21: 5d pop rbp -;; 22: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871b000000 ja 0x33 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b802000000 mov eax, 2 +;; 83f803 cmp eax, 3 +;; b800000000 mov eax, 0 +;; 400f95c0 setne al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 33: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_ne/locals.wat b/winch/filetests/filetests/x64/i32_ne/locals.wat index 1086d1775438..8922c7510f97 100644 --- a/winch/filetests/filetests/x64/i32_ne/locals.wat +++ b/winch/filetests/filetests/x64/i32_ne/locals.wat @@ -15,22 +15,27 @@ (i32.ne) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f873a000000 ja 0x52 +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: b802000000 mov eax, 2 -;; 1a: 8944240c mov dword ptr [rsp + 0xc], eax -;; 1e: b803000000 mov eax, 3 -;; 23: 89442408 mov dword ptr [rsp + 8], eax -;; 27: 8b442408 mov eax, dword ptr [rsp + 8] -;; 2b: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 2f: 39c1 cmp ecx, eax -;; 31: b900000000 mov ecx, 0 -;; 36: 400f95c1 setne cl -;; 3a: 89c8 mov eax, ecx -;; 3c: 4883c410 add rsp, 0x10 -;; 40: 5d pop rbp -;; 41: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; b802000000 mov eax, 2 +;; 8944240c mov dword ptr [rsp + 0xc], eax +;; b803000000 mov eax, 3 +;; 89442408 mov dword ptr [rsp + 8], eax +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 39c1 cmp ecx, eax +;; b900000000 mov ecx, 0 +;; 400f95c1 setne cl +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 52: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_ne/params.wat b/winch/filetests/filetests/x64/i32_ne/params.wat index 5a095154f5be..c1d0385b9479 100644 --- a/winch/filetests/filetests/x64/i32_ne/params.wat +++ b/winch/filetests/filetests/x64/i32_ne/params.wat @@ -7,18 +7,23 @@ (i32.ne) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b442408 mov eax, dword ptr [rsp + 8] -;; 18: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 1c: 39c1 cmp ecx, eax -;; 1e: b900000000 mov ecx, 0 -;; 23: 400f95c1 setne cl -;; 27: 89c8 mov eax, ecx -;; 29: 4883c410 add rsp, 0x10 -;; 2d: 5d pop rbp -;; 2e: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8727000000 ja 0x3f +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 39c1 cmp ecx, eax +;; b900000000 mov ecx, 0 +;; 400f95c1 setne cl +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 3f: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_or/const.wat b/winch/filetests/filetests/x64/i32_or/const.wat index 908089d4370e..44f5120bea12 100644 --- a/winch/filetests/filetests/x64/i32_or/const.wat +++ b/winch/filetests/filetests/x64/i32_or/const.wat @@ -7,12 +7,17 @@ (i32.or) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b801000000 mov eax, 1 -;; 11: 83c802 or eax, 2 -;; 14: 4883c408 add rsp, 8 -;; 18: 5d pop rbp -;; 19: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8712000000 ja 0x2a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 83c802 or eax, 2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_or/locals.wat b/winch/filetests/filetests/x64/i32_or/locals.wat index 22cd613adc3e..fb9287a6a0e9 100644 --- a/winch/filetests/filetests/x64/i32_or/locals.wat +++ b/winch/filetests/filetests/x64/i32_or/locals.wat @@ -16,20 +16,25 @@ (i32.or) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8731000000 ja 0x49 +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: b801000000 mov eax, 1 -;; 1a: 8944240c mov dword ptr [rsp + 0xc], eax -;; 1e: b802000000 mov eax, 2 -;; 23: 89442408 mov dword ptr [rsp + 8], eax -;; 27: 8b442408 mov eax, dword ptr [rsp + 8] -;; 2b: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 2f: 09c1 or ecx, eax -;; 31: 89c8 mov eax, ecx -;; 33: 4883c410 add rsp, 0x10 -;; 37: 5d pop rbp -;; 38: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 8944240c mov dword ptr [rsp + 0xc], eax +;; b802000000 mov eax, 2 +;; 89442408 mov dword ptr [rsp + 8], eax +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 09c1 or ecx, eax +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 49: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_or/params.wat b/winch/filetests/filetests/x64/i32_or/params.wat index a18ec5d2afbf..a0fdf0f94bd6 100644 --- a/winch/filetests/filetests/x64/i32_or/params.wat +++ b/winch/filetests/filetests/x64/i32_or/params.wat @@ -7,16 +7,21 @@ (i32.or) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b442408 mov eax, dword ptr [rsp + 8] -;; 18: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 1c: 09c1 or ecx, eax -;; 1e: 89c8 mov eax, ecx -;; 20: 4883c410 add rsp, 0x10 -;; 24: 5d pop rbp -;; 25: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871e000000 ja 0x36 +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 09c1 or ecx, eax +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 36: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_popcnt/const.wat b/winch/filetests/filetests/x64/i32_popcnt/const.wat index 7a68bf3c2385..86867922bba2 100644 --- a/winch/filetests/filetests/x64/i32_popcnt/const.wat +++ b/winch/filetests/filetests/x64/i32_popcnt/const.wat @@ -7,12 +7,17 @@ i32.popcnt ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b803000000 mov eax, 3 -;; 11: f30fb8c0 popcnt eax, eax -;; 15: 4883c408 add rsp, 8 -;; 19: 5d pop rbp -;; 1a: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8713000000 ja 0x2b +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b803000000 mov eax, 3 +;; f30fb8c0 popcnt eax, eax +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2b: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_popcnt/fallback.wat b/winch/filetests/filetests/x64/i32_popcnt/fallback.wat index 9dadfd649da2..05639a7a1a51 100644 --- a/winch/filetests/filetests/x64/i32_popcnt/fallback.wat +++ b/winch/filetests/filetests/x64/i32_popcnt/fallback.wat @@ -6,27 +6,32 @@ i32.popcnt ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b80f000000 mov eax, 0xf -;; 11: 89c1 mov ecx, eax -;; 13: c1e801 shr eax, 1 -;; 16: 81e055555555 and eax, 0x55555555 -;; 1c: 29c1 sub ecx, eax -;; 1e: 89c8 mov eax, ecx -;; 20: 41bb33333333 mov r11d, 0x33333333 -;; 26: 4421d8 and eax, r11d -;; 29: c1e902 shr ecx, 2 -;; 2c: 4421d9 and ecx, r11d -;; 2f: 01c1 add ecx, eax -;; 31: 89c8 mov eax, ecx -;; 33: c1e804 shr eax, 4 -;; 36: 01c8 add eax, ecx -;; 38: 81e00f0f0f0f and eax, 0xf0f0f0f -;; 3e: 69c001010101 imul eax, eax, 0x1010101 -;; 44: c1e818 shr eax, 0x18 -;; 47: 4883c408 add rsp, 8 -;; 4b: 5d pop rbp -;; 4c: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8745000000 ja 0x5d +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b80f000000 mov eax, 0xf +;; 89c1 mov ecx, eax +;; c1e801 shr eax, 1 +;; 81e055555555 and eax, 0x55555555 +;; 29c1 sub ecx, eax +;; 89c8 mov eax, ecx +;; 41bb33333333 mov r11d, 0x33333333 +;; 4421d8 and eax, r11d +;; c1e902 shr ecx, 2 +;; 4421d9 and ecx, r11d +;; 01c1 add ecx, eax +;; 89c8 mov eax, ecx +;; c1e804 shr eax, 4 +;; 01c8 add eax, ecx +;; 81e00f0f0f0f and eax, 0xf0f0f0f +;; 69c001010101 imul eax, eax, 0x1010101 +;; c1e818 shr eax, 0x18 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 5d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_popcnt/no_sse42.wat b/winch/filetests/filetests/x64/i32_popcnt/no_sse42.wat index dc3567e84786..5e49d6387b3d 100644 --- a/winch/filetests/filetests/x64/i32_popcnt/no_sse42.wat +++ b/winch/filetests/filetests/x64/i32_popcnt/no_sse42.wat @@ -7,27 +7,32 @@ i32.popcnt ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b803000000 mov eax, 3 -;; 11: 89c1 mov ecx, eax -;; 13: c1e801 shr eax, 1 -;; 16: 81e055555555 and eax, 0x55555555 -;; 1c: 29c1 sub ecx, eax -;; 1e: 89c8 mov eax, ecx -;; 20: 41bb33333333 mov r11d, 0x33333333 -;; 26: 4421d8 and eax, r11d -;; 29: c1e902 shr ecx, 2 -;; 2c: 4421d9 and ecx, r11d -;; 2f: 01c1 add ecx, eax -;; 31: 89c8 mov eax, ecx -;; 33: c1e804 shr eax, 4 -;; 36: 01c8 add eax, ecx -;; 38: 81e00f0f0f0f and eax, 0xf0f0f0f -;; 3e: 69c001010101 imul eax, eax, 0x1010101 -;; 44: c1e818 shr eax, 0x18 -;; 47: 4883c408 add rsp, 8 -;; 4b: 5d pop rbp -;; 4c: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8745000000 ja 0x5d +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b803000000 mov eax, 3 +;; 89c1 mov ecx, eax +;; c1e801 shr eax, 1 +;; 81e055555555 and eax, 0x55555555 +;; 29c1 sub ecx, eax +;; 89c8 mov eax, ecx +;; 41bb33333333 mov r11d, 0x33333333 +;; 4421d8 and eax, r11d +;; c1e902 shr ecx, 2 +;; 4421d9 and ecx, r11d +;; 01c1 add ecx, eax +;; 89c8 mov eax, ecx +;; c1e804 shr eax, 4 +;; 01c8 add eax, ecx +;; 81e00f0f0f0f and eax, 0xf0f0f0f +;; 69c001010101 imul eax, eax, 0x1010101 +;; c1e818 shr eax, 0x18 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 5d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_popcnt/reg.wat b/winch/filetests/filetests/x64/i32_popcnt/reg.wat index c950a069f108..be30dfa957ef 100644 --- a/winch/filetests/filetests/x64/i32_popcnt/reg.wat +++ b/winch/filetests/filetests/x64/i32_popcnt/reg.wat @@ -7,13 +7,18 @@ i32.popcnt ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 4c893424 mov qword ptr [rsp], r14 -;; 10: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 14: f30fb8c0 popcnt eax, eax -;; 18: 4883c410 add rsp, 0x10 -;; 1c: 5d pop rbp -;; 1d: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8716000000 ja 0x2e +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; f30fb8c0 popcnt eax, eax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 2e: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_reinterpret_f32/const.wat b/winch/filetests/filetests/x64/i32_reinterpret_f32/const.wat new file mode 100644 index 000000000000..bd5fe1d32330 --- /dev/null +++ b/winch/filetests/filetests/x64/i32_reinterpret_f32/const.wat @@ -0,0 +1,23 @@ +;;! target = "x86_64" + +(module + (func (result i32) + (f32.const 1.0) + (i32.reinterpret_f32) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8716000000 ja 0x2e +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f30f10050c000000 movss xmm0, dword ptr [rip + 0xc] +;; 660f7ec0 movd eax, xmm0 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2e: 0f0b ud2 +;; 30: 0000 add byte ptr [rax], al diff --git a/winch/filetests/filetests/x64/i32_reinterpret_f32/locals.wat b/winch/filetests/filetests/x64/i32_reinterpret_f32/locals.wat new file mode 100644 index 000000000000..fc30be36eee1 --- /dev/null +++ b/winch/filetests/filetests/x64/i32_reinterpret_f32/locals.wat @@ -0,0 +1,26 @@ +;;! target = "x86_64" + +(module + (func (result i32) + (local f32) + + (local.get 0) + (i32.reinterpret_f32) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871d000000 ja 0x35 +;; 18: 48c744240800000000 +;; mov qword ptr [rsp + 8], 0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f1044240c movss xmm0, dword ptr [rsp + 0xc] +;; 660f7ec0 movd eax, xmm0 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 35: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_reinterpret_f32/params.wat b/winch/filetests/filetests/x64/i32_reinterpret_f32/params.wat new file mode 100644 index 000000000000..c6e4e5853fd2 --- /dev/null +++ b/winch/filetests/filetests/x64/i32_reinterpret_f32/params.wat @@ -0,0 +1,23 @@ +;;! target = "x86_64" + +(module + (func (param f32) (result i32) + (local.get 0) + (i32.reinterpret_f32) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871a000000 ja 0x32 +;; 18: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f1044240c movss xmm0, dword ptr [rsp + 0xc] +;; 660f7ec0 movd eax, xmm0 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 32: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_reinterpret_f32/ret_float.wat b/winch/filetests/filetests/x64/i32_reinterpret_f32/ret_float.wat new file mode 100644 index 000000000000..2411853f05d4 --- /dev/null +++ b/winch/filetests/filetests/x64/i32_reinterpret_f32/ret_float.wat @@ -0,0 +1,26 @@ +;;! target = "x86_64" + +(module + (func (result f32) + f32.const 1.0 + i32.reinterpret_f32 + drop + f32.const 1.0 + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871e000000 ja 0x36 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f30f100514000000 movss xmm0, dword ptr [rip + 0x14] +;; 660f7ec0 movd eax, xmm0 +;; f30f100508000000 movss xmm0, dword ptr [rip + 8] +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 36: 0f0b ud2 +;; 38: 0000 add byte ptr [rax], al diff --git a/winch/filetests/filetests/x64/i32_rems/const.wat b/winch/filetests/filetests/x64/i32_rems/const.wat index c26fe91c865f..222ba701ea3f 100644 --- a/winch/filetests/filetests/x64/i32_rems/const.wat +++ b/winch/filetests/filetests/x64/i32_rems/const.wat @@ -7,19 +7,24 @@ (i32.rem_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b905000000 mov ecx, 5 -;; 11: b807000000 mov eax, 7 -;; 16: 99 cdq -;; 17: 83f9ff cmp ecx, -1 -;; 1a: 0f850a000000 jne 0x2a -;; 20: ba00000000 mov edx, 0 -;; 25: e902000000 jmp 0x2c -;; 2a: f7f9 idiv ecx -;; 2c: 89d0 mov eax, edx -;; 2e: 4883c408 add rsp, 8 -;; 32: 5d pop rbp -;; 33: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872c000000 ja 0x44 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b905000000 mov ecx, 5 +;; b807000000 mov eax, 7 +;; 99 cdq +;; 83f9ff cmp ecx, -1 +;; 0f850a000000 jne 0x3a +;; 30: ba00000000 mov edx, 0 +;; e902000000 jmp 0x3c +;; 3a: f7f9 idiv ecx +;; 89d0 mov eax, edx +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 44: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_rems/one_zero.wat b/winch/filetests/filetests/x64/i32_rems/one_zero.wat index fc4ddcc1437a..c169b007d308 100644 --- a/winch/filetests/filetests/x64/i32_rems/one_zero.wat +++ b/winch/filetests/filetests/x64/i32_rems/one_zero.wat @@ -7,19 +7,24 @@ (i32.rem_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b900000000 mov ecx, 0 -;; 11: b801000000 mov eax, 1 -;; 16: 99 cdq -;; 17: 83f9ff cmp ecx, -1 -;; 1a: 0f850a000000 jne 0x2a -;; 20: ba00000000 mov edx, 0 -;; 25: e902000000 jmp 0x2c -;; 2a: f7f9 idiv ecx -;; 2c: 89d0 mov eax, edx -;; 2e: 4883c408 add rsp, 8 -;; 32: 5d pop rbp -;; 33: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872c000000 ja 0x44 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b900000000 mov ecx, 0 +;; b801000000 mov eax, 1 +;; 99 cdq +;; 83f9ff cmp ecx, -1 +;; 0f850a000000 jne 0x3a +;; 30: ba00000000 mov edx, 0 +;; e902000000 jmp 0x3c +;; 3a: f7f9 idiv ecx +;; 89d0 mov eax, edx +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 44: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_rems/overflow.wat b/winch/filetests/filetests/x64/i32_rems/overflow.wat index c142baee6d64..e8b6d49d0772 100644 --- a/winch/filetests/filetests/x64/i32_rems/overflow.wat +++ b/winch/filetests/filetests/x64/i32_rems/overflow.wat @@ -7,19 +7,24 @@ (i32.rem_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b9ffffffff mov ecx, 0xffffffff -;; 11: b800000080 mov eax, 0x80000000 -;; 16: 99 cdq -;; 17: 83f9ff cmp ecx, -1 -;; 1a: 0f850a000000 jne 0x2a -;; 20: ba00000000 mov edx, 0 -;; 25: e902000000 jmp 0x2c -;; 2a: f7f9 idiv ecx -;; 2c: 89d0 mov eax, edx -;; 2e: 4883c408 add rsp, 8 -;; 32: 5d pop rbp -;; 33: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872c000000 ja 0x44 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b9ffffffff mov ecx, 0xffffffff +;; b800000080 mov eax, 0x80000000 +;; 99 cdq +;; 83f9ff cmp ecx, -1 +;; 0f850a000000 jne 0x3a +;; 30: ba00000000 mov edx, 0 +;; e902000000 jmp 0x3c +;; 3a: f7f9 idiv ecx +;; 89d0 mov eax, edx +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 44: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_rems/params.wat b/winch/filetests/filetests/x64/i32_rems/params.wat index fdc065d6f6a9..17d718a93e34 100644 --- a/winch/filetests/filetests/x64/i32_rems/params.wat +++ b/winch/filetests/filetests/x64/i32_rems/params.wat @@ -7,21 +7,26 @@ (i32.rem_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b4c2408 mov ecx, dword ptr [rsp + 8] -;; 18: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 1c: 99 cdq -;; 1d: 83f9ff cmp ecx, -1 -;; 20: 0f850a000000 jne 0x30 -;; 26: ba00000000 mov edx, 0 -;; 2b: e902000000 jmp 0x32 -;; 30: f7f9 idiv ecx -;; 32: 89d0 mov eax, edx -;; 34: 4883c410 add rsp, 0x10 -;; 38: 5d pop rbp -;; 39: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8732000000 ja 0x4a +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b4c2408 mov ecx, dword ptr [rsp + 8] +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 99 cdq +;; 83f9ff cmp ecx, -1 +;; 0f850a000000 jne 0x40 +;; 36: ba00000000 mov edx, 0 +;; e902000000 jmp 0x42 +;; 40: f7f9 idiv ecx +;; 89d0 mov eax, edx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 4a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_rems/zero_zero.wat b/winch/filetests/filetests/x64/i32_rems/zero_zero.wat index 4e72472214b7..d2233544b9f9 100644 --- a/winch/filetests/filetests/x64/i32_rems/zero_zero.wat +++ b/winch/filetests/filetests/x64/i32_rems/zero_zero.wat @@ -7,19 +7,24 @@ (i32.rem_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b900000000 mov ecx, 0 -;; 11: b800000000 mov eax, 0 -;; 16: 99 cdq -;; 17: 83f9ff cmp ecx, -1 -;; 1a: 0f850a000000 jne 0x2a -;; 20: ba00000000 mov edx, 0 -;; 25: e902000000 jmp 0x2c -;; 2a: f7f9 idiv ecx -;; 2c: 89d0 mov eax, edx -;; 2e: 4883c408 add rsp, 8 -;; 32: 5d pop rbp -;; 33: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872c000000 ja 0x44 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b900000000 mov ecx, 0 +;; b800000000 mov eax, 0 +;; 99 cdq +;; 83f9ff cmp ecx, -1 +;; 0f850a000000 jne 0x3a +;; 30: ba00000000 mov edx, 0 +;; e902000000 jmp 0x3c +;; 3a: f7f9 idiv ecx +;; 89d0 mov eax, edx +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 44: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_remu/const.wat b/winch/filetests/filetests/x64/i32_remu/const.wat index e1bff6f8dbe5..08d7203e11cf 100644 --- a/winch/filetests/filetests/x64/i32_remu/const.wat +++ b/winch/filetests/filetests/x64/i32_remu/const.wat @@ -7,15 +7,20 @@ (i32.rem_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b905000000 mov ecx, 5 -;; 11: b807000000 mov eax, 7 -;; 16: 31d2 xor edx, edx -;; 18: f7f1 div ecx -;; 1a: 89d0 mov eax, edx -;; 1c: 4883c408 add rsp, 8 -;; 20: 5d pop rbp -;; 21: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871a000000 ja 0x32 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b905000000 mov ecx, 5 +;; b807000000 mov eax, 7 +;; 31d2 xor edx, edx +;; f7f1 div ecx +;; 89d0 mov eax, edx +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 32: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_remu/one_zero.wat b/winch/filetests/filetests/x64/i32_remu/one_zero.wat index 554600597d82..5f38034db6b6 100644 --- a/winch/filetests/filetests/x64/i32_remu/one_zero.wat +++ b/winch/filetests/filetests/x64/i32_remu/one_zero.wat @@ -7,15 +7,20 @@ (i32.rem_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b900000000 mov ecx, 0 -;; 11: b801000000 mov eax, 1 -;; 16: 31d2 xor edx, edx -;; 18: f7f1 div ecx -;; 1a: 89d0 mov eax, edx -;; 1c: 4883c408 add rsp, 8 -;; 20: 5d pop rbp -;; 21: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871a000000 ja 0x32 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b900000000 mov ecx, 0 +;; b801000000 mov eax, 1 +;; 31d2 xor edx, edx +;; f7f1 div ecx +;; 89d0 mov eax, edx +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 32: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_remu/params.wat b/winch/filetests/filetests/x64/i32_remu/params.wat index 20e49a219173..f85250e618f1 100644 --- a/winch/filetests/filetests/x64/i32_remu/params.wat +++ b/winch/filetests/filetests/x64/i32_remu/params.wat @@ -7,17 +7,22 @@ (i32.rem_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b4c2408 mov ecx, dword ptr [rsp + 8] -;; 18: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 1c: 31d2 xor edx, edx -;; 1e: f7f1 div ecx -;; 20: 89d0 mov eax, edx -;; 22: 4883c410 add rsp, 0x10 -;; 26: 5d pop rbp -;; 27: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8720000000 ja 0x38 +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b4c2408 mov ecx, dword ptr [rsp + 8] +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 31d2 xor edx, edx +;; f7f1 div ecx +;; 89d0 mov eax, edx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 38: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_remu/signed.wat b/winch/filetests/filetests/x64/i32_remu/signed.wat index 752fcdd6eed6..b15cfe3d9c7e 100644 --- a/winch/filetests/filetests/x64/i32_remu/signed.wat +++ b/winch/filetests/filetests/x64/i32_remu/signed.wat @@ -7,15 +7,20 @@ (i32.rem_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b9ffffffff mov ecx, 0xffffffff -;; 11: b8ffffffff mov eax, 0xffffffff -;; 16: 31d2 xor edx, edx -;; 18: f7f1 div ecx -;; 1a: 89d0 mov eax, edx -;; 1c: 4883c408 add rsp, 8 -;; 20: 5d pop rbp -;; 21: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871a000000 ja 0x32 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b9ffffffff mov ecx, 0xffffffff +;; b8ffffffff mov eax, 0xffffffff +;; 31d2 xor edx, edx +;; f7f1 div ecx +;; 89d0 mov eax, edx +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 32: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_remu/zero_zero.wat b/winch/filetests/filetests/x64/i32_remu/zero_zero.wat index c20de67f3ed9..bd7fa25ee057 100644 --- a/winch/filetests/filetests/x64/i32_remu/zero_zero.wat +++ b/winch/filetests/filetests/x64/i32_remu/zero_zero.wat @@ -7,15 +7,20 @@ (i32.rem_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b900000000 mov ecx, 0 -;; 11: b800000000 mov eax, 0 -;; 16: 31d2 xor edx, edx -;; 18: f7f1 div ecx -;; 1a: 89d0 mov eax, edx -;; 1c: 4883c408 add rsp, 8 -;; 20: 5d pop rbp -;; 21: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871a000000 ja 0x32 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b900000000 mov ecx, 0 +;; b800000000 mov eax, 0 +;; 31d2 xor edx, edx +;; f7f1 div ecx +;; 89d0 mov eax, edx +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 32: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_rotl/16_const.wat b/winch/filetests/filetests/x64/i32_rotl/16_const.wat index 55b6028e268b..b4b5f3e1ce90 100644 --- a/winch/filetests/filetests/x64/i32_rotl/16_const.wat +++ b/winch/filetests/filetests/x64/i32_rotl/16_const.wat @@ -7,12 +7,17 @@ (i32.rotl) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b801000000 mov eax, 1 -;; 11: c1c000 rol eax, 0 -;; 14: 4883c408 add rsp, 8 -;; 18: 5d pop rbp -;; 19: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8712000000 ja 0x2a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; c1c000 rol eax, 0 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_rotl/8_const.wat b/winch/filetests/filetests/x64/i32_rotl/8_const.wat index 03d60e38bacd..61990572cf96 100644 --- a/winch/filetests/filetests/x64/i32_rotl/8_const.wat +++ b/winch/filetests/filetests/x64/i32_rotl/8_const.wat @@ -7,12 +7,17 @@ (i32.rotl) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b801000000 mov eax, 1 -;; 11: c1c002 rol eax, 2 -;; 14: 4883c408 add rsp, 8 -;; 18: 5d pop rbp -;; 19: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8712000000 ja 0x2a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; c1c002 rol eax, 2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_rotl/locals.wat b/winch/filetests/filetests/x64/i32_rotl/locals.wat index 3c9f3c350cfe..c5a9ba19b510 100644 --- a/winch/filetests/filetests/x64/i32_rotl/locals.wat +++ b/winch/filetests/filetests/x64/i32_rotl/locals.wat @@ -16,19 +16,24 @@ (i32.rotl) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872f000000 ja 0x47 +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: b801000000 mov eax, 1 -;; 1a: 8944240c mov dword ptr [rsp + 0xc], eax -;; 1e: b802000000 mov eax, 2 -;; 23: 89442408 mov dword ptr [rsp + 8], eax -;; 27: 8b4c2408 mov ecx, dword ptr [rsp + 8] -;; 2b: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 2f: d3c0 rol eax, cl -;; 31: 4883c410 add rsp, 0x10 -;; 35: 5d pop rbp -;; 36: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 8944240c mov dword ptr [rsp + 0xc], eax +;; b802000000 mov eax, 2 +;; 89442408 mov dword ptr [rsp + 8], eax +;; 8b4c2408 mov ecx, dword ptr [rsp + 8] +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; d3c0 rol eax, cl +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 47: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_rotl/params.wat b/winch/filetests/filetests/x64/i32_rotl/params.wat index c53c48db1494..54f2a4135be7 100644 --- a/winch/filetests/filetests/x64/i32_rotl/params.wat +++ b/winch/filetests/filetests/x64/i32_rotl/params.wat @@ -7,15 +7,20 @@ (i32.rotl) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b4c2408 mov ecx, dword ptr [rsp + 8] -;; 18: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 1c: d3c0 rol eax, cl -;; 1e: 4883c410 add rsp, 0x10 -;; 22: 5d pop rbp -;; 23: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871c000000 ja 0x34 +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b4c2408 mov ecx, dword ptr [rsp + 8] +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; d3c0 rol eax, cl +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 34: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_rotr/16_const.wat b/winch/filetests/filetests/x64/i32_rotr/16_const.wat index d3190d05e150..52b22a66b36b 100644 --- a/winch/filetests/filetests/x64/i32_rotr/16_const.wat +++ b/winch/filetests/filetests/x64/i32_rotr/16_const.wat @@ -7,12 +7,17 @@ (i32.rotr) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b801000000 mov eax, 1 -;; 11: c1c800 ror eax, 0 -;; 14: 4883c408 add rsp, 8 -;; 18: 5d pop rbp -;; 19: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8712000000 ja 0x2a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; c1c800 ror eax, 0 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_rotr/8_const.wat b/winch/filetests/filetests/x64/i32_rotr/8_const.wat index f2b66bdbd677..bb88ba4d1814 100644 --- a/winch/filetests/filetests/x64/i32_rotr/8_const.wat +++ b/winch/filetests/filetests/x64/i32_rotr/8_const.wat @@ -7,12 +7,17 @@ (i32.rotr) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b801000000 mov eax, 1 -;; 11: c1c802 ror eax, 2 -;; 14: 4883c408 add rsp, 8 -;; 18: 5d pop rbp -;; 19: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8712000000 ja 0x2a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; c1c802 ror eax, 2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_rotr/locals.wat b/winch/filetests/filetests/x64/i32_rotr/locals.wat index fab967bd2665..cc5363950022 100644 --- a/winch/filetests/filetests/x64/i32_rotr/locals.wat +++ b/winch/filetests/filetests/x64/i32_rotr/locals.wat @@ -16,19 +16,24 @@ (i32.rotr) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872f000000 ja 0x47 +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: b801000000 mov eax, 1 -;; 1a: 8944240c mov dword ptr [rsp + 0xc], eax -;; 1e: b802000000 mov eax, 2 -;; 23: 89442408 mov dword ptr [rsp + 8], eax -;; 27: 8b4c2408 mov ecx, dword ptr [rsp + 8] -;; 2b: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 2f: d3c8 ror eax, cl -;; 31: 4883c410 add rsp, 0x10 -;; 35: 5d pop rbp -;; 36: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 8944240c mov dword ptr [rsp + 0xc], eax +;; b802000000 mov eax, 2 +;; 89442408 mov dword ptr [rsp + 8], eax +;; 8b4c2408 mov ecx, dword ptr [rsp + 8] +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; d3c8 ror eax, cl +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 47: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_rotr/params.wat b/winch/filetests/filetests/x64/i32_rotr/params.wat index b7c5452153d0..64684c5bc0fe 100644 --- a/winch/filetests/filetests/x64/i32_rotr/params.wat +++ b/winch/filetests/filetests/x64/i32_rotr/params.wat @@ -7,15 +7,20 @@ (i32.rotr) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b4c2408 mov ecx, dword ptr [rsp + 8] -;; 18: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 1c: d3c8 ror eax, cl -;; 1e: 4883c410 add rsp, 0x10 -;; 22: 5d pop rbp -;; 23: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871c000000 ja 0x34 +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b4c2408 mov ecx, dword ptr [rsp + 8] +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; d3c8 ror eax, cl +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 34: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_shl/16_const.wat b/winch/filetests/filetests/x64/i32_shl/16_const.wat index 1196dbd3c8dc..f6218c166a11 100644 --- a/winch/filetests/filetests/x64/i32_shl/16_const.wat +++ b/winch/filetests/filetests/x64/i32_shl/16_const.wat @@ -8,12 +8,17 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b801000000 mov eax, 1 -;; 11: c1e000 shl eax, 0 -;; 14: 4883c408 add rsp, 8 -;; 18: 5d pop rbp -;; 19: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8712000000 ja 0x2a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; c1e000 shl eax, 0 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_shl/8_const.wat b/winch/filetests/filetests/x64/i32_shl/8_const.wat index 219b21bc71d2..e2bac59ed75e 100644 --- a/winch/filetests/filetests/x64/i32_shl/8_const.wat +++ b/winch/filetests/filetests/x64/i32_shl/8_const.wat @@ -8,12 +8,17 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b801000000 mov eax, 1 -;; 11: c1e002 shl eax, 2 -;; 14: 4883c408 add rsp, 8 -;; 18: 5d pop rbp -;; 19: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8712000000 ja 0x2a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; c1e002 shl eax, 2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_shl/locals.wat b/winch/filetests/filetests/x64/i32_shl/locals.wat index 0d05168acb59..a681a4296d52 100644 --- a/winch/filetests/filetests/x64/i32_shl/locals.wat +++ b/winch/filetests/filetests/x64/i32_shl/locals.wat @@ -16,19 +16,24 @@ (i32.shl) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872f000000 ja 0x47 +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: b801000000 mov eax, 1 -;; 1a: 8944240c mov dword ptr [rsp + 0xc], eax -;; 1e: b802000000 mov eax, 2 -;; 23: 89442408 mov dword ptr [rsp + 8], eax -;; 27: 8b4c2408 mov ecx, dword ptr [rsp + 8] -;; 2b: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 2f: d3e0 shl eax, cl -;; 31: 4883c410 add rsp, 0x10 -;; 35: 5d pop rbp -;; 36: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 8944240c mov dword ptr [rsp + 0xc], eax +;; b802000000 mov eax, 2 +;; 89442408 mov dword ptr [rsp + 8], eax +;; 8b4c2408 mov ecx, dword ptr [rsp + 8] +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; d3e0 shl eax, cl +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 47: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_shl/params.wat b/winch/filetests/filetests/x64/i32_shl/params.wat index 099ac2940b9f..d0a7de810b6b 100644 --- a/winch/filetests/filetests/x64/i32_shl/params.wat +++ b/winch/filetests/filetests/x64/i32_shl/params.wat @@ -7,15 +7,20 @@ (i32.shl) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b4c2408 mov ecx, dword ptr [rsp + 8] -;; 18: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 1c: d3e0 shl eax, cl -;; 1e: 4883c410 add rsp, 0x10 -;; 22: 5d pop rbp -;; 23: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871c000000 ja 0x34 +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b4c2408 mov ecx, dword ptr [rsp + 8] +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; d3e0 shl eax, cl +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 34: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_shr_s/16_const.wat b/winch/filetests/filetests/x64/i32_shr_s/16_const.wat index 47d18ef5cb69..ed3bdd67913d 100644 --- a/winch/filetests/filetests/x64/i32_shr_s/16_const.wat +++ b/winch/filetests/filetests/x64/i32_shr_s/16_const.wat @@ -7,12 +7,17 @@ (i32.shr_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b801000000 mov eax, 1 -;; 11: c1f800 sar eax, 0 -;; 14: 4883c408 add rsp, 8 -;; 18: 5d pop rbp -;; 19: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8712000000 ja 0x2a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; c1f800 sar eax, 0 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_shr_s/8_const.wat b/winch/filetests/filetests/x64/i32_shr_s/8_const.wat index e6b1611961c7..8e2315128c13 100644 --- a/winch/filetests/filetests/x64/i32_shr_s/8_const.wat +++ b/winch/filetests/filetests/x64/i32_shr_s/8_const.wat @@ -7,12 +7,17 @@ (i32.shr_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b801000000 mov eax, 1 -;; 11: c1f802 sar eax, 2 -;; 14: 4883c408 add rsp, 8 -;; 18: 5d pop rbp -;; 19: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8712000000 ja 0x2a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; c1f802 sar eax, 2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_shr_s/locals.wat b/winch/filetests/filetests/x64/i32_shr_s/locals.wat index c1794d59050f..d2879d9c3425 100644 --- a/winch/filetests/filetests/x64/i32_shr_s/locals.wat +++ b/winch/filetests/filetests/x64/i32_shr_s/locals.wat @@ -16,19 +16,24 @@ (i32.shr_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872f000000 ja 0x47 +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: b801000000 mov eax, 1 -;; 1a: 8944240c mov dword ptr [rsp + 0xc], eax -;; 1e: b802000000 mov eax, 2 -;; 23: 89442408 mov dword ptr [rsp + 8], eax -;; 27: 8b4c2408 mov ecx, dword ptr [rsp + 8] -;; 2b: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 2f: d3f8 sar eax, cl -;; 31: 4883c410 add rsp, 0x10 -;; 35: 5d pop rbp -;; 36: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 8944240c mov dword ptr [rsp + 0xc], eax +;; b802000000 mov eax, 2 +;; 89442408 mov dword ptr [rsp + 8], eax +;; 8b4c2408 mov ecx, dword ptr [rsp + 8] +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; d3f8 sar eax, cl +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 47: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_shr_s/params.wat b/winch/filetests/filetests/x64/i32_shr_s/params.wat index 58ad20ab54fd..283d89335cb6 100644 --- a/winch/filetests/filetests/x64/i32_shr_s/params.wat +++ b/winch/filetests/filetests/x64/i32_shr_s/params.wat @@ -7,15 +7,20 @@ (i32.shr_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b4c2408 mov ecx, dword ptr [rsp + 8] -;; 18: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 1c: d3f8 sar eax, cl -;; 1e: 4883c410 add rsp, 0x10 -;; 22: 5d pop rbp -;; 23: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871c000000 ja 0x34 +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b4c2408 mov ecx, dword ptr [rsp + 8] +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; d3f8 sar eax, cl +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 34: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_shr_u/16_const.wat b/winch/filetests/filetests/x64/i32_shr_u/16_const.wat index 0149d331739c..f185762ff1a7 100644 --- a/winch/filetests/filetests/x64/i32_shr_u/16_const.wat +++ b/winch/filetests/filetests/x64/i32_shr_u/16_const.wat @@ -7,12 +7,17 @@ (i32.shr_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b801000000 mov eax, 1 -;; 11: c1e800 shr eax, 0 -;; 14: 4883c408 add rsp, 8 -;; 18: 5d pop rbp -;; 19: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8712000000 ja 0x2a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; c1e800 shr eax, 0 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_shr_u/8_const.wat b/winch/filetests/filetests/x64/i32_shr_u/8_const.wat index 065f2aef3409..f8ab98490546 100644 --- a/winch/filetests/filetests/x64/i32_shr_u/8_const.wat +++ b/winch/filetests/filetests/x64/i32_shr_u/8_const.wat @@ -7,12 +7,17 @@ (i32.shr_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b801000000 mov eax, 1 -;; 11: c1e802 shr eax, 2 -;; 14: 4883c408 add rsp, 8 -;; 18: 5d pop rbp -;; 19: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8712000000 ja 0x2a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; c1e802 shr eax, 2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_shr_u/locals.wat b/winch/filetests/filetests/x64/i32_shr_u/locals.wat index 02b3a85b03bb..91a9025ca4fe 100644 --- a/winch/filetests/filetests/x64/i32_shr_u/locals.wat +++ b/winch/filetests/filetests/x64/i32_shr_u/locals.wat @@ -16,19 +16,24 @@ (i32.shr_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872f000000 ja 0x47 +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: b801000000 mov eax, 1 -;; 1a: 8944240c mov dword ptr [rsp + 0xc], eax -;; 1e: b802000000 mov eax, 2 -;; 23: 89442408 mov dword ptr [rsp + 8], eax -;; 27: 8b4c2408 mov ecx, dword ptr [rsp + 8] -;; 2b: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 2f: d3e8 shr eax, cl -;; 31: 4883c410 add rsp, 0x10 -;; 35: 5d pop rbp -;; 36: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 8944240c mov dword ptr [rsp + 0xc], eax +;; b802000000 mov eax, 2 +;; 89442408 mov dword ptr [rsp + 8], eax +;; 8b4c2408 mov ecx, dword ptr [rsp + 8] +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; d3e8 shr eax, cl +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 47: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_shr_u/params.wat b/winch/filetests/filetests/x64/i32_shr_u/params.wat index af61f5f1fd5b..d571faf84f71 100644 --- a/winch/filetests/filetests/x64/i32_shr_u/params.wat +++ b/winch/filetests/filetests/x64/i32_shr_u/params.wat @@ -7,15 +7,20 @@ (i32.shr_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b4c2408 mov ecx, dword ptr [rsp + 8] -;; 18: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 1c: d3e8 shr eax, cl -;; 1e: 4883c410 add rsp, 0x10 -;; 22: 5d pop rbp -;; 23: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871c000000 ja 0x34 +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b4c2408 mov ecx, dword ptr [rsp + 8] +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; d3e8 shr eax, cl +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 34: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_sub/const.wat b/winch/filetests/filetests/x64/i32_sub/const.wat index 27959188d959..900091105073 100644 --- a/winch/filetests/filetests/x64/i32_sub/const.wat +++ b/winch/filetests/filetests/x64/i32_sub/const.wat @@ -7,12 +7,17 @@ (i32.sub) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b80a000000 mov eax, 0xa -;; 11: 83e814 sub eax, 0x14 -;; 14: 4883c408 add rsp, 8 -;; 18: 5d pop rbp -;; 19: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8712000000 ja 0x2a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b80a000000 mov eax, 0xa +;; 83e814 sub eax, 0x14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_sub/locals.wat b/winch/filetests/filetests/x64/i32_sub/locals.wat index b8d1ea817ec7..a84462464b59 100644 --- a/winch/filetests/filetests/x64/i32_sub/locals.wat +++ b/winch/filetests/filetests/x64/i32_sub/locals.wat @@ -16,20 +16,25 @@ i32.sub ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8731000000 ja 0x49 +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: b80a000000 mov eax, 0xa -;; 1a: 8944240c mov dword ptr [rsp + 0xc], eax -;; 1e: b814000000 mov eax, 0x14 -;; 23: 89442408 mov dword ptr [rsp + 8], eax -;; 27: 8b442408 mov eax, dword ptr [rsp + 8] -;; 2b: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 2f: 29c1 sub ecx, eax -;; 31: 89c8 mov eax, ecx -;; 33: 4883c410 add rsp, 0x10 -;; 37: 5d pop rbp -;; 38: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; b80a000000 mov eax, 0xa +;; 8944240c mov dword ptr [rsp + 0xc], eax +;; b814000000 mov eax, 0x14 +;; 89442408 mov dword ptr [rsp + 8], eax +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 29c1 sub ecx, eax +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 49: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_sub/max.wat b/winch/filetests/filetests/x64/i32_sub/max.wat index c988bd609388..b44649c2bec5 100644 --- a/winch/filetests/filetests/x64/i32_sub/max.wat +++ b/winch/filetests/filetests/x64/i32_sub/max.wat @@ -6,12 +6,17 @@ (i32.sub) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b8ffffff7f mov eax, 0x7fffffff -;; 11: 83e8ff sub eax, -1 -;; 14: 4883c408 add rsp, 8 -;; 18: 5d pop rbp -;; 19: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8712000000 ja 0x2a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b8ffffff7f mov eax, 0x7fffffff +;; 83e8ff sub eax, -1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_sub/max_one.wat b/winch/filetests/filetests/x64/i32_sub/max_one.wat index e2d82efc7cc1..8d94bc25f6d2 100644 --- a/winch/filetests/filetests/x64/i32_sub/max_one.wat +++ b/winch/filetests/filetests/x64/i32_sub/max_one.wat @@ -7,12 +7,17 @@ (i32.sub) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b800000080 mov eax, 0x80000000 -;; 11: 83e801 sub eax, 1 -;; 14: 4883c408 add rsp, 8 -;; 18: 5d pop rbp -;; 19: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8712000000 ja 0x2a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b800000080 mov eax, 0x80000000 +;; 83e801 sub eax, 1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_sub/mixed.wat b/winch/filetests/filetests/x64/i32_sub/mixed.wat index b44d7e41b6cf..d13991049225 100644 --- a/winch/filetests/filetests/x64/i32_sub/mixed.wat +++ b/winch/filetests/filetests/x64/i32_sub/mixed.wat @@ -7,12 +7,17 @@ (i32.sub) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b8ffffffff mov eax, 0xffffffff -;; 11: 83e801 sub eax, 1 -;; 14: 4883c408 add rsp, 8 -;; 18: 5d pop rbp -;; 19: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8712000000 ja 0x2a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b8ffffffff mov eax, 0xffffffff +;; 83e801 sub eax, 1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_sub/params.wat b/winch/filetests/filetests/x64/i32_sub/params.wat index 223f15fed10d..4e4857620976 100644 --- a/winch/filetests/filetests/x64/i32_sub/params.wat +++ b/winch/filetests/filetests/x64/i32_sub/params.wat @@ -7,16 +7,21 @@ (i32.sub) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b442408 mov eax, dword ptr [rsp + 8] -;; 18: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 1c: 29c1 sub ecx, eax -;; 1e: 89c8 mov eax, ecx -;; 20: 4883c410 add rsp, 0x10 -;; 24: 5d pop rbp -;; 25: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871e000000 ja 0x36 +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 29c1 sub ecx, eax +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 36: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_sub/signed.wat b/winch/filetests/filetests/x64/i32_sub/signed.wat index 675b03ee0c71..8f783067e40c 100644 --- a/winch/filetests/filetests/x64/i32_sub/signed.wat +++ b/winch/filetests/filetests/x64/i32_sub/signed.wat @@ -7,12 +7,17 @@ (i32.sub) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b8ffffffff mov eax, 0xffffffff -;; 11: 83e8ff sub eax, -1 -;; 14: 4883c408 add rsp, 8 -;; 18: 5d pop rbp -;; 19: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8712000000 ja 0x2a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b8ffffffff mov eax, 0xffffffff +;; 83e8ff sub eax, -1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_sub/unsigned_with_zero.wat b/winch/filetests/filetests/x64/i32_sub/unsigned_with_zero.wat index 1792f1bf828a..e521307af68d 100644 --- a/winch/filetests/filetests/x64/i32_sub/unsigned_with_zero.wat +++ b/winch/filetests/filetests/x64/i32_sub/unsigned_with_zero.wat @@ -7,12 +7,17 @@ (i32.sub) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b801000000 mov eax, 1 -;; 11: 83e800 sub eax, 0 -;; 14: 4883c408 add rsp, 8 -;; 18: 5d pop rbp -;; 19: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8712000000 ja 0x2a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 83e800 sub eax, 0 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_trunc_f32_s/const.wat b/winch/filetests/filetests/x64/i32_trunc_f32_s/const.wat new file mode 100644 index 000000000000..d2a5baa25ada --- /dev/null +++ b/winch/filetests/filetests/x64/i32_trunc_f32_s/const.wat @@ -0,0 +1,39 @@ +;;! target = "x86_64" + +(module + (func (result i32) + (f32.const 1.0) + (i32.trunc_f32_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f874c000000 ja 0x64 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f30f10054c000000 movss xmm0, dword ptr [rip + 0x4c] +;; f30f2cc0 cvttss2si eax, xmm0 +;; 83f801 cmp eax, 1 +;; 0f812d000000 jno 0x5e +;; 31: 0f2ec0 ucomiss xmm0, xmm0 +;; 0f8a2c000000 jp 0x66 +;; 3a: 41bb000000cf mov r11d, 0xcf000000 +;; 66450f6efb movd xmm15, r11d +;; 410f2ec7 ucomiss xmm0, xmm15 +;; 0f8219000000 jb 0x68 +;; 4f: 66450f57ff xorpd xmm15, xmm15 +;; 440f2ef8 ucomiss xmm15, xmm0 +;; 0f820c000000 jb 0x6a +;; 5e: 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 64: 0f0b ud2 +;; 66: 0f0b ud2 +;; 68: 0f0b ud2 +;; 6a: 0f0b ud2 +;; 6c: 0000 add byte ptr [rax], al +;; 6e: 0000 add byte ptr [rax], al +;; 70: 0000 add byte ptr [rax], al diff --git a/winch/filetests/filetests/x64/i32_trunc_f32_s/locals.wat b/winch/filetests/filetests/x64/i32_trunc_f32_s/locals.wat new file mode 100644 index 000000000000..237b78c30073 --- /dev/null +++ b/winch/filetests/filetests/x64/i32_trunc_f32_s/locals.wat @@ -0,0 +1,40 @@ +;;! target = "x86_64" + +(module + (func (result i32) + (local f32) + + (local.get 0) + (i32.trunc_f32_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8753000000 ja 0x6b +;; 18: 48c744240800000000 +;; mov qword ptr [rsp + 8], 0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f1044240c movss xmm0, dword ptr [rsp + 0xc] +;; f30f2cc0 cvttss2si eax, xmm0 +;; 83f801 cmp eax, 1 +;; 0f812d000000 jno 0x65 +;; 38: 0f2ec0 ucomiss xmm0, xmm0 +;; 0f8a2c000000 jp 0x6d +;; 41: 41bb000000cf mov r11d, 0xcf000000 +;; 66450f6efb movd xmm15, r11d +;; 410f2ec7 ucomiss xmm0, xmm15 +;; 0f8219000000 jb 0x6f +;; 56: 66450f57ff xorpd xmm15, xmm15 +;; 440f2ef8 ucomiss xmm15, xmm0 +;; 0f820c000000 jb 0x71 +;; 65: 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 6b: 0f0b ud2 +;; 6d: 0f0b ud2 +;; 6f: 0f0b ud2 +;; 71: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_trunc_f32_s/params.wat b/winch/filetests/filetests/x64/i32_trunc_f32_s/params.wat new file mode 100644 index 000000000000..56a7e68efd6c --- /dev/null +++ b/winch/filetests/filetests/x64/i32_trunc_f32_s/params.wat @@ -0,0 +1,37 @@ +;;! target = "x86_64" + +(module + (func (param f32) (result i32) + (local.get 0) + (i32.trunc_f32_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8750000000 ja 0x68 +;; 18: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f1044240c movss xmm0, dword ptr [rsp + 0xc] +;; f30f2cc0 cvttss2si eax, xmm0 +;; 83f801 cmp eax, 1 +;; 0f812d000000 jno 0x62 +;; 35: 0f2ec0 ucomiss xmm0, xmm0 +;; 0f8a2c000000 jp 0x6a +;; 3e: 41bb000000cf mov r11d, 0xcf000000 +;; 66450f6efb movd xmm15, r11d +;; 410f2ec7 ucomiss xmm0, xmm15 +;; 0f8219000000 jb 0x6c +;; 53: 66450f57ff xorpd xmm15, xmm15 +;; 440f2ef8 ucomiss xmm15, xmm0 +;; 0f820c000000 jb 0x6e +;; 62: 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 68: 0f0b ud2 +;; 6a: 0f0b ud2 +;; 6c: 0f0b ud2 +;; 6e: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_trunc_f32_u/const.wat b/winch/filetests/filetests/x64/i32_trunc_f32_u/const.wat new file mode 100644 index 000000000000..ab9ceee72329 --- /dev/null +++ b/winch/filetests/filetests/x64/i32_trunc_f32_u/const.wat @@ -0,0 +1,40 @@ +;;! target = "x86_64" + +(module + (func (result i32) + (f32.const 1.0) + (i32.trunc_f32_u) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8757000000 ja 0x6f +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f30f100d54000000 movss xmm1, dword ptr [rip + 0x54] +;; 41bb0000004f mov r11d, 0x4f000000 +;; 66450f6efb movd xmm15, r11d +;; 410f2ecf ucomiss xmm1, xmm15 +;; 0f8315000000 jae 0x4e +;; 0f8a32000000 jp 0x71 +;; 3f: f30f2cc1 cvttss2si eax, xmm1 +;; 83f800 cmp eax, 0 +;; 0f8d1d000000 jge 0x69 +;; 4c: 0f0b ud2 +;; 0f28c1 movaps xmm0, xmm1 +;; f3410f5cc7 subss xmm0, xmm15 +;; f30f2cc0 cvttss2si eax, xmm0 +;; 83f800 cmp eax, 0 +;; 0f8c10000000 jl 0x73 +;; 63: 81c000000080 add eax, 0x80000000 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 6f: 0f0b ud2 +;; 71: 0f0b ud2 +;; 73: 0f0b ud2 +;; 75: 0000 add byte ptr [rax], al +;; 77: 0000 add byte ptr [rax], al diff --git a/winch/filetests/filetests/x64/i32_trunc_f32_u/locals.wat b/winch/filetests/filetests/x64/i32_trunc_f32_u/locals.wat new file mode 100644 index 000000000000..5a4adae66834 --- /dev/null +++ b/winch/filetests/filetests/x64/i32_trunc_f32_u/locals.wat @@ -0,0 +1,42 @@ +;;! target = "x86_64" + +(module + (func (result i32) + (local f32) + + (local.get 0) + (i32.trunc_f32_u) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f875e000000 ja 0x76 +;; 18: 48c744240800000000 +;; mov qword ptr [rsp + 8], 0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f104c240c movss xmm1, dword ptr [rsp + 0xc] +;; 41bb0000004f mov r11d, 0x4f000000 +;; 66450f6efb movd xmm15, r11d +;; 410f2ecf ucomiss xmm1, xmm15 +;; 0f8315000000 jae 0x55 +;; 0f8a32000000 jp 0x78 +;; 46: f30f2cc1 cvttss2si eax, xmm1 +;; 83f800 cmp eax, 0 +;; 0f8d1d000000 jge 0x70 +;; 53: 0f0b ud2 +;; 0f28c1 movaps xmm0, xmm1 +;; f3410f5cc7 subss xmm0, xmm15 +;; f30f2cc0 cvttss2si eax, xmm0 +;; 83f800 cmp eax, 0 +;; 0f8c10000000 jl 0x7a +;; 6a: 81c000000080 add eax, 0x80000000 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 76: 0f0b ud2 +;; 78: 0f0b ud2 +;; 7a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_trunc_f32_u/params.wat b/winch/filetests/filetests/x64/i32_trunc_f32_u/params.wat new file mode 100644 index 000000000000..e4736a255350 --- /dev/null +++ b/winch/filetests/filetests/x64/i32_trunc_f32_u/params.wat @@ -0,0 +1,39 @@ +;;! target = "x86_64" + +(module + (func (param f32) (result i32) + (local.get 0) + (i32.trunc_f32_u) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f875b000000 ja 0x73 +;; 18: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f104c240c movss xmm1, dword ptr [rsp + 0xc] +;; 41bb0000004f mov r11d, 0x4f000000 +;; 66450f6efb movd xmm15, r11d +;; 410f2ecf ucomiss xmm1, xmm15 +;; 0f8315000000 jae 0x52 +;; 0f8a32000000 jp 0x75 +;; 43: f30f2cc1 cvttss2si eax, xmm1 +;; 83f800 cmp eax, 0 +;; 0f8d1d000000 jge 0x6d +;; 50: 0f0b ud2 +;; 0f28c1 movaps xmm0, xmm1 +;; f3410f5cc7 subss xmm0, xmm15 +;; f30f2cc0 cvttss2si eax, xmm0 +;; 83f800 cmp eax, 0 +;; 0f8c10000000 jl 0x77 +;; 67: 81c000000080 add eax, 0x80000000 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 73: 0f0b ud2 +;; 75: 0f0b ud2 +;; 77: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_trunc_f64_s/const.wat b/winch/filetests/filetests/x64/i32_trunc_f64_s/const.wat new file mode 100644 index 000000000000..983d68d3840e --- /dev/null +++ b/winch/filetests/filetests/x64/i32_trunc_f64_s/const.wat @@ -0,0 +1,43 @@ +;;! target = "x86_64" + +(module + (func (result i32) + (f64.const 1.0) + (i32.trunc_f64_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8753000000 ja 0x6b +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f20f100554000000 movsd xmm0, qword ptr [rip + 0x54] +;; f20f2cc0 cvttsd2si eax, xmm0 +;; 83f801 cmp eax, 1 +;; 0f8134000000 jno 0x65 +;; 31: 660f2ec0 ucomisd xmm0, xmm0 +;; 0f8a32000000 jp 0x6d +;; 3b: 49bb000020000000e0c1 +;; movabs r11, 0xc1e0000000200000 +;; 664d0f6efb movq xmm15, r11 +;; 66410f2ec7 ucomisd xmm0, xmm15 +;; 0f861a000000 jbe 0x6f +;; 55: 66450f57ff xorpd xmm15, xmm15 +;; 66440f2ef8 ucomisd xmm15, xmm0 +;; 0f820c000000 jb 0x71 +;; 65: 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 6b: 0f0b ud2 +;; 6d: 0f0b ud2 +;; 6f: 0f0b ud2 +;; 71: 0f0b ud2 +;; 73: 0000 add byte ptr [rax], al +;; 75: 0000 add byte ptr [rax], al +;; 77: 0000 add byte ptr [rax], al +;; 79: 0000 add byte ptr [rax], al +;; 7b: 0000 add byte ptr [rax], al +;; 7d: 00f0 add al, dh diff --git a/winch/filetests/filetests/x64/i32_trunc_f64_s/locals.wat b/winch/filetests/filetests/x64/i32_trunc_f64_s/locals.wat new file mode 100644 index 000000000000..77278489b062 --- /dev/null +++ b/winch/filetests/filetests/x64/i32_trunc_f64_s/locals.wat @@ -0,0 +1,41 @@ +;;! target = "x86_64" + +(module + (func (result i32) + (local f64) + + (local.get 0) + (i32.trunc_f64_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f875a000000 ja 0x72 +;; 18: 48c744240800000000 +;; mov qword ptr [rsp + 8], 0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; f20f2cc0 cvttsd2si eax, xmm0 +;; 83f801 cmp eax, 1 +;; 0f8134000000 jno 0x6c +;; 38: 660f2ec0 ucomisd xmm0, xmm0 +;; 0f8a32000000 jp 0x74 +;; 42: 49bb000020000000e0c1 +;; movabs r11, 0xc1e0000000200000 +;; 664d0f6efb movq xmm15, r11 +;; 66410f2ec7 ucomisd xmm0, xmm15 +;; 0f861a000000 jbe 0x76 +;; 5c: 66450f57ff xorpd xmm15, xmm15 +;; 66440f2ef8 ucomisd xmm15, xmm0 +;; 0f820c000000 jb 0x78 +;; 6c: 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 72: 0f0b ud2 +;; 74: 0f0b ud2 +;; 76: 0f0b ud2 +;; 78: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_trunc_f64_s/params.wat b/winch/filetests/filetests/x64/i32_trunc_f64_s/params.wat new file mode 100644 index 000000000000..0a9143260ba1 --- /dev/null +++ b/winch/filetests/filetests/x64/i32_trunc_f64_s/params.wat @@ -0,0 +1,38 @@ +;;! target = "x86_64" + +(module + (func (param f64) (result i32) + (local.get 0) + (i32.trunc_f64_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8757000000 ja 0x6f +;; 18: f20f11442408 movsd qword ptr [rsp + 8], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; f20f2cc0 cvttsd2si eax, xmm0 +;; 83f801 cmp eax, 1 +;; 0f8134000000 jno 0x69 +;; 35: 660f2ec0 ucomisd xmm0, xmm0 +;; 0f8a32000000 jp 0x71 +;; 3f: 49bb000020000000e0c1 +;; movabs r11, 0xc1e0000000200000 +;; 664d0f6efb movq xmm15, r11 +;; 66410f2ec7 ucomisd xmm0, xmm15 +;; 0f861a000000 jbe 0x73 +;; 59: 66450f57ff xorpd xmm15, xmm15 +;; 66440f2ef8 ucomisd xmm15, xmm0 +;; 0f820c000000 jb 0x75 +;; 69: 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 6f: 0f0b ud2 +;; 71: 0f0b ud2 +;; 73: 0f0b ud2 +;; 75: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_trunc_f64_u/const.wat b/winch/filetests/filetests/x64/i32_trunc_f64_u/const.wat new file mode 100644 index 000000000000..444d843f5beb --- /dev/null +++ b/winch/filetests/filetests/x64/i32_trunc_f64_u/const.wat @@ -0,0 +1,45 @@ +;;! target = "x86_64" + +(module + (func (result i32) + (f64.const 1.0) + (i32.trunc_f64_u) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f875c000000 ja 0x74 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f20f100d5c000000 movsd xmm1, qword ptr [rip + 0x5c] +;; 49bb000000000000e041 +;; movabs r11, 0x41e0000000000000 +;; 664d0f6efb movq xmm15, r11 +;; 66410f2ecf ucomisd xmm1, xmm15 +;; 0f8315000000 jae 0x53 +;; 0f8a32000000 jp 0x76 +;; 44: f20f2cc1 cvttsd2si eax, xmm1 +;; 83f800 cmp eax, 0 +;; 0f8d1d000000 jge 0x6e +;; 51: 0f0b ud2 +;; 0f28c1 movaps xmm0, xmm1 +;; f2410f5cc7 subsd xmm0, xmm15 +;; f20f2cc0 cvttsd2si eax, xmm0 +;; 83f800 cmp eax, 0 +;; 0f8c10000000 jl 0x78 +;; 68: 81c000000080 add eax, 0x80000000 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 74: 0f0b ud2 +;; 76: 0f0b ud2 +;; 78: 0f0b ud2 +;; 7a: 0000 add byte ptr [rax], al +;; 7c: 0000 add byte ptr [rax], al +;; 7e: 0000 add byte ptr [rax], al +;; 80: 0000 add byte ptr [rax], al +;; 82: 0000 add byte ptr [rax], al +;; 84: 0000 add byte ptr [rax], al diff --git a/winch/filetests/filetests/x64/i32_trunc_f64_u/locals.wat b/winch/filetests/filetests/x64/i32_trunc_f64_u/locals.wat new file mode 100644 index 000000000000..cd339040192c --- /dev/null +++ b/winch/filetests/filetests/x64/i32_trunc_f64_u/locals.wat @@ -0,0 +1,43 @@ +;;! target = "x86_64" + +(module + (func (result i32) + (local f64) + + (local.get 0) + (i32.trunc_f64_u) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8763000000 ja 0x7b +;; 18: 48c744240800000000 +;; mov qword ptr [rsp + 8], 0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f104c2408 movsd xmm1, qword ptr [rsp + 8] +;; 49bb000000000000e041 +;; movabs r11, 0x41e0000000000000 +;; 664d0f6efb movq xmm15, r11 +;; 66410f2ecf ucomisd xmm1, xmm15 +;; 0f8315000000 jae 0x5a +;; 0f8a32000000 jp 0x7d +;; 4b: f20f2cc1 cvttsd2si eax, xmm1 +;; 83f800 cmp eax, 0 +;; 0f8d1d000000 jge 0x75 +;; 58: 0f0b ud2 +;; 0f28c1 movaps xmm0, xmm1 +;; f2410f5cc7 subsd xmm0, xmm15 +;; f20f2cc0 cvttsd2si eax, xmm0 +;; 83f800 cmp eax, 0 +;; 0f8c10000000 jl 0x7f +;; 6f: 81c000000080 add eax, 0x80000000 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 7b: 0f0b ud2 +;; 7d: 0f0b ud2 +;; 7f: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_trunc_f64_u/params.wat b/winch/filetests/filetests/x64/i32_trunc_f64_u/params.wat new file mode 100644 index 000000000000..738bfa712890 --- /dev/null +++ b/winch/filetests/filetests/x64/i32_trunc_f64_u/params.wat @@ -0,0 +1,40 @@ +;;! target = "x86_64" + +(module + (func (param f64) (result i32) + (local.get 0) + (i32.trunc_f64_u) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8760000000 ja 0x78 +;; 18: f20f11442408 movsd qword ptr [rsp + 8], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f104c2408 movsd xmm1, qword ptr [rsp + 8] +;; 49bb000000000000e041 +;; movabs r11, 0x41e0000000000000 +;; 664d0f6efb movq xmm15, r11 +;; 66410f2ecf ucomisd xmm1, xmm15 +;; 0f8315000000 jae 0x57 +;; 0f8a32000000 jp 0x7a +;; 48: f20f2cc1 cvttsd2si eax, xmm1 +;; 83f800 cmp eax, 0 +;; 0f8d1d000000 jge 0x72 +;; 55: 0f0b ud2 +;; 0f28c1 movaps xmm0, xmm1 +;; f2410f5cc7 subsd xmm0, xmm15 +;; f20f2cc0 cvttsd2si eax, xmm0 +;; 83f800 cmp eax, 0 +;; 0f8c10000000 jl 0x7c +;; 6c: 81c000000080 add eax, 0x80000000 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 78: 0f0b ud2 +;; 7a: 0f0b ud2 +;; 7c: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_wrap_i64/const.wat b/winch/filetests/filetests/x64/i32_wrap_i64/const.wat new file mode 100644 index 000000000000..295c30fd0c88 --- /dev/null +++ b/winch/filetests/filetests/x64/i32_wrap_i64/const.wat @@ -0,0 +1,22 @@ +;;! target = "x86_64" + +(module + (func (result i32) + (i64.const 1) + (i32.wrap_i64) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8713000000 ja 0x2b +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; 89c0 mov eax, eax +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2b: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_wrap_i64/locals.wat b/winch/filetests/filetests/x64/i32_wrap_i64/locals.wat new file mode 100644 index 000000000000..39e93edb5e63 --- /dev/null +++ b/winch/filetests/filetests/x64/i32_wrap_i64/locals.wat @@ -0,0 +1,26 @@ +;;! target = "x86_64" + +(module + (func (result i32) + (local i64) + + (local.get 0) + (i32.wrap_i64) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871a000000 ja 0x32 +;; 18: 48c744240800000000 +;; mov qword ptr [rsp + 8], 0 +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 89c0 mov eax, eax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 32: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_wrap_i64/params.wat b/winch/filetests/filetests/x64/i32_wrap_i64/params.wat new file mode 100644 index 000000000000..a249e39a0984 --- /dev/null +++ b/winch/filetests/filetests/x64/i32_wrap_i64/params.wat @@ -0,0 +1,23 @@ +;;! target = "x86_64" + +(module + (func (param i64) (result i32) + (local.get 0) + (i32.wrap_i64) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8716000000 ja 0x2e +;; 18: 48897c2408 mov qword ptr [rsp + 8], rdi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 89c0 mov eax, eax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 2e: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_wrap_i64/spilled.wat b/winch/filetests/filetests/x64/i32_wrap_i64/spilled.wat new file mode 100644 index 000000000000..3217eee5b971 --- /dev/null +++ b/winch/filetests/filetests/x64/i32_wrap_i64/spilled.wat @@ -0,0 +1,28 @@ +;;! target = "x86_64" + +(module + (func (result i32) + i64.const 1 + i32.wrap_i64 + block + end + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8721000000 ja 0x39 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; 89c0 mov eax, eax +;; 4883ec04 sub rsp, 4 +;; 890424 mov dword ptr [rsp], eax +;; 8b0424 mov eax, dword ptr [rsp] +;; 4883c404 add rsp, 4 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 39: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_xor/const.wat b/winch/filetests/filetests/x64/i32_xor/const.wat index 91ffc0f6bed7..73b030123a67 100644 --- a/winch/filetests/filetests/x64/i32_xor/const.wat +++ b/winch/filetests/filetests/x64/i32_xor/const.wat @@ -7,12 +7,17 @@ (i32.xor) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b801000000 mov eax, 1 -;; 11: 83f002 xor eax, 2 -;; 14: 4883c408 add rsp, 8 -;; 18: 5d pop rbp -;; 19: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8712000000 ja 0x2a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 83f002 xor eax, 2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_xor/locals.wat b/winch/filetests/filetests/x64/i32_xor/locals.wat index c6280a594c1e..c8674eb40223 100644 --- a/winch/filetests/filetests/x64/i32_xor/locals.wat +++ b/winch/filetests/filetests/x64/i32_xor/locals.wat @@ -16,20 +16,25 @@ (i32.xor) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8731000000 ja 0x49 +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: b801000000 mov eax, 1 -;; 1a: 8944240c mov dword ptr [rsp + 0xc], eax -;; 1e: b802000000 mov eax, 2 -;; 23: 89442408 mov dword ptr [rsp + 8], eax -;; 27: 8b442408 mov eax, dword ptr [rsp + 8] -;; 2b: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 2f: 31c1 xor ecx, eax -;; 31: 89c8 mov eax, ecx -;; 33: 4883c410 add rsp, 0x10 -;; 37: 5d pop rbp -;; 38: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 8944240c mov dword ptr [rsp + 0xc], eax +;; b802000000 mov eax, 2 +;; 89442408 mov dword ptr [rsp + 8], eax +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 31c1 xor ecx, eax +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 49: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i32_xor/params.wat b/winch/filetests/filetests/x64/i32_xor/params.wat index 66135e34329b..b2aadacf6ca1 100644 --- a/winch/filetests/filetests/x64/i32_xor/params.wat +++ b/winch/filetests/filetests/x64/i32_xor/params.wat @@ -7,16 +7,21 @@ (i32.xor) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b442408 mov eax, dword ptr [rsp + 8] -;; 18: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 1c: 31c1 xor ecx, eax -;; 1e: 89c8 mov eax, ecx -;; 20: 4883c410 add rsp, 0x10 -;; 24: 5d pop rbp -;; 25: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871e000000 ja 0x36 +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 31c1 xor ecx, eax +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 36: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_add/const.wat b/winch/filetests/filetests/x64/i64_add/const.wat index 68fc1f71af28..0c70d4d32147 100644 --- a/winch/filetests/filetests/x64/i64_add/const.wat +++ b/winch/filetests/filetests/x64/i64_add/const.wat @@ -7,12 +7,17 @@ (i64.add) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c00a000000 mov rax, 0xa -;; 13: 4883c014 add rax, 0x14 -;; 17: 4883c408 add rsp, 8 -;; 1b: 5d pop rbp -;; 1c: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8715000000 ja 0x2d +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c00a000000 mov rax, 0xa +;; 4883c014 add rax, 0x14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_add/locals.wat b/winch/filetests/filetests/x64/i64_add/locals.wat index 8e6f591249bf..ded7d52228c0 100644 --- a/winch/filetests/filetests/x64/i64_add/locals.wat +++ b/winch/filetests/filetests/x64/i64_add/locals.wat @@ -16,21 +16,26 @@ i64.add ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 4531db xor r11d, r11d -;; b: 4c895c2410 mov qword ptr [rsp + 0x10], r11 -;; 10: 4c895c2408 mov qword ptr [rsp + 8], r11 -;; 15: 4c893424 mov qword ptr [rsp], r14 -;; 19: 48c7c00a000000 mov rax, 0xa -;; 20: 4889442410 mov qword ptr [rsp + 0x10], rax -;; 25: 48c7c014000000 mov rax, 0x14 -;; 2c: 4889442408 mov qword ptr [rsp + 8], rax -;; 31: 488b442408 mov rax, qword ptr [rsp + 8] -;; 36: 488b4c2410 mov rcx, qword ptr [rsp + 0x10] -;; 3b: 4801c1 add rcx, rax -;; 3e: 4889c8 mov rax, rcx -;; 41: 4883c418 add rsp, 0x18 -;; 45: 5d pop rbp -;; 46: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f873f000000 ja 0x57 +;; 18: 4531db xor r11d, r11d +;; 4c895c2410 mov qword ptr [rsp + 0x10], r11 +;; 4c895c2408 mov qword ptr [rsp + 8], r11 +;; 4c893424 mov qword ptr [rsp], r14 +;; 48c7c00a000000 mov rax, 0xa +;; 4889442410 mov qword ptr [rsp + 0x10], rax +;; 48c7c014000000 mov rax, 0x14 +;; 4889442408 mov qword ptr [rsp + 8], rax +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 488b4c2410 mov rcx, qword ptr [rsp + 0x10] +;; 4801c1 add rcx, rax +;; 4889c8 mov rax, rcx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 57: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_add/max.wat b/winch/filetests/filetests/x64/i64_add/max.wat index c4a42ee0927f..2c791c3f3245 100644 --- a/winch/filetests/filetests/x64/i64_add/max.wat +++ b/winch/filetests/filetests/x64/i64_add/max.wat @@ -6,14 +6,19 @@ (i64.add) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c001000000 mov rax, 1 -;; 13: 49bbffffffffffffff7f +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871e000000 ja 0x36 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; 49bbffffffffffffff7f ;; movabs r11, 0x7fffffffffffffff -;; 1d: 4c01d8 add rax, r11 -;; 20: 4883c408 add rsp, 8 -;; 24: 5d pop rbp -;; 25: c3 ret +;; 4c01d8 add rax, r11 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 36: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_add/max_one.wat b/winch/filetests/filetests/x64/i64_add/max_one.wat index 2116ed63a80e..457aaf554df1 100644 --- a/winch/filetests/filetests/x64/i64_add/max_one.wat +++ b/winch/filetests/filetests/x64/i64_add/max_one.wat @@ -7,13 +7,18 @@ (i64.add) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48b80000000000000080 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8718000000 ja 0x30 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48b80000000000000080 ;; movabs rax, 0x8000000000000000 -;; 16: 4883c0ff add rax, -1 -;; 1a: 4883c408 add rsp, 8 -;; 1e: 5d pop rbp -;; 1f: c3 ret +;; 4883c0ff add rax, -1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 30: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_add/mixed.wat b/winch/filetests/filetests/x64/i64_add/mixed.wat index 422e3b9c2402..d11a2451b935 100644 --- a/winch/filetests/filetests/x64/i64_add/mixed.wat +++ b/winch/filetests/filetests/x64/i64_add/mixed.wat @@ -7,12 +7,17 @@ (i64.add) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c0ffffffff mov rax, 0xffffffffffffffff -;; 13: 4883c001 add rax, 1 -;; 17: 4883c408 add rsp, 8 -;; 1b: 5d pop rbp -;; 1c: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8715000000 ja 0x2d +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c0ffffffff mov rax, 0xffffffffffffffff +;; 4883c001 add rax, 1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_add/params.wat b/winch/filetests/filetests/x64/i64_add/params.wat index d91e2fa9f886..afaef6b64205 100644 --- a/winch/filetests/filetests/x64/i64_add/params.wat +++ b/winch/filetests/filetests/x64/i64_add/params.wat @@ -7,16 +7,21 @@ (i64.add) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 48897c2410 mov qword ptr [rsp + 0x10], rdi -;; d: 4889742408 mov qword ptr [rsp + 8], rsi -;; 12: 4c893424 mov qword ptr [rsp], r14 -;; 16: 488b442408 mov rax, qword ptr [rsp + 8] -;; 1b: 488b4c2410 mov rcx, qword ptr [rsp + 0x10] -;; 20: 4801c1 add rcx, rax -;; 23: 4889c8 mov rax, rcx -;; 26: 4883c418 add rsp, 0x18 -;; 2a: 5d pop rbp -;; 2b: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8724000000 ja 0x3c +;; 18: 48897c2410 mov qword ptr [rsp + 0x10], rdi +;; 4889742408 mov qword ptr [rsp + 8], rsi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 488b4c2410 mov rcx, qword ptr [rsp + 0x10] +;; 4801c1 add rcx, rax +;; 4889c8 mov rax, rcx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 3c: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_add/signed.wat b/winch/filetests/filetests/x64/i64_add/signed.wat index 654cb74227d4..b91c7b7db93c 100644 --- a/winch/filetests/filetests/x64/i64_add/signed.wat +++ b/winch/filetests/filetests/x64/i64_add/signed.wat @@ -7,12 +7,17 @@ (i64.add) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c0ffffffff mov rax, 0xffffffffffffffff -;; 13: 4883c0ff add rax, -1 -;; 17: 4883c408 add rsp, 8 -;; 1b: 5d pop rbp -;; 1c: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8715000000 ja 0x2d +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c0ffffffff mov rax, 0xffffffffffffffff +;; 4883c0ff add rax, -1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_add/unsigned_with_zero.wat b/winch/filetests/filetests/x64/i64_add/unsigned_with_zero.wat index c18551921d4e..55a0f81beb83 100644 --- a/winch/filetests/filetests/x64/i64_add/unsigned_with_zero.wat +++ b/winch/filetests/filetests/x64/i64_add/unsigned_with_zero.wat @@ -7,12 +7,17 @@ (i64.add) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c001000000 mov rax, 1 -;; 13: 4883c000 add rax, 0 -;; 17: 4883c408 add rsp, 8 -;; 1b: 5d pop rbp -;; 1c: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8715000000 ja 0x2d +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; 4883c000 add rax, 0 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_and/32_const.wat b/winch/filetests/filetests/x64/i64_and/32_const.wat index 41a5cec93cb0..b85ee8011908 100644 --- a/winch/filetests/filetests/x64/i64_and/32_const.wat +++ b/winch/filetests/filetests/x64/i64_and/32_const.wat @@ -7,12 +7,17 @@ (i64.and) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c002000000 mov rax, 2 -;; 13: 4883e003 and rax, 3 -;; 17: 4883c408 add rsp, 8 -;; 1b: 5d pop rbp -;; 1c: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8715000000 ja 0x2d +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c002000000 mov rax, 2 +;; 4883e003 and rax, 3 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_and/64_const.wat b/winch/filetests/filetests/x64/i64_and/64_const.wat index 0037bd20d2a8..04ad9156bbb3 100644 --- a/winch/filetests/filetests/x64/i64_and/64_const.wat +++ b/winch/filetests/filetests/x64/i64_and/64_const.wat @@ -7,15 +7,20 @@ (i64.and) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48b8feffffffffffff7f +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8721000000 ja 0x39 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48b8feffffffffffff7f ;; movabs rax, 0x7ffffffffffffffe -;; 16: 49bbffffffffffffff7f +;; 49bbffffffffffffff7f ;; movabs r11, 0x7fffffffffffffff -;; 20: 4c21d8 and rax, r11 -;; 23: 4883c408 add rsp, 8 -;; 27: 5d pop rbp -;; 28: c3 ret +;; 4c21d8 and rax, r11 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 39: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_and/locals.wat b/winch/filetests/filetests/x64/i64_and/locals.wat index 6ad83197733f..5d0a9493e3e1 100644 --- a/winch/filetests/filetests/x64/i64_and/locals.wat +++ b/winch/filetests/filetests/x64/i64_and/locals.wat @@ -15,21 +15,26 @@ (i64.and) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 4531db xor r11d, r11d -;; b: 4c895c2410 mov qword ptr [rsp + 0x10], r11 -;; 10: 4c895c2408 mov qword ptr [rsp + 8], r11 -;; 15: 4c893424 mov qword ptr [rsp], r14 -;; 19: 48c7c002000000 mov rax, 2 -;; 20: 4889442410 mov qword ptr [rsp + 0x10], rax -;; 25: 48c7c003000000 mov rax, 3 -;; 2c: 4889442408 mov qword ptr [rsp + 8], rax -;; 31: 488b442408 mov rax, qword ptr [rsp + 8] -;; 36: 488b4c2410 mov rcx, qword ptr [rsp + 0x10] -;; 3b: 4821c1 and rcx, rax -;; 3e: 4889c8 mov rax, rcx -;; 41: 4883c418 add rsp, 0x18 -;; 45: 5d pop rbp -;; 46: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f873f000000 ja 0x57 +;; 18: 4531db xor r11d, r11d +;; 4c895c2410 mov qword ptr [rsp + 0x10], r11 +;; 4c895c2408 mov qword ptr [rsp + 8], r11 +;; 4c893424 mov qword ptr [rsp], r14 +;; 48c7c002000000 mov rax, 2 +;; 4889442410 mov qword ptr [rsp + 0x10], rax +;; 48c7c003000000 mov rax, 3 +;; 4889442408 mov qword ptr [rsp + 8], rax +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 488b4c2410 mov rcx, qword ptr [rsp + 0x10] +;; 4821c1 and rcx, rax +;; 4889c8 mov rax, rcx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 57: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_and/params.wat b/winch/filetests/filetests/x64/i64_and/params.wat index c8500bbe9756..5c0cb59fa7fe 100644 --- a/winch/filetests/filetests/x64/i64_and/params.wat +++ b/winch/filetests/filetests/x64/i64_and/params.wat @@ -7,16 +7,21 @@ (i64.and) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 48897c2410 mov qword ptr [rsp + 0x10], rdi -;; d: 4889742408 mov qword ptr [rsp + 8], rsi -;; 12: 4c893424 mov qword ptr [rsp], r14 -;; 16: 488b442408 mov rax, qword ptr [rsp + 8] -;; 1b: 488b4c2410 mov rcx, qword ptr [rsp + 0x10] -;; 20: 4821c1 and rcx, rax -;; 23: 4889c8 mov rax, rcx -;; 26: 4883c418 add rsp, 0x18 -;; 2a: 5d pop rbp -;; 2b: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8724000000 ja 0x3c +;; 18: 48897c2410 mov qword ptr [rsp + 0x10], rdi +;; 4889742408 mov qword ptr [rsp + 8], rsi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 488b4c2410 mov rcx, qword ptr [rsp + 0x10] +;; 4821c1 and rcx, rax +;; 4889c8 mov rax, rcx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 3c: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_clz/lzcnt_const.wat b/winch/filetests/filetests/x64/i64_clz/lzcnt_const.wat index 24d482debccb..4b5058e68c01 100644 --- a/winch/filetests/filetests/x64/i64_clz/lzcnt_const.wat +++ b/winch/filetests/filetests/x64/i64_clz/lzcnt_const.wat @@ -7,12 +7,17 @@ (i64.clz) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c001000000 mov rax, 1 -;; 13: f3480fbdc0 lzcnt rax, rax -;; 18: 4883c408 add rsp, 8 -;; 1c: 5d pop rbp -;; 1d: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8716000000 ja 0x2e +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; f3480fbdc0 lzcnt rax, rax +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2e: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_clz/lzcnt_local.wat b/winch/filetests/filetests/x64/i64_clz/lzcnt_local.wat index 6a0fffd4d029..d2dc7a593639 100644 --- a/winch/filetests/filetests/x64/i64_clz/lzcnt_local.wat +++ b/winch/filetests/filetests/x64/i64_clz/lzcnt_local.wat @@ -12,16 +12,21 @@ (i64.clz) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8729000000 ja 0x41 +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: 48c7c002000000 mov rax, 2 -;; 1c: 4889442408 mov qword ptr [rsp + 8], rax -;; 21: 488b442408 mov rax, qword ptr [rsp + 8] -;; 26: f3480fbdc0 lzcnt rax, rax -;; 2b: 4883c410 add rsp, 0x10 -;; 2f: 5d pop rbp -;; 30: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; 48c7c002000000 mov rax, 2 +;; 4889442408 mov qword ptr [rsp + 8], rax +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; f3480fbdc0 lzcnt rax, rax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 41: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_clz/lzcnt_param.wat b/winch/filetests/filetests/x64/i64_clz/lzcnt_param.wat index ad31e7a5adc0..83779a0df3f2 100644 --- a/winch/filetests/filetests/x64/i64_clz/lzcnt_param.wat +++ b/winch/filetests/filetests/x64/i64_clz/lzcnt_param.wat @@ -7,13 +7,18 @@ (i64.clz) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48897c2408 mov qword ptr [rsp + 8], rdi -;; d: 4c893424 mov qword ptr [rsp], r14 -;; 11: 488b442408 mov rax, qword ptr [rsp + 8] -;; 16: f3480fbdc0 lzcnt rax, rax -;; 1b: 4883c410 add rsp, 0x10 -;; 1f: 5d pop rbp -;; 20: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8719000000 ja 0x31 +;; 18: 48897c2408 mov qword ptr [rsp + 8], rdi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; f3480fbdc0 lzcnt rax, rax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 31: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_clz/no_lzcnt_const.wat b/winch/filetests/filetests/x64/i64_clz/no_lzcnt_const.wat index 9176b554367d..867b0fabf34d 100644 --- a/winch/filetests/filetests/x64/i64_clz/no_lzcnt_const.wat +++ b/winch/filetests/filetests/x64/i64_clz/no_lzcnt_const.wat @@ -6,17 +6,22 @@ (i64.clz) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c001000000 mov rax, 1 -;; 13: 480fbdc0 bsr rax, rax -;; 17: 41bb00000000 mov r11d, 0 -;; 1d: 410f95c3 setne r11b -;; 21: 48f7d8 neg rax -;; 24: 4883c040 add rax, 0x40 -;; 28: 4c29d8 sub rax, r11 -;; 2b: 4883c408 add rsp, 8 -;; 2f: 5d pop rbp -;; 30: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8729000000 ja 0x41 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; 480fbdc0 bsr rax, rax +;; 41bb00000000 mov r11d, 0 +;; 410f95c3 setne r11b +;; 48f7d8 neg rax +;; 4883c040 add rax, 0x40 +;; 4c29d8 sub rax, r11 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 41: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_clz/no_lzcnt_local.wat b/winch/filetests/filetests/x64/i64_clz/no_lzcnt_local.wat index 2186bb4cc889..3f18ea8858d2 100644 --- a/winch/filetests/filetests/x64/i64_clz/no_lzcnt_local.wat +++ b/winch/filetests/filetests/x64/i64_clz/no_lzcnt_local.wat @@ -11,21 +11,26 @@ (i64.clz) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f873c000000 ja 0x54 +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: 48c7c002000000 mov rax, 2 -;; 1c: 4889442408 mov qword ptr [rsp + 8], rax -;; 21: 488b442408 mov rax, qword ptr [rsp + 8] -;; 26: 480fbdc0 bsr rax, rax -;; 2a: 41bb00000000 mov r11d, 0 -;; 30: 410f95c3 setne r11b -;; 34: 48f7d8 neg rax -;; 37: 4883c040 add rax, 0x40 -;; 3b: 4c29d8 sub rax, r11 -;; 3e: 4883c410 add rsp, 0x10 -;; 42: 5d pop rbp -;; 43: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; 48c7c002000000 mov rax, 2 +;; 4889442408 mov qword ptr [rsp + 8], rax +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 480fbdc0 bsr rax, rax +;; 41bb00000000 mov r11d, 0 +;; 410f95c3 setne r11b +;; 48f7d8 neg rax +;; 4883c040 add rax, 0x40 +;; 4c29d8 sub rax, r11 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 54: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_clz/no_lzcnt_param.wat b/winch/filetests/filetests/x64/i64_clz/no_lzcnt_param.wat index 718e17f0eeda..8409fb86237e 100644 --- a/winch/filetests/filetests/x64/i64_clz/no_lzcnt_param.wat +++ b/winch/filetests/filetests/x64/i64_clz/no_lzcnt_param.wat @@ -6,18 +6,23 @@ (i64.clz) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48897c2408 mov qword ptr [rsp + 8], rdi -;; d: 4c893424 mov qword ptr [rsp], r14 -;; 11: 488b442408 mov rax, qword ptr [rsp + 8] -;; 16: 480fbdc0 bsr rax, rax -;; 1a: 41bb00000000 mov r11d, 0 -;; 20: 410f95c3 setne r11b -;; 24: 48f7d8 neg rax -;; 27: 4883c040 add rax, 0x40 -;; 2b: 4c29d8 sub rax, r11 -;; 2e: 4883c410 add rsp, 0x10 -;; 32: 5d pop rbp -;; 33: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872c000000 ja 0x44 +;; 18: 48897c2408 mov qword ptr [rsp + 8], rdi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 480fbdc0 bsr rax, rax +;; 41bb00000000 mov r11d, 0 +;; 410f95c3 setne r11b +;; 48f7d8 neg rax +;; 4883c040 add rax, 0x40 +;; 4c29d8 sub rax, r11 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 44: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_ctz/bmi1_const.wat b/winch/filetests/filetests/x64/i64_ctz/bmi1_const.wat index aabb57a1b86d..647fd7d85ba2 100644 --- a/winch/filetests/filetests/x64/i64_ctz/bmi1_const.wat +++ b/winch/filetests/filetests/x64/i64_ctz/bmi1_const.wat @@ -7,12 +7,17 @@ (i64.ctz) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c001000000 mov rax, 1 -;; 13: f3480fbcc0 tzcnt rax, rax -;; 18: 4883c408 add rsp, 8 -;; 1c: 5d pop rbp -;; 1d: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8716000000 ja 0x2e +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; f3480fbcc0 tzcnt rax, rax +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2e: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_ctz/bmi1_local.wat b/winch/filetests/filetests/x64/i64_ctz/bmi1_local.wat index e002320cc27b..bef04b8aaa5d 100644 --- a/winch/filetests/filetests/x64/i64_ctz/bmi1_local.wat +++ b/winch/filetests/filetests/x64/i64_ctz/bmi1_local.wat @@ -12,16 +12,21 @@ (i64.ctz) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8729000000 ja 0x41 +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: 48c7c002000000 mov rax, 2 -;; 1c: 4889442408 mov qword ptr [rsp + 8], rax -;; 21: 488b442408 mov rax, qword ptr [rsp + 8] -;; 26: f3480fbcc0 tzcnt rax, rax -;; 2b: 4883c410 add rsp, 0x10 -;; 2f: 5d pop rbp -;; 30: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; 48c7c002000000 mov rax, 2 +;; 4889442408 mov qword ptr [rsp + 8], rax +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; f3480fbcc0 tzcnt rax, rax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 41: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_ctz/bmi1_param.wat b/winch/filetests/filetests/x64/i64_ctz/bmi1_param.wat index b607754a4191..de715edf24b4 100644 --- a/winch/filetests/filetests/x64/i64_ctz/bmi1_param.wat +++ b/winch/filetests/filetests/x64/i64_ctz/bmi1_param.wat @@ -7,13 +7,18 @@ (i64.ctz) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48897c2408 mov qword ptr [rsp + 8], rdi -;; d: 4c893424 mov qword ptr [rsp], r14 -;; 11: 488b442408 mov rax, qword ptr [rsp + 8] -;; 16: f3480fbcc0 tzcnt rax, rax -;; 1b: 4883c410 add rsp, 0x10 -;; 1f: 5d pop rbp -;; 20: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8719000000 ja 0x31 +;; 18: 48897c2408 mov qword ptr [rsp + 8], rdi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; f3480fbcc0 tzcnt rax, rax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 31: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_ctz/no_bmi1_const.wat b/winch/filetests/filetests/x64/i64_ctz/no_bmi1_const.wat index 5c17cc86c83b..3d5ada0721f6 100644 --- a/winch/filetests/filetests/x64/i64_ctz/no_bmi1_const.wat +++ b/winch/filetests/filetests/x64/i64_ctz/no_bmi1_const.wat @@ -6,16 +6,21 @@ (i64.ctz) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c001000000 mov rax, 1 -;; 13: 480fbcc0 bsf rax, rax -;; 17: 41bb00000000 mov r11d, 0 -;; 1d: 410f94c3 sete r11b -;; 21: 49c1e306 shl r11, 6 -;; 25: 4c01d8 add rax, r11 -;; 28: 4883c408 add rsp, 8 -;; 2c: 5d pop rbp -;; 2d: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8726000000 ja 0x3e +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; 480fbcc0 bsf rax, rax +;; 41bb00000000 mov r11d, 0 +;; 410f94c3 sete r11b +;; 49c1e306 shl r11, 6 +;; 4c01d8 add rax, r11 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 3e: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_ctz/no_bmi1_local.wat b/winch/filetests/filetests/x64/i64_ctz/no_bmi1_local.wat index 3c595d5fb845..bf5d07307380 100644 --- a/winch/filetests/filetests/x64/i64_ctz/no_bmi1_local.wat +++ b/winch/filetests/filetests/x64/i64_ctz/no_bmi1_local.wat @@ -11,20 +11,25 @@ (i64.ctz) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8739000000 ja 0x51 +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: 48c7c002000000 mov rax, 2 -;; 1c: 4889442408 mov qword ptr [rsp + 8], rax -;; 21: 488b442408 mov rax, qword ptr [rsp + 8] -;; 26: 480fbcc0 bsf rax, rax -;; 2a: 41bb00000000 mov r11d, 0 -;; 30: 410f94c3 sete r11b -;; 34: 49c1e306 shl r11, 6 -;; 38: 4c01d8 add rax, r11 -;; 3b: 4883c410 add rsp, 0x10 -;; 3f: 5d pop rbp -;; 40: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; 48c7c002000000 mov rax, 2 +;; 4889442408 mov qword ptr [rsp + 8], rax +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 480fbcc0 bsf rax, rax +;; 41bb00000000 mov r11d, 0 +;; 410f94c3 sete r11b +;; 49c1e306 shl r11, 6 +;; 4c01d8 add rax, r11 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 51: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_ctz/no_bmi1_param.wat b/winch/filetests/filetests/x64/i64_ctz/no_bmi1_param.wat index d8f669f11075..1306df60c3db 100644 --- a/winch/filetests/filetests/x64/i64_ctz/no_bmi1_param.wat +++ b/winch/filetests/filetests/x64/i64_ctz/no_bmi1_param.wat @@ -6,17 +6,22 @@ (i64.ctz) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48897c2408 mov qword ptr [rsp + 8], rdi -;; d: 4c893424 mov qword ptr [rsp], r14 -;; 11: 488b442408 mov rax, qword ptr [rsp + 8] -;; 16: 480fbcc0 bsf rax, rax -;; 1a: 41bb00000000 mov r11d, 0 -;; 20: 410f94c3 sete r11b -;; 24: 49c1e306 shl r11, 6 -;; 28: 4c01d8 add rax, r11 -;; 2b: 4883c410 add rsp, 0x10 -;; 2f: 5d pop rbp -;; 30: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8729000000 ja 0x41 +;; 18: 48897c2408 mov qword ptr [rsp + 8], rdi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 480fbcc0 bsf rax, rax +;; 41bb00000000 mov r11d, 0 +;; 410f94c3 sete r11b +;; 49c1e306 shl r11, 6 +;; 4c01d8 add rax, r11 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 41: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_divs/const.wat b/winch/filetests/filetests/x64/i64_divs/const.wat index 1c32a1f926cd..e56f231d3931 100644 --- a/winch/filetests/filetests/x64/i64_divs/const.wat +++ b/winch/filetests/filetests/x64/i64_divs/const.wat @@ -7,17 +7,22 @@ (i64.div_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c10a000000 mov rcx, 0xa -;; 13: 48c7c014000000 mov rax, 0x14 -;; 1a: 4883f900 cmp rcx, 0 -;; 1e: 0f840b000000 je 0x2f -;; 24: 4899 cqo -;; 26: 48f7f9 idiv rcx -;; 29: 4883c408 add rsp, 8 -;; 2d: 5d pop rbp -;; 2e: c3 ret -;; 2f: 0f0b ud2 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8727000000 ja 0x3f +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c10a000000 mov rcx, 0xa +;; 48c7c014000000 mov rax, 0x14 +;; 4883f900 cmp rcx, 0 +;; 0f840d000000 je 0x41 +;; 34: 4899 cqo +;; 48f7f9 idiv rcx +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 3f: 0f0b ud2 +;; 41: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_divs/one_zero.wat b/winch/filetests/filetests/x64/i64_divs/one_zero.wat index fee46ab16572..556c72e12827 100644 --- a/winch/filetests/filetests/x64/i64_divs/one_zero.wat +++ b/winch/filetests/filetests/x64/i64_divs/one_zero.wat @@ -7,17 +7,22 @@ (i64.div_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c100000000 mov rcx, 0 -;; 13: 48c7c001000000 mov rax, 1 -;; 1a: 4883f900 cmp rcx, 0 -;; 1e: 0f840b000000 je 0x2f -;; 24: 4899 cqo -;; 26: 48f7f9 idiv rcx -;; 29: 4883c408 add rsp, 8 -;; 2d: 5d pop rbp -;; 2e: c3 ret -;; 2f: 0f0b ud2 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8727000000 ja 0x3f +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c100000000 mov rcx, 0 +;; 48c7c001000000 mov rax, 1 +;; 4883f900 cmp rcx, 0 +;; 0f840d000000 je 0x41 +;; 34: 4899 cqo +;; 48f7f9 idiv rcx +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 3f: 0f0b ud2 +;; 41: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_divs/overflow.wat b/winch/filetests/filetests/x64/i64_divs/overflow.wat index 884fdd9fcaac..8044c95dcd93 100644 --- a/winch/filetests/filetests/x64/i64_divs/overflow.wat +++ b/winch/filetests/filetests/x64/i64_divs/overflow.wat @@ -7,18 +7,23 @@ (i64.div_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c1ffffffff mov rcx, 0xffffffffffffffff -;; 13: 48b80000000000000080 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872a000000 ja 0x42 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c1ffffffff mov rcx, 0xffffffffffffffff +;; 48b80000000000000080 ;; movabs rax, 0x8000000000000000 -;; 1d: 4883f900 cmp rcx, 0 -;; 21: 0f840b000000 je 0x32 -;; 27: 4899 cqo -;; 29: 48f7f9 idiv rcx -;; 2c: 4883c408 add rsp, 8 -;; 30: 5d pop rbp -;; 31: c3 ret -;; 32: 0f0b ud2 +;; 4883f900 cmp rcx, 0 +;; 0f840d000000 je 0x44 +;; 37: 4899 cqo +;; 48f7f9 idiv rcx +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 42: 0f0b ud2 +;; 44: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_divs/params.wat b/winch/filetests/filetests/x64/i64_divs/params.wat index ff5e0ae00ba5..8c86b8eb9414 100644 --- a/winch/filetests/filetests/x64/i64_divs/params.wat +++ b/winch/filetests/filetests/x64/i64_divs/params.wat @@ -7,19 +7,24 @@ (i64.div_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 48897c2410 mov qword ptr [rsp + 0x10], rdi -;; d: 4889742408 mov qword ptr [rsp + 8], rsi -;; 12: 4c893424 mov qword ptr [rsp], r14 -;; 16: 488b4c2408 mov rcx, qword ptr [rsp + 8] -;; 1b: 488b442410 mov rax, qword ptr [rsp + 0x10] -;; 20: 4883f900 cmp rcx, 0 -;; 24: 0f840b000000 je 0x35 -;; 2a: 4899 cqo -;; 2c: 48f7f9 idiv rcx -;; 2f: 4883c418 add rsp, 0x18 -;; 33: 5d pop rbp -;; 34: c3 ret -;; 35: 0f0b ud2 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872d000000 ja 0x45 +;; 18: 48897c2410 mov qword ptr [rsp + 0x10], rdi +;; 4889742408 mov qword ptr [rsp + 8], rsi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b4c2408 mov rcx, qword ptr [rsp + 8] +;; 488b442410 mov rax, qword ptr [rsp + 0x10] +;; 4883f900 cmp rcx, 0 +;; 0f840d000000 je 0x47 +;; 3a: 4899 cqo +;; 48f7f9 idiv rcx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 45: 0f0b ud2 +;; 47: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_divs/zero_zero.wat b/winch/filetests/filetests/x64/i64_divs/zero_zero.wat index ed9c5786149a..a10e54e2f907 100644 --- a/winch/filetests/filetests/x64/i64_divs/zero_zero.wat +++ b/winch/filetests/filetests/x64/i64_divs/zero_zero.wat @@ -7,17 +7,22 @@ (i64.div_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c100000000 mov rcx, 0 -;; 13: 48c7c000000000 mov rax, 0 -;; 1a: 4883f900 cmp rcx, 0 -;; 1e: 0f840b000000 je 0x2f -;; 24: 4899 cqo -;; 26: 48f7f9 idiv rcx -;; 29: 4883c408 add rsp, 8 -;; 2d: 5d pop rbp -;; 2e: c3 ret -;; 2f: 0f0b ud2 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8727000000 ja 0x3f +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c100000000 mov rcx, 0 +;; 48c7c000000000 mov rax, 0 +;; 4883f900 cmp rcx, 0 +;; 0f840d000000 je 0x41 +;; 34: 4899 cqo +;; 48f7f9 idiv rcx +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 3f: 0f0b ud2 +;; 41: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_divu/const.wat b/winch/filetests/filetests/x64/i64_divu/const.wat index 7d740b482d54..4c14f99e27b2 100644 --- a/winch/filetests/filetests/x64/i64_divu/const.wat +++ b/winch/filetests/filetests/x64/i64_divu/const.wat @@ -7,14 +7,19 @@ (i64.div_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c10a000000 mov rcx, 0xa -;; 13: 48c7c014000000 mov rax, 0x14 -;; 1a: 4831d2 xor rdx, rdx -;; 1d: 48f7f1 div rcx -;; 20: 4883c408 add rsp, 8 -;; 24: 5d pop rbp -;; 25: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871e000000 ja 0x36 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c10a000000 mov rcx, 0xa +;; 48c7c014000000 mov rax, 0x14 +;; 4831d2 xor rdx, rdx +;; 48f7f1 div rcx +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 36: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_divu/one_zero.wat b/winch/filetests/filetests/x64/i64_divu/one_zero.wat index 05d7609d0f97..16496c5121a7 100644 --- a/winch/filetests/filetests/x64/i64_divu/one_zero.wat +++ b/winch/filetests/filetests/x64/i64_divu/one_zero.wat @@ -7,14 +7,19 @@ (i64.div_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c100000000 mov rcx, 0 -;; 13: 48c7c001000000 mov rax, 1 -;; 1a: 4831d2 xor rdx, rdx -;; 1d: 48f7f1 div rcx -;; 20: 4883c408 add rsp, 8 -;; 24: 5d pop rbp -;; 25: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871e000000 ja 0x36 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c100000000 mov rcx, 0 +;; 48c7c001000000 mov rax, 1 +;; 4831d2 xor rdx, rdx +;; 48f7f1 div rcx +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 36: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_divu/params.wat b/winch/filetests/filetests/x64/i64_divu/params.wat index 37f3be4423d5..431ba69b4bfc 100644 --- a/winch/filetests/filetests/x64/i64_divu/params.wat +++ b/winch/filetests/filetests/x64/i64_divu/params.wat @@ -7,16 +7,21 @@ (i64.div_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 48897c2410 mov qword ptr [rsp + 0x10], rdi -;; d: 4889742408 mov qword ptr [rsp + 8], rsi -;; 12: 4c893424 mov qword ptr [rsp], r14 -;; 16: 488b4c2408 mov rcx, qword ptr [rsp + 8] -;; 1b: 488b442410 mov rax, qword ptr [rsp + 0x10] -;; 20: 4831d2 xor rdx, rdx -;; 23: 48f7f1 div rcx -;; 26: 4883c418 add rsp, 0x18 -;; 2a: 5d pop rbp -;; 2b: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8724000000 ja 0x3c +;; 18: 48897c2410 mov qword ptr [rsp + 0x10], rdi +;; 4889742408 mov qword ptr [rsp + 8], rsi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b4c2408 mov rcx, qword ptr [rsp + 8] +;; 488b442410 mov rax, qword ptr [rsp + 0x10] +;; 4831d2 xor rdx, rdx +;; 48f7f1 div rcx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 3c: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_divu/signed.wat b/winch/filetests/filetests/x64/i64_divu/signed.wat index 67571edf9500..4423f9b1d8bb 100644 --- a/winch/filetests/filetests/x64/i64_divu/signed.wat +++ b/winch/filetests/filetests/x64/i64_divu/signed.wat @@ -7,14 +7,19 @@ (i64.div_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c1ffffffff mov rcx, 0xffffffffffffffff -;; 13: 48c7c0ffffffff mov rax, 0xffffffffffffffff -;; 1a: 4831d2 xor rdx, rdx -;; 1d: 48f7f1 div rcx -;; 20: 4883c408 add rsp, 8 -;; 24: 5d pop rbp -;; 25: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871e000000 ja 0x36 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c1ffffffff mov rcx, 0xffffffffffffffff +;; 48c7c0ffffffff mov rax, 0xffffffffffffffff +;; 4831d2 xor rdx, rdx +;; 48f7f1 div rcx +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 36: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_divu/zero_zero.wat b/winch/filetests/filetests/x64/i64_divu/zero_zero.wat index f5b0849bebc9..1fd2a67c92d6 100644 --- a/winch/filetests/filetests/x64/i64_divu/zero_zero.wat +++ b/winch/filetests/filetests/x64/i64_divu/zero_zero.wat @@ -7,14 +7,19 @@ (i64.div_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c100000000 mov rcx, 0 -;; 13: 48c7c000000000 mov rax, 0 -;; 1a: 4831d2 xor rdx, rdx -;; 1d: 48f7f1 div rcx -;; 20: 4883c408 add rsp, 8 -;; 24: 5d pop rbp -;; 25: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871e000000 ja 0x36 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c100000000 mov rcx, 0 +;; 48c7c000000000 mov rax, 0 +;; 4831d2 xor rdx, rdx +;; 48f7f1 div rcx +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 36: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_eq/32_const.wat b/winch/filetests/filetests/x64/i64_eq/32_const.wat index 42e7dd0d814b..f7a946c4cc51 100644 --- a/winch/filetests/filetests/x64/i64_eq/32_const.wat +++ b/winch/filetests/filetests/x64/i64_eq/32_const.wat @@ -7,14 +7,19 @@ (i64.eq) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c002000000 mov rax, 2 -;; 13: 4883f803 cmp rax, 3 -;; 17: b800000000 mov eax, 0 -;; 1c: 400f94c0 sete al -;; 20: 4883c408 add rsp, 8 -;; 24: 5d pop rbp -;; 25: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871e000000 ja 0x36 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c002000000 mov rax, 2 +;; 4883f803 cmp rax, 3 +;; b800000000 mov eax, 0 +;; 400f94c0 sete al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 36: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_eq/64_const.wat b/winch/filetests/filetests/x64/i64_eq/64_const.wat index 22938f022182..fed27b3ef9a6 100644 --- a/winch/filetests/filetests/x64/i64_eq/64_const.wat +++ b/winch/filetests/filetests/x64/i64_eq/64_const.wat @@ -7,17 +7,22 @@ (i64.eq) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48b8feffffffffffff7f +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872a000000 ja 0x42 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48b8feffffffffffff7f ;; movabs rax, 0x7ffffffffffffffe -;; 16: 49bbffffffffffffff7f +;; 49bbffffffffffffff7f ;; movabs r11, 0x7fffffffffffffff -;; 20: 4c39d8 cmp rax, r11 -;; 23: b800000000 mov eax, 0 -;; 28: 400f94c0 sete al -;; 2c: 4883c408 add rsp, 8 -;; 30: 5d pop rbp -;; 31: c3 ret +;; 4c39d8 cmp rax, r11 +;; b800000000 mov eax, 0 +;; 400f94c0 sete al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 42: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_eq/locals.wat b/winch/filetests/filetests/x64/i64_eq/locals.wat index 8884b9d68459..38fa3983e06e 100644 --- a/winch/filetests/filetests/x64/i64_eq/locals.wat +++ b/winch/filetests/filetests/x64/i64_eq/locals.wat @@ -15,23 +15,28 @@ (i64.eq) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 4531db xor r11d, r11d -;; b: 4c895c2410 mov qword ptr [rsp + 0x10], r11 -;; 10: 4c895c2408 mov qword ptr [rsp + 8], r11 -;; 15: 4c893424 mov qword ptr [rsp], r14 -;; 19: 48c7c002000000 mov rax, 2 -;; 20: 4889442410 mov qword ptr [rsp + 0x10], rax -;; 25: 48c7c003000000 mov rax, 3 -;; 2c: 4889442408 mov qword ptr [rsp + 8], rax -;; 31: 488b442408 mov rax, qword ptr [rsp + 8] -;; 36: 488b4c2410 mov rcx, qword ptr [rsp + 0x10] -;; 3b: 4839c1 cmp rcx, rax -;; 3e: b900000000 mov ecx, 0 -;; 43: 400f94c1 sete cl -;; 47: 4889c8 mov rax, rcx -;; 4a: 4883c418 add rsp, 0x18 -;; 4e: 5d pop rbp -;; 4f: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8747000000 ja 0x5f +;; 18: 4531db xor r11d, r11d +;; 4c895c2410 mov qword ptr [rsp + 0x10], r11 +;; 4c895c2408 mov qword ptr [rsp + 8], r11 +;; 4c893424 mov qword ptr [rsp], r14 +;; 48c7c002000000 mov rax, 2 +;; 4889442410 mov qword ptr [rsp + 0x10], rax +;; 48c7c003000000 mov rax, 3 +;; 4889442408 mov qword ptr [rsp + 8], rax +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 488b4c2410 mov rcx, qword ptr [rsp + 0x10] +;; 4839c1 cmp rcx, rax +;; b900000000 mov ecx, 0 +;; 400f94c1 sete cl +;; 89c8 mov eax, ecx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 5f: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_eq/params.wat b/winch/filetests/filetests/x64/i64_eq/params.wat index aed5174e312f..0b960e6cdbb2 100644 --- a/winch/filetests/filetests/x64/i64_eq/params.wat +++ b/winch/filetests/filetests/x64/i64_eq/params.wat @@ -7,18 +7,23 @@ (i64.eq) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 48897c2410 mov qword ptr [rsp + 0x10], rdi -;; d: 4889742408 mov qword ptr [rsp + 8], rsi -;; 12: 4c893424 mov qword ptr [rsp], r14 -;; 16: 488b442408 mov rax, qword ptr [rsp + 8] -;; 1b: 488b4c2410 mov rcx, qword ptr [rsp + 0x10] -;; 20: 4839c1 cmp rcx, rax -;; 23: b900000000 mov ecx, 0 -;; 28: 400f94c1 sete cl -;; 2c: 4889c8 mov rax, rcx -;; 2f: 4883c418 add rsp, 0x18 -;; 33: 5d pop rbp -;; 34: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872c000000 ja 0x44 +;; 18: 48897c2410 mov qword ptr [rsp + 0x10], rdi +;; 4889742408 mov qword ptr [rsp + 8], rsi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 488b4c2410 mov rcx, qword ptr [rsp + 0x10] +;; 4839c1 cmp rcx, rax +;; b900000000 mov ecx, 0 +;; 400f94c1 sete cl +;; 89c8 mov eax, ecx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 44: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_eqz/32_const.wat b/winch/filetests/filetests/x64/i64_eqz/32_const.wat index 257d0f0067e4..5f857c14e6b8 100644 --- a/winch/filetests/filetests/x64/i64_eqz/32_const.wat +++ b/winch/filetests/filetests/x64/i64_eqz/32_const.wat @@ -6,14 +6,19 @@ (i64.eqz) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c001000000 mov rax, 1 -;; 13: 4883f800 cmp rax, 0 -;; 17: b800000000 mov eax, 0 -;; 1c: 400f94c0 sete al -;; 20: 4883c408 add rsp, 8 -;; 24: 5d pop rbp -;; 25: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871e000000 ja 0x36 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; 4883f800 cmp rax, 0 +;; b800000000 mov eax, 0 +;; 400f94c0 sete al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 36: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_eqz/64_const.wat b/winch/filetests/filetests/x64/i64_eqz/64_const.wat index 7326c59dedec..db282226fa63 100644 --- a/winch/filetests/filetests/x64/i64_eqz/64_const.wat +++ b/winch/filetests/filetests/x64/i64_eqz/64_const.wat @@ -6,15 +6,20 @@ (i64.eqz) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48b8ffffffffffffff7f +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8721000000 ja 0x39 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48b8ffffffffffffff7f ;; movabs rax, 0x7fffffffffffffff -;; 16: 4883f800 cmp rax, 0 -;; 1a: b800000000 mov eax, 0 -;; 1f: 400f94c0 sete al -;; 23: 4883c408 add rsp, 8 -;; 27: 5d pop rbp -;; 28: c3 ret +;; 4883f800 cmp rax, 0 +;; b800000000 mov eax, 0 +;; 400f94c0 sete al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 39: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_eqz/local.wat b/winch/filetests/filetests/x64/i64_eqz/local.wat index 849164e6cc7f..805e684a72cf 100644 --- a/winch/filetests/filetests/x64/i64_eqz/local.wat +++ b/winch/filetests/filetests/x64/i64_eqz/local.wat @@ -11,18 +11,23 @@ (i64.eqz) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8731000000 ja 0x49 +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: 48c7c002000000 mov rax, 2 -;; 1c: 4889442408 mov qword ptr [rsp + 8], rax -;; 21: 488b442408 mov rax, qword ptr [rsp + 8] -;; 26: 4883f800 cmp rax, 0 -;; 2a: b800000000 mov eax, 0 -;; 2f: 400f94c0 sete al -;; 33: 4883c410 add rsp, 0x10 -;; 37: 5d pop rbp -;; 38: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; 48c7c002000000 mov rax, 2 +;; 4889442408 mov qword ptr [rsp + 8], rax +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 4883f800 cmp rax, 0 +;; b800000000 mov eax, 0 +;; 400f94c0 sete al +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 49: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_eqz/param.wat b/winch/filetests/filetests/x64/i64_eqz/param.wat index 48972c40b832..d0224ec54772 100644 --- a/winch/filetests/filetests/x64/i64_eqz/param.wat +++ b/winch/filetests/filetests/x64/i64_eqz/param.wat @@ -6,15 +6,20 @@ (i64.eqz) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48897c2408 mov qword ptr [rsp + 8], rdi -;; d: 4c893424 mov qword ptr [rsp], r14 -;; 11: 488b442408 mov rax, qword ptr [rsp + 8] -;; 16: 4883f800 cmp rax, 0 -;; 1a: b800000000 mov eax, 0 -;; 1f: 400f94c0 sete al -;; 23: 4883c410 add rsp, 0x10 -;; 27: 5d pop rbp -;; 28: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8721000000 ja 0x39 +;; 18: 48897c2408 mov qword ptr [rsp + 8], rdi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 4883f800 cmp rax, 0 +;; b800000000 mov eax, 0 +;; 400f94c0 sete al +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 39: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_eqz/spilled.wat b/winch/filetests/filetests/x64/i64_eqz/spilled.wat new file mode 100644 index 000000000000..0018a582d308 --- /dev/null +++ b/winch/filetests/filetests/x64/i64_eqz/spilled.wat @@ -0,0 +1,30 @@ +;;! target = "x86_64" + +(module + (func (result i32) + i64.const 1 + i64.eqz + block + end + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872c000000 ja 0x44 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; 4883f800 cmp rax, 0 +;; b800000000 mov eax, 0 +;; 400f94c0 sete al +;; 4883ec04 sub rsp, 4 +;; 890424 mov dword ptr [rsp], eax +;; 8b0424 mov eax, dword ptr [rsp] +;; 4883c404 add rsp, 4 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 44: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_extend_16_s/const.wat b/winch/filetests/filetests/x64/i64_extend_16_s/const.wat new file mode 100644 index 000000000000..385285824e51 --- /dev/null +++ b/winch/filetests/filetests/x64/i64_extend_16_s/const.wat @@ -0,0 +1,22 @@ +;;! target = "x86_64" + +(module + (func (result i64) + (i64.const 1) + (i64.extend16_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8715000000 ja 0x2d +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; 480fbfc0 movsx rax, ax +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_extend_16_s/locals.wat b/winch/filetests/filetests/x64/i64_extend_16_s/locals.wat new file mode 100644 index 000000000000..7cc2dd502c7b --- /dev/null +++ b/winch/filetests/filetests/x64/i64_extend_16_s/locals.wat @@ -0,0 +1,26 @@ +;;! target = "x86_64" + +(module + (func (result i64) + (local i64) + + (local.get 0) + (i64.extend16_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871c000000 ja 0x34 +;; 18: 48c744240800000000 +;; mov qword ptr [rsp + 8], 0 +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 480fbfc0 movsx rax, ax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 34: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_extend_16_s/params.wat b/winch/filetests/filetests/x64/i64_extend_16_s/params.wat new file mode 100644 index 000000000000..3af919ebff53 --- /dev/null +++ b/winch/filetests/filetests/x64/i64_extend_16_s/params.wat @@ -0,0 +1,23 @@ +;;! target = "x86_64" + +(module + (func (param i64) (result i64) + (local.get 0) + (i64.extend16_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8718000000 ja 0x30 +;; 18: 48897c2408 mov qword ptr [rsp + 8], rdi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 480fbfc0 movsx rax, ax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 30: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_extend_32_s/const.wat b/winch/filetests/filetests/x64/i64_extend_32_s/const.wat new file mode 100644 index 000000000000..305c435c96a6 --- /dev/null +++ b/winch/filetests/filetests/x64/i64_extend_32_s/const.wat @@ -0,0 +1,22 @@ +;;! target = "x86_64" + +(module + (func (result i64) + (i64.const 1) + (i64.extend32_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8714000000 ja 0x2c +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; 4863c0 movsxd rax, eax +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2c: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_extend_32_s/locals.wat b/winch/filetests/filetests/x64/i64_extend_32_s/locals.wat new file mode 100644 index 000000000000..f6a33dad31a9 --- /dev/null +++ b/winch/filetests/filetests/x64/i64_extend_32_s/locals.wat @@ -0,0 +1,26 @@ +;;! target = "x86_64" + +(module + (func (result i64) + (local i64) + + (local.get 0) + (i64.extend32_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871b000000 ja 0x33 +;; 18: 48c744240800000000 +;; mov qword ptr [rsp + 8], 0 +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 4863c0 movsxd rax, eax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 33: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_extend_32_s/params.wat b/winch/filetests/filetests/x64/i64_extend_32_s/params.wat new file mode 100644 index 000000000000..dcbafd7b62cc --- /dev/null +++ b/winch/filetests/filetests/x64/i64_extend_32_s/params.wat @@ -0,0 +1,23 @@ +;;! target = "x86_64" + +(module + (func (param i64) (result i64) + (local.get 0) + (i64.extend32_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8717000000 ja 0x2f +;; 18: 48897c2408 mov qword ptr [rsp + 8], rdi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 4863c0 movsxd rax, eax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 2f: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_extend_8_s/const.wat b/winch/filetests/filetests/x64/i64_extend_8_s/const.wat new file mode 100644 index 000000000000..68d2a4d23419 --- /dev/null +++ b/winch/filetests/filetests/x64/i64_extend_8_s/const.wat @@ -0,0 +1,22 @@ +;;! target = "x86_64" + +(module + (func (result i64) + (i64.const 1) + (i64.extend8_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8715000000 ja 0x2d +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; 480fbec0 movsx rax, al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_extend_8_s/locals.wat b/winch/filetests/filetests/x64/i64_extend_8_s/locals.wat new file mode 100644 index 000000000000..085a1e660efa --- /dev/null +++ b/winch/filetests/filetests/x64/i64_extend_8_s/locals.wat @@ -0,0 +1,26 @@ +;;! target = "x86_64" + +(module + (func (result i64) + (local i64) + + (local.get 0) + (i64.extend8_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871c000000 ja 0x34 +;; 18: 48c744240800000000 +;; mov qword ptr [rsp + 8], 0 +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 480fbec0 movsx rax, al +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 34: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_extend_8_s/params.wat b/winch/filetests/filetests/x64/i64_extend_8_s/params.wat new file mode 100644 index 000000000000..c306ba966b0c --- /dev/null +++ b/winch/filetests/filetests/x64/i64_extend_8_s/params.wat @@ -0,0 +1,23 @@ +;;! target = "x86_64" + +(module + (func (param i64) (result i64) + (local.get 0) + (i64.extend8_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8718000000 ja 0x30 +;; 18: 48897c2408 mov qword ptr [rsp + 8], rdi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 480fbec0 movsx rax, al +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 30: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_extend_i32_s/const.wat b/winch/filetests/filetests/x64/i64_extend_i32_s/const.wat new file mode 100644 index 000000000000..1fbaa32d930c --- /dev/null +++ b/winch/filetests/filetests/x64/i64_extend_i32_s/const.wat @@ -0,0 +1,22 @@ +;;! target = "x86_64" + +(module + (func (result i64) + (i32.const 1) + (i64.extend_i32_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8712000000 ja 0x2a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 4863c0 movsxd rax, eax +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_extend_i32_s/locals.wat b/winch/filetests/filetests/x64/i64_extend_i32_s/locals.wat new file mode 100644 index 000000000000..81c22242fcca --- /dev/null +++ b/winch/filetests/filetests/x64/i64_extend_i32_s/locals.wat @@ -0,0 +1,26 @@ +;;! target = "x86_64" + +(module + (func (result i64) + (local i32) + + (local.get 0) + (i64.extend_i32_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871a000000 ja 0x32 +;; 18: 48c744240800000000 +;; mov qword ptr [rsp + 8], 0 +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 4863c0 movsxd rax, eax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 32: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_extend_i32_s/params.wat b/winch/filetests/filetests/x64/i64_extend_i32_s/params.wat new file mode 100644 index 000000000000..6387e130372d --- /dev/null +++ b/winch/filetests/filetests/x64/i64_extend_i32_s/params.wat @@ -0,0 +1,23 @@ +;;! target = "x86_64" + +(module + (func (param i32) (result i64) + (local.get 0) + (i64.extend_i32_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8715000000 ja 0x2d +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 4863c0 movsxd rax, eax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 2d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_extend_i32_s/spilled.wat b/winch/filetests/filetests/x64/i64_extend_i32_s/spilled.wat new file mode 100644 index 000000000000..2eb97299d939 --- /dev/null +++ b/winch/filetests/filetests/x64/i64_extend_i32_s/spilled.wat @@ -0,0 +1,26 @@ +;;! target = "x86_64" + +(module + (func (result i64) + i32.const 1 + i64.extend_i32_s + block + end + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8714000000 ja 0x2c +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 4863c0 movsxd rax, eax +;; 50 push rax +;; 58 pop rax +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2c: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_extend_i32_u/const.wat b/winch/filetests/filetests/x64/i64_extend_i32_u/const.wat new file mode 100644 index 000000000000..c7ac4218e6bc --- /dev/null +++ b/winch/filetests/filetests/x64/i64_extend_i32_u/const.wat @@ -0,0 +1,22 @@ +;;! target = "x86_64" + +(module + (func (result i64) + (i32.const 1) + (i64.extend_i32_u) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8711000000 ja 0x29 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 8bc0 mov eax, eax +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 29: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_extend_i32_u/locals.wat b/winch/filetests/filetests/x64/i64_extend_i32_u/locals.wat new file mode 100644 index 000000000000..ef17dc4c6a98 --- /dev/null +++ b/winch/filetests/filetests/x64/i64_extend_i32_u/locals.wat @@ -0,0 +1,26 @@ +;;! target = "x86_64" + +(module + (func (result i64) + (local i32) + + (local.get 0) + (i64.extend_i32_u) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8719000000 ja 0x31 +;; 18: 48c744240800000000 +;; mov qword ptr [rsp + 8], 0 +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 8bc0 mov eax, eax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 31: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_extend_i32_u/params.wat b/winch/filetests/filetests/x64/i64_extend_i32_u/params.wat new file mode 100644 index 000000000000..08ddd768e170 --- /dev/null +++ b/winch/filetests/filetests/x64/i64_extend_i32_u/params.wat @@ -0,0 +1,23 @@ +;;! target = "x86_64" + +(module + (func (param i32) (result i64) + (local.get 0) + (i64.extend_i32_u) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8714000000 ja 0x2c +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 8bc0 mov eax, eax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 2c: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_extend_i32_u/spilled.wat b/winch/filetests/filetests/x64/i64_extend_i32_u/spilled.wat new file mode 100644 index 000000000000..96ff496253f9 --- /dev/null +++ b/winch/filetests/filetests/x64/i64_extend_i32_u/spilled.wat @@ -0,0 +1,26 @@ +;;! target = "x86_64" + +(module + (func (result i64) + i32.const 1 + i64.extend_i32_u + block + end + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8713000000 ja 0x2b +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 8bc0 mov eax, eax +;; 50 push rax +;; 58 pop rax +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2b: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_ge_s/32_const.wat b/winch/filetests/filetests/x64/i64_ge_s/32_const.wat index c95e0fbdcba3..547f61975042 100644 --- a/winch/filetests/filetests/x64/i64_ge_s/32_const.wat +++ b/winch/filetests/filetests/x64/i64_ge_s/32_const.wat @@ -7,14 +7,19 @@ (i64.ge_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c002000000 mov rax, 2 -;; 13: 4883f803 cmp rax, 3 -;; 17: b800000000 mov eax, 0 -;; 1c: 400f9dc0 setge al -;; 20: 4883c408 add rsp, 8 -;; 24: 5d pop rbp -;; 25: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871e000000 ja 0x36 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c002000000 mov rax, 2 +;; 4883f803 cmp rax, 3 +;; b800000000 mov eax, 0 +;; 400f9dc0 setge al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 36: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_ge_s/64_const.wat b/winch/filetests/filetests/x64/i64_ge_s/64_const.wat index 6afa197c514e..e74a4e0d0d55 100644 --- a/winch/filetests/filetests/x64/i64_ge_s/64_const.wat +++ b/winch/filetests/filetests/x64/i64_ge_s/64_const.wat @@ -7,17 +7,22 @@ (i64.ge_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48b8feffffffffffff7f +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872a000000 ja 0x42 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48b8feffffffffffff7f ;; movabs rax, 0x7ffffffffffffffe -;; 16: 49bbffffffffffffff7f +;; 49bbffffffffffffff7f ;; movabs r11, 0x7fffffffffffffff -;; 20: 4c39d8 cmp rax, r11 -;; 23: b800000000 mov eax, 0 -;; 28: 400f9dc0 setge al -;; 2c: 4883c408 add rsp, 8 -;; 30: 5d pop rbp -;; 31: c3 ret +;; 4c39d8 cmp rax, r11 +;; b800000000 mov eax, 0 +;; 400f9dc0 setge al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 42: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_ge_s/locals.wat b/winch/filetests/filetests/x64/i64_ge_s/locals.wat index 6339d2f2312c..11ac8d794684 100644 --- a/winch/filetests/filetests/x64/i64_ge_s/locals.wat +++ b/winch/filetests/filetests/x64/i64_ge_s/locals.wat @@ -15,23 +15,28 @@ (i64.ge_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 4531db xor r11d, r11d -;; b: 4c895c2410 mov qword ptr [rsp + 0x10], r11 -;; 10: 4c895c2408 mov qword ptr [rsp + 8], r11 -;; 15: 4c893424 mov qword ptr [rsp], r14 -;; 19: 48c7c002000000 mov rax, 2 -;; 20: 4889442410 mov qword ptr [rsp + 0x10], rax -;; 25: 48c7c003000000 mov rax, 3 -;; 2c: 4889442408 mov qword ptr [rsp + 8], rax -;; 31: 488b442408 mov rax, qword ptr [rsp + 8] -;; 36: 488b4c2410 mov rcx, qword ptr [rsp + 0x10] -;; 3b: 4839c1 cmp rcx, rax -;; 3e: b900000000 mov ecx, 0 -;; 43: 400f9dc1 setge cl -;; 47: 4889c8 mov rax, rcx -;; 4a: 4883c418 add rsp, 0x18 -;; 4e: 5d pop rbp -;; 4f: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8747000000 ja 0x5f +;; 18: 4531db xor r11d, r11d +;; 4c895c2410 mov qword ptr [rsp + 0x10], r11 +;; 4c895c2408 mov qword ptr [rsp + 8], r11 +;; 4c893424 mov qword ptr [rsp], r14 +;; 48c7c002000000 mov rax, 2 +;; 4889442410 mov qword ptr [rsp + 0x10], rax +;; 48c7c003000000 mov rax, 3 +;; 4889442408 mov qword ptr [rsp + 8], rax +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 488b4c2410 mov rcx, qword ptr [rsp + 0x10] +;; 4839c1 cmp rcx, rax +;; b900000000 mov ecx, 0 +;; 400f9dc1 setge cl +;; 89c8 mov eax, ecx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 5f: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_ge_s/params.wat b/winch/filetests/filetests/x64/i64_ge_s/params.wat index 49a3ab656f81..58127e092ab8 100644 --- a/winch/filetests/filetests/x64/i64_ge_s/params.wat +++ b/winch/filetests/filetests/x64/i64_ge_s/params.wat @@ -7,18 +7,23 @@ (i64.ge_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 48897c2410 mov qword ptr [rsp + 0x10], rdi -;; d: 4889742408 mov qword ptr [rsp + 8], rsi -;; 12: 4c893424 mov qword ptr [rsp], r14 -;; 16: 488b442408 mov rax, qword ptr [rsp + 8] -;; 1b: 488b4c2410 mov rcx, qword ptr [rsp + 0x10] -;; 20: 4839c1 cmp rcx, rax -;; 23: b900000000 mov ecx, 0 -;; 28: 400f9dc1 setge cl -;; 2c: 4889c8 mov rax, rcx -;; 2f: 4883c418 add rsp, 0x18 -;; 33: 5d pop rbp -;; 34: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872c000000 ja 0x44 +;; 18: 48897c2410 mov qword ptr [rsp + 0x10], rdi +;; 4889742408 mov qword ptr [rsp + 8], rsi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 488b4c2410 mov rcx, qword ptr [rsp + 0x10] +;; 4839c1 cmp rcx, rax +;; b900000000 mov ecx, 0 +;; 400f9dc1 setge cl +;; 89c8 mov eax, ecx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 44: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_ge_u/32_const.wat b/winch/filetests/filetests/x64/i64_ge_u/32_const.wat index 5f08ad8d0726..eed52c6b01f4 100644 --- a/winch/filetests/filetests/x64/i64_ge_u/32_const.wat +++ b/winch/filetests/filetests/x64/i64_ge_u/32_const.wat @@ -7,14 +7,19 @@ (i64.ge_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c002000000 mov rax, 2 -;; 13: 4883f803 cmp rax, 3 -;; 17: b800000000 mov eax, 0 -;; 1c: 400f93c0 setae al -;; 20: 4883c408 add rsp, 8 -;; 24: 5d pop rbp -;; 25: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871e000000 ja 0x36 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c002000000 mov rax, 2 +;; 4883f803 cmp rax, 3 +;; b800000000 mov eax, 0 +;; 400f93c0 setae al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 36: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_ge_u/64_const.wat b/winch/filetests/filetests/x64/i64_ge_u/64_const.wat index 3ecb689cd8f1..1b7a077f8901 100644 --- a/winch/filetests/filetests/x64/i64_ge_u/64_const.wat +++ b/winch/filetests/filetests/x64/i64_ge_u/64_const.wat @@ -7,17 +7,22 @@ (i64.ge_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48b8feffffffffffff7f +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872a000000 ja 0x42 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48b8feffffffffffff7f ;; movabs rax, 0x7ffffffffffffffe -;; 16: 49bbffffffffffffff7f +;; 49bbffffffffffffff7f ;; movabs r11, 0x7fffffffffffffff -;; 20: 4c39d8 cmp rax, r11 -;; 23: b800000000 mov eax, 0 -;; 28: 400f93c0 setae al -;; 2c: 4883c408 add rsp, 8 -;; 30: 5d pop rbp -;; 31: c3 ret +;; 4c39d8 cmp rax, r11 +;; b800000000 mov eax, 0 +;; 400f93c0 setae al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 42: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_ge_u/locals.wat b/winch/filetests/filetests/x64/i64_ge_u/locals.wat index f8b2d35f9134..28f85e618882 100644 --- a/winch/filetests/filetests/x64/i64_ge_u/locals.wat +++ b/winch/filetests/filetests/x64/i64_ge_u/locals.wat @@ -15,23 +15,28 @@ (i64.ge_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 4531db xor r11d, r11d -;; b: 4c895c2410 mov qword ptr [rsp + 0x10], r11 -;; 10: 4c895c2408 mov qword ptr [rsp + 8], r11 -;; 15: 4c893424 mov qword ptr [rsp], r14 -;; 19: 48c7c002000000 mov rax, 2 -;; 20: 4889442410 mov qword ptr [rsp + 0x10], rax -;; 25: 48c7c003000000 mov rax, 3 -;; 2c: 4889442408 mov qword ptr [rsp + 8], rax -;; 31: 488b442408 mov rax, qword ptr [rsp + 8] -;; 36: 488b4c2410 mov rcx, qword ptr [rsp + 0x10] -;; 3b: 4839c1 cmp rcx, rax -;; 3e: b900000000 mov ecx, 0 -;; 43: 400f93c1 setae cl -;; 47: 4889c8 mov rax, rcx -;; 4a: 4883c418 add rsp, 0x18 -;; 4e: 5d pop rbp -;; 4f: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8747000000 ja 0x5f +;; 18: 4531db xor r11d, r11d +;; 4c895c2410 mov qword ptr [rsp + 0x10], r11 +;; 4c895c2408 mov qword ptr [rsp + 8], r11 +;; 4c893424 mov qword ptr [rsp], r14 +;; 48c7c002000000 mov rax, 2 +;; 4889442410 mov qword ptr [rsp + 0x10], rax +;; 48c7c003000000 mov rax, 3 +;; 4889442408 mov qword ptr [rsp + 8], rax +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 488b4c2410 mov rcx, qword ptr [rsp + 0x10] +;; 4839c1 cmp rcx, rax +;; b900000000 mov ecx, 0 +;; 400f93c1 setae cl +;; 89c8 mov eax, ecx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 5f: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_ge_u/params.wat b/winch/filetests/filetests/x64/i64_ge_u/params.wat index 2ca43e57eba1..3b418a47189b 100644 --- a/winch/filetests/filetests/x64/i64_ge_u/params.wat +++ b/winch/filetests/filetests/x64/i64_ge_u/params.wat @@ -7,18 +7,23 @@ (i64.ge_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 48897c2410 mov qword ptr [rsp + 0x10], rdi -;; d: 4889742408 mov qword ptr [rsp + 8], rsi -;; 12: 4c893424 mov qword ptr [rsp], r14 -;; 16: 488b442408 mov rax, qword ptr [rsp + 8] -;; 1b: 488b4c2410 mov rcx, qword ptr [rsp + 0x10] -;; 20: 4839c1 cmp rcx, rax -;; 23: b900000000 mov ecx, 0 -;; 28: 400f93c1 setae cl -;; 2c: 4889c8 mov rax, rcx -;; 2f: 4883c418 add rsp, 0x18 -;; 33: 5d pop rbp -;; 34: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872c000000 ja 0x44 +;; 18: 48897c2410 mov qword ptr [rsp + 0x10], rdi +;; 4889742408 mov qword ptr [rsp + 8], rsi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 488b4c2410 mov rcx, qword ptr [rsp + 0x10] +;; 4839c1 cmp rcx, rax +;; b900000000 mov ecx, 0 +;; 400f93c1 setae cl +;; 89c8 mov eax, ecx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 44: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_gt_s/32_const.wat b/winch/filetests/filetests/x64/i64_gt_s/32_const.wat index e7e8410cb185..82ef280333c5 100644 --- a/winch/filetests/filetests/x64/i64_gt_s/32_const.wat +++ b/winch/filetests/filetests/x64/i64_gt_s/32_const.wat @@ -7,14 +7,19 @@ (i64.gt_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c002000000 mov rax, 2 -;; 13: 4883f803 cmp rax, 3 -;; 17: b800000000 mov eax, 0 -;; 1c: 400f9fc0 setg al -;; 20: 4883c408 add rsp, 8 -;; 24: 5d pop rbp -;; 25: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871e000000 ja 0x36 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c002000000 mov rax, 2 +;; 4883f803 cmp rax, 3 +;; b800000000 mov eax, 0 +;; 400f9fc0 setg al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 36: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_gt_s/64_const.wat b/winch/filetests/filetests/x64/i64_gt_s/64_const.wat index fea7b152f292..92ccf78fe0d0 100644 --- a/winch/filetests/filetests/x64/i64_gt_s/64_const.wat +++ b/winch/filetests/filetests/x64/i64_gt_s/64_const.wat @@ -7,17 +7,22 @@ (i64.gt_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48b8feffffffffffff7f +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872a000000 ja 0x42 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48b8feffffffffffff7f ;; movabs rax, 0x7ffffffffffffffe -;; 16: 49bbffffffffffffff7f +;; 49bbffffffffffffff7f ;; movabs r11, 0x7fffffffffffffff -;; 20: 4c39d8 cmp rax, r11 -;; 23: b800000000 mov eax, 0 -;; 28: 400f9fc0 setg al -;; 2c: 4883c408 add rsp, 8 -;; 30: 5d pop rbp -;; 31: c3 ret +;; 4c39d8 cmp rax, r11 +;; b800000000 mov eax, 0 +;; 400f9fc0 setg al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 42: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_gt_s/locals.wat b/winch/filetests/filetests/x64/i64_gt_s/locals.wat index 10c5c4ec360a..dc832f2ad62d 100644 --- a/winch/filetests/filetests/x64/i64_gt_s/locals.wat +++ b/winch/filetests/filetests/x64/i64_gt_s/locals.wat @@ -15,23 +15,28 @@ (i64.gt_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 4531db xor r11d, r11d -;; b: 4c895c2410 mov qword ptr [rsp + 0x10], r11 -;; 10: 4c895c2408 mov qword ptr [rsp + 8], r11 -;; 15: 4c893424 mov qword ptr [rsp], r14 -;; 19: 48c7c002000000 mov rax, 2 -;; 20: 4889442410 mov qword ptr [rsp + 0x10], rax -;; 25: 48c7c003000000 mov rax, 3 -;; 2c: 4889442408 mov qword ptr [rsp + 8], rax -;; 31: 488b442408 mov rax, qword ptr [rsp + 8] -;; 36: 488b4c2410 mov rcx, qword ptr [rsp + 0x10] -;; 3b: 4839c1 cmp rcx, rax -;; 3e: b900000000 mov ecx, 0 -;; 43: 400f9fc1 setg cl -;; 47: 4889c8 mov rax, rcx -;; 4a: 4883c418 add rsp, 0x18 -;; 4e: 5d pop rbp -;; 4f: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8747000000 ja 0x5f +;; 18: 4531db xor r11d, r11d +;; 4c895c2410 mov qword ptr [rsp + 0x10], r11 +;; 4c895c2408 mov qword ptr [rsp + 8], r11 +;; 4c893424 mov qword ptr [rsp], r14 +;; 48c7c002000000 mov rax, 2 +;; 4889442410 mov qword ptr [rsp + 0x10], rax +;; 48c7c003000000 mov rax, 3 +;; 4889442408 mov qword ptr [rsp + 8], rax +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 488b4c2410 mov rcx, qword ptr [rsp + 0x10] +;; 4839c1 cmp rcx, rax +;; b900000000 mov ecx, 0 +;; 400f9fc1 setg cl +;; 89c8 mov eax, ecx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 5f: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_gt_s/params.wat b/winch/filetests/filetests/x64/i64_gt_s/params.wat index 5e30853e0a9a..71babe10df64 100644 --- a/winch/filetests/filetests/x64/i64_gt_s/params.wat +++ b/winch/filetests/filetests/x64/i64_gt_s/params.wat @@ -7,18 +7,23 @@ (i64.gt_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 48897c2410 mov qword ptr [rsp + 0x10], rdi -;; d: 4889742408 mov qword ptr [rsp + 8], rsi -;; 12: 4c893424 mov qword ptr [rsp], r14 -;; 16: 488b442408 mov rax, qword ptr [rsp + 8] -;; 1b: 488b4c2410 mov rcx, qword ptr [rsp + 0x10] -;; 20: 4839c1 cmp rcx, rax -;; 23: b900000000 mov ecx, 0 -;; 28: 400f9fc1 setg cl -;; 2c: 4889c8 mov rax, rcx -;; 2f: 4883c418 add rsp, 0x18 -;; 33: 5d pop rbp -;; 34: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872c000000 ja 0x44 +;; 18: 48897c2410 mov qword ptr [rsp + 0x10], rdi +;; 4889742408 mov qword ptr [rsp + 8], rsi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 488b4c2410 mov rcx, qword ptr [rsp + 0x10] +;; 4839c1 cmp rcx, rax +;; b900000000 mov ecx, 0 +;; 400f9fc1 setg cl +;; 89c8 mov eax, ecx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 44: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_gt_u/32_const.wat b/winch/filetests/filetests/x64/i64_gt_u/32_const.wat index 9daca9975754..e4be685fadd8 100644 --- a/winch/filetests/filetests/x64/i64_gt_u/32_const.wat +++ b/winch/filetests/filetests/x64/i64_gt_u/32_const.wat @@ -7,14 +7,19 @@ (i64.gt_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c002000000 mov rax, 2 -;; 13: 4883f803 cmp rax, 3 -;; 17: b800000000 mov eax, 0 -;; 1c: 400f97c0 seta al -;; 20: 4883c408 add rsp, 8 -;; 24: 5d pop rbp -;; 25: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871e000000 ja 0x36 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c002000000 mov rax, 2 +;; 4883f803 cmp rax, 3 +;; b800000000 mov eax, 0 +;; 400f97c0 seta al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 36: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_gt_u/64_const.wat b/winch/filetests/filetests/x64/i64_gt_u/64_const.wat index 88abfae9da04..1194d976bb64 100644 --- a/winch/filetests/filetests/x64/i64_gt_u/64_const.wat +++ b/winch/filetests/filetests/x64/i64_gt_u/64_const.wat @@ -7,17 +7,22 @@ (i64.gt_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48b8feffffffffffff7f +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872a000000 ja 0x42 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48b8feffffffffffff7f ;; movabs rax, 0x7ffffffffffffffe -;; 16: 49bbffffffffffffff7f +;; 49bbffffffffffffff7f ;; movabs r11, 0x7fffffffffffffff -;; 20: 4c39d8 cmp rax, r11 -;; 23: b800000000 mov eax, 0 -;; 28: 400f97c0 seta al -;; 2c: 4883c408 add rsp, 8 -;; 30: 5d pop rbp -;; 31: c3 ret +;; 4c39d8 cmp rax, r11 +;; b800000000 mov eax, 0 +;; 400f97c0 seta al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 42: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_gt_u/locals.wat b/winch/filetests/filetests/x64/i64_gt_u/locals.wat index 9890d2ca6bb1..fa1bb82a2b63 100644 --- a/winch/filetests/filetests/x64/i64_gt_u/locals.wat +++ b/winch/filetests/filetests/x64/i64_gt_u/locals.wat @@ -15,23 +15,28 @@ (i64.gt_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 4531db xor r11d, r11d -;; b: 4c895c2410 mov qword ptr [rsp + 0x10], r11 -;; 10: 4c895c2408 mov qword ptr [rsp + 8], r11 -;; 15: 4c893424 mov qword ptr [rsp], r14 -;; 19: 48c7c002000000 mov rax, 2 -;; 20: 4889442410 mov qword ptr [rsp + 0x10], rax -;; 25: 48c7c003000000 mov rax, 3 -;; 2c: 4889442408 mov qword ptr [rsp + 8], rax -;; 31: 488b442408 mov rax, qword ptr [rsp + 8] -;; 36: 488b4c2410 mov rcx, qword ptr [rsp + 0x10] -;; 3b: 4839c1 cmp rcx, rax -;; 3e: b900000000 mov ecx, 0 -;; 43: 400f97c1 seta cl -;; 47: 4889c8 mov rax, rcx -;; 4a: 4883c418 add rsp, 0x18 -;; 4e: 5d pop rbp -;; 4f: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8747000000 ja 0x5f +;; 18: 4531db xor r11d, r11d +;; 4c895c2410 mov qword ptr [rsp + 0x10], r11 +;; 4c895c2408 mov qword ptr [rsp + 8], r11 +;; 4c893424 mov qword ptr [rsp], r14 +;; 48c7c002000000 mov rax, 2 +;; 4889442410 mov qword ptr [rsp + 0x10], rax +;; 48c7c003000000 mov rax, 3 +;; 4889442408 mov qword ptr [rsp + 8], rax +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 488b4c2410 mov rcx, qword ptr [rsp + 0x10] +;; 4839c1 cmp rcx, rax +;; b900000000 mov ecx, 0 +;; 400f97c1 seta cl +;; 89c8 mov eax, ecx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 5f: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_gt_u/params.wat b/winch/filetests/filetests/x64/i64_gt_u/params.wat index e2e9d8654c3f..859f9247a8be 100644 --- a/winch/filetests/filetests/x64/i64_gt_u/params.wat +++ b/winch/filetests/filetests/x64/i64_gt_u/params.wat @@ -7,18 +7,23 @@ (i64.gt_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 48897c2410 mov qword ptr [rsp + 0x10], rdi -;; d: 4889742408 mov qword ptr [rsp + 8], rsi -;; 12: 4c893424 mov qword ptr [rsp], r14 -;; 16: 488b442408 mov rax, qword ptr [rsp + 8] -;; 1b: 488b4c2410 mov rcx, qword ptr [rsp + 0x10] -;; 20: 4839c1 cmp rcx, rax -;; 23: b900000000 mov ecx, 0 -;; 28: 400f97c1 seta cl -;; 2c: 4889c8 mov rax, rcx -;; 2f: 4883c418 add rsp, 0x18 -;; 33: 5d pop rbp -;; 34: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872c000000 ja 0x44 +;; 18: 48897c2410 mov qword ptr [rsp + 0x10], rdi +;; 4889742408 mov qword ptr [rsp + 8], rsi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 488b4c2410 mov rcx, qword ptr [rsp + 0x10] +;; 4839c1 cmp rcx, rax +;; b900000000 mov ecx, 0 +;; 400f97c1 seta cl +;; 89c8 mov eax, ecx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 44: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_le_s/32_const.wat b/winch/filetests/filetests/x64/i64_le_s/32_const.wat index 36785c4afe94..e6c4c02f247c 100644 --- a/winch/filetests/filetests/x64/i64_le_s/32_const.wat +++ b/winch/filetests/filetests/x64/i64_le_s/32_const.wat @@ -7,14 +7,19 @@ (i64.le_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c002000000 mov rax, 2 -;; 13: 4883f803 cmp rax, 3 -;; 17: b800000000 mov eax, 0 -;; 1c: 400f9ec0 setle al -;; 20: 4883c408 add rsp, 8 -;; 24: 5d pop rbp -;; 25: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871e000000 ja 0x36 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c002000000 mov rax, 2 +;; 4883f803 cmp rax, 3 +;; b800000000 mov eax, 0 +;; 400f9ec0 setle al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 36: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_le_s/64_const.wat b/winch/filetests/filetests/x64/i64_le_s/64_const.wat index 190995d9e518..6bdd08c0b397 100644 --- a/winch/filetests/filetests/x64/i64_le_s/64_const.wat +++ b/winch/filetests/filetests/x64/i64_le_s/64_const.wat @@ -7,17 +7,22 @@ (i64.le_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48b8feffffffffffff7f +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872a000000 ja 0x42 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48b8feffffffffffff7f ;; movabs rax, 0x7ffffffffffffffe -;; 16: 49bbffffffffffffff7f +;; 49bbffffffffffffff7f ;; movabs r11, 0x7fffffffffffffff -;; 20: 4c39d8 cmp rax, r11 -;; 23: b800000000 mov eax, 0 -;; 28: 400f9ec0 setle al -;; 2c: 4883c408 add rsp, 8 -;; 30: 5d pop rbp -;; 31: c3 ret +;; 4c39d8 cmp rax, r11 +;; b800000000 mov eax, 0 +;; 400f9ec0 setle al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 42: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_le_s/locals.wat b/winch/filetests/filetests/x64/i64_le_s/locals.wat index d363621c3b18..d88fdcee2891 100644 --- a/winch/filetests/filetests/x64/i64_le_s/locals.wat +++ b/winch/filetests/filetests/x64/i64_le_s/locals.wat @@ -15,23 +15,28 @@ (i64.le_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 4531db xor r11d, r11d -;; b: 4c895c2410 mov qword ptr [rsp + 0x10], r11 -;; 10: 4c895c2408 mov qword ptr [rsp + 8], r11 -;; 15: 4c893424 mov qword ptr [rsp], r14 -;; 19: 48c7c002000000 mov rax, 2 -;; 20: 4889442410 mov qword ptr [rsp + 0x10], rax -;; 25: 48c7c003000000 mov rax, 3 -;; 2c: 4889442408 mov qword ptr [rsp + 8], rax -;; 31: 488b442408 mov rax, qword ptr [rsp + 8] -;; 36: 488b4c2410 mov rcx, qword ptr [rsp + 0x10] -;; 3b: 4839c1 cmp rcx, rax -;; 3e: b900000000 mov ecx, 0 -;; 43: 400f9ec1 setle cl -;; 47: 4889c8 mov rax, rcx -;; 4a: 4883c418 add rsp, 0x18 -;; 4e: 5d pop rbp -;; 4f: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8747000000 ja 0x5f +;; 18: 4531db xor r11d, r11d +;; 4c895c2410 mov qword ptr [rsp + 0x10], r11 +;; 4c895c2408 mov qword ptr [rsp + 8], r11 +;; 4c893424 mov qword ptr [rsp], r14 +;; 48c7c002000000 mov rax, 2 +;; 4889442410 mov qword ptr [rsp + 0x10], rax +;; 48c7c003000000 mov rax, 3 +;; 4889442408 mov qword ptr [rsp + 8], rax +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 488b4c2410 mov rcx, qword ptr [rsp + 0x10] +;; 4839c1 cmp rcx, rax +;; b900000000 mov ecx, 0 +;; 400f9ec1 setle cl +;; 89c8 mov eax, ecx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 5f: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_le_s/params.wat b/winch/filetests/filetests/x64/i64_le_s/params.wat index 1df814ef2f03..f7047d8fb672 100644 --- a/winch/filetests/filetests/x64/i64_le_s/params.wat +++ b/winch/filetests/filetests/x64/i64_le_s/params.wat @@ -7,18 +7,23 @@ (i64.le_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 48897c2410 mov qword ptr [rsp + 0x10], rdi -;; d: 4889742408 mov qword ptr [rsp + 8], rsi -;; 12: 4c893424 mov qword ptr [rsp], r14 -;; 16: 488b442408 mov rax, qword ptr [rsp + 8] -;; 1b: 488b4c2410 mov rcx, qword ptr [rsp + 0x10] -;; 20: 4839c1 cmp rcx, rax -;; 23: b900000000 mov ecx, 0 -;; 28: 400f9ec1 setle cl -;; 2c: 4889c8 mov rax, rcx -;; 2f: 4883c418 add rsp, 0x18 -;; 33: 5d pop rbp -;; 34: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872c000000 ja 0x44 +;; 18: 48897c2410 mov qword ptr [rsp + 0x10], rdi +;; 4889742408 mov qword ptr [rsp + 8], rsi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 488b4c2410 mov rcx, qword ptr [rsp + 0x10] +;; 4839c1 cmp rcx, rax +;; b900000000 mov ecx, 0 +;; 400f9ec1 setle cl +;; 89c8 mov eax, ecx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 44: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_le_u/32_const.wat b/winch/filetests/filetests/x64/i64_le_u/32_const.wat index 18601bf4e19b..0dee44d20250 100644 --- a/winch/filetests/filetests/x64/i64_le_u/32_const.wat +++ b/winch/filetests/filetests/x64/i64_le_u/32_const.wat @@ -7,14 +7,19 @@ (i64.le_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c002000000 mov rax, 2 -;; 13: 4883f803 cmp rax, 3 -;; 17: b800000000 mov eax, 0 -;; 1c: 400f96c0 setbe al -;; 20: 4883c408 add rsp, 8 -;; 24: 5d pop rbp -;; 25: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871e000000 ja 0x36 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c002000000 mov rax, 2 +;; 4883f803 cmp rax, 3 +;; b800000000 mov eax, 0 +;; 400f96c0 setbe al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 36: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_le_u/64_const.wat b/winch/filetests/filetests/x64/i64_le_u/64_const.wat index 0b11355deafa..1dd5ee42275c 100644 --- a/winch/filetests/filetests/x64/i64_le_u/64_const.wat +++ b/winch/filetests/filetests/x64/i64_le_u/64_const.wat @@ -7,17 +7,22 @@ (i64.le_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48b8feffffffffffff7f +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872a000000 ja 0x42 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48b8feffffffffffff7f ;; movabs rax, 0x7ffffffffffffffe -;; 16: 49bbffffffffffffff7f +;; 49bbffffffffffffff7f ;; movabs r11, 0x7fffffffffffffff -;; 20: 4c39d8 cmp rax, r11 -;; 23: b800000000 mov eax, 0 -;; 28: 400f96c0 setbe al -;; 2c: 4883c408 add rsp, 8 -;; 30: 5d pop rbp -;; 31: c3 ret +;; 4c39d8 cmp rax, r11 +;; b800000000 mov eax, 0 +;; 400f96c0 setbe al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 42: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_le_u/locals.wat b/winch/filetests/filetests/x64/i64_le_u/locals.wat index 85eddc58343f..5eb4f942e63f 100644 --- a/winch/filetests/filetests/x64/i64_le_u/locals.wat +++ b/winch/filetests/filetests/x64/i64_le_u/locals.wat @@ -15,23 +15,28 @@ (i64.le_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 4531db xor r11d, r11d -;; b: 4c895c2410 mov qword ptr [rsp + 0x10], r11 -;; 10: 4c895c2408 mov qword ptr [rsp + 8], r11 -;; 15: 4c893424 mov qword ptr [rsp], r14 -;; 19: 48c7c002000000 mov rax, 2 -;; 20: 4889442410 mov qword ptr [rsp + 0x10], rax -;; 25: 48c7c003000000 mov rax, 3 -;; 2c: 4889442408 mov qword ptr [rsp + 8], rax -;; 31: 488b442408 mov rax, qword ptr [rsp + 8] -;; 36: 488b4c2410 mov rcx, qword ptr [rsp + 0x10] -;; 3b: 4839c1 cmp rcx, rax -;; 3e: b900000000 mov ecx, 0 -;; 43: 400f96c1 setbe cl -;; 47: 4889c8 mov rax, rcx -;; 4a: 4883c418 add rsp, 0x18 -;; 4e: 5d pop rbp -;; 4f: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8747000000 ja 0x5f +;; 18: 4531db xor r11d, r11d +;; 4c895c2410 mov qword ptr [rsp + 0x10], r11 +;; 4c895c2408 mov qword ptr [rsp + 8], r11 +;; 4c893424 mov qword ptr [rsp], r14 +;; 48c7c002000000 mov rax, 2 +;; 4889442410 mov qword ptr [rsp + 0x10], rax +;; 48c7c003000000 mov rax, 3 +;; 4889442408 mov qword ptr [rsp + 8], rax +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 488b4c2410 mov rcx, qword ptr [rsp + 0x10] +;; 4839c1 cmp rcx, rax +;; b900000000 mov ecx, 0 +;; 400f96c1 setbe cl +;; 89c8 mov eax, ecx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 5f: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_le_u/params.wat b/winch/filetests/filetests/x64/i64_le_u/params.wat index 113b16ffacad..3dd5f782b49d 100644 --- a/winch/filetests/filetests/x64/i64_le_u/params.wat +++ b/winch/filetests/filetests/x64/i64_le_u/params.wat @@ -7,18 +7,23 @@ (i64.le_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 48897c2410 mov qword ptr [rsp + 0x10], rdi -;; d: 4889742408 mov qword ptr [rsp + 8], rsi -;; 12: 4c893424 mov qword ptr [rsp], r14 -;; 16: 488b442408 mov rax, qword ptr [rsp + 8] -;; 1b: 488b4c2410 mov rcx, qword ptr [rsp + 0x10] -;; 20: 4839c1 cmp rcx, rax -;; 23: b900000000 mov ecx, 0 -;; 28: 400f96c1 setbe cl -;; 2c: 4889c8 mov rax, rcx -;; 2f: 4883c418 add rsp, 0x18 -;; 33: 5d pop rbp -;; 34: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872c000000 ja 0x44 +;; 18: 48897c2410 mov qword ptr [rsp + 0x10], rdi +;; 4889742408 mov qword ptr [rsp + 8], rsi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 488b4c2410 mov rcx, qword ptr [rsp + 0x10] +;; 4839c1 cmp rcx, rax +;; b900000000 mov ecx, 0 +;; 400f96c1 setbe cl +;; 89c8 mov eax, ecx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 44: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_lt_s/32_const.wat b/winch/filetests/filetests/x64/i64_lt_s/32_const.wat index fcc8359cec5a..ba052ea2b27e 100644 --- a/winch/filetests/filetests/x64/i64_lt_s/32_const.wat +++ b/winch/filetests/filetests/x64/i64_lt_s/32_const.wat @@ -8,14 +8,19 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c002000000 mov rax, 2 -;; 13: 4883f803 cmp rax, 3 -;; 17: b800000000 mov eax, 0 -;; 1c: 400f9cc0 setl al -;; 20: 4883c408 add rsp, 8 -;; 24: 5d pop rbp -;; 25: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871e000000 ja 0x36 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c002000000 mov rax, 2 +;; 4883f803 cmp rax, 3 +;; b800000000 mov eax, 0 +;; 400f9cc0 setl al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 36: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_lt_s/64_const.wat b/winch/filetests/filetests/x64/i64_lt_s/64_const.wat index 01c8e29abfcf..82915a41b5c2 100644 --- a/winch/filetests/filetests/x64/i64_lt_s/64_const.wat +++ b/winch/filetests/filetests/x64/i64_lt_s/64_const.wat @@ -8,17 +8,22 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48b8feffffffffffff7f +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872a000000 ja 0x42 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48b8feffffffffffff7f ;; movabs rax, 0x7ffffffffffffffe -;; 16: 49bbffffffffffffff7f +;; 49bbffffffffffffff7f ;; movabs r11, 0x7fffffffffffffff -;; 20: 4c39d8 cmp rax, r11 -;; 23: b800000000 mov eax, 0 -;; 28: 400f9cc0 setl al -;; 2c: 4883c408 add rsp, 8 -;; 30: 5d pop rbp -;; 31: c3 ret +;; 4c39d8 cmp rax, r11 +;; b800000000 mov eax, 0 +;; 400f9cc0 setl al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 42: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_lt_s/locals.wat b/winch/filetests/filetests/x64/i64_lt_s/locals.wat index 0a10518f54c9..6f64be93d533 100644 --- a/winch/filetests/filetests/x64/i64_lt_s/locals.wat +++ b/winch/filetests/filetests/x64/i64_lt_s/locals.wat @@ -16,23 +16,28 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 4531db xor r11d, r11d -;; b: 4c895c2410 mov qword ptr [rsp + 0x10], r11 -;; 10: 4c895c2408 mov qword ptr [rsp + 8], r11 -;; 15: 4c893424 mov qword ptr [rsp], r14 -;; 19: 48c7c002000000 mov rax, 2 -;; 20: 4889442410 mov qword ptr [rsp + 0x10], rax -;; 25: 48c7c003000000 mov rax, 3 -;; 2c: 4889442408 mov qword ptr [rsp + 8], rax -;; 31: 488b442408 mov rax, qword ptr [rsp + 8] -;; 36: 488b4c2410 mov rcx, qword ptr [rsp + 0x10] -;; 3b: 4839c1 cmp rcx, rax -;; 3e: b900000000 mov ecx, 0 -;; 43: 400f9cc1 setl cl -;; 47: 4889c8 mov rax, rcx -;; 4a: 4883c418 add rsp, 0x18 -;; 4e: 5d pop rbp -;; 4f: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8747000000 ja 0x5f +;; 18: 4531db xor r11d, r11d +;; 4c895c2410 mov qword ptr [rsp + 0x10], r11 +;; 4c895c2408 mov qword ptr [rsp + 8], r11 +;; 4c893424 mov qword ptr [rsp], r14 +;; 48c7c002000000 mov rax, 2 +;; 4889442410 mov qword ptr [rsp + 0x10], rax +;; 48c7c003000000 mov rax, 3 +;; 4889442408 mov qword ptr [rsp + 8], rax +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 488b4c2410 mov rcx, qword ptr [rsp + 0x10] +;; 4839c1 cmp rcx, rax +;; b900000000 mov ecx, 0 +;; 400f9cc1 setl cl +;; 89c8 mov eax, ecx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 5f: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_lt_s/params.wat b/winch/filetests/filetests/x64/i64_lt_s/params.wat index daafe27aa99d..50e0bea34aaa 100644 --- a/winch/filetests/filetests/x64/i64_lt_s/params.wat +++ b/winch/filetests/filetests/x64/i64_lt_s/params.wat @@ -8,18 +8,23 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 48897c2410 mov qword ptr [rsp + 0x10], rdi -;; d: 4889742408 mov qword ptr [rsp + 8], rsi -;; 12: 4c893424 mov qword ptr [rsp], r14 -;; 16: 488b442408 mov rax, qword ptr [rsp + 8] -;; 1b: 488b4c2410 mov rcx, qword ptr [rsp + 0x10] -;; 20: 4839c1 cmp rcx, rax -;; 23: b900000000 mov ecx, 0 -;; 28: 400f9cc1 setl cl -;; 2c: 4889c8 mov rax, rcx -;; 2f: 4883c418 add rsp, 0x18 -;; 33: 5d pop rbp -;; 34: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872c000000 ja 0x44 +;; 18: 48897c2410 mov qword ptr [rsp + 0x10], rdi +;; 4889742408 mov qword ptr [rsp + 8], rsi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 488b4c2410 mov rcx, qword ptr [rsp + 0x10] +;; 4839c1 cmp rcx, rax +;; b900000000 mov ecx, 0 +;; 400f9cc1 setl cl +;; 89c8 mov eax, ecx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 44: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_lt_u/32_const.wat b/winch/filetests/filetests/x64/i64_lt_u/32_const.wat index c7fc90921e5b..e61e88e7f918 100644 --- a/winch/filetests/filetests/x64/i64_lt_u/32_const.wat +++ b/winch/filetests/filetests/x64/i64_lt_u/32_const.wat @@ -7,14 +7,19 @@ (i64.lt_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c002000000 mov rax, 2 -;; 13: 4883f803 cmp rax, 3 -;; 17: b800000000 mov eax, 0 -;; 1c: 400f92c0 setb al -;; 20: 4883c408 add rsp, 8 -;; 24: 5d pop rbp -;; 25: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871e000000 ja 0x36 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c002000000 mov rax, 2 +;; 4883f803 cmp rax, 3 +;; b800000000 mov eax, 0 +;; 400f92c0 setb al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 36: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_lt_u/64_const.wat b/winch/filetests/filetests/x64/i64_lt_u/64_const.wat index 9de200f0052f..4998ba554384 100644 --- a/winch/filetests/filetests/x64/i64_lt_u/64_const.wat +++ b/winch/filetests/filetests/x64/i64_lt_u/64_const.wat @@ -7,17 +7,22 @@ (i64.lt_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48b8feffffffffffff7f +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872a000000 ja 0x42 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48b8feffffffffffff7f ;; movabs rax, 0x7ffffffffffffffe -;; 16: 49bbffffffffffffff7f +;; 49bbffffffffffffff7f ;; movabs r11, 0x7fffffffffffffff -;; 20: 4c39d8 cmp rax, r11 -;; 23: b800000000 mov eax, 0 -;; 28: 400f92c0 setb al -;; 2c: 4883c408 add rsp, 8 -;; 30: 5d pop rbp -;; 31: c3 ret +;; 4c39d8 cmp rax, r11 +;; b800000000 mov eax, 0 +;; 400f92c0 setb al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 42: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_lt_u/locals.wat b/winch/filetests/filetests/x64/i64_lt_u/locals.wat index eb5197430270..b790ad0d91a6 100644 --- a/winch/filetests/filetests/x64/i64_lt_u/locals.wat +++ b/winch/filetests/filetests/x64/i64_lt_u/locals.wat @@ -15,23 +15,28 @@ (i64.lt_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 4531db xor r11d, r11d -;; b: 4c895c2410 mov qword ptr [rsp + 0x10], r11 -;; 10: 4c895c2408 mov qword ptr [rsp + 8], r11 -;; 15: 4c893424 mov qword ptr [rsp], r14 -;; 19: 48c7c002000000 mov rax, 2 -;; 20: 4889442410 mov qword ptr [rsp + 0x10], rax -;; 25: 48c7c003000000 mov rax, 3 -;; 2c: 4889442408 mov qword ptr [rsp + 8], rax -;; 31: 488b442408 mov rax, qword ptr [rsp + 8] -;; 36: 488b4c2410 mov rcx, qword ptr [rsp + 0x10] -;; 3b: 4839c1 cmp rcx, rax -;; 3e: b900000000 mov ecx, 0 -;; 43: 400f92c1 setb cl -;; 47: 4889c8 mov rax, rcx -;; 4a: 4883c418 add rsp, 0x18 -;; 4e: 5d pop rbp -;; 4f: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8747000000 ja 0x5f +;; 18: 4531db xor r11d, r11d +;; 4c895c2410 mov qword ptr [rsp + 0x10], r11 +;; 4c895c2408 mov qword ptr [rsp + 8], r11 +;; 4c893424 mov qword ptr [rsp], r14 +;; 48c7c002000000 mov rax, 2 +;; 4889442410 mov qword ptr [rsp + 0x10], rax +;; 48c7c003000000 mov rax, 3 +;; 4889442408 mov qword ptr [rsp + 8], rax +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 488b4c2410 mov rcx, qword ptr [rsp + 0x10] +;; 4839c1 cmp rcx, rax +;; b900000000 mov ecx, 0 +;; 400f92c1 setb cl +;; 89c8 mov eax, ecx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 5f: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_lt_u/params.wat b/winch/filetests/filetests/x64/i64_lt_u/params.wat index c0697c6614d0..b034d3f8cebe 100644 --- a/winch/filetests/filetests/x64/i64_lt_u/params.wat +++ b/winch/filetests/filetests/x64/i64_lt_u/params.wat @@ -7,18 +7,23 @@ (i64.lt_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 48897c2410 mov qword ptr [rsp + 0x10], rdi -;; d: 4889742408 mov qword ptr [rsp + 8], rsi -;; 12: 4c893424 mov qword ptr [rsp], r14 -;; 16: 488b442408 mov rax, qword ptr [rsp + 8] -;; 1b: 488b4c2410 mov rcx, qword ptr [rsp + 0x10] -;; 20: 4839c1 cmp rcx, rax -;; 23: b900000000 mov ecx, 0 -;; 28: 400f92c1 setb cl -;; 2c: 4889c8 mov rax, rcx -;; 2f: 4883c418 add rsp, 0x18 -;; 33: 5d pop rbp -;; 34: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872c000000 ja 0x44 +;; 18: 48897c2410 mov qword ptr [rsp + 0x10], rdi +;; 4889742408 mov qword ptr [rsp + 8], rsi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 488b4c2410 mov rcx, qword ptr [rsp + 0x10] +;; 4839c1 cmp rcx, rax +;; b900000000 mov ecx, 0 +;; 400f92c1 setb cl +;; 89c8 mov eax, ecx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 44: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_mul/const.wat b/winch/filetests/filetests/x64/i64_mul/const.wat index 45d0f1525d4a..3821ab7ef361 100644 --- a/winch/filetests/filetests/x64/i64_mul/const.wat +++ b/winch/filetests/filetests/x64/i64_mul/const.wat @@ -7,12 +7,17 @@ (i64.mul) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c00a000000 mov rax, 0xa -;; 13: 486bc014 imul rax, rax, 0x14 -;; 17: 4883c408 add rsp, 8 -;; 1b: 5d pop rbp -;; 1c: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8715000000 ja 0x2d +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c00a000000 mov rax, 0xa +;; 486bc014 imul rax, rax, 0x14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_mul/locals.wat b/winch/filetests/filetests/x64/i64_mul/locals.wat index dde76c30b3aa..ee8342e0053a 100644 --- a/winch/filetests/filetests/x64/i64_mul/locals.wat +++ b/winch/filetests/filetests/x64/i64_mul/locals.wat @@ -16,21 +16,26 @@ i64.mul ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 4531db xor r11d, r11d -;; b: 4c895c2410 mov qword ptr [rsp + 0x10], r11 -;; 10: 4c895c2408 mov qword ptr [rsp + 8], r11 -;; 15: 4c893424 mov qword ptr [rsp], r14 -;; 19: 48c7c00a000000 mov rax, 0xa -;; 20: 4889442410 mov qword ptr [rsp + 0x10], rax -;; 25: 48c7c014000000 mov rax, 0x14 -;; 2c: 4889442408 mov qword ptr [rsp + 8], rax -;; 31: 488b442408 mov rax, qword ptr [rsp + 8] -;; 36: 488b4c2410 mov rcx, qword ptr [rsp + 0x10] -;; 3b: 480fafc8 imul rcx, rax -;; 3f: 4889c8 mov rax, rcx -;; 42: 4883c418 add rsp, 0x18 -;; 46: 5d pop rbp -;; 47: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8740000000 ja 0x58 +;; 18: 4531db xor r11d, r11d +;; 4c895c2410 mov qword ptr [rsp + 0x10], r11 +;; 4c895c2408 mov qword ptr [rsp + 8], r11 +;; 4c893424 mov qword ptr [rsp], r14 +;; 48c7c00a000000 mov rax, 0xa +;; 4889442410 mov qword ptr [rsp + 0x10], rax +;; 48c7c014000000 mov rax, 0x14 +;; 4889442408 mov qword ptr [rsp + 8], rax +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 488b4c2410 mov rcx, qword ptr [rsp + 0x10] +;; 480fafc8 imul rcx, rax +;; 4889c8 mov rax, rcx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 58: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_mul/max.wat b/winch/filetests/filetests/x64/i64_mul/max.wat index 092774b90360..a04fc7a8340c 100644 --- a/winch/filetests/filetests/x64/i64_mul/max.wat +++ b/winch/filetests/filetests/x64/i64_mul/max.wat @@ -6,13 +6,18 @@ (i64.mul) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48b8ffffffffffffff7f +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8718000000 ja 0x30 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48b8ffffffffffffff7f ;; movabs rax, 0x7fffffffffffffff -;; 16: 486bc0ff imul rax, rax, -1 -;; 1a: 4883c408 add rsp, 8 -;; 1e: 5d pop rbp -;; 1f: c3 ret +;; 486bc0ff imul rax, rax, -1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 30: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_mul/max_one.wat b/winch/filetests/filetests/x64/i64_mul/max_one.wat index f2153c3580d1..db7b145b5c4e 100644 --- a/winch/filetests/filetests/x64/i64_mul/max_one.wat +++ b/winch/filetests/filetests/x64/i64_mul/max_one.wat @@ -7,13 +7,18 @@ (i64.mul) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48b80000000000000080 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8718000000 ja 0x30 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48b80000000000000080 ;; movabs rax, 0x8000000000000000 -;; 16: 486bc0ff imul rax, rax, -1 -;; 1a: 4883c408 add rsp, 8 -;; 1e: 5d pop rbp -;; 1f: c3 ret +;; 486bc0ff imul rax, rax, -1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 30: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_mul/mixed.wat b/winch/filetests/filetests/x64/i64_mul/mixed.wat index 25fe02977df8..51d5399cb5ac 100644 --- a/winch/filetests/filetests/x64/i64_mul/mixed.wat +++ b/winch/filetests/filetests/x64/i64_mul/mixed.wat @@ -7,12 +7,17 @@ (i64.mul) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c0ffffffff mov rax, 0xffffffffffffffff -;; 13: 486bc001 imul rax, rax, 1 -;; 17: 4883c408 add rsp, 8 -;; 1b: 5d pop rbp -;; 1c: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8715000000 ja 0x2d +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c0ffffffff mov rax, 0xffffffffffffffff +;; 486bc001 imul rax, rax, 1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_mul/params.wat b/winch/filetests/filetests/x64/i64_mul/params.wat index 149eac4a6eb3..3f702527978c 100644 --- a/winch/filetests/filetests/x64/i64_mul/params.wat +++ b/winch/filetests/filetests/x64/i64_mul/params.wat @@ -7,16 +7,21 @@ (i64.mul) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 48897c2410 mov qword ptr [rsp + 0x10], rdi -;; d: 4889742408 mov qword ptr [rsp + 8], rsi -;; 12: 4c893424 mov qword ptr [rsp], r14 -;; 16: 488b442408 mov rax, qword ptr [rsp + 8] -;; 1b: 488b4c2410 mov rcx, qword ptr [rsp + 0x10] -;; 20: 480fafc8 imul rcx, rax -;; 24: 4889c8 mov rax, rcx -;; 27: 4883c418 add rsp, 0x18 -;; 2b: 5d pop rbp -;; 2c: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8725000000 ja 0x3d +;; 18: 48897c2410 mov qword ptr [rsp + 0x10], rdi +;; 4889742408 mov qword ptr [rsp + 8], rsi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 488b4c2410 mov rcx, qword ptr [rsp + 0x10] +;; 480fafc8 imul rcx, rax +;; 4889c8 mov rax, rcx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 3d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_mul/signed.wat b/winch/filetests/filetests/x64/i64_mul/signed.wat index 3dd7bc04382f..eab078526d7c 100644 --- a/winch/filetests/filetests/x64/i64_mul/signed.wat +++ b/winch/filetests/filetests/x64/i64_mul/signed.wat @@ -7,12 +7,17 @@ (i64.mul) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c0ffffffff mov rax, 0xffffffffffffffff -;; 13: 486bc0ff imul rax, rax, -1 -;; 17: 4883c408 add rsp, 8 -;; 1b: 5d pop rbp -;; 1c: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8715000000 ja 0x2d +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c0ffffffff mov rax, 0xffffffffffffffff +;; 486bc0ff imul rax, rax, -1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_mul/unsigned_with_zero.wat b/winch/filetests/filetests/x64/i64_mul/unsigned_with_zero.wat index 695606db36cf..54ae81cc3937 100644 --- a/winch/filetests/filetests/x64/i64_mul/unsigned_with_zero.wat +++ b/winch/filetests/filetests/x64/i64_mul/unsigned_with_zero.wat @@ -7,12 +7,17 @@ (i64.mul) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c001000000 mov rax, 1 -;; 13: 486bc000 imul rax, rax, 0 -;; 17: 4883c408 add rsp, 8 -;; 1b: 5d pop rbp -;; 1c: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8715000000 ja 0x2d +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; 486bc000 imul rax, rax, 0 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_ne/32_const.wat b/winch/filetests/filetests/x64/i64_ne/32_const.wat index 01e53867e2eb..9249c16fd37a 100644 --- a/winch/filetests/filetests/x64/i64_ne/32_const.wat +++ b/winch/filetests/filetests/x64/i64_ne/32_const.wat @@ -8,14 +8,19 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c002000000 mov rax, 2 -;; 13: 4883f803 cmp rax, 3 -;; 17: b800000000 mov eax, 0 -;; 1c: 400f95c0 setne al -;; 20: 4883c408 add rsp, 8 -;; 24: 5d pop rbp -;; 25: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871e000000 ja 0x36 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c002000000 mov rax, 2 +;; 4883f803 cmp rax, 3 +;; b800000000 mov eax, 0 +;; 400f95c0 setne al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 36: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_ne/64_const.wat b/winch/filetests/filetests/x64/i64_ne/64_const.wat index b5907a137b0b..cadbc0e3ce25 100644 --- a/winch/filetests/filetests/x64/i64_ne/64_const.wat +++ b/winch/filetests/filetests/x64/i64_ne/64_const.wat @@ -8,17 +8,22 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48b8feffffffffffff7f +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872a000000 ja 0x42 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48b8feffffffffffff7f ;; movabs rax, 0x7ffffffffffffffe -;; 16: 49bbffffffffffffff7f +;; 49bbffffffffffffff7f ;; movabs r11, 0x7fffffffffffffff -;; 20: 4c39d8 cmp rax, r11 -;; 23: b800000000 mov eax, 0 -;; 28: 400f95c0 setne al -;; 2c: 4883c408 add rsp, 8 -;; 30: 5d pop rbp -;; 31: c3 ret +;; 4c39d8 cmp rax, r11 +;; b800000000 mov eax, 0 +;; 400f95c0 setne al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 42: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_ne/locals.wat b/winch/filetests/filetests/x64/i64_ne/locals.wat index 49090a56e9e7..ee445f7adcd8 100644 --- a/winch/filetests/filetests/x64/i64_ne/locals.wat +++ b/winch/filetests/filetests/x64/i64_ne/locals.wat @@ -16,23 +16,28 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 4531db xor r11d, r11d -;; b: 4c895c2410 mov qword ptr [rsp + 0x10], r11 -;; 10: 4c895c2408 mov qword ptr [rsp + 8], r11 -;; 15: 4c893424 mov qword ptr [rsp], r14 -;; 19: 48c7c002000000 mov rax, 2 -;; 20: 4889442410 mov qword ptr [rsp + 0x10], rax -;; 25: 48c7c003000000 mov rax, 3 -;; 2c: 4889442408 mov qword ptr [rsp + 8], rax -;; 31: 488b442408 mov rax, qword ptr [rsp + 8] -;; 36: 488b4c2410 mov rcx, qword ptr [rsp + 0x10] -;; 3b: 4839c1 cmp rcx, rax -;; 3e: b900000000 mov ecx, 0 -;; 43: 400f95c1 setne cl -;; 47: 4889c8 mov rax, rcx -;; 4a: 4883c418 add rsp, 0x18 -;; 4e: 5d pop rbp -;; 4f: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8747000000 ja 0x5f +;; 18: 4531db xor r11d, r11d +;; 4c895c2410 mov qword ptr [rsp + 0x10], r11 +;; 4c895c2408 mov qword ptr [rsp + 8], r11 +;; 4c893424 mov qword ptr [rsp], r14 +;; 48c7c002000000 mov rax, 2 +;; 4889442410 mov qword ptr [rsp + 0x10], rax +;; 48c7c003000000 mov rax, 3 +;; 4889442408 mov qword ptr [rsp + 8], rax +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 488b4c2410 mov rcx, qword ptr [rsp + 0x10] +;; 4839c1 cmp rcx, rax +;; b900000000 mov ecx, 0 +;; 400f95c1 setne cl +;; 89c8 mov eax, ecx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 5f: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_ne/params.wat b/winch/filetests/filetests/x64/i64_ne/params.wat index 0d08508c8f57..3129beb58821 100644 --- a/winch/filetests/filetests/x64/i64_ne/params.wat +++ b/winch/filetests/filetests/x64/i64_ne/params.wat @@ -8,18 +8,23 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 48897c2410 mov qword ptr [rsp + 0x10], rdi -;; d: 4889742408 mov qword ptr [rsp + 8], rsi -;; 12: 4c893424 mov qword ptr [rsp], r14 -;; 16: 488b442408 mov rax, qword ptr [rsp + 8] -;; 1b: 488b4c2410 mov rcx, qword ptr [rsp + 0x10] -;; 20: 4839c1 cmp rcx, rax -;; 23: b900000000 mov ecx, 0 -;; 28: 400f95c1 setne cl -;; 2c: 4889c8 mov rax, rcx -;; 2f: 4883c418 add rsp, 0x18 -;; 33: 5d pop rbp -;; 34: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872c000000 ja 0x44 +;; 18: 48897c2410 mov qword ptr [rsp + 0x10], rdi +;; 4889742408 mov qword ptr [rsp + 8], rsi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 488b4c2410 mov rcx, qword ptr [rsp + 0x10] +;; 4839c1 cmp rcx, rax +;; b900000000 mov ecx, 0 +;; 400f95c1 setne cl +;; 89c8 mov eax, ecx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 44: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_or/32_const.wat b/winch/filetests/filetests/x64/i64_or/32_const.wat index dd35d78d05f5..6a1cadb202c6 100644 --- a/winch/filetests/filetests/x64/i64_or/32_const.wat +++ b/winch/filetests/filetests/x64/i64_or/32_const.wat @@ -7,12 +7,17 @@ (i64.or) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c002000000 mov rax, 2 -;; 13: 4883c803 or rax, 3 -;; 17: 4883c408 add rsp, 8 -;; 1b: 5d pop rbp -;; 1c: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8715000000 ja 0x2d +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c002000000 mov rax, 2 +;; 4883c803 or rax, 3 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_or/64_const.wat b/winch/filetests/filetests/x64/i64_or/64_const.wat index 0af959edb4ac..373b097d75dd 100644 --- a/winch/filetests/filetests/x64/i64_or/64_const.wat +++ b/winch/filetests/filetests/x64/i64_or/64_const.wat @@ -7,15 +7,20 @@ (i64.or) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48b8feffffffffffff7f +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8721000000 ja 0x39 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48b8feffffffffffff7f ;; movabs rax, 0x7ffffffffffffffe -;; 16: 49bbffffffffffffff7f +;; 49bbffffffffffffff7f ;; movabs r11, 0x7fffffffffffffff -;; 20: 4c09d8 or rax, r11 -;; 23: 4883c408 add rsp, 8 -;; 27: 5d pop rbp -;; 28: c3 ret +;; 4c09d8 or rax, r11 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 39: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_or/locals.wat b/winch/filetests/filetests/x64/i64_or/locals.wat index 248936ac9155..7f78416abeab 100644 --- a/winch/filetests/filetests/x64/i64_or/locals.wat +++ b/winch/filetests/filetests/x64/i64_or/locals.wat @@ -15,21 +15,26 @@ (i64.or) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 4531db xor r11d, r11d -;; b: 4c895c2410 mov qword ptr [rsp + 0x10], r11 -;; 10: 4c895c2408 mov qword ptr [rsp + 8], r11 -;; 15: 4c893424 mov qword ptr [rsp], r14 -;; 19: 48c7c002000000 mov rax, 2 -;; 20: 4889442410 mov qword ptr [rsp + 0x10], rax -;; 25: 48c7c003000000 mov rax, 3 -;; 2c: 4889442408 mov qword ptr [rsp + 8], rax -;; 31: 488b442408 mov rax, qword ptr [rsp + 8] -;; 36: 488b4c2410 mov rcx, qword ptr [rsp + 0x10] -;; 3b: 4809c1 or rcx, rax -;; 3e: 4889c8 mov rax, rcx -;; 41: 4883c418 add rsp, 0x18 -;; 45: 5d pop rbp -;; 46: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f873f000000 ja 0x57 +;; 18: 4531db xor r11d, r11d +;; 4c895c2410 mov qword ptr [rsp + 0x10], r11 +;; 4c895c2408 mov qword ptr [rsp + 8], r11 +;; 4c893424 mov qword ptr [rsp], r14 +;; 48c7c002000000 mov rax, 2 +;; 4889442410 mov qword ptr [rsp + 0x10], rax +;; 48c7c003000000 mov rax, 3 +;; 4889442408 mov qword ptr [rsp + 8], rax +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 488b4c2410 mov rcx, qword ptr [rsp + 0x10] +;; 4809c1 or rcx, rax +;; 4889c8 mov rax, rcx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 57: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_or/params.wat b/winch/filetests/filetests/x64/i64_or/params.wat index bf19e78fd4e6..33f94c511094 100644 --- a/winch/filetests/filetests/x64/i64_or/params.wat +++ b/winch/filetests/filetests/x64/i64_or/params.wat @@ -7,16 +7,21 @@ (i64.or) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 48897c2410 mov qword ptr [rsp + 0x10], rdi -;; d: 4889742408 mov qword ptr [rsp + 8], rsi -;; 12: 4c893424 mov qword ptr [rsp], r14 -;; 16: 488b442408 mov rax, qword ptr [rsp + 8] -;; 1b: 488b4c2410 mov rcx, qword ptr [rsp + 0x10] -;; 20: 4809c1 or rcx, rax -;; 23: 4889c8 mov rax, rcx -;; 26: 4883c418 add rsp, 0x18 -;; 2a: 5d pop rbp -;; 2b: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8724000000 ja 0x3c +;; 18: 48897c2410 mov qword ptr [rsp + 0x10], rdi +;; 4889742408 mov qword ptr [rsp + 8], rsi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 488b4c2410 mov rcx, qword ptr [rsp + 0x10] +;; 4809c1 or rcx, rax +;; 4889c8 mov rax, rcx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 3c: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_popcnt/const.wat b/winch/filetests/filetests/x64/i64_popcnt/const.wat index 99d4973269f8..6d9038e119aa 100644 --- a/winch/filetests/filetests/x64/i64_popcnt/const.wat +++ b/winch/filetests/filetests/x64/i64_popcnt/const.wat @@ -7,12 +7,17 @@ i64.popcnt ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c003000000 mov rax, 3 -;; 13: f3480fb8c0 popcnt rax, rax -;; 18: 4883c408 add rsp, 8 -;; 1c: 5d pop rbp -;; 1d: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8716000000 ja 0x2e +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c003000000 mov rax, 3 +;; f3480fb8c0 popcnt rax, rax +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2e: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_popcnt/fallback.wat b/winch/filetests/filetests/x64/i64_popcnt/fallback.wat index 5e2c49440783..539554f1f621 100644 --- a/winch/filetests/filetests/x64/i64_popcnt/fallback.wat +++ b/winch/filetests/filetests/x64/i64_popcnt/fallback.wat @@ -6,34 +6,39 @@ i64.popcnt ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c00f000000 mov rax, 0xf -;; 13: 4889c1 mov rcx, rax -;; 16: 48c1e801 shr rax, 1 -;; 1a: 49bb5555555555555555 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f876b000000 ja 0x83 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c00f000000 mov rax, 0xf +;; 4889c1 mov rcx, rax +;; 48c1e801 shr rax, 1 +;; 49bb5555555555555555 ;; movabs r11, 0x5555555555555555 -;; 24: 4c21d8 and rax, r11 -;; 27: 4829c1 sub rcx, rax -;; 2a: 4889c8 mov rax, rcx -;; 2d: 49bb3333333333333333 +;; 4c21d8 and rax, r11 +;; 4829c1 sub rcx, rax +;; 4889c8 mov rax, rcx +;; 49bb3333333333333333 ;; movabs r11, 0x3333333333333333 -;; 37: 4c21d8 and rax, r11 -;; 3a: 48c1e902 shr rcx, 2 -;; 3e: 4c21d9 and rcx, r11 -;; 41: 4801c1 add rcx, rax -;; 44: 4889c8 mov rax, rcx -;; 47: 48c1e804 shr rax, 4 -;; 4b: 4801c8 add rax, rcx -;; 4e: 49bb0f0f0f0f0f0f0f0f +;; 4c21d8 and rax, r11 +;; 48c1e902 shr rcx, 2 +;; 4c21d9 and rcx, r11 +;; 4801c1 add rcx, rax +;; 4889c8 mov rax, rcx +;; 48c1e804 shr rax, 4 +;; 4801c8 add rax, rcx +;; 49bb0f0f0f0f0f0f0f0f ;; movabs r11, 0xf0f0f0f0f0f0f0f -;; 58: 4c21d8 and rax, r11 -;; 5b: 49bb0101010101010101 +;; 4c21d8 and rax, r11 +;; 49bb0101010101010101 ;; movabs r11, 0x101010101010101 -;; 65: 490fafc3 imul rax, r11 -;; 69: 48c1e838 shr rax, 0x38 -;; 6d: 4883c408 add rsp, 8 -;; 71: 5d pop rbp -;; 72: c3 ret +;; 490fafc3 imul rax, r11 +;; 48c1e838 shr rax, 0x38 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 83: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_popcnt/no_sse42.wat b/winch/filetests/filetests/x64/i64_popcnt/no_sse42.wat index 7430a14ff68c..989506a374fe 100644 --- a/winch/filetests/filetests/x64/i64_popcnt/no_sse42.wat +++ b/winch/filetests/filetests/x64/i64_popcnt/no_sse42.wat @@ -7,34 +7,39 @@ i64.popcnt ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c003000000 mov rax, 3 -;; 13: 4889c1 mov rcx, rax -;; 16: 48c1e801 shr rax, 1 -;; 1a: 49bb5555555555555555 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f876b000000 ja 0x83 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c003000000 mov rax, 3 +;; 4889c1 mov rcx, rax +;; 48c1e801 shr rax, 1 +;; 49bb5555555555555555 ;; movabs r11, 0x5555555555555555 -;; 24: 4c21d8 and rax, r11 -;; 27: 4829c1 sub rcx, rax -;; 2a: 4889c8 mov rax, rcx -;; 2d: 49bb3333333333333333 +;; 4c21d8 and rax, r11 +;; 4829c1 sub rcx, rax +;; 4889c8 mov rax, rcx +;; 49bb3333333333333333 ;; movabs r11, 0x3333333333333333 -;; 37: 4c21d8 and rax, r11 -;; 3a: 48c1e902 shr rcx, 2 -;; 3e: 4c21d9 and rcx, r11 -;; 41: 4801c1 add rcx, rax -;; 44: 4889c8 mov rax, rcx -;; 47: 48c1e804 shr rax, 4 -;; 4b: 4801c8 add rax, rcx -;; 4e: 49bb0f0f0f0f0f0f0f0f +;; 4c21d8 and rax, r11 +;; 48c1e902 shr rcx, 2 +;; 4c21d9 and rcx, r11 +;; 4801c1 add rcx, rax +;; 4889c8 mov rax, rcx +;; 48c1e804 shr rax, 4 +;; 4801c8 add rax, rcx +;; 49bb0f0f0f0f0f0f0f0f ;; movabs r11, 0xf0f0f0f0f0f0f0f -;; 58: 4c21d8 and rax, r11 -;; 5b: 49bb0101010101010101 +;; 4c21d8 and rax, r11 +;; 49bb0101010101010101 ;; movabs r11, 0x101010101010101 -;; 65: 490fafc3 imul rax, r11 -;; 69: 48c1e838 shr rax, 0x38 -;; 6d: 4883c408 add rsp, 8 -;; 71: 5d pop rbp -;; 72: c3 ret +;; 490fafc3 imul rax, r11 +;; 48c1e838 shr rax, 0x38 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 83: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_popcnt/reg.wat b/winch/filetests/filetests/x64/i64_popcnt/reg.wat index e03ff7ea3933..fe0da252c1fb 100644 --- a/winch/filetests/filetests/x64/i64_popcnt/reg.wat +++ b/winch/filetests/filetests/x64/i64_popcnt/reg.wat @@ -7,13 +7,18 @@ i64.popcnt ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48897c2408 mov qword ptr [rsp + 8], rdi -;; d: 4c893424 mov qword ptr [rsp], r14 -;; 11: 488b442408 mov rax, qword ptr [rsp + 8] -;; 16: f3480fb8c0 popcnt rax, rax -;; 1b: 4883c410 add rsp, 0x10 -;; 1f: 5d pop rbp -;; 20: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8719000000 ja 0x31 +;; 18: 48897c2408 mov qword ptr [rsp + 8], rdi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; f3480fb8c0 popcnt rax, rax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 31: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_reinterpret_f64/const.wat b/winch/filetests/filetests/x64/i64_reinterpret_f64/const.wat new file mode 100644 index 000000000000..673161ff1ca3 --- /dev/null +++ b/winch/filetests/filetests/x64/i64_reinterpret_f64/const.wat @@ -0,0 +1,29 @@ +;;! target = "x86_64" + +(module + (func (result i64) + (f64.const 1.0) + (i64.reinterpret_f64) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8717000000 ja 0x2f +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f20f100514000000 movsd xmm0, qword ptr [rip + 0x14] +;; 66480f7ec0 movq rax, xmm0 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2f: 0f0b ud2 +;; 31: 0000 add byte ptr [rax], al +;; 33: 0000 add byte ptr [rax], al +;; 35: 0000 add byte ptr [rax], al +;; 37: 0000 add byte ptr [rax], al +;; 39: 0000 add byte ptr [rax], al +;; 3b: 0000 add byte ptr [rax], al +;; 3d: 00f0 add al, dh diff --git a/winch/filetests/filetests/x64/i64_reinterpret_f64/locals.wat b/winch/filetests/filetests/x64/i64_reinterpret_f64/locals.wat new file mode 100644 index 000000000000..2af4d34db076 --- /dev/null +++ b/winch/filetests/filetests/x64/i64_reinterpret_f64/locals.wat @@ -0,0 +1,26 @@ +;;! target = "x86_64" + +(module + (func (result i64) + (local f64) + + (local.get 0) + (i64.reinterpret_f64) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871e000000 ja 0x36 +;; 18: 48c744240800000000 +;; mov qword ptr [rsp + 8], 0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; 66480f7ec0 movq rax, xmm0 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 36: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_reinterpret_f64/params.wat b/winch/filetests/filetests/x64/i64_reinterpret_f64/params.wat new file mode 100644 index 000000000000..18e0bb2c5483 --- /dev/null +++ b/winch/filetests/filetests/x64/i64_reinterpret_f64/params.wat @@ -0,0 +1,23 @@ +;;! target = "x86_64" + +(module + (func (param f64) (result i64) + (local.get 0) + (i64.reinterpret_f64) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871b000000 ja 0x33 +;; 18: f20f11442408 movsd qword ptr [rsp + 8], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; 66480f7ec0 movq rax, xmm0 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 33: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_reinterpret_f64/ret_float.wat b/winch/filetests/filetests/x64/i64_reinterpret_f64/ret_float.wat new file mode 100644 index 000000000000..c754aba695e4 --- /dev/null +++ b/winch/filetests/filetests/x64/i64_reinterpret_f64/ret_float.wat @@ -0,0 +1,32 @@ +;;! target = "x86_64" + +(module + (func (result f64) + f64.const 1.0 + i64.reinterpret_f64 + drop + f64.const 1.0 + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871f000000 ja 0x37 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f20f10051c000000 movsd xmm0, qword ptr [rip + 0x1c] +;; 66480f7ec0 movq rax, xmm0 +;; f20f10050f000000 movsd xmm0, qword ptr [rip + 0xf] +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 37: 0f0b ud2 +;; 39: 0000 add byte ptr [rax], al +;; 3b: 0000 add byte ptr [rax], al +;; 3d: 0000 add byte ptr [rax], al +;; 3f: 0000 add byte ptr [rax], al +;; 41: 0000 add byte ptr [rax], al +;; 43: 0000 add byte ptr [rax], al +;; 45: 00f0 add al, dh diff --git a/winch/filetests/filetests/x64/i64_rems/const.wat b/winch/filetests/filetests/x64/i64_rems/const.wat index 44c6156b485f..4100633ea212 100644 --- a/winch/filetests/filetests/x64/i64_rems/const.wat +++ b/winch/filetests/filetests/x64/i64_rems/const.wat @@ -7,19 +7,24 @@ (i64.rem_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c105000000 mov rcx, 5 -;; 13: 48c7c007000000 mov rax, 7 -;; 1a: 4899 cqo -;; 1c: 4883f9ff cmp rcx, -1 -;; 20: 0f850a000000 jne 0x30 -;; 26: ba00000000 mov edx, 0 -;; 2b: e903000000 jmp 0x33 -;; 30: 48f7f9 idiv rcx -;; 33: 4889d0 mov rax, rdx -;; 36: 4883c408 add rsp, 8 -;; 3a: 5d pop rbp -;; 3b: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8734000000 ja 0x4c +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c105000000 mov rcx, 5 +;; 48c7c007000000 mov rax, 7 +;; 4899 cqo +;; 4883f9ff cmp rcx, -1 +;; 0f850a000000 jne 0x40 +;; 36: ba00000000 mov edx, 0 +;; e903000000 jmp 0x43 +;; 40: 48f7f9 idiv rcx +;; 4889d0 mov rax, rdx +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 4c: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_rems/one_zero.wat b/winch/filetests/filetests/x64/i64_rems/one_zero.wat index 19e6f79b4cae..60d232802c04 100644 --- a/winch/filetests/filetests/x64/i64_rems/one_zero.wat +++ b/winch/filetests/filetests/x64/i64_rems/one_zero.wat @@ -7,19 +7,24 @@ (i64.rem_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c100000000 mov rcx, 0 -;; 13: 48c7c001000000 mov rax, 1 -;; 1a: 4899 cqo -;; 1c: 4883f9ff cmp rcx, -1 -;; 20: 0f850a000000 jne 0x30 -;; 26: ba00000000 mov edx, 0 -;; 2b: e903000000 jmp 0x33 -;; 30: 48f7f9 idiv rcx -;; 33: 4889d0 mov rax, rdx -;; 36: 4883c408 add rsp, 8 -;; 3a: 5d pop rbp -;; 3b: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8734000000 ja 0x4c +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c100000000 mov rcx, 0 +;; 48c7c001000000 mov rax, 1 +;; 4899 cqo +;; 4883f9ff cmp rcx, -1 +;; 0f850a000000 jne 0x40 +;; 36: ba00000000 mov edx, 0 +;; e903000000 jmp 0x43 +;; 40: 48f7f9 idiv rcx +;; 4889d0 mov rax, rdx +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 4c: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_rems/overflow.wat b/winch/filetests/filetests/x64/i64_rems/overflow.wat index 2d7046c8463d..e5cedfcffd80 100644 --- a/winch/filetests/filetests/x64/i64_rems/overflow.wat +++ b/winch/filetests/filetests/x64/i64_rems/overflow.wat @@ -7,20 +7,25 @@ (i64.rem_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c1ffffffff mov rcx, 0xffffffffffffffff -;; 13: 48b80000000000000080 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8737000000 ja 0x4f +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c1ffffffff mov rcx, 0xffffffffffffffff +;; 48b80000000000000080 ;; movabs rax, 0x8000000000000000 -;; 1d: 4899 cqo -;; 1f: 4883f9ff cmp rcx, -1 -;; 23: 0f850a000000 jne 0x33 -;; 29: ba00000000 mov edx, 0 -;; 2e: e903000000 jmp 0x36 -;; 33: 48f7f9 idiv rcx -;; 36: 4889d0 mov rax, rdx -;; 39: 4883c408 add rsp, 8 -;; 3d: 5d pop rbp -;; 3e: c3 ret +;; 4899 cqo +;; 4883f9ff cmp rcx, -1 +;; 0f850a000000 jne 0x43 +;; 39: ba00000000 mov edx, 0 +;; e903000000 jmp 0x46 +;; 43: 48f7f9 idiv rcx +;; 4889d0 mov rax, rdx +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 4f: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_rems/params.wat b/winch/filetests/filetests/x64/i64_rems/params.wat index e2d58fd90a84..7e42c16f8ea1 100644 --- a/winch/filetests/filetests/x64/i64_rems/params.wat +++ b/winch/filetests/filetests/x64/i64_rems/params.wat @@ -7,21 +7,26 @@ (i64.rem_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 48897c2410 mov qword ptr [rsp + 0x10], rdi -;; d: 4889742408 mov qword ptr [rsp + 8], rsi -;; 12: 4c893424 mov qword ptr [rsp], r14 -;; 16: 488b4c2408 mov rcx, qword ptr [rsp + 8] -;; 1b: 488b442410 mov rax, qword ptr [rsp + 0x10] -;; 20: 4899 cqo -;; 22: 4883f9ff cmp rcx, -1 -;; 26: 0f850a000000 jne 0x36 -;; 2c: ba00000000 mov edx, 0 -;; 31: e903000000 jmp 0x39 -;; 36: 48f7f9 idiv rcx -;; 39: 4889d0 mov rax, rdx -;; 3c: 4883c418 add rsp, 0x18 -;; 40: 5d pop rbp -;; 41: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f873a000000 ja 0x52 +;; 18: 48897c2410 mov qword ptr [rsp + 0x10], rdi +;; 4889742408 mov qword ptr [rsp + 8], rsi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b4c2408 mov rcx, qword ptr [rsp + 8] +;; 488b442410 mov rax, qword ptr [rsp + 0x10] +;; 4899 cqo +;; 4883f9ff cmp rcx, -1 +;; 0f850a000000 jne 0x46 +;; 3c: ba00000000 mov edx, 0 +;; e903000000 jmp 0x49 +;; 46: 48f7f9 idiv rcx +;; 4889d0 mov rax, rdx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 52: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_rems/zero_zero.wat b/winch/filetests/filetests/x64/i64_rems/zero_zero.wat index 18204ecc9bcd..faf578b95508 100644 --- a/winch/filetests/filetests/x64/i64_rems/zero_zero.wat +++ b/winch/filetests/filetests/x64/i64_rems/zero_zero.wat @@ -7,19 +7,24 @@ (i64.rem_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c100000000 mov rcx, 0 -;; 13: 48c7c000000000 mov rax, 0 -;; 1a: 4899 cqo -;; 1c: 4883f9ff cmp rcx, -1 -;; 20: 0f850a000000 jne 0x30 -;; 26: ba00000000 mov edx, 0 -;; 2b: e903000000 jmp 0x33 -;; 30: 48f7f9 idiv rcx -;; 33: 4889d0 mov rax, rdx -;; 36: 4883c408 add rsp, 8 -;; 3a: 5d pop rbp -;; 3b: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8734000000 ja 0x4c +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c100000000 mov rcx, 0 +;; 48c7c000000000 mov rax, 0 +;; 4899 cqo +;; 4883f9ff cmp rcx, -1 +;; 0f850a000000 jne 0x40 +;; 36: ba00000000 mov edx, 0 +;; e903000000 jmp 0x43 +;; 40: 48f7f9 idiv rcx +;; 4889d0 mov rax, rdx +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 4c: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_remu/const.wat b/winch/filetests/filetests/x64/i64_remu/const.wat index a668f329e83a..104a22f90496 100644 --- a/winch/filetests/filetests/x64/i64_remu/const.wat +++ b/winch/filetests/filetests/x64/i64_remu/const.wat @@ -7,15 +7,20 @@ (i64.rem_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c105000000 mov rcx, 5 -;; 13: 48c7c007000000 mov rax, 7 -;; 1a: 4831d2 xor rdx, rdx -;; 1d: 48f7f1 div rcx -;; 20: 4889d0 mov rax, rdx -;; 23: 4883c408 add rsp, 8 -;; 27: 5d pop rbp -;; 28: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8721000000 ja 0x39 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c105000000 mov rcx, 5 +;; 48c7c007000000 mov rax, 7 +;; 4831d2 xor rdx, rdx +;; 48f7f1 div rcx +;; 4889d0 mov rax, rdx +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 39: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_remu/one_zero.wat b/winch/filetests/filetests/x64/i64_remu/one_zero.wat index 1e76584db83b..60596c39db12 100644 --- a/winch/filetests/filetests/x64/i64_remu/one_zero.wat +++ b/winch/filetests/filetests/x64/i64_remu/one_zero.wat @@ -7,15 +7,20 @@ (i64.rem_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c100000000 mov rcx, 0 -;; 13: 48c7c001000000 mov rax, 1 -;; 1a: 4831d2 xor rdx, rdx -;; 1d: 48f7f1 div rcx -;; 20: 4889d0 mov rax, rdx -;; 23: 4883c408 add rsp, 8 -;; 27: 5d pop rbp -;; 28: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8721000000 ja 0x39 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c100000000 mov rcx, 0 +;; 48c7c001000000 mov rax, 1 +;; 4831d2 xor rdx, rdx +;; 48f7f1 div rcx +;; 4889d0 mov rax, rdx +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 39: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_remu/params.wat b/winch/filetests/filetests/x64/i64_remu/params.wat index 276143fceb59..bb10d8cd315a 100644 --- a/winch/filetests/filetests/x64/i64_remu/params.wat +++ b/winch/filetests/filetests/x64/i64_remu/params.wat @@ -7,17 +7,22 @@ (i64.rem_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 48897c2410 mov qword ptr [rsp + 0x10], rdi -;; d: 4889742408 mov qword ptr [rsp + 8], rsi -;; 12: 4c893424 mov qword ptr [rsp], r14 -;; 16: 488b4c2408 mov rcx, qword ptr [rsp + 8] -;; 1b: 488b442410 mov rax, qword ptr [rsp + 0x10] -;; 20: 4831d2 xor rdx, rdx -;; 23: 48f7f1 div rcx -;; 26: 4889d0 mov rax, rdx -;; 29: 4883c418 add rsp, 0x18 -;; 2d: 5d pop rbp -;; 2e: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8727000000 ja 0x3f +;; 18: 48897c2410 mov qword ptr [rsp + 0x10], rdi +;; 4889742408 mov qword ptr [rsp + 8], rsi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b4c2408 mov rcx, qword ptr [rsp + 8] +;; 488b442410 mov rax, qword ptr [rsp + 0x10] +;; 4831d2 xor rdx, rdx +;; 48f7f1 div rcx +;; 4889d0 mov rax, rdx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 3f: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_remu/signed.wat b/winch/filetests/filetests/x64/i64_remu/signed.wat index e51e01e3cc3a..d34eb4d64e73 100644 --- a/winch/filetests/filetests/x64/i64_remu/signed.wat +++ b/winch/filetests/filetests/x64/i64_remu/signed.wat @@ -7,15 +7,20 @@ (i64.rem_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c1ffffffff mov rcx, 0xffffffffffffffff -;; 13: 48c7c0ffffffff mov rax, 0xffffffffffffffff -;; 1a: 4831d2 xor rdx, rdx -;; 1d: 48f7f1 div rcx -;; 20: 4889d0 mov rax, rdx -;; 23: 4883c408 add rsp, 8 -;; 27: 5d pop rbp -;; 28: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8721000000 ja 0x39 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c1ffffffff mov rcx, 0xffffffffffffffff +;; 48c7c0ffffffff mov rax, 0xffffffffffffffff +;; 4831d2 xor rdx, rdx +;; 48f7f1 div rcx +;; 4889d0 mov rax, rdx +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 39: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_remu/zero_zero.wat b/winch/filetests/filetests/x64/i64_remu/zero_zero.wat index 4037015caa74..88e73690848e 100644 --- a/winch/filetests/filetests/x64/i64_remu/zero_zero.wat +++ b/winch/filetests/filetests/x64/i64_remu/zero_zero.wat @@ -7,15 +7,20 @@ (i64.rem_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c100000000 mov rcx, 0 -;; 13: 48c7c000000000 mov rax, 0 -;; 1a: 4831d2 xor rdx, rdx -;; 1d: 48f7f1 div rcx -;; 20: 4889d0 mov rax, rdx -;; 23: 4883c408 add rsp, 8 -;; 27: 5d pop rbp -;; 28: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8721000000 ja 0x39 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c100000000 mov rcx, 0 +;; 48c7c000000000 mov rax, 0 +;; 4831d2 xor rdx, rdx +;; 48f7f1 div rcx +;; 4889d0 mov rax, rdx +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 39: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_rotl/16_const.wat b/winch/filetests/filetests/x64/i64_rotl/16_const.wat index f335ff226707..dc36bc56e023 100644 --- a/winch/filetests/filetests/x64/i64_rotl/16_const.wat +++ b/winch/filetests/filetests/x64/i64_rotl/16_const.wat @@ -7,12 +7,17 @@ (i64.rotl) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c001000000 mov rax, 1 -;; 13: 48c1c000 rol rax, 0 -;; 17: 4883c408 add rsp, 8 -;; 1b: 5d pop rbp -;; 1c: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8715000000 ja 0x2d +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; 48c1c000 rol rax, 0 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_rotl/8_const.wat b/winch/filetests/filetests/x64/i64_rotl/8_const.wat index 1fac4db9940f..2295159efb7d 100644 --- a/winch/filetests/filetests/x64/i64_rotl/8_const.wat +++ b/winch/filetests/filetests/x64/i64_rotl/8_const.wat @@ -7,12 +7,17 @@ (i64.rotl) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c001000000 mov rax, 1 -;; 13: 48c1c002 rol rax, 2 -;; 17: 4883c408 add rsp, 8 -;; 1b: 5d pop rbp -;; 1c: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8715000000 ja 0x2d +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; 48c1c002 rol rax, 2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_rotl/locals.wat b/winch/filetests/filetests/x64/i64_rotl/locals.wat index 124a0565b941..2a0d58759d15 100644 --- a/winch/filetests/filetests/x64/i64_rotl/locals.wat +++ b/winch/filetests/filetests/x64/i64_rotl/locals.wat @@ -16,20 +16,25 @@ (i64.rotl) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 4531db xor r11d, r11d -;; b: 4c895c2410 mov qword ptr [rsp + 0x10], r11 -;; 10: 4c895c2408 mov qword ptr [rsp + 8], r11 -;; 15: 4c893424 mov qword ptr [rsp], r14 -;; 19: 48c7c001000000 mov rax, 1 -;; 20: 4889442410 mov qword ptr [rsp + 0x10], rax -;; 25: 48c7c002000000 mov rax, 2 -;; 2c: 4889442408 mov qword ptr [rsp + 8], rax -;; 31: 488b4c2408 mov rcx, qword ptr [rsp + 8] -;; 36: 488b442410 mov rax, qword ptr [rsp + 0x10] -;; 3b: 48d3c0 rol rax, cl -;; 3e: 4883c418 add rsp, 0x18 -;; 42: 5d pop rbp -;; 43: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f873c000000 ja 0x54 +;; 18: 4531db xor r11d, r11d +;; 4c895c2410 mov qword ptr [rsp + 0x10], r11 +;; 4c895c2408 mov qword ptr [rsp + 8], r11 +;; 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; 4889442410 mov qword ptr [rsp + 0x10], rax +;; 48c7c002000000 mov rax, 2 +;; 4889442408 mov qword ptr [rsp + 8], rax +;; 488b4c2408 mov rcx, qword ptr [rsp + 8] +;; 488b442410 mov rax, qword ptr [rsp + 0x10] +;; 48d3c0 rol rax, cl +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 54: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_rotl/params.wat b/winch/filetests/filetests/x64/i64_rotl/params.wat index 978a14d7051d..c9a0d6860a5c 100644 --- a/winch/filetests/filetests/x64/i64_rotl/params.wat +++ b/winch/filetests/filetests/x64/i64_rotl/params.wat @@ -7,15 +7,20 @@ (i64.rotl) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 48897c2410 mov qword ptr [rsp + 0x10], rdi -;; d: 4889742408 mov qword ptr [rsp + 8], rsi -;; 12: 4c893424 mov qword ptr [rsp], r14 -;; 16: 488b4c2408 mov rcx, qword ptr [rsp + 8] -;; 1b: 488b442410 mov rax, qword ptr [rsp + 0x10] -;; 20: 48d3c0 rol rax, cl -;; 23: 4883c418 add rsp, 0x18 -;; 27: 5d pop rbp -;; 28: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8721000000 ja 0x39 +;; 18: 48897c2410 mov qword ptr [rsp + 0x10], rdi +;; 4889742408 mov qword ptr [rsp + 8], rsi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b4c2408 mov rcx, qword ptr [rsp + 8] +;; 488b442410 mov rax, qword ptr [rsp + 0x10] +;; 48d3c0 rol rax, cl +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 39: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_rotr/16_const.wat b/winch/filetests/filetests/x64/i64_rotr/16_const.wat index b685eaba7c89..c41b35e39610 100644 --- a/winch/filetests/filetests/x64/i64_rotr/16_const.wat +++ b/winch/filetests/filetests/x64/i64_rotr/16_const.wat @@ -7,12 +7,17 @@ (i64.rotr) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c001000000 mov rax, 1 -;; 13: 48c1c800 ror rax, 0 -;; 17: 4883c408 add rsp, 8 -;; 1b: 5d pop rbp -;; 1c: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8715000000 ja 0x2d +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; 48c1c800 ror rax, 0 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_rotr/8_const.wat b/winch/filetests/filetests/x64/i64_rotr/8_const.wat index 75132e828f6b..e2be37b21ea2 100644 --- a/winch/filetests/filetests/x64/i64_rotr/8_const.wat +++ b/winch/filetests/filetests/x64/i64_rotr/8_const.wat @@ -7,12 +7,17 @@ (i64.rotr) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c001000000 mov rax, 1 -;; 13: 48c1c802 ror rax, 2 -;; 17: 4883c408 add rsp, 8 -;; 1b: 5d pop rbp -;; 1c: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8715000000 ja 0x2d +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; 48c1c802 ror rax, 2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_rotr/locals.wat b/winch/filetests/filetests/x64/i64_rotr/locals.wat index cac36da8d4a7..e2d4c310bc2b 100644 --- a/winch/filetests/filetests/x64/i64_rotr/locals.wat +++ b/winch/filetests/filetests/x64/i64_rotr/locals.wat @@ -16,20 +16,25 @@ (i64.rotr) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 4531db xor r11d, r11d -;; b: 4c895c2410 mov qword ptr [rsp + 0x10], r11 -;; 10: 4c895c2408 mov qword ptr [rsp + 8], r11 -;; 15: 4c893424 mov qword ptr [rsp], r14 -;; 19: 48c7c001000000 mov rax, 1 -;; 20: 4889442410 mov qword ptr [rsp + 0x10], rax -;; 25: 48c7c002000000 mov rax, 2 -;; 2c: 4889442408 mov qword ptr [rsp + 8], rax -;; 31: 488b4c2408 mov rcx, qword ptr [rsp + 8] -;; 36: 488b442410 mov rax, qword ptr [rsp + 0x10] -;; 3b: 48d3c8 ror rax, cl -;; 3e: 4883c418 add rsp, 0x18 -;; 42: 5d pop rbp -;; 43: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f873c000000 ja 0x54 +;; 18: 4531db xor r11d, r11d +;; 4c895c2410 mov qword ptr [rsp + 0x10], r11 +;; 4c895c2408 mov qword ptr [rsp + 8], r11 +;; 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; 4889442410 mov qword ptr [rsp + 0x10], rax +;; 48c7c002000000 mov rax, 2 +;; 4889442408 mov qword ptr [rsp + 8], rax +;; 488b4c2408 mov rcx, qword ptr [rsp + 8] +;; 488b442410 mov rax, qword ptr [rsp + 0x10] +;; 48d3c8 ror rax, cl +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 54: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_rotr/params.wat b/winch/filetests/filetests/x64/i64_rotr/params.wat index 0154d42ee7a8..9d35dd5ee38d 100644 --- a/winch/filetests/filetests/x64/i64_rotr/params.wat +++ b/winch/filetests/filetests/x64/i64_rotr/params.wat @@ -7,15 +7,20 @@ (i64.rotr) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 48897c2410 mov qword ptr [rsp + 0x10], rdi -;; d: 4889742408 mov qword ptr [rsp + 8], rsi -;; 12: 4c893424 mov qword ptr [rsp], r14 -;; 16: 488b4c2408 mov rcx, qword ptr [rsp + 8] -;; 1b: 488b442410 mov rax, qword ptr [rsp + 0x10] -;; 20: 48d3c8 ror rax, cl -;; 23: 4883c418 add rsp, 0x18 -;; 27: 5d pop rbp -;; 28: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8721000000 ja 0x39 +;; 18: 48897c2410 mov qword ptr [rsp + 0x10], rdi +;; 4889742408 mov qword ptr [rsp + 8], rsi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b4c2408 mov rcx, qword ptr [rsp + 8] +;; 488b442410 mov rax, qword ptr [rsp + 0x10] +;; 48d3c8 ror rax, cl +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 39: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_shl/16_const.wat b/winch/filetests/filetests/x64/i64_shl/16_const.wat index bc06f3f1ca05..d418f2da234b 100644 --- a/winch/filetests/filetests/x64/i64_shl/16_const.wat +++ b/winch/filetests/filetests/x64/i64_shl/16_const.wat @@ -7,12 +7,17 @@ (i64.shl) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c001000000 mov rax, 1 -;; 13: 48c1e000 shl rax, 0 -;; 17: 4883c408 add rsp, 8 -;; 1b: 5d pop rbp -;; 1c: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8715000000 ja 0x2d +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; 48c1e000 shl rax, 0 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_shl/8_const.wat b/winch/filetests/filetests/x64/i64_shl/8_const.wat index fa1ab6aefa68..d075096f9346 100644 --- a/winch/filetests/filetests/x64/i64_shl/8_const.wat +++ b/winch/filetests/filetests/x64/i64_shl/8_const.wat @@ -7,12 +7,17 @@ (i64.shl) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c001000000 mov rax, 1 -;; 13: 48c1e002 shl rax, 2 -;; 17: 4883c408 add rsp, 8 -;; 1b: 5d pop rbp -;; 1c: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8715000000 ja 0x2d +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; 48c1e002 shl rax, 2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_shl/locals.wat b/winch/filetests/filetests/x64/i64_shl/locals.wat index 1f531bee1a1f..3da44c6980fd 100644 --- a/winch/filetests/filetests/x64/i64_shl/locals.wat +++ b/winch/filetests/filetests/x64/i64_shl/locals.wat @@ -16,20 +16,25 @@ (i64.shl) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 4531db xor r11d, r11d -;; b: 4c895c2410 mov qword ptr [rsp + 0x10], r11 -;; 10: 4c895c2408 mov qword ptr [rsp + 8], r11 -;; 15: 4c893424 mov qword ptr [rsp], r14 -;; 19: 48c7c001000000 mov rax, 1 -;; 20: 4889442410 mov qword ptr [rsp + 0x10], rax -;; 25: 48c7c002000000 mov rax, 2 -;; 2c: 4889442408 mov qword ptr [rsp + 8], rax -;; 31: 488b4c2408 mov rcx, qword ptr [rsp + 8] -;; 36: 488b442410 mov rax, qword ptr [rsp + 0x10] -;; 3b: 48d3e0 shl rax, cl -;; 3e: 4883c418 add rsp, 0x18 -;; 42: 5d pop rbp -;; 43: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f873c000000 ja 0x54 +;; 18: 4531db xor r11d, r11d +;; 4c895c2410 mov qword ptr [rsp + 0x10], r11 +;; 4c895c2408 mov qword ptr [rsp + 8], r11 +;; 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; 4889442410 mov qword ptr [rsp + 0x10], rax +;; 48c7c002000000 mov rax, 2 +;; 4889442408 mov qword ptr [rsp + 8], rax +;; 488b4c2408 mov rcx, qword ptr [rsp + 8] +;; 488b442410 mov rax, qword ptr [rsp + 0x10] +;; 48d3e0 shl rax, cl +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 54: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_shl/params.wat b/winch/filetests/filetests/x64/i64_shl/params.wat index e76c72140042..6f8f399ab22b 100644 --- a/winch/filetests/filetests/x64/i64_shl/params.wat +++ b/winch/filetests/filetests/x64/i64_shl/params.wat @@ -7,15 +7,20 @@ (i64.shl) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 48897c2410 mov qword ptr [rsp + 0x10], rdi -;; d: 4889742408 mov qword ptr [rsp + 8], rsi -;; 12: 4c893424 mov qword ptr [rsp], r14 -;; 16: 488b4c2408 mov rcx, qword ptr [rsp + 8] -;; 1b: 488b442410 mov rax, qword ptr [rsp + 0x10] -;; 20: 48d3e0 shl rax, cl -;; 23: 4883c418 add rsp, 0x18 -;; 27: 5d pop rbp -;; 28: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8721000000 ja 0x39 +;; 18: 48897c2410 mov qword ptr [rsp + 0x10], rdi +;; 4889742408 mov qword ptr [rsp + 8], rsi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b4c2408 mov rcx, qword ptr [rsp + 8] +;; 488b442410 mov rax, qword ptr [rsp + 0x10] +;; 48d3e0 shl rax, cl +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 39: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_shr_s/16_const.wat b/winch/filetests/filetests/x64/i64_shr_s/16_const.wat index 879fceef0435..22a35a847390 100644 --- a/winch/filetests/filetests/x64/i64_shr_s/16_const.wat +++ b/winch/filetests/filetests/x64/i64_shr_s/16_const.wat @@ -7,12 +7,17 @@ (i64.shr_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c001000000 mov rax, 1 -;; 13: 48c1f800 sar rax, 0 -;; 17: 4883c408 add rsp, 8 -;; 1b: 5d pop rbp -;; 1c: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8715000000 ja 0x2d +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; 48c1f800 sar rax, 0 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_shr_s/8_const.wat b/winch/filetests/filetests/x64/i64_shr_s/8_const.wat index a0db161b013f..f5ff635ecc5a 100644 --- a/winch/filetests/filetests/x64/i64_shr_s/8_const.wat +++ b/winch/filetests/filetests/x64/i64_shr_s/8_const.wat @@ -7,12 +7,17 @@ (i64.shr_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c001000000 mov rax, 1 -;; 13: 48c1f802 sar rax, 2 -;; 17: 4883c408 add rsp, 8 -;; 1b: 5d pop rbp -;; 1c: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8715000000 ja 0x2d +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; 48c1f802 sar rax, 2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_shr_s/locals.wat b/winch/filetests/filetests/x64/i64_shr_s/locals.wat index cb8575cc244b..871c786d509f 100644 --- a/winch/filetests/filetests/x64/i64_shr_s/locals.wat +++ b/winch/filetests/filetests/x64/i64_shr_s/locals.wat @@ -16,20 +16,25 @@ (i64.shr_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 4531db xor r11d, r11d -;; b: 4c895c2410 mov qword ptr [rsp + 0x10], r11 -;; 10: 4c895c2408 mov qword ptr [rsp + 8], r11 -;; 15: 4c893424 mov qword ptr [rsp], r14 -;; 19: 48c7c001000000 mov rax, 1 -;; 20: 4889442410 mov qword ptr [rsp + 0x10], rax -;; 25: 48c7c002000000 mov rax, 2 -;; 2c: 4889442408 mov qword ptr [rsp + 8], rax -;; 31: 488b4c2408 mov rcx, qword ptr [rsp + 8] -;; 36: 488b442410 mov rax, qword ptr [rsp + 0x10] -;; 3b: 48d3f8 sar rax, cl -;; 3e: 4883c418 add rsp, 0x18 -;; 42: 5d pop rbp -;; 43: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f873c000000 ja 0x54 +;; 18: 4531db xor r11d, r11d +;; 4c895c2410 mov qword ptr [rsp + 0x10], r11 +;; 4c895c2408 mov qword ptr [rsp + 8], r11 +;; 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; 4889442410 mov qword ptr [rsp + 0x10], rax +;; 48c7c002000000 mov rax, 2 +;; 4889442408 mov qword ptr [rsp + 8], rax +;; 488b4c2408 mov rcx, qword ptr [rsp + 8] +;; 488b442410 mov rax, qword ptr [rsp + 0x10] +;; 48d3f8 sar rax, cl +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 54: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_shr_s/params.wat b/winch/filetests/filetests/x64/i64_shr_s/params.wat index 8ea569c2815c..8b218373366a 100644 --- a/winch/filetests/filetests/x64/i64_shr_s/params.wat +++ b/winch/filetests/filetests/x64/i64_shr_s/params.wat @@ -7,15 +7,20 @@ (i64.shr_s) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 48897c2410 mov qword ptr [rsp + 0x10], rdi -;; d: 4889742408 mov qword ptr [rsp + 8], rsi -;; 12: 4c893424 mov qword ptr [rsp], r14 -;; 16: 488b4c2408 mov rcx, qword ptr [rsp + 8] -;; 1b: 488b442410 mov rax, qword ptr [rsp + 0x10] -;; 20: 48d3f8 sar rax, cl -;; 23: 4883c418 add rsp, 0x18 -;; 27: 5d pop rbp -;; 28: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8721000000 ja 0x39 +;; 18: 48897c2410 mov qword ptr [rsp + 0x10], rdi +;; 4889742408 mov qword ptr [rsp + 8], rsi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b4c2408 mov rcx, qword ptr [rsp + 8] +;; 488b442410 mov rax, qword ptr [rsp + 0x10] +;; 48d3f8 sar rax, cl +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 39: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_shr_u/16_const.wat b/winch/filetests/filetests/x64/i64_shr_u/16_const.wat index f82683de5ebd..dd79228542d1 100644 --- a/winch/filetests/filetests/x64/i64_shr_u/16_const.wat +++ b/winch/filetests/filetests/x64/i64_shr_u/16_const.wat @@ -7,12 +7,17 @@ (i64.shr_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c001000000 mov rax, 1 -;; 13: 48c1e800 shr rax, 0 -;; 17: 4883c408 add rsp, 8 -;; 1b: 5d pop rbp -;; 1c: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8715000000 ja 0x2d +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; 48c1e800 shr rax, 0 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_shr_u/8_const.wat b/winch/filetests/filetests/x64/i64_shr_u/8_const.wat index 4db9d78fc14f..9d44ed61fe82 100644 --- a/winch/filetests/filetests/x64/i64_shr_u/8_const.wat +++ b/winch/filetests/filetests/x64/i64_shr_u/8_const.wat @@ -7,12 +7,17 @@ (i64.shr_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c001000000 mov rax, 1 -;; 13: 48c1e802 shr rax, 2 -;; 17: 4883c408 add rsp, 8 -;; 1b: 5d pop rbp -;; 1c: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8715000000 ja 0x2d +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; 48c1e802 shr rax, 2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_shr_u/locals.wat b/winch/filetests/filetests/x64/i64_shr_u/locals.wat index 409286742956..2d3a466303d7 100644 --- a/winch/filetests/filetests/x64/i64_shr_u/locals.wat +++ b/winch/filetests/filetests/x64/i64_shr_u/locals.wat @@ -16,20 +16,25 @@ (i64.shr_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 4531db xor r11d, r11d -;; b: 4c895c2410 mov qword ptr [rsp + 0x10], r11 -;; 10: 4c895c2408 mov qword ptr [rsp + 8], r11 -;; 15: 4c893424 mov qword ptr [rsp], r14 -;; 19: 48c7c001000000 mov rax, 1 -;; 20: 4889442410 mov qword ptr [rsp + 0x10], rax -;; 25: 48c7c002000000 mov rax, 2 -;; 2c: 4889442408 mov qword ptr [rsp + 8], rax -;; 31: 488b4c2408 mov rcx, qword ptr [rsp + 8] -;; 36: 488b442410 mov rax, qword ptr [rsp + 0x10] -;; 3b: 48d3e8 shr rax, cl -;; 3e: 4883c418 add rsp, 0x18 -;; 42: 5d pop rbp -;; 43: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f873c000000 ja 0x54 +;; 18: 4531db xor r11d, r11d +;; 4c895c2410 mov qword ptr [rsp + 0x10], r11 +;; 4c895c2408 mov qword ptr [rsp + 8], r11 +;; 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; 4889442410 mov qword ptr [rsp + 0x10], rax +;; 48c7c002000000 mov rax, 2 +;; 4889442408 mov qword ptr [rsp + 8], rax +;; 488b4c2408 mov rcx, qword ptr [rsp + 8] +;; 488b442410 mov rax, qword ptr [rsp + 0x10] +;; 48d3e8 shr rax, cl +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 54: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_shr_u/params.wat b/winch/filetests/filetests/x64/i64_shr_u/params.wat index f4772e206600..4a4858898e28 100644 --- a/winch/filetests/filetests/x64/i64_shr_u/params.wat +++ b/winch/filetests/filetests/x64/i64_shr_u/params.wat @@ -7,15 +7,20 @@ (i64.shr_u) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 48897c2410 mov qword ptr [rsp + 0x10], rdi -;; d: 4889742408 mov qword ptr [rsp + 8], rsi -;; 12: 4c893424 mov qword ptr [rsp], r14 -;; 16: 488b4c2408 mov rcx, qword ptr [rsp + 8] -;; 1b: 488b442410 mov rax, qword ptr [rsp + 0x10] -;; 20: 48d3e8 shr rax, cl -;; 23: 4883c418 add rsp, 0x18 -;; 27: 5d pop rbp -;; 28: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8721000000 ja 0x39 +;; 18: 48897c2410 mov qword ptr [rsp + 0x10], rdi +;; 4889742408 mov qword ptr [rsp + 8], rsi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b4c2408 mov rcx, qword ptr [rsp + 8] +;; 488b442410 mov rax, qword ptr [rsp + 0x10] +;; 48d3e8 shr rax, cl +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 39: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_sub/const.wat b/winch/filetests/filetests/x64/i64_sub/const.wat index 36cc0afa57d3..3581ef1852ac 100644 --- a/winch/filetests/filetests/x64/i64_sub/const.wat +++ b/winch/filetests/filetests/x64/i64_sub/const.wat @@ -7,12 +7,17 @@ (i64.sub) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c00a000000 mov rax, 0xa -;; 13: 4883e814 sub rax, 0x14 -;; 17: 4883c408 add rsp, 8 -;; 1b: 5d pop rbp -;; 1c: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8715000000 ja 0x2d +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c00a000000 mov rax, 0xa +;; 4883e814 sub rax, 0x14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_sub/locals.wat b/winch/filetests/filetests/x64/i64_sub/locals.wat index bcccf49a97ea..132be5b93911 100644 --- a/winch/filetests/filetests/x64/i64_sub/locals.wat +++ b/winch/filetests/filetests/x64/i64_sub/locals.wat @@ -16,21 +16,26 @@ i64.sub ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 4531db xor r11d, r11d -;; b: 4c895c2410 mov qword ptr [rsp + 0x10], r11 -;; 10: 4c895c2408 mov qword ptr [rsp + 8], r11 -;; 15: 4c893424 mov qword ptr [rsp], r14 -;; 19: 48c7c00a000000 mov rax, 0xa -;; 20: 4889442410 mov qword ptr [rsp + 0x10], rax -;; 25: 48c7c014000000 mov rax, 0x14 -;; 2c: 4889442408 mov qword ptr [rsp + 8], rax -;; 31: 488b442408 mov rax, qword ptr [rsp + 8] -;; 36: 488b4c2410 mov rcx, qword ptr [rsp + 0x10] -;; 3b: 4829c1 sub rcx, rax -;; 3e: 4889c8 mov rax, rcx -;; 41: 4883c418 add rsp, 0x18 -;; 45: 5d pop rbp -;; 46: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f873f000000 ja 0x57 +;; 18: 4531db xor r11d, r11d +;; 4c895c2410 mov qword ptr [rsp + 0x10], r11 +;; 4c895c2408 mov qword ptr [rsp + 8], r11 +;; 4c893424 mov qword ptr [rsp], r14 +;; 48c7c00a000000 mov rax, 0xa +;; 4889442410 mov qword ptr [rsp + 0x10], rax +;; 48c7c014000000 mov rax, 0x14 +;; 4889442408 mov qword ptr [rsp + 8], rax +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 488b4c2410 mov rcx, qword ptr [rsp + 0x10] +;; 4829c1 sub rcx, rax +;; 4889c8 mov rax, rcx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 57: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_sub/max.wat b/winch/filetests/filetests/x64/i64_sub/max.wat index 513f778dd6ff..0d9df245cd3f 100644 --- a/winch/filetests/filetests/x64/i64_sub/max.wat +++ b/winch/filetests/filetests/x64/i64_sub/max.wat @@ -6,13 +6,18 @@ (i64.sub) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48b8ffffffffffffff7f +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8718000000 ja 0x30 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48b8ffffffffffffff7f ;; movabs rax, 0x7fffffffffffffff -;; 16: 4883e8ff sub rax, -1 -;; 1a: 4883c408 add rsp, 8 -;; 1e: 5d pop rbp -;; 1f: c3 ret +;; 4883e8ff sub rax, -1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 30: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_sub/max_one.wat b/winch/filetests/filetests/x64/i64_sub/max_one.wat index 0c016679fcf9..e8a532a90b2c 100644 --- a/winch/filetests/filetests/x64/i64_sub/max_one.wat +++ b/winch/filetests/filetests/x64/i64_sub/max_one.wat @@ -7,13 +7,18 @@ (i64.sub) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48b80000000000000080 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8718000000 ja 0x30 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48b80000000000000080 ;; movabs rax, 0x8000000000000000 -;; 16: 4883e801 sub rax, 1 -;; 1a: 4883c408 add rsp, 8 -;; 1e: 5d pop rbp -;; 1f: c3 ret +;; 4883e801 sub rax, 1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 30: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_sub/mixed.wat b/winch/filetests/filetests/x64/i64_sub/mixed.wat index f72526a219dc..ee64499ba578 100644 --- a/winch/filetests/filetests/x64/i64_sub/mixed.wat +++ b/winch/filetests/filetests/x64/i64_sub/mixed.wat @@ -7,12 +7,17 @@ (i64.sub) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c0ffffffff mov rax, 0xffffffffffffffff -;; 13: 4883e801 sub rax, 1 -;; 17: 4883c408 add rsp, 8 -;; 1b: 5d pop rbp -;; 1c: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8715000000 ja 0x2d +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c0ffffffff mov rax, 0xffffffffffffffff +;; 4883e801 sub rax, 1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_sub/params.wat b/winch/filetests/filetests/x64/i64_sub/params.wat index 0ca133666a39..0c6fe2994bd6 100644 --- a/winch/filetests/filetests/x64/i64_sub/params.wat +++ b/winch/filetests/filetests/x64/i64_sub/params.wat @@ -7,16 +7,21 @@ (i64.sub) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 48897c2410 mov qword ptr [rsp + 0x10], rdi -;; d: 4889742408 mov qword ptr [rsp + 8], rsi -;; 12: 4c893424 mov qword ptr [rsp], r14 -;; 16: 488b442408 mov rax, qword ptr [rsp + 8] -;; 1b: 488b4c2410 mov rcx, qword ptr [rsp + 0x10] -;; 20: 4829c1 sub rcx, rax -;; 23: 4889c8 mov rax, rcx -;; 26: 4883c418 add rsp, 0x18 -;; 2a: 5d pop rbp -;; 2b: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8724000000 ja 0x3c +;; 18: 48897c2410 mov qword ptr [rsp + 0x10], rdi +;; 4889742408 mov qword ptr [rsp + 8], rsi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 488b4c2410 mov rcx, qword ptr [rsp + 0x10] +;; 4829c1 sub rcx, rax +;; 4889c8 mov rax, rcx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 3c: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_sub/signed.wat b/winch/filetests/filetests/x64/i64_sub/signed.wat index 7ce14cfdf804..59c7e3d5232d 100644 --- a/winch/filetests/filetests/x64/i64_sub/signed.wat +++ b/winch/filetests/filetests/x64/i64_sub/signed.wat @@ -7,12 +7,17 @@ (i64.sub) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c0ffffffff mov rax, 0xffffffffffffffff -;; 13: 4883e8ff sub rax, -1 -;; 17: 4883c408 add rsp, 8 -;; 1b: 5d pop rbp -;; 1c: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8715000000 ja 0x2d +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c0ffffffff mov rax, 0xffffffffffffffff +;; 4883e8ff sub rax, -1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_sub/unsigned_with_zero.wat b/winch/filetests/filetests/x64/i64_sub/unsigned_with_zero.wat index fb738db05dce..62230abca815 100644 --- a/winch/filetests/filetests/x64/i64_sub/unsigned_with_zero.wat +++ b/winch/filetests/filetests/x64/i64_sub/unsigned_with_zero.wat @@ -7,12 +7,17 @@ (i64.sub) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c001000000 mov rax, 1 -;; 13: 4883e800 sub rax, 0 -;; 17: 4883c408 add rsp, 8 -;; 1b: 5d pop rbp -;; 1c: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8715000000 ja 0x2d +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; 4883e800 sub rax, 0 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_trunc_f32_s/const.wat b/winch/filetests/filetests/x64/i64_trunc_f32_s/const.wat new file mode 100644 index 000000000000..2957b086d99c --- /dev/null +++ b/winch/filetests/filetests/x64/i64_trunc_f32_s/const.wat @@ -0,0 +1,38 @@ +;;! target = "x86_64" + +(module + (func (result i64) + (f32.const 1.0) + (i64.trunc_f32_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f874e000000 ja 0x66 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f30f10054c000000 movss xmm0, dword ptr [rip + 0x4c] +;; f3480f2cc0 cvttss2si rax, xmm0 +;; 4883f801 cmp rax, 1 +;; 0f812d000000 jno 0x60 +;; 33: 0f2ec0 ucomiss xmm0, xmm0 +;; 0f8a2c000000 jp 0x68 +;; 3c: 41bb000000df mov r11d, 0xdf000000 +;; 66450f6efb movd xmm15, r11d +;; 410f2ec7 ucomiss xmm0, xmm15 +;; 0f8219000000 jb 0x6a +;; 51: 66450f57ff xorpd xmm15, xmm15 +;; 440f2ef8 ucomiss xmm15, xmm0 +;; 0f820c000000 jb 0x6c +;; 60: 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 66: 0f0b ud2 +;; 68: 0f0b ud2 +;; 6a: 0f0b ud2 +;; 6c: 0f0b ud2 +;; 6e: 0000 add byte ptr [rax], al +;; 70: 0000 add byte ptr [rax], al diff --git a/winch/filetests/filetests/x64/i64_trunc_f32_s/locals.wat b/winch/filetests/filetests/x64/i64_trunc_f32_s/locals.wat new file mode 100644 index 000000000000..525324fedfde --- /dev/null +++ b/winch/filetests/filetests/x64/i64_trunc_f32_s/locals.wat @@ -0,0 +1,40 @@ +;;! target = "x86_64" + +(module + (func (result i64) + (local f32) + + (local.get 0) + (i64.trunc_f32_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8755000000 ja 0x6d +;; 18: 48c744240800000000 +;; mov qword ptr [rsp + 8], 0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f1044240c movss xmm0, dword ptr [rsp + 0xc] +;; f3480f2cc0 cvttss2si rax, xmm0 +;; 4883f801 cmp rax, 1 +;; 0f812d000000 jno 0x67 +;; 3a: 0f2ec0 ucomiss xmm0, xmm0 +;; 0f8a2c000000 jp 0x6f +;; 43: 41bb000000df mov r11d, 0xdf000000 +;; 66450f6efb movd xmm15, r11d +;; 410f2ec7 ucomiss xmm0, xmm15 +;; 0f8219000000 jb 0x71 +;; 58: 66450f57ff xorpd xmm15, xmm15 +;; 440f2ef8 ucomiss xmm15, xmm0 +;; 0f820c000000 jb 0x73 +;; 67: 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 6d: 0f0b ud2 +;; 6f: 0f0b ud2 +;; 71: 0f0b ud2 +;; 73: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_trunc_f32_s/params.wat b/winch/filetests/filetests/x64/i64_trunc_f32_s/params.wat new file mode 100644 index 000000000000..b13a11c578ba --- /dev/null +++ b/winch/filetests/filetests/x64/i64_trunc_f32_s/params.wat @@ -0,0 +1,37 @@ +;;! target = "x86_64" + +(module + (func (param f32) (result i64) + (local.get 0) + (i64.trunc_f32_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8752000000 ja 0x6a +;; 18: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f1044240c movss xmm0, dword ptr [rsp + 0xc] +;; f3480f2cc0 cvttss2si rax, xmm0 +;; 4883f801 cmp rax, 1 +;; 0f812d000000 jno 0x64 +;; 37: 0f2ec0 ucomiss xmm0, xmm0 +;; 0f8a2c000000 jp 0x6c +;; 40: 41bb000000df mov r11d, 0xdf000000 +;; 66450f6efb movd xmm15, r11d +;; 410f2ec7 ucomiss xmm0, xmm15 +;; 0f8219000000 jb 0x6e +;; 55: 66450f57ff xorpd xmm15, xmm15 +;; 440f2ef8 ucomiss xmm15, xmm0 +;; 0f820c000000 jb 0x70 +;; 64: 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 6a: 0f0b ud2 +;; 6c: 0f0b ud2 +;; 6e: 0f0b ud2 +;; 70: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_trunc_f32_u/const.wat b/winch/filetests/filetests/x64/i64_trunc_f32_u/const.wat new file mode 100644 index 000000000000..7a6613ce96f9 --- /dev/null +++ b/winch/filetests/filetests/x64/i64_trunc_f32_u/const.wat @@ -0,0 +1,41 @@ +;;! target = "x86_64" + +(module + (func (result i64) + (f32.const 1.0) + (i64.trunc_f32_u) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8762000000 ja 0x7a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f30f100d5c000000 movss xmm1, dword ptr [rip + 0x5c] +;; 41bb0000005f mov r11d, 0x5f000000 +;; 66450f6efb movd xmm15, r11d +;; 410f2ecf ucomiss xmm1, xmm15 +;; 0f8317000000 jae 0x50 +;; 0f8a3d000000 jp 0x7c +;; 3f: f3480f2cc1 cvttss2si rax, xmm1 +;; 4883f800 cmp rax, 0 +;; 0f8d26000000 jge 0x74 +;; 4e: 0f0b ud2 +;; 0f28c1 movaps xmm0, xmm1 +;; f3410f5cc7 subss xmm0, xmm15 +;; f3480f2cc0 cvttss2si rax, xmm0 +;; 4883f800 cmp rax, 0 +;; 0f8c17000000 jl 0x7e +;; 67: 49bb0000000000000080 +;; movabs r11, 0x8000000000000000 +;; 4c01d8 add rax, r11 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 7a: 0f0b ud2 +;; 7c: 0f0b ud2 +;; 7e: 0f0b ud2 +;; 80: 0000 add byte ptr [rax], al diff --git a/winch/filetests/filetests/x64/i64_trunc_f32_u/locals.wat b/winch/filetests/filetests/x64/i64_trunc_f32_u/locals.wat new file mode 100644 index 000000000000..cd5449c8072b --- /dev/null +++ b/winch/filetests/filetests/x64/i64_trunc_f32_u/locals.wat @@ -0,0 +1,44 @@ +;;! target = "x86_64" + +(module + (func (result i64) + (local f32) + + (local.get 0) + (i64.trunc_f32_u) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8769000000 ja 0x81 +;; 18: 48c744240800000000 +;; mov qword ptr [rsp + 8], 0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f104c240c movss xmm1, dword ptr [rsp + 0xc] +;; 41bb0000005f mov r11d, 0x5f000000 +;; 66450f6efb movd xmm15, r11d +;; 410f2ecf ucomiss xmm1, xmm15 +;; 0f8317000000 jae 0x57 +;; 0f8a3d000000 jp 0x83 +;; 46: f3480f2cc1 cvttss2si rax, xmm1 +;; 4883f800 cmp rax, 0 +;; 0f8d26000000 jge 0x7b +;; 55: 0f0b ud2 +;; 0f28c1 movaps xmm0, xmm1 +;; f3410f5cc7 subss xmm0, xmm15 +;; f3480f2cc0 cvttss2si rax, xmm0 +;; 4883f800 cmp rax, 0 +;; 0f8c17000000 jl 0x85 +;; 6e: 49bb0000000000000080 +;; movabs r11, 0x8000000000000000 +;; 4c01d8 add rax, r11 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 81: 0f0b ud2 +;; 83: 0f0b ud2 +;; 85: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_trunc_f32_u/params.wat b/winch/filetests/filetests/x64/i64_trunc_f32_u/params.wat new file mode 100644 index 000000000000..2a0c1f07cb26 --- /dev/null +++ b/winch/filetests/filetests/x64/i64_trunc_f32_u/params.wat @@ -0,0 +1,41 @@ +;;! target = "x86_64" + +(module + (func (param f32) (result i64) + (local.get 0) + (i64.trunc_f32_u) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8766000000 ja 0x7e +;; 18: f30f1144240c movss dword ptr [rsp + 0xc], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f30f104c240c movss xmm1, dword ptr [rsp + 0xc] +;; 41bb0000005f mov r11d, 0x5f000000 +;; 66450f6efb movd xmm15, r11d +;; 410f2ecf ucomiss xmm1, xmm15 +;; 0f8317000000 jae 0x54 +;; 0f8a3d000000 jp 0x80 +;; 43: f3480f2cc1 cvttss2si rax, xmm1 +;; 4883f800 cmp rax, 0 +;; 0f8d26000000 jge 0x78 +;; 52: 0f0b ud2 +;; 0f28c1 movaps xmm0, xmm1 +;; f3410f5cc7 subss xmm0, xmm15 +;; f3480f2cc0 cvttss2si rax, xmm0 +;; 4883f800 cmp rax, 0 +;; 0f8c17000000 jl 0x82 +;; 6b: 49bb0000000000000080 +;; movabs r11, 0x8000000000000000 +;; 4c01d8 add rax, r11 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 7e: 0f0b ud2 +;; 80: 0f0b ud2 +;; 82: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_trunc_f64_s/const.wat b/winch/filetests/filetests/x64/i64_trunc_f64_s/const.wat new file mode 100644 index 000000000000..75e47574788b --- /dev/null +++ b/winch/filetests/filetests/x64/i64_trunc_f64_s/const.wat @@ -0,0 +1,42 @@ +;;! target = "x86_64" + +(module + (func (result i64) + (f64.const 1.0) + (i64.trunc_f64_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8755000000 ja 0x6d +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f20f100554000000 movsd xmm0, qword ptr [rip + 0x54] +;; f2480f2cc0 cvttsd2si rax, xmm0 +;; 4883f801 cmp rax, 1 +;; 0f8134000000 jno 0x67 +;; 33: 660f2ec0 ucomisd xmm0, xmm0 +;; 0f8a32000000 jp 0x6f +;; 3d: 49bb000000000000e0c3 +;; movabs r11, 0xc3e0000000000000 +;; 664d0f6efb movq xmm15, r11 +;; 66410f2ec7 ucomisd xmm0, xmm15 +;; 0f821a000000 jb 0x71 +;; 57: 66450f57ff xorpd xmm15, xmm15 +;; 66440f2ef8 ucomisd xmm15, xmm0 +;; 0f820c000000 jb 0x73 +;; 67: 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 6d: 0f0b ud2 +;; 6f: 0f0b ud2 +;; 71: 0f0b ud2 +;; 73: 0f0b ud2 +;; 75: 0000 add byte ptr [rax], al +;; 77: 0000 add byte ptr [rax], al +;; 79: 0000 add byte ptr [rax], al +;; 7b: 0000 add byte ptr [rax], al +;; 7d: 00f0 add al, dh diff --git a/winch/filetests/filetests/x64/i64_trunc_f64_s/locals.wat b/winch/filetests/filetests/x64/i64_trunc_f64_s/locals.wat new file mode 100644 index 000000000000..112eb279f338 --- /dev/null +++ b/winch/filetests/filetests/x64/i64_trunc_f64_s/locals.wat @@ -0,0 +1,41 @@ +;;! target = "x86_64" + +(module + (func (result i64) + (local f64) + + (local.get 0) + (i64.trunc_f64_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f875c000000 ja 0x74 +;; 18: 48c744240800000000 +;; mov qword ptr [rsp + 8], 0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; f2480f2cc0 cvttsd2si rax, xmm0 +;; 4883f801 cmp rax, 1 +;; 0f8134000000 jno 0x6e +;; 3a: 660f2ec0 ucomisd xmm0, xmm0 +;; 0f8a32000000 jp 0x76 +;; 44: 49bb000000000000e0c3 +;; movabs r11, 0xc3e0000000000000 +;; 664d0f6efb movq xmm15, r11 +;; 66410f2ec7 ucomisd xmm0, xmm15 +;; 0f821a000000 jb 0x78 +;; 5e: 66450f57ff xorpd xmm15, xmm15 +;; 66440f2ef8 ucomisd xmm15, xmm0 +;; 0f820c000000 jb 0x7a +;; 6e: 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 74: 0f0b ud2 +;; 76: 0f0b ud2 +;; 78: 0f0b ud2 +;; 7a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_trunc_f64_s/params.wat b/winch/filetests/filetests/x64/i64_trunc_f64_s/params.wat new file mode 100644 index 000000000000..27a3fe73f172 --- /dev/null +++ b/winch/filetests/filetests/x64/i64_trunc_f64_s/params.wat @@ -0,0 +1,38 @@ +;;! target = "x86_64" + +(module + (func (param f64) (result i64) + (local.get 0) + (i64.trunc_f64_s) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8759000000 ja 0x71 +;; 18: f20f11442408 movsd qword ptr [rsp + 8], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f10442408 movsd xmm0, qword ptr [rsp + 8] +;; f2480f2cc0 cvttsd2si rax, xmm0 +;; 4883f801 cmp rax, 1 +;; 0f8134000000 jno 0x6b +;; 37: 660f2ec0 ucomisd xmm0, xmm0 +;; 0f8a32000000 jp 0x73 +;; 41: 49bb000000000000e0c3 +;; movabs r11, 0xc3e0000000000000 +;; 664d0f6efb movq xmm15, r11 +;; 66410f2ec7 ucomisd xmm0, xmm15 +;; 0f821a000000 jb 0x75 +;; 5b: 66450f57ff xorpd xmm15, xmm15 +;; 66440f2ef8 ucomisd xmm15, xmm0 +;; 0f820c000000 jb 0x77 +;; 6b: 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 71: 0f0b ud2 +;; 73: 0f0b ud2 +;; 75: 0f0b ud2 +;; 77: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_trunc_f64_u/const.wat b/winch/filetests/filetests/x64/i64_trunc_f64_u/const.wat new file mode 100644 index 000000000000..73d6a64e651c --- /dev/null +++ b/winch/filetests/filetests/x64/i64_trunc_f64_u/const.wat @@ -0,0 +1,46 @@ +;;! target = "x86_64" + +(module + (func (result i64) + (f64.const 1.0) + (i64.trunc_f64_u) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8767000000 ja 0x7f +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f20f100d64000000 movsd xmm1, qword ptr [rip + 0x64] +;; 49bb000000000000e043 +;; movabs r11, 0x43e0000000000000 +;; 664d0f6efb movq xmm15, r11 +;; 66410f2ecf ucomisd xmm1, xmm15 +;; 0f8317000000 jae 0x55 +;; 0f8a3d000000 jp 0x81 +;; 44: f2480f2cc1 cvttsd2si rax, xmm1 +;; 4883f800 cmp rax, 0 +;; 0f8d26000000 jge 0x79 +;; 53: 0f0b ud2 +;; 0f28c1 movaps xmm0, xmm1 +;; f2410f5cc7 subsd xmm0, xmm15 +;; f2480f2cc0 cvttsd2si rax, xmm0 +;; 4883f800 cmp rax, 0 +;; 0f8c17000000 jl 0x83 +;; 6c: 49bb0000000000000080 +;; movabs r11, 0x8000000000000000 +;; 4c01d8 add rax, r11 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 7f: 0f0b ud2 +;; 81: 0f0b ud2 +;; 83: 0f0b ud2 +;; 85: 0000 add byte ptr [rax], al +;; 87: 0000 add byte ptr [rax], al +;; 89: 0000 add byte ptr [rax], al +;; 8b: 0000 add byte ptr [rax], al +;; 8d: 00f0 add al, dh diff --git a/winch/filetests/filetests/x64/i64_trunc_f64_u/locals.wat b/winch/filetests/filetests/x64/i64_trunc_f64_u/locals.wat new file mode 100644 index 000000000000..08ce0dfe5c71 --- /dev/null +++ b/winch/filetests/filetests/x64/i64_trunc_f64_u/locals.wat @@ -0,0 +1,45 @@ +;;! target = "x86_64" + +(module + (func (result i64) + (local f64) + + (local.get 0) + (i64.trunc_f64_u) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f876e000000 ja 0x86 +;; 18: 48c744240800000000 +;; mov qword ptr [rsp + 8], 0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f104c2408 movsd xmm1, qword ptr [rsp + 8] +;; 49bb000000000000e043 +;; movabs r11, 0x43e0000000000000 +;; 664d0f6efb movq xmm15, r11 +;; 66410f2ecf ucomisd xmm1, xmm15 +;; 0f8317000000 jae 0x5c +;; 0f8a3d000000 jp 0x88 +;; 4b: f2480f2cc1 cvttsd2si rax, xmm1 +;; 4883f800 cmp rax, 0 +;; 0f8d26000000 jge 0x80 +;; 5a: 0f0b ud2 +;; 0f28c1 movaps xmm0, xmm1 +;; f2410f5cc7 subsd xmm0, xmm15 +;; f2480f2cc0 cvttsd2si rax, xmm0 +;; 4883f800 cmp rax, 0 +;; 0f8c17000000 jl 0x8a +;; 73: 49bb0000000000000080 +;; movabs r11, 0x8000000000000000 +;; 4c01d8 add rax, r11 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 86: 0f0b ud2 +;; 88: 0f0b ud2 +;; 8a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_trunc_f64_u/params.wat b/winch/filetests/filetests/x64/i64_trunc_f64_u/params.wat new file mode 100644 index 000000000000..86469ac20d45 --- /dev/null +++ b/winch/filetests/filetests/x64/i64_trunc_f64_u/params.wat @@ -0,0 +1,42 @@ +;;! target = "x86_64" + +(module + (func (param f64) (result i64) + (local.get 0) + (i64.trunc_f64_u) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f876b000000 ja 0x83 +;; 18: f20f11442408 movsd qword ptr [rsp + 8], xmm0 +;; 4c893424 mov qword ptr [rsp], r14 +;; f20f104c2408 movsd xmm1, qword ptr [rsp + 8] +;; 49bb000000000000e043 +;; movabs r11, 0x43e0000000000000 +;; 664d0f6efb movq xmm15, r11 +;; 66410f2ecf ucomisd xmm1, xmm15 +;; 0f8317000000 jae 0x59 +;; 0f8a3d000000 jp 0x85 +;; 48: f2480f2cc1 cvttsd2si rax, xmm1 +;; 4883f800 cmp rax, 0 +;; 0f8d26000000 jge 0x7d +;; 57: 0f0b ud2 +;; 0f28c1 movaps xmm0, xmm1 +;; f2410f5cc7 subsd xmm0, xmm15 +;; f2480f2cc0 cvttsd2si rax, xmm0 +;; 4883f800 cmp rax, 0 +;; 0f8c17000000 jl 0x87 +;; 70: 49bb0000000000000080 +;; movabs r11, 0x8000000000000000 +;; 4c01d8 add rax, r11 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 83: 0f0b ud2 +;; 85: 0f0b ud2 +;; 87: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_xor/32_const.wat b/winch/filetests/filetests/x64/i64_xor/32_const.wat index 1f964074b0db..2261e6f27316 100644 --- a/winch/filetests/filetests/x64/i64_xor/32_const.wat +++ b/winch/filetests/filetests/x64/i64_xor/32_const.wat @@ -7,12 +7,17 @@ (i64.xor) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c002000000 mov rax, 2 -;; 13: 4883f003 xor rax, 3 -;; 17: 4883c408 add rsp, 8 -;; 1b: 5d pop rbp -;; 1c: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8715000000 ja 0x2d +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c002000000 mov rax, 2 +;; 4883f003 xor rax, 3 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_xor/64_const.wat b/winch/filetests/filetests/x64/i64_xor/64_const.wat index 34b0b14230ca..30e37a018ef8 100644 --- a/winch/filetests/filetests/x64/i64_xor/64_const.wat +++ b/winch/filetests/filetests/x64/i64_xor/64_const.wat @@ -7,15 +7,20 @@ (i64.xor) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48b8feffffffffffff7f +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8721000000 ja 0x39 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48b8feffffffffffff7f ;; movabs rax, 0x7ffffffffffffffe -;; 16: 49bbffffffffffffff7f +;; 49bbffffffffffffff7f ;; movabs r11, 0x7fffffffffffffff -;; 20: 4c31d8 xor rax, r11 -;; 23: 4883c408 add rsp, 8 -;; 27: 5d pop rbp -;; 28: c3 ret +;; 4c31d8 xor rax, r11 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 39: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_xor/locals.wat b/winch/filetests/filetests/x64/i64_xor/locals.wat index bb8d8f050d3a..2d7eb52a4ba6 100644 --- a/winch/filetests/filetests/x64/i64_xor/locals.wat +++ b/winch/filetests/filetests/x64/i64_xor/locals.wat @@ -15,21 +15,26 @@ (i64.xor) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 4531db xor r11d, r11d -;; b: 4c895c2410 mov qword ptr [rsp + 0x10], r11 -;; 10: 4c895c2408 mov qword ptr [rsp + 8], r11 -;; 15: 4c893424 mov qword ptr [rsp], r14 -;; 19: 48c7c002000000 mov rax, 2 -;; 20: 4889442410 mov qword ptr [rsp + 0x10], rax -;; 25: 48c7c003000000 mov rax, 3 -;; 2c: 4889442408 mov qword ptr [rsp + 8], rax -;; 31: 488b442408 mov rax, qword ptr [rsp + 8] -;; 36: 488b4c2410 mov rcx, qword ptr [rsp + 0x10] -;; 3b: 4831c1 xor rcx, rax -;; 3e: 4889c8 mov rax, rcx -;; 41: 4883c418 add rsp, 0x18 -;; 45: 5d pop rbp -;; 46: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f873f000000 ja 0x57 +;; 18: 4531db xor r11d, r11d +;; 4c895c2410 mov qword ptr [rsp + 0x10], r11 +;; 4c895c2408 mov qword ptr [rsp + 8], r11 +;; 4c893424 mov qword ptr [rsp], r14 +;; 48c7c002000000 mov rax, 2 +;; 4889442410 mov qword ptr [rsp + 0x10], rax +;; 48c7c003000000 mov rax, 3 +;; 4889442408 mov qword ptr [rsp + 8], rax +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 488b4c2410 mov rcx, qword ptr [rsp + 0x10] +;; 4831c1 xor rcx, rax +;; 4889c8 mov rax, rcx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 57: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/i64_xor/params.wat b/winch/filetests/filetests/x64/i64_xor/params.wat index 152779402190..984e5c5da8b8 100644 --- a/winch/filetests/filetests/x64/i64_xor/params.wat +++ b/winch/filetests/filetests/x64/i64_xor/params.wat @@ -7,16 +7,21 @@ (i64.xor) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 48897c2410 mov qword ptr [rsp + 0x10], rdi -;; d: 4889742408 mov qword ptr [rsp + 8], rsi -;; 12: 4c893424 mov qword ptr [rsp], r14 -;; 16: 488b442408 mov rax, qword ptr [rsp + 8] -;; 1b: 488b4c2410 mov rcx, qword ptr [rsp + 0x10] -;; 20: 4831c1 xor rcx, rax -;; 23: 4889c8 mov rax, rcx -;; 26: 4883c418 add rsp, 0x18 -;; 2a: 5d pop rbp -;; 2b: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8724000000 ja 0x3c +;; 18: 48897c2410 mov qword ptr [rsp + 0x10], rdi +;; 4889742408 mov qword ptr [rsp + 8], rsi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 488b4c2410 mov rcx, qword ptr [rsp + 0x10] +;; 4831c1 xor rcx, rax +;; 4889c8 mov rax, rcx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 3c: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/if/as_binop.wat b/winch/filetests/filetests/x64/if/as_binop.wat index afe658752a6e..02bd3939b29a 100644 --- a/winch/filetests/filetests/x64/if/as_binop.wat +++ b/winch/filetests/filetests/x64/if/as_binop.wat @@ -15,46 +15,56 @@ ) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 18: 85c0 test eax, eax -;; 1a: 0f840f000000 je 0x2f -;; 20: e800000000 call 0x25 -;; 25: b803000000 mov eax, 3 -;; 2a: e90a000000 jmp 0x39 -;; 2f: e800000000 call 0x34 -;; 34: b8fdffffff mov eax, 0xfffffffd -;; 39: 8b4c2408 mov ecx, dword ptr [rsp + 8] -;; 3d: 4883ec04 sub rsp, 4 -;; 41: 890424 mov dword ptr [rsp], eax -;; 44: 85c9 test ecx, ecx -;; 46: 0f8417000000 je 0x63 -;; 4c: 4883ec0c sub rsp, 0xc -;; 50: e800000000 call 0x55 -;; 55: 4883c40c add rsp, 0xc -;; 59: b804000000 mov eax, 4 -;; 5e: e912000000 jmp 0x75 -;; 63: 4883ec0c sub rsp, 0xc -;; 67: e800000000 call 0x6c -;; 6c: 4883c40c add rsp, 0xc -;; 70: b8fbffffff mov eax, 0xfffffffb -;; 75: 8b0c24 mov ecx, dword ptr [rsp] -;; 78: 4883c404 add rsp, 4 -;; 7c: 0fafc8 imul ecx, eax -;; 7f: 89c8 mov eax, ecx -;; 81: 4883c410 add rsp, 0x10 -;; 85: 5d pop rbp -;; 86: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f877f000000 ja 0x97 +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 85c0 test eax, eax +;; 0f840f000000 je 0x3f +;; 30: e800000000 call 0x35 +;; b803000000 mov eax, 3 +;; e90a000000 jmp 0x49 +;; 3f: e800000000 call 0x44 +;; b8fdffffff mov eax, 0xfffffffd +;; 8b4c2408 mov ecx, dword ptr [rsp + 8] +;; 4883ec04 sub rsp, 4 +;; 890424 mov dword ptr [rsp], eax +;; 85c9 test ecx, ecx +;; 0f8417000000 je 0x73 +;; 5c: 4883ec0c sub rsp, 0xc +;; e800000000 call 0x65 +;; 4883c40c add rsp, 0xc +;; b804000000 mov eax, 4 +;; e912000000 jmp 0x85 +;; 73: 4883ec0c sub rsp, 0xc +;; e800000000 call 0x7c +;; 4883c40c add rsp, 0xc +;; b8fbffffff mov eax, 0xfffffffb +;; 8b0c24 mov ecx, dword ptr [rsp] +;; 4883c404 add rsp, 4 +;; 0fafc8 imul ecx, eax +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 97: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/if/as_br_if_last.wat b/winch/filetests/filetests/x64/if/as_br_if_last.wat index 4be373bd8aab..5073538d9021 100644 --- a/winch/filetests/filetests/x64/if/as_br_if_last.wat +++ b/winch/filetests/filetests/x64/if/as_br_if_last.wat @@ -14,38 +14,48 @@ ) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 4c893424 mov qword ptr [rsp], r14 -;; 10: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 14: 85c0 test eax, eax -;; 16: 0f840f000000 je 0x2b -;; 1c: e800000000 call 0x21 -;; 21: b801000000 mov eax, 1 -;; 26: e90a000000 jmp 0x35 -;; 2b: e800000000 call 0x30 -;; 30: b800000000 mov eax, 0 -;; 35: 4883ec04 sub rsp, 4 -;; 39: 890424 mov dword ptr [rsp], eax -;; 3c: 8b0c24 mov ecx, dword ptr [rsp] -;; 3f: 4883c404 add rsp, 4 -;; 43: b802000000 mov eax, 2 -;; 48: 85c9 test ecx, ecx -;; 4a: 0f8510000000 jne 0x60 -;; 50: 4883ec04 sub rsp, 4 -;; 54: 890424 mov dword ptr [rsp], eax -;; 57: b803000000 mov eax, 3 -;; 5c: 4883c404 add rsp, 4 -;; 60: 4883c410 add rsp, 0x10 -;; 64: 5d pop rbp -;; 65: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f875e000000 ja 0x76 +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 85c0 test eax, eax +;; 0f840f000000 je 0x3b +;; 2c: e800000000 call 0x31 +;; b801000000 mov eax, 1 +;; e90a000000 jmp 0x45 +;; 3b: e800000000 call 0x40 +;; b800000000 mov eax, 0 +;; 4883ec04 sub rsp, 4 +;; 890424 mov dword ptr [rsp], eax +;; 8b0c24 mov ecx, dword ptr [rsp] +;; 4883c404 add rsp, 4 +;; b802000000 mov eax, 2 +;; 85c9 test ecx, ecx +;; 0f8510000000 jne 0x70 +;; 60: 4883ec04 sub rsp, 4 +;; 890424 mov dword ptr [rsp], eax +;; b803000000 mov eax, 3 +;; 4883c404 add rsp, 4 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 76: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/if/as_if_cond.wat b/winch/filetests/filetests/x64/if/as_if_cond.wat index 3c7a6016031d..de000ffda034 100644 --- a/winch/filetests/filetests/x64/if/as_if_cond.wat +++ b/winch/filetests/filetests/x64/if/as_if_cond.wat @@ -12,32 +12,42 @@ ) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 4c893424 mov qword ptr [rsp], r14 -;; 10: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 14: 85c0 test eax, eax -;; 16: 0f840a000000 je 0x26 -;; 1c: b801000000 mov eax, 1 -;; 21: e905000000 jmp 0x2b -;; 26: b800000000 mov eax, 0 -;; 2b: 85c0 test eax, eax -;; 2d: 0f840f000000 je 0x42 -;; 33: e800000000 call 0x38 -;; 38: b802000000 mov eax, 2 -;; 3d: e90a000000 jmp 0x4c -;; 42: e800000000 call 0x47 -;; 47: b803000000 mov eax, 3 -;; 4c: 4883c410 add rsp, 0x10 -;; 50: 5d pop rbp -;; 51: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f874a000000 ja 0x62 +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 85c0 test eax, eax +;; 0f840a000000 je 0x36 +;; 2c: b801000000 mov eax, 1 +;; e905000000 jmp 0x3b +;; 36: b800000000 mov eax, 0 +;; 85c0 test eax, eax +;; 0f840f000000 je 0x52 +;; 43: e800000000 call 0x48 +;; b802000000 mov eax, 2 +;; e90a000000 jmp 0x5c +;; 52: e800000000 call 0x57 +;; b803000000 mov eax, 3 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 62: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/if/as_testop.wat b/winch/filetests/filetests/x64/if/as_testop.wat index 965ebab1f5c6..1104b9d7e1b3 100644 --- a/winch/filetests/filetests/x64/if/as_testop.wat +++ b/winch/filetests/filetests/x64/if/as_testop.wat @@ -10,30 +10,40 @@ ) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 4c893424 mov qword ptr [rsp], r14 -;; 10: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 14: 85c0 test eax, eax -;; 16: 0f840f000000 je 0x2b -;; 1c: e800000000 call 0x21 -;; 21: b80d000000 mov eax, 0xd -;; 26: e90a000000 jmp 0x35 -;; 2b: e800000000 call 0x30 -;; 30: b800000000 mov eax, 0 -;; 35: 83f800 cmp eax, 0 -;; 38: b800000000 mov eax, 0 -;; 3d: 400f94c0 sete al -;; 41: 4883c410 add rsp, 0x10 -;; 45: 5d pop rbp -;; 46: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f873f000000 ja 0x57 +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 85c0 test eax, eax +;; 0f840f000000 je 0x3b +;; 2c: e800000000 call 0x31 +;; b80d000000 mov eax, 0xd +;; e90a000000 jmp 0x45 +;; 3b: e800000000 call 0x40 +;; b800000000 mov eax, 0 +;; 83f800 cmp eax, 0 +;; b800000000 mov eax, 0 +;; 400f94c0 sete al +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 57: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/if/break_value.wat b/winch/filetests/filetests/x64/if/break_value.wat index 147498fef797..400def56eddf 100644 --- a/winch/filetests/filetests/x64/if/break_value.wat +++ b/winch/filetests/filetests/x64/if/break_value.wat @@ -8,17 +8,22 @@ ) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 4c893424 mov qword ptr [rsp], r14 -;; 10: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 14: 85c0 test eax, eax -;; 16: 0f840a000000 je 0x26 -;; 1c: b812000000 mov eax, 0x12 -;; 21: e905000000 jmp 0x2b -;; 26: b815000000 mov eax, 0x15 -;; 2b: 4883c410 add rsp, 0x10 -;; 2f: 5d pop rbp -;; 30: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8729000000 ja 0x41 +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 85c0 test eax, eax +;; 0f840a000000 je 0x36 +;; 2c: b812000000 mov eax, 0x12 +;; e905000000 jmp 0x3b +;; 36: b815000000 mov eax, 0x15 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 41: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/if/nested.wat b/winch/filetests/filetests/x64/if/nested.wat index 9db93d4d4b25..fa184a8e1023 100644 --- a/winch/filetests/filetests/x64/if/nested.wat +++ b/winch/filetests/filetests/x64/if/nested.wat @@ -22,58 +22,68 @@ ) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 18: 85c0 test eax, eax -;; 1a: 0f8451000000 je 0x71 -;; 20: 8b442408 mov eax, dword ptr [rsp + 8] -;; 24: 85c0 test eax, eax -;; 26: 0f8405000000 je 0x31 -;; 2c: e800000000 call 0x31 -;; 31: 8b442408 mov eax, dword ptr [rsp + 8] -;; 35: 85c0 test eax, eax -;; 37: 0f8405000000 je 0x42 -;; 3d: e905000000 jmp 0x47 -;; 42: e800000000 call 0x47 -;; 47: 8b442408 mov eax, dword ptr [rsp + 8] -;; 4b: 85c0 test eax, eax -;; 4d: 0f840f000000 je 0x62 -;; 53: e800000000 call 0x58 -;; 58: b809000000 mov eax, 9 -;; 5d: e95b000000 jmp 0xbd -;; 62: e800000000 call 0x67 -;; 67: b80a000000 mov eax, 0xa -;; 6c: e94c000000 jmp 0xbd -;; 71: 8b442408 mov eax, dword ptr [rsp + 8] -;; 75: 85c0 test eax, eax -;; 77: 0f8405000000 je 0x82 -;; 7d: e800000000 call 0x82 -;; 82: 8b442408 mov eax, dword ptr [rsp + 8] -;; 86: 85c0 test eax, eax -;; 88: 0f8405000000 je 0x93 -;; 8e: e905000000 jmp 0x98 -;; 93: e800000000 call 0x98 -;; 98: 8b442408 mov eax, dword ptr [rsp + 8] -;; 9c: 85c0 test eax, eax -;; 9e: 0f840f000000 je 0xb3 -;; a4: e800000000 call 0xa9 -;; a9: b80a000000 mov eax, 0xa -;; ae: e90a000000 jmp 0xbd -;; b3: e800000000 call 0xb8 -;; b8: b80b000000 mov eax, 0xb -;; bd: 4883c410 add rsp, 0x10 -;; c1: 5d pop rbp -;; c2: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f87bb000000 ja 0xd3 +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 85c0 test eax, eax +;; 0f8451000000 je 0x81 +;; 30: 8b442408 mov eax, dword ptr [rsp + 8] +;; 85c0 test eax, eax +;; 0f8405000000 je 0x41 +;; 3c: e800000000 call 0x41 +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 85c0 test eax, eax +;; 0f8405000000 je 0x52 +;; e905000000 jmp 0x57 +;; 52: e800000000 call 0x57 +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 85c0 test eax, eax +;; 0f840f000000 je 0x72 +;; 63: e800000000 call 0x68 +;; b809000000 mov eax, 9 +;; e95b000000 jmp 0xcd +;; 72: e800000000 call 0x77 +;; b80a000000 mov eax, 0xa +;; e94c000000 jmp 0xcd +;; 81: 8b442408 mov eax, dword ptr [rsp + 8] +;; 85c0 test eax, eax +;; 0f8405000000 je 0x92 +;; 8d: e800000000 call 0x92 +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 85c0 test eax, eax +;; 0f8405000000 je 0xa3 +;; e905000000 jmp 0xa8 +;; a3: e800000000 call 0xa8 +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 85c0 test eax, eax +;; 0f840f000000 je 0xc3 +;; b4: e800000000 call 0xb9 +;; b80a000000 mov eax, 0xa +;; e90a000000 jmp 0xcd +;; c3: e800000000 call 0xc8 +;; b80b000000 mov eax, 0xb +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; d3: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/if/reachability.wat b/winch/filetests/filetests/x64/if/reachability.wat new file mode 100644 index 000000000000..435b956afdbb --- /dev/null +++ b/winch/filetests/filetests/x64/if/reachability.wat @@ -0,0 +1,42 @@ +;;! target = "x86_64" +(module + (func (;0;) (param i32) (result i32) + local.get 0 + local.get 0 + if (result i32) + i32.const 1 + return + else + i32.const 2 + end + i32.sub + ) + (export "main" (func 0)) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8745000000 ja 0x5d +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 448b5c240c mov r11d, dword ptr [rsp + 0xc] +;; 4883ec04 sub rsp, 4 +;; 44891c24 mov dword ptr [rsp], r11d +;; 85c0 test eax, eax +;; 0f840e000000 je 0x47 +;; 39: b801000000 mov eax, 1 +;; 4883c404 add rsp, 4 +;; e910000000 jmp 0x57 +;; 47: b802000000 mov eax, 2 +;; 8b0c24 mov ecx, dword ptr [rsp] +;; 4883c404 add rsp, 4 +;; 29c1 sub ecx, eax +;; 89c8 mov eax, ecx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 5d: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/if/singular.wat b/winch/filetests/filetests/x64/if/singular.wat index 11c167bf0d58..349c3e07e06d 100644 --- a/winch/filetests/filetests/x64/if/singular.wat +++ b/winch/filetests/filetests/x64/if/singular.wat @@ -8,31 +8,41 @@ (if (result i32) (local.get 0) (then (i32.const 7)) (else (i32.const 8))) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 4c893424 mov qword ptr [rsp], r14 -;; 10: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 14: 85c0 test eax, eax -;; 16: 0f8400000000 je 0x1c -;; 1c: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 20: 85c0 test eax, eax -;; 22: 0f8400000000 je 0x28 -;; 28: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 2c: 85c0 test eax, eax -;; 2e: 0f840a000000 je 0x3e -;; 34: b807000000 mov eax, 7 -;; 39: e905000000 jmp 0x43 -;; 3e: b808000000 mov eax, 8 -;; 43: 4883c410 add rsp, 0x10 -;; 47: 5d pop rbp -;; 48: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8741000000 ja 0x59 +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 85c0 test eax, eax +;; 0f8400000000 je 0x2c +;; 2c: 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 85c0 test eax, eax +;; 0f8400000000 je 0x38 +;; 38: 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 85c0 test eax, eax +;; 0f840a000000 je 0x4e +;; 44: b807000000 mov eax, 7 +;; e905000000 jmp 0x53 +;; 4e: b808000000 mov eax, 8 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 59: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/load/f32.wat b/winch/filetests/filetests/x64/load/f32.wat new file mode 100644 index 000000000000..62b5815f60f8 --- /dev/null +++ b/winch/filetests/filetests/x64/load/f32.wat @@ -0,0 +1,23 @@ +;;! target = "x86_64" + +(module + (memory (data "\00\00\a0\7f")) + + (func (export "f32.load") (result f32) (f32.load (i32.const 0))) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871a000000 ja 0x32 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b800000000 mov eax, 0 +;; 498b4e50 mov rcx, qword ptr [r14 + 0x50] +;; 4801c1 add rcx, rax +;; f30f1001 movss xmm0, dword ptr [rcx] +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 32: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/load/f64.wat b/winch/filetests/filetests/x64/load/f64.wat new file mode 100644 index 000000000000..f536325b208c --- /dev/null +++ b/winch/filetests/filetests/x64/load/f64.wat @@ -0,0 +1,22 @@ +;;! target = "x86_64" +(module + (memory (data "\00\00\00\00\00\00\f4\7f")) + + (func (export "f64.load") (result f64) (f64.load (i32.const 0))) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871a000000 ja 0x32 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b800000000 mov eax, 0 +;; 498b4e50 mov rcx, qword ptr [r14 + 0x50] +;; 4801c1 add rcx, rax +;; f20f1001 movsd xmm0, qword ptr [rcx] +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 32: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/load/i32.wat b/winch/filetests/filetests/x64/load/i32.wat new file mode 100644 index 000000000000..ec2d6d40d1e7 --- /dev/null +++ b/winch/filetests/filetests/x64/load/i32.wat @@ -0,0 +1,23 @@ +;;! target = "x86_64" +(module + (memory 1) + (func (export "as-br-value") (result i32) + (block (result i32) (br 0 (i32.load (i32.const 0)))) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8718000000 ja 0x30 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b800000000 mov eax, 0 +;; 498b4e50 mov rcx, qword ptr [r14 + 0x50] +;; 4801c1 add rcx, rax +;; 8b01 mov eax, dword ptr [rcx] +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 30: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/load/i64.wat b/winch/filetests/filetests/x64/load/i64.wat new file mode 100644 index 000000000000..2fa7d56b6427 --- /dev/null +++ b/winch/filetests/filetests/x64/load/i64.wat @@ -0,0 +1,30 @@ +;;! target = "x86_64" +(module + (memory 1) + (func (export "i64_load8_s") (param $i i64) (result i64) + (i64.store8 (i32.const 8) (local.get $i)) + (i64.load8_s (i32.const 8)) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8732000000 ja 0x4a +;; 18: 48897c2408 mov qword ptr [rsp + 8], rdi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; b908000000 mov ecx, 8 +;; 498b5650 mov rdx, qword ptr [r14 + 0x50] +;; 4801ca add rdx, rcx +;; 8802 mov byte ptr [rdx], al +;; b808000000 mov eax, 8 +;; 498b4e50 mov rcx, qword ptr [r14 + 0x50] +;; 4801c1 add rcx, rax +;; 480fbe01 movsx rax, byte ptr [rcx] +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 4a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/local/latent.wat b/winch/filetests/filetests/x64/local/latent.wat index 9b9fbac1c66c..f604cddffd33 100644 --- a/winch/filetests/filetests/x64/local/latent.wat +++ b/winch/filetests/filetests/x64/local/latent.wat @@ -7,18 +7,23 @@ local.set 0 ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 4c893424 mov qword ptr [rsp], r14 -;; 10: 448b5c240c mov r11d, dword ptr [rsp + 0xc] -;; 15: 4883ec04 sub rsp, 4 -;; 19: 44891c24 mov dword ptr [rsp], r11d -;; 1d: b801000000 mov eax, 1 -;; 22: 89442410 mov dword ptr [rsp + 0x10], eax -;; 26: 8b0424 mov eax, dword ptr [rsp] -;; 29: 4883c404 add rsp, 4 -;; 2d: 4883c410 add rsp, 0x10 -;; 31: 5d pop rbp -;; 32: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872b000000 ja 0x43 +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 448b5c240c mov r11d, dword ptr [rsp + 0xc] +;; 4883ec04 sub rsp, 4 +;; 44891c24 mov dword ptr [rsp], r11d +;; b801000000 mov eax, 1 +;; 89442410 mov dword ptr [rsp + 0x10], eax +;; 8b0424 mov eax, dword ptr [rsp] +;; 4883c404 add rsp, 4 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 43: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/local/materialized.wat b/winch/filetests/filetests/x64/local/materialized.wat index 98e0599352b1..29c2eeae2561 100644 --- a/winch/filetests/filetests/x64/local/materialized.wat +++ b/winch/filetests/filetests/x64/local/materialized.wat @@ -6,13 +6,18 @@ local.tee 0 ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 4c893424 mov qword ptr [rsp], r14 -;; 10: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 14: 8944240c mov dword ptr [rsp + 0xc], eax -;; 18: 4883c410 add rsp, 0x10 -;; 1c: 5d pop rbp -;; 1d: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8716000000 ja 0x2e +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 8944240c mov dword ptr [rsp + 0xc], eax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 2e: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/loop/as_binary_operand.wat b/winch/filetests/filetests/x64/loop/as_binary_operand.wat index e052a607bf22..33996c873270 100644 --- a/winch/filetests/filetests/x64/loop/as_binary_operand.wat +++ b/winch/filetests/filetests/x64/loop/as_binary_operand.wat @@ -8,26 +8,36 @@ ) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883ec08 sub rsp, 8 -;; 10: e800000000 call 0x15 -;; 15: 4883c408 add rsp, 8 -;; 19: 4883ec08 sub rsp, 8 -;; 1d: e800000000 call 0x22 -;; 22: 4883c408 add rsp, 8 -;; 26: b803000000 mov eax, 3 -;; 2b: 6bc004 imul eax, eax, 4 -;; 2e: 4883c408 add rsp, 8 -;; 32: 5d pop rbp -;; 33: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872c000000 ja 0x44 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x25 +;; 4883c408 add rsp, 8 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x32 +;; 4883c408 add rsp, 8 +;; b803000000 mov eax, 3 +;; 6bc004 imul eax, eax, 4 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 44: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/loop/as_br_if_first.wat b/winch/filetests/filetests/x64/loop/as_br_if_first.wat index e917ae2d8853..5a863100a0a5 100644 --- a/winch/filetests/filetests/x64/loop/as_br_if_first.wat +++ b/winch/filetests/filetests/x64/loop/as_br_if_first.wat @@ -4,14 +4,19 @@ (block (result i32) (br_if 0 (loop (result i32) (i32.const 1)) (i32.const 2))) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b902000000 mov ecx, 2 -;; 11: b801000000 mov eax, 1 -;; 16: 85c9 test ecx, ecx -;; 18: 0f8500000000 jne 0x1e -;; 1e: 4883c408 add rsp, 8 -;; 22: 5d pop rbp -;; 23: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871c000000 ja 0x34 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b902000000 mov ecx, 2 +;; b801000000 mov eax, 1 +;; 85c9 test ecx, ecx +;; 0f8500000000 jne 0x2e +;; 2e: 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 34: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/loop/as_br_if_last.wat b/winch/filetests/filetests/x64/loop/as_br_if_last.wat index ae60997f92eb..01e250db85d7 100644 --- a/winch/filetests/filetests/x64/loop/as_br_if_last.wat +++ b/winch/filetests/filetests/x64/loop/as_br_if_last.wat @@ -4,14 +4,19 @@ (block (result i32) (br_if 0 (i32.const 2) (loop (result i32) (i32.const 1)))) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b901000000 mov ecx, 1 -;; 11: b802000000 mov eax, 2 -;; 16: 85c9 test ecx, ecx -;; 18: 0f8500000000 jne 0x1e -;; 1e: 4883c408 add rsp, 8 -;; 22: 5d pop rbp -;; 23: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871c000000 ja 0x34 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b901000000 mov ecx, 1 +;; b802000000 mov eax, 2 +;; 85c9 test ecx, ecx +;; 0f8500000000 jne 0x2e +;; 2e: 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 34: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/loop/as_br_value.wat b/winch/filetests/filetests/x64/loop/as_br_value.wat index 1076b2754d97..0663b12fdb79 100644 --- a/winch/filetests/filetests/x64/loop/as_br_value.wat +++ b/winch/filetests/filetests/x64/loop/as_br_value.wat @@ -4,11 +4,16 @@ (block (result i32) (br 0 (loop (result i32) (i32.const 1)))) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b801000000 mov eax, 1 -;; 11: 4883c408 add rsp, 8 -;; 15: 5d pop rbp -;; 16: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870f000000 ja 0x27 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 27: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/loop/as_call_value.wat b/winch/filetests/filetests/x64/loop/as_call_value.wat index 979aac88b612..4cd0cb6bc76e 100644 --- a/winch/filetests/filetests/x64/loop/as_call_value.wat +++ b/winch/filetests/filetests/x64/loop/as_call_value.wat @@ -5,24 +5,34 @@ (call $f (loop (result i32) (i32.const 1))) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 4c893424 mov qword ptr [rsp], r14 -;; 10: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 14: 4883c410 add rsp, 0x10 -;; 18: 5d pop rbp -;; 19: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8712000000 ja 0x2a +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 2a: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883ec08 sub rsp, 8 -;; 10: bf01000000 mov edi, 1 -;; 15: e800000000 call 0x1a -;; 1a: 4883c408 add rsp, 8 -;; 1e: 4883c408 add rsp, 8 -;; 22: 5d pop rbp -;; 23: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871c000000 ja 0x34 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883ec08 sub rsp, 8 +;; bf01000000 mov edi, 1 +;; e800000000 call 0x2a +;; 4883c408 add rsp, 8 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 34: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/loop/as_if_condition.wat b/winch/filetests/filetests/x64/loop/as_if_condition.wat index 1fd26be50b73..07f885b59730 100644 --- a/winch/filetests/filetests/x64/loop/as_if_condition.wat +++ b/winch/filetests/filetests/x64/loop/as_if_condition.wat @@ -5,24 +5,34 @@ (loop (result i32) (i32.const 1)) (if (then (call $dummy))) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b801000000 mov eax, 1 -;; 11: 85c0 test eax, eax -;; 13: 0f840d000000 je 0x26 -;; 19: 4883ec08 sub rsp, 8 -;; 1d: e800000000 call 0x22 -;; 22: 4883c408 add rsp, 8 -;; 26: 4883c408 add rsp, 8 -;; 2a: 5d pop rbp -;; 2b: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8724000000 ja 0x3c +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 85c0 test eax, eax +;; 0f840d000000 je 0x36 +;; 29: 4883ec08 sub rsp, 8 +;; e800000000 call 0x32 +;; 4883c408 add rsp, 8 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 3c: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/loop/as_if_else.wat b/winch/filetests/filetests/x64/loop/as_if_else.wat index 263cef9fcd62..cd9eb59d8d2c 100644 --- a/winch/filetests/filetests/x64/loop/as_if_else.wat +++ b/winch/filetests/filetests/x64/loop/as_if_else.wat @@ -4,16 +4,21 @@ (if (result i32) (i32.const 1) (then (i32.const 2)) (else (loop (result i32) (i32.const 1)))) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b801000000 mov eax, 1 -;; 11: 85c0 test eax, eax -;; 13: 0f840a000000 je 0x23 -;; 19: b802000000 mov eax, 2 -;; 1e: e905000000 jmp 0x28 -;; 23: b801000000 mov eax, 1 -;; 28: 4883c408 add rsp, 8 -;; 2c: 5d pop rbp -;; 2d: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8726000000 ja 0x3e +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 85c0 test eax, eax +;; 0f840a000000 je 0x33 +;; 29: b802000000 mov eax, 2 +;; e905000000 jmp 0x38 +;; 33: b801000000 mov eax, 1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 3e: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/loop/as_if_then.wat b/winch/filetests/filetests/x64/loop/as_if_then.wat index ad64ddaeb5fb..aabe78d9e6b2 100644 --- a/winch/filetests/filetests/x64/loop/as_if_then.wat +++ b/winch/filetests/filetests/x64/loop/as_if_then.wat @@ -4,16 +4,21 @@ (if (result i32) (i32.const 1) (then (loop (result i32) (i32.const 1))) (else (i32.const 2))) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b801000000 mov eax, 1 -;; 11: 85c0 test eax, eax -;; 13: 0f840a000000 je 0x23 -;; 19: b801000000 mov eax, 1 -;; 1e: e905000000 jmp 0x28 -;; 23: b802000000 mov eax, 2 -;; 28: 4883c408 add rsp, 8 -;; 2c: 5d pop rbp -;; 2d: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8726000000 ja 0x3e +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 85c0 test eax, eax +;; 0f840a000000 je 0x33 +;; 29: b801000000 mov eax, 1 +;; e905000000 jmp 0x38 +;; 33: b802000000 mov eax, 2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 3e: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/loop/as_local_set_value.wat b/winch/filetests/filetests/x64/loop/as_local_set_value.wat index 138600b3d3bd..222389715164 100644 --- a/winch/filetests/filetests/x64/loop/as_local_set_value.wat +++ b/winch/filetests/filetests/x64/loop/as_local_set_value.wat @@ -4,15 +4,20 @@ (local i32) (local.set 0 (loop (result i32) (i32.const 1))) (local.get 0) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8720000000 ja 0x38 +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: b801000000 mov eax, 1 -;; 1a: 8944240c mov dword ptr [rsp + 0xc], eax -;; 1e: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 22: 4883c410 add rsp, 0x10 -;; 26: 5d pop rbp -;; 27: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 8944240c mov dword ptr [rsp + 0xc], eax +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 38: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/loop/as_test_operand.wat b/winch/filetests/filetests/x64/loop/as_test_operand.wat index a71e162071df..9eb968a1fca6 100644 --- a/winch/filetests/filetests/x64/loop/as_test_operand.wat +++ b/winch/filetests/filetests/x64/loop/as_test_operand.wat @@ -5,25 +5,35 @@ (i32.eqz (loop (result i32) (call $dummy) (i32.const 13))) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883ec08 sub rsp, 8 -;; 10: e800000000 call 0x15 -;; 15: 4883c408 add rsp, 8 -;; 19: b80d000000 mov eax, 0xd -;; 1e: 83f800 cmp eax, 0 -;; 21: b800000000 mov eax, 0 -;; 26: 400f94c0 sete al -;; 2a: 4883c408 add rsp, 8 -;; 2e: 5d pop rbp -;; 2f: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8728000000 ja 0x40 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x25 +;; 4883c408 add rsp, 8 +;; b80d000000 mov eax, 0xd +;; 83f800 cmp eax, 0 +;; b800000000 mov eax, 0 +;; 400f94c0 sete al +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 40: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/loop/as_unary_operand.wat b/winch/filetests/filetests/x64/loop/as_unary_operand.wat index b8d579e9732c..b2c8dbe5bc49 100644 --- a/winch/filetests/filetests/x64/loop/as_unary_operand.wat +++ b/winch/filetests/filetests/x64/loop/as_unary_operand.wat @@ -5,27 +5,37 @@ (i32.ctz (loop (result i32) (call $dummy) (i32.const 13))) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883ec08 sub rsp, 8 -;; 10: e800000000 call 0x15 -;; 15: 4883c408 add rsp, 8 -;; 19: b80d000000 mov eax, 0xd -;; 1e: 0fbcc0 bsf eax, eax -;; 21: 41bb00000000 mov r11d, 0 -;; 27: 410f94c3 sete r11b -;; 2b: 41c1e305 shl r11d, 5 -;; 2f: 4401d8 add eax, r11d -;; 32: 4883c408 add rsp, 8 -;; 36: 5d pop rbp -;; 37: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8730000000 ja 0x48 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x25 +;; 4883c408 add rsp, 8 +;; b80d000000 mov eax, 0xd +;; 0fbcc0 bsf eax, eax +;; 41bb00000000 mov r11d, 0 +;; 410f94c3 sete r11b +;; 41c1e305 shl r11d, 5 +;; 4401d8 add eax, r11d +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 48: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/loop/break_inner.wat b/winch/filetests/filetests/x64/loop/break_inner.wat index c5c3e53bd23a..0e2479faf7a8 100644 --- a/winch/filetests/filetests/x64/loop/break_inner.wat +++ b/winch/filetests/filetests/x64/loop/break_inner.wat @@ -11,55 +11,60 @@ (local.get 0) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f87bb000000 ja 0xd3 +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: b800000000 mov eax, 0 -;; 1a: 8944240c mov dword ptr [rsp + 0xc], eax -;; 1e: 448b5c240c mov r11d, dword ptr [rsp + 0xc] -;; 23: 4883ec04 sub rsp, 4 -;; 27: 44891c24 mov dword ptr [rsp], r11d -;; 2b: b801000000 mov eax, 1 -;; 30: 8b0c24 mov ecx, dword ptr [rsp] -;; 33: 4883c404 add rsp, 4 -;; 37: 01c1 add ecx, eax -;; 39: 894c240c mov dword ptr [rsp + 0xc], ecx -;; 3d: 448b5c240c mov r11d, dword ptr [rsp + 0xc] -;; 42: 4883ec04 sub rsp, 4 -;; 46: 44891c24 mov dword ptr [rsp], r11d -;; 4a: b802000000 mov eax, 2 -;; 4f: 8b0c24 mov ecx, dword ptr [rsp] -;; 52: 4883c404 add rsp, 4 -;; 56: 01c1 add ecx, eax -;; 58: 894c240c mov dword ptr [rsp + 0xc], ecx -;; 5c: 448b5c240c mov r11d, dword ptr [rsp + 0xc] -;; 61: 4883ec04 sub rsp, 4 -;; 65: 44891c24 mov dword ptr [rsp], r11d -;; 69: b804000000 mov eax, 4 -;; 6e: 8b0c24 mov ecx, dword ptr [rsp] -;; 71: 4883c404 add rsp, 4 -;; 75: 01c1 add ecx, eax -;; 77: 894c240c mov dword ptr [rsp + 0xc], ecx -;; 7b: 448b5c240c mov r11d, dword ptr [rsp + 0xc] -;; 80: 4883ec04 sub rsp, 4 -;; 84: 44891c24 mov dword ptr [rsp], r11d -;; 88: b808000000 mov eax, 8 -;; 8d: 8b0c24 mov ecx, dword ptr [rsp] -;; 90: 4883c404 add rsp, 4 -;; 94: 01c1 add ecx, eax -;; 96: 894c240c mov dword ptr [rsp + 0xc], ecx -;; 9a: 448b5c240c mov r11d, dword ptr [rsp + 0xc] -;; 9f: 4883ec04 sub rsp, 4 -;; a3: 44891c24 mov dword ptr [rsp], r11d -;; a7: b810000000 mov eax, 0x10 -;; ac: 8b0c24 mov ecx, dword ptr [rsp] -;; af: 4883c404 add rsp, 4 -;; b3: 01c1 add ecx, eax -;; b5: 894c240c mov dword ptr [rsp + 0xc], ecx -;; b9: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; bd: 4883c410 add rsp, 0x10 -;; c1: 5d pop rbp -;; c2: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; b800000000 mov eax, 0 +;; 8944240c mov dword ptr [rsp + 0xc], eax +;; 448b5c240c mov r11d, dword ptr [rsp + 0xc] +;; 4883ec04 sub rsp, 4 +;; 44891c24 mov dword ptr [rsp], r11d +;; b801000000 mov eax, 1 +;; 8b0c24 mov ecx, dword ptr [rsp] +;; 4883c404 add rsp, 4 +;; 01c1 add ecx, eax +;; 894c240c mov dword ptr [rsp + 0xc], ecx +;; 448b5c240c mov r11d, dword ptr [rsp + 0xc] +;; 4883ec04 sub rsp, 4 +;; 44891c24 mov dword ptr [rsp], r11d +;; b802000000 mov eax, 2 +;; 8b0c24 mov ecx, dword ptr [rsp] +;; 4883c404 add rsp, 4 +;; 01c1 add ecx, eax +;; 894c240c mov dword ptr [rsp + 0xc], ecx +;; 448b5c240c mov r11d, dword ptr [rsp + 0xc] +;; 4883ec04 sub rsp, 4 +;; 44891c24 mov dword ptr [rsp], r11d +;; b804000000 mov eax, 4 +;; 8b0c24 mov ecx, dword ptr [rsp] +;; 4883c404 add rsp, 4 +;; 01c1 add ecx, eax +;; 894c240c mov dword ptr [rsp + 0xc], ecx +;; 448b5c240c mov r11d, dword ptr [rsp + 0xc] +;; 4883ec04 sub rsp, 4 +;; 44891c24 mov dword ptr [rsp], r11d +;; b808000000 mov eax, 8 +;; 8b0c24 mov ecx, dword ptr [rsp] +;; 4883c404 add rsp, 4 +;; 01c1 add ecx, eax +;; 894c240c mov dword ptr [rsp + 0xc], ecx +;; 448b5c240c mov r11d, dword ptr [rsp + 0xc] +;; 4883ec04 sub rsp, 4 +;; 44891c24 mov dword ptr [rsp], r11d +;; b810000000 mov eax, 0x10 +;; 8b0c24 mov ecx, dword ptr [rsp] +;; 4883c404 add rsp, 4 +;; 01c1 add ecx, eax +;; 894c240c mov dword ptr [rsp + 0xc], ecx +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; d3: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/loop/cont_inner.wat b/winch/filetests/filetests/x64/loop/cont_inner.wat index 5430a61adec6..97972cc2d089 100644 --- a/winch/filetests/filetests/x64/loop/cont_inner.wat +++ b/winch/filetests/filetests/x64/loop/cont_inner.wat @@ -9,19 +9,23 @@ (local.get 0) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872e000000 ja 0x46 +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: b800000000 mov eax, 0 -;; 1a: 8944240c mov dword ptr [rsp + 0xc], eax -;; 1e: 448b5c240c mov r11d, dword ptr [rsp + 0xc] -;; 23: 4883ec04 sub rsp, 4 -;; 27: 44891c24 mov dword ptr [rsp], r11d -;; 2b: e9fbffffff jmp 0x2b -;; 30: 4883c404 add rsp, 4 -;; 34: 4883c410 add rsp, 0x10 -;; 38: 5d pop rbp -;; 39: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; b800000000 mov eax, 0 +;; 8944240c mov dword ptr [rsp + 0xc], eax +;; 448b5c240c mov r11d, dword ptr [rsp + 0xc] +;; 4883ec04 sub rsp, 4 +;; 44891c24 mov dword ptr [rsp], r11d +;; e9fbffffff jmp 0x3b +;; 40: 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 46: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/loop/deep.wat b/winch/filetests/filetests/x64/loop/deep.wat index baaba767072b..12a4dcfc965f 100644 --- a/winch/filetests/filetests/x64/loop/deep.wat +++ b/winch/filetests/filetests/x64/loop/deep.wat @@ -46,22 +46,32 @@ )) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883ec08 sub rsp, 8 -;; 10: e800000000 call 0x15 -;; 15: 4883c408 add rsp, 8 -;; 19: b896000000 mov eax, 0x96 -;; 1e: 4883c408 add rsp, 8 -;; 22: 5d pop rbp -;; 23: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871c000000 ja 0x34 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x25 +;; 4883c408 add rsp, 8 +;; b896000000 mov eax, 0x96 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 34: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/loop/effects.wat b/winch/filetests/filetests/x64/loop/effects.wat index dfa151312e29..a4fb4fb4d2e5 100644 --- a/winch/filetests/filetests/x64/loop/effects.wat +++ b/winch/filetests/filetests/x64/loop/effects.wat @@ -15,27 +15,32 @@ (i32.eq (local.get 0) (i32.const -14)) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f874d000000 ja 0x65 +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: b801000000 mov eax, 1 -;; 1a: 8944240c mov dword ptr [rsp + 0xc], eax -;; 1e: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 22: 6bc003 imul eax, eax, 3 -;; 25: 8944240c mov dword ptr [rsp + 0xc], eax -;; 29: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 2d: 83e805 sub eax, 5 -;; 30: 8944240c mov dword ptr [rsp + 0xc], eax -;; 34: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 38: 6bc007 imul eax, eax, 7 -;; 3b: 8944240c mov dword ptr [rsp + 0xc], eax -;; 3f: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 43: 83f8f2 cmp eax, -0xe -;; 46: b800000000 mov eax, 0 -;; 4b: 400f94c0 sete al -;; 4f: 4883c410 add rsp, 0x10 -;; 53: 5d pop rbp -;; 54: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 8944240c mov dword ptr [rsp + 0xc], eax +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 6bc003 imul eax, eax, 3 +;; 8944240c mov dword ptr [rsp + 0xc], eax +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 83e805 sub eax, 5 +;; 8944240c mov dword ptr [rsp + 0xc], eax +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 6bc007 imul eax, eax, 7 +;; 8944240c mov dword ptr [rsp + 0xc], eax +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 83f8f2 cmp eax, -0xe +;; b800000000 mov eax, 0 +;; 400f94c0 sete al +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 65: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/loop/empty.wat b/winch/filetests/filetests/x64/loop/empty.wat index c6cae3e065d0..7ca112794f01 100644 --- a/winch/filetests/filetests/x64/loop/empty.wat +++ b/winch/filetests/filetests/x64/loop/empty.wat @@ -6,10 +6,15 @@ (loop $l) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/loop/for.wat b/winch/filetests/filetests/x64/loop/for.wat index 2db94dd07ef6..0f233ff86f5e 100644 --- a/winch/filetests/filetests/x64/loop/for.wat +++ b/winch/filetests/filetests/x64/loop/for.wat @@ -15,34 +15,39 @@ (local.get 1) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec20 sub rsp, 0x20 -;; 8: 48897c2418 mov qword ptr [rsp + 0x18], rdi -;; d: 4531db xor r11d, r11d -;; 10: 4c895c2410 mov qword ptr [rsp + 0x10], r11 -;; 15: 4c895c2408 mov qword ptr [rsp + 8], r11 -;; 1a: 4c893424 mov qword ptr [rsp], r14 -;; 1e: 48c7c001000000 mov rax, 1 -;; 25: 4889442410 mov qword ptr [rsp + 0x10], rax -;; 2a: 48c7c002000000 mov rax, 2 -;; 31: 4889442408 mov qword ptr [rsp + 8], rax -;; 36: 488b442418 mov rax, qword ptr [rsp + 0x18] -;; 3b: 488b4c2408 mov rcx, qword ptr [rsp + 8] -;; 40: 4839c1 cmp rcx, rax -;; 43: b900000000 mov ecx, 0 -;; 48: 400f97c1 seta cl -;; 4c: 85c9 test ecx, ecx -;; 4e: 0f8526000000 jne 0x7a -;; 54: 488b442408 mov rax, qword ptr [rsp + 8] -;; 59: 488b4c2410 mov rcx, qword ptr [rsp + 0x10] -;; 5e: 480fafc8 imul rcx, rax -;; 62: 48894c2410 mov qword ptr [rsp + 0x10], rcx -;; 67: 488b442408 mov rax, qword ptr [rsp + 8] -;; 6c: 4883c001 add rax, 1 -;; 70: 4889442408 mov qword ptr [rsp + 8], rax -;; 75: e9bcffffff jmp 0x36 -;; 7a: 488b442410 mov rax, qword ptr [rsp + 0x10] -;; 7f: 4883c420 add rsp, 0x20 -;; 83: 5d pop rbp -;; 84: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec20 sub rsp, 0x20 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f877d000000 ja 0x95 +;; 18: 48897c2418 mov qword ptr [rsp + 0x18], rdi +;; 4531db xor r11d, r11d +;; 4c895c2410 mov qword ptr [rsp + 0x10], r11 +;; 4c895c2408 mov qword ptr [rsp + 8], r11 +;; 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; 4889442410 mov qword ptr [rsp + 0x10], rax +;; 48c7c002000000 mov rax, 2 +;; 4889442408 mov qword ptr [rsp + 8], rax +;; 488b442418 mov rax, qword ptr [rsp + 0x18] +;; 488b4c2408 mov rcx, qword ptr [rsp + 8] +;; 4839c1 cmp rcx, rax +;; b900000000 mov ecx, 0 +;; 400f97c1 seta cl +;; 85c9 test ecx, ecx +;; 0f8526000000 jne 0x8a +;; 64: 488b442408 mov rax, qword ptr [rsp + 8] +;; 488b4c2410 mov rcx, qword ptr [rsp + 0x10] +;; 480fafc8 imul rcx, rax +;; 48894c2410 mov qword ptr [rsp + 0x10], rcx +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 4883c001 add rax, 1 +;; 4889442408 mov qword ptr [rsp + 8], rax +;; e9bcffffff jmp 0x46 +;; 8a: 488b442410 mov rax, qword ptr [rsp + 0x10] +;; 4883c420 add rsp, 0x20 +;; 5d pop rbp +;; c3 ret +;; 95: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/loop/multi.wat b/winch/filetests/filetests/x64/loop/multi.wat index 365cccb8e684..1c6cf1b16b41 100644 --- a/winch/filetests/filetests/x64/loop/multi.wat +++ b/winch/filetests/filetests/x64/loop/multi.wat @@ -7,40 +7,50 @@ (loop (result i32) (call $dummy) (call $dummy) (i32.const 8) (call $dummy)) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883ec08 sub rsp, 8 -;; 10: e800000000 call 0x15 -;; 15: 4883c408 add rsp, 8 -;; 19: 4883ec08 sub rsp, 8 -;; 1d: e800000000 call 0x22 -;; 22: 4883c408 add rsp, 8 -;; 26: 4883ec08 sub rsp, 8 -;; 2a: e800000000 call 0x2f -;; 2f: 4883c408 add rsp, 8 -;; 33: 4883ec08 sub rsp, 8 -;; 37: e800000000 call 0x3c -;; 3c: 4883c408 add rsp, 8 -;; 40: 4883ec08 sub rsp, 8 -;; 44: e800000000 call 0x49 -;; 49: 4883c408 add rsp, 8 -;; 4d: 4883ec08 sub rsp, 8 -;; 51: e800000000 call 0x56 -;; 56: 4883c408 add rsp, 8 -;; 5a: 4883ec08 sub rsp, 8 -;; 5e: e800000000 call 0x63 -;; 63: 4883c408 add rsp, 8 -;; 67: b808000000 mov eax, 8 -;; 6c: 4883c408 add rsp, 8 -;; 70: 5d pop rbp -;; 71: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f876a000000 ja 0x82 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x25 +;; 4883c408 add rsp, 8 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x32 +;; 4883c408 add rsp, 8 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x3f +;; 4883c408 add rsp, 8 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x4c +;; 4883c408 add rsp, 8 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x59 +;; 4883c408 add rsp, 8 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x66 +;; 4883c408 add rsp, 8 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x73 +;; 4883c408 add rsp, 8 +;; b808000000 mov eax, 8 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 82: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/loop/nested.wat b/winch/filetests/filetests/x64/loop/nested.wat index e272e78f83bf..60d6c8bfe5d1 100644 --- a/winch/filetests/filetests/x64/loop/nested.wat +++ b/winch/filetests/filetests/x64/loop/nested.wat @@ -8,25 +8,35 @@ ) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883ec08 sub rsp, 8 -;; 10: e800000000 call 0x15 -;; 15: 4883c408 add rsp, 8 -;; 19: 4883ec08 sub rsp, 8 -;; 1d: e800000000 call 0x22 -;; 22: 4883c408 add rsp, 8 -;; 26: b809000000 mov eax, 9 -;; 2b: 4883c408 add rsp, 8 -;; 2f: 5d pop rbp -;; 30: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8729000000 ja 0x41 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x25 +;; 4883c408 add rsp, 8 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x32 +;; 4883c408 add rsp, 8 +;; b809000000 mov eax, 9 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 41: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/loop/singular.wat b/winch/filetests/filetests/x64/loop/singular.wat index 4631e0b05868..6a85c059628a 100644 --- a/winch/filetests/filetests/x64/loop/singular.wat +++ b/winch/filetests/filetests/x64/loop/singular.wat @@ -6,11 +6,16 @@ (loop (result i32) (i32.const 7)) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b807000000 mov eax, 7 -;; 11: 4883c408 add rsp, 8 -;; 15: 5d pop rbp -;; 16: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870f000000 ja 0x27 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b807000000 mov eax, 7 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 27: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/loop/while.wat b/winch/filetests/filetests/x64/loop/while.wat index adef2ad06a96..30a936f9219f 100644 --- a/winch/filetests/filetests/x64/loop/while.wat +++ b/winch/filetests/filetests/x64/loop/while.wat @@ -14,30 +14,35 @@ (local.get 1) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 48897c2410 mov qword ptr [rsp + 0x10], rdi -;; d: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8769000000 ja 0x81 +;; 18: 48897c2410 mov qword ptr [rsp + 0x10], rdi +;; 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 16: 4c893424 mov qword ptr [rsp], r14 -;; 1a: 48c7c001000000 mov rax, 1 -;; 21: 4889442408 mov qword ptr [rsp + 8], rax -;; 26: 488b442410 mov rax, qword ptr [rsp + 0x10] -;; 2b: 4883f800 cmp rax, 0 -;; 2f: b800000000 mov eax, 0 -;; 34: 400f94c0 sete al -;; 38: 85c0 test eax, eax -;; 3a: 0f8526000000 jne 0x66 -;; 40: 488b442408 mov rax, qword ptr [rsp + 8] -;; 45: 488b4c2410 mov rcx, qword ptr [rsp + 0x10] -;; 4a: 480fafc8 imul rcx, rax -;; 4e: 48894c2408 mov qword ptr [rsp + 8], rcx -;; 53: 488b442410 mov rax, qword ptr [rsp + 0x10] -;; 58: 4883e801 sub rax, 1 -;; 5c: 4889442410 mov qword ptr [rsp + 0x10], rax -;; 61: e9c0ffffff jmp 0x26 -;; 66: 488b442408 mov rax, qword ptr [rsp + 8] -;; 6b: 4883c418 add rsp, 0x18 -;; 6f: 5d pop rbp -;; 70: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; 48c7c001000000 mov rax, 1 +;; 4889442408 mov qword ptr [rsp + 8], rax +;; 488b442410 mov rax, qword ptr [rsp + 0x10] +;; 4883f800 cmp rax, 0 +;; b800000000 mov eax, 0 +;; 400f94c0 sete al +;; 85c0 test eax, eax +;; 0f8526000000 jne 0x76 +;; 50: 488b442408 mov rax, qword ptr [rsp + 8] +;; 488b4c2410 mov rcx, qword ptr [rsp + 0x10] +;; 480fafc8 imul rcx, rax +;; 48894c2408 mov qword ptr [rsp + 8], rcx +;; 488b442410 mov rax, qword ptr [rsp + 0x10] +;; 4883e801 sub rax, 1 +;; 4889442410 mov qword ptr [rsp + 0x10], rax +;; e9c0ffffff jmp 0x36 +;; 76: 488b442408 mov rax, qword ptr [rsp + 8] +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 81: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/nop/nop.wat b/winch/filetests/filetests/x64/nop/nop.wat index 7b8c00c4439c..f0d88fb15b9e 100644 --- a/winch/filetests/filetests/x64/nop/nop.wat +++ b/winch/filetests/filetests/x64/nop/nop.wat @@ -6,10 +6,15 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/return/as_block_first.wat b/winch/filetests/filetests/x64/return/as_block_first.wat index 6c9afecdb36b..ed963cec6208 100644 --- a/winch/filetests/filetests/x64/return/as_block_first.wat +++ b/winch/filetests/filetests/x64/return/as_block_first.wat @@ -6,18 +6,28 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/return/as_block_last.wat b/winch/filetests/filetests/x64/return/as_block_last.wat index ea01847ff449..100610ccb89d 100644 --- a/winch/filetests/filetests/x64/return/as_block_last.wat +++ b/winch/filetests/filetests/x64/return/as_block_last.wat @@ -6,21 +6,31 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883ec08 sub rsp, 8 -;; 10: e800000000 call 0x15 -;; 15: 4883c408 add rsp, 8 -;; 19: 4883c408 add rsp, 8 -;; 1d: 5d pop rbp -;; 1e: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8717000000 ja 0x2f +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x25 +;; 4883c408 add rsp, 8 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2f: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/return/as_block_mid.wat b/winch/filetests/filetests/x64/return/as_block_mid.wat index 8def330c17a0..20c2a96c4b42 100644 --- a/winch/filetests/filetests/x64/return/as_block_mid.wat +++ b/winch/filetests/filetests/x64/return/as_block_mid.wat @@ -6,21 +6,31 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883ec08 sub rsp, 8 -;; 10: e800000000 call 0x15 -;; 15: 4883c408 add rsp, 8 -;; 19: 4883c408 add rsp, 8 -;; 1d: 5d pop rbp -;; 1e: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8717000000 ja 0x2f +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x25 +;; 4883c408 add rsp, 8 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 2f: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/return/as_block_value.wat b/winch/filetests/filetests/x64/return/as_block_value.wat index 717579c80292..4152b9cbc7af 100644 --- a/winch/filetests/filetests/x64/return/as_block_value.wat +++ b/winch/filetests/filetests/x64/return/as_block_value.wat @@ -6,22 +6,32 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883ec08 sub rsp, 8 -;; 10: e800000000 call 0x15 -;; 15: 4883c408 add rsp, 8 -;; 19: b802000000 mov eax, 2 -;; 1e: 4883c408 add rsp, 8 -;; 22: 5d pop rbp -;; 23: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871c000000 ja 0x34 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x25 +;; 4883c408 add rsp, 8 +;; b802000000 mov eax, 2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 34: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/return/as_br_if_cond.wat b/winch/filetests/filetests/x64/return/as_br_if_cond.wat index 07d40a31f434..f6f96a717c72 100644 --- a/winch/filetests/filetests/x64/return/as_br_if_cond.wat +++ b/winch/filetests/filetests/x64/return/as_br_if_cond.wat @@ -6,18 +6,28 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/return/as_br_value.wat b/winch/filetests/filetests/x64/return/as_br_value.wat index 858f90716357..d3b0573fb370 100644 --- a/winch/filetests/filetests/x64/return/as_br_value.wat +++ b/winch/filetests/filetests/x64/return/as_br_value.wat @@ -6,19 +6,29 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b809000000 mov eax, 9 -;; 11: 4883c408 add rsp, 8 -;; 15: 5d pop rbp -;; 16: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870f000000 ja 0x27 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b809000000 mov eax, 9 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 27: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/return/as_call_fist.wat b/winch/filetests/filetests/x64/return/as_call_fist.wat index 46b2b567bac5..e5ed5443fb67 100644 --- a/winch/filetests/filetests/x64/return/as_call_fist.wat +++ b/winch/filetests/filetests/x64/return/as_call_fist.wat @@ -6,23 +6,33 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 897c2414 mov dword ptr [rsp + 0x14], edi -;; c: 89742410 mov dword ptr [rsp + 0x10], esi -;; 10: 8954240c mov dword ptr [rsp + 0xc], edx -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: b8ffffffff mov eax, 0xffffffff -;; 1d: 4883c418 add rsp, 0x18 -;; 21: 5d pop rbp -;; 22: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871b000000 ja 0x33 +;; 18: 897c2414 mov dword ptr [rsp + 0x14], edi +;; 89742410 mov dword ptr [rsp + 0x10], esi +;; 8954240c mov dword ptr [rsp + 0xc], edx +;; 4c893424 mov qword ptr [rsp], r14 +;; b8ffffffff mov eax, 0xffffffff +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 33: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b80c000000 mov eax, 0xc -;; 11: 4883c408 add rsp, 8 -;; 15: 5d pop rbp -;; 16: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870f000000 ja 0x27 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b80c000000 mov eax, 0xc +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 27: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/return/as_call_last.wat b/winch/filetests/filetests/x64/return/as_call_last.wat index acb0231e7106..0a49dc302d18 100644 --- a/winch/filetests/filetests/x64/return/as_call_last.wat +++ b/winch/filetests/filetests/x64/return/as_call_last.wat @@ -6,23 +6,33 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 897c2414 mov dword ptr [rsp + 0x14], edi -;; c: 89742410 mov dword ptr [rsp + 0x10], esi -;; 10: 8954240c mov dword ptr [rsp + 0xc], edx -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: b8ffffffff mov eax, 0xffffffff -;; 1d: 4883c418 add rsp, 0x18 -;; 21: 5d pop rbp -;; 22: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871b000000 ja 0x33 +;; 18: 897c2414 mov dword ptr [rsp + 0x14], edi +;; 89742410 mov dword ptr [rsp + 0x10], esi +;; 8954240c mov dword ptr [rsp + 0xc], edx +;; 4c893424 mov qword ptr [rsp], r14 +;; b8ffffffff mov eax, 0xffffffff +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 33: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b80e000000 mov eax, 0xe -;; 11: 4883c408 add rsp, 8 -;; 15: 5d pop rbp -;; 16: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870f000000 ja 0x27 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b80e000000 mov eax, 0xe +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 27: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/return/as_call_mid.wat b/winch/filetests/filetests/x64/return/as_call_mid.wat index 21c3b61c2bd0..4d83ab4277e6 100644 --- a/winch/filetests/filetests/x64/return/as_call_mid.wat +++ b/winch/filetests/filetests/x64/return/as_call_mid.wat @@ -6,23 +6,33 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 897c2414 mov dword ptr [rsp + 0x14], edi -;; c: 89742410 mov dword ptr [rsp + 0x10], esi -;; 10: 8954240c mov dword ptr [rsp + 0xc], edx -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: b8ffffffff mov eax, 0xffffffff -;; 1d: 4883c418 add rsp, 0x18 -;; 21: 5d pop rbp -;; 22: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871b000000 ja 0x33 +;; 18: 897c2414 mov dword ptr [rsp + 0x14], edi +;; 89742410 mov dword ptr [rsp + 0x10], esi +;; 8954240c mov dword ptr [rsp + 0xc], edx +;; 4c893424 mov qword ptr [rsp], r14 +;; b8ffffffff mov eax, 0xffffffff +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 33: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b80d000000 mov eax, 0xd -;; 11: 4883c408 add rsp, 8 -;; 15: 5d pop rbp -;; 16: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870f000000 ja 0x27 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b80d000000 mov eax, 0xd +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 27: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/return/as_func_first.wat b/winch/filetests/filetests/x64/return/as_func_first.wat index 1c6e84b7fe5d..8e289f4d25d3 100644 --- a/winch/filetests/filetests/x64/return/as_func_first.wat +++ b/winch/filetests/filetests/x64/return/as_func_first.wat @@ -6,19 +6,29 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b801000000 mov eax, 1 -;; 11: 4883c408 add rsp, 8 -;; 15: 5d pop rbp -;; 16: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870f000000 ja 0x27 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 27: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/return/as_func_last.wat b/winch/filetests/filetests/x64/return/as_func_last.wat index daa2374db072..9b8f5da0f5f3 100644 --- a/winch/filetests/filetests/x64/return/as_func_last.wat +++ b/winch/filetests/filetests/x64/return/as_func_last.wat @@ -3,10 +3,15 @@ (func $dummy) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/return/as_func_mid.wat b/winch/filetests/filetests/x64/return/as_func_mid.wat index 5ca871890cf7..ad5a806b72cb 100644 --- a/winch/filetests/filetests/x64/return/as_func_mid.wat +++ b/winch/filetests/filetests/x64/return/as_func_mid.wat @@ -6,22 +6,32 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883ec08 sub rsp, 8 -;; 10: e800000000 call 0x15 -;; 15: 4883c408 add rsp, 8 -;; 19: b802000000 mov eax, 2 -;; 1e: 4883c408 add rsp, 8 -;; 22: 5d pop rbp -;; 23: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871c000000 ja 0x34 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x25 +;; 4883c408 add rsp, 8 +;; b802000000 mov eax, 2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 34: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/return/as_func_value.wat b/winch/filetests/filetests/x64/return/as_func_value.wat index 7e5f92928738..8fd3768217ed 100644 --- a/winch/filetests/filetests/x64/return/as_func_value.wat +++ b/winch/filetests/filetests/x64/return/as_func_value.wat @@ -6,22 +6,32 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883ec08 sub rsp, 8 -;; 10: e800000000 call 0x15 -;; 15: 4883c408 add rsp, 8 -;; 19: b803000000 mov eax, 3 -;; 1e: 4883c408 add rsp, 8 -;; 22: 5d pop rbp -;; 23: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871c000000 ja 0x34 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x25 +;; 4883c408 add rsp, 8 +;; b803000000 mov eax, 3 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 34: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/return/as_if_cond.wat b/winch/filetests/filetests/x64/return/as_if_cond.wat index 644b37009024..b7f38cdb600d 100644 --- a/winch/filetests/filetests/x64/return/as_if_cond.wat +++ b/winch/filetests/filetests/x64/return/as_if_cond.wat @@ -8,19 +8,29 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b802000000 mov eax, 2 -;; 11: 4883c408 add rsp, 8 -;; 15: 5d pop rbp -;; 16: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870f000000 ja 0x27 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b802000000 mov eax, 2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 27: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/return/as_if_else.wat b/winch/filetests/filetests/x64/return/as_if_else.wat index 350d0d52cb23..f132430ccc53 100644 --- a/winch/filetests/filetests/x64/return/as_if_else.wat +++ b/winch/filetests/filetests/x64/return/as_if_else.wat @@ -9,26 +9,36 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 18: 85c0 test eax, eax -;; 1a: 0f8409000000 je 0x29 -;; 20: 8b442408 mov eax, dword ptr [rsp + 8] -;; 24: e905000000 jmp 0x2e -;; 29: b804000000 mov eax, 4 -;; 2e: 4883c410 add rsp, 0x10 -;; 32: 5d pop rbp -;; 33: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872c000000 ja 0x44 +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 85c0 test eax, eax +;; 0f8409000000 je 0x39 +;; 30: 8b442408 mov eax, dword ptr [rsp + 8] +;; e905000000 jmp 0x3e +;; 39: b804000000 mov eax, 4 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 44: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/return/as_if_then.wat b/winch/filetests/filetests/x64/return/as_if_then.wat index 1e4093810019..2c98f6cc7b39 100644 --- a/winch/filetests/filetests/x64/return/as_if_then.wat +++ b/winch/filetests/filetests/x64/return/as_if_then.wat @@ -9,26 +9,36 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 18: 85c0 test eax, eax -;; 1a: 0f840a000000 je 0x2a -;; 20: b803000000 mov eax, 3 -;; 25: e904000000 jmp 0x2e -;; 2a: 8b442408 mov eax, dword ptr [rsp + 8] -;; 2e: 4883c410 add rsp, 0x10 -;; 32: 5d pop rbp -;; 33: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872c000000 ja 0x44 +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 85c0 test eax, eax +;; 0f840a000000 je 0x3a +;; 30: b803000000 mov eax, 3 +;; e904000000 jmp 0x3e +;; 3a: 8b442408 mov eax, dword ptr [rsp + 8] +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 44: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/return/as_loop_first.wat b/winch/filetests/filetests/x64/return/as_loop_first.wat index d7384ea4109d..972b8b7d6fc0 100644 --- a/winch/filetests/filetests/x64/return/as_loop_first.wat +++ b/winch/filetests/filetests/x64/return/as_loop_first.wat @@ -6,19 +6,29 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b803000000 mov eax, 3 -;; 11: 4883c408 add rsp, 8 -;; 15: 5d pop rbp -;; 16: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870f000000 ja 0x27 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b803000000 mov eax, 3 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 27: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/return/as_loop_last.wat b/winch/filetests/filetests/x64/return/as_loop_last.wat index a54d311666ba..bf2e520f0c5b 100644 --- a/winch/filetests/filetests/x64/return/as_loop_last.wat +++ b/winch/filetests/filetests/x64/return/as_loop_last.wat @@ -6,22 +6,32 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883ec08 sub rsp, 8 -;; 10: e800000000 call 0x15 -;; 15: 4883c408 add rsp, 8 -;; 19: b805000000 mov eax, 5 -;; 1e: 4883c408 add rsp, 8 -;; 22: 5d pop rbp -;; 23: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871c000000 ja 0x34 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x25 +;; 4883c408 add rsp, 8 +;; b805000000 mov eax, 5 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 34: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/return/as_loop_mid.wat b/winch/filetests/filetests/x64/return/as_loop_mid.wat index ac6c76a5f9f2..6b68ea5d501c 100644 --- a/winch/filetests/filetests/x64/return/as_loop_mid.wat +++ b/winch/filetests/filetests/x64/return/as_loop_mid.wat @@ -6,22 +6,32 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883ec08 sub rsp, 8 -;; 10: e800000000 call 0x15 -;; 15: 4883c408 add rsp, 8 -;; 19: b804000000 mov eax, 4 -;; 1e: 4883c408 add rsp, 8 -;; 22: 5d pop rbp -;; 23: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871c000000 ja 0x34 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x25 +;; 4883c408 add rsp, 8 +;; b804000000 mov eax, 4 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 34: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/return/as_return_value.wat b/winch/filetests/filetests/x64/return/as_return_value.wat index 1e010497dd6c..95d7221110d9 100644 --- a/winch/filetests/filetests/x64/return/as_return_value.wat +++ b/winch/filetests/filetests/x64/return/as_return_value.wat @@ -6,19 +6,29 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c007000000 mov rax, 7 -;; 13: 4883c408 add rsp, 8 -;; 17: 5d pop rbp -;; 18: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8711000000 ja 0x29 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c007000000 mov rax, 7 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 29: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/return/nullary.wat b/winch/filetests/filetests/x64/return/nullary.wat index 78f57cf6d313..8d9d2aeacdcc 100644 --- a/winch/filetests/filetests/x64/return/nullary.wat +++ b/winch/filetests/filetests/x64/return/nullary.wat @@ -4,18 +4,28 @@ (func (export "nullary") (return)) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/return/type_i32.wat b/winch/filetests/filetests/x64/return/type_i32.wat index 09a89241b7d2..553d7b7bd003 100644 --- a/winch/filetests/filetests/x64/return/type_i32.wat +++ b/winch/filetests/filetests/x64/return/type_i32.wat @@ -7,19 +7,29 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b801000000 mov eax, 1 -;; 11: 4883c408 add rsp, 8 -;; 15: 5d pop rbp -;; 16: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870f000000 ja 0x27 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 27: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/return/type_i64_value.wat b/winch/filetests/filetests/x64/return/type_i64_value.wat index e4be29d6febf..74dbfc76a4a5 100644 --- a/winch/filetests/filetests/x64/return/type_i64_value.wat +++ b/winch/filetests/filetests/x64/return/type_i64_value.wat @@ -7,19 +7,29 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 48c7c002000000 mov rax, 2 -;; 13: 4883c408 add rsp, 8 -;; 17: 5d pop rbp -;; 18: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8711000000 ja 0x29 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 48c7c002000000 mov rax, 2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 29: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/select/f32.wat b/winch/filetests/filetests/x64/select/f32.wat index d5128d43ff93..e1f623562f11 100644 --- a/winch/filetests/filetests/x64/select/f32.wat +++ b/winch/filetests/filetests/x64/select/f32.wat @@ -6,19 +6,24 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: f30f11442414 movss dword ptr [rsp + 0x14], xmm0 -;; e: f30f114c2410 movss dword ptr [rsp + 0x10], xmm1 -;; 14: 897c240c mov dword ptr [rsp + 0xc], edi -;; 18: 4c893424 mov qword ptr [rsp], r14 -;; 1c: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 20: f30f10442410 movss xmm0, dword ptr [rsp + 0x10] -;; 26: f30f104c2414 movss xmm1, dword ptr [rsp + 0x14] -;; 2c: 83f800 cmp eax, 0 -;; 2f: 0f8404000000 je 0x39 -;; 35: f20f10c1 movsd xmm0, xmm1 -;; 39: 4883c418 add rsp, 0x18 -;; 3d: 5d pop rbp -;; 3e: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8737000000 ja 0x4f +;; 18: f30f11442414 movss dword ptr [rsp + 0x14], xmm0 +;; f30f114c2410 movss dword ptr [rsp + 0x10], xmm1 +;; 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; f30f10442410 movss xmm0, dword ptr [rsp + 0x10] +;; f30f104c2414 movss xmm1, dword ptr [rsp + 0x14] +;; 83f800 cmp eax, 0 +;; 0f8404000000 je 0x49 +;; 45: f20f10c1 movsd xmm0, xmm1 +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 4f: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/select/f64.wat b/winch/filetests/filetests/x64/select/f64.wat index 5ac77bc33def..8c9ceeb6d76c 100644 --- a/winch/filetests/filetests/x64/select/f64.wat +++ b/winch/filetests/filetests/x64/select/f64.wat @@ -6,19 +6,24 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec20 sub rsp, 0x20 -;; 8: f20f11442418 movsd qword ptr [rsp + 0x18], xmm0 -;; e: f20f114c2410 movsd qword ptr [rsp + 0x10], xmm1 -;; 14: 897c240c mov dword ptr [rsp + 0xc], edi -;; 18: 4c893424 mov qword ptr [rsp], r14 -;; 1c: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 20: f20f10442410 movsd xmm0, qword ptr [rsp + 0x10] -;; 26: f20f104c2418 movsd xmm1, qword ptr [rsp + 0x18] -;; 2c: 83f800 cmp eax, 0 -;; 2f: 0f8404000000 je 0x39 -;; 35: f20f10c1 movsd xmm0, xmm1 -;; 39: 4883c420 add rsp, 0x20 -;; 3d: 5d pop rbp -;; 3e: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec20 sub rsp, 0x20 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8737000000 ja 0x4f +;; 18: f20f11442418 movsd qword ptr [rsp + 0x18], xmm0 +;; f20f114c2410 movsd qword ptr [rsp + 0x10], xmm1 +;; 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; f20f10442410 movsd xmm0, qword ptr [rsp + 0x10] +;; f20f104c2418 movsd xmm1, qword ptr [rsp + 0x18] +;; 83f800 cmp eax, 0 +;; 0f8404000000 je 0x49 +;; 45: f20f10c1 movsd xmm0, xmm1 +;; 4883c420 add rsp, 0x20 +;; 5d pop rbp +;; c3 ret +;; 4f: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/select/i32.wat b/winch/filetests/filetests/x64/select/i32.wat index 2c406e2e359c..debc385c58c3 100644 --- a/winch/filetests/filetests/x64/select/i32.wat +++ b/winch/filetests/filetests/x64/select/i32.wat @@ -5,19 +5,24 @@ (select (local.get 0) (local.get 1) (local.get 2)) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 897c2414 mov dword ptr [rsp + 0x14], edi -;; c: 89742410 mov dword ptr [rsp + 0x10], esi -;; 10: 8954240c mov dword ptr [rsp + 0xc], edx -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 1c: 8b4c2410 mov ecx, dword ptr [rsp + 0x10] -;; 20: 8b542414 mov edx, dword ptr [rsp + 0x14] -;; 24: 83f800 cmp eax, 0 -;; 27: 0f45ca cmovne ecx, edx -;; 2a: 89c8 mov eax, ecx -;; 2c: 4883c418 add rsp, 0x18 -;; 30: 5d pop rbp -;; 31: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872a000000 ja 0x42 +;; 18: 897c2414 mov dword ptr [rsp + 0x14], edi +;; 89742410 mov dword ptr [rsp + 0x10], esi +;; 8954240c mov dword ptr [rsp + 0xc], edx +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 8b4c2410 mov ecx, dword ptr [rsp + 0x10] +;; 8b542414 mov edx, dword ptr [rsp + 0x14] +;; 83f800 cmp eax, 0 +;; 0f45ca cmovne ecx, edx +;; 89c8 mov eax, ecx +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 42: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/select/i64.wat b/winch/filetests/filetests/x64/select/i64.wat index 3d73ba0d0ac0..0ef8148d2ca3 100644 --- a/winch/filetests/filetests/x64/select/i64.wat +++ b/winch/filetests/filetests/x64/select/i64.wat @@ -6,19 +6,24 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec20 sub rsp, 0x20 -;; 8: 48897c2418 mov qword ptr [rsp + 0x18], rdi -;; d: 4889742410 mov qword ptr [rsp + 0x10], rsi -;; 12: 8954240c mov dword ptr [rsp + 0xc], edx -;; 16: 4c893424 mov qword ptr [rsp], r14 -;; 1a: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 1e: 488b4c2410 mov rcx, qword ptr [rsp + 0x10] -;; 23: 488b542418 mov rdx, qword ptr [rsp + 0x18] -;; 28: 83f800 cmp eax, 0 -;; 2b: 480f45ca cmovne rcx, rdx -;; 2f: 4889c8 mov rax, rcx -;; 32: 4883c420 add rsp, 0x20 -;; 36: 5d pop rbp -;; 37: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec20 sub rsp, 0x20 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8730000000 ja 0x48 +;; 18: 48897c2418 mov qword ptr [rsp + 0x18], rdi +;; 4889742410 mov qword ptr [rsp + 0x10], rsi +;; 8954240c mov dword ptr [rsp + 0xc], edx +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 488b4c2410 mov rcx, qword ptr [rsp + 0x10] +;; 488b542418 mov rdx, qword ptr [rsp + 0x18] +;; 83f800 cmp eax, 0 +;; 480f45ca cmovne rcx, rdx +;; 4889c8 mov rax, rcx +;; 4883c420 add rsp, 0x20 +;; 5d pop rbp +;; c3 ret +;; 48: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/store/f32.wat b/winch/filetests/filetests/x64/store/f32.wat new file mode 100644 index 000000000000..71bf887e1237 --- /dev/null +++ b/winch/filetests/filetests/x64/store/f32.wat @@ -0,0 +1,26 @@ +;;! target = "x86_64" + +(module + (memory (data "\00\00\a0\7f")) + (func (export "f32.store") (f32.store (i32.const 0) (f32.const nan:0x200000))) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8722000000 ja 0x3a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f30f10051c000000 movss xmm0, dword ptr [rip + 0x1c] +;; b800000000 mov eax, 0 +;; 498b4e50 mov rcx, qword ptr [r14 + 0x50] +;; 4801c1 add rcx, rax +;; f30f1101 movss dword ptr [rcx], xmm0 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 3a: 0f0b ud2 +;; 3c: 0000 add byte ptr [rax], al +;; 3e: 0000 add byte ptr [rax], al +;; 40: 0000 add byte ptr [rax], al diff --git a/winch/filetests/filetests/x64/store/f64.wat b/winch/filetests/filetests/x64/store/f64.wat new file mode 100644 index 000000000000..4f591a6c1c66 --- /dev/null +++ b/winch/filetests/filetests/x64/store/f64.wat @@ -0,0 +1,30 @@ +;;! target = "x86_64" + +(module + (memory (data "\00\00\00\00\00\00\f4\7f")) + (func (export "f64.store") (f64.store (i32.const 0) (f64.const nan:0x4000000000000))) +) + +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8722000000 ja 0x3a +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; f20f10051c000000 movsd xmm0, qword ptr [rip + 0x1c] +;; b800000000 mov eax, 0 +;; 498b4e50 mov rcx, qword ptr [r14 + 0x50] +;; 4801c1 add rcx, rax +;; f20f1101 movsd qword ptr [rcx], xmm0 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 3a: 0f0b ud2 +;; 3c: 0000 add byte ptr [rax], al +;; 3e: 0000 add byte ptr [rax], al +;; 40: 0000 add byte ptr [rax], al +;; 42: 0000 add byte ptr [rax], al +;; 44: 0000 add byte ptr [rax], al +;; 46: f4 hlt diff --git a/winch/filetests/filetests/x64/store/i32.wat b/winch/filetests/filetests/x64/store/i32.wat new file mode 100644 index 000000000000..cb120a12478d --- /dev/null +++ b/winch/filetests/filetests/x64/store/i32.wat @@ -0,0 +1,25 @@ +;;! target = "x86_64" +(module + (memory 1) + + (func (export "as-block-value") + (block (i32.store (i32.const 0) (i32.const 1))) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871d000000 ja 0x35 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b801000000 mov eax, 1 +;; b900000000 mov ecx, 0 +;; 498b5650 mov rdx, qword ptr [r14 + 0x50] +;; 4801ca add rdx, rcx +;; 8902 mov dword ptr [rdx], eax +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 35: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/store/i64.wat b/winch/filetests/filetests/x64/store/i64.wat new file mode 100644 index 000000000000..f71efc886a59 --- /dev/null +++ b/winch/filetests/filetests/x64/store/i64.wat @@ -0,0 +1,22 @@ +;;! target = "x86_64" +(module + (memory 1) + (func (export "as-store-both") (result i32) + (block (result i32) + (i64.store (br 0 (i32.const 32))) (i32.const -1) + ) + ) +) +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870f000000 ja 0x27 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b820000000 mov eax, 0x20 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 27: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/table/fill.wat b/winch/filetests/filetests/x64/table/fill.wat index 2a5651126d77..6a752765e8aa 100644 --- a/winch/filetests/filetests/x64/table/fill.wat +++ b/winch/filetests/filetests/x64/table/fill.wat @@ -19,83 +19,111 @@ (table.fill $t2 (local.get $i) (local.get $ref) (local.get $n)) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec20 sub rsp, 0x20 -;; 8: 897c241c mov dword ptr [rsp + 0x1c], edi -;; c: 89742418 mov dword ptr [rsp + 0x18], esi -;; 10: 89542414 mov dword ptr [rsp + 0x14], edx -;; 14: c744241000000000 mov dword ptr [rsp + 0x10], 0 -;; 1c: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec20 sub rsp, 0x20 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f87e8000000 ja 0x100 +;; 18: 897c241c mov dword ptr [rsp + 0x1c], edi +;; 89742418 mov dword ptr [rsp + 0x18], esi +;; 89542414 mov dword ptr [rsp + 0x14], edx +;; c744241000000000 mov dword ptr [rsp + 0x10], 0 +;; 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 25: 4c893424 mov qword ptr [rsp], r14 -;; 29: 8b4c2418 mov ecx, dword ptr [rsp + 0x18] -;; 2d: 4c89f2 mov rdx, r14 -;; 30: 8b5a50 mov ebx, dword ptr [rdx + 0x50] -;; 33: 39d9 cmp ecx, ebx -;; 35: 0f8394000000 jae 0xcf -;; 3b: 4189cb mov r11d, ecx -;; 3e: 4d6bdb08 imul r11, r11, 8 -;; 42: 488b5248 mov rdx, qword ptr [rdx + 0x48] -;; 46: 4889d6 mov rsi, rdx -;; 49: 4c01da add rdx, r11 -;; 4c: 39d9 cmp ecx, ebx -;; 4e: 480f43d6 cmovae rdx, rsi -;; 52: 488b02 mov rax, qword ptr [rdx] -;; 55: 4885c0 test rax, rax -;; 58: 0f8532000000 jne 0x90 -;; 5e: 4d8b5e38 mov r11, qword ptr [r14 + 0x38] -;; 62: 498b5b48 mov rbx, qword ptr [r11 + 0x48] -;; 66: 4156 push r14 -;; 68: 4883ec04 sub rsp, 4 -;; 6c: 890c24 mov dword ptr [rsp], ecx -;; 6f: 4883ec04 sub rsp, 4 -;; 73: 488b7c2408 mov rdi, qword ptr [rsp + 8] -;; 78: be00000000 mov esi, 0 -;; 7d: 8b542404 mov edx, dword ptr [rsp + 4] -;; 81: ffd3 call rbx -;; 83: 4883c404 add rsp, 4 -;; 87: 4883c40c add rsp, 0xc -;; 8b: e904000000 jmp 0x94 -;; 90: 4883e0fe and rax, 0xfffffffffffffffe -;; 94: 488944240c mov qword ptr [rsp + 0xc], rax -;; 99: 4d8b5e38 mov r11, qword ptr [r14 + 0x38] -;; 9d: 498b4368 mov rax, qword ptr [r11 + 0x68] -;; a1: 4156 push r14 -;; a3: 4883ec08 sub rsp, 8 -;; a7: 488b7c2408 mov rdi, qword ptr [rsp + 8] -;; ac: be01000000 mov esi, 1 -;; b1: 8b54242c mov edx, dword ptr [rsp + 0x2c] -;; b5: 488b4c241c mov rcx, qword ptr [rsp + 0x1c] -;; ba: 448b442424 mov r8d, dword ptr [rsp + 0x24] -;; bf: ffd0 call rax -;; c1: 4883c408 add rsp, 8 -;; c5: 4883c408 add rsp, 8 -;; c9: 4883c420 add rsp, 0x20 -;; cd: 5d pop rbp -;; ce: c3 ret -;; cf: 0f0b ud2 +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b4c2418 mov ecx, dword ptr [rsp + 0x18] +;; 4c89f2 mov rdx, r14 +;; 8b5a50 mov ebx, dword ptr [rdx + 0x50] +;; 39d9 cmp ecx, ebx +;; 0f83b7000000 jae 0x102 +;; 4b: 4189cb mov r11d, ecx +;; 4d6bdb08 imul r11, r11, 8 +;; 488b5248 mov rdx, qword ptr [rdx + 0x48] +;; 4889d6 mov rsi, rdx +;; 4c01da add rdx, r11 +;; 39d9 cmp ecx, ebx +;; 480f43d6 cmovae rdx, rsi +;; 488b02 mov rax, qword ptr [rdx] +;; 4885c0 test rax, rax +;; 0f8532000000 jne 0xa0 +;; 6e: 4d8b5e38 mov r11, qword ptr [r14 + 0x38] +;; 498b5b48 mov rbx, qword ptr [r11 + 0x48] +;; 4156 push r14 +;; 4883ec04 sub rsp, 4 +;; 890c24 mov dword ptr [rsp], ecx +;; 4883ec04 sub rsp, 4 +;; 488b7c2408 mov rdi, qword ptr [rsp + 8] +;; be00000000 mov esi, 0 +;; 8b542404 mov edx, dword ptr [rsp + 4] +;; ffd3 call rbx +;; 4883c404 add rsp, 4 +;; 4883c40c add rsp, 0xc +;; e904000000 jmp 0xa4 +;; a0: 4883e0fe and rax, 0xfffffffffffffffe +;; 488944240c mov qword ptr [rsp + 0xc], rax +;; 4d8b5e38 mov r11, qword ptr [r14 + 0x38] +;; 498b4368 mov rax, qword ptr [r11 + 0x68] +;; 4156 push r14 +;; 448b5c2424 mov r11d, dword ptr [rsp + 0x24] +;; 4883ec04 sub rsp, 4 +;; 44891c24 mov dword ptr [rsp], r11d +;; 4c8b5c2418 mov r11, qword ptr [rsp + 0x18] +;; 4153 push r11 +;; 448b5c2428 mov r11d, dword ptr [rsp + 0x28] +;; 4883ec04 sub rsp, 4 +;; 44891c24 mov dword ptr [rsp], r11d +;; 4883ec08 sub rsp, 8 +;; 488b7c2418 mov rdi, qword ptr [rsp + 0x18] +;; be01000000 mov esi, 1 +;; 8b542414 mov edx, dword ptr [rsp + 0x14] +;; 488b4c240c mov rcx, qword ptr [rsp + 0xc] +;; 448b442408 mov r8d, dword ptr [rsp + 8] +;; ffd0 call rax +;; 4883c408 add rsp, 8 +;; 4883c418 add rsp, 0x18 +;; 4883c420 add rsp, 0x20 +;; 5d pop rbp +;; c3 ret +;; 100: 0f0b ud2 +;; 102: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/table/get.wat b/winch/filetests/filetests/x64/table/get.wat index 6259445a0ee1..a4db6cd031fb 100644 --- a/winch/filetests/filetests/x64/table/get.wat +++ b/winch/filetests/filetests/x64/table/get.wat @@ -9,49 +9,59 @@ ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 4c893424 mov qword ptr [rsp], r14 -;; 10: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 14: 4c89f2 mov rdx, r14 -;; 17: 8b5a50 mov ebx, dword ptr [rdx + 0x50] -;; 1a: 39d9 cmp ecx, ebx -;; 1c: 0f835f000000 jae 0x81 -;; 22: 4189cb mov r11d, ecx -;; 25: 4d6bdb08 imul r11, r11, 8 -;; 29: 488b5248 mov rdx, qword ptr [rdx + 0x48] -;; 2d: 4889d6 mov rsi, rdx -;; 30: 4c01da add rdx, r11 -;; 33: 39d9 cmp ecx, ebx -;; 35: 480f43d6 cmovae rdx, rsi -;; 39: 488b02 mov rax, qword ptr [rdx] -;; 3c: 4885c0 test rax, rax -;; 3f: 0f8532000000 jne 0x77 -;; 45: 4d8b5e38 mov r11, qword ptr [r14 + 0x38] -;; 49: 498b5b48 mov rbx, qword ptr [r11 + 0x48] -;; 4d: 4156 push r14 -;; 4f: 4883ec04 sub rsp, 4 -;; 53: 890c24 mov dword ptr [rsp], ecx -;; 56: 4883ec04 sub rsp, 4 -;; 5a: 488b7c2408 mov rdi, qword ptr [rsp + 8] -;; 5f: be00000000 mov esi, 0 -;; 64: 8b542404 mov edx, dword ptr [rsp + 4] -;; 68: ffd3 call rbx -;; 6a: 4883c404 add rsp, 4 -;; 6e: 4883c40c add rsp, 0xc -;; 72: e904000000 jmp 0x7b -;; 77: 4883e0fe and rax, 0xfffffffffffffffe -;; 7b: 4883c410 add rsp, 0x10 -;; 7f: 5d pop rbp -;; 80: c3 ret -;; 81: 0f0b ud2 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8779000000 ja 0x91 +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b4c240c mov ecx, dword ptr [rsp + 0xc] +;; 4c89f2 mov rdx, r14 +;; 8b5a50 mov ebx, dword ptr [rdx + 0x50] +;; 39d9 cmp ecx, ebx +;; 0f8361000000 jae 0x93 +;; 32: 4189cb mov r11d, ecx +;; 4d6bdb08 imul r11, r11, 8 +;; 488b5248 mov rdx, qword ptr [rdx + 0x48] +;; 4889d6 mov rsi, rdx +;; 4c01da add rdx, r11 +;; 39d9 cmp ecx, ebx +;; 480f43d6 cmovae rdx, rsi +;; 488b02 mov rax, qword ptr [rdx] +;; 4885c0 test rax, rax +;; 0f8532000000 jne 0x87 +;; 55: 4d8b5e38 mov r11, qword ptr [r14 + 0x38] +;; 498b5b48 mov rbx, qword ptr [r11 + 0x48] +;; 4156 push r14 +;; 4883ec04 sub rsp, 4 +;; 890c24 mov dword ptr [rsp], ecx +;; 4883ec04 sub rsp, 4 +;; 488b7c2408 mov rdi, qword ptr [rsp + 8] +;; be00000000 mov esi, 0 +;; 8b542404 mov edx, dword ptr [rsp + 4] +;; ffd3 call rbx +;; 4883c404 add rsp, 4 +;; 4883c40c add rsp, 0xc +;; e904000000 jmp 0x8b +;; 87: 4883e0fe and rax, 0xfffffffffffffffe +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 91: 0f0b ud2 +;; 93: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/table/grow.wat b/winch/filetests/filetests/x64/table/grow.wat index 0556947604a7..777154023c0f 100644 --- a/winch/filetests/filetests/x64/table/grow.wat +++ b/winch/filetests/filetests/x64/table/grow.wat @@ -9,22 +9,27 @@ ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48897c2408 mov qword ptr [rsp + 8], rdi -;; d: 4c893424 mov qword ptr [rsp], r14 -;; 11: 4d8b5e38 mov r11, qword ptr [r14 + 0x38] -;; 15: 498b5b50 mov rbx, qword ptr [r11 + 0x50] -;; 19: 4156 push r14 -;; 1b: 4883ec08 sub rsp, 8 -;; 1f: 488b7c2408 mov rdi, qword ptr [rsp + 8] -;; 24: be00000000 mov esi, 0 -;; 29: ba0a000000 mov edx, 0xa -;; 2e: 488b4c2418 mov rcx, qword ptr [rsp + 0x18] -;; 33: ffd3 call rbx -;; 35: 4883c408 add rsp, 8 -;; 39: 4883c408 add rsp, 8 -;; 3d: 4883c410 add rsp, 0x10 -;; 41: 5d pop rbp -;; 42: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8739000000 ja 0x51 +;; 18: 48897c2408 mov qword ptr [rsp + 8], rdi +;; 4c893424 mov qword ptr [rsp], r14 +;; 4d8b5e38 mov r11, qword ptr [r14 + 0x38] +;; 498b5b50 mov rbx, qword ptr [r11 + 0x50] +;; 4156 push r14 +;; 4c8b5c2410 mov r11, qword ptr [rsp + 0x10] +;; 4153 push r11 +;; 488b7c2408 mov rdi, qword ptr [rsp + 8] +;; be00000000 mov esi, 0 +;; ba0a000000 mov edx, 0xa +;; 488b0c24 mov rcx, qword ptr [rsp] +;; ffd3 call rbx +;; 4883c410 add rsp, 0x10 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 51: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/table/init_copy_drop.wat b/winch/filetests/filetests/x64/table/init_copy_drop.wat index 4de4cf38b4b9..2e28e5188619 100644 --- a/winch/filetests/filetests/x64/table/init_copy_drop.wat +++ b/winch/filetests/filetests/x64/table/init_copy_drop.wat @@ -33,198 +33,237 @@ (func (export "check") (param i32) (result i32) (call_indirect $t0 (type 0) (local.get 0))) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b805000000 mov eax, 5 -;; 11: 4883c408 add rsp, 8 -;; 15: 5d pop rbp -;; 16: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870f000000 ja 0x27 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b805000000 mov eax, 5 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 27: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b806000000 mov eax, 6 -;; 11: 4883c408 add rsp, 8 -;; 15: 5d pop rbp -;; 16: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870f000000 ja 0x27 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b806000000 mov eax, 6 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 27: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b807000000 mov eax, 7 -;; 11: 4883c408 add rsp, 8 -;; 15: 5d pop rbp -;; 16: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870f000000 ja 0x27 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b807000000 mov eax, 7 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 27: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b808000000 mov eax, 8 -;; 11: 4883c408 add rsp, 8 -;; 15: 5d pop rbp -;; 16: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870f000000 ja 0x27 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b808000000 mov eax, 8 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 27: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: b809000000 mov eax, 9 -;; 11: 4883c408 add rsp, 8 -;; 15: 5d pop rbp -;; 16: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870f000000 ja 0x27 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; b809000000 mov eax, 9 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 27: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4d8b5e38 mov r11, qword ptr [r14 + 0x38] -;; 10: 498b4310 mov rax, qword ptr [r11 + 0x10] -;; 14: 4156 push r14 -;; 16: 488b3c24 mov rdi, qword ptr [rsp] -;; 1a: be00000000 mov esi, 0 -;; 1f: ba01000000 mov edx, 1 -;; 24: b907000000 mov ecx, 7 -;; 29: 41b800000000 mov r8d, 0 -;; 2f: 41b904000000 mov r9d, 4 -;; 35: ffd0 call rax -;; 37: 4883c408 add rsp, 8 -;; 3b: 4d8b5e38 mov r11, qword ptr [r14 + 0x38] -;; 3f: 498b4318 mov rax, qword ptr [r11 + 0x18] -;; 43: 4156 push r14 -;; 45: 488b3c24 mov rdi, qword ptr [rsp] -;; 49: be01000000 mov esi, 1 -;; 4e: ffd0 call rax -;; 50: 4883c408 add rsp, 8 -;; 54: 4d8b5e38 mov r11, qword ptr [r14 + 0x38] -;; 58: 498b4310 mov rax, qword ptr [r11 + 0x10] -;; 5c: 4156 push r14 -;; 5e: 488b3c24 mov rdi, qword ptr [rsp] -;; 62: be00000000 mov esi, 0 -;; 67: ba03000000 mov edx, 3 -;; 6c: b90f000000 mov ecx, 0xf -;; 71: 41b801000000 mov r8d, 1 -;; 77: 41b903000000 mov r9d, 3 -;; 7d: ffd0 call rax -;; 7f: 4883c408 add rsp, 8 -;; 83: 4d8b5e38 mov r11, qword ptr [r14 + 0x38] -;; 87: 498b4318 mov rax, qword ptr [r11 + 0x18] -;; 8b: 4156 push r14 -;; 8d: 488b3c24 mov rdi, qword ptr [rsp] -;; 91: be03000000 mov esi, 3 -;; 96: ffd0 call rax -;; 98: 4883c408 add rsp, 8 -;; 9c: 4d8b5e38 mov r11, qword ptr [r14 + 0x38] -;; a0: 498b4308 mov rax, qword ptr [r11 + 8] -;; a4: 4156 push r14 -;; a6: 488b3c24 mov rdi, qword ptr [rsp] -;; aa: be00000000 mov esi, 0 -;; af: ba00000000 mov edx, 0 -;; b4: b914000000 mov ecx, 0x14 -;; b9: 41b80f000000 mov r8d, 0xf -;; bf: 41b905000000 mov r9d, 5 -;; c5: ffd0 call rax -;; c7: 4883c408 add rsp, 8 -;; cb: 4d8b5e38 mov r11, qword ptr [r14 + 0x38] -;; cf: 498b4308 mov rax, qword ptr [r11 + 8] -;; d3: 4156 push r14 -;; d5: 488b3c24 mov rdi, qword ptr [rsp] -;; d9: be00000000 mov esi, 0 -;; de: ba00000000 mov edx, 0 -;; e3: b915000000 mov ecx, 0x15 -;; e8: 41b81d000000 mov r8d, 0x1d -;; ee: 41b901000000 mov r9d, 1 -;; f4: ffd0 call rax -;; f6: 4883c408 add rsp, 8 -;; fa: 4d8b5e38 mov r11, qword ptr [r14 + 0x38] -;; fe: 498b4308 mov rax, qword ptr [r11 + 8] -;; 102: 4156 push r14 -;; 104: 488b3c24 mov rdi, qword ptr [rsp] -;; 108: be00000000 mov esi, 0 -;; 10d: ba00000000 mov edx, 0 -;; 112: b918000000 mov ecx, 0x18 -;; 117: 41b80a000000 mov r8d, 0xa -;; 11d: 41b901000000 mov r9d, 1 -;; 123: ffd0 call rax -;; 125: 4883c408 add rsp, 8 -;; 129: 4d8b5e38 mov r11, qword ptr [r14 + 0x38] -;; 12d: 498b4308 mov rax, qword ptr [r11 + 8] -;; 131: 4156 push r14 -;; 133: 488b3c24 mov rdi, qword ptr [rsp] -;; 137: be00000000 mov esi, 0 -;; 13c: ba00000000 mov edx, 0 -;; 141: b90d000000 mov ecx, 0xd -;; 146: 41b80b000000 mov r8d, 0xb -;; 14c: 41b904000000 mov r9d, 4 -;; 152: ffd0 call rax -;; 154: 4883c408 add rsp, 8 -;; 158: 4d8b5e38 mov r11, qword ptr [r14 + 0x38] -;; 15c: 498b4308 mov rax, qword ptr [r11 + 8] -;; 160: 4156 push r14 -;; 162: 488b3c24 mov rdi, qword ptr [rsp] -;; 166: be00000000 mov esi, 0 -;; 16b: ba00000000 mov edx, 0 -;; 170: b913000000 mov ecx, 0x13 -;; 175: 41b814000000 mov r8d, 0x14 -;; 17b: 41b905000000 mov r9d, 5 -;; 181: ffd0 call rax -;; 183: 4883c408 add rsp, 8 -;; 187: 4883c408 add rsp, 8 -;; 18b: 5d pop rbp -;; 18c: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8785010000 ja 0x19d +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4d8b5e38 mov r11, qword ptr [r14 + 0x38] +;; 498b4310 mov rax, qword ptr [r11 + 0x10] +;; 4156 push r14 +;; 488b3c24 mov rdi, qword ptr [rsp] +;; be00000000 mov esi, 0 +;; ba01000000 mov edx, 1 +;; b907000000 mov ecx, 7 +;; 41b800000000 mov r8d, 0 +;; 41b904000000 mov r9d, 4 +;; ffd0 call rax +;; 4883c408 add rsp, 8 +;; 4d8b5e38 mov r11, qword ptr [r14 + 0x38] +;; 498b4318 mov rax, qword ptr [r11 + 0x18] +;; 4156 push r14 +;; 488b3c24 mov rdi, qword ptr [rsp] +;; be01000000 mov esi, 1 +;; ffd0 call rax +;; 4883c408 add rsp, 8 +;; 4d8b5e38 mov r11, qword ptr [r14 + 0x38] +;; 498b4310 mov rax, qword ptr [r11 + 0x10] +;; 4156 push r14 +;; 488b3c24 mov rdi, qword ptr [rsp] +;; be00000000 mov esi, 0 +;; ba03000000 mov edx, 3 +;; b90f000000 mov ecx, 0xf +;; 41b801000000 mov r8d, 1 +;; 41b903000000 mov r9d, 3 +;; ffd0 call rax +;; 4883c408 add rsp, 8 +;; 4d8b5e38 mov r11, qword ptr [r14 + 0x38] +;; 498b4318 mov rax, qword ptr [r11 + 0x18] +;; 4156 push r14 +;; 488b3c24 mov rdi, qword ptr [rsp] +;; be03000000 mov esi, 3 +;; ffd0 call rax +;; 4883c408 add rsp, 8 +;; 4d8b5e38 mov r11, qword ptr [r14 + 0x38] +;; 498b4308 mov rax, qword ptr [r11 + 8] +;; 4156 push r14 +;; 488b3c24 mov rdi, qword ptr [rsp] +;; be00000000 mov esi, 0 +;; ba00000000 mov edx, 0 +;; b914000000 mov ecx, 0x14 +;; 41b80f000000 mov r8d, 0xf +;; 41b905000000 mov r9d, 5 +;; ffd0 call rax +;; 4883c408 add rsp, 8 +;; 4d8b5e38 mov r11, qword ptr [r14 + 0x38] +;; 498b4308 mov rax, qword ptr [r11 + 8] +;; 4156 push r14 +;; 488b3c24 mov rdi, qword ptr [rsp] +;; be00000000 mov esi, 0 +;; ba00000000 mov edx, 0 +;; b915000000 mov ecx, 0x15 +;; 41b81d000000 mov r8d, 0x1d +;; 41b901000000 mov r9d, 1 +;; ffd0 call rax +;; 4883c408 add rsp, 8 +;; 4d8b5e38 mov r11, qword ptr [r14 + 0x38] +;; 498b4308 mov rax, qword ptr [r11 + 8] +;; 4156 push r14 +;; 488b3c24 mov rdi, qword ptr [rsp] +;; be00000000 mov esi, 0 +;; ba00000000 mov edx, 0 +;; b918000000 mov ecx, 0x18 +;; 41b80a000000 mov r8d, 0xa +;; 41b901000000 mov r9d, 1 +;; ffd0 call rax +;; 4883c408 add rsp, 8 +;; 4d8b5e38 mov r11, qword ptr [r14 + 0x38] +;; 498b4308 mov rax, qword ptr [r11 + 8] +;; 4156 push r14 +;; 488b3c24 mov rdi, qword ptr [rsp] +;; be00000000 mov esi, 0 +;; ba00000000 mov edx, 0 +;; b90d000000 mov ecx, 0xd +;; 41b80b000000 mov r8d, 0xb +;; 41b904000000 mov r9d, 4 +;; ffd0 call rax +;; 4883c408 add rsp, 8 +;; 4d8b5e38 mov r11, qword ptr [r14 + 0x38] +;; 498b4308 mov rax, qword ptr [r11 + 8] +;; 4156 push r14 +;; 488b3c24 mov rdi, qword ptr [rsp] +;; be00000000 mov esi, 0 +;; ba00000000 mov edx, 0 +;; b913000000 mov ecx, 0x13 +;; 41b814000000 mov r8d, 0x14 +;; 41b905000000 mov r9d, 5 +;; ffd0 call rax +;; 4883c408 add rsp, 8 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 19d: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 4c893424 mov qword ptr [rsp], r14 -;; 10: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 14: 4c89f2 mov rdx, r14 -;; 17: 8b9af0000000 mov ebx, dword ptr [rdx + 0xf0] -;; 1d: 39d9 cmp ecx, ebx -;; 1f: 0f8385000000 jae 0xaa -;; 25: 4189cb mov r11d, ecx -;; 28: 4d6bdb08 imul r11, r11, 8 -;; 2c: 488b92e8000000 mov rdx, qword ptr [rdx + 0xe8] -;; 33: 4889d6 mov rsi, rdx -;; 36: 4c01da add rdx, r11 -;; 39: 39d9 cmp ecx, ebx -;; 3b: 480f43d6 cmovae rdx, rsi -;; 3f: 488b02 mov rax, qword ptr [rdx] -;; 42: 4885c0 test rax, rax -;; 45: 0f8532000000 jne 0x7d -;; 4b: 4d8b5e38 mov r11, qword ptr [r14 + 0x38] -;; 4f: 498b5b48 mov rbx, qword ptr [r11 + 0x48] -;; 53: 4156 push r14 -;; 55: 4883ec04 sub rsp, 4 -;; 59: 890c24 mov dword ptr [rsp], ecx -;; 5c: 4883ec04 sub rsp, 4 -;; 60: 488b7c2408 mov rdi, qword ptr [rsp + 8] -;; 65: be00000000 mov esi, 0 -;; 6a: 8b542404 mov edx, dword ptr [rsp + 4] -;; 6e: ffd3 call rbx -;; 70: 4883c404 add rsp, 4 -;; 74: 4883c40c add rsp, 0xc -;; 78: e904000000 jmp 0x81 -;; 7d: 4883e0fe and rax, 0xfffffffffffffffe -;; 81: 4885c0 test rax, rax -;; 84: 0f8422000000 je 0xac -;; 8a: 4d8b5e40 mov r11, qword ptr [r14 + 0x40] -;; 8e: 418b0b mov ecx, dword ptr [r11] -;; 91: 8b5018 mov edx, dword ptr [rax + 0x18] -;; 94: 39d1 cmp ecx, edx -;; 96: 0f8512000000 jne 0xae -;; 9c: 50 push rax -;; 9d: 59 pop rcx -;; 9e: 488b5110 mov rdx, qword ptr [rcx + 0x10] -;; a2: ffd2 call rdx -;; a4: 4883c410 add rsp, 0x10 -;; a8: 5d pop rbp -;; a9: c3 ret -;; aa: 0f0b ud2 -;; ac: 0f0b ud2 -;; ae: 0f0b ud2 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f87b2000000 ja 0xca +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 4c893424 mov qword ptr [rsp], r14 +;; 448b5c240c mov r11d, dword ptr [rsp + 0xc] +;; 4883ec04 sub rsp, 4 +;; 44891c24 mov dword ptr [rsp], r11d +;; 8b0c24 mov ecx, dword ptr [rsp] +;; 4883c404 add rsp, 4 +;; 4c89f2 mov rdx, r14 +;; 8b9af0000000 mov ebx, dword ptr [rdx + 0xf0] +;; 39d9 cmp ecx, ebx +;; 0f8387000000 jae 0xcc +;; 45: 4189cb mov r11d, ecx +;; 4d6bdb08 imul r11, r11, 8 +;; 488b92e8000000 mov rdx, qword ptr [rdx + 0xe8] +;; 4889d6 mov rsi, rdx +;; 4c01da add rdx, r11 +;; 39d9 cmp ecx, ebx +;; 480f43d6 cmovae rdx, rsi +;; 488b02 mov rax, qword ptr [rdx] +;; 4885c0 test rax, rax +;; 0f8532000000 jne 0x9d +;; 6b: 4d8b5e38 mov r11, qword ptr [r14 + 0x38] +;; 498b5b48 mov rbx, qword ptr [r11 + 0x48] +;; 4156 push r14 +;; 4883ec04 sub rsp, 4 +;; 890c24 mov dword ptr [rsp], ecx +;; 4883ec04 sub rsp, 4 +;; 488b7c2408 mov rdi, qword ptr [rsp + 8] +;; be00000000 mov esi, 0 +;; 8b542404 mov edx, dword ptr [rsp + 4] +;; ffd3 call rbx +;; 4883c404 add rsp, 4 +;; 4883c40c add rsp, 0xc +;; e904000000 jmp 0xa1 +;; 9d: 4883e0fe and rax, 0xfffffffffffffffe +;; 4885c0 test rax, rax +;; 0f8424000000 je 0xce +;; aa: 4d8b5e40 mov r11, qword ptr [r14 + 0x40] +;; 418b0b mov ecx, dword ptr [r11] +;; 8b5018 mov edx, dword ptr [rax + 0x18] +;; 39d1 cmp ecx, edx +;; 0f8514000000 jne 0xd0 +;; bc: 50 push rax +;; 59 pop rcx +;; 488b5110 mov rdx, qword ptr [rcx + 0x10] +;; ffd2 call rdx +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; ca: 0f0b ud2 +;; cc: 0f0b ud2 +;; ce: 0f0b ud2 +;; d0: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/table/set.wat b/winch/filetests/filetests/x64/table/set.wat index 1c39c1a79d66..3d4ecb740d98 100644 --- a/winch/filetests/filetests/x64/table/set.wat +++ b/winch/filetests/filetests/x64/table/set.wat @@ -14,91 +14,108 @@ ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 897c2414 mov dword ptr [rsp + 0x14], edi -;; c: 4889742408 mov qword ptr [rsp + 8], rsi -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: 488b442408 mov rax, qword ptr [rsp + 8] -;; 1a: 8b4c2414 mov ecx, dword ptr [rsp + 0x14] -;; 1e: 4c89f2 mov rdx, r14 -;; 21: 8b5a50 mov ebx, dword ptr [rdx + 0x50] -;; 24: 39d9 cmp ecx, ebx -;; 26: 0f8324000000 jae 0x50 -;; 2c: 4189cb mov r11d, ecx -;; 2f: 4d6bdb08 imul r11, r11, 8 -;; 33: 488b5248 mov rdx, qword ptr [rdx + 0x48] -;; 37: 4889d6 mov rsi, rdx -;; 3a: 4c01da add rdx, r11 -;; 3d: 39d9 cmp ecx, ebx -;; 3f: 480f43d6 cmovae rdx, rsi -;; 43: 4883c801 or rax, 1 -;; 47: 488902 mov qword ptr [rdx], rax -;; 4a: 4883c418 add rsp, 0x18 -;; 4e: 5d pop rbp -;; 4f: c3 ret -;; 50: 0f0b ud2 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8748000000 ja 0x60 +;; 18: 897c2414 mov dword ptr [rsp + 0x14], edi +;; 4889742408 mov qword ptr [rsp + 8], rsi +;; 4c893424 mov qword ptr [rsp], r14 +;; 488b442408 mov rax, qword ptr [rsp + 8] +;; 8b4c2414 mov ecx, dword ptr [rsp + 0x14] +;; 4c89f2 mov rdx, r14 +;; 8b5a50 mov ebx, dword ptr [rdx + 0x50] +;; 39d9 cmp ecx, ebx +;; 0f8326000000 jae 0x62 +;; 3c: 4189cb mov r11d, ecx +;; 4d6bdb08 imul r11, r11, 8 +;; 488b5248 mov rdx, qword ptr [rdx + 0x48] +;; 4889d6 mov rsi, rdx +;; 4c01da add rdx, r11 +;; 39d9 cmp ecx, ebx +;; 480f43d6 cmovae rdx, rsi +;; 4883c801 or rax, 1 +;; 488902 mov qword ptr [rdx], rax +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 60: 0f0b ud2 +;; 62: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b4c2408 mov ecx, dword ptr [rsp + 8] -;; 18: 4c89f2 mov rdx, r14 -;; 1b: 8b5a50 mov ebx, dword ptr [rdx + 0x50] -;; 1e: 39d9 cmp ecx, ebx -;; 20: 0f838f000000 jae 0xb5 -;; 26: 4189cb mov r11d, ecx -;; 29: 4d6bdb08 imul r11, r11, 8 -;; 2d: 488b5248 mov rdx, qword ptr [rdx + 0x48] -;; 31: 4889d6 mov rsi, rdx -;; 34: 4c01da add rdx, r11 -;; 37: 39d9 cmp ecx, ebx -;; 39: 480f43d6 cmovae rdx, rsi -;; 3d: 488b02 mov rax, qword ptr [rdx] -;; 40: 4885c0 test rax, rax -;; 43: 0f8532000000 jne 0x7b -;; 49: 4d8b5e38 mov r11, qword ptr [r14 + 0x38] -;; 4d: 498b5b48 mov rbx, qword ptr [r11 + 0x48] -;; 51: 4156 push r14 -;; 53: 4883ec04 sub rsp, 4 -;; 57: 890c24 mov dword ptr [rsp], ecx -;; 5a: 4883ec04 sub rsp, 4 -;; 5e: 488b7c2408 mov rdi, qword ptr [rsp + 8] -;; 63: be00000000 mov esi, 0 -;; 68: 8b542404 mov edx, dword ptr [rsp + 4] -;; 6c: ffd3 call rbx -;; 6e: 4883c404 add rsp, 4 -;; 72: 4883c40c add rsp, 0xc -;; 76: e904000000 jmp 0x7f -;; 7b: 4883e0fe and rax, 0xfffffffffffffffe -;; 7f: 8b4c240c mov ecx, dword ptr [rsp + 0xc] -;; 83: 4c89f2 mov rdx, r14 -;; 86: 8b5a50 mov ebx, dword ptr [rdx + 0x50] -;; 89: 39d9 cmp ecx, ebx -;; 8b: 0f8326000000 jae 0xb7 -;; 91: 4189cb mov r11d, ecx -;; 94: 4d6bdb08 imul r11, r11, 8 -;; 98: 488b5248 mov rdx, qword ptr [rdx + 0x48] -;; 9c: 4889d6 mov rsi, rdx -;; 9f: 4c01da add rdx, r11 -;; a2: 39d9 cmp ecx, ebx -;; a4: 480f43d6 cmovae rdx, rsi -;; a8: 4883c801 or rax, 1 -;; ac: 488902 mov qword ptr [rdx], rax -;; af: 4883c410 add rsp, 0x10 -;; b3: 5d pop rbp -;; b4: c3 ret -;; b5: 0f0b ud2 -;; b7: 0f0b ud2 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f87b4000000 ja 0xcc +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b4c2408 mov ecx, dword ptr [rsp + 8] +;; 4c89f2 mov rdx, r14 +;; 8b5a50 mov ebx, dword ptr [rdx + 0x50] +;; 39d9 cmp ecx, ebx +;; 0f8398000000 jae 0xce +;; 36: 4189cb mov r11d, ecx +;; 4d6bdb08 imul r11, r11, 8 +;; 488b5248 mov rdx, qword ptr [rdx + 0x48] +;; 4889d6 mov rsi, rdx +;; 4c01da add rdx, r11 +;; 39d9 cmp ecx, ebx +;; 480f43d6 cmovae rdx, rsi +;; 488b02 mov rax, qword ptr [rdx] +;; 4885c0 test rax, rax +;; 0f8536000000 jne 0x8f +;; 59: 4d8b5e38 mov r11, qword ptr [r14 + 0x38] +;; 498b5b48 mov rbx, qword ptr [r11 + 0x48] +;; 448b5c240c mov r11d, dword ptr [rsp + 0xc] +;; 4883ec04 sub rsp, 4 +;; 44891c24 mov dword ptr [rsp], r11d +;; 4156 push r14 +;; 4883ec04 sub rsp, 4 +;; 890c24 mov dword ptr [rsp], ecx +;; 488b7c2404 mov rdi, qword ptr [rsp + 4] +;; be00000000 mov esi, 0 +;; 8b1424 mov edx, dword ptr [rsp] +;; ffd3 call rbx +;; 4883c40c add rsp, 0xc +;; e904000000 jmp 0x93 +;; 8f: 4883e0fe and rax, 0xfffffffffffffffe +;; 8b0c24 mov ecx, dword ptr [rsp] +;; 4883c404 add rsp, 4 +;; 4c89f2 mov rdx, r14 +;; 8b5a50 mov ebx, dword ptr [rdx + 0x50] +;; 39d9 cmp ecx, ebx +;; 0f8328000000 jae 0xd0 +;; a8: 4189cb mov r11d, ecx +;; 4d6bdb08 imul r11, r11, 8 +;; 488b5248 mov rdx, qword ptr [rdx + 0x48] +;; 4889d6 mov rsi, rdx +;; 4c01da add rdx, r11 +;; 39d9 cmp ecx, ebx +;; 480f43d6 cmovae rdx, rsi +;; 4883c801 or rax, 1 +;; 488902 mov qword ptr [rdx], rax +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; cc: 0f0b ud2 +;; ce: 0f0b ud2 +;; d0: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/table/size.wat b/winch/filetests/filetests/x64/table/size.wat index 8c0f47f0ace2..6e477aa5a173 100644 --- a/winch/filetests/filetests/x64/table/size.wat +++ b/winch/filetests/filetests/x64/table/size.wat @@ -4,12 +4,17 @@ (func (export "size") (result i32) (table.size $t1)) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4d89f3 mov r11, r14 -;; f: 418b4350 mov eax, dword ptr [r11 + 0x50] -;; 13: 4883c408 add rsp, 8 -;; 17: 5d pop rbp -;; 18: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8711000000 ja 0x29 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4d89f3 mov r11, r14 +;; 418b4350 mov eax, dword ptr [r11 + 0x50] +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 29: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/unreachable/as_block_broke.wat b/winch/filetests/filetests/x64/unreachable/as_block_broke.wat index e79cec6d8ebe..06f5343897de 100644 --- a/winch/filetests/filetests/x64/unreachable/as_block_broke.wat +++ b/winch/filetests/filetests/x64/unreachable/as_block_broke.wat @@ -6,22 +6,32 @@ (block (result i32) (call $dummy) (br 0 (i32.const 1)) (unreachable)) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883ec08 sub rsp, 8 -;; 10: e800000000 call 0x15 -;; 15: 4883c408 add rsp, 8 -;; 19: b801000000 mov eax, 1 -;; 1e: 4883c408 add rsp, 8 -;; 22: 5d pop rbp -;; 23: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871c000000 ja 0x34 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x25 +;; 4883c408 add rsp, 8 +;; b801000000 mov eax, 1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 34: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/unreachable/as_block_first.wat b/winch/filetests/filetests/x64/unreachable/as_block_first.wat index 9aa1aadd5e43..4c3f0dde47ef 100644 --- a/winch/filetests/filetests/x64/unreachable/as_block_first.wat +++ b/winch/filetests/filetests/x64/unreachable/as_block_first.wat @@ -4,11 +4,16 @@ (block (result i32) (unreachable) (i32.const 2)) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 0f0b ud2 -;; e: 4883c408 add rsp, 8 -;; 12: 5d pop rbp -;; 13: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870c000000 ja 0x24 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 0f0b ud2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 24: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/unreachable/as_block_last.wat b/winch/filetests/filetests/x64/unreachable/as_block_last.wat index ae9b1fdf6939..1170939ae9e1 100644 --- a/winch/filetests/filetests/x64/unreachable/as_block_last.wat +++ b/winch/filetests/filetests/x64/unreachable/as_block_last.wat @@ -5,22 +5,32 @@ (block (nop) (call $dummy) (unreachable)) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883ec08 sub rsp, 8 -;; 10: e800000000 call 0x15 -;; 15: 4883c408 add rsp, 8 -;; 19: 0f0b ud2 -;; 1b: 4883c408 add rsp, 8 -;; 1f: 5d pop rbp -;; 20: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8719000000 ja 0x31 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x25 +;; 4883c408 add rsp, 8 +;; 0f0b ud2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 31: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/unreachable/as_block_mid.wat b/winch/filetests/filetests/x64/unreachable/as_block_mid.wat index 68bc648f368a..44c9a62af0b4 100644 --- a/winch/filetests/filetests/x64/unreachable/as_block_mid.wat +++ b/winch/filetests/filetests/x64/unreachable/as_block_mid.wat @@ -6,22 +6,32 @@ (block (result i32) (call $dummy) (unreachable) (i32.const 2)) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883ec08 sub rsp, 8 -;; 10: e800000000 call 0x15 -;; 15: 4883c408 add rsp, 8 -;; 19: 0f0b ud2 -;; 1b: 4883c408 add rsp, 8 -;; 1f: 5d pop rbp -;; 20: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8719000000 ja 0x31 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x25 +;; 4883c408 add rsp, 8 +;; 0f0b ud2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 31: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/unreachable/as_block_value.wat b/winch/filetests/filetests/x64/unreachable/as_block_value.wat index 59d644a44ca6..ee6f2ba2623e 100644 --- a/winch/filetests/filetests/x64/unreachable/as_block_value.wat +++ b/winch/filetests/filetests/x64/unreachable/as_block_value.wat @@ -5,22 +5,32 @@ (block (result i32) (nop) (call $dummy) (unreachable)) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883ec08 sub rsp, 8 -;; 10: e800000000 call 0x15 -;; 15: 4883c408 add rsp, 8 -;; 19: 0f0b ud2 -;; 1b: 4883c408 add rsp, 8 -;; 1f: 5d pop rbp -;; 20: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8719000000 ja 0x31 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x25 +;; 4883c408 add rsp, 8 +;; 0f0b ud2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 31: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/unreachable/as_br_if_cond.wat b/winch/filetests/filetests/x64/unreachable/as_br_if_cond.wat index cf89065332bf..0f11a05c3d76 100644 --- a/winch/filetests/filetests/x64/unreachable/as_br_if_cond.wat +++ b/winch/filetests/filetests/x64/unreachable/as_br_if_cond.wat @@ -5,11 +5,16 @@ (block (br_if 0 (unreachable))) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 0f0b ud2 -;; e: 4883c408 add rsp, 8 -;; 12: 5d pop rbp -;; 13: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870c000000 ja 0x24 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 0f0b ud2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 24: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/unreachable/as_br_value.wat b/winch/filetests/filetests/x64/unreachable/as_br_value.wat index 851f9000d4e3..3132e27bd554 100644 --- a/winch/filetests/filetests/x64/unreachable/as_br_value.wat +++ b/winch/filetests/filetests/x64/unreachable/as_br_value.wat @@ -5,11 +5,16 @@ (block (result i32) (br 0 (unreachable))) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 0f0b ud2 -;; e: 4883c408 add rsp, 8 -;; 12: 5d pop rbp -;; 13: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870c000000 ja 0x24 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 0f0b ud2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 24: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/unreachable/as_call_first.wat b/winch/filetests/filetests/x64/unreachable/as_call_first.wat index b348d5c1b390..b78b75d8122f 100644 --- a/winch/filetests/filetests/x64/unreachable/as_call_first.wat +++ b/winch/filetests/filetests/x64/unreachable/as_call_first.wat @@ -6,22 +6,32 @@ (call $dummy3 (unreachable) (i32.const 2) (i32.const 3)) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 897c2414 mov dword ptr [rsp + 0x14], edi -;; c: 89742410 mov dword ptr [rsp + 0x10], esi -;; 10: 8954240c mov dword ptr [rsp + 0xc], edx -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: 4883c418 add rsp, 0x18 -;; 1c: 5d pop rbp -;; 1d: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8716000000 ja 0x2e +;; 18: 897c2414 mov dword ptr [rsp + 0x14], edi +;; 89742410 mov dword ptr [rsp + 0x10], esi +;; 8954240c mov dword ptr [rsp + 0xc], edx +;; 4c893424 mov qword ptr [rsp], r14 +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 2e: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 0f0b ud2 -;; e: 4883c408 add rsp, 8 -;; 12: 5d pop rbp -;; 13: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870c000000 ja 0x24 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 0f0b ud2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 24: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/unreachable/as_call_last.wat b/winch/filetests/filetests/x64/unreachable/as_call_last.wat index 0767ebeaf349..a010acf6c54b 100644 --- a/winch/filetests/filetests/x64/unreachable/as_call_last.wat +++ b/winch/filetests/filetests/x64/unreachable/as_call_last.wat @@ -7,22 +7,32 @@ (call $dummy3 (i32.const 1) (i32.const 2) (unreachable)) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 897c2414 mov dword ptr [rsp + 0x14], edi -;; c: 89742410 mov dword ptr [rsp + 0x10], esi -;; 10: 8954240c mov dword ptr [rsp + 0xc], edx -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: 4883c418 add rsp, 0x18 -;; 1c: 5d pop rbp -;; 1d: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8716000000 ja 0x2e +;; 18: 897c2414 mov dword ptr [rsp + 0x14], edi +;; 89742410 mov dword ptr [rsp + 0x10], esi +;; 8954240c mov dword ptr [rsp + 0xc], edx +;; 4c893424 mov qword ptr [rsp], r14 +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 2e: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 0f0b ud2 -;; e: 4883c408 add rsp, 8 -;; 12: 5d pop rbp -;; 13: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870c000000 ja 0x24 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 0f0b ud2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 24: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/unreachable/as_call_mid.wat b/winch/filetests/filetests/x64/unreachable/as_call_mid.wat index c40d76b903ee..8af5fe51c0f9 100644 --- a/winch/filetests/filetests/x64/unreachable/as_call_mid.wat +++ b/winch/filetests/filetests/x64/unreachable/as_call_mid.wat @@ -6,22 +6,32 @@ (call $dummy3 (i32.const 1) (unreachable) (i32.const 3)) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec18 sub rsp, 0x18 -;; 8: 897c2414 mov dword ptr [rsp + 0x14], edi -;; c: 89742410 mov dword ptr [rsp + 0x10], esi -;; 10: 8954240c mov dword ptr [rsp + 0xc], edx -;; 14: 4c893424 mov qword ptr [rsp], r14 -;; 18: 4883c418 add rsp, 0x18 -;; 1c: 5d pop rbp -;; 1d: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec18 sub rsp, 0x18 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8716000000 ja 0x2e +;; 18: 897c2414 mov dword ptr [rsp + 0x14], edi +;; 89742410 mov dword ptr [rsp + 0x10], esi +;; 8954240c mov dword ptr [rsp + 0xc], edx +;; 4c893424 mov qword ptr [rsp], r14 +;; 4883c418 add rsp, 0x18 +;; 5d pop rbp +;; c3 ret +;; 2e: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 0f0b ud2 -;; e: 4883c408 add rsp, 8 -;; 12: 5d pop rbp -;; 13: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870c000000 ja 0x24 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 0f0b ud2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 24: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/unreachable/as_func_first.wat b/winch/filetests/filetests/x64/unreachable/as_func_first.wat index 34b86a4cb8ed..5d3baf182ee4 100644 --- a/winch/filetests/filetests/x64/unreachable/as_func_first.wat +++ b/winch/filetests/filetests/x64/unreachable/as_func_first.wat @@ -5,19 +5,29 @@ (unreachable) (i32.const -1) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 0f0b ud2 -;; e: 4883c408 add rsp, 8 -;; 12: 5d pop rbp -;; 13: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870c000000 ja 0x24 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 0f0b ud2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 24: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/unreachable/as_func_last.wat b/winch/filetests/filetests/x64/unreachable/as_func_last.wat index c77c2fd86e1c..a98f03a50c90 100644 --- a/winch/filetests/filetests/x64/unreachable/as_func_last.wat +++ b/winch/filetests/filetests/x64/unreachable/as_func_last.wat @@ -5,22 +5,32 @@ (call $dummy) (unreachable) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883ec08 sub rsp, 8 -;; 10: e800000000 call 0x15 -;; 15: 4883c408 add rsp, 8 -;; 19: 0f0b ud2 -;; 1b: 4883c408 add rsp, 8 -;; 1f: 5d pop rbp -;; 20: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8719000000 ja 0x31 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x25 +;; 4883c408 add rsp, 8 +;; 0f0b ud2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 31: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/unreachable/as_func_mid.wat b/winch/filetests/filetests/x64/unreachable/as_func_mid.wat index 196275fa2cd5..8011165fe0c9 100644 --- a/winch/filetests/filetests/x64/unreachable/as_func_mid.wat +++ b/winch/filetests/filetests/x64/unreachable/as_func_mid.wat @@ -6,22 +6,32 @@ (call $dummy) (unreachable) (i32.const -1) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883ec08 sub rsp, 8 -;; 10: e800000000 call 0x15 -;; 15: 4883c408 add rsp, 8 -;; 19: 0f0b ud2 -;; 1b: 4883c408 add rsp, 8 -;; 1f: 5d pop rbp -;; 20: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8719000000 ja 0x31 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x25 +;; 4883c408 add rsp, 8 +;; 0f0b ud2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 31: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/unreachable/as_func_value.wat b/winch/filetests/filetests/x64/unreachable/as_func_value.wat index a0054ac38685..b62f8ebc8320 100644 --- a/winch/filetests/filetests/x64/unreachable/as_func_value.wat +++ b/winch/filetests/filetests/x64/unreachable/as_func_value.wat @@ -6,22 +6,32 @@ (call $dummy) (unreachable) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883ec08 sub rsp, 8 -;; 10: e800000000 call 0x15 -;; 15: 4883c408 add rsp, 8 -;; 19: 0f0b ud2 -;; 1b: 4883c408 add rsp, 8 -;; 1f: 5d pop rbp -;; 20: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8719000000 ja 0x31 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x25 +;; 4883c408 add rsp, 8 +;; 0f0b ud2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 31: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/unreachable/as_if_cond.wat b/winch/filetests/filetests/x64/unreachable/as_if_cond.wat index a605c8e7931e..8f06c0cc73cc 100644 --- a/winch/filetests/filetests/x64/unreachable/as_if_cond.wat +++ b/winch/filetests/filetests/x64/unreachable/as_if_cond.wat @@ -5,11 +5,16 @@ (if (result i32) (unreachable) (then (i32.const 0)) (else (i32.const 1))) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 0f0b ud2 -;; e: 4883c408 add rsp, 8 -;; 12: 5d pop rbp -;; 13: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870c000000 ja 0x24 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 0f0b ud2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 24: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/unreachable/as_if_else.wat b/winch/filetests/filetests/x64/unreachable/as_if_else.wat index 74e7406dbb7d..8ed0b4656e9d 100644 --- a/winch/filetests/filetests/x64/unreachable/as_if_else.wat +++ b/winch/filetests/filetests/x64/unreachable/as_if_else.wat @@ -6,18 +6,23 @@ (if (result i32) (local.get 0) (then (local.get 1)) (else (unreachable))) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 18: 85c0 test eax, eax -;; 1a: 0f8409000000 je 0x29 -;; 20: 8b442408 mov eax, dword ptr [rsp + 8] -;; 24: e902000000 jmp 0x2b -;; 29: 0f0b ud2 -;; 2b: 4883c410 add rsp, 0x10 -;; 2f: 5d pop rbp -;; 30: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8729000000 ja 0x41 +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 85c0 test eax, eax +;; 0f8409000000 je 0x39 +;; 30: 8b442408 mov eax, dword ptr [rsp + 8] +;; e902000000 jmp 0x3b +;; 39: 0f0b ud2 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 41: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/unreachable/as_if_then.wat b/winch/filetests/filetests/x64/unreachable/as_if_then.wat index f685209c0307..45b81e5caa32 100644 --- a/winch/filetests/filetests/x64/unreachable/as_if_then.wat +++ b/winch/filetests/filetests/x64/unreachable/as_if_then.wat @@ -5,17 +5,22 @@ (if (result i32) (local.get 0) (then (unreachable)) (else (local.get 1))) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 18: 85c0 test eax, eax -;; 1a: 0f8402000000 je 0x22 -;; 20: 0f0b ud2 -;; 22: 8b442408 mov eax, dword ptr [rsp + 8] -;; 26: 4883c410 add rsp, 0x10 -;; 2a: 5d pop rbp -;; 2b: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8724000000 ja 0x3c +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 85c0 test eax, eax +;; 0f8402000000 je 0x32 +;; 30: 0f0b ud2 +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 3c: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/unreachable/as_if_then_no_else.wat b/winch/filetests/filetests/x64/unreachable/as_if_then_no_else.wat index 8ebd7f36ca6f..a21bbb8cf0e0 100644 --- a/winch/filetests/filetests/x64/unreachable/as_if_then_no_else.wat +++ b/winch/filetests/filetests/x64/unreachable/as_if_then_no_else.wat @@ -5,17 +5,22 @@ (if (local.get 0) (then (unreachable))) (local.get 1) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 897c240c mov dword ptr [rsp + 0xc], edi -;; c: 89742408 mov dword ptr [rsp + 8], esi -;; 10: 4c893424 mov qword ptr [rsp], r14 -;; 14: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 18: 85c0 test eax, eax -;; 1a: 0f8402000000 je 0x22 -;; 20: 0f0b ud2 -;; 22: 8b442408 mov eax, dword ptr [rsp + 8] -;; 26: 4883c410 add rsp, 0x10 -;; 2a: 5d pop rbp -;; 2b: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8724000000 ja 0x3c +;; 18: 897c240c mov dword ptr [rsp + 0xc], edi +;; 89742408 mov dword ptr [rsp + 8], esi +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 85c0 test eax, eax +;; 0f8402000000 je 0x32 +;; 30: 0f0b ud2 +;; 8b442408 mov eax, dword ptr [rsp + 8] +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 3c: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/unreachable/as_loop_broke.wat b/winch/filetests/filetests/x64/unreachable/as_loop_broke.wat index a17e8d9d50fc..22ff2a843ca2 100644 --- a/winch/filetests/filetests/x64/unreachable/as_loop_broke.wat +++ b/winch/filetests/filetests/x64/unreachable/as_loop_broke.wat @@ -8,22 +8,32 @@ ) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883ec08 sub rsp, 8 -;; 10: e800000000 call 0x15 -;; 15: 4883c408 add rsp, 8 -;; 19: b801000000 mov eax, 1 -;; 1e: 4883c408 add rsp, 8 -;; 22: 5d pop rbp -;; 23: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f871c000000 ja 0x34 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x25 +;; 4883c408 add rsp, 8 +;; b801000000 mov eax, 1 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 34: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/unreachable/as_loop_first.wat b/winch/filetests/filetests/x64/unreachable/as_loop_first.wat index e05e8db58374..2f4974ed0a4c 100644 --- a/winch/filetests/filetests/x64/unreachable/as_loop_first.wat +++ b/winch/filetests/filetests/x64/unreachable/as_loop_first.wat @@ -6,11 +6,16 @@ (loop (result i32) (unreachable) (i32.const 2)) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 0f0b ud2 -;; e: 4883c408 add rsp, 8 -;; 12: 5d pop rbp -;; 13: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870c000000 ja 0x24 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 0f0b ud2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 24: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/unreachable/as_loop_last.wat b/winch/filetests/filetests/x64/unreachable/as_loop_last.wat index 2b81848c78db..3531a42c365d 100644 --- a/winch/filetests/filetests/x64/unreachable/as_loop_last.wat +++ b/winch/filetests/filetests/x64/unreachable/as_loop_last.wat @@ -7,22 +7,32 @@ (loop (nop) (call $dummy) (unreachable)) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883ec08 sub rsp, 8 -;; 10: e800000000 call 0x15 -;; 15: 4883c408 add rsp, 8 -;; 19: 0f0b ud2 -;; 1b: 4883c408 add rsp, 8 -;; 1f: 5d pop rbp -;; 20: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8719000000 ja 0x31 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x25 +;; 4883c408 add rsp, 8 +;; 0f0b ud2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 31: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/unreachable/as_loop_mid.wat b/winch/filetests/filetests/x64/unreachable/as_loop_mid.wat index 6843244b6431..cb86ad507bcb 100644 --- a/winch/filetests/filetests/x64/unreachable/as_loop_mid.wat +++ b/winch/filetests/filetests/x64/unreachable/as_loop_mid.wat @@ -7,22 +7,32 @@ (loop (result i32) (call $dummy) (unreachable) (i32.const 2)) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883c408 add rsp, 8 -;; 10: 5d pop rbp -;; 11: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870a000000 ja 0x22 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 22: 0f0b ud2 ;; -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 4883ec08 sub rsp, 8 -;; 10: e800000000 call 0x15 -;; 15: 4883c408 add rsp, 8 -;; 19: 0f0b ud2 -;; 1b: 4883c408 add rsp, 8 -;; 1f: 5d pop rbp -;; 20: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8719000000 ja 0x31 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 4883ec08 sub rsp, 8 +;; e800000000 call 0x25 +;; 4883c408 add rsp, 8 +;; 0f0b ud2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 31: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/unreachable/as_return_value.wat b/winch/filetests/filetests/x64/unreachable/as_return_value.wat index 2e97d9ba6ab7..d7025370d538 100644 --- a/winch/filetests/filetests/x64/unreachable/as_return_value.wat +++ b/winch/filetests/filetests/x64/unreachable/as_return_value.wat @@ -5,11 +5,16 @@ (return (unreachable)) ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 0f0b ud2 -;; e: 4883c408 add rsp, 8 -;; 12: 5d pop rbp -;; 13: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870c000000 ja 0x24 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 0f0b ud2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 24: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/unreachable/type_i32.wat b/winch/filetests/filetests/x64/unreachable/type_i32.wat index 307a68203c65..0146d8a4a94a 100644 --- a/winch/filetests/filetests/x64/unreachable/type_i32.wat +++ b/winch/filetests/filetests/x64/unreachable/type_i32.wat @@ -3,11 +3,16 @@ (module (func (export "type-i32") (result i32) (unreachable)) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 0f0b ud2 -;; e: 4883c408 add rsp, 8 -;; 12: 5d pop rbp -;; 13: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870c000000 ja 0x24 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 0f0b ud2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 24: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/unreachable/type_i64.wat b/winch/filetests/filetests/x64/unreachable/type_i64.wat index d5239c5680a0..8af1c9122224 100644 --- a/winch/filetests/filetests/x64/unreachable/type_i64.wat +++ b/winch/filetests/filetests/x64/unreachable/type_i64.wat @@ -3,11 +3,16 @@ (module (func (export "type-i64") (result i32) (unreachable)) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec08 sub rsp, 8 -;; 8: 4c893424 mov qword ptr [rsp], r14 -;; c: 0f0b ud2 -;; e: 4883c408 add rsp, 8 -;; 12: 5d pop rbp -;; 13: c3 ret +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec08 sub rsp, 8 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f870c000000 ja 0x24 +;; 18: 4c893424 mov qword ptr [rsp], r14 +;; 0f0b ud2 +;; 4883c408 add rsp, 8 +;; 5d pop rbp +;; c3 ret +;; 24: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/unreachable/with_spilled_local.wat b/winch/filetests/filetests/x64/unreachable/with_spilled_local.wat index 529da079bba3..b40370ec4037 100644 --- a/winch/filetests/filetests/x64/unreachable/with_spilled_local.wat +++ b/winch/filetests/filetests/x64/unreachable/with_spilled_local.wat @@ -9,17 +9,21 @@ unreachable ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f8722000000 ja 0x3a +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: 448b5c240c mov r11d, dword ptr [rsp + 0xc] -;; 1a: 4883ec04 sub rsp, 4 -;; 1e: 44891c24 mov dword ptr [rsp], r11d -;; 22: 0f0b ud2 -;; 24: 4883c404 add rsp, 4 -;; 28: 4883c410 add rsp, 0x10 -;; 2c: 5d pop rbp -;; 2d: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; 448b5c240c mov r11d, dword ptr [rsp + 0xc] +;; 4883ec04 sub rsp, 4 +;; 44891c24 mov dword ptr [rsp], r11d +;; 0f0b ud2 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 3a: 0f0b ud2 diff --git a/winch/filetests/filetests/x64/unreachable/with_spilled_local_in_if.wat b/winch/filetests/filetests/x64/unreachable/with_spilled_local_in_if.wat index 04b825099530..0cb7d0cd5317 100644 --- a/winch/filetests/filetests/x64/unreachable/with_spilled_local_in_if.wat +++ b/winch/filetests/filetests/x64/unreachable/with_spilled_local_in_if.wat @@ -14,20 +14,24 @@ end ) ) -;; 0: 55 push rbp -;; 1: 4889e5 mov rbp, rsp -;; 4: 4883ec10 sub rsp, 0x10 -;; 8: 48c744240800000000 +;; 55 push rbp +;; 4889e5 mov rbp, rsp +;; 4883ec10 sub rsp, 0x10 +;; 4d8b5e08 mov r11, qword ptr [r14 + 8] +;; 4d8b1b mov r11, qword ptr [r11] +;; 4939e3 cmp r11, rsp +;; 0f872e000000 ja 0x46 +;; 18: 48c744240800000000 ;; mov qword ptr [rsp + 8], 0 -;; 11: 4c893424 mov qword ptr [rsp], r14 -;; 15: 8b44240c mov eax, dword ptr [rsp + 0xc] -;; 19: 85c0 test eax, eax -;; 1b: 0f8413000000 je 0x34 -;; 21: 448b5c240c mov r11d, dword ptr [rsp + 0xc] -;; 26: 4883ec04 sub rsp, 4 -;; 2a: 44891c24 mov dword ptr [rsp], r11d -;; 2e: 0f0b ud2 -;; 30: 4883c404 add rsp, 4 -;; 34: 4883c410 add rsp, 0x10 -;; 38: 5d pop rbp -;; 39: c3 ret +;; 4c893424 mov qword ptr [rsp], r14 +;; 8b44240c mov eax, dword ptr [rsp + 0xc] +;; 85c0 test eax, eax +;; 0f840f000000 je 0x40 +;; 31: 448b5c240c mov r11d, dword ptr [rsp + 0xc] +;; 4883ec04 sub rsp, 4 +;; 44891c24 mov dword ptr [rsp], r11d +;; 0f0b ud2 +;; 4883c410 add rsp, 0x10 +;; 5d pop rbp +;; c3 ret +;; 46: 0f0b ud2 diff --git a/winch/filetests/src/disasm.rs b/winch/filetests/src/disasm.rs index 482a86a4a758..5c921d041833 100644 --- a/winch/filetests/src/disasm.rs +++ b/winch/filetests/src/disasm.rs @@ -6,17 +6,43 @@ use std::fmt::Write; use target_lexicon::Architecture; use winch_codegen::TargetIsa; +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub enum OffsetStyle { + Minimal, + Full, +} + /// Disassemble and print a machine code buffer. -pub fn disasm(bytes: &[u8], isa: &Box) -> Result> { +pub fn disasm( + bytes: &[u8], + isa: &Box, + offset_style: OffsetStyle, +) -> Result> { let dis = disassembler_for(isa)?; let insts = dis.disasm_all(bytes, 0x0).unwrap(); + let mut prev_jump = false; + let mut write_offsets = offset_style == OffsetStyle::Full; + let disassembled_lines = insts .iter() .map(|i| { + use capstone::InsnGroupType::{CS_GRP_JUMP, CS_GRP_RET}; + + let detail = dis.insn_detail(&i).unwrap(); + + let is_jump = detail + .groups() + .find(|g| g.0 as u32 == CS_GRP_JUMP) + .is_some(); + let mut line = String::new(); - write!(&mut line, "{:4x}:\t ", i.address()).unwrap(); + if write_offsets || (prev_jump && !is_jump) { + write!(&mut line, "{:4x}:\t ", i.address()).unwrap(); + } else { + write!(&mut line, " \t ").unwrap(); + } let mut bytes_str = String::new(); let mut len = 0; @@ -37,6 +63,13 @@ pub fn disasm(bytes: &[u8], isa: &Box) -> Result> { write!(&mut line, "{}", s).unwrap(); } + prev_jump = is_jump; + + // Flip write_offsets to true once we've seen a `ret`, as instructions that follow the + // return are often related to trap tables. + write_offsets = + write_offsets || detail.groups().find(|g| g.0 as u32 == CS_GRP_RET).is_some(); + line }) .collect(); @@ -49,6 +82,7 @@ fn disassembler_for(isa: &Box) -> Result { Architecture::X86_64 => Capstone::new() .x86() .mode(arch::x86::ArchMode::Mode64) + .detail(true) .build() .map_err(|e| anyhow::format_err!("{}", e))?, @@ -56,6 +90,7 @@ fn disassembler_for(isa: &Box) -> Result { let mut cs = Capstone::new() .arm64() .mode(arch::arm64::ArchMode::Arm) + .detail(true) .build() .map_err(|e| anyhow::format_err!("{}", e))?; diff --git a/winch/filetests/src/lib.rs b/winch/filetests/src/lib.rs index e9593cff3c8b..85606d1d2073 100644 --- a/winch/filetests/src/lib.rs +++ b/winch/filetests/src/lib.rs @@ -2,7 +2,7 @@ pub mod disasm; #[cfg(test)] mod test { - use super::disasm::disasm; + use super::disasm::{disasm, OffsetStyle}; use anyhow::Context; use cranelift_codegen::settings::{self, Configurable}; use serde_derive::{Deserialize, Serialize}; @@ -12,8 +12,8 @@ mod test { use wasmtime_environ::ModuleTranslation; use wasmtime_environ::{ wasmparser::{Parser as WasmParser, Validator}, - DefinedFuncIndex, FunctionBodyData, ModuleEnvironment, ModuleTypes, Tunables, TypeConvert, - VMOffsets, + DefinedFuncIndex, FunctionBodyData, ModuleEnvironment, ModuleTypesBuilder, Tunables, + TypeConvert, VMOffsets, }; use winch_codegen::{lookup, BuiltinFunctions, TargetIsa}; use winch_test_macros::generate_file_tests; @@ -104,12 +104,11 @@ mod test { let mut validator = Validator::new(); let parser = WasmParser::new(0); let mut types = Default::default(); - let tunables = Tunables::default(); + let tunables = Tunables::default_host(); let mut translation = ModuleEnvironment::new(&tunables, &mut validator, &mut types) .translate(parser, &wasm) .context("Failed to translate WebAssembly module") .unwrap(); - let types = types.finish(); let body_inputs = std::mem::take(&mut translation.function_body_inputs); @@ -148,7 +147,7 @@ mod test { fn compile( isa: &Box, - module_types: &ModuleTypes, + module_types: &ModuleTypesBuilder, translation: &ModuleTranslation, f: (DefinedFuncIndex, FunctionBodyData<'_>), ) -> Vec { @@ -157,7 +156,7 @@ mod test { let index = module.func_index(f.0); let sig = types[types.core_function_at(index.as_u32())].unwrap_func(); - let sig = translation.module.convert_func_type(&sig); + let sig = DummyConvert.convert_func_type(&sig); let vmoffsets = VMOffsets::new(isa.pointer_bytes(), &translation.module); let mut builtins = BuiltinFunctions::new(&vmoffsets, isa.wasmtime_call_conv()); @@ -174,6 +173,14 @@ mod test { ) .expect("Couldn't compile function"); - disasm(buffer.data(), isa).unwrap() + disasm(buffer.data(), isa, OffsetStyle::Minimal).unwrap() + } + + struct DummyConvert; + + impl TypeConvert for DummyConvert { + fn lookup_heap_type(&self, _: wasmparser::UnpackedIndex) -> wasmtime_environ::WasmHeapType { + todo!() + } } } diff --git a/winch/src/compile.rs b/winch/src/compile.rs index 3890371ba6f1..2760558203f1 100644 --- a/winch/src/compile.rs +++ b/winch/src/compile.rs @@ -5,11 +5,11 @@ use std::{fs, path::PathBuf, str::FromStr}; use target_lexicon::Triple; use wasmtime_environ::{ wasmparser::{Parser as WasmParser, Validator}, - DefinedFuncIndex, FunctionBodyData, ModuleEnvironment, ModuleTranslation, ModuleTypes, + DefinedFuncIndex, FunctionBodyData, ModuleEnvironment, ModuleTranslation, ModuleTypesBuilder, Tunables, TypeConvert, VMOffsets, }; use winch_codegen::{lookup, BuiltinFunctions, TargetIsa}; -use winch_filetests::disasm::disasm; +use winch_filetests::disasm::{disasm, OffsetStyle}; #[derive(Parser, Debug)] pub struct Options { @@ -17,7 +17,7 @@ pub struct Options { input: PathBuf, /// The target architecture. - #[clap(long = "target")] + #[arg(long = "target")] target: String, } @@ -32,11 +32,10 @@ pub fn run(opt: &Options) -> Result<()> { let mut validator = Validator::new(); let parser = WasmParser::new(0); let mut types = Default::default(); - let tunables = Tunables::default(); + let tunables = Tunables::default_host(); let mut translation = ModuleEnvironment::new(&tunables, &mut validator, &mut types) .translate(parser, &bytes) .context("Failed to translate WebAssembly module")?; - let types = types.finish(); let body_inputs = std::mem::take(&mut translation.function_body_inputs); body_inputs @@ -49,13 +48,13 @@ pub fn run(opt: &Options) -> Result<()> { fn compile( isa: &Box, translation: &ModuleTranslation, - module_types: &ModuleTypes, + module_types: &ModuleTypesBuilder, f: (DefinedFuncIndex, FunctionBodyData<'_>), ) -> Result<()> { let index = translation.module.func_index(f.0); let types = &translation.get_types(); let sig = types[types.core_function_at(index.as_u32())].unwrap_func(); - let sig = translation.module.convert_func_type(sig); + let sig = DummyConvert.convert_func_type(sig); let FunctionBodyData { body, validator } = f.1; let vmoffsets = VMOffsets::new(isa.pointer_bytes(), &translation.module); let mut builtins = BuiltinFunctions::new(&vmoffsets, isa.wasmtime_call_conv()); @@ -72,9 +71,17 @@ fn compile( .expect("Couldn't compile function"); println!("Disassembly for function: {}", index.as_u32()); - disasm(buffer.data(), isa)? + disasm(buffer.data(), isa, OffsetStyle::Full)? .iter() .for_each(|s| println!("{}", s)); Ok(()) } + +struct DummyConvert; + +impl TypeConvert for DummyConvert { + fn lookup_heap_type(&self, _: wasmparser::UnpackedIndex) -> wasmtime_environ::WasmHeapType { + todo!() + } +} diff --git a/winch/src/filetests.rs b/winch/src/filetests.rs index 6917736c90c8..423f8d836abf 100644 --- a/winch/src/filetests.rs +++ b/winch/src/filetests.rs @@ -7,7 +7,7 @@ use clap::Parser; pub struct Options { /// Passes extra arguments to `cargo test --package winch-filetests`. For example, to run a single /// test, use `-- --test-threads 1 --test single_test_name`. - #[clap(last = true, value_parser)] + #[arg(last = true, value_parser)] cargo_test_args: Vec, } diff --git a/winch/test-macros/Cargo.toml b/winch/test-macros/Cargo.toml index a6f5b83c0ea5..a1186787fd3a 100644 --- a/winch/test-macros/Cargo.toml +++ b/winch/test-macros/Cargo.toml @@ -8,6 +8,9 @@ version = "0.0.0" publish = false edition.workspace = true +[lints] +workspace = true + [lib] proc-macro = true test = false diff --git a/winch/test-macros/src/lib.rs b/winch/test-macros/src/lib.rs index e0d34506bfa3..df9f447d8066 100644 --- a/winch/test-macros/src/lib.rs +++ b/winch/test-macros/src/lib.rs @@ -1,5 +1,3 @@ -extern crate proc_macro; - use std::path::Path; use glob::glob;