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,505 @@
|
|
|
1
|
+
std::pair<const char32_t *, char *>
|
|
2
|
+
arm_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
|
+
const uint16x8_t v_c080 = vmovq_n_u16((uint16_t)0xc080);
|
|
7
|
+
|
|
8
|
+
uint16x8_t forbidden_bytemask = vmovq_n_u16(0x0);
|
|
9
|
+
const size_t safety_margin =
|
|
10
|
+
12; // to avoid overruns, see issue
|
|
11
|
+
// https://github.com/simdutf/simdutf/issues/92
|
|
12
|
+
|
|
13
|
+
while (buf + 16 + safety_margin < end) {
|
|
14
|
+
uint32x4_t in = vld1q_u32(reinterpret_cast<const uint32_t *>(buf));
|
|
15
|
+
uint32x4_t nextin = vld1q_u32(reinterpret_cast<const uint32_t *>(buf + 4));
|
|
16
|
+
|
|
17
|
+
// Check if no bits set above 16th
|
|
18
|
+
if (vmaxvq_u32(vorrq_u32(in, nextin)) <= 0xFFFF) {
|
|
19
|
+
// Pack UTF-32 to UTF-16 safely (without surrogate pairs)
|
|
20
|
+
// Apply UTF-16 => UTF-8 routine (arm_convert_utf16_to_utf8.cpp)
|
|
21
|
+
uint16x8_t utf16_packed = vcombine_u16(vmovn_u32(in), vmovn_u32(nextin));
|
|
22
|
+
if (vmaxvq_u16(utf16_packed) <= 0x7F) { // ASCII fast path!!!!
|
|
23
|
+
// 1. pack the bytes
|
|
24
|
+
// obviously suboptimal.
|
|
25
|
+
uint8x8_t utf8_packed = vmovn_u16(utf16_packed);
|
|
26
|
+
// 2. store (8 bytes)
|
|
27
|
+
vst1_u8(utf8_output, utf8_packed);
|
|
28
|
+
// 3. adjust pointers
|
|
29
|
+
buf += 8;
|
|
30
|
+
utf8_output += 8;
|
|
31
|
+
continue; // we are done for this round!
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (vmaxvq_u16(utf16_packed) <= 0x7FF) {
|
|
35
|
+
// 1. prepare 2-byte values
|
|
36
|
+
// input 16-bit word : [0000|0aaa|aabb|bbbb] x 8
|
|
37
|
+
// expected output : [110a|aaaa|10bb|bbbb] x 8
|
|
38
|
+
const uint16x8_t v_1f00 = vmovq_n_u16((int16_t)0x1f00);
|
|
39
|
+
const uint16x8_t v_003f = vmovq_n_u16((int16_t)0x003f);
|
|
40
|
+
|
|
41
|
+
// t0 = [000a|aaaa|bbbb|bb00]
|
|
42
|
+
const uint16x8_t t0 = vshlq_n_u16(utf16_packed, 2);
|
|
43
|
+
// t1 = [000a|aaaa|0000|0000]
|
|
44
|
+
const uint16x8_t t1 = vandq_u16(t0, v_1f00);
|
|
45
|
+
// t2 = [0000|0000|00bb|bbbb]
|
|
46
|
+
const uint16x8_t t2 = vandq_u16(utf16_packed, v_003f);
|
|
47
|
+
// t3 = [000a|aaaa|00bb|bbbb]
|
|
48
|
+
const uint16x8_t t3 = vorrq_u16(t1, t2);
|
|
49
|
+
// t4 = [110a|aaaa|10bb|bbbb]
|
|
50
|
+
const uint16x8_t t4 = vorrq_u16(t3, v_c080);
|
|
51
|
+
// 2. merge ASCII and 2-byte codewords
|
|
52
|
+
const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F);
|
|
53
|
+
const uint16x8_t one_byte_bytemask = vcleq_u16(utf16_packed, v_007f);
|
|
54
|
+
const uint8x16_t utf8_unpacked = vreinterpretq_u8_u16(
|
|
55
|
+
vbslq_u16(one_byte_bytemask, utf16_packed, t4));
|
|
56
|
+
// 3. prepare bitmask for 8-bit lookup
|
|
57
|
+
#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
|
|
58
|
+
const uint16x8_t mask = simdutf_make_uint16x8_t(
|
|
59
|
+
0x0001, 0x0004, 0x0010, 0x0040, 0x0002, 0x0008, 0x0020, 0x0080);
|
|
60
|
+
#else
|
|
61
|
+
const uint16x8_t mask = {0x0001, 0x0004, 0x0010, 0x0040,
|
|
62
|
+
0x0002, 0x0008, 0x0020, 0x0080};
|
|
63
|
+
#endif
|
|
64
|
+
uint16_t m2 = vaddvq_u16(vandq_u16(one_byte_bytemask, mask));
|
|
65
|
+
// 4. pack the bytes
|
|
66
|
+
const uint8_t *row =
|
|
67
|
+
&simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[m2][0];
|
|
68
|
+
const uint8x16_t shuffle = vld1q_u8(row + 1);
|
|
69
|
+
const uint8x16_t utf8_packed = vqtbl1q_u8(utf8_unpacked, shuffle);
|
|
70
|
+
|
|
71
|
+
// 5. store bytes
|
|
72
|
+
vst1q_u8(utf8_output, utf8_packed);
|
|
73
|
+
|
|
74
|
+
// 6. adjust pointers
|
|
75
|
+
buf += 8;
|
|
76
|
+
utf8_output += row[0];
|
|
77
|
+
continue;
|
|
78
|
+
} else {
|
|
79
|
+
// case: code units from register produce either 1, 2 or 3 UTF-8 bytes
|
|
80
|
+
const uint16x8_t v_d800 = vmovq_n_u16((uint16_t)0xd800);
|
|
81
|
+
const uint16x8_t v_dfff = vmovq_n_u16((uint16_t)0xdfff);
|
|
82
|
+
forbidden_bytemask =
|
|
83
|
+
vorrq_u16(vandq_u16(vcleq_u16(utf16_packed, v_dfff),
|
|
84
|
+
vcgeq_u16(utf16_packed, v_d800)),
|
|
85
|
+
forbidden_bytemask);
|
|
86
|
+
|
|
87
|
+
#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
|
|
88
|
+
const uint16x8_t dup_even = simdutf_make_uint16x8_t(
|
|
89
|
+
0x0000, 0x0202, 0x0404, 0x0606, 0x0808, 0x0a0a, 0x0c0c, 0x0e0e);
|
|
90
|
+
#else
|
|
91
|
+
const uint16x8_t dup_even = {0x0000, 0x0202, 0x0404, 0x0606,
|
|
92
|
+
0x0808, 0x0a0a, 0x0c0c, 0x0e0e};
|
|
93
|
+
#endif
|
|
94
|
+
/* In this branch we handle three cases:
|
|
95
|
+
1. [0000|0000|0ccc|cccc] => [0ccc|cccc] -
|
|
96
|
+
single UFT-8 byte
|
|
97
|
+
2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] -
|
|
98
|
+
two UTF-8 bytes
|
|
99
|
+
3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] -
|
|
100
|
+
three UTF-8 bytes
|
|
101
|
+
|
|
102
|
+
We expand the input word (16-bit) into two code units (32-bit), thus
|
|
103
|
+
we have room for four bytes. However, we need five distinct bit
|
|
104
|
+
layouts. Note that the last byte in cases #2 and #3 is the same.
|
|
105
|
+
|
|
106
|
+
We precompute byte 1 for case #1 and the common byte for cases #2 & #3
|
|
107
|
+
in register t2.
|
|
108
|
+
|
|
109
|
+
We precompute byte 1 for case #3 and -- **conditionally** --
|
|
110
|
+
precompute either byte 1 for case #2 or byte 2 for case #3. Note that
|
|
111
|
+
they differ by exactly one bit.
|
|
112
|
+
|
|
113
|
+
Finally from these two code units we build proper UTF-8 sequence,
|
|
114
|
+
taking into account the case (i.e, the number of bytes to write).
|
|
115
|
+
*/
|
|
116
|
+
/**
|
|
117
|
+
* Given [aaaa|bbbb|bbcc|cccc] our goal is to produce:
|
|
118
|
+
* t2 => [0ccc|cccc] [10cc|cccc]
|
|
119
|
+
* s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb])
|
|
120
|
+
*/
|
|
121
|
+
#define simdutf_vec(x) vmovq_n_u16(static_cast<uint16_t>(x))
|
|
122
|
+
// [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc]
|
|
123
|
+
const uint16x8_t t0 =
|
|
124
|
+
vreinterpretq_u16_u8(vqtbl1q_u8(vreinterpretq_u8_u16(utf16_packed),
|
|
125
|
+
vreinterpretq_u8_u16(dup_even)));
|
|
126
|
+
// [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc]
|
|
127
|
+
const uint16x8_t t1 = vandq_u16(t0, simdutf_vec(0b0011111101111111));
|
|
128
|
+
// [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc]
|
|
129
|
+
const uint16x8_t t2 = vorrq_u16(t1, simdutf_vec(0b1000000000000000));
|
|
130
|
+
|
|
131
|
+
// s0: [aaaa|bbbb|bbcc|cccc] => [0000|0000|0000|aaaa]
|
|
132
|
+
const uint16x8_t s0 = vshrq_n_u16(utf16_packed, 12);
|
|
133
|
+
// s1: [aaaa|bbbb|bbcc|cccc] => [0000|bbbb|bb00|0000]
|
|
134
|
+
const uint16x8_t s1 =
|
|
135
|
+
vandq_u16(utf16_packed, simdutf_vec(0b0000111111000000));
|
|
136
|
+
// [0000|bbbb|bb00|0000] => [00bb|bbbb|0000|0000]
|
|
137
|
+
const uint16x8_t s1s = vshlq_n_u16(s1, 2);
|
|
138
|
+
// [00bb|bbbb|0000|aaaa]
|
|
139
|
+
const uint16x8_t s2 = vorrq_u16(s0, s1s);
|
|
140
|
+
// s3: [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa]
|
|
141
|
+
const uint16x8_t s3 = vorrq_u16(s2, simdutf_vec(0b1100000011100000));
|
|
142
|
+
const uint16x8_t v_07ff = vmovq_n_u16((uint16_t)0x07FF);
|
|
143
|
+
const uint16x8_t one_or_two_bytes_bytemask =
|
|
144
|
+
vcleq_u16(utf16_packed, v_07ff);
|
|
145
|
+
const uint16x8_t m0 = vbicq_u16(simdutf_vec(0b0100000000000000),
|
|
146
|
+
one_or_two_bytes_bytemask);
|
|
147
|
+
const uint16x8_t s4 = veorq_u16(s3, m0);
|
|
148
|
+
#undef simdutf_vec
|
|
149
|
+
|
|
150
|
+
// 4. expand code units 16-bit => 32-bit
|
|
151
|
+
const uint8x16_t out0 = vreinterpretq_u8_u16(vzip1q_u16(t2, s4));
|
|
152
|
+
const uint8x16_t out1 = vreinterpretq_u8_u16(vzip2q_u16(t2, s4));
|
|
153
|
+
|
|
154
|
+
// 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle
|
|
155
|
+
const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F);
|
|
156
|
+
const uint16x8_t one_byte_bytemask = vcleq_u16(utf16_packed, v_007f);
|
|
157
|
+
#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
|
|
158
|
+
const uint16x8_t onemask = simdutf_make_uint16x8_t(
|
|
159
|
+
0x0001, 0x0004, 0x0010, 0x0040, 0x0100, 0x0400, 0x1000, 0x4000);
|
|
160
|
+
const uint16x8_t twomask = simdutf_make_uint16x8_t(
|
|
161
|
+
0x0002, 0x0008, 0x0020, 0x0080, 0x0200, 0x0800, 0x2000, 0x8000);
|
|
162
|
+
#else
|
|
163
|
+
const uint16x8_t onemask = {0x0001, 0x0004, 0x0010, 0x0040,
|
|
164
|
+
0x0100, 0x0400, 0x1000, 0x4000};
|
|
165
|
+
const uint16x8_t twomask = {0x0002, 0x0008, 0x0020, 0x0080,
|
|
166
|
+
0x0200, 0x0800, 0x2000, 0x8000};
|
|
167
|
+
#endif
|
|
168
|
+
const uint16x8_t combined =
|
|
169
|
+
vorrq_u16(vandq_u16(one_byte_bytemask, onemask),
|
|
170
|
+
vandq_u16(one_or_two_bytes_bytemask, twomask));
|
|
171
|
+
const uint16_t mask = vaddvq_u16(combined);
|
|
172
|
+
// The following fast path may or may not be beneficial.
|
|
173
|
+
/*if(mask == 0) {
|
|
174
|
+
// We only have three-byte code units. Use fast path.
|
|
175
|
+
const uint8x16_t shuffle = {2,3,1,6,7,5,10,11,9,14,15,13,0,0,0,0};
|
|
176
|
+
const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle);
|
|
177
|
+
const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle);
|
|
178
|
+
vst1q_u8(utf8_output, utf8_0);
|
|
179
|
+
utf8_output += 12;
|
|
180
|
+
vst1q_u8(utf8_output, utf8_1);
|
|
181
|
+
utf8_output += 12;
|
|
182
|
+
buf += 8;
|
|
183
|
+
continue;
|
|
184
|
+
}*/
|
|
185
|
+
const uint8_t mask0 = uint8_t(mask);
|
|
186
|
+
const uint8_t *row0 =
|
|
187
|
+
&simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0];
|
|
188
|
+
const uint8x16_t shuffle0 = vld1q_u8(row0 + 1);
|
|
189
|
+
const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle0);
|
|
190
|
+
|
|
191
|
+
const uint8_t mask1 = static_cast<uint8_t>(mask >> 8);
|
|
192
|
+
const uint8_t *row1 =
|
|
193
|
+
&simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0];
|
|
194
|
+
const uint8x16_t shuffle1 = vld1q_u8(row1 + 1);
|
|
195
|
+
const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle1);
|
|
196
|
+
|
|
197
|
+
vst1q_u8(utf8_output, utf8_0);
|
|
198
|
+
utf8_output += row0[0];
|
|
199
|
+
vst1q_u8(utf8_output, utf8_1);
|
|
200
|
+
utf8_output += row1[0];
|
|
201
|
+
|
|
202
|
+
buf += 8;
|
|
203
|
+
}
|
|
204
|
+
// At least one 32-bit word will produce a surrogate pair in UTF-16 <=>
|
|
205
|
+
// will produce four UTF-8 bytes.
|
|
206
|
+
} else {
|
|
207
|
+
// Let us do a scalar fallback.
|
|
208
|
+
// It may seem wasteful to use scalar code, but being efficient with SIMD
|
|
209
|
+
// in the presence of surrogate pairs may require non-trivial tables.
|
|
210
|
+
size_t forward = 15;
|
|
211
|
+
size_t k = 0;
|
|
212
|
+
if (size_t(end - buf) < forward + 1) {
|
|
213
|
+
forward = size_t(end - buf - 1);
|
|
214
|
+
}
|
|
215
|
+
for (; k < forward; k++) {
|
|
216
|
+
uint32_t word = buf[k];
|
|
217
|
+
if ((word & 0xFFFFFF80) == 0) {
|
|
218
|
+
*utf8_output++ = char(word);
|
|
219
|
+
} else if ((word & 0xFFFFF800) == 0) {
|
|
220
|
+
*utf8_output++ = char((word >> 6) | 0b11000000);
|
|
221
|
+
*utf8_output++ = char((word & 0b111111) | 0b10000000);
|
|
222
|
+
} else if ((word & 0xFFFF0000) == 0) {
|
|
223
|
+
if (word >= 0xD800 && word <= 0xDFFF) {
|
|
224
|
+
return std::make_pair(nullptr,
|
|
225
|
+
reinterpret_cast<char *>(utf8_output));
|
|
226
|
+
}
|
|
227
|
+
*utf8_output++ = char((word >> 12) | 0b11100000);
|
|
228
|
+
*utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000);
|
|
229
|
+
*utf8_output++ = char((word & 0b111111) | 0b10000000);
|
|
230
|
+
} else {
|
|
231
|
+
if (word > 0x10FFFF) {
|
|
232
|
+
return std::make_pair(nullptr,
|
|
233
|
+
reinterpret_cast<char *>(utf8_output));
|
|
234
|
+
}
|
|
235
|
+
*utf8_output++ = char((word >> 18) | 0b11110000);
|
|
236
|
+
*utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000);
|
|
237
|
+
*utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000);
|
|
238
|
+
*utf8_output++ = char((word & 0b111111) | 0b10000000);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
buf += k;
|
|
242
|
+
}
|
|
243
|
+
} // while
|
|
244
|
+
|
|
245
|
+
// check for invalid input
|
|
246
|
+
if (vmaxvq_u16(forbidden_bytemask) != 0) {
|
|
247
|
+
return std::make_pair(nullptr, reinterpret_cast<char *>(utf8_output));
|
|
248
|
+
}
|
|
249
|
+
return std::make_pair(buf, reinterpret_cast<char *>(utf8_output));
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
std::pair<result, char *>
|
|
253
|
+
arm_convert_utf32_to_utf8_with_errors(const char32_t *buf, size_t len,
|
|
254
|
+
char *utf8_out) {
|
|
255
|
+
uint8_t *utf8_output = reinterpret_cast<uint8_t *>(utf8_out);
|
|
256
|
+
const char32_t *start = buf;
|
|
257
|
+
const char32_t *end = buf + len;
|
|
258
|
+
|
|
259
|
+
const uint16x8_t v_c080 = vmovq_n_u16((uint16_t)0xc080);
|
|
260
|
+
const size_t safety_margin =
|
|
261
|
+
12; // to avoid overruns, see issue
|
|
262
|
+
// https://github.com/simdutf/simdutf/issues/92
|
|
263
|
+
|
|
264
|
+
while (buf + 16 + safety_margin < end) {
|
|
265
|
+
uint32x4_t in = vld1q_u32(reinterpret_cast<const uint32_t *>(buf));
|
|
266
|
+
uint32x4_t nextin = vld1q_u32(reinterpret_cast<const uint32_t *>(buf + 4));
|
|
267
|
+
|
|
268
|
+
// Check if no bits set above 16th
|
|
269
|
+
if (vmaxvq_u32(vorrq_u32(in, nextin)) <= 0xFFFF) {
|
|
270
|
+
// Pack UTF-32 to UTF-16 safely (without surrogate pairs)
|
|
271
|
+
// Apply UTF-16 => UTF-8 routine (arm_convert_utf16_to_utf8.cpp)
|
|
272
|
+
uint16x8_t utf16_packed = vcombine_u16(vmovn_u32(in), vmovn_u32(nextin));
|
|
273
|
+
if (vmaxvq_u16(utf16_packed) <= 0x7F) { // ASCII fast path!!!!
|
|
274
|
+
// 1. pack the bytes
|
|
275
|
+
// obviously suboptimal.
|
|
276
|
+
uint8x8_t utf8_packed = vmovn_u16(utf16_packed);
|
|
277
|
+
// 2. store (8 bytes)
|
|
278
|
+
vst1_u8(utf8_output, utf8_packed);
|
|
279
|
+
// 3. adjust pointers
|
|
280
|
+
buf += 8;
|
|
281
|
+
utf8_output += 8;
|
|
282
|
+
continue; // we are done for this round!
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
if (vmaxvq_u16(utf16_packed) <= 0x7FF) {
|
|
286
|
+
// 1. prepare 2-byte values
|
|
287
|
+
// input 16-bit word : [0000|0aaa|aabb|bbbb] x 8
|
|
288
|
+
// expected output : [110a|aaaa|10bb|bbbb] x 8
|
|
289
|
+
const uint16x8_t v_1f00 = vmovq_n_u16((int16_t)0x1f00);
|
|
290
|
+
const uint16x8_t v_003f = vmovq_n_u16((int16_t)0x003f);
|
|
291
|
+
|
|
292
|
+
// t0 = [000a|aaaa|bbbb|bb00]
|
|
293
|
+
const uint16x8_t t0 = vshlq_n_u16(utf16_packed, 2);
|
|
294
|
+
// t1 = [000a|aaaa|0000|0000]
|
|
295
|
+
const uint16x8_t t1 = vandq_u16(t0, v_1f00);
|
|
296
|
+
// t2 = [0000|0000|00bb|bbbb]
|
|
297
|
+
const uint16x8_t t2 = vandq_u16(utf16_packed, v_003f);
|
|
298
|
+
// t3 = [000a|aaaa|00bb|bbbb]
|
|
299
|
+
const uint16x8_t t3 = vorrq_u16(t1, t2);
|
|
300
|
+
// t4 = [110a|aaaa|10bb|bbbb]
|
|
301
|
+
const uint16x8_t t4 = vorrq_u16(t3, v_c080);
|
|
302
|
+
// 2. merge ASCII and 2-byte codewords
|
|
303
|
+
const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F);
|
|
304
|
+
const uint16x8_t one_byte_bytemask = vcleq_u16(utf16_packed, v_007f);
|
|
305
|
+
const uint8x16_t utf8_unpacked = vreinterpretq_u8_u16(
|
|
306
|
+
vbslq_u16(one_byte_bytemask, utf16_packed, t4));
|
|
307
|
+
// 3. prepare bitmask for 8-bit lookup
|
|
308
|
+
#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
|
|
309
|
+
const uint16x8_t mask = simdutf_make_uint16x8_t(
|
|
310
|
+
0x0001, 0x0004, 0x0010, 0x0040, 0x0002, 0x0008, 0x0020, 0x0080);
|
|
311
|
+
#else
|
|
312
|
+
const uint16x8_t mask = {0x0001, 0x0004, 0x0010, 0x0040,
|
|
313
|
+
0x0002, 0x0008, 0x0020, 0x0080};
|
|
314
|
+
#endif
|
|
315
|
+
uint16_t m2 = vaddvq_u16(vandq_u16(one_byte_bytemask, mask));
|
|
316
|
+
// 4. pack the bytes
|
|
317
|
+
const uint8_t *row =
|
|
318
|
+
&simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[m2][0];
|
|
319
|
+
const uint8x16_t shuffle = vld1q_u8(row + 1);
|
|
320
|
+
const uint8x16_t utf8_packed = vqtbl1q_u8(utf8_unpacked, shuffle);
|
|
321
|
+
|
|
322
|
+
// 5. store bytes
|
|
323
|
+
vst1q_u8(utf8_output, utf8_packed);
|
|
324
|
+
|
|
325
|
+
// 6. adjust pointers
|
|
326
|
+
buf += 8;
|
|
327
|
+
utf8_output += row[0];
|
|
328
|
+
continue;
|
|
329
|
+
} else {
|
|
330
|
+
// case: code units from register produce either 1, 2 or 3 UTF-8 bytes
|
|
331
|
+
|
|
332
|
+
// check for invalid input
|
|
333
|
+
const uint16x8_t v_d800 = vmovq_n_u16((uint16_t)0xd800);
|
|
334
|
+
const uint16x8_t v_dfff = vmovq_n_u16((uint16_t)0xdfff);
|
|
335
|
+
const uint16x8_t forbidden_bytemask = vandq_u16(
|
|
336
|
+
vcleq_u16(utf16_packed, v_dfff), vcgeq_u16(utf16_packed, v_d800));
|
|
337
|
+
if (vmaxvq_u16(forbidden_bytemask) != 0) {
|
|
338
|
+
return std::make_pair(result(error_code::SURROGATE, buf - start),
|
|
339
|
+
reinterpret_cast<char *>(utf8_output));
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
|
|
343
|
+
const uint16x8_t dup_even = simdutf_make_uint16x8_t(
|
|
344
|
+
0x0000, 0x0202, 0x0404, 0x0606, 0x0808, 0x0a0a, 0x0c0c, 0x0e0e);
|
|
345
|
+
#else
|
|
346
|
+
const uint16x8_t dup_even = {0x0000, 0x0202, 0x0404, 0x0606,
|
|
347
|
+
0x0808, 0x0a0a, 0x0c0c, 0x0e0e};
|
|
348
|
+
#endif
|
|
349
|
+
/* In this branch we handle three cases:
|
|
350
|
+
1. [0000|0000|0ccc|cccc] => [0ccc|cccc] -
|
|
351
|
+
single UFT-8 byte
|
|
352
|
+
2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] -
|
|
353
|
+
two UTF-8 bytes
|
|
354
|
+
3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] -
|
|
355
|
+
three UTF-8 bytes
|
|
356
|
+
|
|
357
|
+
We expand the input word (16-bit) into two code units (32-bit), thus
|
|
358
|
+
we have room for four bytes. However, we need five distinct bit
|
|
359
|
+
layouts. Note that the last byte in cases #2 and #3 is the same.
|
|
360
|
+
|
|
361
|
+
We precompute byte 1 for case #1 and the common byte for cases #2 & #3
|
|
362
|
+
in register t2.
|
|
363
|
+
|
|
364
|
+
We precompute byte 1 for case #3 and -- **conditionally** --
|
|
365
|
+
precompute either byte 1 for case #2 or byte 2 for case #3. Note that
|
|
366
|
+
they differ by exactly one bit.
|
|
367
|
+
|
|
368
|
+
Finally from these two code units we build proper UTF-8 sequence,
|
|
369
|
+
taking into account the case (i.e, the number of bytes to write).
|
|
370
|
+
*/
|
|
371
|
+
/**
|
|
372
|
+
* Given [aaaa|bbbb|bbcc|cccc] our goal is to produce:
|
|
373
|
+
* t2 => [0ccc|cccc] [10cc|cccc]
|
|
374
|
+
* s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb])
|
|
375
|
+
*/
|
|
376
|
+
#define simdutf_vec(x) vmovq_n_u16(static_cast<uint16_t>(x))
|
|
377
|
+
// [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc]
|
|
378
|
+
const uint16x8_t t0 =
|
|
379
|
+
vreinterpretq_u16_u8(vqtbl1q_u8(vreinterpretq_u8_u16(utf16_packed),
|
|
380
|
+
vreinterpretq_u8_u16(dup_even)));
|
|
381
|
+
// [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc]
|
|
382
|
+
const uint16x8_t t1 = vandq_u16(t0, simdutf_vec(0b0011111101111111));
|
|
383
|
+
// [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc]
|
|
384
|
+
const uint16x8_t t2 = vorrq_u16(t1, simdutf_vec(0b1000000000000000));
|
|
385
|
+
|
|
386
|
+
// s0: [aaaa|bbbb|bbcc|cccc] => [0000|0000|0000|aaaa]
|
|
387
|
+
const uint16x8_t s0 = vshrq_n_u16(utf16_packed, 12);
|
|
388
|
+
// s1: [aaaa|bbbb|bbcc|cccc] => [0000|bbbb|bb00|0000]
|
|
389
|
+
const uint16x8_t s1 =
|
|
390
|
+
vandq_u16(utf16_packed, simdutf_vec(0b0000111111000000));
|
|
391
|
+
// [0000|bbbb|bb00|0000] => [00bb|bbbb|0000|0000]
|
|
392
|
+
const uint16x8_t s1s = vshlq_n_u16(s1, 2);
|
|
393
|
+
// [00bb|bbbb|0000|aaaa]
|
|
394
|
+
const uint16x8_t s2 = vorrq_u16(s0, s1s);
|
|
395
|
+
// s3: [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa]
|
|
396
|
+
const uint16x8_t s3 = vorrq_u16(s2, simdutf_vec(0b1100000011100000));
|
|
397
|
+
const uint16x8_t v_07ff = vmovq_n_u16((uint16_t)0x07FF);
|
|
398
|
+
const uint16x8_t one_or_two_bytes_bytemask =
|
|
399
|
+
vcleq_u16(utf16_packed, v_07ff);
|
|
400
|
+
const uint16x8_t m0 = vbicq_u16(simdutf_vec(0b0100000000000000),
|
|
401
|
+
one_or_two_bytes_bytemask);
|
|
402
|
+
const uint16x8_t s4 = veorq_u16(s3, m0);
|
|
403
|
+
#undef simdutf_vec
|
|
404
|
+
|
|
405
|
+
// 4. expand code units 16-bit => 32-bit
|
|
406
|
+
const uint8x16_t out0 = vreinterpretq_u8_u16(vzip1q_u16(t2, s4));
|
|
407
|
+
const uint8x16_t out1 = vreinterpretq_u8_u16(vzip2q_u16(t2, s4));
|
|
408
|
+
|
|
409
|
+
// 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle
|
|
410
|
+
const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F);
|
|
411
|
+
const uint16x8_t one_byte_bytemask = vcleq_u16(utf16_packed, v_007f);
|
|
412
|
+
#ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
|
|
413
|
+
const uint16x8_t onemask = simdutf_make_uint16x8_t(
|
|
414
|
+
0x0001, 0x0004, 0x0010, 0x0040, 0x0100, 0x0400, 0x1000, 0x4000);
|
|
415
|
+
const uint16x8_t twomask = simdutf_make_uint16x8_t(
|
|
416
|
+
0x0002, 0x0008, 0x0020, 0x0080, 0x0200, 0x0800, 0x2000, 0x8000);
|
|
417
|
+
#else
|
|
418
|
+
const uint16x8_t onemask = {0x0001, 0x0004, 0x0010, 0x0040,
|
|
419
|
+
0x0100, 0x0400, 0x1000, 0x4000};
|
|
420
|
+
const uint16x8_t twomask = {0x0002, 0x0008, 0x0020, 0x0080,
|
|
421
|
+
0x0200, 0x0800, 0x2000, 0x8000};
|
|
422
|
+
#endif
|
|
423
|
+
const uint16x8_t combined =
|
|
424
|
+
vorrq_u16(vandq_u16(one_byte_bytemask, onemask),
|
|
425
|
+
vandq_u16(one_or_two_bytes_bytemask, twomask));
|
|
426
|
+
const uint16_t mask = vaddvq_u16(combined);
|
|
427
|
+
// The following fast path may or may not be beneficial.
|
|
428
|
+
/*if(mask == 0) {
|
|
429
|
+
// We only have three-byte code units. Use fast path.
|
|
430
|
+
const uint8x16_t shuffle = {2,3,1,6,7,5,10,11,9,14,15,13,0,0,0,0};
|
|
431
|
+
const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle);
|
|
432
|
+
const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle);
|
|
433
|
+
vst1q_u8(utf8_output, utf8_0);
|
|
434
|
+
utf8_output += 12;
|
|
435
|
+
vst1q_u8(utf8_output, utf8_1);
|
|
436
|
+
utf8_output += 12;
|
|
437
|
+
buf += 8;
|
|
438
|
+
continue;
|
|
439
|
+
}*/
|
|
440
|
+
const uint8_t mask0 = uint8_t(mask);
|
|
441
|
+
|
|
442
|
+
const uint8_t *row0 =
|
|
443
|
+
&simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0];
|
|
444
|
+
const uint8x16_t shuffle0 = vld1q_u8(row0 + 1);
|
|
445
|
+
const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle0);
|
|
446
|
+
|
|
447
|
+
const uint8_t mask1 = static_cast<uint8_t>(mask >> 8);
|
|
448
|
+
const uint8_t *row1 =
|
|
449
|
+
&simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0];
|
|
450
|
+
const uint8x16_t shuffle1 = vld1q_u8(row1 + 1);
|
|
451
|
+
const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle1);
|
|
452
|
+
|
|
453
|
+
vst1q_u8(utf8_output, utf8_0);
|
|
454
|
+
utf8_output += row0[0];
|
|
455
|
+
vst1q_u8(utf8_output, utf8_1);
|
|
456
|
+
utf8_output += row1[0];
|
|
457
|
+
|
|
458
|
+
buf += 8;
|
|
459
|
+
}
|
|
460
|
+
// At least one 32-bit word will produce a surrogate pair in UTF-16 <=>
|
|
461
|
+
// will produce four UTF-8 bytes.
|
|
462
|
+
} else {
|
|
463
|
+
// Let us do a scalar fallback.
|
|
464
|
+
// It may seem wasteful to use scalar code, but being efficient with SIMD
|
|
465
|
+
// in the presence of surrogate pairs may require non-trivial tables.
|
|
466
|
+
size_t forward = 15;
|
|
467
|
+
size_t k = 0;
|
|
468
|
+
if (size_t(end - buf) < forward + 1) {
|
|
469
|
+
forward = size_t(end - buf - 1);
|
|
470
|
+
}
|
|
471
|
+
for (; k < forward; k++) {
|
|
472
|
+
uint32_t word = buf[k];
|
|
473
|
+
if ((word & 0xFFFFFF80) == 0) {
|
|
474
|
+
*utf8_output++ = char(word);
|
|
475
|
+
} else if ((word & 0xFFFFF800) == 0) {
|
|
476
|
+
*utf8_output++ = char((word >> 6) | 0b11000000);
|
|
477
|
+
*utf8_output++ = char((word & 0b111111) | 0b10000000);
|
|
478
|
+
} else if ((word & 0xFFFF0000) == 0) {
|
|
479
|
+
if (word >= 0xD800 && word <= 0xDFFF) {
|
|
480
|
+
return std::make_pair(
|
|
481
|
+
result(error_code::SURROGATE, buf - start + k),
|
|
482
|
+
reinterpret_cast<char *>(utf8_output));
|
|
483
|
+
}
|
|
484
|
+
*utf8_output++ = char((word >> 12) | 0b11100000);
|
|
485
|
+
*utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000);
|
|
486
|
+
*utf8_output++ = char((word & 0b111111) | 0b10000000);
|
|
487
|
+
} else {
|
|
488
|
+
if (word > 0x10FFFF) {
|
|
489
|
+
return std::make_pair(
|
|
490
|
+
result(error_code::TOO_LARGE, buf - start + k),
|
|
491
|
+
reinterpret_cast<char *>(utf8_output));
|
|
492
|
+
}
|
|
493
|
+
*utf8_output++ = char((word >> 18) | 0b11110000);
|
|
494
|
+
*utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000);
|
|
495
|
+
*utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000);
|
|
496
|
+
*utf8_output++ = char((word & 0b111111) | 0b10000000);
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
buf += k;
|
|
500
|
+
}
|
|
501
|
+
} // while
|
|
502
|
+
|
|
503
|
+
return std::make_pair(result(error_code::SUCCESS, buf - start),
|
|
504
|
+
reinterpret_cast<char *>(utf8_output));
|
|
505
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
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
|
+
size_t convert_masked_utf8_to_latin1(const char *input,
|
|
6
|
+
uint64_t utf8_end_of_code_point_mask,
|
|
7
|
+
char *&latin1_output) {
|
|
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
|
+
uint8x16_t in = vld1q_u8(reinterpret_cast<const uint8_t *>(input));
|
|
13
|
+
const uint16_t input_utf8_end_of_code_point_mask =
|
|
14
|
+
utf8_end_of_code_point_mask & 0xfff;
|
|
15
|
+
//
|
|
16
|
+
// Optimization note: our main path below is load-latency dependent. Thus it
|
|
17
|
+
// is maybe beneficial to have fast paths that depend on branch prediction but
|
|
18
|
+
// have less latency. This results in more instructions but, potentially, also
|
|
19
|
+
// higher speeds.
|
|
20
|
+
|
|
21
|
+
// We first try a few fast paths.
|
|
22
|
+
// The obvious first test is ASCII, which actually consumes the full 16.
|
|
23
|
+
if (utf8_end_of_code_point_mask == 0xfff) {
|
|
24
|
+
// We process in chunks of 12 bytes
|
|
25
|
+
vst1q_u8(reinterpret_cast<uint8_t *>(latin1_output), in);
|
|
26
|
+
latin1_output += 12; // We wrote 12 18-bit characters.
|
|
27
|
+
return 12; // We consumed 12 bytes.
|
|
28
|
+
}
|
|
29
|
+
/// We do not have a fast path available, or the fast path is unimportant, so
|
|
30
|
+
/// we fallback.
|
|
31
|
+
const uint8_t idx = simdutf::tables::utf8_to_utf16::utf8bigindex
|
|
32
|
+
[input_utf8_end_of_code_point_mask][0];
|
|
33
|
+
|
|
34
|
+
const uint8_t consumed = simdutf::tables::utf8_to_utf16::utf8bigindex
|
|
35
|
+
[input_utf8_end_of_code_point_mask][1];
|
|
36
|
+
// this indicates an invalid input:
|
|
37
|
+
if (idx >= 64) {
|
|
38
|
+
return consumed;
|
|
39
|
+
}
|
|
40
|
+
// Here we should have (idx < 64), if not, there is a bug in the validation or
|
|
41
|
+
// elsewhere. SIX (6) input code-code units this is a relatively easy scenario
|
|
42
|
+
// we process SIX (6) input code-code units. The max length in bytes of six
|
|
43
|
+
// code code units spanning between 1 and 2 bytes each is 12 bytes. Converts 6
|
|
44
|
+
// 1-2 byte UTF-8 characters to 6 UTF-16 characters. This is a relatively easy
|
|
45
|
+
// scenario we process SIX (6) input code-code units. The max length in bytes
|
|
46
|
+
// of six code code units spanning between 1 and 2 bytes each is 12 bytes.
|
|
47
|
+
uint8x16_t sh = vld1q_u8(reinterpret_cast<const uint8_t *>(
|
|
48
|
+
simdutf::tables::utf8_to_utf16::shufutf8[idx]));
|
|
49
|
+
// Shuffle
|
|
50
|
+
// 1 byte: 00000000 0bbbbbbb
|
|
51
|
+
// 2 byte: 110aaaaa 10bbbbbb
|
|
52
|
+
uint16x8_t perm = vreinterpretq_u16_u8(vqtbl1q_u8(in, sh));
|
|
53
|
+
// Mask
|
|
54
|
+
// 1 byte: 00000000 0bbbbbbb
|
|
55
|
+
// 2 byte: 00000000 00bbbbbb
|
|
56
|
+
uint16x8_t ascii = vandq_u16(perm, vmovq_n_u16(0x7f)); // 6 or 7 bits
|
|
57
|
+
// 1 byte: 00000000 00000000
|
|
58
|
+
// 2 byte: 000aaaaa 00000000
|
|
59
|
+
uint16x8_t highbyte = vandq_u16(perm, vmovq_n_u16(0x1f00)); // 5 bits
|
|
60
|
+
// Combine with a shift right accumulate
|
|
61
|
+
// 1 byte: 00000000 0bbbbbbb
|
|
62
|
+
// 2 byte: 00000aaa aabbbbbb
|
|
63
|
+
uint16x8_t composed = vsraq_n_u16(ascii, highbyte, 2);
|
|
64
|
+
// writing 8 bytes even though we only care about the first 6 bytes.
|
|
65
|
+
uint8x8_t latin1_packed = vmovn_u16(composed);
|
|
66
|
+
vst1_u8(reinterpret_cast<uint8_t *>(latin1_output), latin1_packed);
|
|
67
|
+
latin1_output += 6; // We wrote 6 bytes.
|
|
68
|
+
return consumed;
|
|
69
|
+
}
|