react-native-quick-crypto 1.0.19 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/QuickCrypto.podspec +12 -38
- package/README.md +2 -0
- package/android/CMakeLists.txt +3 -0
- package/android/build.gradle +5 -1
- package/cpp/argon2/HybridArgon2.cpp +10 -3
- package/cpp/blake3/HybridBlake3.cpp +5 -3
- package/cpp/cipher/CCMCipher.cpp +29 -16
- package/cpp/cipher/CCMCipher.hpp +2 -4
- package/cpp/cipher/ChaCha20Cipher.cpp +14 -18
- package/cpp/cipher/ChaCha20Cipher.hpp +2 -4
- package/cpp/cipher/ChaCha20Poly1305Cipher.cpp +34 -23
- package/cpp/cipher/ChaCha20Poly1305Cipher.hpp +2 -4
- package/cpp/cipher/GCMCipher.cpp +14 -15
- package/cpp/cipher/HybridCipher.cpp +39 -36
- package/cpp/cipher/HybridCipher.hpp +17 -1
- package/cpp/cipher/HybridRsaCipher.cpp +74 -29
- package/cpp/cipher/OCBCipher.cpp +4 -3
- package/cpp/cipher/XChaCha20Poly1305Cipher.cpp +14 -13
- package/cpp/cipher/XSalsa20Cipher.cpp +72 -6
- package/cpp/cipher/XSalsa20Cipher.hpp +25 -3
- package/cpp/cipher/XSalsa20Poly1305Cipher.cpp +21 -25
- package/cpp/dh/HybridDiffieHellman.cpp +29 -0
- package/cpp/ec/HybridEcKeyPair.cpp +35 -33
- package/cpp/ec/HybridEcKeyPair.hpp +3 -7
- package/cpp/ecdh/HybridECDH.cpp +23 -0
- package/cpp/ed25519/HybridEdKeyPair.cpp +73 -117
- package/cpp/ed25519/HybridEdKeyPair.hpp +5 -9
- package/cpp/hash/HybridHash.cpp +5 -7
- package/cpp/hkdf/HybridHkdf.cpp +6 -4
- package/cpp/hmac/HybridHmac.cpp +4 -6
- package/cpp/kmac/HybridKmac.cpp +4 -4
- package/cpp/mldsa/HybridMlDsaKeyPair.cpp +37 -49
- package/cpp/mlkem/HybridMlKemKeyPair.cpp +39 -43
- package/cpp/pbkdf2/HybridPbkdf2.cpp +7 -8
- package/cpp/rsa/HybridRsaKeyPair.cpp +5 -8
- package/cpp/rsa/HybridRsaKeyPair.hpp +4 -7
- package/cpp/scrypt/HybridScrypt.cpp +6 -4
- package/cpp/sign/HybridSignHandle.cpp +25 -68
- package/cpp/sign/HybridVerifyHandle.cpp +23 -60
- package/cpp/utils/HybridUtils.cpp +213 -111
- package/cpp/utils/HybridUtils.hpp +9 -2
- package/cpp/utils/QuickCryptoUtils.hpp +72 -0
- package/deps/simdutf/LICENSE-APACHE +201 -0
- package/deps/simdutf/LICENSE-MIT +18 -0
- package/deps/simdutf/README.md +2782 -0
- package/deps/simdutf/include/simdutf/avx512.h +79 -0
- package/deps/simdutf/include/simdutf/base64_implementation.h +158 -0
- package/deps/simdutf/include/simdutf/base64_tables.h +887 -0
- package/deps/simdutf/include/simdutf/common_defs.h +186 -0
- package/deps/simdutf/include/simdutf/compiler_check.h +50 -0
- package/deps/simdutf/include/simdutf/constexpr_ptr.h +138 -0
- package/deps/simdutf/include/simdutf/encoding_types.h +189 -0
- package/deps/simdutf/include/simdutf/error.h +126 -0
- package/deps/simdutf/include/simdutf/implementation.h +7081 -0
- package/deps/simdutf/include/simdutf/internal/isadetection.h +325 -0
- package/deps/simdutf/include/simdutf/portability.h +285 -0
- package/deps/simdutf/include/simdutf/scalar/ascii.h +86 -0
- package/deps/simdutf/include/simdutf/scalar/atomic_util.h +105 -0
- package/deps/simdutf/include/simdutf/scalar/base64.h +911 -0
- package/deps/simdutf/include/simdutf/scalar/latin1.h +26 -0
- package/deps/simdutf/include/simdutf/scalar/latin1_to_utf16/latin1_to_utf16.h +52 -0
- package/deps/simdutf/include/simdutf/scalar/latin1_to_utf32/latin1_to_utf32.h +27 -0
- package/deps/simdutf/include/simdutf/scalar/latin1_to_utf8/latin1_to_utf8.h +191 -0
- package/deps/simdutf/include/simdutf/scalar/swap_bytes.h +35 -0
- package/deps/simdutf/include/simdutf/scalar/utf16.h +226 -0
- package/deps/simdutf/include/simdutf/scalar/utf16_to_latin1/utf16_to_latin1.h +108 -0
- package/deps/simdutf/include/simdutf/scalar/utf16_to_latin1/valid_utf16_to_latin1.h +40 -0
- package/deps/simdutf/include/simdutf/scalar/utf16_to_utf32/utf16_to_utf32.h +86 -0
- package/deps/simdutf/include/simdutf/scalar/utf16_to_utf32/valid_utf16_to_utf32.h +44 -0
- package/deps/simdutf/include/simdutf/scalar/utf16_to_utf8/utf16_to_utf8.h +295 -0
- package/deps/simdutf/include/simdutf/scalar/utf16_to_utf8/valid_utf16_to_utf8.h +91 -0
- package/deps/simdutf/include/simdutf/scalar/utf32.h +82 -0
- package/deps/simdutf/include/simdutf/scalar/utf32_to_latin1/utf32_to_latin1.h +68 -0
- package/deps/simdutf/include/simdutf/scalar/utf32_to_latin1/valid_utf32_to_latin1.h +67 -0
- package/deps/simdutf/include/simdutf/scalar/utf32_to_utf16/utf32_to_utf16.h +84 -0
- package/deps/simdutf/include/simdutf/scalar/utf32_to_utf16/valid_utf32_to_utf16.h +44 -0
- package/deps/simdutf/include/simdutf/scalar/utf32_to_utf8/utf32_to_utf8.h +142 -0
- package/deps/simdutf/include/simdutf/scalar/utf32_to_utf8/valid_utf32_to_utf8.h +72 -0
- package/deps/simdutf/include/simdutf/scalar/utf8.h +326 -0
- package/deps/simdutf/include/simdutf/scalar/utf8_to_latin1/utf8_to_latin1.h +225 -0
- package/deps/simdutf/include/simdutf/scalar/utf8_to_latin1/valid_utf8_to_latin1.h +87 -0
- package/deps/simdutf/include/simdutf/scalar/utf8_to_utf16/utf8_to_utf16.h +342 -0
- package/deps/simdutf/include/simdutf/scalar/utf8_to_utf16/valid_utf8_to_utf16.h +106 -0
- package/deps/simdutf/include/simdutf/scalar/utf8_to_utf32/utf8_to_utf32.h +299 -0
- package/deps/simdutf/include/simdutf/scalar/utf8_to_utf32/valid_utf8_to_utf32.h +83 -0
- package/deps/simdutf/include/simdutf/simdutf_version.h +26 -0
- package/deps/simdutf/include/simdutf.h +26 -0
- package/deps/simdutf/include/simdutf_c.h +342 -0
- package/deps/simdutf/src/arm64/arm_base64.cpp +791 -0
- package/deps/simdutf/src/arm64/arm_convert_latin1_to_utf16.cpp +24 -0
- package/deps/simdutf/src/arm64/arm_convert_latin1_to_utf32.cpp +24 -0
- package/deps/simdutf/src/arm64/arm_convert_latin1_to_utf8.cpp +70 -0
- package/deps/simdutf/src/arm64/arm_convert_utf16_to_latin1.cpp +61 -0
- package/deps/simdutf/src/arm64/arm_convert_utf16_to_utf32.cpp +185 -0
- package/deps/simdutf/src/arm64/arm_convert_utf16_to_utf8.cpp +780 -0
- package/deps/simdutf/src/arm64/arm_convert_utf32_to_latin1.cpp +60 -0
- package/deps/simdutf/src/arm64/arm_convert_utf32_to_utf16.cpp +208 -0
- package/deps/simdutf/src/arm64/arm_convert_utf32_to_utf8.cpp +505 -0
- package/deps/simdutf/src/arm64/arm_convert_utf8_to_latin1.cpp +69 -0
- package/deps/simdutf/src/arm64/arm_convert_utf8_to_utf16.cpp +313 -0
- package/deps/simdutf/src/arm64/arm_convert_utf8_to_utf32.cpp +179 -0
- package/deps/simdutf/src/arm64/arm_find.cpp +199 -0
- package/deps/simdutf/src/arm64/arm_utf16fix.cpp +185 -0
- package/deps/simdutf/src/arm64/arm_validate_utf16.cpp +165 -0
- package/deps/simdutf/src/arm64/arm_validate_utf32le.cpp +65 -0
- package/deps/simdutf/src/arm64/implementation.cpp +1442 -0
- package/deps/simdutf/src/encoding_types.cpp +67 -0
- package/deps/simdutf/src/error.cpp +3 -0
- package/deps/simdutf/src/fallback/implementation.cpp +589 -0
- package/deps/simdutf/src/generic/ascii_validation.h +50 -0
- package/deps/simdutf/src/generic/base64.h +233 -0
- package/deps/simdutf/src/generic/base64lengths.h +63 -0
- package/deps/simdutf/src/generic/buf_block_reader.h +109 -0
- package/deps/simdutf/src/generic/find.h +75 -0
- package/deps/simdutf/src/generic/utf16/change_endianness.h +24 -0
- package/deps/simdutf/src/generic/utf16/count_code_points_bytemask.h +58 -0
- package/deps/simdutf/src/generic/utf16/to_well_formed.h +93 -0
- package/deps/simdutf/src/generic/utf16/utf32_length_from_utf16.h +15 -0
- package/deps/simdutf/src/generic/utf16/utf8_length_from_utf16.h +35 -0
- package/deps/simdutf/src/generic/utf16/utf8_length_from_utf16_bytemask.h +199 -0
- package/deps/simdutf/src/generic/utf16.h +73 -0
- package/deps/simdutf/src/generic/utf32.h +136 -0
- package/deps/simdutf/src/generic/utf8/utf16_length_from_utf8_bytemask.h +53 -0
- package/deps/simdutf/src/generic/utf8.h +92 -0
- package/deps/simdutf/src/generic/utf8_to_latin1/utf8_to_latin1.h +316 -0
- package/deps/simdutf/src/generic/utf8_to_latin1/valid_utf8_to_latin1.h +78 -0
- package/deps/simdutf/src/generic/utf8_to_utf16/utf8_to_utf16.h +332 -0
- package/deps/simdutf/src/generic/utf8_to_utf16/valid_utf8_to_utf16.h +74 -0
- package/deps/simdutf/src/generic/utf8_to_utf32/utf8_to_utf32.h +318 -0
- package/deps/simdutf/src/generic/utf8_to_utf32/valid_utf8_to_utf32.h +42 -0
- package/deps/simdutf/src/generic/utf8_validation/utf8_lookup4_algorithm.h +223 -0
- package/deps/simdutf/src/generic/utf8_validation/utf8_validator.h +84 -0
- package/deps/simdutf/src/generic/validate_utf16.h +164 -0
- package/deps/simdutf/src/generic/validate_utf32.h +99 -0
- package/deps/simdutf/src/haswell/avx2_base64.cpp +837 -0
- package/deps/simdutf/src/haswell/avx2_convert_latin1_to_utf16.cpp +28 -0
- package/deps/simdutf/src/haswell/avx2_convert_latin1_to_utf32.cpp +20 -0
- package/deps/simdutf/src/haswell/avx2_convert_latin1_to_utf8.cpp +83 -0
- package/deps/simdutf/src/haswell/avx2_convert_utf16_to_latin1.cpp +83 -0
- package/deps/simdutf/src/haswell/avx2_convert_utf16_to_utf32.cpp +210 -0
- package/deps/simdutf/src/haswell/avx2_convert_utf16_to_utf8.cpp +602 -0
- package/deps/simdutf/src/haswell/avx2_convert_utf32_to_latin1.cpp +116 -0
- package/deps/simdutf/src/haswell/avx2_convert_utf32_to_utf16.cpp +164 -0
- package/deps/simdutf/src/haswell/avx2_convert_utf32_to_utf8.cpp +569 -0
- package/deps/simdutf/src/haswell/avx2_convert_utf8_to_latin1.cpp +60 -0
- package/deps/simdutf/src/haswell/avx2_convert_utf8_to_utf16.cpp +195 -0
- package/deps/simdutf/src/haswell/avx2_convert_utf8_to_utf32.cpp +135 -0
- package/deps/simdutf/src/haswell/avx2_utf16fix.cpp +173 -0
- package/deps/simdutf/src/haswell/avx2_validate_utf16.cpp +17 -0
- package/deps/simdutf/src/haswell/implementation.cpp +1447 -0
- package/deps/simdutf/src/icelake/icelake_ascii_validation.inl.cpp +19 -0
- package/deps/simdutf/src/icelake/icelake_base64.inl.cpp +630 -0
- package/deps/simdutf/src/icelake/icelake_common.inl.cpp +37 -0
- package/deps/simdutf/src/icelake/icelake_convert_latin1_to_utf16.inl.cpp +36 -0
- package/deps/simdutf/src/icelake/icelake_convert_latin1_to_utf32.inl.cpp +23 -0
- package/deps/simdutf/src/icelake/icelake_convert_latin1_to_utf8.inl.cpp +107 -0
- package/deps/simdutf/src/icelake/icelake_convert_utf16_to_latin1.inl.cpp +103 -0
- package/deps/simdutf/src/icelake/icelake_convert_utf16_to_utf32.inl.cpp +136 -0
- package/deps/simdutf/src/icelake/icelake_convert_utf16_to_utf8.inl.cpp +206 -0
- package/deps/simdutf/src/icelake/icelake_convert_utf32_to_latin1.inl.cpp +74 -0
- package/deps/simdutf/src/icelake/icelake_convert_utf32_to_utf16.inl.cpp +338 -0
- package/deps/simdutf/src/icelake/icelake_convert_utf32_to_utf8.inl.cpp +574 -0
- package/deps/simdutf/src/icelake/icelake_convert_utf8_to_latin1.inl.cpp +104 -0
- package/deps/simdutf/src/icelake/icelake_convert_utf8_to_utf16.inl.cpp +75 -0
- package/deps/simdutf/src/icelake/icelake_convert_valid_utf8_to_latin1.inl.cpp +69 -0
- package/deps/simdutf/src/icelake/icelake_find.inl.cpp +146 -0
- package/deps/simdutf/src/icelake/icelake_from_utf8.inl.cpp +266 -0
- package/deps/simdutf/src/icelake/icelake_from_valid_utf8.inl.cpp +136 -0
- package/deps/simdutf/src/icelake/icelake_macros.inl.cpp +143 -0
- package/deps/simdutf/src/icelake/icelake_utf16fix.cpp +138 -0
- package/deps/simdutf/src/icelake/icelake_utf32_validation.inl.cpp +63 -0
- package/deps/simdutf/src/icelake/icelake_utf8_common.inl.cpp +753 -0
- package/deps/simdutf/src/icelake/icelake_utf8_length_from_utf16.inl.cpp +269 -0
- package/deps/simdutf/src/icelake/icelake_utf8_validation.inl.cpp +116 -0
- package/deps/simdutf/src/icelake/implementation.cpp +1903 -0
- package/deps/simdutf/src/implementation.cpp +2526 -0
- package/deps/simdutf/src/lasx/implementation.cpp +1531 -0
- package/deps/simdutf/src/lasx/lasx_base64.cpp +695 -0
- package/deps/simdutf/src/lasx/lasx_convert_latin1_to_utf16.cpp +76 -0
- package/deps/simdutf/src/lasx/lasx_convert_latin1_to_utf32.cpp +55 -0
- package/deps/simdutf/src/lasx/lasx_convert_latin1_to_utf8.cpp +65 -0
- package/deps/simdutf/src/lasx/lasx_convert_utf16_to_latin1.cpp +64 -0
- package/deps/simdutf/src/lasx/lasx_convert_utf16_to_utf32.cpp +183 -0
- package/deps/simdutf/src/lasx/lasx_convert_utf16_to_utf8.cpp +550 -0
- package/deps/simdutf/src/lasx/lasx_convert_utf32_to_latin1.cpp +73 -0
- package/deps/simdutf/src/lasx/lasx_convert_utf32_to_utf16.cpp +218 -0
- package/deps/simdutf/src/lasx/lasx_convert_utf32_to_utf8.cpp +589 -0
- package/deps/simdutf/src/lasx/lasx_convert_utf8_to_latin1.cpp +72 -0
- package/deps/simdutf/src/lasx/lasx_convert_utf8_to_utf16.cpp +296 -0
- package/deps/simdutf/src/lasx/lasx_convert_utf8_to_utf32.cpp +190 -0
- package/deps/simdutf/src/lasx/lasx_find.cpp +64 -0
- package/deps/simdutf/src/lasx/lasx_validate_utf16.cpp +13 -0
- package/deps/simdutf/src/lasx/lasx_validate_utf32le.cpp +84 -0
- package/deps/simdutf/src/lsx/implementation.cpp +1417 -0
- package/deps/simdutf/src/lsx/lsx_base64.cpp +675 -0
- package/deps/simdutf/src/lsx/lsx_convert_latin1_to_utf16.cpp +39 -0
- package/deps/simdutf/src/lsx/lsx_convert_latin1_to_utf32.cpp +27 -0
- package/deps/simdutf/src/lsx/lsx_convert_latin1_to_utf8.cpp +56 -0
- package/deps/simdutf/src/lsx/lsx_convert_utf16_to_latin1.cpp +64 -0
- package/deps/simdutf/src/lsx/lsx_convert_utf16_to_utf32.cpp +133 -0
- package/deps/simdutf/src/lsx/lsx_convert_utf16_to_utf8.cpp +518 -0
- package/deps/simdutf/src/lsx/lsx_convert_utf32_to_latin1.cpp +66 -0
- package/deps/simdutf/src/lsx/lsx_convert_utf32_to_utf16.cpp +155 -0
- package/deps/simdutf/src/lsx/lsx_convert_utf32_to_utf8.cpp +459 -0
- package/deps/simdutf/src/lsx/lsx_convert_utf8_to_latin1.cpp +75 -0
- package/deps/simdutf/src/lsx/lsx_convert_utf8_to_utf16.cpp +291 -0
- package/deps/simdutf/src/lsx/lsx_convert_utf8_to_utf32.cpp +179 -0
- package/deps/simdutf/src/lsx/lsx_find.cpp +60 -0
- package/deps/simdutf/src/lsx/lsx_validate_utf16.cpp +13 -0
- package/deps/simdutf/src/lsx/lsx_validate_utf32le.cpp +68 -0
- package/deps/simdutf/src/ppc64/implementation.cpp +992 -0
- package/deps/simdutf/src/ppc64/ppc64_base64.cpp +480 -0
- package/deps/simdutf/src/ppc64/ppc64_base64_internal_tests.cpp +401 -0
- package/deps/simdutf/src/ppc64/ppc64_convert_latin1_to_utf16.cpp +12 -0
- package/deps/simdutf/src/ppc64/ppc64_convert_latin1_to_utf32.cpp +12 -0
- package/deps/simdutf/src/ppc64/ppc64_convert_latin1_to_utf8.cpp +149 -0
- package/deps/simdutf/src/ppc64/ppc64_convert_utf16_to_latin1.cpp +67 -0
- package/deps/simdutf/src/ppc64/ppc64_convert_utf16_to_utf32.cpp +87 -0
- package/deps/simdutf/src/ppc64/ppc64_convert_utf16_to_utf8.cpp +296 -0
- package/deps/simdutf/src/ppc64/ppc64_convert_utf32_to_latin1.cpp +57 -0
- package/deps/simdutf/src/ppc64/ppc64_convert_utf32_to_utf16.cpp +117 -0
- package/deps/simdutf/src/ppc64/ppc64_convert_utf32_to_utf8.cpp +166 -0
- package/deps/simdutf/src/ppc64/ppc64_convert_utf8_to_latin1.cpp +69 -0
- package/deps/simdutf/src/ppc64/ppc64_convert_utf8_to_utf16.cpp +211 -0
- package/deps/simdutf/src/ppc64/ppc64_convert_utf8_to_utf32.cpp +153 -0
- package/deps/simdutf/src/ppc64/ppc64_utf16_to_utf8_tables.h +1011 -0
- package/deps/simdutf/src/ppc64/ppc64_utf8_length_from_latin1.cpp +37 -0
- package/deps/simdutf/src/ppc64/ppc64_validate_utf16.cpp +19 -0
- package/deps/simdutf/src/ppc64/templates.cpp +91 -0
- package/deps/simdutf/src/rvv/implementation.cpp +138 -0
- package/deps/simdutf/src/rvv/rvv_find.cpp +27 -0
- package/deps/simdutf/src/rvv/rvv_helpers.inl.cpp +23 -0
- package/deps/simdutf/src/rvv/rvv_latin1_to.inl.cpp +71 -0
- package/deps/simdutf/src/rvv/rvv_length_from.inl.cpp +164 -0
- package/deps/simdutf/src/rvv/rvv_utf16_to.inl.cpp +399 -0
- package/deps/simdutf/src/rvv/rvv_utf16fix.cpp +110 -0
- package/deps/simdutf/src/rvv/rvv_utf32_to.inl.cpp +307 -0
- package/deps/simdutf/src/rvv/rvv_utf8_to.inl.cpp +435 -0
- package/deps/simdutf/src/rvv/rvv_validate.inl.cpp +275 -0
- package/deps/simdutf/src/simdutf/arm64/begin.h +2 -0
- package/deps/simdutf/src/simdutf/arm64/bitmanipulation.h +34 -0
- package/deps/simdutf/src/simdutf/arm64/end.h +2 -0
- package/deps/simdutf/src/simdutf/arm64/implementation.h +307 -0
- package/deps/simdutf/src/simdutf/arm64/intrinsics.h +10 -0
- package/deps/simdutf/src/simdutf/arm64/simd.h +547 -0
- package/deps/simdutf/src/simdutf/arm64/simd16-inl.h +403 -0
- package/deps/simdutf/src/simdutf/arm64/simd32-inl.h +129 -0
- package/deps/simdutf/src/simdutf/arm64/simd64-inl.h +28 -0
- package/deps/simdutf/src/simdutf/arm64.h +43 -0
- package/deps/simdutf/src/simdutf/fallback/begin.h +1 -0
- package/deps/simdutf/src/simdutf/fallback/bitmanipulation.h +13 -0
- package/deps/simdutf/src/simdutf/fallback/end.h +1 -0
- package/deps/simdutf/src/simdutf/fallback/implementation.h +331 -0
- package/deps/simdutf/src/simdutf/fallback.h +42 -0
- package/deps/simdutf/src/simdutf/haswell/begin.h +15 -0
- package/deps/simdutf/src/simdutf/haswell/bitmanipulation.h +35 -0
- package/deps/simdutf/src/simdutf/haswell/end.h +13 -0
- package/deps/simdutf/src/simdutf/haswell/implementation.h +338 -0
- package/deps/simdutf/src/simdutf/haswell/intrinsics.h +67 -0
- package/deps/simdutf/src/simdutf/haswell/simd.h +363 -0
- package/deps/simdutf/src/simdutf/haswell/simd16-inl.h +261 -0
- package/deps/simdutf/src/simdutf/haswell/simd32-inl.h +111 -0
- package/deps/simdutf/src/simdutf/haswell/simd64-inl.h +34 -0
- package/deps/simdutf/src/simdutf/haswell.h +63 -0
- package/deps/simdutf/src/simdutf/icelake/begin.h +14 -0
- package/deps/simdutf/src/simdutf/icelake/bitmanipulation.h +44 -0
- package/deps/simdutf/src/simdutf/icelake/end.h +12 -0
- package/deps/simdutf/src/simdutf/icelake/implementation.h +346 -0
- package/deps/simdutf/src/simdutf/icelake/intrinsics.h +138 -0
- package/deps/simdutf/src/simdutf/icelake/simd.h +17 -0
- package/deps/simdutf/src/simdutf/icelake/simd16-inl.h +90 -0
- package/deps/simdutf/src/simdutf/icelake/simd32-inl.h +47 -0
- package/deps/simdutf/src/simdutf/icelake.h +81 -0
- package/deps/simdutf/src/simdutf/lasx/begin.h +8 -0
- package/deps/simdutf/src/simdutf/lasx/bitmanipulation.h +25 -0
- package/deps/simdutf/src/simdutf/lasx/end.h +8 -0
- package/deps/simdutf/src/simdutf/lasx/implementation.h +310 -0
- package/deps/simdutf/src/simdutf/lasx/intrinsics.h +319 -0
- package/deps/simdutf/src/simdutf/lasx/simd.h +551 -0
- package/deps/simdutf/src/simdutf/lasx/simd16-inl.h +234 -0
- package/deps/simdutf/src/simdutf/lasx/simd32-inl.h +74 -0
- package/deps/simdutf/src/simdutf/lasx/simd64-inl.h +52 -0
- package/deps/simdutf/src/simdutf/lasx.h +49 -0
- package/deps/simdutf/src/simdutf/lsx/begin.h +2 -0
- package/deps/simdutf/src/simdutf/lsx/bitmanipulation.h +25 -0
- package/deps/simdutf/src/simdutf/lsx/end.h +2 -0
- package/deps/simdutf/src/simdutf/lsx/implementation.h +309 -0
- package/deps/simdutf/src/simdutf/lsx/intrinsics.h +196 -0
- package/deps/simdutf/src/simdutf/lsx/simd.h +421 -0
- package/deps/simdutf/src/simdutf/lsx/simd16-inl.h +242 -0
- package/deps/simdutf/src/simdutf/lsx/simd32-inl.h +69 -0
- package/deps/simdutf/src/simdutf/lsx/simd64-inl.h +50 -0
- package/deps/simdutf/src/simdutf/lsx.h +52 -0
- package/deps/simdutf/src/simdutf/ppc64/begin.h +1 -0
- package/deps/simdutf/src/simdutf/ppc64/bitmanipulation.h +29 -0
- package/deps/simdutf/src/simdutf/ppc64/end.h +1 -0
- package/deps/simdutf/src/simdutf/ppc64/implementation.h +348 -0
- package/deps/simdutf/src/simdutf/ppc64/intrinsics.h +19 -0
- package/deps/simdutf/src/simdutf/ppc64/simd.h +177 -0
- package/deps/simdutf/src/simdutf/ppc64/simd16-inl.h +327 -0
- package/deps/simdutf/src/simdutf/ppc64/simd32-inl.h +247 -0
- package/deps/simdutf/src/simdutf/ppc64/simd8-inl.h +618 -0
- package/deps/simdutf/src/simdutf/ppc64.h +40 -0
- package/deps/simdutf/src/simdutf/rvv/begin.h +7 -0
- package/deps/simdutf/src/simdutf/rvv/end.h +7 -0
- package/deps/simdutf/src/simdutf/rvv/implementation.h +321 -0
- package/deps/simdutf/src/simdutf/rvv/intrinsics.h +131 -0
- package/deps/simdutf/src/simdutf/rvv.h +41 -0
- package/deps/simdutf/src/simdutf/westmere/begin.h +8 -0
- package/deps/simdutf/src/simdutf/westmere/bitmanipulation.h +37 -0
- package/deps/simdutf/src/simdutf/westmere/end.h +8 -0
- package/deps/simdutf/src/simdutf/westmere/implementation.h +338 -0
- package/deps/simdutf/src/simdutf/westmere/intrinsics.h +38 -0
- package/deps/simdutf/src/simdutf/westmere/simd.h +379 -0
- package/deps/simdutf/src/simdutf/westmere/simd16-inl.h +242 -0
- package/deps/simdutf/src/simdutf/westmere/simd32-inl.h +151 -0
- package/deps/simdutf/src/simdutf/westmere/simd64-inl.h +33 -0
- package/deps/simdutf/src/simdutf/westmere.h +59 -0
- package/deps/simdutf/src/simdutf.cpp +152 -0
- package/deps/simdutf/src/simdutf_c.cpp +525 -0
- package/deps/simdutf/src/tables/utf16_to_utf8_tables.h +768 -0
- package/deps/simdutf/src/tables/utf32_to_utf16_tables.h +53 -0
- package/deps/simdutf/src/tables/utf8_to_utf16_tables.h +826 -0
- package/deps/simdutf/src/westmere/implementation.cpp +1479 -0
- package/deps/simdutf/src/westmere/internal/loader.cpp +7 -0
- package/deps/simdutf/src/westmere/internal/write_v_u16_11bits_to_utf8.cpp +66 -0
- package/deps/simdutf/src/westmere/sse_base64.cpp +672 -0
- package/deps/simdutf/src/westmere/sse_convert_latin1_to_utf16.cpp +21 -0
- package/deps/simdutf/src/westmere/sse_convert_latin1_to_utf32.cpp +31 -0
- package/deps/simdutf/src/westmere/sse_convert_latin1_to_utf8.cpp +71 -0
- package/deps/simdutf/src/westmere/sse_convert_utf16_to_latin1.cpp +70 -0
- package/deps/simdutf/src/westmere/sse_convert_utf16_to_utf32.cpp +206 -0
- package/deps/simdutf/src/westmere/sse_convert_utf16_to_utf8.cpp +504 -0
- package/deps/simdutf/src/westmere/sse_convert_utf32_to_latin1.cpp +82 -0
- package/deps/simdutf/src/westmere/sse_convert_utf32_to_utf16.cpp +209 -0
- package/deps/simdutf/src/westmere/sse_convert_utf32_to_utf8.cpp +589 -0
- package/deps/simdutf/src/westmere/sse_convert_utf8_to_latin1.cpp +58 -0
- package/deps/simdutf/src/westmere/sse_convert_utf8_to_utf16.cpp +197 -0
- package/deps/simdutf/src/westmere/sse_convert_utf8_to_utf32.cpp +141 -0
- package/deps/simdutf/src/westmere/sse_utf16fix.cpp +82 -0
- package/deps/simdutf/src/westmere/sse_validate_utf16.cpp +17 -0
- package/lib/commonjs/argon2.js +51 -2
- package/lib/commonjs/argon2.js.map +1 -1
- package/lib/commonjs/cipher.js +109 -11
- package/lib/commonjs/cipher.js.map +1 -1
- package/lib/commonjs/dsa.js +8 -2
- package/lib/commonjs/dsa.js.map +1 -1
- package/lib/commonjs/hash.js +15 -5
- package/lib/commonjs/hash.js.map +1 -1
- package/lib/commonjs/hkdf.js +33 -6
- package/lib/commonjs/hkdf.js.map +1 -1
- package/lib/commonjs/hmac.js +15 -5
- package/lib/commonjs/hmac.js.map +1 -1
- package/lib/commonjs/keys/publicCipher.js +10 -4
- package/lib/commonjs/keys/publicCipher.js.map +1 -1
- package/lib/commonjs/random.js +11 -2
- package/lib/commonjs/random.js.map +1 -1
- package/lib/commonjs/rsa.js +12 -5
- package/lib/commonjs/rsa.js.map +1 -1
- package/lib/commonjs/scrypt.js +47 -6
- package/lib/commonjs/scrypt.js.map +1 -1
- package/lib/commonjs/subtle.js +76 -5
- package/lib/commonjs/subtle.js.map +1 -1
- package/lib/commonjs/utils/cipher.js +18 -7
- package/lib/commonjs/utils/cipher.js.map +1 -1
- package/lib/commonjs/utils/conversion.js +33 -9
- package/lib/commonjs/utils/conversion.js.map +1 -1
- package/lib/commonjs/utils/timingSafeEqual.js +7 -2
- package/lib/commonjs/utils/timingSafeEqual.js.map +1 -1
- package/lib/commonjs/x509certificate.js +6 -6
- package/lib/commonjs/x509certificate.js.map +1 -1
- package/lib/module/argon2.js +51 -2
- package/lib/module/argon2.js.map +1 -1
- package/lib/module/cipher.js +109 -11
- package/lib/module/cipher.js.map +1 -1
- package/lib/module/dsa.js +8 -2
- package/lib/module/dsa.js.map +1 -1
- package/lib/module/hash.js +15 -5
- package/lib/module/hash.js.map +1 -1
- package/lib/module/hkdf.js +33 -6
- package/lib/module/hkdf.js.map +1 -1
- package/lib/module/hmac.js +15 -5
- package/lib/module/hmac.js.map +1 -1
- package/lib/module/keys/publicCipher.js +10 -4
- package/lib/module/keys/publicCipher.js.map +1 -1
- package/lib/module/random.js +11 -2
- package/lib/module/random.js.map +1 -1
- package/lib/module/rsa.js +11 -4
- package/lib/module/rsa.js.map +1 -1
- package/lib/module/scrypt.js +47 -6
- package/lib/module/scrypt.js.map +1 -1
- package/lib/module/subtle.js +76 -5
- package/lib/module/subtle.js.map +1 -1
- package/lib/module/utils/cipher.js +18 -7
- package/lib/module/utils/cipher.js.map +1 -1
- package/lib/module/utils/conversion.js +33 -9
- package/lib/module/utils/conversion.js.map +1 -1
- package/lib/module/utils/timingSafeEqual.js +8 -3
- package/lib/module/utils/timingSafeEqual.js.map +1 -1
- package/lib/module/x509certificate.js +6 -6
- package/lib/module/x509certificate.js.map +1 -1
- package/lib/typescript/argon2.d.ts.map +1 -1
- package/lib/typescript/cipher.d.ts +2 -2
- package/lib/typescript/cipher.d.ts.map +1 -1
- package/lib/typescript/dsa.d.ts.map +1 -1
- package/lib/typescript/hash.d.ts +2 -2
- package/lib/typescript/hash.d.ts.map +1 -1
- package/lib/typescript/hkdf.d.ts.map +1 -1
- package/lib/typescript/hmac.d.ts +2 -2
- package/lib/typescript/hmac.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +1 -1
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/keys/publicCipher.d.ts.map +1 -1
- package/lib/typescript/random.d.ts.map +1 -1
- package/lib/typescript/rsa.d.ts.map +1 -1
- package/lib/typescript/scrypt.d.ts.map +1 -1
- package/lib/typescript/specs/utils.nitro.d.ts +0 -2
- package/lib/typescript/specs/utils.nitro.d.ts.map +1 -1
- package/lib/typescript/subtle.d.ts.map +1 -1
- package/lib/typescript/utils/cipher.d.ts +13 -1
- package/lib/typescript/utils/cipher.d.ts.map +1 -1
- package/lib/typescript/utils/conversion.d.ts +9 -6
- package/lib/typescript/utils/conversion.d.ts.map +1 -1
- package/lib/typescript/utils/timingSafeEqual.d.ts.map +1 -1
- package/lib/typescript/x509certificate.d.ts.map +1 -1
- package/nitrogen/generated/shared/c++/HybridUtilsSpec.cpp +0 -2
- package/nitrogen/generated/shared/c++/HybridUtilsSpec.hpp +0 -3
- package/package.json +38 -6
- package/src/argon2.ts +80 -2
- package/src/cipher.ts +139 -15
- package/src/dsa.ts +11 -2
- package/src/hash.ts +17 -7
- package/src/hkdf.ts +44 -6
- package/src/hmac.ts +17 -7
- package/src/keys/publicCipher.ts +10 -4
- package/src/random.ts +11 -2
- package/src/rsa.ts +18 -4
- package/src/scrypt.ts +73 -6
- package/src/specs/utils.nitro.ts +0 -2
- package/src/subtle.ts +90 -8
- package/src/utils/cipher.ts +30 -8
- package/src/utils/conversion.ts +58 -20
- package/src/utils/timingSafeEqual.ts +8 -3
- package/src/x509certificate.ts +5 -6
- package/deps/blake3/.cargo/config.toml +0 -2
- package/deps/blake3/.git-blame-ignore-revs +0 -2
- package/deps/blake3/.github/workflows/build_b3sum.py +0 -38
- package/deps/blake3/.github/workflows/ci.yml +0 -491
- package/deps/blake3/.github/workflows/tag.yml +0 -43
- package/deps/blake3/.github/workflows/upload_github_release_asset.py +0 -73
- package/deps/blake3/CONTRIBUTING.md +0 -31
- package/deps/blake3/Cargo.toml +0 -135
- package/deps/blake3/b3sum/Cargo.lock +0 -513
- package/deps/blake3/b3sum/Cargo.toml +0 -26
- package/deps/blake3/b3sum/README.md +0 -72
- package/deps/blake3/b3sum/src/main.rs +0 -564
- package/deps/blake3/b3sum/src/unit_tests.rs +0 -235
- package/deps/blake3/b3sum/tests/cli_tests.rs +0 -680
- package/deps/blake3/b3sum/what_does_check_do.md +0 -176
- package/deps/blake3/benches/bench.rs +0 -623
- package/deps/blake3/build.rs +0 -389
- package/deps/blake3/c/CMakeLists.txt +0 -383
- package/deps/blake3/c/CMakePresets.json +0 -73
- package/deps/blake3/c/Makefile.testing +0 -82
- package/deps/blake3/c/blake3-config.cmake.in +0 -14
- package/deps/blake3/c/blake3_avx2.c +0 -326
- package/deps/blake3/c/blake3_avx2_x86-64_unix.S +0 -1815
- package/deps/blake3/c/blake3_avx2_x86-64_windows_gnu.S +0 -1817
- package/deps/blake3/c/blake3_avx2_x86-64_windows_msvc.asm +0 -1828
- package/deps/blake3/c/blake3_avx512.c +0 -1388
- package/deps/blake3/c/blake3_avx512_x86-64_unix.S +0 -4824
- package/deps/blake3/c/blake3_avx512_x86-64_windows_gnu.S +0 -2615
- package/deps/blake3/c/blake3_avx512_x86-64_windows_msvc.asm +0 -2634
- package/deps/blake3/c/blake3_c_rust_bindings/Cargo.toml +0 -32
- package/deps/blake3/c/blake3_c_rust_bindings/README.md +0 -4
- package/deps/blake3/c/blake3_c_rust_bindings/benches/bench.rs +0 -477
- package/deps/blake3/c/blake3_c_rust_bindings/build.rs +0 -253
- package/deps/blake3/c/blake3_c_rust_bindings/cross_test.sh +0 -31
- package/deps/blake3/c/blake3_c_rust_bindings/src/lib.rs +0 -333
- package/deps/blake3/c/blake3_c_rust_bindings/src/test.rs +0 -696
- package/deps/blake3/c/blake3_sse2.c +0 -566
- package/deps/blake3/c/blake3_sse2_x86-64_unix.S +0 -2291
- package/deps/blake3/c/blake3_sse2_x86-64_windows_gnu.S +0 -2332
- package/deps/blake3/c/blake3_sse2_x86-64_windows_msvc.asm +0 -2350
- package/deps/blake3/c/blake3_sse41.c +0 -560
- package/deps/blake3/c/blake3_sse41_x86-64_unix.S +0 -2028
- package/deps/blake3/c/blake3_sse41_x86-64_windows_gnu.S +0 -2069
- package/deps/blake3/c/blake3_sse41_x86-64_windows_msvc.asm +0 -2089
- package/deps/blake3/c/blake3_tbb.cpp +0 -37
- package/deps/blake3/c/dependencies/CMakeLists.txt +0 -3
- package/deps/blake3/c/dependencies/tbb/CMakeLists.txt +0 -28
- package/deps/blake3/c/example.c +0 -36
- package/deps/blake3/c/example_tbb.c +0 -57
- package/deps/blake3/c/libblake3.pc.in +0 -12
- package/deps/blake3/c/main.c +0 -166
- package/deps/blake3/c/test.py +0 -97
- package/deps/blake3/media/B3.svg +0 -70
- package/deps/blake3/media/BLAKE3.svg +0 -85
- package/deps/blake3/media/speed.svg +0 -1474
- package/deps/blake3/reference_impl/Cargo.toml +0 -8
- package/deps/blake3/reference_impl/README.md +0 -14
- package/deps/blake3/reference_impl/reference_impl.rs +0 -374
- package/deps/blake3/src/ffi_avx2.rs +0 -65
- package/deps/blake3/src/ffi_avx512.rs +0 -169
- package/deps/blake3/src/ffi_neon.rs +0 -82
- package/deps/blake3/src/ffi_sse2.rs +0 -126
- package/deps/blake3/src/ffi_sse41.rs +0 -126
- package/deps/blake3/src/guts.rs +0 -60
- package/deps/blake3/src/hazmat.rs +0 -704
- package/deps/blake3/src/io.rs +0 -64
- package/deps/blake3/src/join.rs +0 -92
- package/deps/blake3/src/lib.rs +0 -1835
- package/deps/blake3/src/platform.rs +0 -587
- package/deps/blake3/src/portable.rs +0 -198
- package/deps/blake3/src/rust_avx2.rs +0 -474
- package/deps/blake3/src/rust_sse2.rs +0 -775
- package/deps/blake3/src/rust_sse41.rs +0 -766
- package/deps/blake3/src/test.rs +0 -1049
- package/deps/blake3/src/traits.rs +0 -227
- package/deps/blake3/src/wasm32_simd.rs +0 -794
- package/deps/blake3/test_vectors/Cargo.toml +0 -19
- package/deps/blake3/test_vectors/cross_test.sh +0 -25
- package/deps/blake3/test_vectors/src/bin/generate.rs +0 -4
- package/deps/blake3/test_vectors/src/lib.rs +0 -350
- package/deps/blake3/test_vectors/test_vectors.json +0 -217
- package/deps/blake3/tools/compiler_version/Cargo.toml +0 -7
- package/deps/blake3/tools/compiler_version/build.rs +0 -6
- package/deps/blake3/tools/compiler_version/src/main.rs +0 -27
- package/deps/blake3/tools/instruction_set_support/Cargo.toml +0 -6
- package/deps/blake3/tools/instruction_set_support/src/main.rs +0 -10
- package/deps/blake3/tools/release.md +0 -16
- package/deps/ncrypto/.bazelignore +0 -4
- package/deps/ncrypto/.bazelrc +0 -1
- package/deps/ncrypto/.bazelversion +0 -1
- package/deps/ncrypto/.clang-format +0 -111
- package/deps/ncrypto/.github/workflows/bazel.yml +0 -58
- package/deps/ncrypto/.github/workflows/commitlint.yml +0 -16
- package/deps/ncrypto/.github/workflows/linter.yml +0 -38
- package/deps/ncrypto/.github/workflows/macos.yml +0 -43
- package/deps/ncrypto/.github/workflows/release-please.yml +0 -16
- package/deps/ncrypto/.github/workflows/ubuntu.yml +0 -128
- package/deps/ncrypto/.github/workflows/visual-studio.yml +0 -49
- package/deps/ncrypto/.python-version +0 -1
- package/deps/ncrypto/.release-please-manifest.json +0 -3
- package/deps/ncrypto/BUILD.bazel +0 -44
- package/deps/ncrypto/CHANGELOG.md +0 -37
- package/deps/ncrypto/CMakeLists.txt +0 -79
- package/deps/ncrypto/MODULE.bazel +0 -16
- package/deps/ncrypto/MODULE.bazel.lock +0 -461
- package/deps/ncrypto/cmake/CPM.cmake +0 -1225
- package/deps/ncrypto/cmake/ncrypto-flags.cmake +0 -17
- package/deps/ncrypto/ncrypto.pc.in +0 -10
- package/deps/ncrypto/patches/0001-Expose-libdecrepit-so-NodeJS-can-use-it-for-ncrypto.patch +0 -28
- package/deps/ncrypto/pyproject.toml +0 -38
- package/deps/ncrypto/release-please-config.json +0 -11
- package/deps/ncrypto/src/CMakeLists.txt +0 -40
- package/deps/ncrypto/tests/BUILD.bazel +0 -11
- package/deps/ncrypto/tests/CMakeLists.txt +0 -7
- package/deps/ncrypto/tests/basic.cpp +0 -856
- package/deps/ncrypto/tools/run-clang-format.sh +0 -42
- package/lib/tsconfig.tsbuildinfo +0 -1
|
@@ -0,0 +1,589 @@
|
|
|
1
|
+
std::pair<const char32_t *, char *>
|
|
2
|
+
lasx_convert_utf32_to_utf8(const char32_t *buf, size_t len, char *utf8_out) {
|
|
3
|
+
uint8_t *utf8_output = reinterpret_cast<uint8_t *>(utf8_out);
|
|
4
|
+
const char32_t *end = buf + len;
|
|
5
|
+
|
|
6
|
+
// load addr align 32
|
|
7
|
+
while (((uint64_t)buf & 0x1F) && buf < end) {
|
|
8
|
+
uint32_t word = *buf;
|
|
9
|
+
if ((word & 0xFFFFFF80) == 0) {
|
|
10
|
+
*utf8_output++ = char(word);
|
|
11
|
+
} else if ((word & 0xFFFFF800) == 0) {
|
|
12
|
+
*utf8_output++ = char((word >> 6) | 0b11000000);
|
|
13
|
+
*utf8_output++ = char((word & 0b111111) | 0b10000000);
|
|
14
|
+
} else if ((word & 0xFFFF0000) == 0) {
|
|
15
|
+
if (word >= 0xD800 && word <= 0xDFFF) {
|
|
16
|
+
return std::make_pair(nullptr, reinterpret_cast<char *>(utf8_output));
|
|
17
|
+
}
|
|
18
|
+
*utf8_output++ = char((word >> 12) | 0b11100000);
|
|
19
|
+
*utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000);
|
|
20
|
+
*utf8_output++ = char((word & 0b111111) | 0b10000000);
|
|
21
|
+
} else {
|
|
22
|
+
if (word > 0x10FFFF) {
|
|
23
|
+
return std::make_pair(nullptr, reinterpret_cast<char *>(utf8_output));
|
|
24
|
+
}
|
|
25
|
+
*utf8_output++ = char((word >> 18) | 0b11110000);
|
|
26
|
+
*utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000);
|
|
27
|
+
*utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000);
|
|
28
|
+
*utf8_output++ = char((word & 0b111111) | 0b10000000);
|
|
29
|
+
}
|
|
30
|
+
buf++;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
__m256i v_c080 = lasx_splat_u16(0xc080);
|
|
34
|
+
__m256i v_07ff = lasx_splat_u16(0x07ff);
|
|
35
|
+
__m256i v_dfff = lasx_splat_u16(0xdfff);
|
|
36
|
+
__m256i v_d800 = lasx_splat_u16(0xd800);
|
|
37
|
+
__m256i zero = __lasx_xvldi(0);
|
|
38
|
+
__m128i zero_128 = __lsx_vldi(0);
|
|
39
|
+
__m256i forbidden_bytemask = __lasx_xvldi(0x0);
|
|
40
|
+
|
|
41
|
+
const size_t safety_margin =
|
|
42
|
+
12; // to avoid overruns, see issue
|
|
43
|
+
// https://github.com/simdutf/simdutf/issues/92
|
|
44
|
+
|
|
45
|
+
while (end - buf > std::ptrdiff_t(16 + safety_margin)) {
|
|
46
|
+
__m256i in = __lasx_xvld(reinterpret_cast<const uint32_t *>(buf), 0);
|
|
47
|
+
__m256i nextin = __lasx_xvld(reinterpret_cast<const uint32_t *>(buf), 32);
|
|
48
|
+
|
|
49
|
+
// Check if no bits set above 16th
|
|
50
|
+
if (__lasx_xbz_v(__lasx_xvpickod_h(in, nextin))) {
|
|
51
|
+
// Pack UTF-32 to UTF-16 safely (without surrogate pairs)
|
|
52
|
+
// Apply UTF-16 => UTF-8 routine (lasx_convert_utf16_to_utf8.cpp)
|
|
53
|
+
__m256i utf16_packed =
|
|
54
|
+
__lasx_xvpermi_d(__lasx_xvpickev_h(nextin, in), 0b11011000);
|
|
55
|
+
|
|
56
|
+
if (__lasx_xbz_v(__lasx_xvslt_hu(__lasx_xvrepli_h(0x7F),
|
|
57
|
+
utf16_packed))) { // ASCII fast path!!!!
|
|
58
|
+
// 1. pack the bytes
|
|
59
|
+
// obviously suboptimal.
|
|
60
|
+
__m256i utf8_packed = __lasx_xvpermi_d(
|
|
61
|
+
__lasx_xvpickev_b(utf16_packed, utf16_packed), 0b00001000);
|
|
62
|
+
// 2. store (8 bytes)
|
|
63
|
+
__lsx_vst(lasx_extracti128_lo(utf8_packed), utf8_output, 0);
|
|
64
|
+
// 3. adjust pointers
|
|
65
|
+
buf += 16;
|
|
66
|
+
utf8_output += 16;
|
|
67
|
+
continue; // we are done for this round!
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (__lasx_xbz_v(__lasx_xvslt_hu(v_07ff, utf16_packed))) {
|
|
71
|
+
// 1. prepare 2-byte values
|
|
72
|
+
// input 16-bit word : [0000|0aaa|aabb|bbbb] x 8
|
|
73
|
+
// expected output : [110a|aaaa|10bb|bbbb] x 8
|
|
74
|
+
|
|
75
|
+
// t0 = [000a|aaaa|bbbb|bb00]
|
|
76
|
+
const __m256i t0 = __lasx_xvslli_h(utf16_packed, 2);
|
|
77
|
+
// t1 = [000a|aaaa|0000|0000]
|
|
78
|
+
const __m256i t1 = __lasx_xvand_v(t0, lasx_splat_u16(0x1f00));
|
|
79
|
+
// t2 = [0000|0000|00bb|bbbb]
|
|
80
|
+
const __m256i t2 = __lasx_xvand_v(utf16_packed, __lasx_xvrepli_h(0x3f));
|
|
81
|
+
// t3 = [000a|aaaa|00bb|bbbb]
|
|
82
|
+
const __m256i t3 = __lasx_xvor_v(t1, t2);
|
|
83
|
+
// t4 = [110a|aaaa|10bb|bbbb]
|
|
84
|
+
const __m256i t4 = __lasx_xvor_v(t3, v_c080);
|
|
85
|
+
// 2. merge ASCII and 2-byte codewords
|
|
86
|
+
__m256i one_byte_bytemask =
|
|
87
|
+
__lasx_xvsle_hu(utf16_packed, __lasx_xvrepli_h(0x7F /*0x007F*/));
|
|
88
|
+
__m256i utf8_unpacked =
|
|
89
|
+
__lasx_xvbitsel_v(t4, utf16_packed, one_byte_bytemask);
|
|
90
|
+
// 3. prepare bitmask for 8-bit lookup
|
|
91
|
+
__m256i mask = __lasx_xvmskltz_h(one_byte_bytemask);
|
|
92
|
+
uint32_t m1 = __lasx_xvpickve2gr_wu(mask, 0);
|
|
93
|
+
uint32_t m2 = __lasx_xvpickve2gr_wu(mask, 4);
|
|
94
|
+
// 4. pack the bytes
|
|
95
|
+
const uint8_t *row1 =
|
|
96
|
+
&simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes
|
|
97
|
+
[lasx_1_2_utf8_bytes_mask[m1]][0];
|
|
98
|
+
__m128i shuffle1 = __lsx_vld(row1, 1);
|
|
99
|
+
__m128i utf8_packed1 = __lsx_vshuf_b(
|
|
100
|
+
zero_128, lasx_extracti128_lo(utf8_unpacked), shuffle1);
|
|
101
|
+
|
|
102
|
+
const uint8_t *row2 =
|
|
103
|
+
&simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes
|
|
104
|
+
[lasx_1_2_utf8_bytes_mask[m2]][0];
|
|
105
|
+
__m128i shuffle2 = __lsx_vld(row2, 1);
|
|
106
|
+
__m128i utf8_packed2 = __lsx_vshuf_b(
|
|
107
|
+
zero_128, lasx_extracti128_hi(utf8_unpacked), shuffle2);
|
|
108
|
+
// 5. store bytes
|
|
109
|
+
__lsx_vst(utf8_packed1, utf8_output, 0);
|
|
110
|
+
utf8_output += row1[0];
|
|
111
|
+
|
|
112
|
+
__lsx_vst(utf8_packed2, utf8_output, 0);
|
|
113
|
+
utf8_output += row2[0];
|
|
114
|
+
|
|
115
|
+
buf += 16;
|
|
116
|
+
continue;
|
|
117
|
+
} else {
|
|
118
|
+
// case: code units from register produce either 1, 2 or 3 UTF-8 bytes
|
|
119
|
+
forbidden_bytemask = __lasx_xvor_v(
|
|
120
|
+
__lasx_xvand_v(
|
|
121
|
+
__lasx_xvsle_h(utf16_packed, v_dfff), // utf16_packed <= 0xdfff
|
|
122
|
+
__lasx_xvsle_h(v_d800, utf16_packed)), // utf16_packed >= 0xd800
|
|
123
|
+
forbidden_bytemask);
|
|
124
|
+
/* In this branch we handle three cases:
|
|
125
|
+
1. [0000|0000|0ccc|cccc] => [0ccc|cccc] -
|
|
126
|
+
single UFT-8 byte
|
|
127
|
+
2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] -
|
|
128
|
+
two UTF-8 bytes
|
|
129
|
+
3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] -
|
|
130
|
+
three UTF-8 bytes
|
|
131
|
+
|
|
132
|
+
We expand the input word (16-bit) into two code units (32-bit), thus
|
|
133
|
+
we have room for four bytes. However, we need five distinct bit
|
|
134
|
+
layouts. Note that the last byte in cases #2 and #3 is the same.
|
|
135
|
+
|
|
136
|
+
We precompute byte 1 for case #1 and the common byte for cases #2 &
|
|
137
|
+
#3 in register t2.
|
|
138
|
+
|
|
139
|
+
We precompute byte 1 for case #3 and -- **conditionally** --
|
|
140
|
+
precompute either byte 1 for case #2 or byte 2 for case #3. Note that
|
|
141
|
+
they differ by exactly one bit.
|
|
142
|
+
|
|
143
|
+
Finally from these two code units we build proper UTF-8 sequence,
|
|
144
|
+
taking into account the case (i.e, the number of bytes to write).
|
|
145
|
+
*/
|
|
146
|
+
/**
|
|
147
|
+
* Given [aaaa|bbbb|bbcc|cccc] our goal is to produce:
|
|
148
|
+
* t2 => [0ccc|cccc] [10cc|cccc]
|
|
149
|
+
* s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb])
|
|
150
|
+
*/
|
|
151
|
+
// [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc]
|
|
152
|
+
__m256i t0 = __lasx_xvpickev_b(utf16_packed, utf16_packed);
|
|
153
|
+
t0 = __lasx_xvilvl_b(t0, t0);
|
|
154
|
+
// [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc]
|
|
155
|
+
__m256i v_3f7f = __lasx_xvreplgr2vr_h(uint16_t(0x3F7F));
|
|
156
|
+
__m256i t1 = __lasx_xvand_v(t0, v_3f7f);
|
|
157
|
+
// [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc]
|
|
158
|
+
__m256i t2 = __lasx_xvor_v(t1, lasx_splat_u16(0x8000));
|
|
159
|
+
|
|
160
|
+
// s0: [aaaa|bbbb|bbcc|cccc] => [0000|0000|0000|aaaa]
|
|
161
|
+
__m256i s0 = __lasx_xvsrli_h(utf16_packed, 12);
|
|
162
|
+
// s1: [aaaa|bbbb|bbcc|cccc] => [0000|bbbb|bb00|0000]
|
|
163
|
+
__m256i s1 = __lasx_xvslli_h(utf16_packed, 2);
|
|
164
|
+
// [0000|bbbb|bb00|0000] => [00bb|bbbb|0000|0000]
|
|
165
|
+
s1 = __lasx_xvand_v(s1, lasx_splat_u16(0x3f00));
|
|
166
|
+
// [00bb|bbbb|0000|aaaa]
|
|
167
|
+
__m256i s2 = __lasx_xvor_v(s0, s1);
|
|
168
|
+
// s3: [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa]
|
|
169
|
+
__m256i v_c0e0 = __lasx_xvreplgr2vr_h(uint16_t(0xC0E0));
|
|
170
|
+
__m256i s3 = __lasx_xvor_v(s2, v_c0e0);
|
|
171
|
+
// __m256i v_07ff = vmovq_n_u16((uint16_t)0x07FF);
|
|
172
|
+
__m256i one_or_two_bytes_bytemask =
|
|
173
|
+
__lasx_xvsle_hu(utf16_packed, v_07ff);
|
|
174
|
+
__m256i m0 =
|
|
175
|
+
__lasx_xvandn_v(one_or_two_bytes_bytemask, lasx_splat_u16(0x4000));
|
|
176
|
+
__m256i s4 = __lasx_xvxor_v(s3, m0);
|
|
177
|
+
|
|
178
|
+
// 4. expand code units 16-bit => 32-bit
|
|
179
|
+
__m256i out0 = __lasx_xvilvl_h(s4, t2);
|
|
180
|
+
__m256i out1 = __lasx_xvilvh_h(s4, t2);
|
|
181
|
+
|
|
182
|
+
// 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle
|
|
183
|
+
__m256i one_byte_bytemask =
|
|
184
|
+
__lasx_xvsle_hu(utf16_packed, __lasx_xvrepli_h(0x7F));
|
|
185
|
+
|
|
186
|
+
__m256i one_or_two_bytes_bytemask_u16_to_u32_low =
|
|
187
|
+
__lasx_xvilvl_h(one_or_two_bytes_bytemask, zero);
|
|
188
|
+
__m256i one_or_two_bytes_bytemask_u16_to_u32_high =
|
|
189
|
+
__lasx_xvilvh_h(one_or_two_bytes_bytemask, zero);
|
|
190
|
+
|
|
191
|
+
__m256i one_byte_bytemask_u16_to_u32_low =
|
|
192
|
+
__lasx_xvilvl_h(one_byte_bytemask, one_byte_bytemask);
|
|
193
|
+
__m256i one_byte_bytemask_u16_to_u32_high =
|
|
194
|
+
__lasx_xvilvh_h(one_byte_bytemask, one_byte_bytemask);
|
|
195
|
+
|
|
196
|
+
__m256i mask0 = __lasx_xvmskltz_h(
|
|
197
|
+
__lasx_xvor_v(one_or_two_bytes_bytemask_u16_to_u32_low,
|
|
198
|
+
one_byte_bytemask_u16_to_u32_low));
|
|
199
|
+
__m256i mask1 = __lasx_xvmskltz_h(
|
|
200
|
+
__lasx_xvor_v(one_or_two_bytes_bytemask_u16_to_u32_high,
|
|
201
|
+
one_byte_bytemask_u16_to_u32_high));
|
|
202
|
+
|
|
203
|
+
uint32_t mask = __lasx_xvpickve2gr_wu(mask0, 0);
|
|
204
|
+
const uint8_t *row0 =
|
|
205
|
+
&simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask & 0xFF]
|
|
206
|
+
[0];
|
|
207
|
+
__m128i shuffle0 = __lsx_vld(row0, 1);
|
|
208
|
+
__m128i utf8_0 =
|
|
209
|
+
__lsx_vshuf_b(zero_128, lasx_extracti128_lo(out0), shuffle0);
|
|
210
|
+
__lsx_vst(utf8_0, utf8_output, 0);
|
|
211
|
+
utf8_output += row0[0];
|
|
212
|
+
|
|
213
|
+
mask = __lasx_xvpickve2gr_wu(mask1, 0);
|
|
214
|
+
const uint8_t *row1 =
|
|
215
|
+
&simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask & 0xFF]
|
|
216
|
+
[0];
|
|
217
|
+
__m128i shuffle1 = __lsx_vld(row1, 1);
|
|
218
|
+
__m128i utf8_1 =
|
|
219
|
+
__lsx_vshuf_b(zero_128, lasx_extracti128_lo(out1), shuffle1);
|
|
220
|
+
__lsx_vst(utf8_1, utf8_output, 0);
|
|
221
|
+
utf8_output += row1[0];
|
|
222
|
+
|
|
223
|
+
mask = __lasx_xvpickve2gr_wu(mask0, 4);
|
|
224
|
+
const uint8_t *row2 =
|
|
225
|
+
&simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask & 0xFF]
|
|
226
|
+
[0];
|
|
227
|
+
__m128i shuffle2 = __lsx_vld(row2, 1);
|
|
228
|
+
__m128i utf8_2 =
|
|
229
|
+
__lsx_vshuf_b(zero_128, lasx_extracti128_hi(out0), shuffle2);
|
|
230
|
+
__lsx_vst(utf8_2, utf8_output, 0);
|
|
231
|
+
utf8_output += row2[0];
|
|
232
|
+
|
|
233
|
+
mask = __lasx_xvpickve2gr_wu(mask1, 4);
|
|
234
|
+
const uint8_t *row3 =
|
|
235
|
+
&simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask & 0xFF]
|
|
236
|
+
[0];
|
|
237
|
+
__m128i shuffle3 = __lsx_vld(row3, 1);
|
|
238
|
+
__m128i utf8_3 =
|
|
239
|
+
__lsx_vshuf_b(zero_128, lasx_extracti128_hi(out1), shuffle3);
|
|
240
|
+
__lsx_vst(utf8_3, utf8_output, 0);
|
|
241
|
+
utf8_output += row3[0];
|
|
242
|
+
|
|
243
|
+
buf += 16;
|
|
244
|
+
}
|
|
245
|
+
// At least one 32-bit word will produce a surrogate pair in UTF-16 <=>
|
|
246
|
+
// will produce four UTF-8 bytes.
|
|
247
|
+
} else {
|
|
248
|
+
// Let us do a scalar fallback.
|
|
249
|
+
// It may seem wasteful to use scalar code, but being efficient with SIMD
|
|
250
|
+
// in the presence of surrogate pairs may require non-trivial tables.
|
|
251
|
+
size_t forward = 15;
|
|
252
|
+
size_t k = 0;
|
|
253
|
+
if (size_t(end - buf) < forward + 1) {
|
|
254
|
+
forward = size_t(end - buf - 1);
|
|
255
|
+
}
|
|
256
|
+
for (; k < forward; k++) {
|
|
257
|
+
uint32_t word = buf[k];
|
|
258
|
+
if ((word & 0xFFFFFF80) == 0) {
|
|
259
|
+
*utf8_output++ = char(word);
|
|
260
|
+
} else if ((word & 0xFFFFF800) == 0) {
|
|
261
|
+
*utf8_output++ = char((word >> 6) | 0b11000000);
|
|
262
|
+
*utf8_output++ = char((word & 0b111111) | 0b10000000);
|
|
263
|
+
} else if ((word & 0xFFFF0000) == 0) {
|
|
264
|
+
if (word >= 0xD800 && word <= 0xDFFF) {
|
|
265
|
+
return std::make_pair(nullptr,
|
|
266
|
+
reinterpret_cast<char *>(utf8_output));
|
|
267
|
+
}
|
|
268
|
+
*utf8_output++ = char((word >> 12) | 0b11100000);
|
|
269
|
+
*utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000);
|
|
270
|
+
*utf8_output++ = char((word & 0b111111) | 0b10000000);
|
|
271
|
+
} else {
|
|
272
|
+
if (word > 0x10FFFF) {
|
|
273
|
+
return std::make_pair(nullptr,
|
|
274
|
+
reinterpret_cast<char *>(utf8_output));
|
|
275
|
+
}
|
|
276
|
+
*utf8_output++ = char((word >> 18) | 0b11110000);
|
|
277
|
+
*utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000);
|
|
278
|
+
*utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000);
|
|
279
|
+
*utf8_output++ = char((word & 0b111111) | 0b10000000);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
buf += k;
|
|
283
|
+
}
|
|
284
|
+
} // while
|
|
285
|
+
|
|
286
|
+
// check for invalid input
|
|
287
|
+
if (__lasx_xbnz_v(forbidden_bytemask)) {
|
|
288
|
+
return std::make_pair(nullptr, reinterpret_cast<char *>(utf8_output));
|
|
289
|
+
}
|
|
290
|
+
return std::make_pair(buf, reinterpret_cast<char *>(utf8_output));
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
std::pair<result, char *>
|
|
294
|
+
lasx_convert_utf32_to_utf8_with_errors(const char32_t *buf, size_t len,
|
|
295
|
+
char *utf8_out) {
|
|
296
|
+
uint8_t *utf8_output = reinterpret_cast<uint8_t *>(utf8_out);
|
|
297
|
+
const char32_t *start = buf;
|
|
298
|
+
const char32_t *end = buf + len;
|
|
299
|
+
|
|
300
|
+
// load addr align 32
|
|
301
|
+
while (((uint64_t)buf & 0x1F) && buf < end) {
|
|
302
|
+
uint32_t word = *buf;
|
|
303
|
+
if ((word & 0xFFFFFF80) == 0) {
|
|
304
|
+
*utf8_output++ = char(word);
|
|
305
|
+
} else if ((word & 0xFFFFF800) == 0) {
|
|
306
|
+
*utf8_output++ = char((word >> 6) | 0b11000000);
|
|
307
|
+
*utf8_output++ = char((word & 0b111111) | 0b10000000);
|
|
308
|
+
} else if ((word & 0xFFFF0000) == 0) {
|
|
309
|
+
if (word >= 0xD800 && word <= 0xDFFF) {
|
|
310
|
+
return std::make_pair(result(error_code::SURROGATE, buf - start),
|
|
311
|
+
reinterpret_cast<char *>(utf8_output));
|
|
312
|
+
}
|
|
313
|
+
*utf8_output++ = char((word >> 12) | 0b11100000);
|
|
314
|
+
*utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000);
|
|
315
|
+
*utf8_output++ = char((word & 0b111111) | 0b10000000);
|
|
316
|
+
} else {
|
|
317
|
+
if (word > 0x10FFFF) {
|
|
318
|
+
return std::make_pair(result(error_code::TOO_LARGE, buf - start),
|
|
319
|
+
reinterpret_cast<char *>(utf8_output));
|
|
320
|
+
}
|
|
321
|
+
*utf8_output++ = char((word >> 18) | 0b11110000);
|
|
322
|
+
*utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000);
|
|
323
|
+
*utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000);
|
|
324
|
+
*utf8_output++ = char((word & 0b111111) | 0b10000000);
|
|
325
|
+
}
|
|
326
|
+
buf++;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
__m256i v_c080 = lasx_splat_u16(0xc080);
|
|
330
|
+
__m256i v_07ff = lasx_splat_u16(0x07ff);
|
|
331
|
+
__m256i v_dfff = lasx_splat_u16(0xdfff);
|
|
332
|
+
__m256i v_d800 = lasx_splat_u16(0xd800);
|
|
333
|
+
__m256i zero = __lasx_xvldi(0);
|
|
334
|
+
__m128i zero_128 = __lsx_vldi(0);
|
|
335
|
+
__m256i forbidden_bytemask = __lasx_xvldi(0x0);
|
|
336
|
+
const size_t safety_margin =
|
|
337
|
+
12; // to avoid overruns, see issue
|
|
338
|
+
// https://github.com/simdutf/simdutf/issues/92
|
|
339
|
+
|
|
340
|
+
while (end - buf > std::ptrdiff_t(16 + safety_margin)) {
|
|
341
|
+
__m256i in = __lasx_xvld(reinterpret_cast<const uint32_t *>(buf), 0);
|
|
342
|
+
__m256i nextin = __lasx_xvld(reinterpret_cast<const uint32_t *>(buf), 32);
|
|
343
|
+
|
|
344
|
+
// Check if no bits set above 16th
|
|
345
|
+
if (__lasx_xbz_v(__lasx_xvpickod_h(in, nextin))) {
|
|
346
|
+
// Pack UTF-32 to UTF-16 safely (without surrogate pairs)
|
|
347
|
+
// Apply UTF-16 => UTF-8 routine (lasx_convert_utf16_to_utf8.cpp)
|
|
348
|
+
__m256i utf16_packed =
|
|
349
|
+
__lasx_xvpermi_d(__lasx_xvpickev_h(nextin, in), 0b11011000);
|
|
350
|
+
|
|
351
|
+
if (__lasx_xbz_v(__lasx_xvslt_hu(__lasx_xvrepli_h(0x7F),
|
|
352
|
+
utf16_packed))) { // ASCII fast path!!!!
|
|
353
|
+
// 1. pack the bytes
|
|
354
|
+
// obviously suboptimal.
|
|
355
|
+
__m256i utf8_packed = __lasx_xvpermi_d(
|
|
356
|
+
__lasx_xvpickev_b(utf16_packed, utf16_packed), 0b00001000);
|
|
357
|
+
// 2. store (8 bytes)
|
|
358
|
+
__lsx_vst(lasx_extracti128_lo(utf8_packed), utf8_output, 0);
|
|
359
|
+
// 3. adjust pointers
|
|
360
|
+
buf += 16;
|
|
361
|
+
utf8_output += 16;
|
|
362
|
+
continue; // we are done for this round!
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
if (__lasx_xbz_v(__lasx_xvslt_hu(v_07ff, utf16_packed))) {
|
|
366
|
+
// 1. prepare 2-byte values
|
|
367
|
+
// input 16-bit word : [0000|0aaa|aabb|bbbb] x 8
|
|
368
|
+
// expected output : [110a|aaaa|10bb|bbbb] x 8
|
|
369
|
+
|
|
370
|
+
// t0 = [000a|aaaa|bbbb|bb00]
|
|
371
|
+
const __m256i t0 = __lasx_xvslli_h(utf16_packed, 2);
|
|
372
|
+
// t1 = [000a|aaaa|0000|0000]
|
|
373
|
+
const __m256i t1 = __lasx_xvand_v(t0, lasx_splat_u16(0x1f00));
|
|
374
|
+
// t2 = [0000|0000|00bb|bbbb]
|
|
375
|
+
const __m256i t2 = __lasx_xvand_v(utf16_packed, __lasx_xvrepli_h(0x3f));
|
|
376
|
+
// t3 = [000a|aaaa|00bb|bbbb]
|
|
377
|
+
const __m256i t3 = __lasx_xvor_v(t1, t2);
|
|
378
|
+
// t4 = [110a|aaaa|10bb|bbbb]
|
|
379
|
+
const __m256i t4 = __lasx_xvor_v(t3, v_c080);
|
|
380
|
+
// 2. merge ASCII and 2-byte codewords
|
|
381
|
+
__m256i one_byte_bytemask =
|
|
382
|
+
__lasx_xvsle_hu(utf16_packed, __lasx_xvrepli_h(0x7F /*0x007F*/));
|
|
383
|
+
__m256i utf8_unpacked =
|
|
384
|
+
__lasx_xvbitsel_v(t4, utf16_packed, one_byte_bytemask);
|
|
385
|
+
// 3. prepare bitmask for 8-bit lookup
|
|
386
|
+
__m256i mask = __lasx_xvmskltz_h(one_byte_bytemask);
|
|
387
|
+
uint32_t m1 = __lasx_xvpickve2gr_wu(mask, 0);
|
|
388
|
+
uint32_t m2 = __lasx_xvpickve2gr_wu(mask, 4);
|
|
389
|
+
// 4. pack the bytes
|
|
390
|
+
const uint8_t *row1 =
|
|
391
|
+
&simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes
|
|
392
|
+
[lasx_1_2_utf8_bytes_mask[m1]][0];
|
|
393
|
+
__m128i shuffle1 = __lsx_vld(row1, 1);
|
|
394
|
+
__m128i utf8_packed1 = __lsx_vshuf_b(
|
|
395
|
+
zero_128, lasx_extracti128_lo(utf8_unpacked), shuffle1);
|
|
396
|
+
|
|
397
|
+
const uint8_t *row2 =
|
|
398
|
+
&simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes
|
|
399
|
+
[lasx_1_2_utf8_bytes_mask[m2]][0];
|
|
400
|
+
__m128i shuffle2 = __lsx_vld(row2, 1);
|
|
401
|
+
__m128i utf8_packed2 = __lsx_vshuf_b(
|
|
402
|
+
zero_128, lasx_extracti128_hi(utf8_unpacked), shuffle2);
|
|
403
|
+
// 5. store bytes
|
|
404
|
+
__lsx_vst(utf8_packed1, utf8_output, 0);
|
|
405
|
+
utf8_output += row1[0];
|
|
406
|
+
|
|
407
|
+
__lsx_vst(utf8_packed2, utf8_output, 0);
|
|
408
|
+
utf8_output += row2[0];
|
|
409
|
+
|
|
410
|
+
buf += 16;
|
|
411
|
+
continue;
|
|
412
|
+
} else {
|
|
413
|
+
// case: code units from register produce either 1, 2 or 3 UTF-8 bytes
|
|
414
|
+
forbidden_bytemask = __lasx_xvor_v(
|
|
415
|
+
__lasx_xvand_v(
|
|
416
|
+
__lasx_xvsle_h(utf16_packed, v_dfff), // utf16_packed <= 0xdfff
|
|
417
|
+
__lasx_xvsle_h(v_d800, utf16_packed)), // utf16_packed >= 0xd800
|
|
418
|
+
forbidden_bytemask);
|
|
419
|
+
if (__lasx_xbnz_v(forbidden_bytemask)) {
|
|
420
|
+
return std::make_pair(result(error_code::SURROGATE, buf - start),
|
|
421
|
+
reinterpret_cast<char *>(utf8_output));
|
|
422
|
+
}
|
|
423
|
+
/* In this branch we handle three cases:
|
|
424
|
+
1. [0000|0000|0ccc|cccc] => [0ccc|cccc] -
|
|
425
|
+
single UFT-8 byte
|
|
426
|
+
2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] -
|
|
427
|
+
two UTF-8 bytes
|
|
428
|
+
3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] -
|
|
429
|
+
three UTF-8 bytes
|
|
430
|
+
|
|
431
|
+
We expand the input word (16-bit) into two code units (32-bit), thus
|
|
432
|
+
we have room for four bytes. However, we need five distinct bit
|
|
433
|
+
layouts. Note that the last byte in cases #2 and #3 is the same.
|
|
434
|
+
|
|
435
|
+
We precompute byte 1 for case #1 and the common byte for cases #2 &
|
|
436
|
+
#3 in register t2.
|
|
437
|
+
|
|
438
|
+
We precompute byte 1 for case #3 and -- **conditionally** --
|
|
439
|
+
precompute either byte 1 for case #2 or byte 2 for case #3. Note that
|
|
440
|
+
they differ by exactly one bit.
|
|
441
|
+
|
|
442
|
+
Finally from these two code units we build proper UTF-8 sequence,
|
|
443
|
+
taking into account the case (i.e, the number of bytes to write).
|
|
444
|
+
*/
|
|
445
|
+
/**
|
|
446
|
+
* Given [aaaa|bbbb|bbcc|cccc] our goal is to produce:
|
|
447
|
+
* t2 => [0ccc|cccc] [10cc|cccc]
|
|
448
|
+
* s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb])
|
|
449
|
+
*/
|
|
450
|
+
// [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc]
|
|
451
|
+
__m256i t0 = __lasx_xvpickev_b(utf16_packed, utf16_packed);
|
|
452
|
+
t0 = __lasx_xvilvl_b(t0, t0);
|
|
453
|
+
// [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc]
|
|
454
|
+
__m256i v_3f7f = __lasx_xvreplgr2vr_h(uint16_t(0x3F7F));
|
|
455
|
+
__m256i t1 = __lasx_xvand_v(t0, v_3f7f);
|
|
456
|
+
// [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc]
|
|
457
|
+
__m256i t2 = __lasx_xvor_v(t1, lasx_splat_u16(0x8000));
|
|
458
|
+
|
|
459
|
+
// s0: [aaaa|bbbb|bbcc|cccc] => [0000|0000|0000|aaaa]
|
|
460
|
+
__m256i s0 = __lasx_xvsrli_h(utf16_packed, 12);
|
|
461
|
+
// s1: [aaaa|bbbb|bbcc|cccc] => [0000|bbbb|bb00|0000]
|
|
462
|
+
__m256i s1 = __lasx_xvslli_h(utf16_packed, 2);
|
|
463
|
+
// [0000|bbbb|bb00|0000] => [00bb|bbbb|0000|0000]
|
|
464
|
+
s1 = __lasx_xvand_v(s1, lasx_splat_u16(0x3F00));
|
|
465
|
+
// [00bb|bbbb|0000|aaaa]
|
|
466
|
+
__m256i s2 = __lasx_xvor_v(s0, s1);
|
|
467
|
+
// s3: [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa]
|
|
468
|
+
__m256i v_c0e0 = __lasx_xvreplgr2vr_h(uint16_t(0xC0E0));
|
|
469
|
+
__m256i s3 = __lasx_xvor_v(s2, v_c0e0);
|
|
470
|
+
// __m256i v_07ff = vmovq_n_u16((uint16_t)0x07FF);
|
|
471
|
+
__m256i one_or_two_bytes_bytemask =
|
|
472
|
+
__lasx_xvsle_hu(utf16_packed, v_07ff);
|
|
473
|
+
__m256i m0 =
|
|
474
|
+
__lasx_xvandn_v(one_or_two_bytes_bytemask, lasx_splat_u16(0x4000));
|
|
475
|
+
__m256i s4 = __lasx_xvxor_v(s3, m0);
|
|
476
|
+
|
|
477
|
+
// 4. expand code units 16-bit => 32-bit
|
|
478
|
+
__m256i out0 = __lasx_xvilvl_h(s4, t2);
|
|
479
|
+
__m256i out1 = __lasx_xvilvh_h(s4, t2);
|
|
480
|
+
|
|
481
|
+
// 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle
|
|
482
|
+
__m256i one_byte_bytemask =
|
|
483
|
+
__lasx_xvsle_hu(utf16_packed, __lasx_xvrepli_h(0x7F));
|
|
484
|
+
|
|
485
|
+
__m256i one_or_two_bytes_bytemask_u16_to_u32_low =
|
|
486
|
+
__lasx_xvilvl_h(one_or_two_bytes_bytemask, zero);
|
|
487
|
+
__m256i one_or_two_bytes_bytemask_u16_to_u32_high =
|
|
488
|
+
__lasx_xvilvh_h(one_or_two_bytes_bytemask, zero);
|
|
489
|
+
|
|
490
|
+
__m256i one_byte_bytemask_u16_to_u32_low =
|
|
491
|
+
__lasx_xvilvl_h(one_byte_bytemask, one_byte_bytemask);
|
|
492
|
+
__m256i one_byte_bytemask_u16_to_u32_high =
|
|
493
|
+
__lasx_xvilvh_h(one_byte_bytemask, one_byte_bytemask);
|
|
494
|
+
|
|
495
|
+
__m256i mask0 = __lasx_xvmskltz_h(
|
|
496
|
+
__lasx_xvor_v(one_or_two_bytes_bytemask_u16_to_u32_low,
|
|
497
|
+
one_byte_bytemask_u16_to_u32_low));
|
|
498
|
+
__m256i mask1 = __lasx_xvmskltz_h(
|
|
499
|
+
__lasx_xvor_v(one_or_two_bytes_bytemask_u16_to_u32_high,
|
|
500
|
+
one_byte_bytemask_u16_to_u32_high));
|
|
501
|
+
|
|
502
|
+
uint32_t mask = __lasx_xvpickve2gr_wu(mask0, 0);
|
|
503
|
+
const uint8_t *row0 =
|
|
504
|
+
&simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask & 0xFF]
|
|
505
|
+
[0];
|
|
506
|
+
__m128i shuffle0 = __lsx_vld(row0, 1);
|
|
507
|
+
__m128i utf8_0 =
|
|
508
|
+
__lsx_vshuf_b(zero_128, lasx_extracti128_lo(out0), shuffle0);
|
|
509
|
+
__lsx_vst(utf8_0, utf8_output, 0);
|
|
510
|
+
utf8_output += row0[0];
|
|
511
|
+
|
|
512
|
+
mask = __lasx_xvpickve2gr_wu(mask1, 0);
|
|
513
|
+
const uint8_t *row1 =
|
|
514
|
+
&simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask & 0xFF]
|
|
515
|
+
[0];
|
|
516
|
+
__m128i shuffle1 = __lsx_vld(row1, 1);
|
|
517
|
+
__m128i utf8_1 =
|
|
518
|
+
__lsx_vshuf_b(zero_128, lasx_extracti128_lo(out1), shuffle1);
|
|
519
|
+
__lsx_vst(utf8_1, utf8_output, 0);
|
|
520
|
+
utf8_output += row1[0];
|
|
521
|
+
|
|
522
|
+
mask = __lasx_xvpickve2gr_wu(mask0, 4);
|
|
523
|
+
const uint8_t *row2 =
|
|
524
|
+
&simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask & 0xFF]
|
|
525
|
+
[0];
|
|
526
|
+
__m128i shuffle2 = __lsx_vld(row2, 1);
|
|
527
|
+
__m128i utf8_2 =
|
|
528
|
+
__lsx_vshuf_b(zero_128, lasx_extracti128_hi(out0), shuffle2);
|
|
529
|
+
__lsx_vst(utf8_2, utf8_output, 0);
|
|
530
|
+
utf8_output += row2[0];
|
|
531
|
+
|
|
532
|
+
mask = __lasx_xvpickve2gr_wu(mask1, 4);
|
|
533
|
+
const uint8_t *row3 =
|
|
534
|
+
&simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask & 0xFF]
|
|
535
|
+
[0];
|
|
536
|
+
__m128i shuffle3 = __lsx_vld(row3, 1);
|
|
537
|
+
__m128i utf8_3 =
|
|
538
|
+
__lsx_vshuf_b(zero_128, lasx_extracti128_hi(out1), shuffle3);
|
|
539
|
+
__lsx_vst(utf8_3, utf8_output, 0);
|
|
540
|
+
utf8_output += row3[0];
|
|
541
|
+
|
|
542
|
+
buf += 16;
|
|
543
|
+
}
|
|
544
|
+
// At least one 32-bit word will produce a surrogate pair in UTF-16 <=>
|
|
545
|
+
// will produce four UTF-8 bytes.
|
|
546
|
+
} else {
|
|
547
|
+
// Let us do a scalar fallback.
|
|
548
|
+
// It may seem wasteful to use scalar code, but being efficient with SIMD
|
|
549
|
+
// in the presence of surrogate pairs may require non-trivial tables.
|
|
550
|
+
size_t forward = 15;
|
|
551
|
+
size_t k = 0;
|
|
552
|
+
if (size_t(end - buf) < forward + 1) {
|
|
553
|
+
forward = size_t(end - buf - 1);
|
|
554
|
+
}
|
|
555
|
+
for (; k < forward; k++) {
|
|
556
|
+
uint32_t word = buf[k];
|
|
557
|
+
if ((word & 0xFFFFFF80) == 0) {
|
|
558
|
+
*utf8_output++ = char(word);
|
|
559
|
+
} else if ((word & 0xFFFFF800) == 0) {
|
|
560
|
+
*utf8_output++ = char((word >> 6) | 0b11000000);
|
|
561
|
+
*utf8_output++ = char((word & 0b111111) | 0b10000000);
|
|
562
|
+
} else if ((word & 0xFFFF0000) == 0) {
|
|
563
|
+
if (word >= 0xD800 && word <= 0xDFFF) {
|
|
564
|
+
return std::make_pair(
|
|
565
|
+
result(error_code::SURROGATE, buf - start + k),
|
|
566
|
+
reinterpret_cast<char *>(utf8_output));
|
|
567
|
+
}
|
|
568
|
+
*utf8_output++ = char((word >> 12) | 0b11100000);
|
|
569
|
+
*utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000);
|
|
570
|
+
*utf8_output++ = char((word & 0b111111) | 0b10000000);
|
|
571
|
+
} else {
|
|
572
|
+
if (word > 0x10FFFF) {
|
|
573
|
+
return std::make_pair(
|
|
574
|
+
result(error_code::TOO_LARGE, buf - start + k),
|
|
575
|
+
reinterpret_cast<char *>(utf8_output));
|
|
576
|
+
}
|
|
577
|
+
*utf8_output++ = char((word >> 18) | 0b11110000);
|
|
578
|
+
*utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000);
|
|
579
|
+
*utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000);
|
|
580
|
+
*utf8_output++ = char((word & 0b111111) | 0b10000000);
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
buf += k;
|
|
584
|
+
}
|
|
585
|
+
} // while
|
|
586
|
+
|
|
587
|
+
return std::make_pair(result(error_code::SUCCESS, buf - start),
|
|
588
|
+
reinterpret_cast<char *>(utf8_output));
|
|
589
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
size_t convert_masked_utf8_to_latin1(const char *input,
|
|
2
|
+
uint64_t utf8_end_of_code_point_mask,
|
|
3
|
+
char *&latin1_output) {
|
|
4
|
+
// we use an approach where we try to process up to 12 input bytes.
|
|
5
|
+
// Why 12 input bytes and not 16? Because we are concerned with the size of
|
|
6
|
+
// the lookup tables. Also 12 is nicely divisible by two and three.
|
|
7
|
+
//
|
|
8
|
+
__m128i in = __lsx_vld(reinterpret_cast<const uint8_t *>(input), 0);
|
|
9
|
+
|
|
10
|
+
const uint16_t input_utf8_end_of_code_point_mask =
|
|
11
|
+
utf8_end_of_code_point_mask & 0xfff;
|
|
12
|
+
// Optimization note: our main path below is load-latency dependent. Thus it
|
|
13
|
+
// is maybe beneficial to have fast paths that depend on branch prediction but
|
|
14
|
+
// have less latency. This results in more instructions but, potentially, also
|
|
15
|
+
// higher speeds.
|
|
16
|
+
|
|
17
|
+
// We first try a few fast paths.
|
|
18
|
+
// The obvious first test is ASCII, which actually consumes the full 16.
|
|
19
|
+
if ((utf8_end_of_code_point_mask & 0xFFFF) == 0xFFFF) {
|
|
20
|
+
// We process in chunks of 16 bytes
|
|
21
|
+
__lsx_vst(in, reinterpret_cast<uint8_t *>(latin1_output), 0);
|
|
22
|
+
latin1_output += 16; // We wrote 16 18-bit characters.
|
|
23
|
+
return 16; // We consumed 16 bytes.
|
|
24
|
+
}
|
|
25
|
+
/// We do not have a fast path available, or the fast path is unimportant, so
|
|
26
|
+
/// we fallback.
|
|
27
|
+
const uint8_t idx = simdutf::tables::utf8_to_utf16::utf8bigindex
|
|
28
|
+
[input_utf8_end_of_code_point_mask][0];
|
|
29
|
+
|
|
30
|
+
const uint8_t consumed = simdutf::tables::utf8_to_utf16::utf8bigindex
|
|
31
|
+
[input_utf8_end_of_code_point_mask][1];
|
|
32
|
+
// this indicates an invalid input:
|
|
33
|
+
if (idx >= 64) {
|
|
34
|
+
return consumed;
|
|
35
|
+
}
|
|
36
|
+
// Here we should have (idx < 64), if not, there is a bug in the validation or
|
|
37
|
+
// elsewhere. SIX (6) input code-code units this is a relatively easy scenario
|
|
38
|
+
// we process SIX (6) input code-code units. The max length in bytes of six
|
|
39
|
+
// code code units spanning between 1 and 2 bytes each is 12 bytes. Converts 6
|
|
40
|
+
// 1-2 byte UTF-8 characters to 6 UTF-16 characters. This is a relatively easy
|
|
41
|
+
// scenario we process SIX (6) input code-code units. The max length in bytes
|
|
42
|
+
// of six code code units spanning between 1 and 2 bytes each is 12 bytes.
|
|
43
|
+
__m128i sh = __lsx_vld(reinterpret_cast<const uint8_t *>(
|
|
44
|
+
simdutf::tables::utf8_to_utf16::shufutf8[idx]),
|
|
45
|
+
0);
|
|
46
|
+
// Shuffle
|
|
47
|
+
// 1 byte: 00000000 0bbbbbbb
|
|
48
|
+
// 2 byte: 110aaaaa 10bbbbbb
|
|
49
|
+
sh = __lsx_vand_v(sh, __lsx_vldi(0x1f));
|
|
50
|
+
__m128i perm = __lsx_vshuf_b(__lsx_vldi(0), in, sh);
|
|
51
|
+
// ascii mask
|
|
52
|
+
// 1 byte: 11111111 11111111
|
|
53
|
+
// 2 byte: 00000000 00000000
|
|
54
|
+
__m128i ascii_mask = __lsx_vslt_bu(perm, __lsx_vldi(0x80));
|
|
55
|
+
// utf8 mask
|
|
56
|
+
// 1 byte: 00000000 00000000
|
|
57
|
+
// 2 byte: 00111111 00111111
|
|
58
|
+
__m128i utf8_mask = __lsx_vand_v(__lsx_vsle_bu(__lsx_vldi(0x80), perm),
|
|
59
|
+
__lsx_vldi(0b00111111));
|
|
60
|
+
// mask
|
|
61
|
+
// 1 byte: 11111111 11111111
|
|
62
|
+
// 2 byte: 00111111 00111111
|
|
63
|
+
__m128i mask = __lsx_vor_v(utf8_mask, ascii_mask);
|
|
64
|
+
|
|
65
|
+
__m128i composed = __lsx_vbitsel_v(__lsx_vsrli_h(perm, 2), perm, mask);
|
|
66
|
+
// writing 8 bytes even though we only care about the first 6 bytes.
|
|
67
|
+
__m128i latin1_packed = __lsx_vpickev_b(__lsx_vldi(0), composed);
|
|
68
|
+
|
|
69
|
+
__lsx_vst(latin1_packed, reinterpret_cast<uint8_t *>(latin1_output), 0);
|
|
70
|
+
latin1_output += 6; // We wrote 6 bytes.
|
|
71
|
+
return consumed;
|
|
72
|
+
}
|