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,313 @@
1
+ // Convert up to 16 bytes from utf8 to utf16 using a mask indicating the
2
+ // end of the code points. Only the least significant 12 bits of the mask
3
+ // are accessed.
4
+ // It returns how many bytes were consumed (up to 16, usually 12).
5
+ template <endianness big_endian>
6
+ size_t convert_masked_utf8_to_utf16(const char *input,
7
+ uint64_t utf8_end_of_code_point_mask,
8
+ char16_t *&utf16_output) {
9
+ // we use an approach where we try to process up to 12 input bytes.
10
+ // Why 12 input bytes and not 16? Because we are concerned with the size of
11
+ // the lookup tables. Also 12 is nicely divisible by two and three.
12
+ //
13
+ uint8x16_t in = vld1q_u8(reinterpret_cast<const uint8_t *>(input));
14
+ const uint16_t input_utf8_end_of_code_point_mask =
15
+ utf8_end_of_code_point_mask & 0xfff;
16
+ //
17
+ // Optimization note: our main path below is load-latency dependent. Thus it
18
+ // is maybe beneficial to have fast paths that depend on branch prediction but
19
+ // have less latency. This results in more instructions but, potentially, also
20
+ // higher speeds.
21
+
22
+ // We first try a few fast paths.
23
+ // The obvious first test is ASCII, which actually consumes the full 16.
24
+ if ((utf8_end_of_code_point_mask & 0xFFFF) == 0xffff) {
25
+ // We process in chunks of 16 bytes
26
+ // The routine in simd.h is reused.
27
+ simd8<int8_t> temp{vreinterpretq_s8_u8(in)};
28
+ temp.store_ascii_as_utf16<big_endian>(utf16_output);
29
+ utf16_output += 16; // We wrote 16 16-bit characters.
30
+ return 16; // We consumed 16 bytes.
31
+ }
32
+
33
+ // 3 byte sequences are the next most common, as seen in CJK, which has long
34
+ // sequences of these.
35
+ if (input_utf8_end_of_code_point_mask == 0x924) {
36
+ // We want to take 4 3-byte UTF-8 code units and turn them into 4 2-byte
37
+ // UTF-16 code units.
38
+ uint16x4_t composed = convert_utf8_3_byte_to_utf16(in);
39
+ // Byte swap if necessary
40
+ if simdutf_constexpr (!match_system(big_endian)) {
41
+ composed = vreinterpret_u16_u8(vrev16_u8(vreinterpret_u8_u16(composed)));
42
+ }
43
+ vst1_u16(reinterpret_cast<uint16_t *>(utf16_output), composed);
44
+ utf16_output += 4; // We wrote 4 16-bit characters.
45
+ return 12; // We consumed 12 bytes.
46
+ }
47
+
48
+ // 2 byte sequences occur in short bursts in languages like Greek and Russian.
49
+ if ((utf8_end_of_code_point_mask & 0xFFF) == 0xaaa) {
50
+ // We want to take 6 2-byte UTF-8 code units and turn them into 6 2-byte
51
+ // UTF-16 code units.
52
+ uint16x8_t composed = convert_utf8_2_byte_to_utf16(in);
53
+ // Byte swap if necessary
54
+ if simdutf_constexpr (!match_system(big_endian)) {
55
+ composed =
56
+ vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(composed)));
57
+ }
58
+ vst1q_u16(reinterpret_cast<uint16_t *>(utf16_output), composed);
59
+
60
+ utf16_output += 6; // We wrote 6 16-bit characters.
61
+ return 12; // We consumed 12 bytes.
62
+ }
63
+
64
+ /// We do not have a fast path available, or the fast path is unimportant, so
65
+ /// we fallback.
66
+ const uint8_t idx = simdutf::tables::utf8_to_utf16::utf8bigindex
67
+ [input_utf8_end_of_code_point_mask][0];
68
+
69
+ const uint8_t consumed = simdutf::tables::utf8_to_utf16::utf8bigindex
70
+ [input_utf8_end_of_code_point_mask][1];
71
+
72
+ if (idx < 64) {
73
+ // SIX (6) input code-code units
74
+ // Convert to UTF-16
75
+ uint16x8_t composed = convert_utf8_1_to_2_byte_to_utf16(in, idx);
76
+ // Byte swap if necessary
77
+ if simdutf_constexpr (!match_system(big_endian)) {
78
+ composed =
79
+ vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(composed)));
80
+ }
81
+ // Store
82
+ vst1q_u16(reinterpret_cast<uint16_t *>(utf16_output), composed);
83
+ utf16_output += 6; // We wrote 6 16-bit characters.
84
+ return consumed;
85
+ } else if (idx < 145) {
86
+ // FOUR (4) input code-code units
87
+ // UTF-16 and UTF-32 use similar algorithms, but UTF-32 skips the narrowing.
88
+ uint8x16_t sh = vld1q_u8(reinterpret_cast<const uint8_t *>(
89
+ simdutf::tables::utf8_to_utf16::shufutf8[idx]));
90
+ // XXX: depending on the system scalar instructions might be faster.
91
+ // 1 byte: 00000000 00000000 0ccccccc
92
+ // 2 byte: 00000000 110bbbbb 10cccccc
93
+ // 3 byte: 1110aaaa 10bbbbbb 10cccccc
94
+ uint32x4_t perm = vreinterpretq_u32_u8(vqtbl1q_u8(in, sh));
95
+ // 1 byte: 00000000 0ccccccc
96
+ // 2 byte: xx0bbbbb x0cccccc
97
+ // 3 byte: xxbbbbbb x0cccccc
98
+ uint16x4_t lowperm = vmovn_u32(perm);
99
+ // Partially mask with bic (doesn't require a temporary register unlike and)
100
+ // The shift left insert below will clear the top bits.
101
+ // 1 byte: 00000000 00000000
102
+ // 2 byte: xx0bbbbb 00000000
103
+ // 3 byte: xxbbbbbb 00000000
104
+ uint16x4_t middlebyte = vbic_u16(lowperm, vmov_n_u16(uint16_t(~0xFF00)));
105
+ // ASCII
106
+ // 1 byte: 00000000 0ccccccc
107
+ // 2+byte: 00000000 00cccccc
108
+ uint16x4_t ascii = vand_u16(lowperm, vmov_n_u16(0x7F));
109
+ // Split into narrow vectors.
110
+ // 2 byte: 00000000 00000000
111
+ // 3 byte: 00000000 xxxxaaaa
112
+ uint16x4_t highperm = vshrn_n_u32(perm, 16);
113
+ // Shift right accumulate the middle byte
114
+ // 1 byte: 00000000 0ccccccc
115
+ // 2 byte: 00xx0bbb bbcccccc
116
+ // 3 byte: 00xxbbbb bbcccccc
117
+ uint16x4_t middlelow = vsra_n_u16(ascii, middlebyte, 2);
118
+ // Shift left and insert the top 4 bits, overwriting the garbage
119
+ // 1 byte: 00000000 0ccccccc
120
+ // 2 byte: 00000bbb bbcccccc
121
+ // 3 byte: aaaabbbb bbcccccc
122
+ uint16x4_t composed = vsli_n_u16(middlelow, highperm, 12);
123
+ // Byte swap if necessary
124
+ if simdutf_constexpr (!match_system(big_endian)) {
125
+ composed = vreinterpret_u16_u8(vrev16_u8(vreinterpret_u8_u16(composed)));
126
+ }
127
+ vst1_u16(reinterpret_cast<uint16_t *>(utf16_output), composed);
128
+
129
+ utf16_output += 4; // We wrote 4 16-bit codepoints
130
+ return consumed;
131
+ } else if (idx < 209) {
132
+ // THREE (3) input code-code units
133
+ if (input_utf8_end_of_code_point_mask == 0x888) {
134
+ // We want to take 3 4-byte UTF-8 code units and turn them into 3 4-byte
135
+ // UTF-16 pairs. Generating surrogate pairs is a little tricky though, but
136
+ // it is easier when we can assume they are all pairs. This version does
137
+ // not use the LUT, but 4 byte sequences are less common and the overhead
138
+ // of the extra memory access is less important than the early branch
139
+ // overhead in shorter sequences.
140
+
141
+ // Swap byte pairs
142
+ // 10dddddd 10cccccc|10bbbbbb 11110aaa
143
+ // 10cccccc 10dddddd|11110aaa 10bbbbbb
144
+ uint8x16_t swap = vrev16q_u8(in);
145
+ // Shift left 2 bits
146
+ // cccccc00 dddddd00 xxxxxxxx bbbbbb00
147
+ uint32x4_t shift = vreinterpretq_u32_u8(vshlq_n_u8(swap, 2));
148
+ // Create a magic number containing the low 2 bits of the trail surrogate
149
+ // and all the corrections needed to create the pair. UTF-8 4b prefix =
150
+ // -0x0000|0xF000 surrogate offset = -0x0000|0x0040 (0x10000 << 6)
151
+ // surrogate high = +0x0000|0xD800
152
+ // surrogate low = +0xDC00|0x0000
153
+ // -------------------------------
154
+ // = +0xDC00|0xE7C0
155
+ uint32x4_t magic = vmovq_n_u32(0xDC00E7C0);
156
+ // Generate unadjusted trail surrogate minus lowest 2 bits
157
+ // xxxxxxxx xxxxxxxx|11110aaa bbbbbb00
158
+ uint32x4_t trail =
159
+ vbslq_u32(vmovq_n_u32(0x0000FF00), vreinterpretq_u32_u8(swap), shift);
160
+ // Insert low 2 bits of trail surrogate to magic number for later
161
+ // 11011100 00000000 11100111 110000cc
162
+ uint16x8_t magic_with_low_2 =
163
+ vreinterpretq_u16_u32(vsraq_n_u32(magic, shift, 30));
164
+ // Generate lead surrogate
165
+ // xxxxcccc ccdddddd|xxxxxxxx xxxxxxxx
166
+ uint32x4_t lead = vreinterpretq_u32_u16(
167
+ vsliq_n_u16(vreinterpretq_u16_u8(swap), vreinterpretq_u16_u8(in), 6));
168
+ // Mask out lead
169
+ // 000000cc ccdddddd|xxxxxxxx xxxxxxxx
170
+ lead = vbicq_u32(lead, vmovq_n_u32(uint32_t(~0x03FFFFFF)));
171
+ // Blend pairs
172
+ // 000000cc ccdddddd|11110aaa bbbbbb00
173
+ uint16x8_t blend = vreinterpretq_u16_u32(
174
+ vbslq_u32(vmovq_n_u32(0x0000FFFF), trail, lead));
175
+ // Add magic number to finish the result
176
+ // 110111CC CCDDDDDD|110110AA BBBBBBCC
177
+ uint16x8_t composed = vaddq_u16(blend, magic_with_low_2);
178
+ // Byte swap if necessary
179
+ if simdutf_constexpr (!match_system(big_endian)) {
180
+ composed =
181
+ vreinterpretq_u16_u8(vrev16q_u8(vreinterpretq_u8_u16(composed)));
182
+ }
183
+ uint16_t buffer[8];
184
+ vst1q_u16(reinterpret_cast<uint16_t *>(buffer), composed);
185
+ for (int k = 0; k < 6; k++) {
186
+ utf16_output[k] = buffer[k];
187
+ } // the loop might compiler to a couple of instructions.
188
+ // We need some validation. See
189
+ // https://github.com/simdutf/simdutf/pull/631
190
+ #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
191
+ uint8x16_t expected_mask = simdutf_make_uint8x16_t(
192
+ 0xf8, 0xc0, 0xc0, 0xc0, 0xf8, 0xc0, 0xc0, 0xc0, 0xf8, 0xc0, 0xc0,
193
+ 0xc0, 0x0, 0x0, 0x0, 0x0);
194
+ #else
195
+ uint8x16_t expected_mask = {0xf8, 0xc0, 0xc0, 0xc0, 0xf8, 0xc0,
196
+ 0xc0, 0xc0, 0xf8, 0xc0, 0xc0, 0xc0,
197
+ 0x0, 0x0, 0x0, 0x0};
198
+ #endif
199
+ #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
200
+ uint8x16_t expected = simdutf_make_uint8x16_t(
201
+ 0xf0, 0x80, 0x80, 0x80, 0xf0, 0x80, 0x80, 0x80, 0xf0, 0x80, 0x80,
202
+ 0x80, 0x0, 0x0, 0x0, 0x0);
203
+ #else
204
+ uint8x16_t expected = {0xf0, 0x80, 0x80, 0x80, 0xf0, 0x80, 0x80, 0x80,
205
+ 0xf0, 0x80, 0x80, 0x80, 0x0, 0x0, 0x0, 0x0};
206
+ #endif
207
+ uint8x16_t check = vceqq_u8(vandq_u8(in, expected_mask), expected);
208
+ bool correct = (vminvq_u32(vreinterpretq_u32_u8(check)) == 0xFFFFFFFF);
209
+ // The validation is just three instructions and it is not on a critical
210
+ // path.
211
+ if (correct) {
212
+ utf16_output += 6; // We wrote 3 32-bit surrogate pairs.
213
+ }
214
+ return 12; // We consumed 12 bytes.
215
+ }
216
+ // 3 1-4 byte sequences
217
+ uint8x16_t sh = vld1q_u8(reinterpret_cast<const uint8_t *>(
218
+ simdutf::tables::utf8_to_utf16::shufutf8[idx]));
219
+
220
+ // 1 byte: 00000000 00000000 00000000 0ddddddd
221
+ // 3 byte: 00000000 00000000 110ccccc 10dddddd
222
+ // 3 byte: 00000000 1110bbbb 10cccccc 10dddddd
223
+ // 4 byte: 11110aaa 10bbbbbb 10cccccc 10dddddd
224
+ uint32x4_t perm = vreinterpretq_u32_u8(vqtbl1q_u8(in, sh));
225
+ // added to fix issue https://github.com/simdutf/simdutf/issues/514
226
+ // We only want to write 2 * 16-bit code units when that is actually what we
227
+ // have. Unfortunately, we cannot trust the input. So it is possible to get
228
+ // 0xff as an input byte and it should not result in a surrogate pair. We
229
+ // need to check for that.
230
+ uint32_t permbuffer[4];
231
+ vst1q_u32(permbuffer, perm);
232
+ // Mask the low and middle bytes
233
+ // 00000000 00000000 00000000 0ddddddd
234
+ uint32x4_t ascii = vandq_u32(perm, vmovq_n_u32(0x7f));
235
+ // Because the surrogates need more work, the high surrogate is computed
236
+ // first.
237
+ uint32x4_t middlehigh = vshlq_n_u32(perm, 2);
238
+ // 00000000 00000000 00cccccc 00000000
239
+ uint32x4_t middlebyte = vandq_u32(perm, vmovq_n_u32(0x3F00));
240
+ // Start assembling the sequence. Since the 4th byte is in the same position
241
+ // as it would be in a surrogate and there is no dependency, shift left
242
+ // instead of right. 3 byte: 00000000 10bbbbxx xxxxxxxx xxxxxxxx 4 byte:
243
+ // 11110aaa bbbbbbxx xxxxxxxx xxxxxxxx
244
+ uint32x4_t ab = vbslq_u32(vmovq_n_u32(0xFF000000), perm, middlehigh);
245
+ // Top 16 bits contains the high ten bits of the surrogate pair before
246
+ // correction 3 byte: 00000000 10bbbbcc|cccc0000 00000000 4 byte: 11110aaa
247
+ // bbbbbbcc|cccc0000 00000000 - high 10 bits correct w/o correction
248
+ uint32x4_t abc =
249
+ vbslq_u32(vmovq_n_u32(0xFFFC0000), ab, vshlq_n_u32(middlebyte, 4));
250
+ // Combine the low 6 or 7 bits by a shift right accumulate
251
+ // 3 byte: 00000000 00000010|bbbbcccc ccdddddd - low 16 bits correct
252
+ // 4 byte: 00000011 110aaabb|bbbbcccc ccdddddd - low 10 bits correct w/o
253
+ // correction
254
+ uint32x4_t composed = vsraq_n_u32(ascii, abc, 6);
255
+ // After this is for surrogates
256
+ // Blend the low and high surrogates
257
+ // 4 byte: 11110aaa bbbbbbcc|bbbbcccc ccdddddd
258
+ uint32x4_t mixed = vbslq_u32(vmovq_n_u32(0xFFFF0000), abc, composed);
259
+ // Clear the upper 6 bits of the low surrogate. Don't clear the upper bits
260
+ // yet as 0x10000 was not subtracted from the codepoint yet. 4 byte:
261
+ // 11110aaa bbbbbbcc|000000cc ccdddddd
262
+ uint16x8_t masked_pair = vreinterpretq_u16_u32(
263
+ vbicq_u32(mixed, vmovq_n_u32(uint32_t(~0xFFFF03FF))));
264
+ // Correct the remaining UTF-8 prefix, surrogate offset, and add the
265
+ // surrogate prefixes in one magic 16-bit addition. similar magic number but
266
+ // without the continue byte adjust and halfword swapped UTF-8 4b prefix =
267
+ // -0xF000|0x0000 surrogate offset = -0x0040|0x0000 (0x10000 << 6)
268
+ // surrogate high = +0xD800|0x0000
269
+ // surrogate low = +0x0000|0xDC00
270
+ // -----------------------------------
271
+ // = +0xE7C0|0xDC00
272
+ uint16x8_t magic = vreinterpretq_u16_u32(vmovq_n_u32(0xE7C0DC00));
273
+ // 4 byte: 110110AA BBBBBBCC|110111CC CCDDDDDD - surrogate pair complete
274
+ uint32x4_t surrogates =
275
+ vreinterpretq_u32_u16(vaddq_u16(masked_pair, magic));
276
+ // If the high bit is 1 (s32 less than zero), this needs a surrogate pair
277
+ uint32x4_t is_pair = vcltzq_s32(vreinterpretq_s32_u32(perm));
278
+
279
+ // Select either the 4 byte surrogate pair or the 2 byte solo codepoint
280
+ // 3 byte: 0xxxxxxx xxxxxxxx|bbbbcccc ccdddddd
281
+ // 4 byte: 110110AA BBBBBBCC|110111CC CCDDDDDD
282
+ uint32x4_t selected = vbslq_u32(is_pair, surrogates, composed);
283
+ // Byte swap if necessary
284
+ if simdutf_constexpr (!match_system(big_endian)) {
285
+ selected =
286
+ vreinterpretq_u32_u8(vrev16q_u8(vreinterpretq_u8_u32(selected)));
287
+ }
288
+ // Attempting to shuffle and store would be complex, just scalarize.
289
+ uint32_t buffer[4];
290
+ vst1q_u32(buffer, selected);
291
+ // Test for the top bit of the surrogate mask. Remove due to issue 514
292
+ // const uint32_t SURROGATE_MASK = match_system(big_endian) ? 0x80000000 :
293
+ // 0x00800000;
294
+ for (size_t i = 0; i < 3; i++) {
295
+ // Surrogate
296
+ // Used to be if (buffer[i] & SURROGATE_MASK) {
297
+ // See discussion above.
298
+ // patch for issue https://github.com/simdutf/simdutf/issues/514
299
+ if ((permbuffer[i] & 0xf8000000) == 0xf0000000) {
300
+ utf16_output[0] = uint16_t(buffer[i] >> 16);
301
+ utf16_output[1] = uint16_t(buffer[i] & 0xFFFF);
302
+ utf16_output += 2;
303
+ } else {
304
+ utf16_output[0] = uint16_t(buffer[i] & 0xFFFF);
305
+ utf16_output++;
306
+ }
307
+ }
308
+ return consumed;
309
+ } else {
310
+ // here we know that there is an error but we do not handle errors
311
+ return 12;
312
+ }
313
+ }
@@ -0,0 +1,179 @@
1
+ // Convert up to 12 bytes from utf8 to utf32 using a mask indicating the
2
+ // end of the code points. Only the least significant 12 bits of the mask
3
+ // are accessed.
4
+ // It returns how many bytes were consumed (up to 12).
5
+ size_t convert_masked_utf8_to_utf32(const char *input,
6
+ uint64_t utf8_end_of_code_point_mask,
7
+ char32_t *&utf32_out) {
8
+ // we use an approach where we try to process up to 12 input bytes.
9
+ // Why 12 input bytes and not 16? Because we are concerned with the size of
10
+ // the lookup tables. Also 12 is nicely divisible by two and three.
11
+ //
12
+ uint32_t *&utf32_output = reinterpret_cast<uint32_t *&>(utf32_out);
13
+ uint8x16_t in = vld1q_u8(reinterpret_cast<const uint8_t *>(input));
14
+ const uint16_t input_utf8_end_of_code_point_mask =
15
+ utf8_end_of_code_point_mask & 0xFFF;
16
+ //
17
+ // Optimization note: our main path below is load-latency dependent. Thus it
18
+ // is maybe beneficial to have fast paths that depend on branch prediction but
19
+ // have less latency. This results in more instructions but, potentially, also
20
+ // higher speeds.
21
+ //
22
+ // We first try a few fast paths.
23
+ if (utf8_end_of_code_point_mask == 0xfff) {
24
+ // We process in chunks of 12 bytes.
25
+ // use fast implementation in src/simdutf/arm64/simd.h
26
+ // Ideally the compiler can keep the tables in registers.
27
+ simd8<int8_t> temp{vreinterpretq_s8_u8(in)};
28
+ temp.store_ascii_as_utf32_tbl(utf32_out);
29
+ utf32_output += 12; // We wrote 12 32-bit characters.
30
+ return 12; // We consumed 12 bytes.
31
+ }
32
+ if (input_utf8_end_of_code_point_mask == 0x924) {
33
+ // We want to take 4 3-byte UTF-8 code units and turn them into 4 4-byte
34
+ // UTF-32 code units. Convert to UTF-16
35
+ uint16x4_t composed_utf16 = convert_utf8_3_byte_to_utf16(in);
36
+ // Zero extend and store via ST2 with a zero.
37
+ uint16x4x2_t interleaver = {{composed_utf16, vmov_n_u16(0)}};
38
+ vst2_u16(reinterpret_cast<uint16_t *>(utf32_output), interleaver);
39
+ utf32_output += 4; // We wrote 4 32-bit characters.
40
+ return 12; // We consumed 12 bytes.
41
+ }
42
+
43
+ // 2 byte sequences occur in short bursts in languages like Greek and Russian.
44
+ if (input_utf8_end_of_code_point_mask == 0xaaa) {
45
+ // We want to take 6 2-byte UTF-8 code units and turn them into 6 4-byte
46
+ // UTF-32 code units. Convert to UTF-16
47
+ uint16x8_t composed_utf16 = convert_utf8_2_byte_to_utf16(in);
48
+ // Zero extend and store via ST2 with a zero.
49
+ uint16x8x2_t interleaver = {{composed_utf16, vmovq_n_u16(0)}};
50
+ vst2q_u16(reinterpret_cast<uint16_t *>(utf32_output), interleaver);
51
+ utf32_output += 6; // We wrote 6 32-bit characters.
52
+ return 12; // We consumed 12 bytes.
53
+ }
54
+ /// Either no fast path or an unimportant fast path.
55
+
56
+ const uint8_t idx = simdutf::tables::utf8_to_utf16::utf8bigindex
57
+ [input_utf8_end_of_code_point_mask][0];
58
+ const uint8_t consumed = simdutf::tables::utf8_to_utf16::utf8bigindex
59
+ [input_utf8_end_of_code_point_mask][1];
60
+
61
+ if (idx < 64) {
62
+ // SIX (6) input code-code units
63
+ // Convert to UTF-16
64
+ uint16x8_t composed_utf16 = convert_utf8_1_to_2_byte_to_utf16(in, idx);
65
+ // Zero extend and store with ST2 and zero
66
+ uint16x8x2_t interleaver = {{composed_utf16, vmovq_n_u16(0)}};
67
+ vst2q_u16(reinterpret_cast<uint16_t *>(utf32_output), interleaver);
68
+ utf32_output += 6; // We wrote 6 32-bit characters.
69
+ return consumed;
70
+ } else if (idx < 145) {
71
+ // FOUR (4) input code-code units
72
+ // UTF-16 and UTF-32 use similar algorithms, but UTF-32 skips the narrowing.
73
+ uint8x16_t sh = vld1q_u8(reinterpret_cast<const uint8_t *>(
74
+ simdutf::tables::utf8_to_utf16::shufutf8[idx]));
75
+ // Shuffle
76
+ // 1 byte: 00000000 00000000 0ccccccc
77
+ // 2 byte: 00000000 110bbbbb 10cccccc
78
+ // 3 byte: 1110aaaa 10bbbbbb 10cccccc
79
+ uint32x4_t perm = vreinterpretq_u32_u8(vqtbl1q_u8(in, sh));
80
+ // Split
81
+ // 00000000 00000000 0ccccccc
82
+ uint32x4_t ascii = vandq_u32(perm, vmovq_n_u32(0x7F)); // 6 or 7 bits
83
+ // Note: unmasked
84
+ // xxxxxxxx aaaaxxxx xxxxxxxx
85
+ uint32x4_t high = vshrq_n_u32(perm, 4); // 4 bits
86
+ // Use 16 bit bic instead of and.
87
+ // The top bits will be corrected later in the bsl
88
+ // 00000000 10bbbbbb 00000000
89
+ uint32x4_t middle = vreinterpretq_u32_u16(
90
+ vbicq_u16(vreinterpretq_u16_u32(perm),
91
+ vmovq_n_u16(uint16_t(~0xff00)))); // 5 or 6 bits
92
+ // Combine low and middle with shift right accumulate
93
+ // 00000000 00xxbbbb bbcccccc
94
+ uint32x4_t lowmid = vsraq_n_u32(ascii, middle, 2);
95
+ // Insert top 4 bits from high byte with bitwise select
96
+ // 00000000 aaaabbbb bbcccccc
97
+ uint32x4_t composed = vbslq_u32(vmovq_n_u32(0x0000F000), high, lowmid);
98
+ vst1q_u32(utf32_output, composed);
99
+ utf32_output += 4; // We wrote 4 32-bit characters.
100
+ return consumed;
101
+ } else if (idx < 209) {
102
+ // THREE (3) input code-code units
103
+ if (input_utf8_end_of_code_point_mask == 0x888) {
104
+ // We want to take 3 4-byte UTF-8 code units and turn them into 3 4-byte
105
+ // UTF-32 code units. This uses the same method as the fixed 3 byte
106
+ // version, reversing and shift left insert. However, there is no need for
107
+ // a shuffle mask now, just rev16 and rev32.
108
+ //
109
+ // This version does not use the LUT, but 4 byte sequences are less common
110
+ // and the overhead of the extra memory access is less important than the
111
+ // early branch overhead in shorter sequences, so it comes last.
112
+
113
+ // Swap pairs of bytes
114
+ // 10dddddd|10cccccc|10bbbbbb|11110aaa
115
+ // 10cccccc 10dddddd|11110aaa 10bbbbbb
116
+ uint16x8_t swap1 = vreinterpretq_u16_u8(vrev16q_u8(in));
117
+ // Shift left and insert
118
+ // xxxxcccc ccdddddd|xxxxxxxa aabbbbbb
119
+ uint16x8_t merge1 = vsliq_n_u16(swap1, vreinterpretq_u16_u8(in), 6);
120
+ // Swap 16-bit lanes
121
+ // xxxxcccc ccdddddd xxxxxxxa aabbbbbb
122
+ // xxxxxxxa aabbbbbb xxxxcccc ccdddddd
123
+ uint32x4_t swap2 = vreinterpretq_u32_u16(vrev32q_u16(merge1));
124
+ // Shift insert again
125
+ // xxxxxxxx xxxaaabb bbbbcccc ccdddddd
126
+ uint32x4_t merge2 = vsliq_n_u32(swap2, vreinterpretq_u32_u16(merge1), 12);
127
+ // Clear the garbage
128
+ // 00000000 000aaabb bbbbcccc ccdddddd
129
+ uint32x4_t composed = vandq_u32(merge2, vmovq_n_u32(0x1FFFFF));
130
+ // Store
131
+ vst1q_u32(utf32_output, composed);
132
+
133
+ utf32_output += 3; // We wrote 3 32-bit characters.
134
+ return 12; // We consumed 12 bytes.
135
+ }
136
+ // Unlike UTF-16, doing a fast codepath doesn't have nearly as much benefit
137
+ // due to surrogates no longer being involved.
138
+ uint8x16_t sh = vld1q_u8(reinterpret_cast<const uint8_t *>(
139
+ simdutf::tables::utf8_to_utf16::shufutf8[idx]));
140
+ // 1 byte: 00000000 00000000 00000000 0ddddddd
141
+ // 2 byte: 00000000 00000000 110ccccc 10dddddd
142
+ // 3 byte: 00000000 1110bbbb 10cccccc 10dddddd
143
+ // 4 byte: 11110aaa 10bbbbbb 10cccccc 10dddddd
144
+ uint32x4_t perm = vreinterpretq_u32_u8(vqtbl1q_u8(in, sh));
145
+ // Ascii
146
+ uint32x4_t ascii = vandq_u32(perm, vmovq_n_u32(0x7F));
147
+ uint32x4_t middle = vandq_u32(perm, vmovq_n_u32(0x3f00));
148
+ // When converting the way we do, the 3 byte prefix will be interpreted as
149
+ // the 18th bit being set, since the code would interpret the lead byte
150
+ // (0b1110bbbb) as a continuation byte (0b10bbbbbb). To fix this, we can
151
+ // either xor or do an 8 bit add of the 6th bit shifted right by 1. Since
152
+ // NEON has shift right accumulate, we use that.
153
+ // 4 byte 3 byte
154
+ // 10bbbbbb 1110bbbb
155
+ // 00000000 01000000 6th bit
156
+ // 00000000 00100000 shift right
157
+ // 10bbbbbb 0000bbbb add
158
+ // 00bbbbbb 0000bbbb mask
159
+ uint8x16_t correction =
160
+ vreinterpretq_u8_u32(vandq_u32(perm, vmovq_n_u32(0x00400000)));
161
+ uint32x4_t corrected = vreinterpretq_u32_u8(
162
+ vsraq_n_u8(vreinterpretq_u8_u32(perm), correction, 1));
163
+ // 00000000 00000000 0000cccc ccdddddd
164
+ uint32x4_t cd = vsraq_n_u32(ascii, middle, 2);
165
+ // Insert twice
166
+ // xxxxxxxx xxxaaabb bbbbxxxx xxxxxxxx
167
+ uint32x4_t ab = vbslq_u32(vmovq_n_u32(0x01C0000), vshrq_n_u32(corrected, 6),
168
+ vshrq_n_u32(corrected, 4));
169
+ // 00000000 000aaabb bbbbcccc ccdddddd
170
+ uint32x4_t composed = vbslq_u32(vmovq_n_u32(0xFFE00FFF), cd, ab);
171
+ // Store
172
+ vst1q_u32(utf32_output, composed);
173
+ utf32_output += 3; // We wrote 3 32-bit characters.
174
+ return consumed;
175
+ } else {
176
+ // here we know that there is an error but we do not handle errors
177
+ return 12;
178
+ }
179
+ }