From 5f2a3dd02898cd7a242801402370431538cfa2af Mon Sep 17 00:00:00 2001 From: wuggy Date: Fri, 18 Sep 2026 13:50:44 -0700 Subject: [PATCH] JS optimisations pt.3 --- js/src/jsstr.h | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/js/src/jsstr.h b/js/src/jsstr.h index 7162559e94..b86d8bde20 100644 --- a/js/src/jsstr.h +++ b/js/src/jsstr.h @@ -487,10 +487,15 @@ CopyAndInflateChars(char16_t* dst, const char* src, size_t srclen) size_t i = 0; const __m128i zero = _mm_setzero_si128(); for (; i + 32 <= srclen; i += 32) { - const __m128i bytes0 = _mm_loadl_epi64(reinterpret_cast(src + i)); - const __m128i bytes1 = _mm_loadl_epi64(reinterpret_cast(src + i + 8)); - const __m128i bytes2 = _mm_loadl_epi64(reinterpret_cast(src + i + 16)); - const __m128i bytes3 = _mm_loadl_epi64(reinterpret_cast(src + i + 24)); + uint64_t value0, value1, value2, value3; + js_memcpy(&value0, src + i, sizeof(value0)); + js_memcpy(&value1, src + i + 8, sizeof(value1)); + js_memcpy(&value2, src + i + 16, sizeof(value2)); + js_memcpy(&value3, src + i + 24, sizeof(value3)); + const __m128i bytes0 = _mm_cvtsi64_si128(static_cast(value0)); + const __m128i bytes1 = _mm_cvtsi64_si128(static_cast(value1)); + const __m128i bytes2 = _mm_cvtsi64_si128(static_cast(value2)); + const __m128i bytes3 = _mm_cvtsi64_si128(static_cast(value3)); _mm_storeu_si128(reinterpret_cast<__m128i*>(dst + i), _mm_unpacklo_epi8(bytes0, zero)); _mm_storeu_si128(reinterpret_cast<__m128i*>(dst + i + 8), @@ -501,7 +506,9 @@ CopyAndInflateChars(char16_t* dst, const char* src, size_t srclen) _mm_unpacklo_epi8(bytes3, zero)); } for (; i + 8 <= srclen; i += 8) { - const __m128i bytes8 = _mm_loadl_epi64(reinterpret_cast(src + i)); + uint64_t value; + js_memcpy(&value, src + i, sizeof(value)); + const __m128i bytes8 = _mm_cvtsi64_si128(static_cast(value)); _mm_storeu_si128(reinterpret_cast<__m128i*>(dst + i), _mm_unpacklo_epi8(bytes8, zero)); } @@ -520,10 +527,15 @@ CopyAndInflateChars(char16_t* dst, const JS::Latin1Char* src, size_t srclen) size_t i = 0; const __m128i zero = _mm_setzero_si128(); for (; i + 32 <= srclen; i += 32) { - const __m128i bytes0 = _mm_loadl_epi64(reinterpret_cast(src + i)); - const __m128i bytes1 = _mm_loadl_epi64(reinterpret_cast(src + i + 8)); - const __m128i bytes2 = _mm_loadl_epi64(reinterpret_cast(src + i + 16)); - const __m128i bytes3 = _mm_loadl_epi64(reinterpret_cast(src + i + 24)); + uint64_t value0, value1, value2, value3; + js_memcpy(&value0, src + i, sizeof(value0)); + js_memcpy(&value1, src + i + 8, sizeof(value1)); + js_memcpy(&value2, src + i + 16, sizeof(value2)); + js_memcpy(&value3, src + i + 24, sizeof(value3)); + const __m128i bytes0 = _mm_cvtsi64_si128(static_cast(value0)); + const __m128i bytes1 = _mm_cvtsi64_si128(static_cast(value1)); + const __m128i bytes2 = _mm_cvtsi64_si128(static_cast(value2)); + const __m128i bytes3 = _mm_cvtsi64_si128(static_cast(value3)); _mm_storeu_si128(reinterpret_cast<__m128i*>(dst + i), _mm_unpacklo_epi8(bytes0, zero)); _mm_storeu_si128(reinterpret_cast<__m128i*>(dst + i + 8), @@ -534,7 +546,9 @@ CopyAndInflateChars(char16_t* dst, const JS::Latin1Char* src, size_t srclen) _mm_unpacklo_epi8(bytes3, zero)); } for (; i + 8 <= srclen; i += 8) { - const __m128i bytes8 = _mm_loadl_epi64(reinterpret_cast(src + i)); + uint64_t value; + js_memcpy(&value, src + i, sizeof(value)); + const __m128i bytes8 = _mm_cvtsi64_si128(static_cast(value)); _mm_storeu_si128(reinterpret_cast<__m128i*>(dst + i), _mm_unpacklo_epi8(bytes8, zero)); }