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,589 @@
1
+ std::pair<const char32_t *, char *>
2
+ lasx_convert_utf32_to_utf8(const char32_t *buf, size_t len, char *utf8_out) {
3
+ uint8_t *utf8_output = reinterpret_cast<uint8_t *>(utf8_out);
4
+ const char32_t *end = buf + len;
5
+
6
+ // load addr align 32
7
+ while (((uint64_t)buf & 0x1F) && buf < end) {
8
+ uint32_t word = *buf;
9
+ if ((word & 0xFFFFFF80) == 0) {
10
+ *utf8_output++ = char(word);
11
+ } else if ((word & 0xFFFFF800) == 0) {
12
+ *utf8_output++ = char((word >> 6) | 0b11000000);
13
+ *utf8_output++ = char((word & 0b111111) | 0b10000000);
14
+ } else if ((word & 0xFFFF0000) == 0) {
15
+ if (word >= 0xD800 && word <= 0xDFFF) {
16
+ return std::make_pair(nullptr, reinterpret_cast<char *>(utf8_output));
17
+ }
18
+ *utf8_output++ = char((word >> 12) | 0b11100000);
19
+ *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000);
20
+ *utf8_output++ = char((word & 0b111111) | 0b10000000);
21
+ } else {
22
+ if (word > 0x10FFFF) {
23
+ return std::make_pair(nullptr, reinterpret_cast<char *>(utf8_output));
24
+ }
25
+ *utf8_output++ = char((word >> 18) | 0b11110000);
26
+ *utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000);
27
+ *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000);
28
+ *utf8_output++ = char((word & 0b111111) | 0b10000000);
29
+ }
30
+ buf++;
31
+ }
32
+
33
+ __m256i v_c080 = lasx_splat_u16(0xc080);
34
+ __m256i v_07ff = lasx_splat_u16(0x07ff);
35
+ __m256i v_dfff = lasx_splat_u16(0xdfff);
36
+ __m256i v_d800 = lasx_splat_u16(0xd800);
37
+ __m256i zero = __lasx_xvldi(0);
38
+ __m128i zero_128 = __lsx_vldi(0);
39
+ __m256i forbidden_bytemask = __lasx_xvldi(0x0);
40
+
41
+ const size_t safety_margin =
42
+ 12; // to avoid overruns, see issue
43
+ // https://github.com/simdutf/simdutf/issues/92
44
+
45
+ while (end - buf > std::ptrdiff_t(16 + safety_margin)) {
46
+ __m256i in = __lasx_xvld(reinterpret_cast<const uint32_t *>(buf), 0);
47
+ __m256i nextin = __lasx_xvld(reinterpret_cast<const uint32_t *>(buf), 32);
48
+
49
+ // Check if no bits set above 16th
50
+ if (__lasx_xbz_v(__lasx_xvpickod_h(in, nextin))) {
51
+ // Pack UTF-32 to UTF-16 safely (without surrogate pairs)
52
+ // Apply UTF-16 => UTF-8 routine (lasx_convert_utf16_to_utf8.cpp)
53
+ __m256i utf16_packed =
54
+ __lasx_xvpermi_d(__lasx_xvpickev_h(nextin, in), 0b11011000);
55
+
56
+ if (__lasx_xbz_v(__lasx_xvslt_hu(__lasx_xvrepli_h(0x7F),
57
+ utf16_packed))) { // ASCII fast path!!!!
58
+ // 1. pack the bytes
59
+ // obviously suboptimal.
60
+ __m256i utf8_packed = __lasx_xvpermi_d(
61
+ __lasx_xvpickev_b(utf16_packed, utf16_packed), 0b00001000);
62
+ // 2. store (8 bytes)
63
+ __lsx_vst(lasx_extracti128_lo(utf8_packed), utf8_output, 0);
64
+ // 3. adjust pointers
65
+ buf += 16;
66
+ utf8_output += 16;
67
+ continue; // we are done for this round!
68
+ }
69
+
70
+ if (__lasx_xbz_v(__lasx_xvslt_hu(v_07ff, utf16_packed))) {
71
+ // 1. prepare 2-byte values
72
+ // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8
73
+ // expected output : [110a|aaaa|10bb|bbbb] x 8
74
+
75
+ // t0 = [000a|aaaa|bbbb|bb00]
76
+ const __m256i t0 = __lasx_xvslli_h(utf16_packed, 2);
77
+ // t1 = [000a|aaaa|0000|0000]
78
+ const __m256i t1 = __lasx_xvand_v(t0, lasx_splat_u16(0x1f00));
79
+ // t2 = [0000|0000|00bb|bbbb]
80
+ const __m256i t2 = __lasx_xvand_v(utf16_packed, __lasx_xvrepli_h(0x3f));
81
+ // t3 = [000a|aaaa|00bb|bbbb]
82
+ const __m256i t3 = __lasx_xvor_v(t1, t2);
83
+ // t4 = [110a|aaaa|10bb|bbbb]
84
+ const __m256i t4 = __lasx_xvor_v(t3, v_c080);
85
+ // 2. merge ASCII and 2-byte codewords
86
+ __m256i one_byte_bytemask =
87
+ __lasx_xvsle_hu(utf16_packed, __lasx_xvrepli_h(0x7F /*0x007F*/));
88
+ __m256i utf8_unpacked =
89
+ __lasx_xvbitsel_v(t4, utf16_packed, one_byte_bytemask);
90
+ // 3. prepare bitmask for 8-bit lookup
91
+ __m256i mask = __lasx_xvmskltz_h(one_byte_bytemask);
92
+ uint32_t m1 = __lasx_xvpickve2gr_wu(mask, 0);
93
+ uint32_t m2 = __lasx_xvpickve2gr_wu(mask, 4);
94
+ // 4. pack the bytes
95
+ const uint8_t *row1 =
96
+ &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes
97
+ [lasx_1_2_utf8_bytes_mask[m1]][0];
98
+ __m128i shuffle1 = __lsx_vld(row1, 1);
99
+ __m128i utf8_packed1 = __lsx_vshuf_b(
100
+ zero_128, lasx_extracti128_lo(utf8_unpacked), shuffle1);
101
+
102
+ const uint8_t *row2 =
103
+ &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes
104
+ [lasx_1_2_utf8_bytes_mask[m2]][0];
105
+ __m128i shuffle2 = __lsx_vld(row2, 1);
106
+ __m128i utf8_packed2 = __lsx_vshuf_b(
107
+ zero_128, lasx_extracti128_hi(utf8_unpacked), shuffle2);
108
+ // 5. store bytes
109
+ __lsx_vst(utf8_packed1, utf8_output, 0);
110
+ utf8_output += row1[0];
111
+
112
+ __lsx_vst(utf8_packed2, utf8_output, 0);
113
+ utf8_output += row2[0];
114
+
115
+ buf += 16;
116
+ continue;
117
+ } else {
118
+ // case: code units from register produce either 1, 2 or 3 UTF-8 bytes
119
+ forbidden_bytemask = __lasx_xvor_v(
120
+ __lasx_xvand_v(
121
+ __lasx_xvsle_h(utf16_packed, v_dfff), // utf16_packed <= 0xdfff
122
+ __lasx_xvsle_h(v_d800, utf16_packed)), // utf16_packed >= 0xd800
123
+ forbidden_bytemask);
124
+ /* In this branch we handle three cases:
125
+ 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] -
126
+ single UFT-8 byte
127
+ 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] -
128
+ two UTF-8 bytes
129
+ 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] -
130
+ three UTF-8 bytes
131
+
132
+ We expand the input word (16-bit) into two code units (32-bit), thus
133
+ we have room for four bytes. However, we need five distinct bit
134
+ layouts. Note that the last byte in cases #2 and #3 is the same.
135
+
136
+ We precompute byte 1 for case #1 and the common byte for cases #2 &
137
+ #3 in register t2.
138
+
139
+ We precompute byte 1 for case #3 and -- **conditionally** --
140
+ precompute either byte 1 for case #2 or byte 2 for case #3. Note that
141
+ they differ by exactly one bit.
142
+
143
+ Finally from these two code units we build proper UTF-8 sequence,
144
+ taking into account the case (i.e, the number of bytes to write).
145
+ */
146
+ /**
147
+ * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce:
148
+ * t2 => [0ccc|cccc] [10cc|cccc]
149
+ * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb])
150
+ */
151
+ // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc]
152
+ __m256i t0 = __lasx_xvpickev_b(utf16_packed, utf16_packed);
153
+ t0 = __lasx_xvilvl_b(t0, t0);
154
+ // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc]
155
+ __m256i v_3f7f = __lasx_xvreplgr2vr_h(uint16_t(0x3F7F));
156
+ __m256i t1 = __lasx_xvand_v(t0, v_3f7f);
157
+ // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc]
158
+ __m256i t2 = __lasx_xvor_v(t1, lasx_splat_u16(0x8000));
159
+
160
+ // s0: [aaaa|bbbb|bbcc|cccc] => [0000|0000|0000|aaaa]
161
+ __m256i s0 = __lasx_xvsrli_h(utf16_packed, 12);
162
+ // s1: [aaaa|bbbb|bbcc|cccc] => [0000|bbbb|bb00|0000]
163
+ __m256i s1 = __lasx_xvslli_h(utf16_packed, 2);
164
+ // [0000|bbbb|bb00|0000] => [00bb|bbbb|0000|0000]
165
+ s1 = __lasx_xvand_v(s1, lasx_splat_u16(0x3f00));
166
+ // [00bb|bbbb|0000|aaaa]
167
+ __m256i s2 = __lasx_xvor_v(s0, s1);
168
+ // s3: [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa]
169
+ __m256i v_c0e0 = __lasx_xvreplgr2vr_h(uint16_t(0xC0E0));
170
+ __m256i s3 = __lasx_xvor_v(s2, v_c0e0);
171
+ // __m256i v_07ff = vmovq_n_u16((uint16_t)0x07FF);
172
+ __m256i one_or_two_bytes_bytemask =
173
+ __lasx_xvsle_hu(utf16_packed, v_07ff);
174
+ __m256i m0 =
175
+ __lasx_xvandn_v(one_or_two_bytes_bytemask, lasx_splat_u16(0x4000));
176
+ __m256i s4 = __lasx_xvxor_v(s3, m0);
177
+
178
+ // 4. expand code units 16-bit => 32-bit
179
+ __m256i out0 = __lasx_xvilvl_h(s4, t2);
180
+ __m256i out1 = __lasx_xvilvh_h(s4, t2);
181
+
182
+ // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle
183
+ __m256i one_byte_bytemask =
184
+ __lasx_xvsle_hu(utf16_packed, __lasx_xvrepli_h(0x7F));
185
+
186
+ __m256i one_or_two_bytes_bytemask_u16_to_u32_low =
187
+ __lasx_xvilvl_h(one_or_two_bytes_bytemask, zero);
188
+ __m256i one_or_two_bytes_bytemask_u16_to_u32_high =
189
+ __lasx_xvilvh_h(one_or_two_bytes_bytemask, zero);
190
+
191
+ __m256i one_byte_bytemask_u16_to_u32_low =
192
+ __lasx_xvilvl_h(one_byte_bytemask, one_byte_bytemask);
193
+ __m256i one_byte_bytemask_u16_to_u32_high =
194
+ __lasx_xvilvh_h(one_byte_bytemask, one_byte_bytemask);
195
+
196
+ __m256i mask0 = __lasx_xvmskltz_h(
197
+ __lasx_xvor_v(one_or_two_bytes_bytemask_u16_to_u32_low,
198
+ one_byte_bytemask_u16_to_u32_low));
199
+ __m256i mask1 = __lasx_xvmskltz_h(
200
+ __lasx_xvor_v(one_or_two_bytes_bytemask_u16_to_u32_high,
201
+ one_byte_bytemask_u16_to_u32_high));
202
+
203
+ uint32_t mask = __lasx_xvpickve2gr_wu(mask0, 0);
204
+ const uint8_t *row0 =
205
+ &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask & 0xFF]
206
+ [0];
207
+ __m128i shuffle0 = __lsx_vld(row0, 1);
208
+ __m128i utf8_0 =
209
+ __lsx_vshuf_b(zero_128, lasx_extracti128_lo(out0), shuffle0);
210
+ __lsx_vst(utf8_0, utf8_output, 0);
211
+ utf8_output += row0[0];
212
+
213
+ mask = __lasx_xvpickve2gr_wu(mask1, 0);
214
+ const uint8_t *row1 =
215
+ &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask & 0xFF]
216
+ [0];
217
+ __m128i shuffle1 = __lsx_vld(row1, 1);
218
+ __m128i utf8_1 =
219
+ __lsx_vshuf_b(zero_128, lasx_extracti128_lo(out1), shuffle1);
220
+ __lsx_vst(utf8_1, utf8_output, 0);
221
+ utf8_output += row1[0];
222
+
223
+ mask = __lasx_xvpickve2gr_wu(mask0, 4);
224
+ const uint8_t *row2 =
225
+ &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask & 0xFF]
226
+ [0];
227
+ __m128i shuffle2 = __lsx_vld(row2, 1);
228
+ __m128i utf8_2 =
229
+ __lsx_vshuf_b(zero_128, lasx_extracti128_hi(out0), shuffle2);
230
+ __lsx_vst(utf8_2, utf8_output, 0);
231
+ utf8_output += row2[0];
232
+
233
+ mask = __lasx_xvpickve2gr_wu(mask1, 4);
234
+ const uint8_t *row3 =
235
+ &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask & 0xFF]
236
+ [0];
237
+ __m128i shuffle3 = __lsx_vld(row3, 1);
238
+ __m128i utf8_3 =
239
+ __lsx_vshuf_b(zero_128, lasx_extracti128_hi(out1), shuffle3);
240
+ __lsx_vst(utf8_3, utf8_output, 0);
241
+ utf8_output += row3[0];
242
+
243
+ buf += 16;
244
+ }
245
+ // At least one 32-bit word will produce a surrogate pair in UTF-16 <=>
246
+ // will produce four UTF-8 bytes.
247
+ } else {
248
+ // Let us do a scalar fallback.
249
+ // It may seem wasteful to use scalar code, but being efficient with SIMD
250
+ // in the presence of surrogate pairs may require non-trivial tables.
251
+ size_t forward = 15;
252
+ size_t k = 0;
253
+ if (size_t(end - buf) < forward + 1) {
254
+ forward = size_t(end - buf - 1);
255
+ }
256
+ for (; k < forward; k++) {
257
+ uint32_t word = buf[k];
258
+ if ((word & 0xFFFFFF80) == 0) {
259
+ *utf8_output++ = char(word);
260
+ } else if ((word & 0xFFFFF800) == 0) {
261
+ *utf8_output++ = char((word >> 6) | 0b11000000);
262
+ *utf8_output++ = char((word & 0b111111) | 0b10000000);
263
+ } else if ((word & 0xFFFF0000) == 0) {
264
+ if (word >= 0xD800 && word <= 0xDFFF) {
265
+ return std::make_pair(nullptr,
266
+ reinterpret_cast<char *>(utf8_output));
267
+ }
268
+ *utf8_output++ = char((word >> 12) | 0b11100000);
269
+ *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000);
270
+ *utf8_output++ = char((word & 0b111111) | 0b10000000);
271
+ } else {
272
+ if (word > 0x10FFFF) {
273
+ return std::make_pair(nullptr,
274
+ reinterpret_cast<char *>(utf8_output));
275
+ }
276
+ *utf8_output++ = char((word >> 18) | 0b11110000);
277
+ *utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000);
278
+ *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000);
279
+ *utf8_output++ = char((word & 0b111111) | 0b10000000);
280
+ }
281
+ }
282
+ buf += k;
283
+ }
284
+ } // while
285
+
286
+ // check for invalid input
287
+ if (__lasx_xbnz_v(forbidden_bytemask)) {
288
+ return std::make_pair(nullptr, reinterpret_cast<char *>(utf8_output));
289
+ }
290
+ return std::make_pair(buf, reinterpret_cast<char *>(utf8_output));
291
+ }
292
+
293
+ std::pair<result, char *>
294
+ lasx_convert_utf32_to_utf8_with_errors(const char32_t *buf, size_t len,
295
+ char *utf8_out) {
296
+ uint8_t *utf8_output = reinterpret_cast<uint8_t *>(utf8_out);
297
+ const char32_t *start = buf;
298
+ const char32_t *end = buf + len;
299
+
300
+ // load addr align 32
301
+ while (((uint64_t)buf & 0x1F) && buf < end) {
302
+ uint32_t word = *buf;
303
+ if ((word & 0xFFFFFF80) == 0) {
304
+ *utf8_output++ = char(word);
305
+ } else if ((word & 0xFFFFF800) == 0) {
306
+ *utf8_output++ = char((word >> 6) | 0b11000000);
307
+ *utf8_output++ = char((word & 0b111111) | 0b10000000);
308
+ } else if ((word & 0xFFFF0000) == 0) {
309
+ if (word >= 0xD800 && word <= 0xDFFF) {
310
+ return std::make_pair(result(error_code::SURROGATE, buf - start),
311
+ reinterpret_cast<char *>(utf8_output));
312
+ }
313
+ *utf8_output++ = char((word >> 12) | 0b11100000);
314
+ *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000);
315
+ *utf8_output++ = char((word & 0b111111) | 0b10000000);
316
+ } else {
317
+ if (word > 0x10FFFF) {
318
+ return std::make_pair(result(error_code::TOO_LARGE, buf - start),
319
+ reinterpret_cast<char *>(utf8_output));
320
+ }
321
+ *utf8_output++ = char((word >> 18) | 0b11110000);
322
+ *utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000);
323
+ *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000);
324
+ *utf8_output++ = char((word & 0b111111) | 0b10000000);
325
+ }
326
+ buf++;
327
+ }
328
+
329
+ __m256i v_c080 = lasx_splat_u16(0xc080);
330
+ __m256i v_07ff = lasx_splat_u16(0x07ff);
331
+ __m256i v_dfff = lasx_splat_u16(0xdfff);
332
+ __m256i v_d800 = lasx_splat_u16(0xd800);
333
+ __m256i zero = __lasx_xvldi(0);
334
+ __m128i zero_128 = __lsx_vldi(0);
335
+ __m256i forbidden_bytemask = __lasx_xvldi(0x0);
336
+ const size_t safety_margin =
337
+ 12; // to avoid overruns, see issue
338
+ // https://github.com/simdutf/simdutf/issues/92
339
+
340
+ while (end - buf > std::ptrdiff_t(16 + safety_margin)) {
341
+ __m256i in = __lasx_xvld(reinterpret_cast<const uint32_t *>(buf), 0);
342
+ __m256i nextin = __lasx_xvld(reinterpret_cast<const uint32_t *>(buf), 32);
343
+
344
+ // Check if no bits set above 16th
345
+ if (__lasx_xbz_v(__lasx_xvpickod_h(in, nextin))) {
346
+ // Pack UTF-32 to UTF-16 safely (without surrogate pairs)
347
+ // Apply UTF-16 => UTF-8 routine (lasx_convert_utf16_to_utf8.cpp)
348
+ __m256i utf16_packed =
349
+ __lasx_xvpermi_d(__lasx_xvpickev_h(nextin, in), 0b11011000);
350
+
351
+ if (__lasx_xbz_v(__lasx_xvslt_hu(__lasx_xvrepli_h(0x7F),
352
+ utf16_packed))) { // ASCII fast path!!!!
353
+ // 1. pack the bytes
354
+ // obviously suboptimal.
355
+ __m256i utf8_packed = __lasx_xvpermi_d(
356
+ __lasx_xvpickev_b(utf16_packed, utf16_packed), 0b00001000);
357
+ // 2. store (8 bytes)
358
+ __lsx_vst(lasx_extracti128_lo(utf8_packed), utf8_output, 0);
359
+ // 3. adjust pointers
360
+ buf += 16;
361
+ utf8_output += 16;
362
+ continue; // we are done for this round!
363
+ }
364
+
365
+ if (__lasx_xbz_v(__lasx_xvslt_hu(v_07ff, utf16_packed))) {
366
+ // 1. prepare 2-byte values
367
+ // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8
368
+ // expected output : [110a|aaaa|10bb|bbbb] x 8
369
+
370
+ // t0 = [000a|aaaa|bbbb|bb00]
371
+ const __m256i t0 = __lasx_xvslli_h(utf16_packed, 2);
372
+ // t1 = [000a|aaaa|0000|0000]
373
+ const __m256i t1 = __lasx_xvand_v(t0, lasx_splat_u16(0x1f00));
374
+ // t2 = [0000|0000|00bb|bbbb]
375
+ const __m256i t2 = __lasx_xvand_v(utf16_packed, __lasx_xvrepli_h(0x3f));
376
+ // t3 = [000a|aaaa|00bb|bbbb]
377
+ const __m256i t3 = __lasx_xvor_v(t1, t2);
378
+ // t4 = [110a|aaaa|10bb|bbbb]
379
+ const __m256i t4 = __lasx_xvor_v(t3, v_c080);
380
+ // 2. merge ASCII and 2-byte codewords
381
+ __m256i one_byte_bytemask =
382
+ __lasx_xvsle_hu(utf16_packed, __lasx_xvrepli_h(0x7F /*0x007F*/));
383
+ __m256i utf8_unpacked =
384
+ __lasx_xvbitsel_v(t4, utf16_packed, one_byte_bytemask);
385
+ // 3. prepare bitmask for 8-bit lookup
386
+ __m256i mask = __lasx_xvmskltz_h(one_byte_bytemask);
387
+ uint32_t m1 = __lasx_xvpickve2gr_wu(mask, 0);
388
+ uint32_t m2 = __lasx_xvpickve2gr_wu(mask, 4);
389
+ // 4. pack the bytes
390
+ const uint8_t *row1 =
391
+ &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes
392
+ [lasx_1_2_utf8_bytes_mask[m1]][0];
393
+ __m128i shuffle1 = __lsx_vld(row1, 1);
394
+ __m128i utf8_packed1 = __lsx_vshuf_b(
395
+ zero_128, lasx_extracti128_lo(utf8_unpacked), shuffle1);
396
+
397
+ const uint8_t *row2 =
398
+ &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes
399
+ [lasx_1_2_utf8_bytes_mask[m2]][0];
400
+ __m128i shuffle2 = __lsx_vld(row2, 1);
401
+ __m128i utf8_packed2 = __lsx_vshuf_b(
402
+ zero_128, lasx_extracti128_hi(utf8_unpacked), shuffle2);
403
+ // 5. store bytes
404
+ __lsx_vst(utf8_packed1, utf8_output, 0);
405
+ utf8_output += row1[0];
406
+
407
+ __lsx_vst(utf8_packed2, utf8_output, 0);
408
+ utf8_output += row2[0];
409
+
410
+ buf += 16;
411
+ continue;
412
+ } else {
413
+ // case: code units from register produce either 1, 2 or 3 UTF-8 bytes
414
+ forbidden_bytemask = __lasx_xvor_v(
415
+ __lasx_xvand_v(
416
+ __lasx_xvsle_h(utf16_packed, v_dfff), // utf16_packed <= 0xdfff
417
+ __lasx_xvsle_h(v_d800, utf16_packed)), // utf16_packed >= 0xd800
418
+ forbidden_bytemask);
419
+ if (__lasx_xbnz_v(forbidden_bytemask)) {
420
+ return std::make_pair(result(error_code::SURROGATE, buf - start),
421
+ reinterpret_cast<char *>(utf8_output));
422
+ }
423
+ /* In this branch we handle three cases:
424
+ 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] -
425
+ single UFT-8 byte
426
+ 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] -
427
+ two UTF-8 bytes
428
+ 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] -
429
+ three UTF-8 bytes
430
+
431
+ We expand the input word (16-bit) into two code units (32-bit), thus
432
+ we have room for four bytes. However, we need five distinct bit
433
+ layouts. Note that the last byte in cases #2 and #3 is the same.
434
+
435
+ We precompute byte 1 for case #1 and the common byte for cases #2 &
436
+ #3 in register t2.
437
+
438
+ We precompute byte 1 for case #3 and -- **conditionally** --
439
+ precompute either byte 1 for case #2 or byte 2 for case #3. Note that
440
+ they differ by exactly one bit.
441
+
442
+ Finally from these two code units we build proper UTF-8 sequence,
443
+ taking into account the case (i.e, the number of bytes to write).
444
+ */
445
+ /**
446
+ * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce:
447
+ * t2 => [0ccc|cccc] [10cc|cccc]
448
+ * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb])
449
+ */
450
+ // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc]
451
+ __m256i t0 = __lasx_xvpickev_b(utf16_packed, utf16_packed);
452
+ t0 = __lasx_xvilvl_b(t0, t0);
453
+ // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc]
454
+ __m256i v_3f7f = __lasx_xvreplgr2vr_h(uint16_t(0x3F7F));
455
+ __m256i t1 = __lasx_xvand_v(t0, v_3f7f);
456
+ // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc]
457
+ __m256i t2 = __lasx_xvor_v(t1, lasx_splat_u16(0x8000));
458
+
459
+ // s0: [aaaa|bbbb|bbcc|cccc] => [0000|0000|0000|aaaa]
460
+ __m256i s0 = __lasx_xvsrli_h(utf16_packed, 12);
461
+ // s1: [aaaa|bbbb|bbcc|cccc] => [0000|bbbb|bb00|0000]
462
+ __m256i s1 = __lasx_xvslli_h(utf16_packed, 2);
463
+ // [0000|bbbb|bb00|0000] => [00bb|bbbb|0000|0000]
464
+ s1 = __lasx_xvand_v(s1, lasx_splat_u16(0x3F00));
465
+ // [00bb|bbbb|0000|aaaa]
466
+ __m256i s2 = __lasx_xvor_v(s0, s1);
467
+ // s3: [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa]
468
+ __m256i v_c0e0 = __lasx_xvreplgr2vr_h(uint16_t(0xC0E0));
469
+ __m256i s3 = __lasx_xvor_v(s2, v_c0e0);
470
+ // __m256i v_07ff = vmovq_n_u16((uint16_t)0x07FF);
471
+ __m256i one_or_two_bytes_bytemask =
472
+ __lasx_xvsle_hu(utf16_packed, v_07ff);
473
+ __m256i m0 =
474
+ __lasx_xvandn_v(one_or_two_bytes_bytemask, lasx_splat_u16(0x4000));
475
+ __m256i s4 = __lasx_xvxor_v(s3, m0);
476
+
477
+ // 4. expand code units 16-bit => 32-bit
478
+ __m256i out0 = __lasx_xvilvl_h(s4, t2);
479
+ __m256i out1 = __lasx_xvilvh_h(s4, t2);
480
+
481
+ // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle
482
+ __m256i one_byte_bytemask =
483
+ __lasx_xvsle_hu(utf16_packed, __lasx_xvrepli_h(0x7F));
484
+
485
+ __m256i one_or_two_bytes_bytemask_u16_to_u32_low =
486
+ __lasx_xvilvl_h(one_or_two_bytes_bytemask, zero);
487
+ __m256i one_or_two_bytes_bytemask_u16_to_u32_high =
488
+ __lasx_xvilvh_h(one_or_two_bytes_bytemask, zero);
489
+
490
+ __m256i one_byte_bytemask_u16_to_u32_low =
491
+ __lasx_xvilvl_h(one_byte_bytemask, one_byte_bytemask);
492
+ __m256i one_byte_bytemask_u16_to_u32_high =
493
+ __lasx_xvilvh_h(one_byte_bytemask, one_byte_bytemask);
494
+
495
+ __m256i mask0 = __lasx_xvmskltz_h(
496
+ __lasx_xvor_v(one_or_two_bytes_bytemask_u16_to_u32_low,
497
+ one_byte_bytemask_u16_to_u32_low));
498
+ __m256i mask1 = __lasx_xvmskltz_h(
499
+ __lasx_xvor_v(one_or_two_bytes_bytemask_u16_to_u32_high,
500
+ one_byte_bytemask_u16_to_u32_high));
501
+
502
+ uint32_t mask = __lasx_xvpickve2gr_wu(mask0, 0);
503
+ const uint8_t *row0 =
504
+ &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask & 0xFF]
505
+ [0];
506
+ __m128i shuffle0 = __lsx_vld(row0, 1);
507
+ __m128i utf8_0 =
508
+ __lsx_vshuf_b(zero_128, lasx_extracti128_lo(out0), shuffle0);
509
+ __lsx_vst(utf8_0, utf8_output, 0);
510
+ utf8_output += row0[0];
511
+
512
+ mask = __lasx_xvpickve2gr_wu(mask1, 0);
513
+ const uint8_t *row1 =
514
+ &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask & 0xFF]
515
+ [0];
516
+ __m128i shuffle1 = __lsx_vld(row1, 1);
517
+ __m128i utf8_1 =
518
+ __lsx_vshuf_b(zero_128, lasx_extracti128_lo(out1), shuffle1);
519
+ __lsx_vst(utf8_1, utf8_output, 0);
520
+ utf8_output += row1[0];
521
+
522
+ mask = __lasx_xvpickve2gr_wu(mask0, 4);
523
+ const uint8_t *row2 =
524
+ &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask & 0xFF]
525
+ [0];
526
+ __m128i shuffle2 = __lsx_vld(row2, 1);
527
+ __m128i utf8_2 =
528
+ __lsx_vshuf_b(zero_128, lasx_extracti128_hi(out0), shuffle2);
529
+ __lsx_vst(utf8_2, utf8_output, 0);
530
+ utf8_output += row2[0];
531
+
532
+ mask = __lasx_xvpickve2gr_wu(mask1, 4);
533
+ const uint8_t *row3 =
534
+ &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask & 0xFF]
535
+ [0];
536
+ __m128i shuffle3 = __lsx_vld(row3, 1);
537
+ __m128i utf8_3 =
538
+ __lsx_vshuf_b(zero_128, lasx_extracti128_hi(out1), shuffle3);
539
+ __lsx_vst(utf8_3, utf8_output, 0);
540
+ utf8_output += row3[0];
541
+
542
+ buf += 16;
543
+ }
544
+ // At least one 32-bit word will produce a surrogate pair in UTF-16 <=>
545
+ // will produce four UTF-8 bytes.
546
+ } else {
547
+ // Let us do a scalar fallback.
548
+ // It may seem wasteful to use scalar code, but being efficient with SIMD
549
+ // in the presence of surrogate pairs may require non-trivial tables.
550
+ size_t forward = 15;
551
+ size_t k = 0;
552
+ if (size_t(end - buf) < forward + 1) {
553
+ forward = size_t(end - buf - 1);
554
+ }
555
+ for (; k < forward; k++) {
556
+ uint32_t word = buf[k];
557
+ if ((word & 0xFFFFFF80) == 0) {
558
+ *utf8_output++ = char(word);
559
+ } else if ((word & 0xFFFFF800) == 0) {
560
+ *utf8_output++ = char((word >> 6) | 0b11000000);
561
+ *utf8_output++ = char((word & 0b111111) | 0b10000000);
562
+ } else if ((word & 0xFFFF0000) == 0) {
563
+ if (word >= 0xD800 && word <= 0xDFFF) {
564
+ return std::make_pair(
565
+ result(error_code::SURROGATE, buf - start + k),
566
+ reinterpret_cast<char *>(utf8_output));
567
+ }
568
+ *utf8_output++ = char((word >> 12) | 0b11100000);
569
+ *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000);
570
+ *utf8_output++ = char((word & 0b111111) | 0b10000000);
571
+ } else {
572
+ if (word > 0x10FFFF) {
573
+ return std::make_pair(
574
+ result(error_code::TOO_LARGE, buf - start + k),
575
+ reinterpret_cast<char *>(utf8_output));
576
+ }
577
+ *utf8_output++ = char((word >> 18) | 0b11110000);
578
+ *utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000);
579
+ *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000);
580
+ *utf8_output++ = char((word & 0b111111) | 0b10000000);
581
+ }
582
+ }
583
+ buf += k;
584
+ }
585
+ } // while
586
+
587
+ return std::make_pair(result(error_code::SUCCESS, buf - start),
588
+ reinterpret_cast<char *>(utf8_output));
589
+ }
@@ -0,0 +1,72 @@
1
+ size_t convert_masked_utf8_to_latin1(const char *input,
2
+ uint64_t utf8_end_of_code_point_mask,
3
+ char *&latin1_output) {
4
+ // we use an approach where we try to process up to 12 input bytes.
5
+ // Why 12 input bytes and not 16? Because we are concerned with the size of
6
+ // the lookup tables. Also 12 is nicely divisible by two and three.
7
+ //
8
+ __m128i in = __lsx_vld(reinterpret_cast<const uint8_t *>(input), 0);
9
+
10
+ const uint16_t input_utf8_end_of_code_point_mask =
11
+ utf8_end_of_code_point_mask & 0xfff;
12
+ // Optimization note: our main path below is load-latency dependent. Thus it
13
+ // is maybe beneficial to have fast paths that depend on branch prediction but
14
+ // have less latency. This results in more instructions but, potentially, also
15
+ // higher speeds.
16
+
17
+ // We first try a few fast paths.
18
+ // The obvious first test is ASCII, which actually consumes the full 16.
19
+ if ((utf8_end_of_code_point_mask & 0xFFFF) == 0xFFFF) {
20
+ // We process in chunks of 16 bytes
21
+ __lsx_vst(in, reinterpret_cast<uint8_t *>(latin1_output), 0);
22
+ latin1_output += 16; // We wrote 16 18-bit characters.
23
+ return 16; // We consumed 16 bytes.
24
+ }
25
+ /// We do not have a fast path available, or the fast path is unimportant, so
26
+ /// we fallback.
27
+ const uint8_t idx = simdutf::tables::utf8_to_utf16::utf8bigindex
28
+ [input_utf8_end_of_code_point_mask][0];
29
+
30
+ const uint8_t consumed = simdutf::tables::utf8_to_utf16::utf8bigindex
31
+ [input_utf8_end_of_code_point_mask][1];
32
+ // this indicates an invalid input:
33
+ if (idx >= 64) {
34
+ return consumed;
35
+ }
36
+ // Here we should have (idx < 64), if not, there is a bug in the validation or
37
+ // elsewhere. SIX (6) input code-code units this is a relatively easy scenario
38
+ // we process SIX (6) input code-code units. The max length in bytes of six
39
+ // code code units spanning between 1 and 2 bytes each is 12 bytes. Converts 6
40
+ // 1-2 byte UTF-8 characters to 6 UTF-16 characters. This is a relatively easy
41
+ // scenario we process SIX (6) input code-code units. The max length in bytes
42
+ // of six code code units spanning between 1 and 2 bytes each is 12 bytes.
43
+ __m128i sh = __lsx_vld(reinterpret_cast<const uint8_t *>(
44
+ simdutf::tables::utf8_to_utf16::shufutf8[idx]),
45
+ 0);
46
+ // Shuffle
47
+ // 1 byte: 00000000 0bbbbbbb
48
+ // 2 byte: 110aaaaa 10bbbbbb
49
+ sh = __lsx_vand_v(sh, __lsx_vldi(0x1f));
50
+ __m128i perm = __lsx_vshuf_b(__lsx_vldi(0), in, sh);
51
+ // ascii mask
52
+ // 1 byte: 11111111 11111111
53
+ // 2 byte: 00000000 00000000
54
+ __m128i ascii_mask = __lsx_vslt_bu(perm, __lsx_vldi(0x80));
55
+ // utf8 mask
56
+ // 1 byte: 00000000 00000000
57
+ // 2 byte: 00111111 00111111
58
+ __m128i utf8_mask = __lsx_vand_v(__lsx_vsle_bu(__lsx_vldi(0x80), perm),
59
+ __lsx_vldi(0b00111111));
60
+ // mask
61
+ // 1 byte: 11111111 11111111
62
+ // 2 byte: 00111111 00111111
63
+ __m128i mask = __lsx_vor_v(utf8_mask, ascii_mask);
64
+
65
+ __m128i composed = __lsx_vbitsel_v(__lsx_vsrli_h(perm, 2), perm, mask);
66
+ // writing 8 bytes even though we only care about the first 6 bytes.
67
+ __m128i latin1_packed = __lsx_vpickev_b(__lsx_vldi(0), composed);
68
+
69
+ __lsx_vst(latin1_packed, reinterpret_cast<uint8_t *>(latin1_output), 0);
70
+ latin1_output += 6; // We wrote 6 bytes.
71
+ return consumed;
72
+ }