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,505 @@
1
+ std::pair<const char32_t *, char *>
2
+ arm_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
+ const uint16x8_t v_c080 = vmovq_n_u16((uint16_t)0xc080);
7
+
8
+ uint16x8_t forbidden_bytemask = vmovq_n_u16(0x0);
9
+ const size_t safety_margin =
10
+ 12; // to avoid overruns, see issue
11
+ // https://github.com/simdutf/simdutf/issues/92
12
+
13
+ while (buf + 16 + safety_margin < end) {
14
+ uint32x4_t in = vld1q_u32(reinterpret_cast<const uint32_t *>(buf));
15
+ uint32x4_t nextin = vld1q_u32(reinterpret_cast<const uint32_t *>(buf + 4));
16
+
17
+ // Check if no bits set above 16th
18
+ if (vmaxvq_u32(vorrq_u32(in, nextin)) <= 0xFFFF) {
19
+ // Pack UTF-32 to UTF-16 safely (without surrogate pairs)
20
+ // Apply UTF-16 => UTF-8 routine (arm_convert_utf16_to_utf8.cpp)
21
+ uint16x8_t utf16_packed = vcombine_u16(vmovn_u32(in), vmovn_u32(nextin));
22
+ if (vmaxvq_u16(utf16_packed) <= 0x7F) { // ASCII fast path!!!!
23
+ // 1. pack the bytes
24
+ // obviously suboptimal.
25
+ uint8x8_t utf8_packed = vmovn_u16(utf16_packed);
26
+ // 2. store (8 bytes)
27
+ vst1_u8(utf8_output, utf8_packed);
28
+ // 3. adjust pointers
29
+ buf += 8;
30
+ utf8_output += 8;
31
+ continue; // we are done for this round!
32
+ }
33
+
34
+ if (vmaxvq_u16(utf16_packed) <= 0x7FF) {
35
+ // 1. prepare 2-byte values
36
+ // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8
37
+ // expected output : [110a|aaaa|10bb|bbbb] x 8
38
+ const uint16x8_t v_1f00 = vmovq_n_u16((int16_t)0x1f00);
39
+ const uint16x8_t v_003f = vmovq_n_u16((int16_t)0x003f);
40
+
41
+ // t0 = [000a|aaaa|bbbb|bb00]
42
+ const uint16x8_t t0 = vshlq_n_u16(utf16_packed, 2);
43
+ // t1 = [000a|aaaa|0000|0000]
44
+ const uint16x8_t t1 = vandq_u16(t0, v_1f00);
45
+ // t2 = [0000|0000|00bb|bbbb]
46
+ const uint16x8_t t2 = vandq_u16(utf16_packed, v_003f);
47
+ // t3 = [000a|aaaa|00bb|bbbb]
48
+ const uint16x8_t t3 = vorrq_u16(t1, t2);
49
+ // t4 = [110a|aaaa|10bb|bbbb]
50
+ const uint16x8_t t4 = vorrq_u16(t3, v_c080);
51
+ // 2. merge ASCII and 2-byte codewords
52
+ const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F);
53
+ const uint16x8_t one_byte_bytemask = vcleq_u16(utf16_packed, v_007f);
54
+ const uint8x16_t utf8_unpacked = vreinterpretq_u8_u16(
55
+ vbslq_u16(one_byte_bytemask, utf16_packed, t4));
56
+ // 3. prepare bitmask for 8-bit lookup
57
+ #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
58
+ const uint16x8_t mask = simdutf_make_uint16x8_t(
59
+ 0x0001, 0x0004, 0x0010, 0x0040, 0x0002, 0x0008, 0x0020, 0x0080);
60
+ #else
61
+ const uint16x8_t mask = {0x0001, 0x0004, 0x0010, 0x0040,
62
+ 0x0002, 0x0008, 0x0020, 0x0080};
63
+ #endif
64
+ uint16_t m2 = vaddvq_u16(vandq_u16(one_byte_bytemask, mask));
65
+ // 4. pack the bytes
66
+ const uint8_t *row =
67
+ &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[m2][0];
68
+ const uint8x16_t shuffle = vld1q_u8(row + 1);
69
+ const uint8x16_t utf8_packed = vqtbl1q_u8(utf8_unpacked, shuffle);
70
+
71
+ // 5. store bytes
72
+ vst1q_u8(utf8_output, utf8_packed);
73
+
74
+ // 6. adjust pointers
75
+ buf += 8;
76
+ utf8_output += row[0];
77
+ continue;
78
+ } else {
79
+ // case: code units from register produce either 1, 2 or 3 UTF-8 bytes
80
+ const uint16x8_t v_d800 = vmovq_n_u16((uint16_t)0xd800);
81
+ const uint16x8_t v_dfff = vmovq_n_u16((uint16_t)0xdfff);
82
+ forbidden_bytemask =
83
+ vorrq_u16(vandq_u16(vcleq_u16(utf16_packed, v_dfff),
84
+ vcgeq_u16(utf16_packed, v_d800)),
85
+ forbidden_bytemask);
86
+
87
+ #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
88
+ const uint16x8_t dup_even = simdutf_make_uint16x8_t(
89
+ 0x0000, 0x0202, 0x0404, 0x0606, 0x0808, 0x0a0a, 0x0c0c, 0x0e0e);
90
+ #else
91
+ const uint16x8_t dup_even = {0x0000, 0x0202, 0x0404, 0x0606,
92
+ 0x0808, 0x0a0a, 0x0c0c, 0x0e0e};
93
+ #endif
94
+ /* In this branch we handle three cases:
95
+ 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] -
96
+ single UFT-8 byte
97
+ 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] -
98
+ two UTF-8 bytes
99
+ 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] -
100
+ three UTF-8 bytes
101
+
102
+ We expand the input word (16-bit) into two code units (32-bit), thus
103
+ we have room for four bytes. However, we need five distinct bit
104
+ layouts. Note that the last byte in cases #2 and #3 is the same.
105
+
106
+ We precompute byte 1 for case #1 and the common byte for cases #2 & #3
107
+ in register t2.
108
+
109
+ We precompute byte 1 for case #3 and -- **conditionally** --
110
+ precompute either byte 1 for case #2 or byte 2 for case #3. Note that
111
+ they differ by exactly one bit.
112
+
113
+ Finally from these two code units we build proper UTF-8 sequence,
114
+ taking into account the case (i.e, the number of bytes to write).
115
+ */
116
+ /**
117
+ * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce:
118
+ * t2 => [0ccc|cccc] [10cc|cccc]
119
+ * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb])
120
+ */
121
+ #define simdutf_vec(x) vmovq_n_u16(static_cast<uint16_t>(x))
122
+ // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc]
123
+ const uint16x8_t t0 =
124
+ vreinterpretq_u16_u8(vqtbl1q_u8(vreinterpretq_u8_u16(utf16_packed),
125
+ vreinterpretq_u8_u16(dup_even)));
126
+ // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc]
127
+ const uint16x8_t t1 = vandq_u16(t0, simdutf_vec(0b0011111101111111));
128
+ // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc]
129
+ const uint16x8_t t2 = vorrq_u16(t1, simdutf_vec(0b1000000000000000));
130
+
131
+ // s0: [aaaa|bbbb|bbcc|cccc] => [0000|0000|0000|aaaa]
132
+ const uint16x8_t s0 = vshrq_n_u16(utf16_packed, 12);
133
+ // s1: [aaaa|bbbb|bbcc|cccc] => [0000|bbbb|bb00|0000]
134
+ const uint16x8_t s1 =
135
+ vandq_u16(utf16_packed, simdutf_vec(0b0000111111000000));
136
+ // [0000|bbbb|bb00|0000] => [00bb|bbbb|0000|0000]
137
+ const uint16x8_t s1s = vshlq_n_u16(s1, 2);
138
+ // [00bb|bbbb|0000|aaaa]
139
+ const uint16x8_t s2 = vorrq_u16(s0, s1s);
140
+ // s3: [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa]
141
+ const uint16x8_t s3 = vorrq_u16(s2, simdutf_vec(0b1100000011100000));
142
+ const uint16x8_t v_07ff = vmovq_n_u16((uint16_t)0x07FF);
143
+ const uint16x8_t one_or_two_bytes_bytemask =
144
+ vcleq_u16(utf16_packed, v_07ff);
145
+ const uint16x8_t m0 = vbicq_u16(simdutf_vec(0b0100000000000000),
146
+ one_or_two_bytes_bytemask);
147
+ const uint16x8_t s4 = veorq_u16(s3, m0);
148
+ #undef simdutf_vec
149
+
150
+ // 4. expand code units 16-bit => 32-bit
151
+ const uint8x16_t out0 = vreinterpretq_u8_u16(vzip1q_u16(t2, s4));
152
+ const uint8x16_t out1 = vreinterpretq_u8_u16(vzip2q_u16(t2, s4));
153
+
154
+ // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle
155
+ const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F);
156
+ const uint16x8_t one_byte_bytemask = vcleq_u16(utf16_packed, v_007f);
157
+ #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
158
+ const uint16x8_t onemask = simdutf_make_uint16x8_t(
159
+ 0x0001, 0x0004, 0x0010, 0x0040, 0x0100, 0x0400, 0x1000, 0x4000);
160
+ const uint16x8_t twomask = simdutf_make_uint16x8_t(
161
+ 0x0002, 0x0008, 0x0020, 0x0080, 0x0200, 0x0800, 0x2000, 0x8000);
162
+ #else
163
+ const uint16x8_t onemask = {0x0001, 0x0004, 0x0010, 0x0040,
164
+ 0x0100, 0x0400, 0x1000, 0x4000};
165
+ const uint16x8_t twomask = {0x0002, 0x0008, 0x0020, 0x0080,
166
+ 0x0200, 0x0800, 0x2000, 0x8000};
167
+ #endif
168
+ const uint16x8_t combined =
169
+ vorrq_u16(vandq_u16(one_byte_bytemask, onemask),
170
+ vandq_u16(one_or_two_bytes_bytemask, twomask));
171
+ const uint16_t mask = vaddvq_u16(combined);
172
+ // The following fast path may or may not be beneficial.
173
+ /*if(mask == 0) {
174
+ // We only have three-byte code units. Use fast path.
175
+ const uint8x16_t shuffle = {2,3,1,6,7,5,10,11,9,14,15,13,0,0,0,0};
176
+ const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle);
177
+ const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle);
178
+ vst1q_u8(utf8_output, utf8_0);
179
+ utf8_output += 12;
180
+ vst1q_u8(utf8_output, utf8_1);
181
+ utf8_output += 12;
182
+ buf += 8;
183
+ continue;
184
+ }*/
185
+ const uint8_t mask0 = uint8_t(mask);
186
+ const uint8_t *row0 =
187
+ &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0];
188
+ const uint8x16_t shuffle0 = vld1q_u8(row0 + 1);
189
+ const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle0);
190
+
191
+ const uint8_t mask1 = static_cast<uint8_t>(mask >> 8);
192
+ const uint8_t *row1 =
193
+ &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0];
194
+ const uint8x16_t shuffle1 = vld1q_u8(row1 + 1);
195
+ const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle1);
196
+
197
+ vst1q_u8(utf8_output, utf8_0);
198
+ utf8_output += row0[0];
199
+ vst1q_u8(utf8_output, utf8_1);
200
+ utf8_output += row1[0];
201
+
202
+ buf += 8;
203
+ }
204
+ // At least one 32-bit word will produce a surrogate pair in UTF-16 <=>
205
+ // will produce four UTF-8 bytes.
206
+ } else {
207
+ // Let us do a scalar fallback.
208
+ // It may seem wasteful to use scalar code, but being efficient with SIMD
209
+ // in the presence of surrogate pairs may require non-trivial tables.
210
+ size_t forward = 15;
211
+ size_t k = 0;
212
+ if (size_t(end - buf) < forward + 1) {
213
+ forward = size_t(end - buf - 1);
214
+ }
215
+ for (; k < forward; k++) {
216
+ uint32_t word = buf[k];
217
+ if ((word & 0xFFFFFF80) == 0) {
218
+ *utf8_output++ = char(word);
219
+ } else if ((word & 0xFFFFF800) == 0) {
220
+ *utf8_output++ = char((word >> 6) | 0b11000000);
221
+ *utf8_output++ = char((word & 0b111111) | 0b10000000);
222
+ } else if ((word & 0xFFFF0000) == 0) {
223
+ if (word >= 0xD800 && word <= 0xDFFF) {
224
+ return std::make_pair(nullptr,
225
+ reinterpret_cast<char *>(utf8_output));
226
+ }
227
+ *utf8_output++ = char((word >> 12) | 0b11100000);
228
+ *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000);
229
+ *utf8_output++ = char((word & 0b111111) | 0b10000000);
230
+ } else {
231
+ if (word > 0x10FFFF) {
232
+ return std::make_pair(nullptr,
233
+ reinterpret_cast<char *>(utf8_output));
234
+ }
235
+ *utf8_output++ = char((word >> 18) | 0b11110000);
236
+ *utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000);
237
+ *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000);
238
+ *utf8_output++ = char((word & 0b111111) | 0b10000000);
239
+ }
240
+ }
241
+ buf += k;
242
+ }
243
+ } // while
244
+
245
+ // check for invalid input
246
+ if (vmaxvq_u16(forbidden_bytemask) != 0) {
247
+ return std::make_pair(nullptr, reinterpret_cast<char *>(utf8_output));
248
+ }
249
+ return std::make_pair(buf, reinterpret_cast<char *>(utf8_output));
250
+ }
251
+
252
+ std::pair<result, char *>
253
+ arm_convert_utf32_to_utf8_with_errors(const char32_t *buf, size_t len,
254
+ char *utf8_out) {
255
+ uint8_t *utf8_output = reinterpret_cast<uint8_t *>(utf8_out);
256
+ const char32_t *start = buf;
257
+ const char32_t *end = buf + len;
258
+
259
+ const uint16x8_t v_c080 = vmovq_n_u16((uint16_t)0xc080);
260
+ const size_t safety_margin =
261
+ 12; // to avoid overruns, see issue
262
+ // https://github.com/simdutf/simdutf/issues/92
263
+
264
+ while (buf + 16 + safety_margin < end) {
265
+ uint32x4_t in = vld1q_u32(reinterpret_cast<const uint32_t *>(buf));
266
+ uint32x4_t nextin = vld1q_u32(reinterpret_cast<const uint32_t *>(buf + 4));
267
+
268
+ // Check if no bits set above 16th
269
+ if (vmaxvq_u32(vorrq_u32(in, nextin)) <= 0xFFFF) {
270
+ // Pack UTF-32 to UTF-16 safely (without surrogate pairs)
271
+ // Apply UTF-16 => UTF-8 routine (arm_convert_utf16_to_utf8.cpp)
272
+ uint16x8_t utf16_packed = vcombine_u16(vmovn_u32(in), vmovn_u32(nextin));
273
+ if (vmaxvq_u16(utf16_packed) <= 0x7F) { // ASCII fast path!!!!
274
+ // 1. pack the bytes
275
+ // obviously suboptimal.
276
+ uint8x8_t utf8_packed = vmovn_u16(utf16_packed);
277
+ // 2. store (8 bytes)
278
+ vst1_u8(utf8_output, utf8_packed);
279
+ // 3. adjust pointers
280
+ buf += 8;
281
+ utf8_output += 8;
282
+ continue; // we are done for this round!
283
+ }
284
+
285
+ if (vmaxvq_u16(utf16_packed) <= 0x7FF) {
286
+ // 1. prepare 2-byte values
287
+ // input 16-bit word : [0000|0aaa|aabb|bbbb] x 8
288
+ // expected output : [110a|aaaa|10bb|bbbb] x 8
289
+ const uint16x8_t v_1f00 = vmovq_n_u16((int16_t)0x1f00);
290
+ const uint16x8_t v_003f = vmovq_n_u16((int16_t)0x003f);
291
+
292
+ // t0 = [000a|aaaa|bbbb|bb00]
293
+ const uint16x8_t t0 = vshlq_n_u16(utf16_packed, 2);
294
+ // t1 = [000a|aaaa|0000|0000]
295
+ const uint16x8_t t1 = vandq_u16(t0, v_1f00);
296
+ // t2 = [0000|0000|00bb|bbbb]
297
+ const uint16x8_t t2 = vandq_u16(utf16_packed, v_003f);
298
+ // t3 = [000a|aaaa|00bb|bbbb]
299
+ const uint16x8_t t3 = vorrq_u16(t1, t2);
300
+ // t4 = [110a|aaaa|10bb|bbbb]
301
+ const uint16x8_t t4 = vorrq_u16(t3, v_c080);
302
+ // 2. merge ASCII and 2-byte codewords
303
+ const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F);
304
+ const uint16x8_t one_byte_bytemask = vcleq_u16(utf16_packed, v_007f);
305
+ const uint8x16_t utf8_unpacked = vreinterpretq_u8_u16(
306
+ vbslq_u16(one_byte_bytemask, utf16_packed, t4));
307
+ // 3. prepare bitmask for 8-bit lookup
308
+ #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
309
+ const uint16x8_t mask = simdutf_make_uint16x8_t(
310
+ 0x0001, 0x0004, 0x0010, 0x0040, 0x0002, 0x0008, 0x0020, 0x0080);
311
+ #else
312
+ const uint16x8_t mask = {0x0001, 0x0004, 0x0010, 0x0040,
313
+ 0x0002, 0x0008, 0x0020, 0x0080};
314
+ #endif
315
+ uint16_t m2 = vaddvq_u16(vandq_u16(one_byte_bytemask, mask));
316
+ // 4. pack the bytes
317
+ const uint8_t *row =
318
+ &simdutf::tables::utf16_to_utf8::pack_1_2_utf8_bytes[m2][0];
319
+ const uint8x16_t shuffle = vld1q_u8(row + 1);
320
+ const uint8x16_t utf8_packed = vqtbl1q_u8(utf8_unpacked, shuffle);
321
+
322
+ // 5. store bytes
323
+ vst1q_u8(utf8_output, utf8_packed);
324
+
325
+ // 6. adjust pointers
326
+ buf += 8;
327
+ utf8_output += row[0];
328
+ continue;
329
+ } else {
330
+ // case: code units from register produce either 1, 2 or 3 UTF-8 bytes
331
+
332
+ // check for invalid input
333
+ const uint16x8_t v_d800 = vmovq_n_u16((uint16_t)0xd800);
334
+ const uint16x8_t v_dfff = vmovq_n_u16((uint16_t)0xdfff);
335
+ const uint16x8_t forbidden_bytemask = vandq_u16(
336
+ vcleq_u16(utf16_packed, v_dfff), vcgeq_u16(utf16_packed, v_d800));
337
+ if (vmaxvq_u16(forbidden_bytemask) != 0) {
338
+ return std::make_pair(result(error_code::SURROGATE, buf - start),
339
+ reinterpret_cast<char *>(utf8_output));
340
+ }
341
+
342
+ #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
343
+ const uint16x8_t dup_even = simdutf_make_uint16x8_t(
344
+ 0x0000, 0x0202, 0x0404, 0x0606, 0x0808, 0x0a0a, 0x0c0c, 0x0e0e);
345
+ #else
346
+ const uint16x8_t dup_even = {0x0000, 0x0202, 0x0404, 0x0606,
347
+ 0x0808, 0x0a0a, 0x0c0c, 0x0e0e};
348
+ #endif
349
+ /* In this branch we handle three cases:
350
+ 1. [0000|0000|0ccc|cccc] => [0ccc|cccc] -
351
+ single UFT-8 byte
352
+ 2. [0000|0bbb|bbcc|cccc] => [110b|bbbb], [10cc|cccc] -
353
+ two UTF-8 bytes
354
+ 3. [aaaa|bbbb|bbcc|cccc] => [1110|aaaa], [10bb|bbbb], [10cc|cccc] -
355
+ three UTF-8 bytes
356
+
357
+ We expand the input word (16-bit) into two code units (32-bit), thus
358
+ we have room for four bytes. However, we need five distinct bit
359
+ layouts. Note that the last byte in cases #2 and #3 is the same.
360
+
361
+ We precompute byte 1 for case #1 and the common byte for cases #2 & #3
362
+ in register t2.
363
+
364
+ We precompute byte 1 for case #3 and -- **conditionally** --
365
+ precompute either byte 1 for case #2 or byte 2 for case #3. Note that
366
+ they differ by exactly one bit.
367
+
368
+ Finally from these two code units we build proper UTF-8 sequence,
369
+ taking into account the case (i.e, the number of bytes to write).
370
+ */
371
+ /**
372
+ * Given [aaaa|bbbb|bbcc|cccc] our goal is to produce:
373
+ * t2 => [0ccc|cccc] [10cc|cccc]
374
+ * s4 => [1110|aaaa] ([110b|bbbb] OR [10bb|bbbb])
375
+ */
376
+ #define simdutf_vec(x) vmovq_n_u16(static_cast<uint16_t>(x))
377
+ // [aaaa|bbbb|bbcc|cccc] => [bbcc|cccc|bbcc|cccc]
378
+ const uint16x8_t t0 =
379
+ vreinterpretq_u16_u8(vqtbl1q_u8(vreinterpretq_u8_u16(utf16_packed),
380
+ vreinterpretq_u8_u16(dup_even)));
381
+ // [bbcc|cccc|bbcc|cccc] => [00cc|cccc|0bcc|cccc]
382
+ const uint16x8_t t1 = vandq_u16(t0, simdutf_vec(0b0011111101111111));
383
+ // [00cc|cccc|0bcc|cccc] => [10cc|cccc|0bcc|cccc]
384
+ const uint16x8_t t2 = vorrq_u16(t1, simdutf_vec(0b1000000000000000));
385
+
386
+ // s0: [aaaa|bbbb|bbcc|cccc] => [0000|0000|0000|aaaa]
387
+ const uint16x8_t s0 = vshrq_n_u16(utf16_packed, 12);
388
+ // s1: [aaaa|bbbb|bbcc|cccc] => [0000|bbbb|bb00|0000]
389
+ const uint16x8_t s1 =
390
+ vandq_u16(utf16_packed, simdutf_vec(0b0000111111000000));
391
+ // [0000|bbbb|bb00|0000] => [00bb|bbbb|0000|0000]
392
+ const uint16x8_t s1s = vshlq_n_u16(s1, 2);
393
+ // [00bb|bbbb|0000|aaaa]
394
+ const uint16x8_t s2 = vorrq_u16(s0, s1s);
395
+ // s3: [00bb|bbbb|0000|aaaa] => [11bb|bbbb|1110|aaaa]
396
+ const uint16x8_t s3 = vorrq_u16(s2, simdutf_vec(0b1100000011100000));
397
+ const uint16x8_t v_07ff = vmovq_n_u16((uint16_t)0x07FF);
398
+ const uint16x8_t one_or_two_bytes_bytemask =
399
+ vcleq_u16(utf16_packed, v_07ff);
400
+ const uint16x8_t m0 = vbicq_u16(simdutf_vec(0b0100000000000000),
401
+ one_or_two_bytes_bytemask);
402
+ const uint16x8_t s4 = veorq_u16(s3, m0);
403
+ #undef simdutf_vec
404
+
405
+ // 4. expand code units 16-bit => 32-bit
406
+ const uint8x16_t out0 = vreinterpretq_u8_u16(vzip1q_u16(t2, s4));
407
+ const uint8x16_t out1 = vreinterpretq_u8_u16(vzip2q_u16(t2, s4));
408
+
409
+ // 5. compress 32-bit code units into 1, 2 or 3 bytes -- 2 x shuffle
410
+ const uint16x8_t v_007f = vmovq_n_u16((uint16_t)0x007F);
411
+ const uint16x8_t one_byte_bytemask = vcleq_u16(utf16_packed, v_007f);
412
+ #ifdef SIMDUTF_REGULAR_VISUAL_STUDIO
413
+ const uint16x8_t onemask = simdutf_make_uint16x8_t(
414
+ 0x0001, 0x0004, 0x0010, 0x0040, 0x0100, 0x0400, 0x1000, 0x4000);
415
+ const uint16x8_t twomask = simdutf_make_uint16x8_t(
416
+ 0x0002, 0x0008, 0x0020, 0x0080, 0x0200, 0x0800, 0x2000, 0x8000);
417
+ #else
418
+ const uint16x8_t onemask = {0x0001, 0x0004, 0x0010, 0x0040,
419
+ 0x0100, 0x0400, 0x1000, 0x4000};
420
+ const uint16x8_t twomask = {0x0002, 0x0008, 0x0020, 0x0080,
421
+ 0x0200, 0x0800, 0x2000, 0x8000};
422
+ #endif
423
+ const uint16x8_t combined =
424
+ vorrq_u16(vandq_u16(one_byte_bytemask, onemask),
425
+ vandq_u16(one_or_two_bytes_bytemask, twomask));
426
+ const uint16_t mask = vaddvq_u16(combined);
427
+ // The following fast path may or may not be beneficial.
428
+ /*if(mask == 0) {
429
+ // We only have three-byte code units. Use fast path.
430
+ const uint8x16_t shuffle = {2,3,1,6,7,5,10,11,9,14,15,13,0,0,0,0};
431
+ const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle);
432
+ const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle);
433
+ vst1q_u8(utf8_output, utf8_0);
434
+ utf8_output += 12;
435
+ vst1q_u8(utf8_output, utf8_1);
436
+ utf8_output += 12;
437
+ buf += 8;
438
+ continue;
439
+ }*/
440
+ const uint8_t mask0 = uint8_t(mask);
441
+
442
+ const uint8_t *row0 =
443
+ &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask0][0];
444
+ const uint8x16_t shuffle0 = vld1q_u8(row0 + 1);
445
+ const uint8x16_t utf8_0 = vqtbl1q_u8(out0, shuffle0);
446
+
447
+ const uint8_t mask1 = static_cast<uint8_t>(mask >> 8);
448
+ const uint8_t *row1 =
449
+ &simdutf::tables::utf16_to_utf8::pack_1_2_3_utf8_bytes[mask1][0];
450
+ const uint8x16_t shuffle1 = vld1q_u8(row1 + 1);
451
+ const uint8x16_t utf8_1 = vqtbl1q_u8(out1, shuffle1);
452
+
453
+ vst1q_u8(utf8_output, utf8_0);
454
+ utf8_output += row0[0];
455
+ vst1q_u8(utf8_output, utf8_1);
456
+ utf8_output += row1[0];
457
+
458
+ buf += 8;
459
+ }
460
+ // At least one 32-bit word will produce a surrogate pair in UTF-16 <=>
461
+ // will produce four UTF-8 bytes.
462
+ } else {
463
+ // Let us do a scalar fallback.
464
+ // It may seem wasteful to use scalar code, but being efficient with SIMD
465
+ // in the presence of surrogate pairs may require non-trivial tables.
466
+ size_t forward = 15;
467
+ size_t k = 0;
468
+ if (size_t(end - buf) < forward + 1) {
469
+ forward = size_t(end - buf - 1);
470
+ }
471
+ for (; k < forward; k++) {
472
+ uint32_t word = buf[k];
473
+ if ((word & 0xFFFFFF80) == 0) {
474
+ *utf8_output++ = char(word);
475
+ } else if ((word & 0xFFFFF800) == 0) {
476
+ *utf8_output++ = char((word >> 6) | 0b11000000);
477
+ *utf8_output++ = char((word & 0b111111) | 0b10000000);
478
+ } else if ((word & 0xFFFF0000) == 0) {
479
+ if (word >= 0xD800 && word <= 0xDFFF) {
480
+ return std::make_pair(
481
+ result(error_code::SURROGATE, buf - start + k),
482
+ reinterpret_cast<char *>(utf8_output));
483
+ }
484
+ *utf8_output++ = char((word >> 12) | 0b11100000);
485
+ *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000);
486
+ *utf8_output++ = char((word & 0b111111) | 0b10000000);
487
+ } else {
488
+ if (word > 0x10FFFF) {
489
+ return std::make_pair(
490
+ result(error_code::TOO_LARGE, buf - start + k),
491
+ reinterpret_cast<char *>(utf8_output));
492
+ }
493
+ *utf8_output++ = char((word >> 18) | 0b11110000);
494
+ *utf8_output++ = char(((word >> 12) & 0b111111) | 0b10000000);
495
+ *utf8_output++ = char(((word >> 6) & 0b111111) | 0b10000000);
496
+ *utf8_output++ = char((word & 0b111111) | 0b10000000);
497
+ }
498
+ }
499
+ buf += k;
500
+ }
501
+ } // while
502
+
503
+ return std::make_pair(result(error_code::SUCCESS, buf - start),
504
+ reinterpret_cast<char *>(utf8_output));
505
+ }
@@ -0,0 +1,69 @@
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
+ size_t convert_masked_utf8_to_latin1(const char *input,
6
+ uint64_t utf8_end_of_code_point_mask,
7
+ char *&latin1_output) {
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
+ uint8x16_t in = vld1q_u8(reinterpret_cast<const uint8_t *>(input));
13
+ const uint16_t input_utf8_end_of_code_point_mask =
14
+ utf8_end_of_code_point_mask & 0xfff;
15
+ //
16
+ // Optimization note: our main path below is load-latency dependent. Thus it
17
+ // is maybe beneficial to have fast paths that depend on branch prediction but
18
+ // have less latency. This results in more instructions but, potentially, also
19
+ // higher speeds.
20
+
21
+ // We first try a few fast paths.
22
+ // The obvious first test is ASCII, which actually consumes the full 16.
23
+ if (utf8_end_of_code_point_mask == 0xfff) {
24
+ // We process in chunks of 12 bytes
25
+ vst1q_u8(reinterpret_cast<uint8_t *>(latin1_output), in);
26
+ latin1_output += 12; // We wrote 12 18-bit characters.
27
+ return 12; // We consumed 12 bytes.
28
+ }
29
+ /// We do not have a fast path available, or the fast path is unimportant, so
30
+ /// we fallback.
31
+ const uint8_t idx = simdutf::tables::utf8_to_utf16::utf8bigindex
32
+ [input_utf8_end_of_code_point_mask][0];
33
+
34
+ const uint8_t consumed = simdutf::tables::utf8_to_utf16::utf8bigindex
35
+ [input_utf8_end_of_code_point_mask][1];
36
+ // this indicates an invalid input:
37
+ if (idx >= 64) {
38
+ return consumed;
39
+ }
40
+ // Here we should have (idx < 64), if not, there is a bug in the validation or
41
+ // elsewhere. SIX (6) input code-code units this is a relatively easy scenario
42
+ // we process SIX (6) input code-code units. The max length in bytes of six
43
+ // code code units spanning between 1 and 2 bytes each is 12 bytes. Converts 6
44
+ // 1-2 byte UTF-8 characters to 6 UTF-16 characters. This is a relatively easy
45
+ // scenario we process SIX (6) input code-code units. The max length in bytes
46
+ // of six code code units spanning between 1 and 2 bytes each is 12 bytes.
47
+ uint8x16_t sh = vld1q_u8(reinterpret_cast<const uint8_t *>(
48
+ simdutf::tables::utf8_to_utf16::shufutf8[idx]));
49
+ // Shuffle
50
+ // 1 byte: 00000000 0bbbbbbb
51
+ // 2 byte: 110aaaaa 10bbbbbb
52
+ uint16x8_t perm = vreinterpretq_u16_u8(vqtbl1q_u8(in, sh));
53
+ // Mask
54
+ // 1 byte: 00000000 0bbbbbbb
55
+ // 2 byte: 00000000 00bbbbbb
56
+ uint16x8_t ascii = vandq_u16(perm, vmovq_n_u16(0x7f)); // 6 or 7 bits
57
+ // 1 byte: 00000000 00000000
58
+ // 2 byte: 000aaaaa 00000000
59
+ uint16x8_t highbyte = vandq_u16(perm, vmovq_n_u16(0x1f00)); // 5 bits
60
+ // Combine with a shift right accumulate
61
+ // 1 byte: 00000000 0bbbbbbb
62
+ // 2 byte: 00000aaa aabbbbbb
63
+ uint16x8_t composed = vsraq_n_u16(ascii, highbyte, 2);
64
+ // writing 8 bytes even though we only care about the first 6 bytes.
65
+ uint8x8_t latin1_packed = vmovn_u16(composed);
66
+ vst1_u8(reinterpret_cast<uint8_t *>(latin1_output), latin1_packed);
67
+ latin1_output += 6; // We wrote 6 bytes.
68
+ return consumed;
69
+ }