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.
Files changed (561) hide show
  1. package/QuickCrypto.podspec +12 -38
  2. package/README.md +2 -0
  3. package/android/CMakeLists.txt +3 -0
  4. package/android/build.gradle +5 -1
  5. package/cpp/argon2/HybridArgon2.cpp +10 -3
  6. package/cpp/blake3/HybridBlake3.cpp +5 -3
  7. package/cpp/cipher/CCMCipher.cpp +29 -16
  8. package/cpp/cipher/CCMCipher.hpp +2 -4
  9. package/cpp/cipher/ChaCha20Cipher.cpp +14 -18
  10. package/cpp/cipher/ChaCha20Cipher.hpp +2 -4
  11. package/cpp/cipher/ChaCha20Poly1305Cipher.cpp +34 -23
  12. package/cpp/cipher/ChaCha20Poly1305Cipher.hpp +2 -4
  13. package/cpp/cipher/GCMCipher.cpp +14 -15
  14. package/cpp/cipher/HybridCipher.cpp +39 -36
  15. package/cpp/cipher/HybridCipher.hpp +17 -1
  16. package/cpp/cipher/HybridRsaCipher.cpp +74 -29
  17. package/cpp/cipher/OCBCipher.cpp +4 -3
  18. package/cpp/cipher/XChaCha20Poly1305Cipher.cpp +14 -13
  19. package/cpp/cipher/XSalsa20Cipher.cpp +72 -6
  20. package/cpp/cipher/XSalsa20Cipher.hpp +25 -3
  21. package/cpp/cipher/XSalsa20Poly1305Cipher.cpp +21 -25
  22. package/cpp/dh/HybridDiffieHellman.cpp +29 -0
  23. package/cpp/ec/HybridEcKeyPair.cpp +35 -33
  24. package/cpp/ec/HybridEcKeyPair.hpp +3 -7
  25. package/cpp/ecdh/HybridECDH.cpp +23 -0
  26. package/cpp/ed25519/HybridEdKeyPair.cpp +73 -117
  27. package/cpp/ed25519/HybridEdKeyPair.hpp +5 -9
  28. package/cpp/hash/HybridHash.cpp +5 -7
  29. package/cpp/hkdf/HybridHkdf.cpp +6 -4
  30. package/cpp/hmac/HybridHmac.cpp +4 -6
  31. package/cpp/kmac/HybridKmac.cpp +4 -4
  32. package/cpp/mldsa/HybridMlDsaKeyPair.cpp +37 -49
  33. package/cpp/mlkem/HybridMlKemKeyPair.cpp +39 -43
  34. package/cpp/pbkdf2/HybridPbkdf2.cpp +7 -8
  35. package/cpp/rsa/HybridRsaKeyPair.cpp +5 -8
  36. package/cpp/rsa/HybridRsaKeyPair.hpp +4 -7
  37. package/cpp/scrypt/HybridScrypt.cpp +6 -4
  38. package/cpp/sign/HybridSignHandle.cpp +25 -68
  39. package/cpp/sign/HybridVerifyHandle.cpp +23 -60
  40. package/cpp/utils/HybridUtils.cpp +213 -111
  41. package/cpp/utils/HybridUtils.hpp +9 -2
  42. package/cpp/utils/QuickCryptoUtils.hpp +72 -0
  43. package/deps/simdutf/LICENSE-APACHE +201 -0
  44. package/deps/simdutf/LICENSE-MIT +18 -0
  45. package/deps/simdutf/README.md +2782 -0
  46. package/deps/simdutf/include/simdutf/avx512.h +79 -0
  47. package/deps/simdutf/include/simdutf/base64_implementation.h +158 -0
  48. package/deps/simdutf/include/simdutf/base64_tables.h +887 -0
  49. package/deps/simdutf/include/simdutf/common_defs.h +186 -0
  50. package/deps/simdutf/include/simdutf/compiler_check.h +50 -0
  51. package/deps/simdutf/include/simdutf/constexpr_ptr.h +138 -0
  52. package/deps/simdutf/include/simdutf/encoding_types.h +189 -0
  53. package/deps/simdutf/include/simdutf/error.h +126 -0
  54. package/deps/simdutf/include/simdutf/implementation.h +7081 -0
  55. package/deps/simdutf/include/simdutf/internal/isadetection.h +325 -0
  56. package/deps/simdutf/include/simdutf/portability.h +285 -0
  57. package/deps/simdutf/include/simdutf/scalar/ascii.h +86 -0
  58. package/deps/simdutf/include/simdutf/scalar/atomic_util.h +105 -0
  59. package/deps/simdutf/include/simdutf/scalar/base64.h +911 -0
  60. package/deps/simdutf/include/simdutf/scalar/latin1.h +26 -0
  61. package/deps/simdutf/include/simdutf/scalar/latin1_to_utf16/latin1_to_utf16.h +52 -0
  62. package/deps/simdutf/include/simdutf/scalar/latin1_to_utf32/latin1_to_utf32.h +27 -0
  63. package/deps/simdutf/include/simdutf/scalar/latin1_to_utf8/latin1_to_utf8.h +191 -0
  64. package/deps/simdutf/include/simdutf/scalar/swap_bytes.h +35 -0
  65. package/deps/simdutf/include/simdutf/scalar/utf16.h +226 -0
  66. package/deps/simdutf/include/simdutf/scalar/utf16_to_latin1/utf16_to_latin1.h +108 -0
  67. package/deps/simdutf/include/simdutf/scalar/utf16_to_latin1/valid_utf16_to_latin1.h +40 -0
  68. package/deps/simdutf/include/simdutf/scalar/utf16_to_utf32/utf16_to_utf32.h +86 -0
  69. package/deps/simdutf/include/simdutf/scalar/utf16_to_utf32/valid_utf16_to_utf32.h +44 -0
  70. package/deps/simdutf/include/simdutf/scalar/utf16_to_utf8/utf16_to_utf8.h +295 -0
  71. package/deps/simdutf/include/simdutf/scalar/utf16_to_utf8/valid_utf16_to_utf8.h +91 -0
  72. package/deps/simdutf/include/simdutf/scalar/utf32.h +82 -0
  73. package/deps/simdutf/include/simdutf/scalar/utf32_to_latin1/utf32_to_latin1.h +68 -0
  74. package/deps/simdutf/include/simdutf/scalar/utf32_to_latin1/valid_utf32_to_latin1.h +67 -0
  75. package/deps/simdutf/include/simdutf/scalar/utf32_to_utf16/utf32_to_utf16.h +84 -0
  76. package/deps/simdutf/include/simdutf/scalar/utf32_to_utf16/valid_utf32_to_utf16.h +44 -0
  77. package/deps/simdutf/include/simdutf/scalar/utf32_to_utf8/utf32_to_utf8.h +142 -0
  78. package/deps/simdutf/include/simdutf/scalar/utf32_to_utf8/valid_utf32_to_utf8.h +72 -0
  79. package/deps/simdutf/include/simdutf/scalar/utf8.h +326 -0
  80. package/deps/simdutf/include/simdutf/scalar/utf8_to_latin1/utf8_to_latin1.h +225 -0
  81. package/deps/simdutf/include/simdutf/scalar/utf8_to_latin1/valid_utf8_to_latin1.h +87 -0
  82. package/deps/simdutf/include/simdutf/scalar/utf8_to_utf16/utf8_to_utf16.h +342 -0
  83. package/deps/simdutf/include/simdutf/scalar/utf8_to_utf16/valid_utf8_to_utf16.h +106 -0
  84. package/deps/simdutf/include/simdutf/scalar/utf8_to_utf32/utf8_to_utf32.h +299 -0
  85. package/deps/simdutf/include/simdutf/scalar/utf8_to_utf32/valid_utf8_to_utf32.h +83 -0
  86. package/deps/simdutf/include/simdutf/simdutf_version.h +26 -0
  87. package/deps/simdutf/include/simdutf.h +26 -0
  88. package/deps/simdutf/include/simdutf_c.h +342 -0
  89. package/deps/simdutf/src/arm64/arm_base64.cpp +791 -0
  90. package/deps/simdutf/src/arm64/arm_convert_latin1_to_utf16.cpp +24 -0
  91. package/deps/simdutf/src/arm64/arm_convert_latin1_to_utf32.cpp +24 -0
  92. package/deps/simdutf/src/arm64/arm_convert_latin1_to_utf8.cpp +70 -0
  93. package/deps/simdutf/src/arm64/arm_convert_utf16_to_latin1.cpp +61 -0
  94. package/deps/simdutf/src/arm64/arm_convert_utf16_to_utf32.cpp +185 -0
  95. package/deps/simdutf/src/arm64/arm_convert_utf16_to_utf8.cpp +780 -0
  96. package/deps/simdutf/src/arm64/arm_convert_utf32_to_latin1.cpp +60 -0
  97. package/deps/simdutf/src/arm64/arm_convert_utf32_to_utf16.cpp +208 -0
  98. package/deps/simdutf/src/arm64/arm_convert_utf32_to_utf8.cpp +505 -0
  99. package/deps/simdutf/src/arm64/arm_convert_utf8_to_latin1.cpp +69 -0
  100. package/deps/simdutf/src/arm64/arm_convert_utf8_to_utf16.cpp +313 -0
  101. package/deps/simdutf/src/arm64/arm_convert_utf8_to_utf32.cpp +179 -0
  102. package/deps/simdutf/src/arm64/arm_find.cpp +199 -0
  103. package/deps/simdutf/src/arm64/arm_utf16fix.cpp +185 -0
  104. package/deps/simdutf/src/arm64/arm_validate_utf16.cpp +165 -0
  105. package/deps/simdutf/src/arm64/arm_validate_utf32le.cpp +65 -0
  106. package/deps/simdutf/src/arm64/implementation.cpp +1442 -0
  107. package/deps/simdutf/src/encoding_types.cpp +67 -0
  108. package/deps/simdutf/src/error.cpp +3 -0
  109. package/deps/simdutf/src/fallback/implementation.cpp +589 -0
  110. package/deps/simdutf/src/generic/ascii_validation.h +50 -0
  111. package/deps/simdutf/src/generic/base64.h +233 -0
  112. package/deps/simdutf/src/generic/base64lengths.h +63 -0
  113. package/deps/simdutf/src/generic/buf_block_reader.h +109 -0
  114. package/deps/simdutf/src/generic/find.h +75 -0
  115. package/deps/simdutf/src/generic/utf16/change_endianness.h +24 -0
  116. package/deps/simdutf/src/generic/utf16/count_code_points_bytemask.h +58 -0
  117. package/deps/simdutf/src/generic/utf16/to_well_formed.h +93 -0
  118. package/deps/simdutf/src/generic/utf16/utf32_length_from_utf16.h +15 -0
  119. package/deps/simdutf/src/generic/utf16/utf8_length_from_utf16.h +35 -0
  120. package/deps/simdutf/src/generic/utf16/utf8_length_from_utf16_bytemask.h +199 -0
  121. package/deps/simdutf/src/generic/utf16.h +73 -0
  122. package/deps/simdutf/src/generic/utf32.h +136 -0
  123. package/deps/simdutf/src/generic/utf8/utf16_length_from_utf8_bytemask.h +53 -0
  124. package/deps/simdutf/src/generic/utf8.h +92 -0
  125. package/deps/simdutf/src/generic/utf8_to_latin1/utf8_to_latin1.h +316 -0
  126. package/deps/simdutf/src/generic/utf8_to_latin1/valid_utf8_to_latin1.h +78 -0
  127. package/deps/simdutf/src/generic/utf8_to_utf16/utf8_to_utf16.h +332 -0
  128. package/deps/simdutf/src/generic/utf8_to_utf16/valid_utf8_to_utf16.h +74 -0
  129. package/deps/simdutf/src/generic/utf8_to_utf32/utf8_to_utf32.h +318 -0
  130. package/deps/simdutf/src/generic/utf8_to_utf32/valid_utf8_to_utf32.h +42 -0
  131. package/deps/simdutf/src/generic/utf8_validation/utf8_lookup4_algorithm.h +223 -0
  132. package/deps/simdutf/src/generic/utf8_validation/utf8_validator.h +84 -0
  133. package/deps/simdutf/src/generic/validate_utf16.h +164 -0
  134. package/deps/simdutf/src/generic/validate_utf32.h +99 -0
  135. package/deps/simdutf/src/haswell/avx2_base64.cpp +837 -0
  136. package/deps/simdutf/src/haswell/avx2_convert_latin1_to_utf16.cpp +28 -0
  137. package/deps/simdutf/src/haswell/avx2_convert_latin1_to_utf32.cpp +20 -0
  138. package/deps/simdutf/src/haswell/avx2_convert_latin1_to_utf8.cpp +83 -0
  139. package/deps/simdutf/src/haswell/avx2_convert_utf16_to_latin1.cpp +83 -0
  140. package/deps/simdutf/src/haswell/avx2_convert_utf16_to_utf32.cpp +210 -0
  141. package/deps/simdutf/src/haswell/avx2_convert_utf16_to_utf8.cpp +602 -0
  142. package/deps/simdutf/src/haswell/avx2_convert_utf32_to_latin1.cpp +116 -0
  143. package/deps/simdutf/src/haswell/avx2_convert_utf32_to_utf16.cpp +164 -0
  144. package/deps/simdutf/src/haswell/avx2_convert_utf32_to_utf8.cpp +569 -0
  145. package/deps/simdutf/src/haswell/avx2_convert_utf8_to_latin1.cpp +60 -0
  146. package/deps/simdutf/src/haswell/avx2_convert_utf8_to_utf16.cpp +195 -0
  147. package/deps/simdutf/src/haswell/avx2_convert_utf8_to_utf32.cpp +135 -0
  148. package/deps/simdutf/src/haswell/avx2_utf16fix.cpp +173 -0
  149. package/deps/simdutf/src/haswell/avx2_validate_utf16.cpp +17 -0
  150. package/deps/simdutf/src/haswell/implementation.cpp +1447 -0
  151. package/deps/simdutf/src/icelake/icelake_ascii_validation.inl.cpp +19 -0
  152. package/deps/simdutf/src/icelake/icelake_base64.inl.cpp +630 -0
  153. package/deps/simdutf/src/icelake/icelake_common.inl.cpp +37 -0
  154. package/deps/simdutf/src/icelake/icelake_convert_latin1_to_utf16.inl.cpp +36 -0
  155. package/deps/simdutf/src/icelake/icelake_convert_latin1_to_utf32.inl.cpp +23 -0
  156. package/deps/simdutf/src/icelake/icelake_convert_latin1_to_utf8.inl.cpp +107 -0
  157. package/deps/simdutf/src/icelake/icelake_convert_utf16_to_latin1.inl.cpp +103 -0
  158. package/deps/simdutf/src/icelake/icelake_convert_utf16_to_utf32.inl.cpp +136 -0
  159. package/deps/simdutf/src/icelake/icelake_convert_utf16_to_utf8.inl.cpp +206 -0
  160. package/deps/simdutf/src/icelake/icelake_convert_utf32_to_latin1.inl.cpp +74 -0
  161. package/deps/simdutf/src/icelake/icelake_convert_utf32_to_utf16.inl.cpp +338 -0
  162. package/deps/simdutf/src/icelake/icelake_convert_utf32_to_utf8.inl.cpp +574 -0
  163. package/deps/simdutf/src/icelake/icelake_convert_utf8_to_latin1.inl.cpp +104 -0
  164. package/deps/simdutf/src/icelake/icelake_convert_utf8_to_utf16.inl.cpp +75 -0
  165. package/deps/simdutf/src/icelake/icelake_convert_valid_utf8_to_latin1.inl.cpp +69 -0
  166. package/deps/simdutf/src/icelake/icelake_find.inl.cpp +146 -0
  167. package/deps/simdutf/src/icelake/icelake_from_utf8.inl.cpp +266 -0
  168. package/deps/simdutf/src/icelake/icelake_from_valid_utf8.inl.cpp +136 -0
  169. package/deps/simdutf/src/icelake/icelake_macros.inl.cpp +143 -0
  170. package/deps/simdutf/src/icelake/icelake_utf16fix.cpp +138 -0
  171. package/deps/simdutf/src/icelake/icelake_utf32_validation.inl.cpp +63 -0
  172. package/deps/simdutf/src/icelake/icelake_utf8_common.inl.cpp +753 -0
  173. package/deps/simdutf/src/icelake/icelake_utf8_length_from_utf16.inl.cpp +269 -0
  174. package/deps/simdutf/src/icelake/icelake_utf8_validation.inl.cpp +116 -0
  175. package/deps/simdutf/src/icelake/implementation.cpp +1903 -0
  176. package/deps/simdutf/src/implementation.cpp +2526 -0
  177. package/deps/simdutf/src/lasx/implementation.cpp +1531 -0
  178. package/deps/simdutf/src/lasx/lasx_base64.cpp +695 -0
  179. package/deps/simdutf/src/lasx/lasx_convert_latin1_to_utf16.cpp +76 -0
  180. package/deps/simdutf/src/lasx/lasx_convert_latin1_to_utf32.cpp +55 -0
  181. package/deps/simdutf/src/lasx/lasx_convert_latin1_to_utf8.cpp +65 -0
  182. package/deps/simdutf/src/lasx/lasx_convert_utf16_to_latin1.cpp +64 -0
  183. package/deps/simdutf/src/lasx/lasx_convert_utf16_to_utf32.cpp +183 -0
  184. package/deps/simdutf/src/lasx/lasx_convert_utf16_to_utf8.cpp +550 -0
  185. package/deps/simdutf/src/lasx/lasx_convert_utf32_to_latin1.cpp +73 -0
  186. package/deps/simdutf/src/lasx/lasx_convert_utf32_to_utf16.cpp +218 -0
  187. package/deps/simdutf/src/lasx/lasx_convert_utf32_to_utf8.cpp +589 -0
  188. package/deps/simdutf/src/lasx/lasx_convert_utf8_to_latin1.cpp +72 -0
  189. package/deps/simdutf/src/lasx/lasx_convert_utf8_to_utf16.cpp +296 -0
  190. package/deps/simdutf/src/lasx/lasx_convert_utf8_to_utf32.cpp +190 -0
  191. package/deps/simdutf/src/lasx/lasx_find.cpp +64 -0
  192. package/deps/simdutf/src/lasx/lasx_validate_utf16.cpp +13 -0
  193. package/deps/simdutf/src/lasx/lasx_validate_utf32le.cpp +84 -0
  194. package/deps/simdutf/src/lsx/implementation.cpp +1417 -0
  195. package/deps/simdutf/src/lsx/lsx_base64.cpp +675 -0
  196. package/deps/simdutf/src/lsx/lsx_convert_latin1_to_utf16.cpp +39 -0
  197. package/deps/simdutf/src/lsx/lsx_convert_latin1_to_utf32.cpp +27 -0
  198. package/deps/simdutf/src/lsx/lsx_convert_latin1_to_utf8.cpp +56 -0
  199. package/deps/simdutf/src/lsx/lsx_convert_utf16_to_latin1.cpp +64 -0
  200. package/deps/simdutf/src/lsx/lsx_convert_utf16_to_utf32.cpp +133 -0
  201. package/deps/simdutf/src/lsx/lsx_convert_utf16_to_utf8.cpp +518 -0
  202. package/deps/simdutf/src/lsx/lsx_convert_utf32_to_latin1.cpp +66 -0
  203. package/deps/simdutf/src/lsx/lsx_convert_utf32_to_utf16.cpp +155 -0
  204. package/deps/simdutf/src/lsx/lsx_convert_utf32_to_utf8.cpp +459 -0
  205. package/deps/simdutf/src/lsx/lsx_convert_utf8_to_latin1.cpp +75 -0
  206. package/deps/simdutf/src/lsx/lsx_convert_utf8_to_utf16.cpp +291 -0
  207. package/deps/simdutf/src/lsx/lsx_convert_utf8_to_utf32.cpp +179 -0
  208. package/deps/simdutf/src/lsx/lsx_find.cpp +60 -0
  209. package/deps/simdutf/src/lsx/lsx_validate_utf16.cpp +13 -0
  210. package/deps/simdutf/src/lsx/lsx_validate_utf32le.cpp +68 -0
  211. package/deps/simdutf/src/ppc64/implementation.cpp +992 -0
  212. package/deps/simdutf/src/ppc64/ppc64_base64.cpp +480 -0
  213. package/deps/simdutf/src/ppc64/ppc64_base64_internal_tests.cpp +401 -0
  214. package/deps/simdutf/src/ppc64/ppc64_convert_latin1_to_utf16.cpp +12 -0
  215. package/deps/simdutf/src/ppc64/ppc64_convert_latin1_to_utf32.cpp +12 -0
  216. package/deps/simdutf/src/ppc64/ppc64_convert_latin1_to_utf8.cpp +149 -0
  217. package/deps/simdutf/src/ppc64/ppc64_convert_utf16_to_latin1.cpp +67 -0
  218. package/deps/simdutf/src/ppc64/ppc64_convert_utf16_to_utf32.cpp +87 -0
  219. package/deps/simdutf/src/ppc64/ppc64_convert_utf16_to_utf8.cpp +296 -0
  220. package/deps/simdutf/src/ppc64/ppc64_convert_utf32_to_latin1.cpp +57 -0
  221. package/deps/simdutf/src/ppc64/ppc64_convert_utf32_to_utf16.cpp +117 -0
  222. package/deps/simdutf/src/ppc64/ppc64_convert_utf32_to_utf8.cpp +166 -0
  223. package/deps/simdutf/src/ppc64/ppc64_convert_utf8_to_latin1.cpp +69 -0
  224. package/deps/simdutf/src/ppc64/ppc64_convert_utf8_to_utf16.cpp +211 -0
  225. package/deps/simdutf/src/ppc64/ppc64_convert_utf8_to_utf32.cpp +153 -0
  226. package/deps/simdutf/src/ppc64/ppc64_utf16_to_utf8_tables.h +1011 -0
  227. package/deps/simdutf/src/ppc64/ppc64_utf8_length_from_latin1.cpp +37 -0
  228. package/deps/simdutf/src/ppc64/ppc64_validate_utf16.cpp +19 -0
  229. package/deps/simdutf/src/ppc64/templates.cpp +91 -0
  230. package/deps/simdutf/src/rvv/implementation.cpp +138 -0
  231. package/deps/simdutf/src/rvv/rvv_find.cpp +27 -0
  232. package/deps/simdutf/src/rvv/rvv_helpers.inl.cpp +23 -0
  233. package/deps/simdutf/src/rvv/rvv_latin1_to.inl.cpp +71 -0
  234. package/deps/simdutf/src/rvv/rvv_length_from.inl.cpp +164 -0
  235. package/deps/simdutf/src/rvv/rvv_utf16_to.inl.cpp +399 -0
  236. package/deps/simdutf/src/rvv/rvv_utf16fix.cpp +110 -0
  237. package/deps/simdutf/src/rvv/rvv_utf32_to.inl.cpp +307 -0
  238. package/deps/simdutf/src/rvv/rvv_utf8_to.inl.cpp +435 -0
  239. package/deps/simdutf/src/rvv/rvv_validate.inl.cpp +275 -0
  240. package/deps/simdutf/src/simdutf/arm64/begin.h +2 -0
  241. package/deps/simdutf/src/simdutf/arm64/bitmanipulation.h +34 -0
  242. package/deps/simdutf/src/simdutf/arm64/end.h +2 -0
  243. package/deps/simdutf/src/simdutf/arm64/implementation.h +307 -0
  244. package/deps/simdutf/src/simdutf/arm64/intrinsics.h +10 -0
  245. package/deps/simdutf/src/simdutf/arm64/simd.h +547 -0
  246. package/deps/simdutf/src/simdutf/arm64/simd16-inl.h +403 -0
  247. package/deps/simdutf/src/simdutf/arm64/simd32-inl.h +129 -0
  248. package/deps/simdutf/src/simdutf/arm64/simd64-inl.h +28 -0
  249. package/deps/simdutf/src/simdutf/arm64.h +43 -0
  250. package/deps/simdutf/src/simdutf/fallback/begin.h +1 -0
  251. package/deps/simdutf/src/simdutf/fallback/bitmanipulation.h +13 -0
  252. package/deps/simdutf/src/simdutf/fallback/end.h +1 -0
  253. package/deps/simdutf/src/simdutf/fallback/implementation.h +331 -0
  254. package/deps/simdutf/src/simdutf/fallback.h +42 -0
  255. package/deps/simdutf/src/simdutf/haswell/begin.h +15 -0
  256. package/deps/simdutf/src/simdutf/haswell/bitmanipulation.h +35 -0
  257. package/deps/simdutf/src/simdutf/haswell/end.h +13 -0
  258. package/deps/simdutf/src/simdutf/haswell/implementation.h +338 -0
  259. package/deps/simdutf/src/simdutf/haswell/intrinsics.h +67 -0
  260. package/deps/simdutf/src/simdutf/haswell/simd.h +363 -0
  261. package/deps/simdutf/src/simdutf/haswell/simd16-inl.h +261 -0
  262. package/deps/simdutf/src/simdutf/haswell/simd32-inl.h +111 -0
  263. package/deps/simdutf/src/simdutf/haswell/simd64-inl.h +34 -0
  264. package/deps/simdutf/src/simdutf/haswell.h +63 -0
  265. package/deps/simdutf/src/simdutf/icelake/begin.h +14 -0
  266. package/deps/simdutf/src/simdutf/icelake/bitmanipulation.h +44 -0
  267. package/deps/simdutf/src/simdutf/icelake/end.h +12 -0
  268. package/deps/simdutf/src/simdutf/icelake/implementation.h +346 -0
  269. package/deps/simdutf/src/simdutf/icelake/intrinsics.h +138 -0
  270. package/deps/simdutf/src/simdutf/icelake/simd.h +17 -0
  271. package/deps/simdutf/src/simdutf/icelake/simd16-inl.h +90 -0
  272. package/deps/simdutf/src/simdutf/icelake/simd32-inl.h +47 -0
  273. package/deps/simdutf/src/simdutf/icelake.h +81 -0
  274. package/deps/simdutf/src/simdutf/lasx/begin.h +8 -0
  275. package/deps/simdutf/src/simdutf/lasx/bitmanipulation.h +25 -0
  276. package/deps/simdutf/src/simdutf/lasx/end.h +8 -0
  277. package/deps/simdutf/src/simdutf/lasx/implementation.h +310 -0
  278. package/deps/simdutf/src/simdutf/lasx/intrinsics.h +319 -0
  279. package/deps/simdutf/src/simdutf/lasx/simd.h +551 -0
  280. package/deps/simdutf/src/simdutf/lasx/simd16-inl.h +234 -0
  281. package/deps/simdutf/src/simdutf/lasx/simd32-inl.h +74 -0
  282. package/deps/simdutf/src/simdutf/lasx/simd64-inl.h +52 -0
  283. package/deps/simdutf/src/simdutf/lasx.h +49 -0
  284. package/deps/simdutf/src/simdutf/lsx/begin.h +2 -0
  285. package/deps/simdutf/src/simdutf/lsx/bitmanipulation.h +25 -0
  286. package/deps/simdutf/src/simdutf/lsx/end.h +2 -0
  287. package/deps/simdutf/src/simdutf/lsx/implementation.h +309 -0
  288. package/deps/simdutf/src/simdutf/lsx/intrinsics.h +196 -0
  289. package/deps/simdutf/src/simdutf/lsx/simd.h +421 -0
  290. package/deps/simdutf/src/simdutf/lsx/simd16-inl.h +242 -0
  291. package/deps/simdutf/src/simdutf/lsx/simd32-inl.h +69 -0
  292. package/deps/simdutf/src/simdutf/lsx/simd64-inl.h +50 -0
  293. package/deps/simdutf/src/simdutf/lsx.h +52 -0
  294. package/deps/simdutf/src/simdutf/ppc64/begin.h +1 -0
  295. package/deps/simdutf/src/simdutf/ppc64/bitmanipulation.h +29 -0
  296. package/deps/simdutf/src/simdutf/ppc64/end.h +1 -0
  297. package/deps/simdutf/src/simdutf/ppc64/implementation.h +348 -0
  298. package/deps/simdutf/src/simdutf/ppc64/intrinsics.h +19 -0
  299. package/deps/simdutf/src/simdutf/ppc64/simd.h +177 -0
  300. package/deps/simdutf/src/simdutf/ppc64/simd16-inl.h +327 -0
  301. package/deps/simdutf/src/simdutf/ppc64/simd32-inl.h +247 -0
  302. package/deps/simdutf/src/simdutf/ppc64/simd8-inl.h +618 -0
  303. package/deps/simdutf/src/simdutf/ppc64.h +40 -0
  304. package/deps/simdutf/src/simdutf/rvv/begin.h +7 -0
  305. package/deps/simdutf/src/simdutf/rvv/end.h +7 -0
  306. package/deps/simdutf/src/simdutf/rvv/implementation.h +321 -0
  307. package/deps/simdutf/src/simdutf/rvv/intrinsics.h +131 -0
  308. package/deps/simdutf/src/simdutf/rvv.h +41 -0
  309. package/deps/simdutf/src/simdutf/westmere/begin.h +8 -0
  310. package/deps/simdutf/src/simdutf/westmere/bitmanipulation.h +37 -0
  311. package/deps/simdutf/src/simdutf/westmere/end.h +8 -0
  312. package/deps/simdutf/src/simdutf/westmere/implementation.h +338 -0
  313. package/deps/simdutf/src/simdutf/westmere/intrinsics.h +38 -0
  314. package/deps/simdutf/src/simdutf/westmere/simd.h +379 -0
  315. package/deps/simdutf/src/simdutf/westmere/simd16-inl.h +242 -0
  316. package/deps/simdutf/src/simdutf/westmere/simd32-inl.h +151 -0
  317. package/deps/simdutf/src/simdutf/westmere/simd64-inl.h +33 -0
  318. package/deps/simdutf/src/simdutf/westmere.h +59 -0
  319. package/deps/simdutf/src/simdutf.cpp +152 -0
  320. package/deps/simdutf/src/simdutf_c.cpp +525 -0
  321. package/deps/simdutf/src/tables/utf16_to_utf8_tables.h +768 -0
  322. package/deps/simdutf/src/tables/utf32_to_utf16_tables.h +53 -0
  323. package/deps/simdutf/src/tables/utf8_to_utf16_tables.h +826 -0
  324. package/deps/simdutf/src/westmere/implementation.cpp +1479 -0
  325. package/deps/simdutf/src/westmere/internal/loader.cpp +7 -0
  326. package/deps/simdutf/src/westmere/internal/write_v_u16_11bits_to_utf8.cpp +66 -0
  327. package/deps/simdutf/src/westmere/sse_base64.cpp +672 -0
  328. package/deps/simdutf/src/westmere/sse_convert_latin1_to_utf16.cpp +21 -0
  329. package/deps/simdutf/src/westmere/sse_convert_latin1_to_utf32.cpp +31 -0
  330. package/deps/simdutf/src/westmere/sse_convert_latin1_to_utf8.cpp +71 -0
  331. package/deps/simdutf/src/westmere/sse_convert_utf16_to_latin1.cpp +70 -0
  332. package/deps/simdutf/src/westmere/sse_convert_utf16_to_utf32.cpp +206 -0
  333. package/deps/simdutf/src/westmere/sse_convert_utf16_to_utf8.cpp +504 -0
  334. package/deps/simdutf/src/westmere/sse_convert_utf32_to_latin1.cpp +82 -0
  335. package/deps/simdutf/src/westmere/sse_convert_utf32_to_utf16.cpp +209 -0
  336. package/deps/simdutf/src/westmere/sse_convert_utf32_to_utf8.cpp +589 -0
  337. package/deps/simdutf/src/westmere/sse_convert_utf8_to_latin1.cpp +58 -0
  338. package/deps/simdutf/src/westmere/sse_convert_utf8_to_utf16.cpp +197 -0
  339. package/deps/simdutf/src/westmere/sse_convert_utf8_to_utf32.cpp +141 -0
  340. package/deps/simdutf/src/westmere/sse_utf16fix.cpp +82 -0
  341. package/deps/simdutf/src/westmere/sse_validate_utf16.cpp +17 -0
  342. package/lib/commonjs/argon2.js +51 -2
  343. package/lib/commonjs/argon2.js.map +1 -1
  344. package/lib/commonjs/cipher.js +109 -11
  345. package/lib/commonjs/cipher.js.map +1 -1
  346. package/lib/commonjs/dsa.js +8 -2
  347. package/lib/commonjs/dsa.js.map +1 -1
  348. package/lib/commonjs/hash.js +15 -5
  349. package/lib/commonjs/hash.js.map +1 -1
  350. package/lib/commonjs/hkdf.js +33 -6
  351. package/lib/commonjs/hkdf.js.map +1 -1
  352. package/lib/commonjs/hmac.js +15 -5
  353. package/lib/commonjs/hmac.js.map +1 -1
  354. package/lib/commonjs/keys/publicCipher.js +10 -4
  355. package/lib/commonjs/keys/publicCipher.js.map +1 -1
  356. package/lib/commonjs/random.js +11 -2
  357. package/lib/commonjs/random.js.map +1 -1
  358. package/lib/commonjs/rsa.js +12 -5
  359. package/lib/commonjs/rsa.js.map +1 -1
  360. package/lib/commonjs/scrypt.js +47 -6
  361. package/lib/commonjs/scrypt.js.map +1 -1
  362. package/lib/commonjs/subtle.js +76 -5
  363. package/lib/commonjs/subtle.js.map +1 -1
  364. package/lib/commonjs/utils/cipher.js +18 -7
  365. package/lib/commonjs/utils/cipher.js.map +1 -1
  366. package/lib/commonjs/utils/conversion.js +33 -9
  367. package/lib/commonjs/utils/conversion.js.map +1 -1
  368. package/lib/commonjs/utils/timingSafeEqual.js +7 -2
  369. package/lib/commonjs/utils/timingSafeEqual.js.map +1 -1
  370. package/lib/commonjs/x509certificate.js +6 -6
  371. package/lib/commonjs/x509certificate.js.map +1 -1
  372. package/lib/module/argon2.js +51 -2
  373. package/lib/module/argon2.js.map +1 -1
  374. package/lib/module/cipher.js +109 -11
  375. package/lib/module/cipher.js.map +1 -1
  376. package/lib/module/dsa.js +8 -2
  377. package/lib/module/dsa.js.map +1 -1
  378. package/lib/module/hash.js +15 -5
  379. package/lib/module/hash.js.map +1 -1
  380. package/lib/module/hkdf.js +33 -6
  381. package/lib/module/hkdf.js.map +1 -1
  382. package/lib/module/hmac.js +15 -5
  383. package/lib/module/hmac.js.map +1 -1
  384. package/lib/module/keys/publicCipher.js +10 -4
  385. package/lib/module/keys/publicCipher.js.map +1 -1
  386. package/lib/module/random.js +11 -2
  387. package/lib/module/random.js.map +1 -1
  388. package/lib/module/rsa.js +11 -4
  389. package/lib/module/rsa.js.map +1 -1
  390. package/lib/module/scrypt.js +47 -6
  391. package/lib/module/scrypt.js.map +1 -1
  392. package/lib/module/subtle.js +76 -5
  393. package/lib/module/subtle.js.map +1 -1
  394. package/lib/module/utils/cipher.js +18 -7
  395. package/lib/module/utils/cipher.js.map +1 -1
  396. package/lib/module/utils/conversion.js +33 -9
  397. package/lib/module/utils/conversion.js.map +1 -1
  398. package/lib/module/utils/timingSafeEqual.js +8 -3
  399. package/lib/module/utils/timingSafeEqual.js.map +1 -1
  400. package/lib/module/x509certificate.js +6 -6
  401. package/lib/module/x509certificate.js.map +1 -1
  402. package/lib/typescript/argon2.d.ts.map +1 -1
  403. package/lib/typescript/cipher.d.ts +2 -2
  404. package/lib/typescript/cipher.d.ts.map +1 -1
  405. package/lib/typescript/dsa.d.ts.map +1 -1
  406. package/lib/typescript/hash.d.ts +2 -2
  407. package/lib/typescript/hash.d.ts.map +1 -1
  408. package/lib/typescript/hkdf.d.ts.map +1 -1
  409. package/lib/typescript/hmac.d.ts +2 -2
  410. package/lib/typescript/hmac.d.ts.map +1 -1
  411. package/lib/typescript/index.d.ts +1 -1
  412. package/lib/typescript/index.d.ts.map +1 -1
  413. package/lib/typescript/keys/publicCipher.d.ts.map +1 -1
  414. package/lib/typescript/random.d.ts.map +1 -1
  415. package/lib/typescript/rsa.d.ts.map +1 -1
  416. package/lib/typescript/scrypt.d.ts.map +1 -1
  417. package/lib/typescript/specs/utils.nitro.d.ts +0 -2
  418. package/lib/typescript/specs/utils.nitro.d.ts.map +1 -1
  419. package/lib/typescript/subtle.d.ts.map +1 -1
  420. package/lib/typescript/utils/cipher.d.ts +13 -1
  421. package/lib/typescript/utils/cipher.d.ts.map +1 -1
  422. package/lib/typescript/utils/conversion.d.ts +9 -6
  423. package/lib/typescript/utils/conversion.d.ts.map +1 -1
  424. package/lib/typescript/utils/timingSafeEqual.d.ts.map +1 -1
  425. package/lib/typescript/x509certificate.d.ts.map +1 -1
  426. package/nitrogen/generated/shared/c++/HybridUtilsSpec.cpp +0 -2
  427. package/nitrogen/generated/shared/c++/HybridUtilsSpec.hpp +0 -3
  428. package/package.json +38 -6
  429. package/src/argon2.ts +80 -2
  430. package/src/cipher.ts +139 -15
  431. package/src/dsa.ts +11 -2
  432. package/src/hash.ts +17 -7
  433. package/src/hkdf.ts +44 -6
  434. package/src/hmac.ts +17 -7
  435. package/src/keys/publicCipher.ts +10 -4
  436. package/src/random.ts +11 -2
  437. package/src/rsa.ts +18 -4
  438. package/src/scrypt.ts +73 -6
  439. package/src/specs/utils.nitro.ts +0 -2
  440. package/src/subtle.ts +90 -8
  441. package/src/utils/cipher.ts +30 -8
  442. package/src/utils/conversion.ts +58 -20
  443. package/src/utils/timingSafeEqual.ts +8 -3
  444. package/src/x509certificate.ts +5 -6
  445. package/deps/blake3/.cargo/config.toml +0 -2
  446. package/deps/blake3/.git-blame-ignore-revs +0 -2
  447. package/deps/blake3/.github/workflows/build_b3sum.py +0 -38
  448. package/deps/blake3/.github/workflows/ci.yml +0 -491
  449. package/deps/blake3/.github/workflows/tag.yml +0 -43
  450. package/deps/blake3/.github/workflows/upload_github_release_asset.py +0 -73
  451. package/deps/blake3/CONTRIBUTING.md +0 -31
  452. package/deps/blake3/Cargo.toml +0 -135
  453. package/deps/blake3/b3sum/Cargo.lock +0 -513
  454. package/deps/blake3/b3sum/Cargo.toml +0 -26
  455. package/deps/blake3/b3sum/README.md +0 -72
  456. package/deps/blake3/b3sum/src/main.rs +0 -564
  457. package/deps/blake3/b3sum/src/unit_tests.rs +0 -235
  458. package/deps/blake3/b3sum/tests/cli_tests.rs +0 -680
  459. package/deps/blake3/b3sum/what_does_check_do.md +0 -176
  460. package/deps/blake3/benches/bench.rs +0 -623
  461. package/deps/blake3/build.rs +0 -389
  462. package/deps/blake3/c/CMakeLists.txt +0 -383
  463. package/deps/blake3/c/CMakePresets.json +0 -73
  464. package/deps/blake3/c/Makefile.testing +0 -82
  465. package/deps/blake3/c/blake3-config.cmake.in +0 -14
  466. package/deps/blake3/c/blake3_avx2.c +0 -326
  467. package/deps/blake3/c/blake3_avx2_x86-64_unix.S +0 -1815
  468. package/deps/blake3/c/blake3_avx2_x86-64_windows_gnu.S +0 -1817
  469. package/deps/blake3/c/blake3_avx2_x86-64_windows_msvc.asm +0 -1828
  470. package/deps/blake3/c/blake3_avx512.c +0 -1388
  471. package/deps/blake3/c/blake3_avx512_x86-64_unix.S +0 -4824
  472. package/deps/blake3/c/blake3_avx512_x86-64_windows_gnu.S +0 -2615
  473. package/deps/blake3/c/blake3_avx512_x86-64_windows_msvc.asm +0 -2634
  474. package/deps/blake3/c/blake3_c_rust_bindings/Cargo.toml +0 -32
  475. package/deps/blake3/c/blake3_c_rust_bindings/README.md +0 -4
  476. package/deps/blake3/c/blake3_c_rust_bindings/benches/bench.rs +0 -477
  477. package/deps/blake3/c/blake3_c_rust_bindings/build.rs +0 -253
  478. package/deps/blake3/c/blake3_c_rust_bindings/cross_test.sh +0 -31
  479. package/deps/blake3/c/blake3_c_rust_bindings/src/lib.rs +0 -333
  480. package/deps/blake3/c/blake3_c_rust_bindings/src/test.rs +0 -696
  481. package/deps/blake3/c/blake3_sse2.c +0 -566
  482. package/deps/blake3/c/blake3_sse2_x86-64_unix.S +0 -2291
  483. package/deps/blake3/c/blake3_sse2_x86-64_windows_gnu.S +0 -2332
  484. package/deps/blake3/c/blake3_sse2_x86-64_windows_msvc.asm +0 -2350
  485. package/deps/blake3/c/blake3_sse41.c +0 -560
  486. package/deps/blake3/c/blake3_sse41_x86-64_unix.S +0 -2028
  487. package/deps/blake3/c/blake3_sse41_x86-64_windows_gnu.S +0 -2069
  488. package/deps/blake3/c/blake3_sse41_x86-64_windows_msvc.asm +0 -2089
  489. package/deps/blake3/c/blake3_tbb.cpp +0 -37
  490. package/deps/blake3/c/dependencies/CMakeLists.txt +0 -3
  491. package/deps/blake3/c/dependencies/tbb/CMakeLists.txt +0 -28
  492. package/deps/blake3/c/example.c +0 -36
  493. package/deps/blake3/c/example_tbb.c +0 -57
  494. package/deps/blake3/c/libblake3.pc.in +0 -12
  495. package/deps/blake3/c/main.c +0 -166
  496. package/deps/blake3/c/test.py +0 -97
  497. package/deps/blake3/media/B3.svg +0 -70
  498. package/deps/blake3/media/BLAKE3.svg +0 -85
  499. package/deps/blake3/media/speed.svg +0 -1474
  500. package/deps/blake3/reference_impl/Cargo.toml +0 -8
  501. package/deps/blake3/reference_impl/README.md +0 -14
  502. package/deps/blake3/reference_impl/reference_impl.rs +0 -374
  503. package/deps/blake3/src/ffi_avx2.rs +0 -65
  504. package/deps/blake3/src/ffi_avx512.rs +0 -169
  505. package/deps/blake3/src/ffi_neon.rs +0 -82
  506. package/deps/blake3/src/ffi_sse2.rs +0 -126
  507. package/deps/blake3/src/ffi_sse41.rs +0 -126
  508. package/deps/blake3/src/guts.rs +0 -60
  509. package/deps/blake3/src/hazmat.rs +0 -704
  510. package/deps/blake3/src/io.rs +0 -64
  511. package/deps/blake3/src/join.rs +0 -92
  512. package/deps/blake3/src/lib.rs +0 -1835
  513. package/deps/blake3/src/platform.rs +0 -587
  514. package/deps/blake3/src/portable.rs +0 -198
  515. package/deps/blake3/src/rust_avx2.rs +0 -474
  516. package/deps/blake3/src/rust_sse2.rs +0 -775
  517. package/deps/blake3/src/rust_sse41.rs +0 -766
  518. package/deps/blake3/src/test.rs +0 -1049
  519. package/deps/blake3/src/traits.rs +0 -227
  520. package/deps/blake3/src/wasm32_simd.rs +0 -794
  521. package/deps/blake3/test_vectors/Cargo.toml +0 -19
  522. package/deps/blake3/test_vectors/cross_test.sh +0 -25
  523. package/deps/blake3/test_vectors/src/bin/generate.rs +0 -4
  524. package/deps/blake3/test_vectors/src/lib.rs +0 -350
  525. package/deps/blake3/test_vectors/test_vectors.json +0 -217
  526. package/deps/blake3/tools/compiler_version/Cargo.toml +0 -7
  527. package/deps/blake3/tools/compiler_version/build.rs +0 -6
  528. package/deps/blake3/tools/compiler_version/src/main.rs +0 -27
  529. package/deps/blake3/tools/instruction_set_support/Cargo.toml +0 -6
  530. package/deps/blake3/tools/instruction_set_support/src/main.rs +0 -10
  531. package/deps/blake3/tools/release.md +0 -16
  532. package/deps/ncrypto/.bazelignore +0 -4
  533. package/deps/ncrypto/.bazelrc +0 -1
  534. package/deps/ncrypto/.bazelversion +0 -1
  535. package/deps/ncrypto/.clang-format +0 -111
  536. package/deps/ncrypto/.github/workflows/bazel.yml +0 -58
  537. package/deps/ncrypto/.github/workflows/commitlint.yml +0 -16
  538. package/deps/ncrypto/.github/workflows/linter.yml +0 -38
  539. package/deps/ncrypto/.github/workflows/macos.yml +0 -43
  540. package/deps/ncrypto/.github/workflows/release-please.yml +0 -16
  541. package/deps/ncrypto/.github/workflows/ubuntu.yml +0 -128
  542. package/deps/ncrypto/.github/workflows/visual-studio.yml +0 -49
  543. package/deps/ncrypto/.python-version +0 -1
  544. package/deps/ncrypto/.release-please-manifest.json +0 -3
  545. package/deps/ncrypto/BUILD.bazel +0 -44
  546. package/deps/ncrypto/CHANGELOG.md +0 -37
  547. package/deps/ncrypto/CMakeLists.txt +0 -79
  548. package/deps/ncrypto/MODULE.bazel +0 -16
  549. package/deps/ncrypto/MODULE.bazel.lock +0 -461
  550. package/deps/ncrypto/cmake/CPM.cmake +0 -1225
  551. package/deps/ncrypto/cmake/ncrypto-flags.cmake +0 -17
  552. package/deps/ncrypto/ncrypto.pc.in +0 -10
  553. package/deps/ncrypto/patches/0001-Expose-libdecrepit-so-NodeJS-can-use-it-for-ncrypto.patch +0 -28
  554. package/deps/ncrypto/pyproject.toml +0 -38
  555. package/deps/ncrypto/release-please-config.json +0 -11
  556. package/deps/ncrypto/src/CMakeLists.txt +0 -40
  557. package/deps/ncrypto/tests/BUILD.bazel +0 -11
  558. package/deps/ncrypto/tests/CMakeLists.txt +0 -7
  559. package/deps/ncrypto/tests/basic.cpp +0 -856
  560. package/deps/ncrypto/tools/run-clang-format.sh +0 -42
  561. package/lib/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1,296 @@
