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,421 @@
|
|
|
1
|
+
#ifndef SIMDUTF_LSX_SIMD_H
|
|
2
|
+
#define SIMDUTF_LSX_SIMD_H
|
|
3
|
+
|
|
4
|
+
#include "simdutf.h"
|
|
5
|
+
#include "simdutf/lsx/bitmanipulation.h"
|
|
6
|
+
|
|
7
|
+
namespace simdutf {
|
|
8
|
+
namespace SIMDUTF_IMPLEMENTATION {
|
|
9
|
+
namespace {
|
|
10
|
+
namespace simd {
|
|
11
|
+
|
|
12
|
+
template <typename T> struct simd8;
|
|
13
|
+
|
|
14
|
+
//
|
|
15
|
+
// Base class of simd8<uint8_t> and simd8<bool>, both of which use __m128i
|
|
16
|
+
// internally.
|
|
17
|
+
//
|
|
18
|
+
template <typename T, typename Mask = simd8<bool>> struct base_u8 {
|
|
19
|
+
__m128i value;
|
|
20
|
+
static const int SIZE = sizeof(value);
|
|
21
|
+
|
|
22
|
+
// Conversion from/to SIMD register
|
|
23
|
+
simdutf_really_inline base_u8(const __m128i _value) : value(_value) {}
|
|
24
|
+
simdutf_really_inline operator const __m128i &() const { return this->value; }
|
|
25
|
+
simdutf_really_inline operator __m128i &() { return this->value; }
|
|
26
|
+
|
|
27
|
+
// Bit operations
|
|
28
|
+
simdutf_really_inline simd8<T> operator|(const simd8<T> other) const {
|
|
29
|
+
return __lsx_vor_v(this->value, other);
|
|
30
|
+
}
|
|
31
|
+
simdutf_really_inline simd8<T> operator&(const simd8<T> other) const {
|
|
32
|
+
return __lsx_vand_v(this->value, other);
|
|
33
|
+
}
|
|
34
|
+
simdutf_really_inline simd8<T> operator^(const simd8<T> other) const {
|
|
35
|
+
return __lsx_vxor_v(this->value, other);
|
|
36
|
+
}
|
|
37
|
+
simdutf_really_inline simd8<T> operator~() const { return *this ^ 0xFFu; }
|
|
38
|
+
simdutf_really_inline simd8<T> &operator|=(const simd8<T> other) {
|
|
39
|
+
auto this_cast = static_cast<simd8<T> *>(this);
|
|
40
|
+
*this_cast = *this_cast | other;
|
|
41
|
+
return *this_cast;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
friend simdutf_really_inline Mask operator==(const simd8<T> lhs,
|
|
45
|
+
const simd8<T> rhs) {
|
|
46
|
+
return __lsx_vseq_b(lhs, rhs);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
template <int N = 1>
|
|
50
|
+
simdutf_really_inline simd8<T> prev(const simd8<T> prev_chunk) const {
|
|
51
|
+
return __lsx_vor_v(__lsx_vbsll_v(this->value, N),
|
|
52
|
+
__lsx_vbsrl_v(prev_chunk.value, 16 - N));
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
// SIMD byte mask type (returned by things like eq and gt)
|
|
57
|
+
template <> struct simd8<bool> : base_u8<bool> {
|
|
58
|
+
typedef uint16_t bitmask_t;
|
|
59
|
+
typedef uint32_t bitmask2_t;
|
|
60
|
+
|
|
61
|
+
static simdutf_really_inline simd8<bool> splat(bool _value) {
|
|
62
|
+
return __lsx_vreplgr2vr_b(uint8_t(-(!!_value)));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
simdutf_really_inline simd8(const __m128i _value) : base_u8<bool>(_value) {}
|
|
66
|
+
// False constructor
|
|
67
|
+
simdutf_really_inline simd8() : simd8(__lsx_vldi(0)) {}
|
|
68
|
+
// Splat constructor
|
|
69
|
+
simdutf_really_inline simd8(bool _value) : simd8(splat(_value)) {}
|
|
70
|
+
simdutf_really_inline void store(uint8_t dst[16]) const {
|
|
71
|
+
return __lsx_vst(this->value, dst, 0);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
simdutf_really_inline uint32_t to_bitmask() const {
|
|
75
|
+
return __lsx_vpickve2gr_wu(__lsx_vmsknz_b(*this), 0);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
// Unsigned bytes
|
|
80
|
+
template <> struct simd8<uint8_t> : base_u8<uint8_t> {
|
|
81
|
+
static simdutf_really_inline simd8<uint8_t> splat(uint8_t _value) {
|
|
82
|
+
return __lsx_vreplgr2vr_b(_value);
|
|
83
|
+
}
|
|
84
|
+
static simdutf_really_inline simd8<uint8_t> zero() { return __lsx_vldi(0); }
|
|
85
|
+
static simdutf_really_inline simd8<uint8_t> load(const uint8_t *values) {
|
|
86
|
+
return __lsx_vld(values, 0);
|
|
87
|
+
}
|
|
88
|
+
simdutf_really_inline simd8(const __m128i _value)
|
|
89
|
+
: base_u8<uint8_t>(_value) {}
|
|
90
|
+
// Zero constructor
|
|
91
|
+
simdutf_really_inline simd8() : simd8(zero()) {}
|
|
92
|
+
// Array constructor
|
|
93
|
+
simdutf_really_inline simd8(const uint8_t values[16]) : simd8(load(values)) {}
|
|
94
|
+
// Splat constructor
|
|
95
|
+
simdutf_really_inline simd8(uint8_t _value) : simd8(splat(_value)) {}
|
|
96
|
+
// Member-by-member initialization
|
|
97
|
+
simdutf_really_inline
|
|
98
|
+
simd8(uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4, uint8_t v5,
|
|
99
|
+
uint8_t v6, uint8_t v7, uint8_t v8, uint8_t v9, uint8_t v10,
|
|
100
|
+
uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14, uint8_t v15)
|
|
101
|
+
: simd8((__m128i)v16u8{v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
|
|
102
|
+
v12, v13, v14, v15}) {}
|
|
103
|
+
|
|
104
|
+
// Repeat 16 values as many times as necessary (usually for lookup tables)
|
|
105
|
+
simdutf_really_inline static simd8<uint8_t>
|
|
106
|
+
repeat_16(uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4,
|
|
107
|
+
uint8_t v5, uint8_t v6, uint8_t v7, uint8_t v8, uint8_t v9,
|
|
108
|
+
uint8_t v10, uint8_t v11, uint8_t v12, uint8_t v13, uint8_t v14,
|
|
109
|
+
uint8_t v15) {
|
|
110
|
+
return simd8<uint8_t>(v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
|
|
111
|
+
v13, v14, v15);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Store to array
|
|
115
|
+
simdutf_really_inline void store(uint8_t dst[16]) const {
|
|
116
|
+
return __lsx_vst(this->value, dst, 0);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Order-specific operations
|
|
120
|
+
simdutf_really_inline simd8<bool>
|
|
121
|
+
operator>=(const simd8<uint8_t> other) const {
|
|
122
|
+
return __lsx_vsle_bu(other, *this);
|
|
123
|
+
}
|
|
124
|
+
simdutf_really_inline simd8<bool>
|
|
125
|
+
operator>(const simd8<uint8_t> other) const {
|
|
126
|
+
return __lsx_vslt_bu(other, *this);
|
|
127
|
+
}
|
|
128
|
+
simdutf_really_inline simd8 &operator-=(const simd8<uint8_t> other) {
|
|
129
|
+
value = __lsx_vsub_b(value, other.value);
|
|
130
|
+
return *this;
|
|
131
|
+
}
|
|
132
|
+
// Same as >, but instead of guaranteeing all 1's == true, false = 0 and true
|
|
133
|
+
// = nonzero. For ARM, returns all 1's.
|
|
134
|
+
simdutf_really_inline simd8<uint8_t>
|
|
135
|
+
gt_bits(const simd8<uint8_t> other) const {
|
|
136
|
+
return simd8<uint8_t>(*this > other);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Bit-specific operations
|
|
140
|
+
simdutf_really_inline simd8<bool> any_bits_set(simd8<uint8_t> bits) const {
|
|
141
|
+
return __lsx_vslt_bu(__lsx_vldi(0), __lsx_vand_v(this->value, bits));
|
|
142
|
+
}
|
|
143
|
+
simdutf_really_inline bool is_ascii() const {
|
|
144
|
+
return __lsx_vpickve2gr_hu(__lsx_vmskgez_b(this->value), 0) == 0xFFFF;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
simdutf_really_inline bool any_bits_set_anywhere() const {
|
|
148
|
+
return __lsx_vpickve2gr_hu(__lsx_vmsknz_b(this->value), 0) > 0;
|
|
149
|
+
}
|
|
150
|
+
template <int N> simdutf_really_inline simd8<uint8_t> shr() const {
|
|
151
|
+
return __lsx_vsrli_b(this->value, N);
|
|
152
|
+
}
|
|
153
|
+
template <int N> simdutf_really_inline simd8<uint8_t> shl() const {
|
|
154
|
+
return __lsx_vslli_b(this->value, N);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Perform a lookup assuming the value is between 0 and 16 (undefined behavior
|
|
158
|
+
// for out of range values)
|
|
159
|
+
template <typename L>
|
|
160
|
+
simdutf_really_inline simd8<L> lookup_16(simd8<L> lookup_table) const {
|
|
161
|
+
return lookup_table.apply_lookup_16_to(*this);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
template <typename L>
|
|
165
|
+
simdutf_really_inline simd8<L>
|
|
166
|
+
lookup_16(L replace0, L replace1, L replace2, L replace3, L replace4,
|
|
167
|
+
L replace5, L replace6, L replace7, L replace8, L replace9,
|
|
168
|
+
L replace10, L replace11, L replace12, L replace13, L replace14,
|
|
169
|
+
L replace15) const {
|
|
170
|
+
return lookup_16(simd8<L>::repeat_16(
|
|
171
|
+
replace0, replace1, replace2, replace3, replace4, replace5, replace6,
|
|
172
|
+
replace7, replace8, replace9, replace10, replace11, replace12,
|
|
173
|
+
replace13, replace14, replace15));
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
template <typename T>
|
|
177
|
+
simdutf_really_inline simd8<uint8_t>
|
|
178
|
+
apply_lookup_16_to(const simd8<T> original) const {
|
|
179
|
+
__m128i original_tmp = __lsx_vand_v(original, __lsx_vldi(0x1f));
|
|
180
|
+
return __lsx_vshuf_b(__lsx_vldi(0), *this, simd8<uint8_t>(original_tmp));
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
simdutf_really_inline uint64_t sum_bytes() const {
|
|
184
|
+
const auto sum_u16 = __lsx_vhaddw_hu_bu(value, value);
|
|
185
|
+
const auto sum_u32 = __lsx_vhaddw_wu_hu(sum_u16, sum_u16);
|
|
186
|
+
const auto sum_u64 = __lsx_vhaddw_du_wu(sum_u32, sum_u32);
|
|
187
|
+
|
|
188
|
+
return uint64_t(__lsx_vpickve2gr_du(sum_u64, 0)) +
|
|
189
|
+
uint64_t(__lsx_vpickve2gr_du(sum_u64, 1));
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
// Signed bytes
|
|
194
|
+
template <> struct simd8<int8_t> {
|
|
195
|
+
__m128i value;
|
|
196
|
+
|
|
197
|
+
static const int SIZE = sizeof(value);
|
|
198
|
+
|
|
199
|
+
static simdutf_really_inline simd8<int8_t> splat(int8_t _value) {
|
|
200
|
+
return __lsx_vreplgr2vr_b(_value);
|
|
201
|
+
}
|
|
202
|
+
static simdutf_really_inline simd8<int8_t> zero() { return __lsx_vldi(0); }
|
|
203
|
+
static simdutf_really_inline simd8<int8_t> load(const int8_t values[16]) {
|
|
204
|
+
return __lsx_vld(values, 0);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
template <endianness big_endian>
|
|
208
|
+
simdutf_really_inline void store_ascii_as_utf16(char16_t *p) const {
|
|
209
|
+
__m128i zero = __lsx_vldi(0);
|
|
210
|
+
if simdutf_constexpr (match_system(big_endian)) {
|
|
211
|
+
__lsx_vst(__lsx_vilvl_b(zero, (__m128i)this->value),
|
|
212
|
+
reinterpret_cast<uint16_t *>(p), 0);
|
|
213
|
+
__lsx_vst(__lsx_vilvh_b(zero, (__m128i)this->value),
|
|
214
|
+
reinterpret_cast<uint16_t *>(p + 8), 0);
|
|
215
|
+
} else {
|
|
216
|
+
__lsx_vst(__lsx_vilvl_b((__m128i)this->value, zero),
|
|
217
|
+
reinterpret_cast<uint16_t *>(p), 0);
|
|
218
|
+
__lsx_vst(__lsx_vilvh_b((__m128i)this->value, zero),
|
|
219
|
+
reinterpret_cast<uint16_t *>(p + 8), 0);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
simdutf_really_inline void store_ascii_as_utf32(char32_t *p) const {
|
|
224
|
+
__m128i zero = __lsx_vldi(0);
|
|
225
|
+
__m128i in16low = __lsx_vilvl_b(zero, (__m128i)this->value);
|
|
226
|
+
__m128i in16high = __lsx_vilvh_b(zero, (__m128i)this->value);
|
|
227
|
+
__m128i in32_0 = __lsx_vilvl_h(zero, in16low);
|
|
228
|
+
__m128i in32_1 = __lsx_vilvh_h(zero, in16low);
|
|
229
|
+
__m128i in32_2 = __lsx_vilvl_h(zero, in16high);
|
|
230
|
+
__m128i in32_3 = __lsx_vilvh_h(zero, in16high);
|
|
231
|
+
__lsx_vst(in32_0, reinterpret_cast<uint32_t *>(p), 0);
|
|
232
|
+
__lsx_vst(in32_1, reinterpret_cast<uint32_t *>(p + 4), 0);
|
|
233
|
+
__lsx_vst(in32_2, reinterpret_cast<uint32_t *>(p + 8), 0);
|
|
234
|
+
__lsx_vst(in32_3, reinterpret_cast<uint32_t *>(p + 12), 0);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// In places where the table can be reused, which is most uses in simdutf, it
|
|
238
|
+
// is worth it to do 4 table lookups, as there is no direct zero extension
|
|
239
|
+
// from u8 to u32.
|
|
240
|
+
simdutf_really_inline void store_ascii_as_utf32_tbl(char32_t *p) const {
|
|
241
|
+
const simd8<uint8_t> tb1{0, 255, 255, 255, 1, 255, 255, 255,
|
|
242
|
+
2, 255, 255, 255, 3, 255, 255, 255};
|
|
243
|
+
const simd8<uint8_t> tb2{4, 255, 255, 255, 5, 255, 255, 255,
|
|
244
|
+
6, 255, 255, 255, 7, 255, 255, 255};
|
|
245
|
+
const simd8<uint8_t> tb3{8, 255, 255, 255, 9, 255, 255, 255,
|
|
246
|
+
10, 255, 255, 255, 11, 255, 255, 255};
|
|
247
|
+
const simd8<uint8_t> tb4{12, 255, 255, 255, 13, 255, 255, 255,
|
|
248
|
+
14, 255, 255, 255, 15, 255, 255, 255};
|
|
249
|
+
|
|
250
|
+
// encourage store pairing and interleaving
|
|
251
|
+
const auto shuf1 = this->apply_lookup_16_to(tb1);
|
|
252
|
+
const auto shuf2 = this->apply_lookup_16_to(tb2);
|
|
253
|
+
shuf1.store(reinterpret_cast<int8_t *>(p));
|
|
254
|
+
shuf2.store(reinterpret_cast<int8_t *>(p + 4));
|
|
255
|
+
|
|
256
|
+
const auto shuf3 = this->apply_lookup_16_to(tb3);
|
|
257
|
+
const auto shuf4 = this->apply_lookup_16_to(tb4);
|
|
258
|
+
shuf3.store(reinterpret_cast<int8_t *>(p + 8));
|
|
259
|
+
shuf4.store(reinterpret_cast<int8_t *>(p + 12));
|
|
260
|
+
}
|
|
261
|
+
// Conversion from/to SIMD register
|
|
262
|
+
simdutf_really_inline simd8(const __m128i _value) : value(_value) {}
|
|
263
|
+
|
|
264
|
+
// Zero constructor
|
|
265
|
+
simdutf_really_inline simd8() : simd8(zero()) {}
|
|
266
|
+
// Splat constructor
|
|
267
|
+
simdutf_really_inline simd8(int8_t _value) : simd8(splat(_value)) {}
|
|
268
|
+
// Array constructor
|
|
269
|
+
simdutf_really_inline simd8(const int8_t *values) : simd8(load(values)) {}
|
|
270
|
+
|
|
271
|
+
// Store to array
|
|
272
|
+
simdutf_really_inline void store(int8_t dst[16]) const {
|
|
273
|
+
return __lsx_vst(value, dst, 0);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
simdutf_really_inline operator simd8<uint8_t>() const {
|
|
277
|
+
return ((__m128i)this->value);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
simdutf_really_inline simd8<int8_t>
|
|
281
|
+
operator|(const simd8<int8_t> other) const {
|
|
282
|
+
return __lsx_vor_v((__m128i)value, (__m128i)other.value);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
simdutf_really_inline bool is_ascii() const {
|
|
286
|
+
return (__lsx_vpickve2gr_hu(__lsx_vmskgez_b((__m128i)this->value), 0) ==
|
|
287
|
+
0xffff);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// Order-sensitive comparisons
|
|
291
|
+
simdutf_really_inline simd8<bool> operator>(const simd8<int8_t> other) const {
|
|
292
|
+
return __lsx_vslt_b((__m128i)other.value, (__m128i)value);
|
|
293
|
+
}
|
|
294
|
+
simdutf_really_inline simd8<bool> operator<(const simd8<int8_t> other) const {
|
|
295
|
+
return __lsx_vslt_b((__m128i)value, (__m128i)other.value);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
template <int N = 1>
|
|
299
|
+
simdutf_really_inline simd8<int8_t>
|
|
300
|
+
prev(const simd8<int8_t> prev_chunk) const {
|
|
301
|
+
return __lsx_vor_v(__lsx_vbsll_v(this->value, N),
|
|
302
|
+
__lsx_vbsrl_v(prev_chunk.value, 16 - N));
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
template <typename T>
|
|
306
|
+
simdutf_really_inline simd8<int8_t>
|
|
307
|
+
apply_lookup_16_to(const simd8<T> original) const {
|
|
308
|
+
__m128i original_tmp = __lsx_vand_v(original, __lsx_vldi(0x1f));
|
|
309
|
+
return __lsx_vshuf_b(__lsx_vldi(0), (__m128i)this->value,
|
|
310
|
+
simd8<uint8_t>(original_tmp));
|
|
311
|
+
}
|
|
312
|
+
};
|
|
313
|
+
|
|
314
|
+
template <typename T> struct simd8x64 {
|
|
315
|
+
static constexpr int NUM_CHUNKS = 64 / sizeof(simd8<T>);
|
|
316
|
+
static_assert(
|
|
317
|
+
NUM_CHUNKS == 4,
|
|
318
|
+
"LoongArch kernel should use four registers per 64-byte block.");
|
|
319
|
+
simd8<T> chunks[NUM_CHUNKS];
|
|
320
|
+
|
|
321
|
+
simd8x64(const simd8x64<T> &o) = delete; // no copy allowed
|
|
322
|
+
simd8x64<T> &
|
|
323
|
+
operator=(const simd8<T> other) = delete; // no assignment allowed
|
|
324
|
+
simd8x64() = delete; // no default constructor allowed
|
|
325
|
+
|
|
326
|
+
simdutf_really_inline simd8x64(const simd8<T> chunk0, const simd8<T> chunk1,
|
|
327
|
+
const simd8<T> chunk2, const simd8<T> chunk3)
|
|
328
|
+
: chunks{chunk0, chunk1, chunk2, chunk3} {}
|
|
329
|
+
simdutf_really_inline simd8x64(const T *ptr)
|
|
330
|
+
: chunks{simd8<T>::load(ptr),
|
|
331
|
+
simd8<T>::load(ptr + sizeof(simd8<T>) / sizeof(T)),
|
|
332
|
+
simd8<T>::load(ptr + 2 * sizeof(simd8<T>) / sizeof(T)),
|
|
333
|
+
simd8<T>::load(ptr + 3 * sizeof(simd8<T>) / sizeof(T))} {}
|
|
334
|
+
|
|
335
|
+
simdutf_really_inline void store(T *ptr) const {
|
|
336
|
+
this->chunks[0].store(ptr + sizeof(simd8<T>) * 0 / sizeof(T));
|
|
337
|
+
this->chunks[1].store(ptr + sizeof(simd8<T>) * 1 / sizeof(T));
|
|
338
|
+
this->chunks[2].store(ptr + sizeof(simd8<T>) * 2 / sizeof(T));
|
|
339
|
+
this->chunks[3].store(ptr + sizeof(simd8<T>) * 3 / sizeof(T));
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
simdutf_really_inline simd8x64<T> &operator|=(const simd8x64<T> &other) {
|
|
343
|
+
this->chunks[0] |= other.chunks[0];
|
|
344
|
+
this->chunks[1] |= other.chunks[1];
|
|
345
|
+
this->chunks[2] |= other.chunks[2];
|
|
346
|
+
this->chunks[3] |= other.chunks[3];
|
|
347
|
+
return *this;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
simdutf_really_inline simd8<T> reduce_or() const {
|
|
351
|
+
return (this->chunks[0] | this->chunks[1]) |
|
|
352
|
+
(this->chunks[2] | this->chunks[3]);
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
simdutf_really_inline bool is_ascii() const { return reduce_or().is_ascii(); }
|
|
356
|
+
|
|
357
|
+
template <endianness endian>
|
|
358
|
+
simdutf_really_inline void store_ascii_as_utf16(char16_t *ptr) const {
|
|
359
|
+
this->chunks[0].template store_ascii_as_utf16<endian>(ptr +
|
|
360
|
+
sizeof(simd8<T>) * 0);
|
|
361
|
+
this->chunks[1].template store_ascii_as_utf16<endian>(ptr +
|
|
362
|
+
sizeof(simd8<T>) * 1);
|
|
363
|
+
this->chunks[2].template store_ascii_as_utf16<endian>(ptr +
|
|
364
|
+
sizeof(simd8<T>) * 2);
|
|
365
|
+
this->chunks[3].template store_ascii_as_utf16<endian>(ptr +
|
|
366
|
+
sizeof(simd8<T>) * 3);
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
simdutf_really_inline void store_ascii_as_utf32(char32_t *ptr) const {
|
|
370
|
+
this->chunks[0].store_ascii_as_utf32_tbl(ptr + sizeof(simd8<T>) * 0);
|
|
371
|
+
this->chunks[1].store_ascii_as_utf32_tbl(ptr + sizeof(simd8<T>) * 1);
|
|
372
|
+
this->chunks[2].store_ascii_as_utf32_tbl(ptr + sizeof(simd8<T>) * 2);
|
|
373
|
+
this->chunks[3].store_ascii_as_utf32_tbl(ptr + sizeof(simd8<T>) * 3);
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
simdutf_really_inline uint64_t to_bitmask() const {
|
|
377
|
+
__m128i mask = __lsx_vbsll_v(__lsx_vmsknz_b(this->chunks[3]), 6);
|
|
378
|
+
mask = __lsx_vor_v(mask, __lsx_vbsll_v(__lsx_vmsknz_b(this->chunks[2]), 4));
|
|
379
|
+
mask = __lsx_vor_v(mask, __lsx_vbsll_v(__lsx_vmsknz_b(this->chunks[1]), 2));
|
|
380
|
+
mask = __lsx_vor_v(mask, __lsx_vmsknz_b(this->chunks[0]));
|
|
381
|
+
return __lsx_vpickve2gr_du(mask, 0);
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
simdutf_really_inline uint64_t lt(const T m) const {
|
|
385
|
+
const simd8<T> mask = simd8<T>::splat(m);
|
|
386
|
+
return simd8x64<bool>(this->chunks[0] < mask, this->chunks[1] < mask,
|
|
387
|
+
this->chunks[2] < mask, this->chunks[3] < mask)
|
|
388
|
+
.to_bitmask();
|
|
389
|
+
}
|
|
390
|
+
simdutf_really_inline uint64_t gt(const T m) const {
|
|
391
|
+
const simd8<T> mask = simd8<T>::splat(m);
|
|
392
|
+
return simd8x64<bool>(this->chunks[0] > mask, this->chunks[1] > mask,
|
|
393
|
+
this->chunks[2] > mask, this->chunks[3] > mask)
|
|
394
|
+
.to_bitmask();
|
|
395
|
+
}
|
|
396
|
+
simdutf_really_inline uint64_t gteq(const T m) const {
|
|
397
|
+
const simd8<T> mask = simd8<T>::splat(m);
|
|
398
|
+
return simd8x64<bool>(this->chunks[0] >= mask, this->chunks[1] >= mask,
|
|
399
|
+
this->chunks[2] >= mask, this->chunks[3] >= mask)
|
|
400
|
+
.to_bitmask();
|
|
401
|
+
}
|
|
402
|
+
simdutf_really_inline uint64_t gteq_unsigned(const uint8_t m) const {
|
|
403
|
+
const simd8<uint8_t> mask = simd8<uint8_t>::splat(m);
|
|
404
|
+
return simd8x64<bool>(simd8<uint8_t>(this->chunks[0].value) >= mask,
|
|
405
|
+
simd8<uint8_t>(this->chunks[1].value) >= mask,
|
|
406
|
+
simd8<uint8_t>(this->chunks[2].value) >= mask,
|
|
407
|
+
simd8<uint8_t>(this->chunks[3].value) >= mask)
|
|
408
|
+
.to_bitmask();
|
|
409
|
+
}
|
|
410
|
+
}; // struct simd8x64<T>
|
|
411
|
+
|
|
412
|
+
#include "simdutf/lsx/simd16-inl.h"
|
|
413
|
+
#include "simdutf/lsx/simd32-inl.h"
|
|
414
|
+
#include "simdutf/lsx/simd64-inl.h"
|
|
415
|
+
|
|
416
|
+
} // namespace simd
|
|
417
|
+
} // unnamed namespace
|
|
418
|
+
} // namespace SIMDUTF_IMPLEMENTATION
|
|
419
|
+
} // namespace simdutf
|
|
420
|
+
|
|
421
|
+
#endif // SIMDUTF_LSX_SIMD_H
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
template <typename T> struct simd16;
|
|
2
|
+
|
|
3
|
+
template <typename T, typename Mask = simd16<bool>> struct base_u16 {
|
|
4
|
+
__m128i value;
|
|
5
|
+
static const size_t SIZE = sizeof(value);
|
|
6
|
+
static const size_t ELEMENTS = sizeof(value) / sizeof(T);
|
|
7
|
+
|
|
8
|
+
// Conversion from/to SIMD register
|
|
9
|
+
simdutf_really_inline base_u16() = default;
|
|
10
|
+
simdutf_really_inline base_u16(const __m128i _value) : value(_value) {}
|
|
11
|
+
// Bit operations
|
|
12
|
+
simdutf_really_inline simd16<T> operator|(const simd16<T> other) const {
|
|
13
|
+
return __lsx_vor_v(this->value, other.value);
|
|
14
|
+
}
|
|
15
|
+
simdutf_really_inline simd16<T> operator&(const simd16<T> other) const {
|
|
16
|
+
return __lsx_vand_v(this->value, other.value);
|
|
17
|
+
}
|
|
18
|
+
simdutf_really_inline simd16<T> operator~() const {
|
|
19
|
+
return __lsx_vxori_b(this->value, 0xFF);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
friend simdutf_really_inline Mask operator==(const simd16<T> lhs,
|
|
23
|
+
const simd16<T> rhs) {
|
|
24
|
+
return __lsx_vseq_h(lhs.value, rhs.value);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
template <unsigned N>
|
|
28
|
+
simdutf_really_inline simd16<T> byte_right_shift() const {
|
|
29
|
+
return __lsx_vbsrl_v(this->value, N);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
simdutf_really_inline uint16_t first() const {
|
|
33
|
+
return uint16_t(__lsx_vpickve2gr_w(value, 0));
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
template <typename T, typename Mask = simd16<bool>>
|
|
38
|
+
struct base16 : base_u16<T> {
|
|
39
|
+
using bitmask_type = uint16_t;
|
|
40
|
+
|
|
41
|
+
simdutf_really_inline base16() : base_u16<T>() {}
|
|
42
|
+
simdutf_really_inline base16(const __m128i _value) : base_u16<T>(_value) {}
|
|
43
|
+
template <typename Pointer>
|
|
44
|
+
simdutf_really_inline base16(const Pointer *ptr)
|
|
45
|
+
: base16(__lsx_vld(ptr, 0)) {}
|
|
46
|
+
|
|
47
|
+
static const int SIZE = sizeof(base_u16<T>::value);
|
|
48
|
+
|
|
49
|
+
template <unsigned N = 1>
|
|
50
|
+
simdutf_really_inline simd16<T> prev(const simd16<T> prev_chunk) const {
|
|
51
|
+
return __lsx_vor_v(__lsx_vbsll_v(*this, N * 2),
|
|
52
|
+
__lsx_vbsrl_v(prev_chunk, 16 - N * 2));
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
// SIMD byte mask type (returned by things like eq and gt)
|
|
57
|
+
template <> struct simd16<bool> : base16<bool> {
|
|
58
|
+
static simdutf_really_inline simd16<bool> splat(bool _value) {
|
|
59
|
+
return __lsx_vreplgr2vr_h(uint16_t(-(!!_value)));
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
simdutf_really_inline simd16() : base16() {}
|
|
63
|
+
simdutf_really_inline simd16(const __m128i _value) : base16<bool>(_value) {}
|
|
64
|
+
|
|
65
|
+
simdutf_really_inline bitmask_type to_bitmask() const {
|
|
66
|
+
__m128i mask = __lsx_vmsknz_b(this->value);
|
|
67
|
+
bitmask_type mask0 = bitmask_type(__lsx_vpickve2gr_wu(mask, 0));
|
|
68
|
+
return mask0;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
simdutf_really_inline bool is_zero() const { return __lsx_bz_v(this->value); }
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
template <typename T> struct base16_numeric : base16<T> {
|
|
75
|
+
static simdutf_really_inline simd16<T> splat(T _value) {
|
|
76
|
+
return __lsx_vreplgr2vr_h(_value);
|
|
77
|
+
}
|
|
78
|
+
static simdutf_really_inline simd16<T> zero() { return __lsx_vldi(0); }
|
|
79
|
+
|
|
80
|
+
template <typename Pointer>
|
|
81
|
+
static simdutf_really_inline simd16<T> load(const Pointer values) {
|
|
82
|
+
return __lsx_vld(values, 0);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
simdutf_really_inline base16_numeric(const __m128i _value)
|
|
86
|
+
: base16<T>(_value) {}
|
|
87
|
+
|
|
88
|
+
// Store to array
|
|
89
|
+
simdutf_really_inline void store(T dst[8]) const {
|
|
90
|
+
return __lsx_vst(this->value, dst, 0);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Override to distinguish from bool version
|
|
94
|
+
simdutf_really_inline simd16<T> operator~() const {
|
|
95
|
+
return __lsx_vxori_b(this->value, 0xFF);
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
// Unsigned code unitstemplate<>
|
|
100
|
+
template <> struct simd16<uint16_t> : base16_numeric<uint16_t> {
|
|
101
|
+
simdutf_really_inline simd16(const __m128i _value)
|
|
102
|
+
: base16_numeric<uint16_t>((__m128i)_value) {}
|
|
103
|
+
|
|
104
|
+
// Splat constructor
|
|
105
|
+
simdutf_really_inline simd16(uint16_t _value) : simd16(splat(_value)) {}
|
|
106
|
+
|
|
107
|
+
// Array constructor
|
|
108
|
+
simdutf_really_inline simd16(const uint16_t *values) : simd16(load(values)) {}
|
|
109
|
+
simdutf_really_inline simd16(const char16_t *values)
|
|
110
|
+
: simd16(load(reinterpret_cast<const uint16_t *>(values))) {}
|
|
111
|
+
|
|
112
|
+
// Copy constructor
|
|
113
|
+
simdutf_really_inline simd16(const simd16<bool> mask) : simd16(mask.value) {}
|
|
114
|
+
|
|
115
|
+
// Order-specific operations
|
|
116
|
+
simdutf_really_inline simd16 &operator+=(const simd16 other) {
|
|
117
|
+
value = __lsx_vadd_h(value, other.value);
|
|
118
|
+
return *this;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
template <unsigned N>
|
|
122
|
+
static simdutf_really_inline simd8<uint8_t>
|
|
123
|
+
pack_shifted_right(const simd16<uint16_t> &v0, const simd16<uint16_t> &v1) {
|
|
124
|
+
return __lsx_vssrlni_bu_h(v1.value, v0.value, N);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Pack with the unsigned saturation of two uint16_t code units into single
|
|
128
|
+
// uint8_t vector
|
|
129
|
+
static simdutf_really_inline simd8<uint8_t> pack(const simd16<uint16_t> &v0,
|
|
130
|
+
const simd16<uint16_t> &v1) {
|
|
131
|
+
return pack_shifted_right<0>(v0, v1);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Change the endianness
|
|
135
|
+
simdutf_really_inline simd16<uint16_t> swap_bytes() const {
|
|
136
|
+
return __lsx_vshuf4i_b(this->value, 0b10110001);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
simdutf_really_inline uint64_t sum() const {
|
|
140
|
+
const auto sum_u32 = __lsx_vhaddw_wu_hu(value, value);
|
|
141
|
+
const auto sum_u64 = __lsx_vhaddw_du_wu(sum_u32, sum_u32);
|
|
142
|
+
|
|
143
|
+
return uint64_t(__lsx_vpickve2gr_du(sum_u64, 0)) +
|
|
144
|
+
uint64_t(__lsx_vpickve2gr_du(sum_u64, 1));
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
simdutf_really_inline simd16<bool> operator<(const simd16<uint16_t> a,
|
|
149
|
+
const simd16<uint16_t> b) {
|
|
150
|
+
return __lsx_vslt_hu(a.value, b.value);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
simdutf_really_inline simd16<bool> operator>(const simd16<uint16_t> a,
|
|
154
|
+
const simd16<uint16_t> b) {
|
|
155
|
+
return __lsx_vslt_hu(b.value, a.value);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
simdutf_really_inline simd16<bool> operator<=(const simd16<uint16_t> a,
|
|
159
|
+
const simd16<uint16_t> b) {
|
|
160
|
+
return __lsx_vsle_hu(a.value, b.value);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
simdutf_really_inline simd16<bool> operator>=(const simd16<uint16_t> a,
|
|
164
|
+
const simd16<uint16_t> b) {
|
|
165
|
+
return __lsx_vsle_hu(b.value, a.value);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
template <typename T> struct simd16x32 {
|
|
169
|
+
static constexpr int NUM_CHUNKS = 64 / sizeof(simd16<T>);
|
|
170
|
+
static_assert(
|
|
171
|
+
NUM_CHUNKS == 4,
|
|
172
|
+
"LOONGARCH kernel should use four registers per 64-byte block.");
|
|
173
|
+
simd16<T> chunks[NUM_CHUNKS];
|
|
174
|
+
|
|
175
|
+
simd16x32(const simd16x32<T> &o) = delete; // no copy allowed
|
|
176
|
+
simd16x32<T> &
|
|
177
|
+
operator=(const simd16<T> other) = delete; // no assignment allowed
|
|
178
|
+
simd16x32() = delete; // no default constructor allowed
|
|
179
|
+
|
|
180
|
+
simdutf_really_inline
|
|
181
|
+
simd16x32(const simd16<T> chunk0, const simd16<T> chunk1,
|
|
182
|
+
const simd16<T> chunk2, const simd16<T> chunk3)
|
|
183
|
+
: chunks{chunk0, chunk1, chunk2, chunk3} {}
|
|
184
|
+
simdutf_really_inline simd16x32(const T *ptr)
|
|
185
|
+
: chunks{simd16<T>::load(ptr),
|
|
186
|
+
simd16<T>::load(ptr + sizeof(simd16<T>) / sizeof(T)),
|
|
187
|
+
simd16<T>::load(ptr + 2 * sizeof(simd16<T>) / sizeof(T)),
|
|
188
|
+
simd16<T>::load(ptr + 3 * sizeof(simd16<T>) / sizeof(T))} {}
|
|
189
|
+
|
|
190
|
+
simdutf_really_inline void store(T *ptr) const {
|
|
191
|
+
this->chunks[0].store(ptr + sizeof(simd16<T>) * 0 / sizeof(T));
|
|
192
|
+
this->chunks[1].store(ptr + sizeof(simd16<T>) * 1 / sizeof(T));
|
|
193
|
+
this->chunks[2].store(ptr + sizeof(simd16<T>) * 2 / sizeof(T));
|
|
194
|
+
this->chunks[3].store(ptr + sizeof(simd16<T>) * 3 / sizeof(T));
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
simdutf_really_inline void swap_bytes() {
|
|
198
|
+
this->chunks[0] = this->chunks[0].swap_bytes();
|
|
199
|
+
this->chunks[1] = this->chunks[1].swap_bytes();
|
|
200
|
+
this->chunks[2] = this->chunks[2].swap_bytes();
|
|
201
|
+
this->chunks[3] = this->chunks[3].swap_bytes();
|
|
202
|
+
}
|
|
203
|
+
simdutf_really_inline uint64_t to_bitmask() const {
|
|
204
|
+
uint64_t r0 = uint32_t(this->chunks[0].to_bitmask());
|
|
205
|
+
uint64_t r1 = this->chunks[1].to_bitmask();
|
|
206
|
+
uint64_t r2 = this->chunks[2].to_bitmask();
|
|
207
|
+
uint64_t r3 = this->chunks[3].to_bitmask();
|
|
208
|
+
return r0 | (r1 << 16) | (r2 << 32) | (r3 << 48);
|
|
209
|
+
}
|
|
210
|
+
simdutf_really_inline uint64_t gteq(const T m) const {
|
|
211
|
+
const simd16<T> mask = simd16<T>::splat(m);
|
|
212
|
+
return simd16x32<bool>(this->chunks[0] >= mask, this->chunks[1] >= mask,
|
|
213
|
+
this->chunks[2] >= mask, this->chunks[3] >= mask)
|
|
214
|
+
.to_bitmask();
|
|
215
|
+
}
|
|
216
|
+
simdutf_really_inline uint64_t lteq(const T m) const {
|
|
217
|
+
const simd16<T> mask = simd16<T>::splat(m);
|
|
218
|
+
return simd16x32<bool>(this->chunks[0] <= mask, this->chunks[1] <= mask,
|
|
219
|
+
this->chunks[2] <= mask, this->chunks[3] <= mask)
|
|
220
|
+
.to_bitmask();
|
|
221
|
+
}
|
|
222
|
+
}; // struct simd16x32<T>
|
|
223
|
+
|
|
224
|
+
simdutf_really_inline simd16<uint16_t> operator^(const simd16<uint16_t> a,
|
|
225
|
+
uint16_t b) {
|
|
226
|
+
const auto bv = __lsx_vreplgr2vr_h(b);
|
|
227
|
+
return __lsx_vxor_v(a.value, bv);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
simdutf_really_inline simd16<bool> operator^(const simd16<bool> a,
|
|
231
|
+
const simd16<bool> b) {
|
|
232
|
+
return __lsx_vxor_v(a.value, b.value);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
simdutf_really_inline simd16<uint16_t> min(const simd16<uint16_t> a,
|
|
236
|
+
const simd16<uint16_t> b) {
|
|
237
|
+
return __lsx_vmin_hu(a.value, b.value);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
simdutf_really_inline simd16<uint16_t> as_vector_u16(const simd16<bool> x) {
|
|
241
|
+
return x.value;
|
|
242
|
+
}
|