diff --git a/.github/workflows/release_nightly.yml b/.github/workflows/release_nightly.yml index 0a96c5fff267..f178d7ac88d7 100644 --- a/.github/workflows/release_nightly.yml +++ b/.github/workflows/release_nightly.yml @@ -142,9 +142,9 @@ jobs: ref: ${{ needs.create-nightly-release.outputs.tag_name }} - name: Install Rust toolchain - uses: dtolnay/rust-toolchain@stable + uses: dtolnay/rust-toolchain@nightly with: - toolchain: stable + toolchain: nightly targets: ${{ matrix.target }} - name: Install Linux dependencies @@ -339,9 +339,9 @@ jobs: ref: ${{ needs.create-nightly-release.outputs.tag_name }} - name: Install Rust toolchain - uses: dtolnay/rust-toolchain@stable + uses: dtolnay/rust-toolchain@nightly with: - toolchain: stable + toolchain: nightly - name: Generate report run: ./stub-report/generate-report.sh @@ -372,9 +372,9 @@ jobs: ref: ${{ needs.create-nightly-release.outputs.tag_name }} - name: Install Rust toolchain - uses: dtolnay/rust-toolchain@stable + uses: dtolnay/rust-toolchain@nightly with: - toolchain: stable + toolchain: nightly targets: wasm32-unknown-unknown components: rust-src diff --git a/.github/workflows/test_extension_dockerfile.yml b/.github/workflows/test_extension_dockerfile.yml index de635bd2eea9..04909de8a4b7 100644 --- a/.github/workflows/test_extension_dockerfile.yml +++ b/.github/workflows/test_extension_dockerfile.yml @@ -17,9 +17,9 @@ jobs: - uses: actions/checkout@v6 - name: Install Rust toolchain - uses: dtolnay/rust-toolchain@stable + uses: dtolnay/rust-toolchain@nightly with: - toolchain: stable + toolchain: nightly targets: wasm32-unknown-unknown components: rust-src diff --git a/.github/workflows/test_rust.yml b/.github/workflows/test_rust.yml index e2be8527d848..feaae522201e 100644 --- a/.github/workflows/test_rust.yml +++ b/.github/workflows/test_rust.yml @@ -63,19 +63,17 @@ jobs: strategy: fail-fast: false matrix: - rust_version: [stable] + rust_version: [nightly] os: [ubuntu-24.04, ubuntu-24.04-arm, windows-2025, macos-15] include: - rust_version: nightly os: ubuntu-24.04 - - rust_version: beta - os: ubuntu-24.04 steps: - uses: actions/checkout@v6 - name: Install Rust toolchain - uses: dtolnay/rust-toolchain@stable + uses: dtolnay/rust-toolchain@nightly with: toolchain: ${{ matrix.rust_version }} @@ -127,13 +125,13 @@ jobs: strategy: fail-fast: false matrix: - rust_version: [stable, beta, nightly] + rust_version: [nightly] steps: - uses: actions/checkout@v6 - name: Install Rust toolchain - uses: dtolnay/rust-toolchain@stable + uses: dtolnay/rust-toolchain@nightly with: toolchain: ${{ matrix.rust_version }} components: rustfmt, clippy @@ -286,7 +284,7 @@ jobs: - uses: actions/checkout@v6 - name: Install Rust toolchain - uses: dtolnay/rust-toolchain@stable + uses: dtolnay/rust-toolchain@nightly - name: Check licenses, duplicates, and advisories uses: EmbarkStudios/cargo-deny-action@v2 @@ -309,13 +307,11 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - rust_version: [stable] + rust_version: [nightly] os: [ubuntu-24.04, ubuntu-24.04-arm, windows-2025, macos-15] include: - rust_version: nightly os: ubuntu-24.04 - - rust_version: beta - os: ubuntu-24.04 steps: - name: No-op @@ -328,7 +324,7 @@ jobs: runs-on: ubuntu-24.04 strategy: matrix: - rust_version: [stable, beta, nightly] + rust_version: [nightly] steps: - name: No-op diff --git a/.github/workflows/test_web.yml b/.github/workflows/test_web.yml index eaedf24322e3..14e655d8aec4 100644 --- a/.github/workflows/test_web.yml +++ b/.github/workflows/test_web.yml @@ -49,7 +49,7 @@ jobs: cache-dependency-path: web/package-lock.json - name: Install Rust toolchain - uses: dtolnay/rust-toolchain@stable + uses: dtolnay/rust-toolchain@nightly with: targets: wasm32-unknown-unknown @@ -114,7 +114,7 @@ jobs: cache-dependency-path: web/package-lock.json - name: Install Rust toolchain - uses: dtolnay/rust-toolchain@stable + uses: dtolnay/rust-toolchain@nightly with: targets: wasm32-unknown-unknown diff --git a/core/src/ecma_conversions.rs b/core/src/ecma_conversions.rs index 5c483014ce8f..8c8f84076f0e 100644 --- a/core/src/ecma_conversions.rs +++ b/core/src/ecma_conversions.rs @@ -44,8 +44,10 @@ pub fn f64_to_wrapping_i32(n: f64) -> i32 { #[cfg(target_arch = "aarch64")] { if std::arch::is_aarch64_feature_detected!("jsconv") { - // SAFETY: `jsconv` feature is checked in both compile time and runtime to be existed, so it's safe to call. - unsafe { f64_to_wrapping_int32_aarch64(n) } + // Converts an `f64` to an `i32` with ECMAScript `ToInt32` wrapping behavior. + // The value will be wrapped in the range [-2^31, 2^31). + // Optimized for aarch64 cpu with the fjcvtzs instruction. + unsafe { std::arch::aarch64::__jcvt(n) } } else { f64_to_wrapping_i32_generic(n) } @@ -59,32 +61,6 @@ fn f64_to_wrapping_i32_generic(n: f64) -> i32 { f64_to_wrapping_u32(n) as i32 } -/// Converts an `f64` to an `i32` with ECMAScript `ToInt32` wrapping behavior. -/// The value will be wrapped in the range [-2^31, 2^31). -/// Optimized for aarch64 cpu with the fjcvtzs instruction. -/// -/// # Safety -/// -/// The caller must ensure either: -/// - The target platform is aarch64 with `jsconv` feature enabled, or -/// - Runtime feature detection has been performed to verify `jsconv` support -#[allow(unused)] -#[cfg(target_arch = "aarch64")] -#[target_feature(enable = "jsconv")] -unsafe fn f64_to_wrapping_int32_aarch64(number: f64) -> i32 { - let ret: i32; - // SAFETY: fjcvtzs instruction is available under jsconv feature. - unsafe { - std::arch::asm!( - "fjcvtzs {dst:w}, {src:d}", - src = in(vreg) number, - dst = out(reg) ret, - options(nostack, nomem, pure) - ); - } - ret -} - /// Implements the IEEE-754 "Round to nearest, ties to even" rounding rule. /// (e.g., both 1.5 and 2.5 will round to 2). /// This also clamps out-of-range values and NaN to `i32::MIN`. diff --git a/core/src/lib.rs b/core/src/lib.rs index cfd25a334563..457710b9775e 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -4,6 +4,9 @@ // This lint is good in theory, but in AVMs we often need to do `let x = args.get(0); let y = args.get(1);` etc. // It'd make those much less readable and consistent. #![allow(clippy::get_first)] +// This enables the core::arch::aarch64::__jcvt() intrinsic, which is used to convert a f64 into an +// i32 the JavaScript way on ARMv8.3+. +#![feature(stdarch_aarch64_jscvt)] #[macro_use] mod display_object;