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,155 @@
1
+ template <endianness big_endian>
2
+ std::pair<const char32_t *, char16_t *>
3
+ lsx_convert_utf32_to_utf16(const char32_t *buf, size_t len,
4
+ char16_t *utf16_out) {
5
+ uint16_t *utf16_output = reinterpret_cast<uint16_t *>(utf16_out);
6
+ const char32_t *end = buf + len;
7
+
8
+ __m128i forbidden_bytemask = __lsx_vrepli_h(0);
9
+ __m128i v_d800 = lsx_splat_u16(0xd800);
10
+ __m128i v_dfff = lsx_splat_u16(0xdfff);
11
+ while (end - buf >= 8) {
12
+ __m128i in0 = __lsx_vld(reinterpret_cast<const uint32_t *>(buf), 0);
13
+ __m128i in1 = __lsx_vld(reinterpret_cast<const uint32_t *>(buf), 16);
14
+
15
+ // Check if no bits set above 16th
16
+ if (__lsx_bz_v(__lsx_vpickod_h(in1, in0))) {
17
+ __m128i utf16_packed = __lsx_vpickev_h(in1, in0);
18
+ forbidden_bytemask = __lsx_vor_v(
19
+ __lsx_vand_v(
20
+ __lsx_vsle_h(utf16_packed, v_dfff), // utf16_packed <= 0xdfff
21
+ __lsx_vsle_h(v_d800, utf16_packed)), // utf16_packed >= 0xd800
22
+ forbidden_bytemask);
23
+
24
+ if simdutf_constexpr (!match_system(big_endian)) {
25
+ utf16_packed = lsx_swap_bytes(utf16_packed);
26
+ }
27
+ __lsx_vst(utf16_packed, utf16_output, 0);
28
+ utf16_output += 8;
29
+ buf += 8;
30
+ } else {
31
+ size_t forward = 3;
32
+ size_t k = 0;
33
+ if (size_t(end - buf) < forward + 1) {
34
+ forward = size_t(end - buf - 1);
35
+ }
36
+ for (; k < forward; k++) {
37
+ uint32_t word = buf[k];
38
+ if ((word & 0xFFFF0000) == 0) {
39
+ // will not generate a surrogate pair
40
+ if (word >= 0xD800 && word <= 0xDFFF) {
41
+ return std::make_pair(nullptr,
42
+ reinterpret_cast<char16_t *>(utf16_output));
43
+ }
44
+ *utf16_output++ = !match_system(big_endian)
45
+ ? char16_t(word >> 8 | word << 8)
46
+ : char16_t(word);
47
+ } else {
48
+ // will generate a surrogate pair
49
+ if (word > 0x10FFFF) {
50
+ return std::make_pair(nullptr,
51
+ reinterpret_cast<char16_t *>(utf16_output));
52
+ }
53
+ word -= 0x10000;
54
+ uint16_t high_surrogate = uint16_t(0xD800 + (word >> 10));
55
+ uint16_t low_surrogate = uint16_t(0xDC00 + (word & 0x3FF));
56
+ if simdutf_constexpr (!match_system(big_endian)) {
57
+ high_surrogate =
58
+ uint16_t(high_surrogate >> 8 | high_surrogate << 8);
59
+ low_surrogate = uint16_t(low_surrogate << 8 | low_surrogate >> 8);
60
+ }
61
+ *utf16_output++ = char16_t(high_surrogate);
62
+ *utf16_output++ = char16_t(low_surrogate);
63
+ }
64
+ }
65
+ buf += k;
66
+ }
67
+ }
68
+
69
+ // check for invalid input
70
+ if (__lsx_bnz_v(forbidden_bytemask)) {
71
+ return std::make_pair(nullptr, reinterpret_cast<char16_t *>(utf16_output));
72
+ }
73
+ return std::make_pair(buf, reinterpret_cast<char16_t *>(utf16_output));
74
+ }
75
+
76
+ template <endianness big_endian>
77
+ std::pair<result, char16_t *>
78
+ lsx_convert_utf32_to_utf16_with_errors(const char32_t *buf, size_t len,
79
+ char16_t *utf16_out) {
80
+ uint16_t *utf16_output = reinterpret_cast<uint16_t *>(utf16_out);
81
+ const char32_t *start = buf;
82
+ const char32_t *end = buf + len;
83
+
84
+ __m128i forbidden_bytemask = __lsx_vrepli_h(0);
85
+ __m128i v_d800 = lsx_splat_u16(0xd800);
86
+ __m128i v_dfff = lsx_splat_u16(0xdfff);
87
+
88
+ while (end - buf >= 8) {
89
+ __m128i in0 = __lsx_vld(reinterpret_cast<const uint32_t *>(buf), 0);
90
+ __m128i in1 = __lsx_vld(reinterpret_cast<const uint32_t *>(buf), 16);
91
+ // Check if no bits set above 16th
92
+ if (__lsx_bz_v(__lsx_vpickod_h(in1, in0))) {
93
+ __m128i utf16_packed = __lsx_vpickev_h(in1, in0);
94
+
95
+ forbidden_bytemask = __lsx_vor_v(
96
+ __lsx_vand_v(
97
+ __lsx_vsle_h(utf16_packed, v_dfff), // utf16_packed <= 0xdfff
98
+ __lsx_vsle_h(v_d800, utf16_packed)), // utf16_packed >= 0xd800
99
+ forbidden_bytemask);
100
+ if (__lsx_bnz_v(forbidden_bytemask)) {
101
+ return std::make_pair(result(error_code::SURROGATE, buf - start),
102
+ reinterpret_cast<char16_t *>(utf16_output));
103
+ }
104
+
105
+ if simdutf_constexpr (!match_system(big_endian)) {
106
+ utf16_packed = lsx_swap_bytes(utf16_packed);
107
+ }
108
+
109
+ __lsx_vst(utf16_packed, utf16_output, 0);
110
+ utf16_output += 8;
111
+ buf += 8;
112
+ } else {
113
+ size_t forward = 3;
114
+ size_t k = 0;
115
+ if (size_t(end - buf) < forward + 1) {
116
+ forward = size_t(end - buf - 1);
117
+ }
118
+ for (; k < forward; k++) {
119
+ uint32_t word = buf[k];
120
+ if ((word & 0xFFFF0000) == 0) {
121
+ // will not generate a surrogate pair
122
+ if (word >= 0xD800 && word <= 0xDFFF) {
123
+ return std::make_pair(
124
+ result(error_code::SURROGATE, buf - start + k),
125
+ reinterpret_cast<char16_t *>(utf16_output));
126
+ }
127
+ *utf16_output++ = !match_system(big_endian)
128
+ ? char16_t(word >> 8 | word << 8)
129
+ : char16_t(word);
130
+ } else {
131
+ // will generate a surrogate pair
132
+ if (word > 0x10FFFF) {
133
+ return std::make_pair(
134
+ result(error_code::TOO_LARGE, buf - start + k),
135
+ reinterpret_cast<char16_t *>(utf16_output));
136
+ }
137
+ word -= 0x10000;
138
+ uint16_t high_surrogate = uint16_t(0xD800 + (word >> 10));
139
+ uint16_t low_surrogate = uint16_t(0xDC00 + (word & 0x3FF));
140
+ if simdutf_constexpr (!match_system(big_endian)) {
141
+ high_surrogate =
142
+ uint16_t(high_surrogate >> 8 | high_surrogate << 8);
143
+ low_surrogate = uint16_t(low_surrogate << 8 | low_surrogate >> 8);
144
+ }
145
+ *utf16_output++ = char16_t(high_surrogate);
146
+ *utf16_output++ = char16_t(low_surrogate);
147
+ }
148
+ }
149
+ buf += k;
150
+ }
151
+ }
152
+
153
+ return std::make_pair(result(error_code::SUCCESS, buf - start),
154
+ reinterpret_cast<char16_t *>(utf16_output));
155
+ }
@@ -0,0 +1,459 @@
1
+ std::pair<const char32_t *, char *>
2
+ lsx_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
+ __m128i v_c080 = lsx_splat_u16(0xc080);
7
+ __m128i v_07ff = lsx_splat_u16(0x07ff);
8
+ __m128i v_dfff = lsx_splat_u16(0xdfff);
9
+ __m128i v_d800 = lsx_splat_u16(0xd800);
10
+ __m128i forbidden_bytemask = __lsx_vldi(0x0);
11
+
12
+ const size_t safety_margin =
13
+ 12; // to avoid overruns, see issue
14
+ // https://github.com/simdutf/simdutf/issues/92
15
+
16
+ while (end - buf > std::ptrdiff_t(16 + safety_margin)) {
17
+ __m128i in = __lsx_vld(reinterpret_cast<const uint32_t *>(buf), 0);
18
+ __m128i nextin = __lsx_vld(reinterpret_cast<const uint32_t *>(buf), 16);
19
+
20
+ // Check if no bits set above 16th
21
+ if (__lsx_bz_v(__lsx_vpickod_h(in, nextin))) {
22
+ // Pack UTF-32 to UTF-16 safely (without surrogate pairs)
23
+ // Apply UTF-16 => UTF-8 routine (lsx_convert_utf16_to_utf8.cpp)
24
+ __m128i utf16_packed = __lsx_vpickev_h(nextin, in);
25
+
26
+ if (__lsx_bz_v(__lsx_vslt_hu(__lsx_vrepli_h(0x7F),
27
+ utf16_packed))) { // ASCII fast path!!!!
28
+ // 1. pack the bytes
29
+ // obviously suboptimal.
30
+ __m128i utf8_packed = __lsx_vpickev_b(utf16_packed, utf16_packed);
31
+ // 2. store (8 bytes)
32
+ __lsx_vst(utf8_packed, utf8_output, 0);
33
+ // 3. adjust pointers
34
+ buf += 8;
35
+ utf8_output += 8;
36
+ continue; // we are done for this round!
37
+ }
38
+ __m128i zero = __lsx_vldi(0);
39
+ if (__lsx_bz_v(__lsx_vslt_hu(v_07ff, utf16_packed))) {
40
+ // 1. prepare 2-byte values
41
+ // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8
42
+ // expected output : [110a|aaaa|10bb|bbbb] x 8
43
+
44
+ // t0 = [000a|aaaa|bbbb|bb00]
45
+ const __m128i t0 = __lsx_vslli_h(utf16_packed, 2);
46
+ // t1 = [000a|aaaa|0000|0000]
47
+ const __m128i t1 = __lsx_vand_v(t0, lsx_splat_u16(0x1f00));
48
+ // t2 = [0000|0000|00bb|bbbb]
49
+ const __m128i t2 = __lsx_vand_v(utf16_packed, __lsx_vrepli_h(0x3f));
50
+ // t3 = [000a|aaaa|00bb|bbbb]
51
+ const __m128i t3 = __lsx_vor_v(t1, t2);
52
+ // t4 = [110a|aaaa|10bb|bbbb]
53
+ const __m128i t4 = __lsx_vor_v(t3, v_c080);
54
+ // 2. merge ASCII and 2-byte codewords
55
+ __m128i one_byte_bytemask =
56
+ __lsx_vsle_hu(utf16_packed, __lsx_vrepli_h(0x7F /*0x007F*/));
57
+ __m128i utf8_unpacked =
58
+ __lsx_vbitsel_v(t4, utf16_packed, one_byte_bytemask);
59
+ // 3. prepare bitmask for 8-bit lookup
60
+ uint32_t m2 =
61
+ __lsx_vpickve2gr_bu(__lsx_vmskltz_h(one_byte_bytemask), 0);
62
+ // 4. pack the bytes
63
+ const uint8_t *row =
64
+ &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes
65
+ [lsx_1_2_utf8_bytes_mask[m2]][0];
66
+ __m128i shuffle = __lsx_vld(row, 1);
67
+ __m128i utf8_packed = __lsx_vshuf_b(zero, utf8_unpacked, shuffle);
68
+ // 5. store bytes
69
+ __lsx_vst(utf8_packed, utf8_output, 0);
70
+
71
+ // 6. adjust pointers
72
+ buf += 8;
73
+ utf8_output += row[0];
74
+ continue;
75
+ } else {
76
+ // case: code units from register produce either 1, 2 or 3 UTF-8 bytes
77
+ forbidden_bytemask = __lsx_vor_v(
78
+ __lsx_vand_v(
79
+ __lsx_vsle_h(utf16_packed, v_dfff), // utf16_packed <= 0xdfff
80
+ __lsx_vsle_h(v_d800, utf16_packed)), // utf16_packed >= 0xd800
81
+ forbidden_bytemask);
82
+ /* In this branch we handle three cases:
83
+ 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - single
84
+ UFT-8 byte
85
+ 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] - two
86
+ UTF-8 bytes
87
+ 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - three
88
+ UTF-8 bytes
89
+
90
+ We expand the input word (16-bit) into two code units (32-bit), thus
91
+ we have room for four bytes. However, we need five distinct bit
92
+ layouts. Note that the last byte in cases #2 and #3 is the same.
93
+
94
+ We precompute byte 1 for case #1 and the common byte for cases #2 & #3
95
+ in register t2.
96
+
97
+ We precompute byte 1 for case #3 and -- **conditionally** -- precompute
98
+ either byte 1 for case #2 or byte 2 for case #3. Note that they
99
+ differ by exactly one bit.
100
+
101
+ Finally from these two code units we build proper UTF-8 sequence, taking
102
+ into account the case (i.e, the number of bytes to write).
103
+ */
104
+ /**
105
+ * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce:
106
+ * t2 => [0ccc|cccc] [10cc|cccc]
107
+ * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb])
108
+ */
109
+ // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc]
110
+ __m128i t0 = __lsx_vpickev_b(utf16_packed, utf16_packed);
111
+ t0 = __lsx_vilvl_b(t0, t0);
112
+ // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc]
113
+ __m128i v_3f7f = __lsx_vreplgr2vr_h(uint16_t(0x3F7F));
114
+ __m128i t1 = __lsx_vand_v(t0, v_3f7f);
115
+ // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc]
116
+ __m128i t2 = __lsx_vor_v(t1, lsx_splat_u16(0x8000));
117
+
118
+ // s0: [aaaa|bbbb|bbcc|cccc] => [0000|0000|0000|aaaa]
119
+ __m128i s0 = __lsx_vsrli_h(utf16_packed, 12);
120
+ // s1: [aaaa|bbbb|bbcc|cccc] => [0000|bbbb|bb00|0000]
121
+ __m128i s1 = __lsx_vslli_h(utf16_packed, 2);
122
+ // [0000|bbbb|bb00|0000] => [00bb|bbbb|0000|0000]
123
+ s1 = __lsx_vand_v(s1, lsx_splat_u16(0x3F00));
124
+ // [00bb|bbbb|0000|aaaa]
125
+ __m128i s2 = __lsx_vor_v(s0, s1);
126
+ // s3: [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa]
127
+ __m128i v_c0e0 = __lsx_vreplgr2vr_h(uint16_t(0xC0E0));
128
+ __m128i s3 = __lsx_vor_v(s2, v_c0e0);
129
+ __m128i one_or_two_bytes_bytemask = __lsx_vsle_hu(utf16_packed, v_07ff);
130
+ __m128i m0 =
131
+ __lsx_vandn_v(one_or_two_bytes_bytemask, lsx_splat_u16(0x4000));
132
+ __m128i s4 = __lsx_vxor_v(s3, m0);
133
+
134
+ // 4. expand code units 16-bit => 32-bit
135
+ __m128i out0 = __lsx_vilvl_h(s4, t2);
136
+ __m128i out1 = __lsx_vilvh_h(s4, t2);
137
+
138
+ // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle
139
+ __m128i one_byte_bytemask =
140
+ __lsx_vsle_hu(utf16_packed, __lsx_vrepli_h(0x7F));
141
+
142
+ __m128i one_or_two_bytes_bytemask_u16_to_u32_low =
143
+ __lsx_vilvl_h(one_or_two_bytes_bytemask, zero);
144
+ __m128i one_or_two_bytes_bytemask_u16_to_u32_high =
145
+ __lsx_vilvh_h(one_or_two_bytes_bytemask, zero);
146
+
147
+ __m128i one_byte_bytemask_u16_to_u32_low =
148
+ __lsx_vilvl_h(one_byte_bytemask, one_byte_bytemask);
149
+ __m128i one_byte_bytemask_u16_to_u32_high =
150
+ __lsx_vilvh_h(one_byte_bytemask, one_byte_bytemask);
151
+
152
+ const uint32_t mask0 =
153
+ __lsx_vpickve2gr_bu(__lsx_vmskltz_h(__lsx_vor_v(
154
+ one_or_two_bytes_bytemask_u16_to_u32_low,
155
+ one_byte_bytemask_u16_to_u32_low)),
156
+ 0);
157
+ const uint32_t mask1 =
158
+ __lsx_vpickve2gr_bu(__lsx_vmskltz_h(__lsx_vor_v(
159
+ one_or_two_bytes_bytemask_u16_to_u32_high,
160
+ one_byte_bytemask_u16_to_u32_high)),
161
+ 0);
162
+
163
+ const uint8_t *row0 =
164
+ &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0];
165
+ __m128i shuffle0 = __lsx_vld(row0, 1);
166
+ __m128i utf8_0 = __lsx_vshuf_b(zero, out0, shuffle0);
167
+
168
+ const uint8_t *row1 =
169
+ &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0];
170
+ __m128i shuffle1 = __lsx_vld(row1, 1);
171
+ __m128i utf8_1 = __lsx_vshuf_b(zero, out1, shuffle1);
172
+
173
+ __lsx_vst(utf8_0, utf8_output, 0);
174
+ utf8_output += row0[0];
175
+ __lsx_vst(utf8_1, utf8_output, 0);
176
+ utf8_output += row1[0];
177
+
178
+ buf += 8;
179
+ }
180
+ // At least one 32-bit word will produce a surrogate pair in UTF-16 <=>
181
+ // will produce four UTF-8 bytes.
182
+ } else {
183
+ // Let us do a scalar fallback.
184
+ // It may seem wasteful to use scalar code, but being efficient with SIMD
185
+ // in the presence of surrogate pairs may require non-trivial tables.
186
+ size_t forward = 15;
187
+ size_t k = 0;
188
+ if (size_t(end - buf) < forward + 1) {
189
+ forward = size_t(end - buf - 1);
190
+ }
191
+ for (; k < forward; k++) {
192
+ uint32_t word = buf[k];
193
+ if ((word & 0xFFFFFF80) == 0) {
194
+ *utf8_output++ = char(word);
195
+ } else if ((word & 0xFFFFF800) == 0) {
196
+ *utf8_output++ = char((word >> 6) | 0b11000000);
197
+ *utf8_output++ = char((word & 0b111111) | 0b10000000);
198
+ } else if ((word & 0xFFFF0000) == 0) {
199
+ if (word >= 0xD800 && word <= 0xDFFF) {
200
+ return std::make_pair(nullptr,
201
+ reinterpret_cast<char *>(utf8_output));
202
+ }
203
+ *utf8_output++ = char((word >> 12) | 0b11100000);
204
+ *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000);
205
+ *utf8_output++ = char((word & 0b111111) | 0b10000000);
206
+ } else {
207
+ if (word > 0x10FFFF) {
208
+ return std::make_pair(nullptr,
209
+ reinterpret_cast<char *>(utf8_output));
210
+ }
211
+ *utf8_output++ = char((word >> 18) | 0b11110000);
212
+ *utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000);
213
+ *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000);
214
+ *utf8_output++ = char((word & 0b111111) | 0b10000000);
215
+ }
216
+ }
217
+ buf += k;
218
+ }
219
+ } // while
220
+
221
+ // check for invalid input
222
+ if (__lsx_bnz_v(forbidden_bytemask)) {
223
+ return std::make_pair(nullptr, reinterpret_cast<char *>(utf8_output));
224
+ }
225
+
226
+ return std::make_pair(buf, reinterpret_cast<char *>(utf8_output));
227
+ }
228
+
229
+ std::pair<result, char *>
230
+ lsx_convert_utf32_to_utf8_with_errors(const char32_t *buf, size_t len,
231
+ char *utf8_out) {
232
+ uint8_t *utf8_output = reinterpret_cast<uint8_t *>(utf8_out);
233
+ const char32_t *start = buf;
234
+ const char32_t *end = buf + len;
235
+
236
+ __m128i v_c080 = lsx_splat_u16(0xc080);
237
+ __m128i v_07ff = lsx_splat_u16(0x07ff);
238
+ __m128i v_dfff = lsx_splat_u16(0xdfff);
239
+ __m128i v_d800 = lsx_splat_u16(0xd800);
240
+ __m128i forbidden_bytemask = __lsx_vldi(0x0);
241
+ const size_t safety_margin =
242
+ 12; // to avoid overruns, see issue
243
+ // https://github.com/simdutf/simdutf/issues/92
244
+
245
+ while (end - buf > std::ptrdiff_t(16 + safety_margin)) {
246
+ __m128i in = __lsx_vld(reinterpret_cast<const uint32_t *>(buf), 0);
247
+ __m128i nextin = __lsx_vld(reinterpret_cast<const uint32_t *>(buf), 16);
248
+
249
+ // Check if no bits set above 16th
250
+ if (__lsx_bz_v(__lsx_vpickod_h(in, nextin))) {
251
+ // Pack UTF-32 to UTF-16 safely (without surrogate pairs)
252
+ // Apply UTF-16 => UTF-8 routine (lsx_convert_utf16_to_utf8.cpp)
253
+ __m128i utf16_packed = __lsx_vpickev_h(nextin, in);
254
+
255
+ if (__lsx_bz_v(__lsx_vslt_hu(__lsx_vrepli_h(0x7F),
256
+ utf16_packed))) { // ASCII fast path!!!!
257
+ // 1. pack the bytes
258
+ // obviously suboptimal.
259
+ __m128i utf8_packed = __lsx_vpickev_b(utf16_packed, utf16_packed);
260
+ // 2. store (8 bytes)
261
+ __lsx_vst(utf8_packed, utf8_output, 0);
262
+ // 3. adjust pointers
263
+ buf += 8;
264
+ utf8_output += 8;
265
+ continue; // we are done for this round!
266
+ }
267
+ __m128i zero = __lsx_vldi(0);
268
+ if (__lsx_bz_v(__lsx_vslt_hu(v_07ff, utf16_packed))) {
269
+ // 1. prepare 2-byte values
270
+ // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8
271
+ // expected output : [110a|aaaa|10bb|bbbb] x 8
272
+
273
+ // t0 = [000a|aaaa|bbbb|bb00]
274
+ const __m128i t0 = __lsx_vslli_h(utf16_packed, 2);
275
+ // t1 = [000a|aaaa|0000|0000]
276
+ const __m128i t1 = __lsx_vand_v(t0, lsx_splat_u16(0x1f00));
277
+ // t2 = [0000|0000|00bb|bbbb]
278
+ const __m128i t2 = __lsx_vand_v(utf16_packed, __lsx_vrepli_h(0x3f));
279
+ // t3 = [000a|aaaa|00bb|bbbb]
280
+ const __m128i t3 = __lsx_vor_v(t1, t2);
281
+ // t4 = [110a|aaaa|10bb|bbbb]
282
+ const __m128i t4 = __lsx_vor_v(t3, v_c080);
283
+ // 2. merge ASCII and 2-byte codewords
284
+ __m128i one_byte_bytemask =
285
+ __lsx_vsle_hu(utf16_packed, __lsx_vrepli_h(0x7F /*0x007F*/));
286
+ __m128i utf8_unpacked =
287
+ __lsx_vbitsel_v(t4, utf16_packed, one_byte_bytemask);
288
+ // 3. prepare bitmask for 8-bit lookup
289
+ uint32_t m2 =
290
+ __lsx_vpickve2gr_bu(__lsx_vmskltz_h(one_byte_bytemask), 0);
291
+ // 4. pack the bytes
292
+ const uint8_t *row =
293
+ &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes
294
+ [lsx_1_2_utf8_bytes_mask[m2]][0];
295
+ __m128i shuffle = __lsx_vld(row, 1);
296
+ __m128i utf8_packed = __lsx_vshuf_b(zero, utf8_unpacked, shuffle);
297
+ // 5. store bytes
298
+ __lsx_vst(utf8_packed, utf8_output, 0);
299
+
300
+ // 6. adjust pointers
301
+ buf += 8;
302
+ utf8_output += row[0];
303
+ continue;
304
+ } else {
305
+ // case: code units from register produce either 1, 2 or 3 UTF-8 bytes
306
+ forbidden_bytemask = __lsx_vor_v(
307
+ __lsx_vand_v(
308
+ __lsx_vsle_h(utf16_packed, v_dfff), // utf16_packed <= 0xdfff
309
+ __lsx_vsle_h(v_d800, utf16_packed)), // utf16_packed >= 0xd800
310
+ forbidden_bytemask);
311
+ if (__lsx_bnz_v(forbidden_bytemask)) {
312
+ return std::make_pair(result(error_code::SURROGATE, buf - start),
313
+ reinterpret_cast<char *>(utf8_output));
314
+ }
315
+ /* In this branch we handle three cases:
316
+ 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] - single
317
+ UFT-8 byte
318
+ 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] - two
319
+ UTF-8 bytes
320
+ 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] - three
321
+ UTF-8 bytes
322
+
323
+ We expand the input word (16-bit) into two code units (32-bit), thus
324
+ we have room for four bytes. However, we need five distinct bit
325
+ layouts. Note that the last byte in cases #2 and #3 is the same.
326
+
327
+ We precompute byte 1 for case #1 and the common byte for cases #2 & #3
328
+ in register t2.
329
+
330
+ We precompute byte 1 for case #3 and -- **conditionally** -- precompute
331
+ either byte 1 for case #2 or byte 2 for case #3. Note that they
332
+ differ by exactly one bit.
333
+
334
+ Finally from these two code units we build proper UTF-8 sequence, taking
335
+ into account the case (i.e, the number of bytes to write).
336
+ */
337
+ /**
338
+ * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce:
339
+ * t2 => [0ccc|cccc] [10cc|cccc]
340
+ * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb])
341
+ */
342
+ // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc]
343
+ __m128i t0 = __lsx_vpickev_b(utf16_packed, utf16_packed);
344
+ t0 = __lsx_vilvl_b(t0, t0);
345
+ // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc]
346
+ __m128i v_3f7f = __lsx_vreplgr2vr_h(uint16_t(0x3F7F));
347
+ __m128i t1 = __lsx_vand_v(t0, v_3f7f);
348
+ // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc]
349
+ __m128i t2 = __lsx_vor_v(t1, lsx_splat_u16(0x8000));
350
+
351
+ // s0: [aaaa|bbbb|bbcc|cccc] => [0000|0000|0000|aaaa]
352
+ __m128i s0 = __lsx_vsrli_h(utf16_packed, 12);
353
+ // s1: [aaaa|bbbb|bbcc|cccc] => [0000|bbbb|bb00|0000]
354
+ __m128i s1 = __lsx_vslli_h(utf16_packed, 2);
355
+ // [0000|bbbb|bb00|0000] => [00bb|bbbb|0000|0000]
356
+ s1 = __lsx_vand_v(s1, lsx_splat_u16(0x3F00));
357
+ // [00bb|bbbb|0000|aaaa]
358
+ __m128i s2 = __lsx_vor_v(s0, s1);
359
+ // s3: [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa]
360
+ __m128i v_c0e0 = __lsx_vreplgr2vr_h(uint16_t(0xC0E0));
361
+ __m128i s3 = __lsx_vor_v(s2, v_c0e0);
362
+ // __m128i v_07ff = vmovq_n_u16((uint16_t)0x07FF);
363
+ __m128i one_or_two_bytes_bytemask = __lsx_vsle_hu(utf16_packed, v_07ff);
364
+ __m128i m0 =
365
+ __lsx_vandn_v(one_or_two_bytes_bytemask, lsx_splat_u16(0x4000));
366
+ __m128i s4 = __lsx_vxor_v(s3, m0);
367
+
368
+ // 4. expand code units 16-bit => 32-bit
369
+ __m128i out0 = __lsx_vilvl_h(s4, t2);
370
+ __m128i out1 = __lsx_vilvh_h(s4, t2);
371
+
372
+ // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle
373
+ __m128i one_byte_bytemask =
374
+ __lsx_vsle_hu(utf16_packed, __lsx_vrepli_h(0x7F));
375
+
376
+ __m128i one_or_two_bytes_bytemask_u16_to_u32_low =
377
+ __lsx_vilvl_h(one_or_two_bytes_bytemask, zero);
378
+ __m128i one_or_two_bytes_bytemask_u16_to_u32_high =
379
+ __lsx_vilvh_h(one_or_two_bytes_bytemask, zero);
380
+
381
+ __m128i one_byte_bytemask_u16_to_u32_low =
382
+ __lsx_vilvl_h(one_byte_bytemask, one_byte_bytemask);
383
+ __m128i one_byte_bytemask_u16_to_u32_high =
384
+ __lsx_vilvh_h(one_byte_bytemask, one_byte_bytemask);
385
+
386
+ const uint32_t mask0 =
387
+ __lsx_vpickve2gr_bu(__lsx_vmskltz_h(__lsx_vor_v(
388
+ one_or_two_bytes_bytemask_u16_to_u32_low,
389
+ one_byte_bytemask_u16_to_u32_low)),
390
+ 0);
391
+ const uint32_t mask1 =
392
+ __lsx_vpickve2gr_bu(__lsx_vmskltz_h(__lsx_vor_v(
393
+ one_or_two_bytes_bytemask_u16_to_u32_high,
394
+ one_byte_bytemask_u16_to_u32_high)),
395
+ 0);
396
+
397
+ const uint8_t *row0 =
398
+ &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0];
399
+ __m128i shuffle0 = __lsx_vld(row0, 1);
400
+ __m128i utf8_0 = __lsx_vshuf_b(zero, out0, shuffle0);
401
+
402
+ const uint8_t *row1 =
403
+ &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0];
404
+ __m128i shuffle1 = __lsx_vld(row1, 1);
405
+ __m128i utf8_1 = __lsx_vshuf_b(zero, out1, shuffle1);
406
+
407
+ __lsx_vst(utf8_0, utf8_output, 0);
408
+ utf8_output += row0[0];
409
+ __lsx_vst(utf8_1, utf8_output, 0);
410
+ utf8_output += row1[0];
411
+
412
+ buf += 8;
413
+ }
414
+ // At least one 32-bit word will produce a surrogate pair in UTF-16 <=>
415
+ // will produce four UTF-8 bytes.
416
+ } else {
417
+ // Let us do a scalar fallback.
418
+ // It may seem wasteful to use scalar code, but being efficient with SIMD
419
+ // in the presence of surrogate pairs may require non-trivial tables.
420
+ size_t forward = 15;
421
+ size_t k = 0;
422
+ if (size_t(end - buf) < forward + 1) {
423
+ forward = size_t(end - buf - 1);
424
+ }
425
+ for (; k < forward; k++) {
426
+ uint32_t word = buf[k];
427
+ if ((word & 0xFFFFFF80) == 0) {
428
+ *utf8_output++ = char(word);
429
+ } else if ((word & 0xFFFFF800) == 0) {
430
+ *utf8_output++ = char((word >> 6) | 0b11000000);
431
+ *utf8_output++ = char((word & 0b111111) | 0b10000000);
432
+ } else if ((word & 0xFFFF0000) == 0) {
433
+ if (word >= 0xD800 && word <= 0xDFFF) {
434
+ return std::make_pair(
435
+ result(error_code::SURROGATE, buf - start + k),
436
+ reinterpret_cast<char *>(utf8_output));
437
+ }
438
+ *utf8_output++ = char((word >> 12) | 0b11100000);
439
+ *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000);
440
+ *utf8_output++ = char((word & 0b111111) | 0b10000000);
441
+ } else {
442
+ if (word > 0x10FFFF) {
443
+ return std::make_pair(
444
+ result(error_code::TOO_LARGE, buf - start + k),
445
+ reinterpret_cast<char *>(utf8_output));
446
+ }
447
+ *utf8_output++ = char((word >> 18) | 0b11110000);
448
+ *utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000);
449
+ *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000);
450
+ *utf8_output++ = char((word & 0b111111) | 0b10000000);
451
+ }
452
+ }
453
+ buf += k;
454
+ }
455
+ } // while
456
+
457
+ return std::make_pair(result(error_code::SUCCESS, buf - start),
458
+ reinterpret_cast<char *>(utf8_output));
459
+ }
@@ -0,0 +1,75 @@
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
+ uint64_t buffer[2];
70
+ // __lsx_vst(latin1_packed, reinterpret_cast<uint8_t *>(latin1_output), 0);
71
+ __lsx_vst(latin1_packed, reinterpret_cast<uint8_t *>(buffer), 0);
72
+ std::memcpy(latin1_output, buffer, 6);
73
+ latin1_output += 6; // We wrote 6 bytes.
74
+ return consumed;
75
+ }