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,313 @@
|
|
|
1
|
+
// Convert up to 16 bytes from utf8 to utf16 using a mask indicating the
|
|
2
|
+
// end of the code points. Only the least significant 12 bits of the mask
|
|
3
|
+
// are accessed.
|
|
4
|
+
// It returns how many bytes were consumed (up to 16, usually 12).
|
|
5
|
+
template <endianness big_endian>
|
|
6
|
+
size_t convert_masked_utf8_to_utf16(const char *input,
|
|
7
|
+
uint64_t utf8_end_of_code_point_mask,
|
|
8
|
+
char16_t *&utf16_output) {
|
|
9
|
+
// we use an approach where we try to process up to 12 input bytes.
|
|
10
|
+
// Why 12 input bytes and not 16? Because we are concerned with the size of
|
|
11
|
+
// the lookup tables. Also 12 is nicely divisible by two and three.
|
|
12
|
+
//
|
|
13
|
+
uint8x16_t in = vld1q_u8(reinterpret_cast<const uint8_t *>(input));
|
|
14
|
+
const uint16_t input_utf8_end_of_code_point_mask =
|
|
15
|
+
utf8_end_of_code_point_mask & 0xfff;
|
|
16
|
+
//
|
|
17
|
+
// Optimization note: our main path below is load-latency dependent. Thus it
|
|
18
|
+
// is maybe beneficial to have fast paths that depend on branch prediction but
|
|
19
|
+
// have less latency. This results in more instructions but, potentially, also
|
|
20
|
+
// higher speeds.
|
|
21
|
+
|
|
22
|
+
// We first try a few fast paths.
|
|
23
|
+
// The obvious first test is ASCII, which actually consumes the full 16.
|
|
24
|
+
if ((utf8_end_of_code_point_mask & 0xFFFF) == 0xffff) {
|
|
25
|
+
// We process in chunks of 16 bytes
|
|
26
|
+
// The routine in simd.h is reused.
|
|
27
|
+
simd8<int8_t> temp{vreinterpretq_s8_u8(in)};
|
|
28
|
+
temp.store_ascii_as_utf16<big_endian>(utf16_output);
|
|
29
|
+
utf16_output += 16; // We wrote 16 16-bit characters.
|
|
30
|
+
return 16; // We consumed 16 bytes.
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// 3 byte sequences are the next most common, as seen in CJK, which has long
|
|
34
|
+
// sequences of these.
|
|
35
|
+
if (input_utf8_end_of_code_point_mask == 0x924) {
|
|
36
|
+
// We want to take 4 3-byte UTF-8 code units and turn them into 4 2-byte
|
|
37
|
+
// UTF-16 code units.
|
|
38
|
+
uint16x4_t composed = convert_utf8_3_byte_to_utf16(in);
|
|
39
|
+
// Byte swap if necessary
|
|
40
|
+
if simdutf_constexpr (!match_system(big_endian)) {
|
|
41
|
+
composed = vreinterpret_u16_u8(vrev16_u8(vreinterpret_u8_u16(composed)));
|
|
42
|
+
}
|
|
43
|
+
vst1_u16(reinterpret_cast<uint16_t *>(utf16_output), composed);
|
|
44
|
+
utf16_output += 4; // We wrote 4 16-bit characters.
|
|
45
|
+
return 12; // We consumed 12 bytes.
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// 2 byte sequences occur in short bursts in languages like Greek and Russian.
|
|
49
|
+
if ((utf8_end_of_code_point_mask & 0xFFF) == 0xaaa) {
|
|
50
|
+
// We want to take 6 2-byte UTF-8 code units and turn them into 6 2-byte
|
|
51
|
+
// UTF-16 code units.
|
|
52
|
+
uint16x8_t composed = convert_utf8_2_byte_to_utf16(in);
|
|
53
|
+
// Byte swap if necessary
|
|
54
|
+
if simdutf_constexpr (!match_system(big_endian)) {
|
|
55
|
+
composed =
|
|
56
|
+
vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(composed)));
|
|
57
|
+
}
|
|
58
|
+
vst1q_u16(reinterpret_cast<uint16_t *>(utf16_output), composed);
|
|
59
|
+
|
|
60
|
+
utf16_output += 6; // We wrote 6 16-bit characters.
|
|
61
|
+
return 12; // We consumed 12 bytes.
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/// We do not have a fast path available, or the fast path is unimportant, so
|
|
65
|
+
/// we fallback.
|
|
66
|
+
const uint8_t idx = simdutf::tables::utf8_to_utf16::utf8bigindex
|
|
67
|
+
[input_utf8_end_of_code_point_mask][0];
|
|
68
|
+
|
|
69
|
+
const uint8_t consumed = simdutf::tables::utf8_to_utf16::utf8bigindex
|
|
70
|
+
[input_utf8_end_of_code_point_mask][1];
|
|
71
|
+
|
|
72
|
+
if (idx < 64) {
|
|
73
|
+
// SIX (6) input code-code units
|
|
74
|
+
// Convert to UTF-16
|
|
75
|
+
uint16x8_t composed = convert_utf8_1_to_2_byte_to_utf16(in, idx);
|
|
76
|
+
// Byte swap if necessary
|
|
77
|
+
if simdutf_constexpr (!match_system(big_endian)) {
|
|
78
|
+
composed =
|
|
79
|
+
vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(composed)));
|
|
80
|
+
}
|
|
81
|
+
// Store
|
|
82
|
+
vst1q_u16(reinterpret_cast<uint16_t *>(utf16_output), composed);
|
|
83
|
+
utf16_output += 6; // We wrote 6 16-bit characters.
|
|
84
|
+
return consumed;
|
|
85
|
+
} else if (idx < 145) {
|
|
86
|
+
// FOUR (4) input code-code units
|
|
87
|
+
// UTF-16 and UTF-32 use similar algorithms, but UTF-32 skips the narrowing.
|
|
88
|
+
uint8x16_t sh = vld1q_u8(reinterpret_cast<const uint8_t *>(
|
|
89
|
+
simdutf::tables::utf8_to_utf16::shufutf8[idx]));
|
|
90
|
+
// XXX: depending on the system scalar instructions might be faster.
|
|
91
|
+
// 1 byte: 00000000 00000000 0ccccccc
|
|
92
|
+
// 2 byte: 00000000 110bbbbb 10cccccc
|
|
93
|
+
// 3 byte: 1110aaaa 10bbbbbb 10cccccc
|
|
94
|
+
uint32x4_t perm = vreinterpretq_u32_u8(vqtbl1q_u8(in, sh));
|
|
95
|
+
// 1 byte: 00000000 0ccccccc
|
|
96
|
+
// 2 byte: xx0bbbbb x0cccccc
|
|
97
|
+
// 3 byte: xxbbbbbb x0cccccc
|
|
98
|
+
uint16x4_t lowperm = vmovn_u32(perm);
|
|
99
|
+
// Partially mask with bic (doesn't require a temporary register unlike and)
|
|
100
|
+
// The shift left insert below will clear the top bits.
|
|
101
|
+
// 1 byte: 00000000 00000000
|
|
102
|
+
// 2 byte: xx0bbbbb 00000000
|
|
103
|
+
// 3 byte: xxbbbbbb 00000000
|
|
104
|
+
uint16x4_t middlebyte = vbic_u16(lowperm, vmov_n_u16(uint16_t(~0xFF00)));
|
|
105
|
+
// ASCII
|
|
106
|
+
// 1 byte: 00000000 0ccccccc
|
|
107
|
+
// 2+byte: 00000000 00cccccc
|
|
108
|
+
uint16x4_t ascii = vand_u16(lowperm, vmov_n_u16(0x7F));
|
|
109
|
+
// Split into narrow vectors.
|
|
110
|
+
// 2 byte: 00000000 00000000
|
|
111
|
+
// 3 byte: 00000000 xxxxaaaa
|
|
112
|
+
uint16x4_t highperm = vshrn_n_u32(perm, 16);
|
|
113
|
+
// Shift right accumulate the middle byte
|
|
114
|
+
// 1 byte: 00000000 0ccccccc
|
|
115
|
+
// 2 byte: 00xx0bbb bbcccccc
|
|
116
|
+
// 3 byte: 00xxbbbb bbcccccc
|
|
117
|
+
uint16x4_t middlelow = vsra_n_u16(ascii, middlebyte, 2);
|
|
118
|
+
// Shift left and insert the top 4 bits, overwriting the garbage
|
|
119
|
+
// 1 byte: 00000000 0ccccccc
|
|
120
|
+
// 2 byte: 00000bbb bbcccccc
|
|
121
|
+
// 3 byte: aaaabbbb bbcccccc
|
|
122
|
+
uint16x4_t composed = vsli_n_u16(middlelow, highperm, 12);
|
|
123
|
+
// Byte swap if necessary
|
|
124
|
+
if simdutf_constexpr (!match_system(big_endian)) {
|
|
125
|
+
composed = vreinterpret_u16_u8(vrev16_u8(vreinterpret_u8_u16(composed)));
|
|
126
|
+
}
|
|
127
|
+
vst1_u16(reinterpret_cast<uint16_t *>(utf16_output), composed);
|
|
128
|
+
|
|
129
|
+
utf16_output += 4; // We wrote 4 16-bit codepoints
|
|
130
|
+
return consumed;
|
|
131
|
+
} else if (idx < 209) {
|
|
132
|
+
// THREE (3) input code-code units
|
|
133
|
+
if (input_utf8_end_of_code_point_mask == 0x888) {
|
|
134
|
+
// We want to take 3 4-byte UTF-8 code units and turn them into 3 4-byte
|
|
135
|
+
// UTF-16 pairs. Generating surrogate pairs is a little tricky though, but
|
|
136
|
+
// it is easier when we can assume they are all pairs. This version does
|
|
137
|
+
// not use the LUT, but 4 byte sequences are less common and the overhead
|
|
138
|
+
// of the extra memory access is less important than the early branch
|
|
139
|
+
// overhead in shorter sequences.
|
|
140
|
+
|
|
141
|
+
// Swap byte pairs
|
|
142
|
+
// 10dddddd 10cccccc|10bbbbbb 11110aaa
|
|
143
|
+
// 10cccccc 10dddddd|11110aaa 10bbbbbb
|
|
144
|
+
uint8x16_t swap = vrev16q_u8(in);
|
|
145
|
+
// Shift left 2 bits
|
|
146
|
+
// cccccc00 dddddd00 xxxxxxxx bbbbbb00
|
|
147
|
+
uint32x4_t shift = vreinterpretq_u32_u8(vshlq_n_u8(swap, 2));
|
|
148
|
+
// Create a magic number containing the low 2 bits of the trail surrogate
|
|
149
|
+
// and all the corrections needed to create the pair. UTF-8 4b prefix =
|
|
150
|
+
// -0x0000|0xF000 surrogate offset = -0x0000|0x0040 (0x10000 << 6)
|
|
151
|
+
// surrogate high = +0x0000|0xD800
|
|
152
|
+
// surrogate low = +0xDC00|0x0000
|
|
153
|
+
// -------------------------------
|
|
154
|
+
// = +0xDC00|0xE7C0
|
|
155
|
+
uint32x4_t magic = vmovq_n_u32(0xDC00E7C0);
|
|
156
|
+
// Generate unadjusted trail surrogate minus lowest 2 bits
|
|
157
|
+
// xxxxxxxx xxxxxxxx|11110aaa bbbbbb00
|
|
158
|
+
uint32x4_t trail =
|
|
159
|
+
vbslq_u32(vmovq_n_u32(0x0000FF00), vreinterpretq_u32_u8(swap), shift);
|
|
160
|
+
// Insert low 2 bits of trail surrogate to magic number for later
|
|
161
|
+
// 11011100 00000000 11100111 110000cc
|
|
162
|
+
uint16x8_t magic_with_low_2 =
|
|
163
|
+
vreinterpretq_u16_u32(vsraq_n_u32(magic, shift, 30));
|
|
164
|
+
// Generate lead surrogate
|
|
165
|
+
// xxxxcccc ccdddddd|xxxxxxxx xxxxxxxx
|
|
166
|
+
uint32x4_t lead = vreinterpretq_u32_u16(
|
|
167
|
+
vsliq_n_u16(vreinterpretq_u16_u8(swap), vreinterpretq_u16_u8(in), 6));
|
|
168
|
+
// Mask out lead
|
|
169
|
+
// 000000cc ccdddddd|xxxxxxxx xxxxxxxx
|
|
170
|
+
lead = vbicq_u32(lead, vmovq_n_u32(uint32_t(~0x03FFFFFF)));
|
|
171
|
+
// Blend pairs
|
|
172
|
+
// 000000cc ccdddddd|11110aaa bbbbbb00
|
|
173
|
+
uint16x8_t blend = vreinterpretq_u16_u32(
|
|
174
|
+
vbslq_u32(vmovq_n_u32(0x0000FFFF), trail, lead));
|
|
175
|
+
// Add magic number to finish the result
|
|
176
|
+
// 110111CC CCDDDDDD|110110AA BBBBBBCC
|
|
177
|
+
uint16x8_t composed = vaddq_u16(blend, magic_with_low_2);
|
|
178
|
+
// Byte swap if necessary
|
|
179
|
+
if simdutf_constexpr (!match_system(big_endian)) {
|
|
180
|
+
composed =
|
|
181
|
+
vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(composed)));
|
|
182
|
+
}
|
|
183
|
+
uint16_t buffer[8];
|
|
184
|
+
vst1q_u16(reinterpret_cast<uint16_t *>(buffer), composed);
|
|
185
|
+
for (int k = 0; k < 6; k++) {
|
|
186
|
+
utf16_output[k] = buffer[k];
|
|
187
|
+
} // the loop might compiler to a couple of instructions.
|
|
188
|
+
// We need some validation. See
|
|
189
|
+
// https://github.com/simdutf/simdutf/pull/631
|
|
190
|
+
#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
|
|
191
|
+
uint8x16_t expected_mask = simdutf_make_uint8x16_t(
|
|
192
|
+
0xf8, 0xc0, 0xc0, 0xc0, 0xf8, 0xc0, 0xc0, 0xc0, 0xf8, 0xc0, 0xc0,
|
|
193
|
+
0xc0, 0x0, 0x0, 0x0, 0x0);
|
|
194
|
+
#else
|
|
195
|
+
uint8x16_t expected_mask = {0xf8, 0xc0, 0xc0, 0xc0, 0xf8, 0xc0,
|
|
196
|
+
0xc0, 0xc0, 0xf8, 0xc0, 0xc0, 0xc0,
|
|
197
|
+
0x0, 0x0, 0x0, 0x0};
|
|
198
|
+
#endif
|
|
199
|
+
#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
|
|
200
|
+
uint8x16_t expected = simdutf_make_uint8x16_t(
|
|
201
|
+
0xf0, 0x80, 0x80, 0x80, 0xf0, 0x80, 0x80, 0x80, 0xf0, 0x80, 0x80,
|
|
202
|
+
0x80, 0x0, 0x0, 0x0, 0x0);
|
|
203
|
+
#else
|
|
204
|
+
uint8x16_t expected = {0xf0, 0x80, 0x80, 0x80, 0xf0, 0x80, 0x80, 0x80,
|
|
205
|
+
0xf0, 0x80, 0x80, 0x80, 0x0, 0x0, 0x0, 0x0};
|
|
206
|
+
#endif
|
|
207
|
+
uint8x16_t check = vceqq_u8(vandq_u8(in, expected_mask), expected);
|
|
208
|
+
bool correct = (vminvq_u32(vreinterpretq_u32_u8(check)) == 0xFFFFFFFF);
|
|
209
|
+
// The validation is just three instructions and it is not on a critical
|
|
210
|
+
// path.
|
|
211
|
+
if (correct) {
|
|
212
|
+
utf16_output += 6; // We wrote 3 32-bit surrogate pairs.
|
|
213
|
+
}
|
|
214
|
+
return 12; // We consumed 12 bytes.
|
|
215
|
+
}
|
|
216
|
+
// 3 1-4 byte sequences
|
|
217
|
+
uint8x16_t sh = vld1q_u8(reinterpret_cast<const uint8_t *>(
|
|
218
|
+
simdutf::tables::utf8_to_utf16::shufutf8[idx]));
|
|
219
|
+
|
|
220
|
+
// 1 byte: 00000000 00000000 00000000 0ddddddd
|
|
221
|
+
// 3 byte: 00000000 00000000 110ccccc 10dddddd
|
|
222
|
+
// 3 byte: 00000000 1110bbbb 10cccccc 10dddddd
|
|
223
|
+
// 4 byte: 11110aaa 10bbbbbb 10cccccc 10dddddd
|
|
224
|
+
uint32x4_t perm = vreinterpretq_u32_u8(vqtbl1q_u8(in, sh));
|
|
225
|
+
// added to fix issue https://github.com/simdutf/simdutf/issues/514
|
|
226
|
+
// We only want to write 2 * 16-bit code units when that is actually what we
|
|
227
|
+
// have. Unfortunately, we cannot trust the input. So it is possible to get
|
|
228
|
+
// 0xff as an input byte and it should not result in a surrogate pair. We
|
|
229
|
+
// need to check for that.
|
|
230
|
+
uint32_t permbuffer[4];
|
|
231
|
+
vst1q_u32(permbuffer, perm);
|
|
232
|
+
// Mask the low and middle bytes
|
|
233
|
+
// 00000000 00000000 00000000 0ddddddd
|
|
234
|
+
uint32x4_t ascii = vandq_u32(perm, vmovq_n_u32(0x7f));
|
|
235
|
+
// Because the surrogates need more work, the high surrogate is computed
|
|
236
|
+
// first.
|
|
237
|
+
uint32x4_t middlehigh = vshlq_n_u32(perm, 2);
|
|
238
|
+
// 00000000 00000000 00cccccc 00000000
|
|
239
|
+
uint32x4_t middlebyte = vandq_u32(perm, vmovq_n_u32(0x3F00));
|
|
240
|
+
// Start assembling the sequence. Since the 4th byte is in the same position
|
|
241
|
+
// as it would be in a surrogate and there is no dependency, shift left
|
|
242
|
+
// instead of right. 3 byte: 00000000 10bbbbxx xxxxxxxx xxxxxxxx 4 byte:
|
|
243
|
+
// 11110aaa bbbbbbxx xxxxxxxx xxxxxxxx
|
|
244
|
+
uint32x4_t ab = vbslq_u32(vmovq_n_u32(0xFF000000), perm, middlehigh);
|
|
245
|
+
// Top 16 bits contains the high ten bits of the surrogate pair before
|
|
246
|
+
// correction 3 byte: 00000000 10bbbbcc|cccc0000 00000000 4 byte: 11110aaa
|
|
247
|
+
// bbbbbbcc|cccc0000 00000000 - high 10 bits correct w/o correction
|
|
248
|
+
uint32x4_t abc =
|
|
249
|
+
vbslq_u32(vmovq_n_u32(0xFFFC0000), ab, vshlq_n_u32(middlebyte, 4));
|
|
250
|
+
// Combine the low 6 or 7 bits by a shift right accumulate
|
|
251
|
+
// 3 byte: 00000000 00000010|bbbbcccc ccdddddd - low 16 bits correct
|
|
252
|
+
// 4 byte: 00000011 110aaabb|bbbbcccc ccdddddd - low 10 bits correct w/o
|
|
253
|
+
// correction
|
|
254
|
+
uint32x4_t composed = vsraq_n_u32(ascii, abc, 6);
|
|
255
|
+
// After this is for surrogates
|
|
256
|
+
// Blend the low and high surrogates
|
|
257
|
+
// 4 byte: 11110aaa bbbbbbcc|bbbbcccc ccdddddd
|
|
258
|
+
uint32x4_t mixed = vbslq_u32(vmovq_n_u32(0xFFFF0000), abc, composed);
|
|
259
|
+
// Clear the upper 6 bits of the low surrogate. Don't clear the upper bits
|
|
260
|
+
// yet as 0x10000 was not subtracted from the codepoint yet. 4 byte:
|
|
261
|
+
// 11110aaa bbbbbbcc|000000cc ccdddddd
|
|
262
|
+
uint16x8_t masked_pair = vreinterpretq_u16_u32(
|
|
263
|
+
vbicq_u32(mixed, vmovq_n_u32(uint32_t(~0xFFFF03FF))));
|
|
264
|
+
// Correct the remaining UTF-8 prefix, surrogate offset, and add the
|
|
265
|
+
// surrogate prefixes in one magic 16-bit addition. similar magic number but
|
|
266
|
+
// without the continue byte adjust and halfword swapped UTF-8 4b prefix =
|
|
267
|
+
// -0xF000|0x0000 surrogate offset = -0x0040|0x0000 (0x10000 << 6)
|
|
268
|
+
// surrogate high = +0xD800|0x0000
|
|
269
|
+
// surrogate low = +0x0000|0xDC00
|
|
270
|
+
// -----------------------------------
|
|
271
|
+
// = +0xE7C0|0xDC00
|
|
272
|
+
uint16x8_t magic = vreinterpretq_u16_u32(vmovq_n_u32(0xE7C0DC00));
|
|
273
|
+
// 4 byte: 110110AA BBBBBBCC|110111CC CCDDDDDD - surrogate pair complete
|
|
274
|
+
uint32x4_t surrogates =
|
|
275
|
+
vreinterpretq_u32_u16(vaddq_u16(masked_pair, magic));
|
|
276
|
+
// If the high bit is 1 (s32 less than zero), this needs a surrogate pair
|
|
277
|
+
uint32x4_t is_pair = vcltzq_s32(vreinterpretq_s32_u32(perm));
|
|
278
|
+
|
|
279
|
+
// Select either the 4 byte surrogate pair or the 2 byte solo codepoint
|
|
280
|
+
// 3 byte: 0xxxxxxx xxxxxxxx|bbbbcccc ccdddddd
|
|
281
|
+
// 4 byte: 110110AA BBBBBBCC|110111CC CCDDDDDD
|
|
282
|
+
uint32x4_t selected = vbslq_u32(is_pair, surrogates, composed);
|
|
283
|
+
// Byte swap if necessary
|
|
284
|
+
if simdutf_constexpr (!match_system(big_endian)) {
|
|
285
|
+
selected =
|
|
286
|
+
vreinterpretq_u32_u8(vrev16q_u8(vreinterpretq_u8_u32(selected)));
|
|
287
|
+
}
|
|
288
|
+
// Attempting to shuffle and store would be complex, just scalarize.
|
|
289
|
+
uint32_t buffer[4];
|
|
290
|
+
vst1q_u32(buffer, selected);
|
|
291
|
+
// Test for the top bit of the surrogate mask. Remove due to issue 514
|
|
292
|
+
// const uint32_t SURROGATE_MASK = match_system(big_endian) ? 0x80000000 :
|
|
293
|
+
// 0x00800000;
|
|
294
|
+
for (size_t i = 0; i < 3; i++) {
|
|
295
|
+
// Surrogate
|
|
296
|
+
// Used to be if (buffer[i] & SURROGATE_MASK) {
|
|
297
|
+
// See discussion above.
|
|
298
|
+
// patch for issue https://github.com/simdutf/simdutf/issues/514
|
|
299
|
+
if ((permbuffer[i] & 0xf8000000) == 0xf0000000) {
|
|
300
|
+
utf16_output[0] = uint16_t(buffer[i] >> 16);
|
|
301
|
+
utf16_output[1] = uint16_t(buffer[i] & 0xFFFF);
|
|
302
|
+
utf16_output += 2;
|
|
303
|
+
} else {
|
|
304
|
+
utf16_output[0] = uint16_t(buffer[i] & 0xFFFF);
|
|
305
|
+
utf16_output++;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
return consumed;
|
|
309
|
+
} else {
|
|
310
|
+
// here we know that there is an error but we do not handle errors
|
|
311
|
+
return 12;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
// Convert up to 12 bytes from utf8 to utf32 using a mask indicating the
|
|
2
|
+
// end of the code points. Only the least significant 12 bits of the mask
|
|
3
|
+
// are accessed.
|
|
4
|
+
// It returns how many bytes were consumed (up to 12).
|
|
5
|
+
size_t convert_masked_utf8_to_utf32(const char *input,
|
|
6
|
+
uint64_t utf8_end_of_code_point_mask,
|
|
7
|
+
char32_t *&utf32_out) {
|
|
8
|
+
// we use an approach where we try to process up to 12 input bytes.
|
|
9
|
+
// Why 12 input bytes and not 16? Because we are concerned with the size of
|
|
10
|
+
// the lookup tables. Also 12 is nicely divisible by two and three.
|
|
11
|
+
//
|
|
12
|
+
uint32_t *&utf32_output = reinterpret_cast<uint32_t *&>(utf32_out);
|
|
13
|
+
uint8x16_t in = vld1q_u8(reinterpret_cast<const uint8_t *>(input));
|
|
14
|
+
const uint16_t input_utf8_end_of_code_point_mask =
|
|
15
|
+
utf8_end_of_code_point_mask & 0xFFF;
|
|
16
|
+
//
|
|
17
|
+
// Optimization note: our main path below is load-latency dependent. Thus it
|
|
18
|
+
// is maybe beneficial to have fast paths that depend on branch prediction but
|
|
19
|
+
// have less latency. This results in more instructions but, potentially, also
|
|
20
|
+
// higher speeds.
|
|
21
|
+
//
|
|
22
|
+
// We first try a few fast paths.
|
|
23
|
+
if (utf8_end_of_code_point_mask == 0xfff) {
|
|
24
|
+
// We process in chunks of 12 bytes.
|
|
25
|
+
// use fast implementation in src/simdutf/arm64/simd.h
|
|
26
|
+
// Ideally the compiler can keep the tables in registers.
|
|
27
|
+
simd8<int8_t> temp{vreinterpretq_s8_u8(in)};
|
|
28
|
+
temp.store_ascii_as_utf32_tbl(utf32_out);
|
|
29
|
+
utf32_output += 12; // We wrote 12 32-bit characters.
|
|
30
|
+
return 12; // We consumed 12 bytes.
|
|
31
|
+
}
|
|
32
|
+
if (input_utf8_end_of_code_point_mask == 0x924) {
|
|
33
|
+
// We want to take 4 3-byte UTF-8 code units and turn them into 4 4-byte
|
|
34
|
+
// UTF-32 code units. Convert to UTF-16
|
|
35
|
+
uint16x4_t composed_utf16 = convert_utf8_3_byte_to_utf16(in);
|
|
36
|
+
// Zero extend and store via ST2 with a zero.
|
|
37
|
+
uint16x4x2_t interleaver = {{composed_utf16, vmov_n_u16(0)}};
|
|
38
|
+
vst2_u16(reinterpret_cast<uint16_t *>(utf32_output), interleaver);
|
|
39
|
+
utf32_output += 4; // We wrote 4 32-bit characters.
|
|
40
|
+
return 12; // We consumed 12 bytes.
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// 2 byte sequences occur in short bursts in languages like Greek and Russian.
|
|
44
|
+
if (input_utf8_end_of_code_point_mask == 0xaaa) {
|
|
45
|
+
// We want to take 6 2-byte UTF-8 code units and turn them into 6 4-byte
|
|
46
|
+
// UTF-32 code units. Convert to UTF-16
|
|
47
|
+
uint16x8_t composed_utf16 = convert_utf8_2_byte_to_utf16(in);
|
|
48
|
+
// Zero extend and store via ST2 with a zero.
|
|
49
|
+
uint16x8x2_t interleaver = {{composed_utf16, vmovq_n_u16(0)}};
|
|
50
|
+
vst2q_u16(reinterpret_cast<uint16_t *>(utf32_output), interleaver);
|
|
51
|
+
utf32_output += 6; // We wrote 6 32-bit characters.
|
|
52
|
+
return 12; // We consumed 12 bytes.
|
|
53
|
+
}
|
|
54
|
+
/// Either no fast path or an unimportant fast path.
|
|
55
|
+
|
|
56
|
+
const uint8_t idx = simdutf::tables::utf8_to_utf16::utf8bigindex
|
|
57
|
+
[input_utf8_end_of_code_point_mask][0];
|
|
58
|
+
const uint8_t consumed = simdutf::tables::utf8_to_utf16::utf8bigindex
|
|
59
|
+
[input_utf8_end_of_code_point_mask][1];
|
|
60
|
+
|
|
61
|
+
if (idx < 64) {
|
|
62
|
+
// SIX (6) input code-code units
|
|
63
|
+
// Convert to UTF-16
|
|
64
|
+
uint16x8_t composed_utf16 = convert_utf8_1_to_2_byte_to_utf16(in, idx);
|
|
65
|
+
// Zero extend and store with ST2 and zero
|
|
66
|
+
uint16x8x2_t interleaver = {{composed_utf16, vmovq_n_u16(0)}};
|
|
67
|
+
vst2q_u16(reinterpret_cast<uint16_t *>(utf32_output), interleaver);
|
|
68
|
+
utf32_output += 6; // We wrote 6 32-bit characters.
|
|
69
|
+
return consumed;
|
|
70
|
+
} else if (idx < 145) {
|
|
71
|
+
// FOUR (4) input code-code units
|
|
72
|
+
// UTF-16 and UTF-32 use similar algorithms, but UTF-32 skips the narrowing.
|
|
73
|
+
uint8x16_t sh = vld1q_u8(reinterpret_cast<const uint8_t *>(
|
|
74
|
+
simdutf::tables::utf8_to_utf16::shufutf8[idx]));
|
|
75
|
+
// Shuffle
|
|
76
|
+
// 1 byte: 00000000 00000000 0ccccccc
|
|
77
|
+
// 2 byte: 00000000 110bbbbb 10cccccc
|
|
78
|
+
// 3 byte: 1110aaaa 10bbbbbb 10cccccc
|
|
79
|
+
uint32x4_t perm = vreinterpretq_u32_u8(vqtbl1q_u8(in, sh));
|
|
80
|
+
// Split
|
|
81
|
+
// 00000000 00000000 0ccccccc
|
|
82
|
+
uint32x4_t ascii = vandq_u32(perm, vmovq_n_u32(0x7F)); // 6 or 7 bits
|
|
83
|
+
// Note: unmasked
|
|
84
|
+
// xxxxxxxx aaaaxxxx xxxxxxxx
|
|
85
|
+
uint32x4_t high = vshrq_n_u32(perm, 4); // 4 bits
|
|
86
|
+
// Use 16 bit bic instead of and.
|
|
87
|
+
// The top bits will be corrected later in the bsl
|
|
88
|
+
// 00000000 10bbbbbb 00000000
|
|
89
|
+
uint32x4_t middle = vreinterpretq_u32_u16(
|
|
90
|
+
vbicq_u16(vreinterpretq_u16_u32(perm),
|
|
91
|
+
vmovq_n_u16(uint16_t(~0xff00)))); // 5 or 6 bits
|
|
92
|
+
// Combine low and middle with shift right accumulate
|
|
93
|
+
// 00000000 00xxbbbb bbcccccc
|
|
94
|
+
uint32x4_t lowmid = vsraq_n_u32(ascii, middle, 2);
|
|
95
|
+
// Insert top 4 bits from high byte with bitwise select
|
|
96
|
+
// 00000000 aaaabbbb bbcccccc
|
|
97
|
+
uint32x4_t composed = vbslq_u32(vmovq_n_u32(0x0000F000), high, lowmid);
|
|
98
|
+
vst1q_u32(utf32_output, composed);
|
|
99
|
+
utf32_output += 4; // We wrote 4 32-bit characters.
|
|
100
|
+
return consumed;
|
|
101
|
+
} else if (idx < 209) {
|
|
102
|
+
// THREE (3) input code-code units
|
|
103
|
+
if (input_utf8_end_of_code_point_mask == 0x888) {
|
|
104
|
+
// We want to take 3 4-byte UTF-8 code units and turn them into 3 4-byte
|
|
105
|
+
// UTF-32 code units. This uses the same method as the fixed 3 byte
|
|
106
|
+
// version, reversing and shift left insert. However, there is no need for
|
|
107
|
+
// a shuffle mask now, just rev16 and rev32.
|
|
108
|
+
//
|
|
109
|
+
// This version does not use the LUT, but 4 byte sequences are less common
|
|
110
|
+
// and the overhead of the extra memory access is less important than the
|
|
111
|
+
// early branch overhead in shorter sequences, so it comes last.
|
|
112
|
+
|
|
113
|
+
// Swap pairs of bytes
|
|
114
|
+
// 10dddddd|10cccccc|10bbbbbb|11110aaa
|
|
115
|
+
// 10cccccc 10dddddd|11110aaa 10bbbbbb
|
|
116
|
+
uint16x8_t swap1 = vreinterpretq_u16_u8(vrev16q_u8(in));
|
|
117
|
+
// Shift left and insert
|
|
118
|
+
// xxxxcccc ccdddddd|xxxxxxxa aabbbbbb
|
|
119
|
+
uint16x8_t merge1 = vsliq_n_u16(swap1, vreinterpretq_u16_u8(in), 6);
|
|
120
|
+
// Swap 16-bit lanes
|
|
121
|
+
// xxxxcccc ccdddddd xxxxxxxa aabbbbbb
|
|
122
|
+
// xxxxxxxa aabbbbbb xxxxcccc ccdddddd
|
|
123
|
+
uint32x4_t swap2 = vreinterpretq_u32_u16(vrev32q_u16(merge1));
|
|
124
|
+
// Shift insert again
|
|
125
|
+
// xxxxxxxx xxxaaabb bbbbcccc ccdddddd
|
|
126
|
+
uint32x4_t merge2 = vsliq_n_u32(swap2, vreinterpretq_u32_u16(merge1), 12);
|
|
127
|
+
// Clear the garbage
|
|
128
|
+
// 00000000 000aaabb bbbbcccc ccdddddd
|
|
129
|
+
uint32x4_t composed = vandq_u32(merge2, vmovq_n_u32(0x1FFFFF));
|
|
130
|
+
// Store
|
|
131
|
+
vst1q_u32(utf32_output, composed);
|
|
132
|
+
|
|
133
|
+
utf32_output += 3; // We wrote 3 32-bit characters.
|
|
134
|
+
return 12; // We consumed 12 bytes.
|
|
135
|
+
}
|
|
136
|
+
// Unlike UTF-16, doing a fast codepath doesn't have nearly as much benefit
|
|
137
|
+
// due to surrogates no longer being involved.
|
|
138
|
+
uint8x16_t sh = vld1q_u8(reinterpret_cast<const uint8_t *>(
|
|
139
|
+
simdutf::tables::utf8_to_utf16::shufutf8[idx]));
|
|
140
|
+
// 1 byte: 00000000 00000000 00000000 0ddddddd
|
|
141
|
+
// 2 byte: 00000000 00000000 110ccccc 10dddddd
|
|
142
|
+
// 3 byte: 00000000 1110bbbb 10cccccc 10dddddd
|
|
143
|
+
// 4 byte: 11110aaa 10bbbbbb 10cccccc 10dddddd
|
|
144
|
+
uint32x4_t perm = vreinterpretq_u32_u8(vqtbl1q_u8(in, sh));
|
|
145
|
+
// Ascii
|
|
146
|
+
uint32x4_t ascii = vandq_u32(perm, vmovq_n_u32(0x7F));
|
|
147
|
+
uint32x4_t middle = vandq_u32(perm, vmovq_n_u32(0x3f00));
|
|
148
|
+
// When converting the way we do, the 3 byte prefix will be interpreted as
|
|
149
|
+
// the 18th bit being set, since the code would interpret the lead byte
|
|
150
|
+
// (0b1110bbbb) as a continuation byte (0b10bbbbbb). To fix this, we can
|
|
151
|
+
// either xor or do an 8 bit add of the 6th bit shifted right by 1. Since
|
|
152
|
+
// NEON has shift right accumulate, we use that.
|
|
153
|
+
// 4 byte 3 byte
|
|
154
|
+
// 10bbbbbb 1110bbbb
|
|
155
|
+
// 00000000 01000000 6th bit
|
|
156
|
+
// 00000000 00100000 shift right
|
|
157
|
+
// 10bbbbbb 0000bbbb add
|
|
158
|
+
// 00bbbbbb 0000bbbb mask
|
|
159
|
+
uint8x16_t correction =
|
|
160
|
+
vreinterpretq_u8_u32(vandq_u32(perm, vmovq_n_u32(0x00400000)));
|
|
161
|
+
uint32x4_t corrected = vreinterpretq_u32_u8(
|
|
162
|
+
vsraq_n_u8(vreinterpretq_u8_u32(perm), correction, 1));
|
|
163
|
+
// 00000000 00000000 0000cccc ccdddddd
|
|
164
|
+
uint32x4_t cd = vsraq_n_u32(ascii, middle, 2);
|
|
165
|
+
// Insert twice
|
|
166
|
+
// xxxxxxxx xxxaaabb bbbbxxxx xxxxxxxx
|
|
167
|
+
uint32x4_t ab = vbslq_u32(vmovq_n_u32(0x01C0000), vshrq_n_u32(corrected, 6),
|
|
168
|
+
vshrq_n_u32(corrected, 4));
|
|
169
|
+
// 00000000 000aaabb bbbbcccc ccdddddd
|
|
170
|
+
uint32x4_t composed = vbslq_u32(vmovq_n_u32(0xFFE00FFF), cd, ab);
|
|
171
|
+
// Store
|
|
172
|
+
vst1q_u32(utf32_output, composed);
|
|
173
|
+
utf32_output += 3; // We wrote 3 32-bit characters.
|
|
174
|
+
return consumed;
|
|
175
|
+
} else {
|
|
176
|
+
// here we know that there is an error but we do not handle errors
|
|
177
|
+
return 12;
|
|
178
|
+
}
|
|
179
|
+
}
|