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,155 @@
|
|
|
1
|
+
template <endianness big_endian>
|
|
2
|
+
std::pair<const char32_t *, char16_t *>
|
|
3
|
+
lsx_convert_utf32_to_utf16(const char32_t *buf, size_t len,
|
|
4
|
+
char16_t *utf16_out) {
|
|
5
|
+
uint16_t *utf16_output = reinterpret_cast<uint16_t *>(utf16_out);
|
|
6
|
+
const char32_t *end = buf + len;
|
|
7
|
+
|
|
8
|
+
__m128i forbidden_bytemask = __lsx_vrepli_h(0);
|
|
9
|
+
__m128i v_d800 = lsx_splat_u16(0xd800);
|
|
10
|
+
__m128i v_dfff = lsx_splat_u16(0xdfff);
|
|
11
|
+
while (end - buf >= 8) {
|
|
12
|
+
__m128i in0 = __lsx_vld(reinterpret_cast<const uint32_t *>(buf), 0);
|
|
13
|
+
__m128i in1 = __lsx_vld(reinterpret_cast<const uint32_t *>(buf), 16);
|
|
14
|
+
|
|
15
|
+
// Check if no bits set above 16th
|
|
16
|
+
if (__lsx_bz_v(__lsx_vpickod_h(in1, in0))) {
|
|
17
|
+
__m128i utf16_packed = __lsx_vpickev_h(in1, in0);
|
|
18
|
+
forbidden_bytemask = __lsx_vor_v(
|
|
19
|
+
__lsx_vand_v(
|
|
20
|
+
__lsx_vsle_h(utf16_packed, v_dfff), // utf16_packed <= 0xdfff
|
|
21
|
+
__lsx_vsle_h(v_d800, utf16_packed)), // utf16_packed >= 0xd800
|
|
22
|
+
forbidden_bytemask);
|
|
23
|
+
|
|
24
|
+
if simdutf_constexpr (!match_system(big_endian)) {
|
|
25
|
+
utf16_packed = lsx_swap_bytes(utf16_packed);
|
|
26
|
+
}
|
|
27
|
+
__lsx_vst(utf16_packed, utf16_output, 0);
|
|
28
|
+
utf16_output += 8;
|
|
29
|
+
buf += 8;
|
|
30
|
+
} else {
|
|
31
|
+
size_t forward = 3;
|
|
32
|
+
size_t k = 0;
|
|
33
|
+
if (size_t(end - buf) < forward + 1) {
|
|
34
|
+
forward = size_t(end - buf - 1);
|
|
35
|
+
}
|
|
36
|
+
for (; k < forward; k++) {
|
|
37
|
+
uint32_t word = buf[k];
|
|
38
|
+
if ((word & 0xFFFF0000) == 0) {
|
|
39
|
+
// will not generate a surrogate pair
|
|
40
|
+
if (word >= 0xD800 && word <= 0xDFFF) {
|
|
41
|
+
return std::make_pair(nullptr,
|
|
42
|
+
reinterpret_cast<char16_t *>(utf16_output));
|
|
43
|
+
}
|
|
44
|
+
*utf16_output++ = !match_system(big_endian)
|
|
45
|
+
? char16_t(word >> 8 | word << 8)
|
|
46
|
+
: char16_t(word);
|
|
47
|
+
} else {
|
|
48
|
+
// will generate a surrogate pair
|
|
49
|
+
if (word > 0x10FFFF) {
|
|
50
|
+
return std::make_pair(nullptr,
|
|
51
|
+
reinterpret_cast<char16_t *>(utf16_output));
|
|
52
|
+
}
|
|
53
|
+
word -= 0x10000;
|
|
54
|
+
uint16_t high_surrogate = uint16_t(0xD800 + (word >> 10));
|
|
55
|
+
uint16_t low_surrogate = uint16_t(0xDC00 + (word & 0x3FF));
|
|
56
|
+
if simdutf_constexpr (!match_system(big_endian)) {
|
|
57
|
+
high_surrogate =
|
|
58
|
+
uint16_t(high_surrogate >> 8 | high_surrogate << 8);
|
|
59
|
+
low_surrogate = uint16_t(low_surrogate << 8 | low_surrogate >> 8);
|
|
60
|
+
}
|
|
61
|
+
*utf16_output++ = char16_t(high_surrogate);
|
|
62
|
+
*utf16_output++ = char16_t(low_surrogate);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
buf += k;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// check for invalid input
|
|
70
|
+
if (__lsx_bnz_v(forbidden_bytemask)) {
|
|
71
|
+
return std::make_pair(nullptr, reinterpret_cast<char16_t *>(utf16_output));
|
|
72
|
+
}
|
|
73
|
+
return std::make_pair(buf, reinterpret_cast<char16_t *>(utf16_output));
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
template <endianness big_endian>
|
|
77
|
+
std::pair<result, char16_t *>
|
|
78
|
+
lsx_convert_utf32_to_utf16_with_errors(const char32_t *buf, size_t len,
|
|
79
|
+
char16_t *utf16_out) {
|
|
80
|
+
uint16_t *utf16_output = reinterpret_cast<uint16_t *>(utf16_out);
|
|
81
|
+
const char32_t *start = buf;
|
|
82
|
+
const char32_t *end = buf + len;
|
|
83
|
+
|
|
84
|
+
__m128i forbidden_bytemask = __lsx_vrepli_h(0);
|
|
85
|
+
__m128i v_d800 = lsx_splat_u16(0xd800);
|
|
86
|
+
__m128i v_dfff = lsx_splat_u16(0xdfff);
|
|
87
|
+
|
|
88
|
+
while (end - buf >= 8) {
|
|
89
|
+
__m128i in0 = __lsx_vld(reinterpret_cast<const uint32_t *>(buf), 0);
|
|
90
|
+
__m128i in1 = __lsx_vld(reinterpret_cast<const uint32_t *>(buf), 16);
|
|
91
|
+
// Check if no bits set above 16th
|
|
92
|
+
if (__lsx_bz_v(__lsx_vpickod_h(in1, in0))) {
|
|
93
|
+
__m128i utf16_packed = __lsx_vpickev_h(in1, in0);
|
|
94
|
+
|
|
95
|
+
forbidden_bytemask = __lsx_vor_v(
|
|
96
|
+
__lsx_vand_v(
|
|
97
|
+
__lsx_vsle_h(utf16_packed, v_dfff), // utf16_packed <= 0xdfff
|
|
98
|
+
__lsx_vsle_h(v_d800, utf16_packed)), // utf16_packed >= 0xd800
|
|
99
|
+
forbidden_bytemask);
|
|
100
|
+
if (__lsx_bnz_v(forbidden_bytemask)) {
|
|
101
|
+
return std::make_pair(result(error_code::SURROGATE, buf - start),
|
|
102
|
+
reinterpret_cast<char16_t *>(utf16_output));
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if simdutf_constexpr (!match_system(big_endian)) {
|
|
106
|
+
utf16_packed = lsx_swap_bytes(utf16_packed);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
__lsx_vst(utf16_packed, utf16_output, 0);
|
|
110
|
+
utf16_output += 8;
|
|
111
|
+
buf += 8;
|
|
112
|
+
} else {
|
|
113
|
+
size_t forward = 3;
|
|
114
|
+
size_t k = 0;
|
|
115
|
+
if (size_t(end - buf) < forward + 1) {
|
|
116
|
+
forward = size_t(end - buf - 1);
|
|
117
|
+
}
|
|
118
|
+
for (; k < forward; k++) {
|
|
119
|
+
uint32_t word = buf[k];
|
|
120
|
+
if ((word & 0xFFFF0000) == 0) {
|
|
121
|
+
// will not generate a surrogate pair
|
|
122
|
+
if (word >= 0xD800 && word <= 0xDFFF) {
|
|
123
|
+
return std::make_pair(
|
|
124
|
+
result(error_code::SURROGATE, buf - start + k),
|
|
125
|
+
reinterpret_cast<char16_t *>(utf16_output));
|
|
126
|
+
}
|
|
127
|
+
*utf16_output++ = !match_system(big_endian)
|
|
128
|
+
? char16_t(word >> 8 | word << 8)
|
|
129
|
+
: char16_t(word);
|
|
130
|
+
} else {
|
|
131
|
+
// will generate a surrogate pair
|
|
132
|
+
if (word > 0x10FFFF) {
|
|
133
|
+
return std::make_pair(
|
|
134
|
+
result(error_code::TOO_LARGE, buf - start + k),
|
|
135
|
+
reinterpret_cast<char16_t *>(utf16_output));
|
|
136
|
+
}
|
|
137
|
+
word -= 0x10000;
|
|
138
|
+
uint16_t high_surrogate = uint16_t(0xD800 + (word >> 10));
|
|
139
|
+
uint16_t low_surrogate = uint16_t(0xDC00 + (word & 0x3FF));
|
|
140
|
+
if simdutf_constexpr (!match_system(big_endian)) {
|
|
141
|
+
high_surrogate =
|
|
142
|
+
uint16_t(high_surrogate >> 8 | high_surrogate << 8);
|
|
143
|
+
low_surrogate = uint16_t(low_surrogate << 8 | low_surrogate >> 8);
|
|
144
|
+
}
|
|
145
|
+
*utf16_output++ = char16_t(high_surrogate);
|
|
146
|
+
*utf16_output++ = char16_t(low_surrogate);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
buf += k;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
return std::make_pair(result(error_code::SUCCESS, buf - start),
|
|
154
|
+
reinterpret_cast<char16_t *>(utf16_output));
|
|
155
|
+
}
|
|
@@ -0,0 +1,459 @@
|
|
|
1
|
+
std::pair<const char32_t *, char *>
|
|
2
|
+
lsx_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
|
+
__m128i v_c080 = lsx_splat_u16(0xc080);
|
|
7
|
+
__m128i v_07ff = lsx_splat_u16(0x07ff);
|
|
8
|
+
__m128i v_dfff = lsx_splat_u16(0xdfff);
|
|
9
|
+
__m128i v_d800 = lsx_splat_u16(0xd800);
|
|
10
|
+
__m128i forbidden_bytemask = __lsx_vldi(0x0);
|
|
11
|
+
|
|
12
|
+
const size_t safety_margin =
|
|
13
|
+
12; // to avoid overruns, see issue
|
|
14
|
+
// https://github.com/simdutf/simdutf/issues/92
|
|
15
|
+
|
|
16
|
+
while (end - buf > std::ptrdiff_t(16 + safety_margin)) {
|
|
17
|
+
__m128i in = __lsx_vld(reinterpret_cast<const uint32_t *>(buf), 0);
|
|
18
|
+
__m128i nextin = __lsx_vld(reinterpret_cast<const uint32_t *>(buf), 16);
|
|
19
|
+
|
|
20
|
+
// Check if no bits set above 16th
|
|
21
|
+
if (__lsx_bz_v(__lsx_vpickod_h(in, nextin))) {
|
|
22
|
+
// Pack UTF-32 to UTF-16 safely (without surrogate pairs)
|
|
23
|
+
// Apply UTF-16 => UTF-8 routine (lsx_convert_utf16_to_utf8.cpp)
|
|
24
|
+
__m128i utf16_packed = __lsx_vpickev_h(nextin, in);
|
|
25
|
+
|
|
26
|
+
if (__lsx_bz_v(__lsx_vslt_hu(__lsx_vrepli_h(0x7F),
|
|
27
|
+
utf16_packed))) { // ASCII fast path!!!!
|
|
28
|
+
// 1. pack the bytes
|
|
29
|
+
// obviously suboptimal.
|
|
30
|
+
__m128i utf8_packed = __lsx_vpickev_b(utf16_packed, utf16_packed);
|
|
31
|
+
// 2. store (8 bytes)
|
|
32
|
+
__lsx_vst(utf8_packed, utf8_output, 0);
|
|
33
|
+
// 3. adjust pointers
|
|
34
|
+
buf += 8;
|
|
35
|
+
utf8_output += 8;
|
|
36
|
+
continue; // we are done for this round!
|
|
37
|
+
}
|
|
38
|
+
__m128i zero = __lsx_vldi(0);
|
|
39
|
+
if (__lsx_bz_v(__lsx_vslt_hu(v_07ff, utf16_packed))) {
|
|
40
|
+
// 1. prepare 2-byte values
|
|
41
|
+
// input 16-bit word : [0000|0aaa|aabb|bbbb] x 8
|
|
42
|
+
// expected output : [110a|aaaa|10bb|bbbb] x 8
|
|
43
|
+
|
|
44
|
+
// t0 = [000a|aaaa|bbbb|bb00]
|
|
45
|
+
const __m128i t0 = __lsx_vslli_h(utf16_packed, 2);
|
|
46
|
+
// t1 = [000a|aaaa|0000|0000]
|
|
47
|
+
const __m128i t1 = __lsx_vand_v(t0, lsx_splat_u16(0x1f00));
|
|
48
|
+
// t2 = [0000|0000|00bb|bbbb]
|
|
49
|
+
const __m128i t2 = __lsx_vand_v(utf16_packed, __lsx_vrepli_h(0x3f));
|
|
50
|
+
// t3 = [000a|aaaa|00bb|bbbb]
|
|
51
|
+
const __m128i t3 = __lsx_vor_v(t1, t2);
|
|
52
|
+
// t4 = [110a|aaaa|10bb|bbbb]
|
|
53
|
+
const __m128i t4 = __lsx_vor_v(t3, v_c080);
|
|
54
|
+
// 2. merge ASCII and 2-byte codewords
|
|
55
|
+
__m128i one_byte_bytemask =
|
|
56
|
+
__lsx_vsle_hu(utf16_packed, __lsx_vrepli_h(0x7F /*0x007F*/));
|
|
57
|
+
__m128i utf8_unpacked =
|
|
58
|
+
__lsx_vbitsel_v(t4, utf16_packed, one_byte_bytemask);
|
|
59
|
+
// 3. prepare bitmask for 8-bit lookup
|
|
60
|
+
uint32_t m2 =
|
|
61
|
+
__lsx_vpickve2gr_bu(__lsx_vmskltz_h(one_byte_bytemask), 0);
|
|
62
|
+
// 4. pack the bytes
|
|
63
|
+
const uint8_t *row =
|
|
64
|
+
&simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes
|
|
65
|
+
[lsx_1_2_utf8_bytes_mask[m2]][0];
|
|
66
|
+
__m128i shuffle = __lsx_vld(row, 1);
|
|
67
|
+
__m128i utf8_packed = __lsx_vshuf_b(zero, utf8_unpacked, shuffle);
|
|
68
|
+
// 5. store bytes
|
|
69
|
+
__lsx_vst(utf8_packed, utf8_output, 0);
|
|
70
|
+
|
|
71
|
+
// 6. adjust pointers
|
|
72
|
+
buf += 8;
|
|
73
|
+
utf8_output += row[0];
|
|
74
|
+
continue;
|
|
75
|
+
} else {
|
|
76
|
+
// case: code units from register produce either 1, 2 or 3 UTF-8 bytes
|
|
77
|
+
forbidden_bytemask = __lsx_vor_v(
|
|
78
|
+
__lsx_vand_v(
|
|
79
|
+
__lsx_vsle_h(utf16_packed, v_dfff), // utf16_packed <= 0xdfff
|
|
80
|
+
__lsx_vsle_h(v_d800, utf16_packed)), // utf16_packed >= 0xd800
|
|
81
|
+
forbidden_bytemask);
|
|
82
|
+
/* In this branch we handle three cases:
|
|
83
|
+
1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - single
|
|
84
|
+
UFT-8 byte
|
|
85
|
+
2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] - two
|
|
86
|
+
UTF-8 bytes
|
|
87
|
+
3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - three
|
|
88
|
+
UTF-8 bytes
|
|
89
|
+
|
|
90
|
+
We expand the input word (16-bit) into two code units (32-bit), thus
|
|
91
|
+
we have room for four bytes. However, we need five distinct bit
|
|
92
|
+
layouts. Note that the last byte in cases #2 and #3 is the same.
|
|
93
|
+
|
|
94
|
+
We precompute byte 1 for case #1 and the common byte for cases #2 & #3
|
|
95
|
+
in register t2.
|
|
96
|
+
|
|
97
|
+
We precompute byte 1 for case #3 and -- **conditionally** -- precompute
|
|
98
|
+
either byte 1 for case #2 or byte 2 for case #3. Note that they
|
|
99
|
+
differ by exactly one bit.
|
|
100
|
+
|
|
101
|
+
Finally from these two code units we build proper UTF-8 sequence, taking
|
|
102
|
+
into account the case (i.e, the number of bytes to write).
|
|
103
|
+
*/
|
|
104
|
+
/**
|
|
105
|
+
* Given [aaaa|bbbb|bbcc|cccc] our goal is to produce:
|
|
106
|
+
* t2 => [0ccc|cccc] [10cc|cccc]
|
|
107
|
+
* s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb])
|
|
108
|
+
*/
|
|
109
|
+
// [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc]
|
|
110
|
+
__m128i t0 = __lsx_vpickev_b(utf16_packed, utf16_packed);
|
|
111
|
+
t0 = __lsx_vilvl_b(t0, t0);
|
|
112
|
+
// [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc]
|
|
113
|
+
__m128i v_3f7f = __lsx_vreplgr2vr_h(uint16_t(0x3F7F));
|
|
114
|
+
__m128i t1 = __lsx_vand_v(t0, v_3f7f);
|
|
115
|
+
// [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc]
|
|
116
|
+
__m128i t2 = __lsx_vor_v(t1, lsx_splat_u16(0x8000));
|
|
117
|
+
|
|
118
|
+
// s0: [aaaa|bbbb|bbcc|cccc] => [0000|0000|0000|aaaa]
|
|
119
|
+
__m128i s0 = __lsx_vsrli_h(utf16_packed, 12);
|
|
120
|
+
// s1: [aaaa|bbbb|bbcc|cccc] => [0000|bbbb|bb00|0000]
|
|
121
|
+
__m128i s1 = __lsx_vslli_h(utf16_packed, 2);
|
|
122
|
+
// [0000|bbbb|bb00|0000] => [00bb|bbbb|0000|0000]
|
|
123
|
+
s1 = __lsx_vand_v(s1, lsx_splat_u16(0x3F00));
|
|
124
|
+
// [00bb|bbbb|0000|aaaa]
|
|
125
|
+
__m128i s2 = __lsx_vor_v(s0, s1);
|
|
126
|
+
// s3: [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa]
|
|
127
|
+
__m128i v_c0e0 = __lsx_vreplgr2vr_h(uint16_t(0xC0E0));
|
|
128
|
+
__m128i s3 = __lsx_vor_v(s2, v_c0e0);
|
|
129
|
+
__m128i one_or_two_bytes_bytemask = __lsx_vsle_hu(utf16_packed, v_07ff);
|
|
130
|
+
__m128i m0 =
|
|
131
|
+
__lsx_vandn_v(one_or_two_bytes_bytemask, lsx_splat_u16(0x4000));
|
|
132
|
+
__m128i s4 = __lsx_vxor_v(s3, m0);
|
|
133
|
+
|
|
134
|
+
// 4. expand code units 16-bit => 32-bit
|
|
135
|
+
__m128i out0 = __lsx_vilvl_h(s4, t2);
|
|
136
|
+
__m128i out1 = __lsx_vilvh_h(s4, t2);
|
|
137
|
+
|
|
138
|
+
// 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle
|
|
139
|
+
__m128i one_byte_bytemask =
|
|
140
|
+
__lsx_vsle_hu(utf16_packed, __lsx_vrepli_h(0x7F));
|
|
141
|
+
|
|
142
|
+
__m128i one_or_two_bytes_bytemask_u16_to_u32_low =
|
|
143
|
+
__lsx_vilvl_h(one_or_two_bytes_bytemask, zero);
|
|
144
|
+
__m128i one_or_two_bytes_bytemask_u16_to_u32_high =
|
|
145
|
+
__lsx_vilvh_h(one_or_two_bytes_bytemask, zero);
|
|
146
|
+
|
|
147
|
+
__m128i one_byte_bytemask_u16_to_u32_low =
|
|
148
|
+
__lsx_vilvl_h(one_byte_bytemask, one_byte_bytemask);
|
|
149
|
+
__m128i one_byte_bytemask_u16_to_u32_high =
|
|
150
|
+
__lsx_vilvh_h(one_byte_bytemask, one_byte_bytemask);
|
|
151
|
+
|
|
152
|
+
const uint32_t mask0 =
|
|
153
|
+
__lsx_vpickve2gr_bu(__lsx_vmskltz_h(__lsx_vor_v(
|
|
154
|
+
one_or_two_bytes_bytemask_u16_to_u32_low,
|
|
155
|
+
one_byte_bytemask_u16_to_u32_low)),
|
|
156
|
+
0);
|
|
157
|
+
const uint32_t mask1 =
|
|
158
|
+
__lsx_vpickve2gr_bu(__lsx_vmskltz_h(__lsx_vor_v(
|
|
159
|
+
one_or_two_bytes_bytemask_u16_to_u32_high,
|
|
160
|
+
one_byte_bytemask_u16_to_u32_high)),
|
|
161
|
+
0);
|
|
162
|
+
|
|
163
|
+
const uint8_t *row0 =
|
|
164
|
+
&simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0];
|
|
165
|
+
__m128i shuffle0 = __lsx_vld(row0, 1);
|
|
166
|
+
__m128i utf8_0 = __lsx_vshuf_b(zero, out0, shuffle0);
|
|
167
|
+
|
|
168
|
+
const uint8_t *row1 =
|
|
169
|
+
&simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0];
|
|
170
|
+
__m128i shuffle1 = __lsx_vld(row1, 1);
|
|
171
|
+
__m128i utf8_1 = __lsx_vshuf_b(zero, out1, shuffle1);
|
|
172
|
+
|
|
173
|
+
__lsx_vst(utf8_0, utf8_output, 0);
|
|
174
|
+
utf8_output += row0[0];
|
|
175
|
+
__lsx_vst(utf8_1, utf8_output, 0);
|
|
176
|
+
utf8_output += row1[0];
|
|
177
|
+
|
|
178
|
+
buf += 8;
|
|
179
|
+
}
|
|
180
|
+
// At least one 32-bit word will produce a surrogate pair in UTF-16 <=>
|
|
181
|
+
// will produce four UTF-8 bytes.
|
|
182
|
+
} else {
|
|
183
|
+
// Let us do a scalar fallback.
|
|
184
|
+
// It may seem wasteful to use scalar code, but being efficient with SIMD
|
|
185
|
+
// in the presence of surrogate pairs may require non-trivial tables.
|
|
186
|
+
size_t forward = 15;
|
|
187
|
+
size_t k = 0;
|
|
188
|
+
if (size_t(end - buf) < forward + 1) {
|
|
189
|
+
forward = size_t(end - buf - 1);
|
|
190
|
+
}
|
|
191
|
+
for (; k < forward; k++) {
|
|
192
|
+
uint32_t word = buf[k];
|
|
193
|
+
if ((word & 0xFFFFFF80) == 0) {
|
|
194
|
+
*utf8_output++ = char(word);
|
|
195
|
+
} else if ((word & 0xFFFFF800) == 0) {
|
|
196
|
+
*utf8_output++ = char((word >> 6) | 0b11000000);
|
|
197
|
+
*utf8_output++ = char((word & 0b111111) | 0b10000000);
|
|
198
|
+
} else if ((word & 0xFFFF0000) == 0) {
|
|
199
|
+
if (word >= 0xD800 && word <= 0xDFFF) {
|
|
200
|
+
return std::make_pair(nullptr,
|
|
201
|
+
reinterpret_cast<char *>(utf8_output));
|
|
202
|
+
}
|
|
203
|
+
*utf8_output++ = char((word >> 12) | 0b11100000);
|
|
204
|
+
*utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000);
|
|
205
|
+
*utf8_output++ = char((word & 0b111111) | 0b10000000);
|
|
206
|
+
} else {
|
|
207
|
+
if (word > 0x10FFFF) {
|
|
208
|
+
return std::make_pair(nullptr,
|
|
209
|
+
reinterpret_cast<char *>(utf8_output));
|
|
210
|
+
}
|
|
211
|
+
*utf8_output++ = char((word >> 18) | 0b11110000);
|
|
212
|
+
*utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000);
|
|
213
|
+
*utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000);
|
|
214
|
+
*utf8_output++ = char((word & 0b111111) | 0b10000000);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
buf += k;
|
|
218
|
+
}
|
|
219
|
+
} // while
|
|
220
|
+
|
|
221
|
+
// check for invalid input
|
|
222
|
+
if (__lsx_bnz_v(forbidden_bytemask)) {
|
|
223
|
+
return std::make_pair(nullptr, reinterpret_cast<char *>(utf8_output));
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
return std::make_pair(buf, reinterpret_cast<char *>(utf8_output));
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
std::pair<result, char *>
|
|
230
|
+
lsx_convert_utf32_to_utf8_with_errors(const char32_t *buf, size_t len,
|
|
231
|
+
char *utf8_out) {
|
|
232
|
+
uint8_t *utf8_output = reinterpret_cast<uint8_t *>(utf8_out);
|
|
233
|
+
const char32_t *start = buf;
|
|
234
|
+
const char32_t *end = buf + len;
|
|
235
|
+
|
|
236
|
+
__m128i v_c080 = lsx_splat_u16(0xc080);
|
|
237
|
+
__m128i v_07ff = lsx_splat_u16(0x07ff);
|
|
238
|
+
__m128i v_dfff = lsx_splat_u16(0xdfff);
|
|
239
|
+
__m128i v_d800 = lsx_splat_u16(0xd800);
|
|
240
|
+
__m128i forbidden_bytemask = __lsx_vldi(0x0);
|
|
241
|
+
const size_t safety_margin =
|
|
242
|
+
12; // to avoid overruns, see issue
|
|
243
|
+
// https://github.com/simdutf/simdutf/issues/92
|
|
244
|
+
|
|
245
|
+
while (end - buf > std::ptrdiff_t(16 + safety_margin)) {
|
|
246
|
+
__m128i in = __lsx_vld(reinterpret_cast<const uint32_t *>(buf), 0);
|
|
247
|
+
__m128i nextin = __lsx_vld(reinterpret_cast<const uint32_t *>(buf), 16);
|
|
248
|
+
|
|
249
|
+
// Check if no bits set above 16th
|
|
250
|
+
if (__lsx_bz_v(__lsx_vpickod_h(in, nextin))) {
|
|
251
|
+
// Pack UTF-32 to UTF-16 safely (without surrogate pairs)
|
|
252
|
+
// Apply UTF-16 => UTF-8 routine (lsx_convert_utf16_to_utf8.cpp)
|
|
253
|
+
__m128i utf16_packed = __lsx_vpickev_h(nextin, in);
|
|
254
|
+
|
|
255
|
+
if (__lsx_bz_v(__lsx_vslt_hu(__lsx_vrepli_h(0x7F),
|
|
256
|
+
utf16_packed))) { // ASCII fast path!!!!
|
|
257
|
+
// 1. pack the bytes
|
|
258
|
+
// obviously suboptimal.
|
|
259
|
+
__m128i utf8_packed = __lsx_vpickev_b(utf16_packed, utf16_packed);
|
|
260
|
+
// 2. store (8 bytes)
|
|
261
|
+
__lsx_vst(utf8_packed, utf8_output, 0);
|
|
262
|
+
// 3. adjust pointers
|
|
263
|
+
buf += 8;
|
|
264
|
+
utf8_output += 8;
|
|
265
|
+
continue; // we are done for this round!
|
|
266
|
+
}
|
|
267
|
+
__m128i zero = __lsx_vldi(0);
|
|
268
|
+
if (__lsx_bz_v(__lsx_vslt_hu(v_07ff, utf16_packed))) {
|
|
269
|
+
// 1. prepare 2-byte values
|
|
270
|
+
// input 16-bit word : [0000|0aaa|aabb|bbbb] x 8
|
|
271
|
+
// expected output : [110a|aaaa|10bb|bbbb] x 8
|
|
272
|
+
|
|
273
|
+
// t0 = [000a|aaaa|bbbb|bb00]
|
|
274
|
+
const __m128i t0 = __lsx_vslli_h(utf16_packed, 2);
|
|
275
|
+
// t1 = [000a|aaaa|0000|0000]
|
|
276
|
+
const __m128i t1 = __lsx_vand_v(t0, lsx_splat_u16(0x1f00));
|
|
277
|
+
// t2 = [0000|0000|00bb|bbbb]
|
|
278
|
+
const __m128i t2 = __lsx_vand_v(utf16_packed, __lsx_vrepli_h(0x3f));
|
|
279
|
+
// t3 = [000a|aaaa|00bb|bbbb]
|
|
280
|
+
const __m128i t3 = __lsx_vor_v(t1, t2);
|
|
281
|
+
// t4 = [110a|aaaa|10bb|bbbb]
|
|
282
|
+
const __m128i t4 = __lsx_vor_v(t3, v_c080);
|
|
283
|
+
// 2. merge ASCII and 2-byte codewords
|
|
284
|
+
__m128i one_byte_bytemask =
|
|
285
|
+
__lsx_vsle_hu(utf16_packed, __lsx_vrepli_h(0x7F /*0x007F*/));
|
|
286
|
+
__m128i utf8_unpacked =
|
|
287
|
+
__lsx_vbitsel_v(t4, utf16_packed, one_byte_bytemask);
|
|
288
|
+
// 3. prepare bitmask for 8-bit lookup
|
|
289
|
+
uint32_t m2 =
|
|
290
|
+
__lsx_vpickve2gr_bu(__lsx_vmskltz_h(one_byte_bytemask), 0);
|
|
291
|
+
// 4. pack the bytes
|
|
292
|
+
const uint8_t *row =
|
|
293
|
+
&simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes
|
|
294
|
+
[lsx_1_2_utf8_bytes_mask[m2]][0];
|
|
295
|
+
__m128i shuffle = __lsx_vld(row, 1);
|
|
296
|
+
__m128i utf8_packed = __lsx_vshuf_b(zero, utf8_unpacked, shuffle);
|
|
297
|
+
// 5. store bytes
|
|
298
|
+
__lsx_vst(utf8_packed, utf8_output, 0);
|
|
299
|
+
|
|
300
|
+
// 6. adjust pointers
|
|
301
|
+
buf += 8;
|
|
302
|
+
utf8_output += row[0];
|
|
303
|
+
continue;
|
|
304
|
+
} else {
|
|
305
|
+
// case: code units from register produce either 1, 2 or 3 UTF-8 bytes
|
|
306
|
+
forbidden_bytemask = __lsx_vor_v(
|
|
307
|
+
__lsx_vand_v(
|
|
308
|
+
__lsx_vsle_h(utf16_packed, v_dfff), // utf16_packed <= 0xdfff
|
|
309
|
+
__lsx_vsle_h(v_d800, utf16_packed)), // utf16_packed >= 0xd800
|
|
310
|
+
forbidden_bytemask);
|
|
311
|
+
if (__lsx_bnz_v(forbidden_bytemask)) {
|
|
312
|
+
return std::make_pair(result(error_code::SURROGATE, buf - start),
|
|
313
|
+
reinterpret_cast<char *>(utf8_output));
|
|
314
|
+
}
|
|
315
|
+
/* In this branch we handle three cases:
|
|
316
|
+
1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - single
|
|
317
|
+
UFT-8 byte
|
|
318
|
+
2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] - two
|
|
319
|
+
UTF-8 bytes
|
|
320
|
+
3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - three
|
|
321
|
+
UTF-8 bytes
|
|
322
|
+
|
|
323
|
+
We expand the input word (16-bit) into two code units (32-bit), thus
|
|
324
|
+
we have room for four bytes. However, we need five distinct bit
|
|
325
|
+
layouts. Note that the last byte in cases #2 and #3 is the same.
|
|
326
|
+
|
|
327
|
+
We precompute byte 1 for case #1 and the common byte for cases #2 & #3
|
|
328
|
+
in register t2.
|
|
329
|
+
|
|
330
|
+
We precompute byte 1 for case #3 and -- **conditionally** -- precompute
|
|
331
|
+
either byte 1 for case #2 or byte 2 for case #3. Note that they
|
|
332
|
+
differ by exactly one bit.
|
|
333
|
+
|
|
334
|
+
Finally from these two code units we build proper UTF-8 sequence, taking
|
|
335
|
+
into account the case (i.e, the number of bytes to write).
|
|
336
|
+
*/
|
|
337
|
+
/**
|
|
338
|
+
* Given [aaaa|bbbb|bbcc|cccc] our goal is to produce:
|
|
339
|
+
* t2 => [0ccc|cccc] [10cc|cccc]
|
|
340
|
+
* s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb])
|
|
341
|
+
*/
|
|
342
|
+
// [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc]
|
|
343
|
+
__m128i t0 = __lsx_vpickev_b(utf16_packed, utf16_packed);
|
|
344
|
+
t0 = __lsx_vilvl_b(t0, t0);
|
|
345
|
+
// [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc]
|
|
346
|
+
__m128i v_3f7f = __lsx_vreplgr2vr_h(uint16_t(0x3F7F));
|
|
347
|
+
__m128i t1 = __lsx_vand_v(t0, v_3f7f);
|
|
348
|
+
// [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc]
|
|
349
|
+
__m128i t2 = __lsx_vor_v(t1, lsx_splat_u16(0x8000));
|
|
350
|
+
|
|
351
|
+
// s0: [aaaa|bbbb|bbcc|cccc] => [0000|0000|0000|aaaa]
|
|
352
|
+
__m128i s0 = __lsx_vsrli_h(utf16_packed, 12);
|
|
353
|
+
// s1: [aaaa|bbbb|bbcc|cccc] => [0000|bbbb|bb00|0000]
|
|
354
|
+
__m128i s1 = __lsx_vslli_h(utf16_packed, 2);
|
|
355
|
+
// [0000|bbbb|bb00|0000] => [00bb|bbbb|0000|0000]
|
|
356
|
+
s1 = __lsx_vand_v(s1, lsx_splat_u16(0x3F00));
|
|
357
|
+
// [00bb|bbbb|0000|aaaa]
|
|
358
|
+
__m128i s2 = __lsx_vor_v(s0, s1);
|
|
359
|
+
// s3: [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa]
|
|
360
|
+
__m128i v_c0e0 = __lsx_vreplgr2vr_h(uint16_t(0xC0E0));
|
|
361
|
+
__m128i s3 = __lsx_vor_v(s2, v_c0e0);
|
|
362
|
+
// __m128i v_07ff = vmovq_n_u16((uint16_t)0x07FF);
|
|
363
|
+
__m128i one_or_two_bytes_bytemask = __lsx_vsle_hu(utf16_packed, v_07ff);
|
|
364
|
+
__m128i m0 =
|
|
365
|
+
__lsx_vandn_v(one_or_two_bytes_bytemask, lsx_splat_u16(0x4000));
|
|
366
|
+
__m128i s4 = __lsx_vxor_v(s3, m0);
|
|
367
|
+
|
|
368
|
+
// 4. expand code units 16-bit => 32-bit
|
|
369
|
+
__m128i out0 = __lsx_vilvl_h(s4, t2);
|
|
370
|
+
__m128i out1 = __lsx_vilvh_h(s4, t2);
|
|
371
|
+
|
|
372
|
+
// 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle
|
|
373
|
+
__m128i one_byte_bytemask =
|
|
374
|
+
__lsx_vsle_hu(utf16_packed, __lsx_vrepli_h(0x7F));
|
|
375
|
+
|
|
376
|
+
__m128i one_or_two_bytes_bytemask_u16_to_u32_low =
|
|
377
|
+
__lsx_vilvl_h(one_or_two_bytes_bytemask, zero);
|
|
378
|
+
__m128i one_or_two_bytes_bytemask_u16_to_u32_high =
|
|
379
|
+
__lsx_vilvh_h(one_or_two_bytes_bytemask, zero);
|
|
380
|
+
|
|
381
|
+
__m128i one_byte_bytemask_u16_to_u32_low =
|
|
382
|
+
__lsx_vilvl_h(one_byte_bytemask, one_byte_bytemask);
|
|
383
|
+
__m128i one_byte_bytemask_u16_to_u32_high =
|
|
384
|
+
__lsx_vilvh_h(one_byte_bytemask, one_byte_bytemask);
|
|
385
|
+
|
|
386
|
+
const uint32_t mask0 =
|
|
387
|
+
__lsx_vpickve2gr_bu(__lsx_vmskltz_h(__lsx_vor_v(
|
|
388
|
+
one_or_two_bytes_bytemask_u16_to_u32_low,
|
|
389
|
+
one_byte_bytemask_u16_to_u32_low)),
|
|
390
|
+
0);
|
|
391
|
+
const uint32_t mask1 =
|
|
392
|
+
__lsx_vpickve2gr_bu(__lsx_vmskltz_h(__lsx_vor_v(
|
|
393
|
+
one_or_two_bytes_bytemask_u16_to_u32_high,
|
|
394
|
+
one_byte_bytemask_u16_to_u32_high)),
|
|
395
|
+
0);
|
|
396
|
+
|
|
397
|
+
const uint8_t *row0 =
|
|
398
|
+
&simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0];
|
|
399
|
+
__m128i shuffle0 = __lsx_vld(row0, 1);
|
|
400
|
+
__m128i utf8_0 = __lsx_vshuf_b(zero, out0, shuffle0);
|
|
401
|
+
|
|
402
|
+
const uint8_t *row1 =
|
|
403
|
+
&simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0];
|
|
404
|
+
__m128i shuffle1 = __lsx_vld(row1, 1);
|
|
405
|
+
__m128i utf8_1 = __lsx_vshuf_b(zero, out1, shuffle1);
|
|
406
|
+
|
|
407
|
+
__lsx_vst(utf8_0, utf8_output, 0);
|
|
408
|
+
utf8_output += row0[0];
|
|
409
|
+
__lsx_vst(utf8_1, utf8_output, 0);
|
|
410
|
+
utf8_output += row1[0];
|
|
411
|
+
|
|
412
|
+
buf += 8;
|
|
413
|
+
}
|
|
414
|
+
// At least one 32-bit word will produce a surrogate pair in UTF-16 <=>
|
|
415
|
+
// will produce four UTF-8 bytes.
|
|
416
|
+
} else {
|
|
417
|
+
// Let us do a scalar fallback.
|
|
418
|
+
// It may seem wasteful to use scalar code, but being efficient with SIMD
|
|
419
|
+
// in the presence of surrogate pairs may require non-trivial tables.
|
|
420
|
+
size_t forward = 15;
|
|
421
|
+
size_t k = 0;
|
|
422
|
+
if (size_t(end - buf) < forward + 1) {
|
|
423
|
+
forward = size_t(end - buf - 1);
|
|
424
|
+
}
|
|
425
|
+
for (; k < forward; k++) {
|
|
426
|
+
uint32_t word = buf[k];
|
|
427
|
+
if ((word & 0xFFFFFF80) == 0) {
|
|
428
|
+
*utf8_output++ = char(word);
|
|
429
|
+
} else if ((word & 0xFFFFF800) == 0) {
|
|
430
|
+
*utf8_output++ = char((word >> 6) | 0b11000000);
|
|
431
|
+
*utf8_output++ = char((word & 0b111111) | 0b10000000);
|
|
432
|
+
} else if ((word & 0xFFFF0000) == 0) {
|
|
433
|
+
if (word >= 0xD800 && word <= 0xDFFF) {
|
|
434
|
+
return std::make_pair(
|
|
435
|
+
result(error_code::SURROGATE, buf - start + k),
|
|
436
|
+
reinterpret_cast<char *>(utf8_output));
|
|
437
|
+
}
|
|
438
|
+
*utf8_output++ = char((word >> 12) | 0b11100000);
|
|
439
|
+
*utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000);
|
|
440
|
+
*utf8_output++ = char((word & 0b111111) | 0b10000000);
|
|
441
|
+
} else {
|
|
442
|
+
if (word > 0x10FFFF) {
|
|
443
|
+
return std::make_pair(
|
|
444
|
+
result(error_code::TOO_LARGE, buf - start + k),
|
|
445
|
+
reinterpret_cast<char *>(utf8_output));
|
|
446
|
+
}
|
|
447
|
+
*utf8_output++ = char((word >> 18) | 0b11110000);
|
|
448
|
+
*utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000);
|
|
449
|
+
*utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000);
|
|
450
|
+
*utf8_output++ = char((word & 0b111111) | 0b10000000);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
buf += k;
|
|
454
|
+
}
|
|
455
|
+
} // while
|
|
456
|
+
|
|
457
|
+
return std::make_pair(result(error_code::SUCCESS, buf - start),
|
|
458
|
+
reinterpret_cast<char *>(utf8_output));
|
|
459
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
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
|
+
uint64_t buffer[2];
|
|
70
|
+
// __lsx_vst(latin1_packed, reinterpret_cast<uint8_t *>(latin1_output), 0);
|
|
71
|
+
__lsx_vst(latin1_packed, reinterpret_cast<uint8_t *>(buffer), 0);
|
|
72
|
+
std::memcpy(latin1_output, buffer, 6);
|
|
73
|
+
latin1_output += 6; // We wrote 6 bytes.
|
|
74
|
+
return consumed;
|
|
75
|
+
}
|