Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support for wasm32-unknown-unknown target #38

Open
odanado opened this issue Jun 25, 2024 · 0 comments
Open

Support for wasm32-unknown-unknown target #38

odanado opened this issue Jun 25, 2024 · 0 comments

Comments

@odanado
Copy link

odanado commented Jun 25, 2024

Background

When compiling a project that depends on this library with the --target wasm32-unknown-unknown option, the following error occurs:

error[E0412]: cannot find type `__m128i` in this scope
 --> /Users/odan/.cargo/registry/src/index.crates.io-6f17d22bba15001f/sfmt-0.7.0/src/packed.rs:9:25
  |
9 | pub(crate) type i32x4 = __m128i;
  |                         ^^^^^^^ not found in this scope

error[E0425]: cannot find function `_mm_set_epi32` in this scope
  --> /Users/odan/.cargo/registry/src/index.crates.io-6f17d22bba15001f/sfmt-0.7.0/src/packed.rs:12:14
   |
12 |     unsafe { _mm_set_epi32(e3, e2, e1, e0) }
   |              ^^^^^^^^^^^^^ not found in this scope

error[E0425]: cannot find function `_mm_setzero_si128` in this scope
  --> /Users/odan/.cargo/registry/src/index.crates.io-6f17d22bba15001f/sfmt-0.7.0/src/packed.rs:16:14
   |
16 |     unsafe { _mm_setzero_si128() }
   |              ^^^^^^^^^^^^^^^^^ not found in this scope

error[E0425]: cannot find function `_mm_extract_epi32` in this scope
  --> /Users/odan/.cargo/registry/src/index.crates.io-6f17d22bba15001f/sfmt-0.7.0/src/packed.rs:22:18
   |
22 |             0 => _mm_extract_epi32(vals, 0) as u32,
   |                  ^^^^^^^^^^^^^^^^^ not found in this scope

error[E0425]: cannot find function `_mm_extract_epi32` in this scope
  --> /Users/odan/.cargo/registry/src/index.crates.io-6f17d22bba15001f/sfmt-0.7.0/src/packed.rs:23:18
   |
23 |             1 => _mm_extract_epi32(vals, 1) as u32,
   |                  ^^^^^^^^^^^^^^^^^ not found in this scope

error[E0425]: cannot find function `_mm_extract_epi32` in this scope
  --> /Users/odan/.cargo/registry/src/index.crates.io-6f17d22bba15001f/sfmt-0.7.0/src/packed.rs:24:18
   |
24 |             2 => _mm_extract_epi32(vals, 2) as u32,
   |                  ^^^^^^^^^^^^^^^^^ not found in this scope

error[E0425]: cannot find function `_mm_extract_epi32` in this scope
  --> /Users/odan/.cargo/registry/src/index.crates.io-6f17d22bba15001f/sfmt-0.7.0/src/packed.rs:25:18
   |
25 |             3 => _mm_extract_epi32(vals, 3) as u32,
   |                  ^^^^^^^^^^^^^^^^^ not found in this scope

error[E0425]: cannot find function `_mm_insert_epi32` in this scope
  --> /Users/odan/.cargo/registry/src/index.crates.io-6f17d22bba15001f/sfmt-0.7.0/src/packed.rs:34:18
   |
34 |             0 => _mm_insert_epi32(*vals, val, 0),
   |                  ^^^^^^^^^^^^^^^^ not found in this scope

error[E0425]: cannot find function `_mm_insert_epi32` in this scope
  --> /Users/odan/.cargo/registry/src/index.crates.io-6f17d22bba15001f/sfmt-0.7.0/src/packed.rs:35:18
   |
35 |             1 => _mm_insert_epi32(*vals, val, 1),
   |                  ^^^^^^^^^^^^^^^^ not found in this scope

error[E0425]: cannot find function `_mm_insert_epi32` in this scope
  --> /Users/odan/.cargo/registry/src/index.crates.io-6f17d22bba15001f/sfmt-0.7.0/src/packed.rs:36:18
   |
36 |             2 => _mm_insert_epi32(*vals, val, 2),
   |                  ^^^^^^^^^^^^^^^^ not found in this scope

error[E0425]: cannot find function `_mm_insert_epi32` in this scope
  --> /Users/odan/.cargo/registry/src/index.crates.io-6f17d22bba15001f/sfmt-0.7.0/src/packed.rs:37:18
   |
