Skip to content

Support for wasm32-unknown-unknown target #38

Open
@odanado

Description

@odanado

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?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions