simd-json icon indicating copy to clipboard operation
simd-json copied to clipboard

failed to resolve: could not find `x86_64` in `arch` on x86 arch.

Open universalmind303 opened this issue 2 years ago • 0 comments

it looks like some of the feature flags are not configured correctly, for example in numberparse

list of areas throwing this error for x86 arch.

  • simd-json-0.6.0\src\numberparse.rs:153:40
  • simd-json-0.6.0\src\sse42\deser.rs:48:75
  • simd-json-0.6.0\src\sse42\deser.rs:102:75
  • simd-json-0.6.0\src\sse42\deser.rs:110:44
  • simd-json-0.6.0\src\sse42\stage1.rs:46:68
  • simd-json-0.6.0\src\sse42\stage1.rs:47:76
  • simd-json-0.6.0\src\sse42\stage1.rs:48:76
  • simd-json-0.6.0\src\sse42\stage1.rs:49:76
  • simd-json-0.6.0\src\sse42\stage1.rs:281:44
#[cfg_attr(not(feature = "no-inline"), inline)]
#[cfg(all(
    any(target_arch = "x86", target_arch = "x86_64"),
    feature = "swar-number-parsing"
))]
#[allow(
    clippy::cast_sign_loss,
    clippy::cast_possible_wrap,
    clippy::cast_ptr_alignment
)]
fn parse_eight_digits_unrolled(chars: &[u8]) -> u32 {
    unsafe {
        // this actually computes *16* values so we are being wasteful.
        let ascii0: __m128i = _mm_set1_epi8(b'0' as i8);
        let mul_1_10: __m128i =
            _mm_setr_epi8(10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1);
        let mul_1_100: __m128i = _mm_setr_epi16(100, 1, 100, 1, 100, 1, 100, 1);
        let mul_1_10000: __m128i = _mm_setr_epi16(10000, 1, 10000, 1, 10000, 1, 10000, 1);
        // We know what we're doing right? :P
        let input: __m128i = _mm_sub_epi8(
            _mm_loadu_si128(
                chars
                    .get_kinda_unchecked(0..16)
                    .as_ptr()
                    .cast::<std::arch::x86_64::__m128i>(),
            ),
            ascii0,
        );
        let t1: __m128i = _mm_maddubs_epi16(input, mul_1_10);
        let t2: __m128i = _mm_madd_epi16(t1, mul_1_100);
        let t3: __m128i = _mm_packus_epi32(t2, t2);
        let t4: __m128i = _mm_madd_epi16(t3, mul_1_10000);
        _mm_cvtsi128_si32(t4) as u32 // only captures the sum of the first 8 digits, drop the rest
    }
}

it is saying x86 || x86_64

    any(target_arch = "x86", target_arch = "x86_64"),

but then it is using an x86_64 specific cast. .cast::<std::arch::x86_64::__m128i>(),

universalmind303 avatar Sep 14 '22 15:09 universalmind303