1
+ // Convert up to 16 bytes from utf8 to utf16 using a mask indicating the
2
+ // end of the code points. Only the least significant 12 bits of the mask
3
+ // are accessed.
4
+ // It returns how many bytes were consumed (up to 16, usually 12).
5
+ template <endianness big_endian>
6
+ size_t convert_masked_utf8_to_utf16(const char *input,
7
+ uint64_t utf8_end_of_code_point_mask,
8
+ char16_t *&utf16_output) {
9
+ // we use an approach where we try to process up to 12 input bytes.
10
+ // Why 12 input bytes and not 16? Because we are concerned with the size of
11
+ // the lookup tables. Also 12 is nicely divisible by two and three.
12
+ //
13
+ __m128i in = __lsx_vld(reinterpret_cast<const uint8_t *>(input), 0);
14
+ const uint16_t input_utf8_end_of_code_point_mask =
15
+ utf8_end_of_code_point_mask & 0xfff;
16
+ //
17
+ // Optimization note: our main path below is load-latency dependent. Thus it
18
+ // is maybe beneficial to have fast paths that depend on branch prediction but
19
+ // have less latency. This results in more instructions but, potentially, also
20
+ // higher speeds.
21
+
22
+ // We first try a few fast paths.
23
+ // The obvious first test is ASCII, which actually consumes the full 16.
24
+ if ((utf8_end_of_code_point_mask & 0xFFFF) == 0xFFFF) {
25
+ __m128i zero = __lsx_vldi(0);
26
+ if simdutf_constexpr (match_system(big_endian)) {
27
+ __lsx_vst(__lsx_vilvl_b(zero, in),
28
+ reinterpret_cast<uint16_t *>(utf16_output), 0);
29
+ __lsx_vst(__lsx_vilvh_b(zero, in),
30
+ reinterpret_cast<uint16_t *>(utf16_output), 16);
31
+ } else {
32
+ __lsx_vst(__lsx_vilvl_b(in, zero),
33
+ reinterpret_cast<uint16_t *>(utf16_output), 0);
34
+ __lsx_vst(__lsx_vilvh_b(in, zero),
35
+ reinterpret_cast<uint16_t *>(utf16_output), 16);
36
+ }
37
+ utf16_output += 16; // We wrote 16 16-bit characters.
38
+ return 16; // We consumed 16 bytes.
39
+ }
40
+
41
+ // 3 byte sequences are the next most common, as seen in CJK, which has long
42
+ // sequences of these.
43
+ if (input_utf8_end_of_code_point_mask == 0x924) {
44
+ // We want to take 4 3-byte UTF-8 code units and turn them into 4 2-byte
45
+ // UTF-16 code units.
46
+ __m128i composed = convert_utf8_3_byte_to_utf16(in);
47
+ // Byte swap if necessary
48
+ if simdutf_constexpr (!match_system(big_endian)) {
49
+ composed = lsx_swap_bytes(composed);
50
+ }
51
+
52
+ __lsx_vst(composed, reinterpret_cast<uint16_t *>(utf16_output), 0);
53
+ utf16_output += 4; // We wrote 4 16-bit characters.
54
+ return 12; // We consumed 12 bytes.
55
+ }
56
+
57
+ // 2 byte sequences occur in short bursts in languages like Greek and Russian.
58
+ if ((utf8_end_of_code_point_mask & 0xFFFF) == 0xAAAA) {
59
+ // We want to take 6 2-byte UTF-8 code units and turn them into 6 2-byte
60
+ // UTF-16 code units.
61
+ __m128i composed = convert_utf8_2_byte_to_utf16(in);
62
+ // Byte swap if necessary
63
+ if simdutf_constexpr (!match_system(big_endian)) {
64
+ composed = lsx_swap_bytes(composed);
65
+ }
66
+
67
+ __lsx_vst(composed, reinterpret_cast<uint16_t *>(utf16_output), 0);
68
+ utf16_output += 8; // We wrote 6 16-bit characters.
69
+ return 16; // We consumed 12 bytes.
70
+ }
71
+
72
+ /// We do not have a fast path available, or the fast path is unimportant, so
73
+ /// we fallback.
74
+ const uint8_t idx = simdutf::tables::utf8_to_utf16::utf8bigindex
75
+ [input_utf8_end_of_code_point_mask][0];
76
+
77
+ const uint8_t consumed = simdutf::tables::utf8_to_utf16::utf8bigindex
78
+ [input_utf8_end_of_code_point_mask][1];
79
+ const __m128i zero = __lsx_vldi(0);
80
+ if (idx < 64) {
81
+ // SIX (6) input code-code units
82
+ // Convert to UTF-16
83
+ __m128i composed = convert_utf8_1_to_2_byte_to_utf16(in, idx);
84
+ // Byte swap if necessary
85
+ if simdutf_constexpr (!match_system(big_endian)) {
86
+ composed = lsx_swap_bytes(composed);
87
+ }
88
+ // Store
89
+ __lsx_vst(composed, reinterpret_cast<uint16_t *>(utf16_output), 0);
90
+ utf16_output += 6; // We wrote 6 16-bit characters.
91
+ return consumed;
92
+ } else if (idx < 145) {
93
+ // FOUR (4) input code-code units
94
+ // UTF-16 and UTF-32 use similar algorithms, but UTF-32 skips the narrowing.
95
+ __m128i sh = __lsx_vld(reinterpret_cast<const uint8_t *>(
96
+ simdutf::tables::utf8_to_utf16::shufutf8[idx]),
97
+ 0);
98
+ // XXX: depending on the system scalar instructions might be faster.
99
+ // 1 byte: 00000000 00000000 0ccccccc
100
+ // 2 byte: 00000000 110bbbbb 10cccccc
101
+ // 3 byte: 1110aaaa 10bbbbbb 10cccccc
102
+ sh = __lsx_vand_v(sh, __lsx_vldi(0x1f));
103
+ __m128i perm = __lsx_vshuf_b(zero, in, sh);
104
+ // 1 byte: 00000000 0ccccccc
105
+ // 2 byte: xx0bbbbb x0cccccc
106
+ // 3 byte: xxbbbbbb x0cccccc
107
+ __m128i lowperm = __lsx_vpickev_h(perm, perm);
108
+ // 1 byte: 00000000 00000000
109
+ // 2 byte: 00000000 00000000
110
+ // 3 byte: 00000000 1110aaaa
111
+ __m128i highperm = __lsx_vpickod_h(perm, perm);
112
+ // 3 byte: aaaa0000 00000000
113
+ highperm = __lsx_vslli_h(highperm, 12);
114
+ // ASCII
115
+ // 1 byte: 00000000 0ccccccc
116
+ // 2+byte: 00000000 00cccccc
117
+ __m128i ascii = __lsx_vand_v(lowperm, __lsx_vrepli_h(0x7f));
118
+ // 1 byte: 00000000 00000000
119
+ // 2 byte: xx0bbbbb 00000000
120
+ // 3 byte: xxbbbbbb 00000000
121
+ __m128i middlebyte = __lsx_vand_v(lowperm, lsx_splat_u16(0xFF00));
122
+ // 1 byte: 00000000 0ccccccc
123
+ // 2 byte: 0010bbbb bbcccccc
124
+ // 3 byte: 0010bbbb bbcccccc
125
+ __m128i composed = __lsx_vor_v(__lsx_vsrli_h(middlebyte, 2), ascii);
126
+
127
+ __m128i v0fff = __lsx_vreplgr2vr_h(uint16_t(0xfff));
128
+ // aaaabbbb bbcccccc
129
+ composed = __lsx_vbitsel_v(highperm, composed, v0fff);
130
+
131
+ if simdutf_constexpr (!match_system(big_endian)) {
132
+ composed = lsx_swap_bytes(composed);
133
+ }
134
+
135
+ __lsx_vst(composed, reinterpret_cast<uint16_t *>(utf16_output), 0);
136
+ utf16_output += 4; // We wrote 4 16-bit codepoints
137
+ return consumed;
138
+ } else if (idx < 209) {
139
+ // THREE (3) input code-code units
140
+ if (input_utf8_end_of_code_point_mask == 0x888) {
141
+ __m128i expected_mask =
142
+ (__m128i)v16u8{0xf8, 0xc0, 0xc0, 0xc0, 0xf8, 0xc0, 0xc0, 0xc0,
143
+ 0xf8, 0xc0, 0xc0, 0xc0, 0x0, 0x0, 0x0, 0x0};
144
+ __m128i expected =
145
+ (__m128i)v16u8{0xf0, 0x80, 0x80, 0x80, 0xf0, 0x80, 0x80, 0x80,
146
+ 0xf0, 0x80, 0x80, 0x80, 0x0, 0x0, 0x0, 0x0};
147
+ __m128i check = __lsx_vseq_b(__lsx_vand_v(in, expected_mask), expected);
148
+ if (__lsx_bz_b(check))
149
+ return 12;
150
+ // We want to take 3 4-byte UTF-8 code units and turn them into 3 4-byte
151
+ // UTF-16 pairs. Generating surrogate pairs is a little tricky though, but
152
+ // it is easier when we can assume they are all pairs. This version does
153
+ // not use the LUT, but 4 byte sequences are less common and the overhead
154
+ // of the extra memory access is less important than the early branch
155
+ // overhead in shorter sequences.
156
+
157
+ // Swap byte pairs
158
+ // 10dddddd 10cccccc|10bbbbbb 11110aaa
159
+ // 10cccccc 10dddddd|11110aaa 10bbbbbb
160
+ __m128i swap = lsx_swap_bytes(in);
161
+ // Shift left 2 bits
162
+ // cccccc00 dddddd00 xxxxxxxx bbbbbb00
163
+ __m128i shift = __lsx_vslli_b(swap, 2);
164
+ // Create a magic number containing the low 2 bits of the trail surrogate
165
+ // and all the corrections needed to create the pair. UTF-8 4b prefix =
166
+ // -0x0000|0xF000 surrogate offset = -0x0000|0x0040 (0x10000 << 6)
167
+ // surrogate high = +0x0000|0xD800
168
+ // surrogate low = +0xDC00|0x0000
169
+ // -------------------------------
170
+ // = +0xDC00|0xE7C0
171
+ __m128i magic = __lsx_vreplgr2vr_w(uint32_t(0xDC00E7C0));
172
+ // Generate unadjusted trail surrogate minus lowest 2 bits
173
+ // xxxxxxxx xxxxxxxx|11110aaa bbbbbb00
174
+ __m128i trail = __lsx_vbitsel_v(shift, swap, lsx_splat_u32(0x0000FF00));
175
+ // Insert low 2 bits of trail surrogate to magic number for later
176
+ // 11011100 00000000 11100111 110000cc
177
+ __m128i magic_with_low_2 = __lsx_vor_v(__lsx_vsrli_w(shift, 30), magic);
178
+
179
+ // Generate lead surrogate
180
+ // xxxxcccc ccdddddd|xxxxxxxx xxxxxxxx
181
+ // 000000cc ccdddddd|xxxxxxxx xxxxxxxx
182
+ __m128i lead = __lsx_vbitsel_v(
183
+ __lsx_vsrli_h(__lsx_vand_v(shift, __lsx_vldi(0x3F)), 4), swap,
184
+ __lsx_vrepli_h(0x3f /* 0x003f*/));
185
+
186
+ // Blend pairs
187
+ // 000000cc ccdddddd|11110aaa bbbbbb00
188
+ __m128i blend = __lsx_vbitsel_v(lead, trail, lsx_splat_u32(0x0000FFFF));
189
+
190
+ // Add magic number to finish the result
191
+ // 110111CC CCDDDDDD|110110AA BBBBBBCC
192
+ __m128i composed = __lsx_vadd_h(blend, magic_with_low_2);
193
+ // Byte swap if necessary
194
+ if simdutf_constexpr (!match_system(big_endian)) {
195
+ composed = lsx_swap_bytes(composed);
196
+ }
197
+ __lsx_vst(composed, reinterpret_cast<uint16_t *>(utf16_output), 0);
198
+ utf16_output += 6; // We 3 32-bit surrogate pairs.
199
+ return 12; // We consumed 12 bytes.
200
+ }
201
+ // 3 1-4 byte sequences
202
+ __m128i sh = __lsx_vld(reinterpret_cast<const uint8_t *>(
203
+ simdutf::tables::utf8_to_utf16::shufutf8[idx]),
204
+ 0);
205
+ // 1 byte: 00000000 00000000 00000000 0ddddddd
206
+ // 3 byte: 00000000 00000000 110ccccc 10dddddd
207
+ // 3 byte: 00000000 1110bbbb 10cccccc 10dddddd
208
+ // 4 byte: 11110aaa 10bbbbbb 10cccccc 10dddddd
209
+ sh = __lsx_vand_v(sh, __lsx_vldi(0x1f));
210
+ __m128i perm = __lsx_vshuf_b(zero, in, sh);
211
+ // added to fix issue https://github.com/simdutf/simdutf/issues/514
212
+ // We only want to write 2 * 16-bit code units when that is actually what we
213
+ // have. Unfortunately, we cannot trust the input. So it is possible to get
214
+ // 0xff as an input byte and it should not result in a surrogate pair. We
215
+ // need to check for that.
216
+ uint32_t permbuffer[4];
217
+ __lsx_vst(perm, permbuffer, 0);
218
+ // Mask the low and middle bytes
219
+ // 00000000 00000000 00000000 0ddddddd
220
+ __m128i ascii = __lsx_vand_v(perm, __lsx_vrepli_w(0x7f));
221
+ // Because the surrogates need more work, the high surrogate is computed
222
+ // first.
223
+ __m128i middlehigh = __lsx_vslli_w(perm, 2);
224
+ // 00000000 00000000 00cccccc 00000000
225
+ __m128i middlebyte = __lsx_vand_v(perm, lsx_splat_u32(0x00003F00));
226
+ // Start assembling the sequence. Since the 4th byte is in the same position
227
+ // as it would be in a surrogate and there is no dependency, shift left
228
+ // instead of right. 3 byte: 00000000 10bbbbxx xxxxxxxx xxxxxxxx 4 byte:
229
+ // 11110aaa bbbbbbxx xxxxxxxx xxxxxxxx
230
+ __m128i ab = __lsx_vbitsel_v(middlehigh, perm, lsx_splat_u32(0xFF000000));
231
+ // Top 16 bits contains the high ten bits of the surrogate pair before
232
+ // correction 3 byte: 00000000 10bbbbcc|cccc0000 00000000 4 byte: 11110aaa
233
+ // bbbbbbcc|cccc0000 00000000 - high 10 bits correct w/o correction
234
+ __m128i v_fffc0000 = __lsx_vreplgr2vr_w(uint32_t(0xFFFC0000));
235
+ __m128i abc = __lsx_vbitsel_v(__lsx_vslli_w(middlebyte, 4), ab, v_fffc0000);
236
+ // Combine the low 6 or 7 bits by a shift right accumulate
237
+ // 3 byte: 00000000 00000010|bbbbcccc ccdddddd - low 16 bits correct
238
+ // 4 byte: 00000011 110aaabb|bbbbcccc ccdddddd - low 10 bits correct w/o
239
+ // correction
240
+ __m128i composed = __lsx_vor_v(ascii, __lsx_vsrli_w(abc, 6));
241
+ // After this is for surrogates
242
+ // Blend the low and high surrogates
243
+ // 4 byte: 11110aaa bbbbbbcc|bbbbcccc ccdddddd
244
+ __m128i mixed = __lsx_vbitsel_v(abc, composed, lsx_splat_u32(0x0000FFFF));
245
+ // Clear the upper 6 bits of the low surrogate. Don't clear the upper bits
246
+ // yet as 0x10000 was not subtracted from the codepoint yet. 4 byte:
247
+ // 11110aaa bbbbbbcc|000000cc ccdddddd
248
+ __m128i v_ffff03ff = __lsx_vreplgr2vr_w(uint32_t(0xFFFF03FF));
249
+ __m128i masked_pair = __lsx_vand_v(mixed, v_ffff03ff);
250
+ // Correct the remaining UTF-8 prefix, surrogate offset, and add the
251
+ // surrogate prefixes in one magic 16-bit addition. similar magic number but
252
+ // without the continue byte adjust and halfword swapped UTF-8 4b prefix =
253
+ // -0xF000|0x0000 surrogate offset = -0x0040|0x0000 (0x10000 << 6)
254
+ // surrogate high = +0xD800|0x0000
255
+ // surrogate low = +0x0000|0xDC00
256
+ // -----------------------------------
257
+ // = +0xE7C0|0xDC00
258
+ __m128i magic = __lsx_vreplgr2vr_w(uint32_t(0xE7C0DC00));
259
+ // 4 byte: 110110AA BBBBBBCC|110111CC CCDDDDDD - surrogate pair complete
260
+ __m128i surrogates = __lsx_vadd_w(masked_pair, magic);
261
+ // If the high bit is 1 (s32 less than zero), this needs a surrogate pair
262
+ __m128i is_pair = __lsx_vslt_w(perm, zero);
263
+ // Select either the 4 byte surrogate pair or the 2 byte solo codepoint
264
+ // 3 byte: 0xxxxxxx xxxxxxxx|bbbbcccc ccdddddd
265
+ // 4 byte: 110110AA BBBBBBCC|110111CC CCDDDDDD
266
+ __m128i selected = __lsx_vbitsel_v(composed, surrogates, is_pair);
267
+ // Byte swap if necessary
268
+ if simdutf_constexpr (!match_system(big_endian)) {
269
+ selected = lsx_swap_bytes(selected);
270
+ }
271
+ // Attempting to shuffle and store would be complex, just scalarize.
272
+ uint32_t buffer_tmp[4];
273
+ __lsx_vst(selected, buffer_tmp, 0);
274
+ // Test for the top bit of the surrogate mask. Remove due to issue 514
275
+ // const uint32_t SURROGATE_MASK = match_system(big_endian) ? 0x80000000 :
276
+ // 0x00800000;
277
+ for (size_t i = 0; i < 3; i++) {
278
+ // Surrogate
279
+ // Used to be if (buffer[i] & SURROGATE_MASK) {
280
+ // See discussion above.
281
+ // patch for issue https://github.com/simdutf/simdutf/issues/514
282
+ if ((permbuffer[i] & 0xf8000000) == 0xf0000000) {
283
+ utf16_output[0] = uint16_t(buffer_tmp[i] >> 16);
284
+ utf16_output[1] = uint16_t(buffer_tmp[i] & 0xFFFF);
285
+ utf16_output += 2;
286
+ } else {
287
+ utf16_output[0] = uint16_t(buffer_tmp[i] & 0xFFFF);
288
+ utf16_output++;
289
+ }
290
+ }
291
+ return consumed;
292
+ } else {
293
+ // here we know that there is an error but we do not handle errors
294
+ return 12;
295
+ }
296
+ }
@@ -0,0 +1,190 @@
1
+ // Convert up to 12 bytes from utf8 to utf32 using a mask indicating the
2
+ // end of the code points. Only the least significant 12 bits of the mask
3
+ // are accessed.
4
+ // It returns how many bytes were consumed (up to 12).
5
+ size_t convert_masked_utf8_to_utf32(const char *input,
6
+ uint64_t utf8_end_of_code_point_mask,
7
+ char32_t *&utf32_out) {
8
+ // we use an approach where we try to process up to 12 input bytes.
9
+ // Why 12 input bytes and not 16? Because we are concerned with the size of
10
+ // the lookup tables. Also 12 is nicely divisible by two and three.
11
+ //
12
+ uint32_t *&utf32_output = reinterpret_cast<uint32_t *&>(utf32_out);
13
+ __m128i in = __lsx_vld(reinterpret_cast<const uint8_t *>(input), 0);
14
+ const uint16_t input_utf8_end_of_code_point_mask =
15
+ utf8_end_of_code_point_mask & 0xFFF;
16
+ //
17
+ // Optimization note: our main path below is load-latency dependent. Thus it
18
+ // is maybe beneficial to have fast paths that depend on branch prediction but
19
+ // have less latency. This results in more instructions but, potentially, also
20
+ // higher speeds.
21
+ //
22
+ // We first try a few fast paths.
23
+ if ((utf8_end_of_code_point_mask & 0xffff) == 0xffff) {
24
+ // We process in chunks of 16 bytes.
25
+ // use fast implementation in src/simdutf/arm64/simd.h
26
+ // Ideally the compiler can keep the tables in registers.
27
+ __m128i zero = __lsx_vldi(0);
28
+ __m128i in16low = __lsx_vilvl_b(zero, in);
29
+ __m128i in16high = __lsx_vilvh_b(zero, in);
30
+ __m128i in32_0 = __lsx_vilvl_h(zero, in16low);
31
+ __m128i in32_1 = __lsx_vilvh_h(zero, in16low);
32
+ __m128i in32_2 = __lsx_vilvl_h(zero, in16high);
33
+ __m128i in32_3 = __lsx_vilvh_h(zero, in16high);
34
+
35
+ __lsx_vst(in32_0, reinterpret_cast<uint32_t *>(utf32_output), 0);
36
+ __lsx_vst(in32_1, reinterpret_cast<uint32_t *>(utf32_output), 16);
37
+ __lsx_vst(in32_2, reinterpret_cast<uint32_t *>(utf32_output), 32);
38
+ __lsx_vst(in32_3, reinterpret_cast<uint32_t *>(utf32_output), 48);
39
+
40
+ utf32_output += 16; // We wrote 16 32-bit characters.
41
+ return 16; // We consumed 16 bytes.
42
+ }
43
+ __m128i zero = __lsx_vldi(0);
44
+ if (input_utf8_end_of_code_point_mask == 0x924) {
45
+ // We want to take 4 3-byte UTF-8 code units and turn them into 4 4-byte
46
+ // UTF-32 code units. Convert to UTF-16
47
+ __m128i composed_utf16 = convert_utf8_3_byte_to_utf16(in);
48
+ __m128i utf32_low = __lsx_vilvl_h(zero, composed_utf16);
49
+
50
+ __lsx_vst(utf32_low, reinterpret_cast<uint32_t *>(utf32_output), 0);
51
+ utf32_output += 4; // We wrote 4 32-bit characters.
52
+ return 12; // We consumed 12 bytes.
53
+ }
54
+ // 2 byte sequences occur in short bursts in languages like Greek and Russian.
55
+ if (input_utf8_end_of_code_point_mask == 0xaaa) {
56
+ // We want to take 6 2-byte UTF-8 code units and turn them into 6 4-byte
57
+ // UTF-32 code units. Convert to UTF-16
58
+ __m128i composed_utf16 = convert_utf8_2_byte_to_utf16(in);
59
+
60
+ __m128i utf32_low = __lsx_vilvl_h(zero, composed_utf16);
61
+ __m128i utf32_high = __lsx_vilvh_h(zero, composed_utf16);
62
+
63
+ __lsx_vst(utf32_low, reinterpret_cast<uint32_t *>(utf32_output), 0);
64
+ __lsx_vst(utf32_high, reinterpret_cast<uint32_t *>(utf32_output), 16);
65
+ utf32_output += 6;
66
+ return 12; // We consumed 12 bytes.
67
+ }
68
+ // Either no fast path or an unimportant fast path.
69
+
70
+ const uint8_t idx = simdutf::tables::utf8_to_utf16::utf8bigindex
71
+ [input_utf8_end_of_code_point_mask][0];
72
+ const uint8_t consumed = simdutf::tables::utf8_to_utf16::utf8bigindex
73
+ [input_utf8_end_of_code_point_mask][1];
74
+
75
+ if (idx < 64) {
76
+ // SIX (6) input code-code units
77
+ // Convert to UTF-16
78
+ __m128i composed_utf16 = convert_utf8_1_to_2_byte_to_utf16(in, idx);
79
+ __m128i utf32_low = __lsx_vilvl_h(zero, composed_utf16);
80
+ __m128i utf32_high = __lsx_vilvh_h(zero, composed_utf16);
81
+
82
+ __lsx_vst(utf32_low, reinterpret_cast<uint32_t *>(utf32_output), 0);
83
+ __lsx_vst(utf32_high, reinterpret_cast<uint32_t *>(utf32_output), 16);
84
+ utf32_output += 6;
85
+ return consumed;
86
+ } else if (idx < 145) {
87
+ // FOUR (4) input code-code units
88
+ // UTF-16 and UTF-32 use similar algorithms, but UTF-32 skips the narrowing.
89
+ __m128i sh = __lsx_vld(reinterpret_cast<const uint8_t *>(
90
+ simdutf::tables::utf8_to_utf16::shufutf8[idx]),
91
+ 0);
92
+ // Shuffle
93
+ // 1 byte: 00000000 00000000 0ccccccc
94
+ // 2 byte: 00000000 110bbbbb 10cccccc
95
+ // 3 byte: 1110aaaa 10bbbbbb 10cccccc
96
+ sh = __lsx_vand_v(sh, __lsx_vldi(0x1f));
97
+ __m128i perm = __lsx_vshuf_b(zero, in, sh);
98
+ // Split
99
+ // 00000000 00000000 0ccccccc
100
+ __m128i ascii = __lsx_vand_v(perm, __lsx_vrepli_w(0x7F)); // 6 or 7 bits
101
+ // Note: unmasked
102
+ // xxxxxxxx aaaaxxxx xxxxxxxx
103
+ __m128i high =
104
+ __lsx_vsrli_w(__lsx_vand_v(perm, __lsx_vldi(0xf)), 4); // 4 bits
105
+ // Use 16 bit bic instead of and.
106
+ // The top bits will be corrected later in the bsl
107
+ // 00000000 10bbbbbb 00000000
108
+ __m128i middle =
109
+ __lsx_vand_v(perm, lsx_splat_u32(0x0000FF00)); // 5 or 6 bits
110
+ // Combine low and middle with shift right accumulate
111
+ // 00000000 00xxbbbb bbcccccc
112
+ __m128i lowmid = __lsx_vor_v(ascii, __lsx_vsrli_w(middle, 2));
113
+ // Insert top 4 bits from high byte with bitwise select
114
+ // 00000000 aaaabbbb bbcccccc
115
+ __m128i composed = __lsx_vbitsel_v(lowmid, high, lsx_splat_u32(0x0000F000));
116
+ __lsx_vst(composed, utf32_output, 0);
117
+ utf32_output += 4; // We wrote 4 32-bit characters.
118
+ return consumed;
119
+ } else if (idx < 209) {
120
+ // THREE (3) input code-code units
121
+ if (input_utf8_end_of_code_point_mask == 0x888) {
122
+ // We want to take 3 4-byte UTF-8 code units and turn them into 3 4-byte
123
+ // UTF-32 code units. This uses the same method as the fixed 3 byte
124
+ // version, reversing and shift left insert. However, there is no need for
125
+ // a shuffle mask now, just rev16 and rev32.
126
+ //
127
+ // This version does not use the LUT, but 4 byte sequences are less common
128
+ // and the overhead of the extra memory access is less important than the
129
+ // early branch overhead in shorter sequences, so it comes last.
130
+
131
+ // Swap pairs of bytes
132
+ // 10dddddd|10cccccc|10bbbbbb|11110aaa
133
+ // 10cccccc 10dddddd|11110aaa 10bbbbbb
134
+ __m128i swap = lsx_swap_bytes(in);
135
+ // Shift left and insert
136
+ // xxxxcccc ccdddddd|xxxxxxxa aabbbbbb
137
+ __m128i merge1 = __lsx_vbitsel_v(__lsx_vsrli_h(swap, 2), swap,
138
+ __lsx_vrepli_h(0x3f /*0x003F*/));
139
+ // Shift insert again
140
+ // xxxxxxxx xxxaaabb bbbbcccc ccdddddd
141
+ __m128i merge2 =
142
+ __lsx_vbitsel_v(__lsx_vslli_w(merge1, 12), /* merge1 << 12 */
143
+ __lsx_vsrli_w(merge1, 16), /* merge1 >> 16 */
144
+ lsx_splat_u32(0x00000FFF));
145
+ // Clear the garbage
146
+ // 00000000 000aaabb bbbbcccc ccdddddd
147
+ __m128i composed = __lsx_vand_v(merge2, lsx_splat_u32(0x1FFFFF));
148
+ // Store
149
+ __lsx_vst(composed, utf32_output, 0);
150
+ utf32_output += 3; // We wrote 3 32-bit characters.
151
+ return 12; // We consumed 12 bytes.
152
+ }
153
+ // Unlike UTF-16, doing a fast codepath doesn't have nearly as much benefit
154
+ // due to surrogates no longer being involved.
155
+ __m128i sh = __lsx_vld(reinterpret_cast<const uint8_t *>(
156
+ simdutf::tables::utf8_to_utf16::shufutf8[idx]),
157
+ 0);
158
+ // 1 byte: 00000000 00000000 00000000 0ddddddd
159
+ // 2 byte: 00000000 00000000 110ccccc 10dddddd
160
+ // 3 byte: 00000000 1110bbbb 10cccccc 10dddddd
161
+ // 4 byte: 11110aaa 10bbbbbb 10cccccc 10dddddd
162
+ sh = __lsx_vand_v(sh, __lsx_vldi(0x1f));
163
+ __m128i perm = __lsx_vshuf_b(zero, in, sh);
164
+
165
+ // Ascii
166
+ __m128i ascii = __lsx_vand_v(perm, __lsx_vrepli_w(0x7F));
167
+ __m128i middle = __lsx_vand_v(perm, lsx_splat_u32(0x00003f00));
168
+ // 00000000 00000000 0000cccc ccdddddd
169
+ __m128i cd = __lsx_vor_v(__lsx_vsrli_w(middle, 2), ascii);
170
+
171
+ __m128i correction = __lsx_vand_v(perm, lsx_splat_u32(0x00400000));
172
+ __m128i corrected = __lsx_vadd_b(perm, __lsx_vsrli_w(correction, 1));
173
+ // Insert twice
174
+ // 00000000 000aaabb bbbbxxxx xxxxxxxx
175
+ __m128i corrected_srli2 =
176
+ __lsx_vsrli_w(__lsx_vand_v(corrected, __lsx_vrepli_b(0x7)), 2);
177
+ __m128i ab =
178
+ __lsx_vbitsel_v(corrected_srli2, corrected, __lsx_vrepli_h(0x3f));
179
+ ab = __lsx_vsrli_w(ab, 4);
180
+ // 00000000 000aaabb bbbbcccc ccdddddd
181
+ __m128i composed = __lsx_vbitsel_v(ab, cd, lsx_splat_u32(0x00000FFF));
182
+ // Store
183
+ __lsx_vst(composed, utf32_output, 0);
184
+ utf32_output += 3; // We wrote 3 32-bit characters.
185
+ return consumed;
186
+ } else {
187
+ // here we know that there is an error but we do not handle errors
188
+ return 12;
189
+ }
190
+ }
@@ -0,0 +1,64 @@
1
+ simdutf_really_inline const char *util_find(const char *start, const char *end,
2
+ char character) noexcept {
3
+ if (start >= end)
4
+ return end;
5
+
6
+ const int step = 32;
7
+ __m256i char_vec = __lasx_xvreplgr2vr_b(static_cast<uint16_t>(character));
8
+
9
+ while (end - start >= step) {
10
+ __m256i data = __lasx_xvld(reinterpret_cast<const __m256i *>(start), 0);
11
+ __m256i cmp = __lasx_xvseq_b(data, char_vec);
12
+ if (__lasx_xbnz_v(cmp)) {
13
+ __m256i res = __lasx_xvmsknz_b(cmp);
14
+ uint32_t mask0 = __lasx_xvpickve2gr_wu(res, 0);
15
+ uint32_t mask1 = __lasx_xvpickve2gr_wu(res, 4);
16
+ uint32_t mask = (mask0 | (mask1 << 16));
17
+ return start + trailing_zeroes(mask);
18
+ }
19
+
20
+ start += step;
21
+ }
22
+
23
+ // Handle remaining bytes with scalar loop
24
+ for (; start < end; ++start) {
25
+ if (*start == character) {
26
+ return start;
27
+ }
28
+ }
29
+
30
+ return end;
31
+ }
32
+
33
+ simdutf_really_inline const char16_t *util_find(const char16_t *start,
34
+ const char16_t *end,
35
+ char16_t character) noexcept {
36
+ if (start >= end)
37
+ return end;
38
+
39
+ const int step = 16;
40
+ __m256i char_vec = __lasx_xvreplgr2vr_h(static_cast<uint16_t>(character));
41
+
42
+ while (end - start >= step) {
43
+ __m256i data = __lasx_xvld(reinterpret_cast<const __m256i *>(start), 0);
44
+ __m256i cmp = __lasx_xvseq_h(data, char_vec);
45
+ if (__lasx_xbnz_v(cmp)) {
46
+ __m256i res = __lasx_xvmsknz_b(cmp);
47
+ uint32_t mask0 = __lasx_xvpickve2gr_wu(res, 0);
48
+ uint32_t mask1 = __lasx_xvpickve2gr_wu(res, 4);
49
+ uint32_t mask = (mask0 | (mask1 << 16));
50
+ return start + trailing_zeroes(mask) / 2;
51
+ }
52
+
53
+ start += step;
54
+ }
55
+
56
+ // Handle remaining elements with scalar loop
57
+ for (; start < end; ++start) {
58
+ if (*start == character) {
59
+ return start;
60
+ }
61
+ }
62
+
63
+ return end;
64
+ }
@@ -0,0 +1,13 @@
1
+ template <endianness big_endian>
2
+ simd8<uint8_t> utf16_gather_high_bytes(const simd16<uint16_t> in0,
3
+ const simd16<uint16_t> in1) {
4
+ if (big_endian) {
5
+ const auto mask = simd16<uint16_t>(0x00ff);
6
+ const auto t0 = in0 & mask;
7
+ const auto t1 = in1 & mask;
8
+
9
+ return simd16<uint16_t>::pack(t0, t1);
10
+ } else {
11
+ return simd16<uint16_t>::pack_shifted_right<8>(in0, in1);
12
+ }
13
+ }
@@ -0,0 +1,84 @@
1
+ const char32_t *lasx_validate_utf32le(const char32_t *input, size_t size) {
2
+ const char32_t *end = input + size;
3
+
4
+ // Performance degradation when memory address is not 32-byte aligned
5
+ while (((uint64_t)input & 0x1F) && input < end) {
6
+ uint32_t word = *input++;
7
+ if (word > 0x10FFFF || (word >= 0xD800 && word <= 0xDFFF)) {
8
+ return nullptr;
9
+ }
10
+ }
11
+
12
+ __m256i offset = lasx_splat_u32(0xffff2000);
13
+ __m256i standardoffsetmax = lasx_splat_u32(0xfffff7ff);
14
+ __m256i standardmax = lasx_splat_u32(0x10ffff);
15
+ __m256i currentmax = __lasx_xvldi(0x0);
16
+ __m256i currentoffsetmax = __lasx_xvldi(0x0);
17
+
18
+ while (input + 8 < end) {
19
+ __m256i in = __lasx_xvld(reinterpret_cast<const uint32_t *>(input), 0);
20
+ currentmax = __lasx_xvmax_wu(in, currentmax);
21
+ // 0xD8__ + 0x2000 = 0xF8__ => 0xF8__ > 0xF7FF
22
+ currentoffsetmax =
23
+ __lasx_xvmax_wu(__lasx_xvadd_w(in, offset), currentoffsetmax);
24
+ input += 8;
25
+ }
26
+ __m256i is_zero =
27
+ __lasx_xvxor_v(__lasx_xvmax_wu(currentmax, standardmax), standardmax);
28
+ if (__lasx_xbnz_v(is_zero)) {
29
+ return nullptr;
30
+ }
31
+
32
+ is_zero = __lasx_xvxor_v(__lasx_xvmax_wu(currentoffsetmax, standardoffsetmax),
33
+ standardoffsetmax);
34
+ if (__lasx_xbnz_v(is_zero)) {
35
+ return nullptr;
36
+ }
37
+ return input;
38
+ }
39
+
40
+ const result lasx_validate_utf32le_with_errors(const char32_t *input,
41
+ size_t size) {
42
+ const char32_t *start = input;
43
+ const char32_t *end = input + size;
44
+
45
+ // Performance degradation when memory address is not 32-byte aligned
46
+ while (((uint64_t)input & 0x1F) && input < end) {
47
+ uint32_t word = *input;
48
+ if (word > 0x10FFFF) {
49
+ return result(error_code::TOO_LARGE, input - start);
50
+ }
51
+ if (word >= 0xD800 && word <= 0xDFFF) {
52
+ return result(error_code::SURROGATE, input - start);
53
+ }
54
+ input++;
55
+ }
56
+
57
+ __m256i offset = lasx_splat_u32(0xffff2000);
58
+ __m256i standardoffsetmax = lasx_splat_u32(0xfffff7ff);
59
+ __m256i standardmax = lasx_splat_u32(0x10ffff);
60
+ __m256i currentmax = __lasx_xvldi(0x0);
61
+ __m256i currentoffsetmax = __lasx_xvldi(0x0);
62
+
63
+ while (input + 8 < end) {
64
+ __m256i in = __lasx_xvld(reinterpret_cast<const uint32_t *>(input), 0);
65
+ currentmax = __lasx_xvmax_wu(in, currentmax);
66
+ currentoffsetmax =
67
+ __lasx_xvmax_wu(__lasx_xvadd_w(in, offset), currentoffsetmax);
68
+
69
+ __m256i is_zero =
70
+ __lasx_xvxor_v(__lasx_xvmax_wu(currentmax, standardmax), standardmax);
71
+ if (__lasx_xbnz_v(is_zero)) {
72
+ return result(error_code::TOO_LARGE, input - start);
73
+ }
74
+ is_zero =
75
+ __lasx_xvxor_v(__lasx_xvmax_wu(currentoffsetmax, standardoffsetmax),
76
+ standardoffsetmax);
77
+ if (__lasx_xbnz_v(is_zero)) {
78
+ return result(error_code::SURROGATE, input - start);
79
+ }
80
+ input += 8;
81
+ }
82
+
83
+ return result(error_code::SUCCESS, input - start);
84
+ }