37 |             3 => _mm_insert_epi32(*vals, val, 3),
   |                  ^^^^^^^^^^^^^^^^ not found in this scope

error[E0425]: cannot find function `_mm_srli_epi32` in this scope
  --> /Users/odan/.cargo/registry/src/index.crates.io-6f17d22bba15001f/sfmt-0.7.0/src/sfmt.rs:32:17
   |
32 |         let y = _mm_srli_epi32(b, SFMT_SR1);
   |                 ^^^^^^^^^^^^^^ not found in this scope

error[E0425]: cannot find function `_mm_srli_si128` in this scope
  --> /Users/odan/.cargo/registry/src/index.crates.io-6f17d22bba15001f/sfmt-0.7.0/src/sfmt.rs:33:17
   |
33 |         let z = _mm_srli_si128(c, SFMT_SR2);
   |                 ^^^^^^^^^^^^^^ not found in this scope

error[E0425]: cannot find function `_mm_slli_epi32` in this scope
  --> /Users/odan/.cargo/registry/src/index.crates.io-6f17d22bba15001f/sfmt-0.7.0/src/sfmt.rs:34:17
   |
34 |         let v = _mm_slli_epi32(d, SFMT_SL1);
   |                 ^^^^^^^^^^^^^^ not found in this scope

error[E0425]: cannot find function `_mm_xor_si128` in this scope
  --> /Users/odan/.cargo/registry/src/index.crates.io-6f17d22bba15001f/sfmt-0.7.0/src/sfmt.rs:35:17
   |
35 |         let z = _mm_xor_si128(z, a);
   |                 ^^^^^^^^^^^^^ not found in this scope

error[E0425]: cannot find function `_mm_xor_si128` in this scope
  --> /Users/odan/.cargo/registry/src/index.crates.io-6f17d22bba15001f/sfmt-0.7.0/src/sfmt.rs:36:17
   |
36 |         let z = _mm_xor_si128(z, v);
   |                 ^^^^^^^^^^^^^ not found in this scope

error[E0425]: cannot find function `_mm_slli_si128` in this scope
  --> /Users/odan/.cargo/registry/src/index.crates.io-6f17d22bba15001f/sfmt-0.7.0/src/sfmt.rs:37:17
   |
37 |         let x = _mm_slli_si128(a, SFMT_SL2);
   |                 ^^^^^^^^^^^^^^ not found in this scope

error[E0425]: cannot find function `_mm_and_si128` in this scope
  --> /Users/odan/.cargo/registry/src/index.crates.io-6f17d22bba15001f/sfmt-0.7.0/src/sfmt.rs:38:17
   |
38 |         let y = _mm_and_si128(y, mask);
   |                 ^^^^^^^^^^^^^ not found in this scope

error[E0425]: cannot find function `_mm_xor_si128` in this scope
  --> /Users/odan/.cargo/registry/src/index.crates.io-6f17d22bba15001f/sfmt-0.7.0/src/sfmt.rs:39:17
   |
39 |         let z = _mm_xor_si128(z, x);
   |                 ^^^^^^^^^^^^^ not found in this scope

error[E0425]: cannot find function `_mm_xor_si128` in this scope
  --> /Users/odan/.cargo/registry/src/index.crates.io-6f17d22bba15001f/sfmt-0.7.0/src/sfmt.rs:40:9
   |
40 |         _mm_xor_si128(z, y)
   |         ^^^^^^^^^^^^^ not found in this scope

This error occurs because functions starting with _mm_ are not defined when target_arch is wasm32.

Motivation

By supporting wasm32, this library can be used in edge environments such as Cloudflare Workers.

Solution

To solve this issue, I have an idea to define these types and functions using core::arch::wasm32.

This idea is inspired by the article Authoring a SIMD enhanced Wasm library with Rust.

I am very interested in adding wasm32 support. I plan to use core::arch::wasm32 to define the necessary types and functions to achieve this. Here is a brief outline of the code I intend to implement:

#[cfg(target_arch = "wasm32")]
type i32x4 = v128;

#[cfg(target_arch = "wasm32")]
unsafe fn _mm_setzero_si128() -> v128 {
  return i32x4(0, 0, 0, 0);
}

Would it be possible for me to create a pull request to add this support?

@odanado odanado changed the title Support for wasm32-unknown-unknown target Support for wasm32-unknown-unknown target Jun 25, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant