usearch 2.21.4 → 2.25.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 (604) hide show
  1. package/README.md +65 -69
  2. package/binding.gyp +15 -37
  3. package/c/CMakeLists.txt +4 -5
  4. package/c/README.md +8 -8
  5. package/c/lib.cpp +32 -14
  6. package/c/test.c +124 -1
  7. package/c/usearch.h +24 -3
  8. package/cpp/CMakeLists.txt +4 -0
  9. package/cpp/README.md +5 -5
  10. package/cpp/bench.cpp +97 -116
  11. package/cpp/test.cpp +117 -20
  12. package/include/usearch/index.hpp +224 -48
  13. package/include/usearch/index_dense.hpp +105 -40
  14. package/include/usearch/index_plugins.hpp +1387 -204
  15. package/javascript/README.md +1 -1
  16. package/javascript/dist/cjs/usearch.d.ts +8 -3
  17. package/javascript/dist/cjs/usearch.js +12 -4
  18. package/javascript/dist/esm/usearch.d.ts +8 -3
  19. package/javascript/dist/esm/usearch.js +12 -4
  20. package/javascript/lib.cpp +17 -0
  21. package/javascript/usearch.test.js +117 -94
  22. package/javascript/usearch.ts +14 -6
  23. package/numkong/.clang-tidy +30 -0
  24. package/{simsimd → numkong}/.cmake-format.py +18 -0
  25. package/numkong/.editorconfig +12 -0
  26. package/numkong/.git-blame-ignore-revs +123 -0
  27. package/numkong/.mailmap +15 -0
  28. package/numkong/.spi.yml +11 -0
  29. package/numkong/.swift-format +14 -0
  30. package/numkong/CITATION.cff +81 -0
  31. package/numkong/CONTRIBUTING.md +500 -0
  32. package/numkong/Cargo.toml +54 -0
  33. package/numkong/MANIFEST.in +8 -0
  34. package/numkong/Package.swift +84 -0
  35. package/numkong/README.md +569 -0
  36. package/numkong/bench/README.md +217 -0
  37. package/numkong/bench/bench-browser.html +323 -0
  38. package/numkong/bench/bench.cpp +344 -0
  39. package/numkong/bench/bench.hpp +816 -0
  40. package/numkong/bench/bench.js +148 -0
  41. package/numkong/bench/bench.mjs +616 -0
  42. package/numkong/bench/bench_attention.cpp +113 -0
  43. package/numkong/bench/bench_cast.cpp +264 -0
  44. package/numkong/bench/bench_cross_amx.cpp +62 -0
  45. package/numkong/bench/bench_cross_arm.cpp +245 -0
  46. package/numkong/bench/bench_cross_blas.cpp +309 -0
  47. package/numkong/bench/bench_cross_loongarch.cpp +106 -0
  48. package/numkong/bench/bench_cross_power.cpp +84 -0
  49. package/numkong/bench/bench_cross_rvv.cpp +121 -0
  50. package/numkong/bench/bench_cross_serial.cpp +151 -0
  51. package/numkong/bench/bench_cross_sme.cpp +163 -0
  52. package/numkong/bench/bench_cross_wasm.cpp +142 -0
  53. package/numkong/bench/bench_cross_x86.cpp +455 -0
  54. package/numkong/bench/bench_curved.cpp +210 -0
  55. package/numkong/bench/bench_dot.cpp +315 -0
  56. package/numkong/bench/bench_each.cpp +503 -0
  57. package/numkong/bench/bench_geospatial.cpp +112 -0
  58. package/numkong/bench/bench_maxsim.cpp +154 -0
  59. package/numkong/bench/bench_mesh.cpp +148 -0
  60. package/numkong/bench/bench_probability.cpp +60 -0
  61. package/numkong/bench/bench_reduce.cpp +371 -0
  62. package/numkong/bench/bench_set.cpp +73 -0
  63. package/numkong/bench/bench_sparse.cpp +198 -0
  64. package/numkong/bench/bench_spatial.cpp +347 -0
  65. package/numkong/bench/bench_trigonometry.cpp +137 -0
  66. package/numkong/bench/swift/Bench.swift +506 -0
  67. package/numkong/binding.gyp +169 -0
  68. package/numkong/build.rs +484 -0
  69. package/numkong/c/dispatch.h +512 -0
  70. package/numkong/c/dispatch_bf16.c +447 -0
  71. package/numkong/c/dispatch_bf16c.c +52 -0
  72. package/numkong/c/dispatch_e2m3.c +296 -0
  73. package/numkong/c/dispatch_e3m2.c +284 -0
  74. package/numkong/c/dispatch_e4m3.c +318 -0
  75. package/numkong/c/dispatch_e5m2.c +316 -0
  76. package/numkong/c/dispatch_f16.c +452 -0
  77. package/numkong/c/dispatch_f16c.c +58 -0
  78. package/numkong/c/dispatch_f32.c +434 -0
  79. package/numkong/c/dispatch_f32c.c +99 -0
  80. package/numkong/c/dispatch_f64.c +348 -0
  81. package/numkong/c/dispatch_f64c.c +98 -0
  82. package/numkong/c/dispatch_i16.c +96 -0
  83. package/numkong/c/dispatch_i32.c +89 -0
  84. package/numkong/c/dispatch_i4.c +153 -0
  85. package/numkong/c/dispatch_i64.c +86 -0
  86. package/numkong/c/dispatch_i8.c +348 -0
  87. package/numkong/c/dispatch_other.c +348 -0
  88. package/numkong/c/dispatch_u1.c +193 -0
  89. package/numkong/c/dispatch_u16.c +124 -0
  90. package/numkong/c/dispatch_u32.c +118 -0
  91. package/numkong/c/dispatch_u4.c +153 -0
  92. package/numkong/c/dispatch_u64.c +102 -0
  93. package/numkong/c/dispatch_u8.c +364 -0
  94. package/numkong/c/numkong.c +940 -0
  95. package/numkong/cmake/nk_arm_isa_probes.cmake +61 -0
  96. package/numkong/cmake/nk_isa_probe.cmake +90 -0
  97. package/numkong/cmake/nk_loongarch_isa_probes.cmake +15 -0
  98. package/numkong/cmake/nk_math_lib.cmake +46 -0
  99. package/numkong/cmake/nk_power_isa_probes.cmake +15 -0
  100. package/numkong/cmake/nk_riscv_isa_probes.cmake +19 -0
  101. package/numkong/cmake/nk_x86_isa_probes.cmake +35 -0
  102. package/numkong/cmake/toolchain-aarch64-gnu.cmake +86 -0
  103. package/numkong/cmake/toolchain-android-arm64.cmake +25 -0
  104. package/numkong/cmake/toolchain-android-armv7.cmake +25 -0
  105. package/numkong/cmake/toolchain-loongarch64-gnu.cmake +68 -0
  106. package/numkong/cmake/toolchain-ppc64le-gnu.cmake +74 -0
  107. package/numkong/cmake/toolchain-riscv64-gnu.cmake +107 -0
  108. package/numkong/cmake/toolchain-riscv64-llvm.cmake +114 -0
  109. package/numkong/cmake/toolchain-wasi.cmake +77 -0
  110. package/numkong/cmake/toolchain-wasm.cmake +70 -0
  111. package/numkong/cmake/toolchain-wasm64.cmake +62 -0
  112. package/numkong/cmake/toolchain-x86_64-llvm.cmake +47 -0
  113. package/numkong/include/README.md +643 -0
  114. package/numkong/include/module.modulemap +129 -0
  115. package/numkong/include/numkong/attention/sapphireamx.h +1363 -0
  116. package/numkong/include/numkong/attention/sme.h +2075 -0
  117. package/numkong/include/numkong/attention.h +49 -0
  118. package/numkong/include/numkong/capabilities.h +930 -0
  119. package/numkong/include/numkong/cast/README.md +262 -0
  120. package/numkong/include/numkong/cast/diamond.h +64 -0
  121. package/numkong/include/numkong/cast/haswell.h +823 -0
  122. package/numkong/include/numkong/cast/icelake.h +475 -0
  123. package/numkong/include/numkong/cast/loongsonasx.h +252 -0
  124. package/numkong/include/numkong/cast/neon.h +1174 -0
  125. package/numkong/include/numkong/cast/powervsx.h +449 -0
  126. package/numkong/include/numkong/cast/rvv.h +970 -0
  127. package/numkong/include/numkong/cast/sapphire.h +262 -0
  128. package/numkong/include/numkong/cast/serial.h +2336 -0
  129. package/numkong/include/numkong/cast/skylake.h +915 -0
  130. package/numkong/include/numkong/cast/v128relaxed.h +537 -0
  131. package/numkong/include/numkong/cast.h +254 -0
  132. package/numkong/include/numkong/cast.hpp +44 -0
  133. package/numkong/include/numkong/curved/README.md +223 -0
  134. package/numkong/include/numkong/curved/genoa.h +182 -0
  135. package/numkong/include/numkong/curved/haswell.h +276 -0
  136. package/numkong/include/numkong/curved/neon.h +329 -0
  137. package/numkong/include/numkong/curved/neonbfdot.h +211 -0
  138. package/numkong/include/numkong/curved/rvv.h +305 -0
  139. package/numkong/include/numkong/curved/serial.h +207 -0
  140. package/numkong/include/numkong/curved/skylake.h +457 -0
  141. package/numkong/include/numkong/curved/smef64.h +530 -0
  142. package/numkong/include/numkong/curved.h +513 -0
  143. package/numkong/include/numkong/curved.hpp +144 -0
  144. package/numkong/include/numkong/dot/README.md +442 -0
  145. package/numkong/include/numkong/dot/alder.h +563 -0
  146. package/numkong/include/numkong/dot/diamond.h +158 -0
  147. package/numkong/include/numkong/dot/genoa.h +289 -0
  148. package/numkong/include/numkong/dot/haswell.h +1723 -0
  149. package/numkong/include/numkong/dot/icelake.h +997 -0
  150. package/numkong/include/numkong/dot/loongsonasx.h +671 -0
  151. package/numkong/include/numkong/dot/neon.h +869 -0
  152. package/numkong/include/numkong/dot/neonbfdot.h +243 -0
  153. package/numkong/include/numkong/dot/neonfhm.h +358 -0
  154. package/numkong/include/numkong/dot/neonfp8.h +323 -0
  155. package/numkong/include/numkong/dot/neonsdot.h +622 -0
  156. package/numkong/include/numkong/dot/powervsx.h +752 -0
  157. package/numkong/include/numkong/dot/rvv.h +722 -0
  158. package/numkong/include/numkong/dot/rvvbb.h +72 -0
  159. package/numkong/include/numkong/dot/rvvbf16.h +123 -0
  160. package/numkong/include/numkong/dot/rvvhalf.h +129 -0
  161. package/numkong/include/numkong/dot/sapphire.h +141 -0
  162. package/numkong/include/numkong/dot/serial.h +874 -0
  163. package/numkong/include/numkong/dot/sierra.h +405 -0
  164. package/numkong/include/numkong/dot/skylake.h +1116 -0
  165. package/numkong/include/numkong/dot/sve.h +420 -0
  166. package/numkong/include/numkong/dot/svebfdot.h +75 -0
  167. package/numkong/include/numkong/dot/svehalf.h +168 -0
  168. package/numkong/include/numkong/dot/svesdot.h +90 -0
  169. package/numkong/include/numkong/dot/v128relaxed.h +1293 -0
  170. package/numkong/include/numkong/dot.h +1136 -0
  171. package/numkong/include/numkong/dot.hpp +94 -0
  172. package/numkong/include/numkong/dots/README.md +496 -0
  173. package/numkong/include/numkong/dots/alder.h +117 -0
  174. package/numkong/include/numkong/dots/diamond.h +86 -0
  175. package/numkong/include/numkong/dots/genoa.h +100 -0
  176. package/numkong/include/numkong/dots/graniteamx.h +733 -0
  177. package/numkong/include/numkong/dots/haswell.h +310 -0
  178. package/numkong/include/numkong/dots/icelake.h +180 -0
  179. package/numkong/include/numkong/dots/loongsonasx.h +176 -0
  180. package/numkong/include/numkong/dots/neon.h +123 -0
  181. package/numkong/include/numkong/dots/neonbfdot.h +59 -0
  182. package/numkong/include/numkong/dots/neonfhm.h +96 -0
  183. package/numkong/include/numkong/dots/neonfp8.h +99 -0
  184. package/numkong/include/numkong/dots/neonsdot.h +144 -0
  185. package/numkong/include/numkong/dots/powervsx.h +194 -0
  186. package/numkong/include/numkong/dots/rvv.h +2593 -0
  187. package/numkong/include/numkong/dots/sapphireamx.h +4017 -0
  188. package/numkong/include/numkong/dots/serial.h +2867 -0
  189. package/numkong/include/numkong/dots/sierra.h +100 -0
  190. package/numkong/include/numkong/dots/skylake.h +207 -0
  191. package/numkong/include/numkong/dots/sme.h +5041 -0
  192. package/numkong/include/numkong/dots/smebi32.h +477 -0
  193. package/numkong/include/numkong/dots/smef64.h +1328 -0
  194. package/numkong/include/numkong/dots/smehalf.h +47 -0
  195. package/numkong/include/numkong/dots/v128relaxed.h +317 -0
  196. package/numkong/include/numkong/dots.h +3110 -0
  197. package/numkong/include/numkong/dots.hpp +641 -0
  198. package/numkong/include/numkong/each/README.md +465 -0
  199. package/numkong/include/numkong/each/haswell.h +1658 -0
  200. package/numkong/include/numkong/each/icelake.h +272 -0
  201. package/numkong/include/numkong/each/neon.h +1138 -0
  202. package/numkong/include/numkong/each/neonbfdot.h +211 -0
  203. package/numkong/include/numkong/each/neonhalf.h +318 -0
  204. package/numkong/include/numkong/each/rvv.h +1121 -0
  205. package/numkong/include/numkong/each/sapphire.h +343 -0
  206. package/numkong/include/numkong/each/serial.h +282 -0
  207. package/numkong/include/numkong/each/skylake.h +1562 -0
  208. package/numkong/include/numkong/each/v128relaxed.h +562 -0
  209. package/numkong/include/numkong/each.h +2232 -0
  210. package/numkong/include/numkong/each.hpp +434 -0
  211. package/numkong/include/numkong/geospatial/README.md +147 -0
  212. package/numkong/include/numkong/geospatial/haswell.h +633 -0
  213. package/numkong/include/numkong/geospatial/neon.h +615 -0
  214. package/numkong/include/numkong/geospatial/rvv.h +701 -0
  215. package/numkong/include/numkong/geospatial/serial.h +309 -0
  216. package/numkong/include/numkong/geospatial/skylake.h +613 -0
  217. package/numkong/include/numkong/geospatial/v128relaxed.h +652 -0
  218. package/numkong/include/numkong/geospatial.h +453 -0
  219. package/numkong/include/numkong/geospatial.hpp +235 -0
  220. package/numkong/include/numkong/matrix.hpp +336 -0
  221. package/numkong/include/numkong/maxsim/README.md +187 -0
  222. package/numkong/include/numkong/maxsim/alder.h +511 -0
  223. package/numkong/include/numkong/maxsim/genoa.h +115 -0
  224. package/numkong/include/numkong/maxsim/haswell.h +553 -0
  225. package/numkong/include/numkong/maxsim/icelake.h +480 -0
  226. package/numkong/include/numkong/maxsim/neonsdot.h +394 -0
  227. package/numkong/include/numkong/maxsim/sapphireamx.h +877 -0
  228. package/numkong/include/numkong/maxsim/serial.h +490 -0
  229. package/numkong/include/numkong/maxsim/sme.h +993 -0
  230. package/numkong/include/numkong/maxsim/v128relaxed.h +280 -0
  231. package/numkong/include/numkong/maxsim.h +571 -0
  232. package/numkong/include/numkong/maxsim.hpp +133 -0
  233. package/numkong/include/numkong/mesh/README.md +219 -0
  234. package/numkong/include/numkong/mesh/haswell.h +2013 -0
  235. package/numkong/include/numkong/mesh/neon.h +1821 -0
  236. package/numkong/include/numkong/mesh/neonbfdot.h +771 -0
  237. package/numkong/include/numkong/mesh/rvv.h +936 -0
  238. package/numkong/include/numkong/mesh/serial.h +721 -0
  239. package/numkong/include/numkong/mesh/skylake.h +2344 -0
  240. package/numkong/include/numkong/mesh/v128relaxed.h +1081 -0
  241. package/numkong/include/numkong/mesh.h +666 -0
  242. package/numkong/include/numkong/mesh.hpp +701 -0
  243. package/numkong/include/numkong/numkong.h +78 -0
  244. package/numkong/include/numkong/numkong.hpp +58 -0
  245. package/numkong/include/numkong/probability/README.md +177 -0
  246. package/numkong/include/numkong/probability/haswell.h +267 -0
  247. package/numkong/include/numkong/probability/neon.h +255 -0
  248. package/numkong/include/numkong/probability/rvv.h +414 -0
  249. package/numkong/include/numkong/probability/serial.h +181 -0
  250. package/numkong/include/numkong/probability/skylake.h +324 -0
  251. package/numkong/include/numkong/probability.h +380 -0
  252. package/numkong/include/numkong/probability.hpp +120 -0
  253. package/numkong/include/numkong/random.h +50 -0
  254. package/numkong/include/numkong/random.hpp +285 -0
  255. package/numkong/include/numkong/reduce/README.md +552 -0
  256. package/numkong/include/numkong/reduce/alder.h +636 -0
  257. package/numkong/include/numkong/reduce/genoa.h +201 -0
  258. package/numkong/include/numkong/reduce/haswell.h +3785 -0
  259. package/numkong/include/numkong/reduce/icelake.h +549 -0
  260. package/numkong/include/numkong/reduce/neon.h +3980 -0
  261. package/numkong/include/numkong/reduce/neonbfdot.h +142 -0
  262. package/numkong/include/numkong/reduce/neonfhm.h +293 -0
  263. package/numkong/include/numkong/reduce/neonsdot.h +357 -0
  264. package/numkong/include/numkong/reduce/rvv.h +3533 -0
  265. package/numkong/include/numkong/reduce/serial.h +753 -0
  266. package/numkong/include/numkong/reduce/sierra.h +338 -0
  267. package/numkong/include/numkong/reduce/skylake.h +3794 -0
  268. package/numkong/include/numkong/reduce/sve.h +52 -0
  269. package/numkong/include/numkong/reduce/v128relaxed.h +2302 -0
  270. package/numkong/include/numkong/reduce.h +1582 -0
  271. package/numkong/include/numkong/reduce.hpp +778 -0
  272. package/numkong/include/numkong/scalar/README.md +89 -0
  273. package/numkong/include/numkong/scalar/haswell.h +122 -0
  274. package/numkong/include/numkong/scalar/loongsonasx.h +74 -0
  275. package/numkong/include/numkong/scalar/neon.h +122 -0
  276. package/numkong/include/numkong/scalar/neonhalf.h +70 -0
  277. package/numkong/include/numkong/scalar/powervsx.h +96 -0
  278. package/numkong/include/numkong/scalar/rvv.h +211 -0
  279. package/numkong/include/numkong/scalar/sapphire.h +74 -0
  280. package/numkong/include/numkong/scalar/serial.h +332 -0
  281. package/numkong/include/numkong/scalar/v128relaxed.h +56 -0
  282. package/numkong/include/numkong/scalar.h +696 -0
  283. package/numkong/include/numkong/set/README.md +179 -0
  284. package/numkong/include/numkong/set/haswell.h +334 -0
  285. package/numkong/include/numkong/set/icelake.h +485 -0
  286. package/numkong/include/numkong/set/loongsonasx.h +181 -0
  287. package/numkong/include/numkong/set/neon.h +363 -0
  288. package/numkong/include/numkong/set/powervsx.h +326 -0
  289. package/numkong/include/numkong/set/rvv.h +226 -0
  290. package/numkong/include/numkong/set/rvvbb.h +117 -0
  291. package/numkong/include/numkong/set/serial.h +174 -0
  292. package/numkong/include/numkong/set/sve.h +187 -0
  293. package/numkong/include/numkong/set/v128relaxed.h +240 -0
  294. package/numkong/include/numkong/set.h +471 -0
  295. package/numkong/include/numkong/set.hpp +114 -0
  296. package/numkong/include/numkong/sets/README.md +149 -0
  297. package/numkong/include/numkong/sets/haswell.h +63 -0
  298. package/numkong/include/numkong/sets/icelake.h +66 -0
  299. package/numkong/include/numkong/sets/loongsonasx.h +52 -0
  300. package/numkong/include/numkong/sets/neon.h +61 -0
  301. package/numkong/include/numkong/sets/powervsx.h +65 -0
  302. package/numkong/include/numkong/sets/serial.h +43 -0
  303. package/numkong/include/numkong/sets/smebi32.h +1135 -0
  304. package/numkong/include/numkong/sets/v128relaxed.h +58 -0
  305. package/numkong/include/numkong/sets.h +382 -0
  306. package/numkong/include/numkong/sparse/README.md +156 -0
  307. package/numkong/include/numkong/sparse/icelake.h +463 -0
  308. package/numkong/include/numkong/sparse/neon.h +288 -0
  309. package/numkong/include/numkong/sparse/serial.h +117 -0
  310. package/numkong/include/numkong/sparse/sve2.h +504 -0
  311. package/numkong/include/numkong/sparse/turin.h +322 -0
  312. package/numkong/include/numkong/sparse.h +363 -0
  313. package/numkong/include/numkong/sparse.hpp +113 -0
  314. package/numkong/include/numkong/spatial/README.md +439 -0
  315. package/numkong/include/numkong/spatial/alder.h +604 -0
  316. package/numkong/include/numkong/spatial/diamond.h +240 -0
  317. package/numkong/include/numkong/spatial/genoa.h +222 -0
  318. package/numkong/include/numkong/spatial/haswell.h +979 -0
  319. package/numkong/include/numkong/spatial/icelake.h +1067 -0
  320. package/numkong/include/numkong/spatial/loongsonasx.h +483 -0
  321. package/numkong/include/numkong/spatial/neon.h +846 -0
  322. package/numkong/include/numkong/spatial/neonbfdot.h +164 -0
  323. package/numkong/include/numkong/spatial/neonfp8.h +258 -0
  324. package/numkong/include/numkong/spatial/neonsdot.h +429 -0
  325. package/numkong/include/numkong/spatial/powervsx.h +738 -0
  326. package/numkong/include/numkong/spatial/rvv.h +991 -0
  327. package/numkong/include/numkong/spatial/rvvbf16.h +128 -0
  328. package/numkong/include/numkong/spatial/rvvhalf.h +120 -0
  329. package/numkong/include/numkong/spatial/serial.h +347 -0
  330. package/numkong/include/numkong/spatial/sierra.h +516 -0
  331. package/numkong/include/numkong/spatial/skylake.h +605 -0
  332. package/numkong/include/numkong/spatial/sve.h +246 -0
  333. package/numkong/include/numkong/spatial/svebfdot.h +125 -0
  334. package/numkong/include/numkong/spatial/svehalf.h +136 -0
  335. package/numkong/include/numkong/spatial/svesdot.h +143 -0
  336. package/numkong/include/numkong/spatial/v128relaxed.h +969 -0
  337. package/numkong/include/numkong/spatial.h +1681 -0
  338. package/numkong/include/numkong/spatial.hpp +183 -0
  339. package/numkong/include/numkong/spatials/README.md +580 -0
  340. package/numkong/include/numkong/spatials/alder.h +94 -0
  341. package/numkong/include/numkong/spatials/diamond.h +82 -0
  342. package/numkong/include/numkong/spatials/genoa.h +94 -0
  343. package/numkong/include/numkong/spatials/graniteamx.h +173 -0
  344. package/numkong/include/numkong/spatials/haswell.h +219 -0
  345. package/numkong/include/numkong/spatials/icelake.h +113 -0
  346. package/numkong/include/numkong/spatials/loongsonasx.h +153 -0
  347. package/numkong/include/numkong/spatials/neon.h +109 -0
  348. package/numkong/include/numkong/spatials/neonbfdot.h +60 -0
  349. package/numkong/include/numkong/spatials/neonfhm.h +92 -0
  350. package/numkong/include/numkong/spatials/neonfp8.h +111 -0
  351. package/numkong/include/numkong/spatials/neonsdot.h +143 -0
  352. package/numkong/include/numkong/spatials/powervsx.h +153 -0
  353. package/numkong/include/numkong/spatials/rvv.h +1976 -0
  354. package/numkong/include/numkong/spatials/sapphireamx.h +1149 -0
  355. package/numkong/include/numkong/spatials/serial.h +248 -0
  356. package/numkong/include/numkong/spatials/sierra.h +96 -0
  357. package/numkong/include/numkong/spatials/skylake.h +184 -0
  358. package/numkong/include/numkong/spatials/sme.h +1927 -0
  359. package/numkong/include/numkong/spatials/smef64.h +483 -0
  360. package/numkong/include/numkong/spatials/v128relaxed.h +240 -0
  361. package/numkong/include/numkong/spatials.h +3374 -0
  362. package/numkong/include/numkong/spatials.hpp +509 -0
  363. package/numkong/include/numkong/tensor.hpp +1981 -0
  364. package/numkong/include/numkong/trigonometry/README.md +184 -0
  365. package/numkong/include/numkong/trigonometry/haswell.h +653 -0
  366. package/numkong/include/numkong/trigonometry/neon.h +638 -0
  367. package/numkong/include/numkong/trigonometry/rvv.h +700 -0
  368. package/numkong/include/numkong/trigonometry/serial.h +703 -0
  369. package/numkong/include/numkong/trigonometry/skylake.h +725 -0
  370. package/numkong/include/numkong/trigonometry/v128relaxed.h +667 -0
  371. package/numkong/include/numkong/trigonometry.h +467 -0
  372. package/numkong/include/numkong/trigonometry.hpp +166 -0
  373. package/numkong/include/numkong/types.h +1695 -0
  374. package/numkong/include/numkong/types.hpp +6027 -0
  375. package/numkong/include/numkong/vector.hpp +766 -0
  376. package/numkong/javascript/@numkong-darwin-arm64/package.json +26 -0
  377. package/numkong/javascript/@numkong-darwin-x64/package.json +26 -0
  378. package/numkong/javascript/@numkong-linux-arm64/package.json +25 -0
  379. package/numkong/javascript/@numkong-linux-x64/package.json +25 -0
  380. package/numkong/javascript/@numkong-win32-arm64/package.json +25 -0
  381. package/numkong/javascript/@numkong-win32-x64/package.json +25 -0
  382. package/numkong/javascript/README.md +254 -0
  383. package/numkong/javascript/node-gyp-build.d.ts +4 -0
  384. package/numkong/javascript/numkong-browser.ts +40 -0
  385. package/numkong/javascript/numkong-wasm.ts +750 -0
  386. package/numkong/javascript/numkong.c +712 -0
  387. package/numkong/javascript/numkong.ts +613 -0
  388. package/{simsimd → numkong}/javascript/tsconfig-base.json +6 -3
  389. package/numkong/javascript/tsconfig-cjs.json +13 -0
  390. package/{simsimd → numkong}/javascript/tsconfig-esm.json +1 -1
  391. package/numkong/javascript/types.ts +784 -0
  392. package/numkong/numkong.gypi +104 -0
  393. package/numkong/package.json +108 -0
  394. package/numkong/probes/arm_neon.c +8 -0
  395. package/numkong/probes/arm_neon_bfdot.c +9 -0
  396. package/numkong/probes/arm_neon_fhm.c +9 -0
  397. package/numkong/probes/arm_neon_half.c +8 -0
  398. package/numkong/probes/arm_neon_sdot.c +9 -0
  399. package/numkong/probes/arm_neonfp8.c +9 -0
  400. package/numkong/probes/arm_sme.c +16 -0
  401. package/numkong/probes/arm_sme2.c +16 -0
  402. package/numkong/probes/arm_sme2p1.c +16 -0
  403. package/numkong/probes/arm_sme_bf16.c +16 -0
  404. package/numkong/probes/arm_sme_bi32.c +16 -0
  405. package/numkong/probes/arm_sme_f64.c +16 -0
  406. package/numkong/probes/arm_sme_fa64.c +14 -0
  407. package/numkong/probes/arm_sme_half.c +16 -0
  408. package/numkong/probes/arm_sme_lut2.c +15 -0
  409. package/numkong/probes/arm_sve.c +18 -0
  410. package/numkong/probes/arm_sve2.c +20 -0
  411. package/numkong/probes/arm_sve2p1.c +18 -0
  412. package/numkong/probes/arm_sve_bfdot.c +20 -0
  413. package/numkong/probes/arm_sve_half.c +18 -0
  414. package/numkong/probes/arm_sve_sdot.c +21 -0
  415. package/numkong/probes/loongarch_lasx.c +12 -0
  416. package/numkong/probes/power_vsx.c +12 -0
  417. package/numkong/probes/probe.js +127 -0
  418. package/numkong/probes/riscv_rvv.c +14 -0
  419. package/numkong/probes/riscv_rvv_bb.c +15 -0
  420. package/numkong/probes/riscv_rvv_bf16.c +17 -0
  421. package/numkong/probes/riscv_rvv_half.c +14 -0
  422. package/numkong/probes/wasm_v128relaxed.c +11 -0
  423. package/numkong/probes/x86_alder.c +17 -0
  424. package/numkong/probes/x86_diamond.c +17 -0
  425. package/numkong/probes/x86_genoa.c +17 -0
  426. package/numkong/probes/x86_graniteamx.c +19 -0
  427. package/numkong/probes/x86_haswell.c +11 -0
  428. package/numkong/probes/x86_icelake.c +17 -0
  429. package/numkong/probes/x86_sapphire.c +16 -0
  430. package/numkong/probes/x86_sapphireamx.c +18 -0
  431. package/numkong/probes/x86_sierra.c +17 -0
  432. package/numkong/probes/x86_skylake.c +15 -0
  433. package/numkong/probes/x86_turin.c +17 -0
  434. package/numkong/rust/README.md +698 -0
  435. package/numkong/rust/capabilities.rs +96 -0
  436. package/numkong/rust/cast.rs +314 -0
  437. package/numkong/rust/curved.rs +391 -0
  438. package/numkong/rust/each.rs +2721 -0
  439. package/numkong/rust/geospatial.rs +343 -0
  440. package/numkong/rust/matrix.rs +5424 -0
  441. package/numkong/rust/maxsim.rs +540 -0
  442. package/numkong/rust/mesh.rs +837 -0
  443. package/numkong/rust/numkong.rs +409 -0
  444. package/numkong/rust/probability.rs +272 -0
  445. package/numkong/rust/reduce.rs +1249 -0
  446. package/numkong/rust/set.rs +194 -0
  447. package/numkong/rust/sparse.rs +513 -0
  448. package/numkong/rust/spatial.rs +1815 -0
  449. package/numkong/rust/tensor.rs +7565 -0
  450. package/numkong/rust/types.rs +3666 -0
  451. package/numkong/rust/vector.rs +1899 -0
  452. package/numkong/rustfmt.toml +2 -0
  453. package/numkong/swift/Matrix.swift +1388 -0
  454. package/numkong/swift/MaxSim.swift +151 -0
  455. package/numkong/swift/NumKong.swift +283 -0
  456. package/numkong/swift/Numerics.swift +329 -0
  457. package/numkong/swift/README.md +433 -0
  458. package/numkong/swift/Scalar.swift +741 -0
  459. package/numkong/swift/Tensor.swift +209 -0
  460. package/numkong/test/README.md +315 -0
  461. package/numkong/test/playwright.config.ts +16 -0
  462. package/numkong/test/swift/Test.swift +534 -0
  463. package/numkong/test/test-browser-bundle-runner.mjs +36 -0
  464. package/numkong/test/test-browser-bundle.html +188 -0
  465. package/numkong/test/test-browser-runner.mjs +43 -0
  466. package/numkong/test/test-browser.html +305 -0
  467. package/numkong/test/test-dtypes.mjs +453 -0
  468. package/numkong/test/test-wasm.mjs +267 -0
  469. package/numkong/test/test.cpp +442 -0
  470. package/numkong/test/test.hpp +580 -0
  471. package/numkong/test/test.mjs +363 -0
  472. package/numkong/test/test_base.py +1041 -0
  473. package/numkong/test/test_cast.cpp +242 -0
  474. package/numkong/test/test_cross.hpp +551 -0
  475. package/numkong/test/test_cross.py +467 -0
  476. package/numkong/test/test_cross_amx.cpp +50 -0
  477. package/numkong/test/test_cross_arm.cpp +225 -0
  478. package/numkong/test/test_cross_blas.cpp +354 -0
  479. package/numkong/test/test_cross_loongarch.cpp +90 -0
  480. package/numkong/test/test_cross_power.cpp +73 -0
  481. package/numkong/test/test_cross_rvv.cpp +109 -0
  482. package/numkong/test/test_cross_serial.cpp +181 -0
  483. package/numkong/test/test_cross_sme.cpp +148 -0
  484. package/numkong/test/test_cross_wasm.cpp +141 -0
  485. package/numkong/test/test_cross_x86.cpp +442 -0
  486. package/numkong/test/test_curved.cpp +182 -0
  487. package/numkong/test/test_curved.py +207 -0
  488. package/numkong/test/test_dot.cpp +353 -0
  489. package/numkong/test/test_dot.py +296 -0
  490. package/numkong/test/test_each.cpp +437 -0
  491. package/numkong/test/test_each.py +756 -0
  492. package/numkong/test/test_geospatial.cpp +155 -0
  493. package/numkong/test/test_geospatial.py +241 -0
  494. package/numkong/test/test_maxsim.cpp +138 -0
  495. package/numkong/test/test_maxsim.py +209 -0
  496. package/numkong/test/test_mesh.cpp +203 -0
  497. package/numkong/test/test_mesh.py +394 -0
  498. package/numkong/test/test_probability.cpp +136 -0
  499. package/numkong/test/test_probability.py +166 -0
  500. package/numkong/test/test_reduce.cpp +563 -0
  501. package/numkong/test/test_reduce.py +781 -0
  502. package/numkong/test/test_set.cpp +151 -0
  503. package/numkong/test/test_set.py +120 -0
  504. package/numkong/test/test_similarities.py +579 -0
  505. package/numkong/test/test_sparse.cpp +121 -0
  506. package/numkong/test/test_sparse.py +118 -0
  507. package/numkong/test/test_spatial.cpp +518 -0
  508. package/numkong/test/test_spatial.py +269 -0
  509. package/numkong/test/test_tensor.cpp +884 -0
  510. package/numkong/test/test_tensor.py +1417 -0
  511. package/numkong/test/test_trigonometry.cpp +156 -0
  512. package/numkong/test/test_trigonometry.py +180 -0
  513. package/package.json +7 -8
  514. package/prebuilds/darwin-arm64+x64/usearch.node +0 -0
  515. package/prebuilds/linux-arm64/usearch.node +0 -0
  516. package/prebuilds/linux-x64/usearch.node +0 -0
  517. package/fp16/CMakeLists.txt +0 -176
  518. package/fp16/LICENSE +0 -11
  519. package/fp16/README.md +0 -20
  520. package/fp16/bench/alt-element.cc +0 -89
  521. package/fp16/bench/from-alt-array.cc +0 -175
  522. package/fp16/bench/from-ieee-array.cc +0 -399
  523. package/fp16/bench/ieee-element.cc +0 -272
  524. package/fp16/bench/to-alt-array.cc +0 -91
  525. package/fp16/bench/to-ieee-array.cc +0 -303
  526. package/fp16/cmake/DownloadGoogleBenchmark.cmake +0 -15
  527. package/fp16/cmake/DownloadGoogleTest.cmake +0 -15
  528. package/fp16/cmake/DownloadPSimd.cmake +0 -15
  529. package/fp16/configure.py +0 -65
  530. package/fp16/confu.yaml +0 -8
  531. package/fp16/include/fp16/__init__.py +0 -0
  532. package/fp16/include/fp16/avx.py +0 -50
  533. package/fp16/include/fp16/avx2.py +0 -53
  534. package/fp16/include/fp16/bitcasts.h +0 -92
  535. package/fp16/include/fp16/fp16.h +0 -451
  536. package/fp16/include/fp16/psimd.h +0 -131
  537. package/fp16/include/fp16.h +0 -11
  538. package/fp16/jni/Android.mk +0 -6
  539. package/fp16/jni/Application.mk +0 -4
  540. package/fp16/test/alt-from-fp32-value.cc +0 -498
  541. package/fp16/test/alt-to-fp32-bits.cc +0 -263
  542. package/fp16/test/alt-to-fp32-psimd.cc +0 -145
  543. package/fp16/test/alt-to-fp32-value.cc +0 -348
  544. package/fp16/test/alt-to-fp32x2-psimd.cc +0 -245
  545. package/fp16/test/bitcasts.cc +0 -56
  546. package/fp16/test/ieee-from-fp32-value.cc +0 -523
  547. package/fp16/test/ieee-to-fp32-bits.cc +0 -333
  548. package/fp16/test/ieee-to-fp32-psimd.cc +0 -312
  549. package/fp16/test/ieee-to-fp32-value.cc +0 -420
  550. package/fp16/test/ieee-to-fp32x2-psimd.cc +0 -541
  551. package/fp16/test/peachpy/alt-xmm-to-fp32-xmm-avx.cc +0 -96
  552. package/fp16/test/peachpy/alt-xmm-to-fp32-ymm-avx2.cc +0 -96
  553. package/fp16/test/peachpy/stubs.py +0 -38
  554. package/fp16/test/tables.cc +0 -530
  555. package/fp16/test/tables.h +0 -13
  556. package/fp16/third-party/THHalf.h +0 -92
  557. package/fp16/third-party/eigen-half.h +0 -170
  558. package/fp16/third-party/float16-compressor.h +0 -80
  559. package/fp16/third-party/half.hpp +0 -2916
  560. package/fp16/third-party/npy-halffloat.h +0 -328
  561. package/simsimd/.git-blame-ignore-revs +0 -2
  562. package/simsimd/CONTRIBUTING.md +0 -321
  563. package/simsimd/Cargo.toml +0 -49
  564. package/simsimd/MANIFEST.in +0 -4
  565. package/simsimd/Package.swift +0 -28
  566. package/simsimd/README.md +0 -1493
  567. package/simsimd/binding.gyp +0 -35
  568. package/simsimd/build.rs +0 -70
  569. package/simsimd/c/lib.c +0 -374
  570. package/simsimd/include/module.modulemap +0 -4
  571. package/simsimd/include/simsimd/binary.h +0 -486
  572. package/simsimd/include/simsimd/curved.h +0 -1541
  573. package/simsimd/include/simsimd/dot.h +0 -1853
  574. package/simsimd/include/simsimd/elementwise.h +0 -2465
  575. package/simsimd/include/simsimd/geospatial.h +0 -43
  576. package/simsimd/include/simsimd/mesh.h +0 -69
  577. package/simsimd/include/simsimd/probability.h +0 -606
  578. package/simsimd/include/simsimd/simsimd.h +0 -2567
  579. package/simsimd/include/simsimd/sparse.h +0 -1384
  580. package/simsimd/include/simsimd/spatial.h +0 -2335
  581. package/simsimd/include/simsimd/types.h +0 -666
  582. package/simsimd/javascript/fallback.ts +0 -233
  583. package/simsimd/javascript/lib.c +0 -125
  584. package/simsimd/javascript/node-gyp-build.d.ts +0 -1
  585. package/simsimd/javascript/simsimd.ts +0 -179
  586. package/simsimd/javascript/tsconfig-cjs.json +0 -8
  587. package/simsimd/package-lock.json +0 -1761
  588. package/simsimd/package.json +0 -61
  589. package/simsimd/rust/lib.rs +0 -1821
  590. package/simsimd/scripts/bench.cxx +0 -1170
  591. package/simsimd/scripts/bench.ipynb +0 -187
  592. package/simsimd/scripts/bench.js +0 -127
  593. package/simsimd/scripts/bench.rs +0 -876
  594. package/simsimd/scripts/bench_vectors.py +0 -734
  595. package/simsimd/scripts/bench_vectors_live.py +0 -213
  596. package/simsimd/scripts/test.c +0 -187
  597. package/simsimd/scripts/test.mjs +0 -220
  598. package/simsimd/scripts/test.py +0 -1505
  599. package/simsimd/swift/SimSIMD.swift +0 -149
  600. package/simsimd/swift/Test.swift +0 -128
  601. /package/{simsimd → numkong}/CODE_OF_CONDUCT.md +0 -0
  602. /package/{simsimd → numkong}/LICENSE +0 -0
  603. /package/{simsimd → numkong}/javascript/dist-package-cjs.json +0 -0
  604. /package/{simsimd → numkong}/javascript/dist-package-esm.json +0 -0
@@ -0,0 +1,696 @@
1
+ /**
2
+ * @brief SIMD-accelerated Scalar Math Helpers.
3
+ * @file include/numkong/scalar.h
4
+ * @author Ash Vardanian
5
+ * @date March 1, 2026
6
+ *
7
+ * Provides dispatchable scalar helpers: sqrt, rsqrt, fma, saturating arithmetic,
8
+ * and ordering. Each ISA file is header-only with
9
+ * `NK_PUBLIC static inline` implementations; compile-time dispatch selects the
10
+ * best available backend when `NK_DYNAMIC_DISPATCH` is off.
11
+ *
12
+ * For hardware architectures:
13
+ *
14
+ * - Serial: software-emulated (Quake 3 rsqrt, bit-manipulation casts)
15
+ * - Arm: NEON (sqrt, fma, saturating_add)
16
+ * - x86: Haswell (sqrt, rsqrt, fma)
17
+ * - RISC-V: RVV (sqrt, rsqrt, fma, saturating_add via vfrsqrt7 + Newton-Raphson)
18
+ * - WASM: V128Relaxed (sqrt)
19
+ */
20
+ #ifndef NK_SCALAR_H
21
+ #define NK_SCALAR_H
22
+
23
+ #include "numkong/types.h"
24
+
25
+ #if defined(__cplusplus)
26
+ extern "C" {
27
+ #endif
28
+
29
+ /**
30
+ * @brief Scalar square root: `√x`.
31
+ *
32
+ * @param[in] x The input value.
33
+ * @return The square root of @p x.
34
+ */
35
+ NK_DYNAMIC nk_f32_t nk_f32_sqrt(nk_f32_t x);
36
+ /** @copydoc nk_f32_sqrt */
37
+ NK_DYNAMIC nk_f64_t nk_f64_sqrt(nk_f64_t x);
38
+
39
+ /**
40
+ * @brief Scalar reciprocal square root: `1/√x`.
41
+ * @sa std::rsqrt, @sa Rust f32::rsqrt
42
+ *
43
+ * @param[in] x The input value.
44
+ * @return The reciprocal square root of @p x.
45
+ */
46
+ NK_DYNAMIC nk_f32_t nk_f32_rsqrt(nk_f32_t x);
47
+ /** @copydoc nk_f32_rsqrt */
48
+ NK_DYNAMIC nk_f64_t nk_f64_rsqrt(nk_f64_t x);
49
+
50
+ /**
51
+ * @brief Scalar fused multiply-add: `a × b + c`.
52
+ * @sa std::fma, @sa Rust f32::mul_add
53
+ *
54
+ * @param[in] a Multiplicand.
55
+ * @param[in] b Multiplier.
56
+ * @param[in] c Addend.
57
+ * @return `a * b + c` computed without intermediate rounding.
58
+ */
59
+ NK_DYNAMIC nk_f32_t nk_f32_fma(nk_f32_t a, nk_f32_t b, nk_f32_t c);
60
+ /** @copydoc nk_f32_fma */
61
+ NK_DYNAMIC nk_f64_t nk_f64_fma(nk_f64_t a, nk_f64_t b, nk_f64_t c);
62
+
63
+ /** @copydoc nk_f32_sqrt */
64
+ NK_DYNAMIC nk_f16_t nk_f16_sqrt(nk_f16_t x);
65
+ /** @copydoc nk_f32_rsqrt */
66
+ NK_DYNAMIC nk_f16_t nk_f16_rsqrt(nk_f16_t x);
67
+ /** @copydoc nk_f32_fma */
68
+ NK_DYNAMIC nk_f16_t nk_f16_fma(nk_f16_t a, nk_f16_t b, nk_f16_t c);
69
+
70
+ /**
71
+ * @brief Saturating addition clamped to the representable range of the type.
72
+ *
73
+ * @param[in] a First operand.
74
+ * @param[in] b Second operand.
75
+ * @return `clamp(a + b, MIN, MAX)`.
76
+ */
77
+ NK_DYNAMIC nk_u8_t nk_u8_saturating_add(nk_u8_t a, nk_u8_t b);
78
+ /** @copydoc nk_u8_saturating_add */
79
+ NK_DYNAMIC nk_i8_t nk_i8_saturating_add(nk_i8_t a, nk_i8_t b);
80
+ /** @copydoc nk_u8_saturating_add */
81
+ NK_DYNAMIC nk_u16_t nk_u16_saturating_add(nk_u16_t a, nk_u16_t b);
82
+ /** @copydoc nk_u8_saturating_add */
83
+ NK_DYNAMIC nk_i16_t nk_i16_saturating_add(nk_i16_t a, nk_i16_t b);
84
+ /** @copydoc nk_u8_saturating_add */
85
+ NK_DYNAMIC nk_u32_t nk_u32_saturating_add(nk_u32_t a, nk_u32_t b);
86
+ /** @copydoc nk_u8_saturating_add */
87
+ NK_DYNAMIC nk_i32_t nk_i32_saturating_add(nk_i32_t a, nk_i32_t b);
88
+ /** @copydoc nk_u8_saturating_add */
89
+ NK_DYNAMIC nk_u64_t nk_u64_saturating_add(nk_u64_t a, nk_u64_t b);
90
+ /** @copydoc nk_u8_saturating_add */
91
+ NK_DYNAMIC nk_i64_t nk_i64_saturating_add(nk_i64_t a, nk_i64_t b);
92
+ /** @copydoc nk_u8_saturating_add */
93
+ NK_DYNAMIC nk_i4x2_t nk_i4x2_saturating_add(nk_i4x2_t a, nk_i4x2_t b);
94
+ /** @copydoc nk_u8_saturating_add */
95
+ NK_DYNAMIC nk_u4x2_t nk_u4x2_saturating_add(nk_u4x2_t a, nk_u4x2_t b);
96
+
97
+ /**
98
+ * @brief Saturating multiplication clamped to the representable range of the type.
99
+ *
100
+ * @param[in] a First operand.
101
+ * @param[in] b Second operand.
102
+ * @return `clamp(a * b, MIN, MAX)`.
103
+ */
104
+ NK_DYNAMIC nk_u8_t nk_u8_saturating_mul(nk_u8_t a, nk_u8_t b);
105
+ /** @copydoc nk_u8_saturating_mul */
106
+ NK_DYNAMIC nk_i8_t nk_i8_saturating_mul(nk_i8_t a, nk_i8_t b);
107
+ /** @copydoc nk_u8_saturating_mul */
108
+ NK_DYNAMIC nk_u16_t nk_u16_saturating_mul(nk_u16_t a, nk_u16_t b);
109
+ /** @copydoc nk_u8_saturating_mul */
110
+ NK_DYNAMIC nk_i16_t nk_i16_saturating_mul(nk_i16_t a, nk_i16_t b);
111
+ /** @copydoc nk_u8_saturating_mul */
112
+ NK_DYNAMIC nk_u32_t nk_u32_saturating_mul(nk_u32_t a, nk_u32_t b);
113
+ /** @copydoc nk_u8_saturating_mul */
114
+ NK_DYNAMIC nk_i32_t nk_i32_saturating_mul(nk_i32_t a, nk_i32_t b);
115
+ /** @copydoc nk_u8_saturating_mul */
116
+ NK_DYNAMIC nk_u64_t nk_u64_saturating_mul(nk_u64_t a, nk_u64_t b);
117
+ /** @copydoc nk_u8_saturating_mul */
118
+ NK_DYNAMIC nk_i64_t nk_i64_saturating_mul(nk_i64_t a, nk_i64_t b);
119
+ /** @copydoc nk_u8_saturating_mul */
120
+ NK_DYNAMIC nk_i4x2_t nk_i4x2_saturating_mul(nk_i4x2_t a, nk_i4x2_t b);
121
+ /** @copydoc nk_u8_saturating_mul */
122
+ NK_DYNAMIC nk_u4x2_t nk_u4x2_saturating_mul(nk_u4x2_t a, nk_u4x2_t b);
123
+
124
+ /**
125
+ * @brief Branchless sign-magnitude ordering for non-native floating-point scalars.
126
+ * @sa std::strong_order, Rust total_cmp
127
+ *
128
+ * Uses `mask = -sign; ordered = value ^ mask` — the constant offset cancels in subtraction.
129
+ * Returns negative if a < b, 0 if equal, positive if a > b.
130
+ *
131
+ * @param[in] a First operand.
132
+ * @param[in] b Second operand.
133
+ * @return Negative if `a < b`, zero if `a == b`, positive if `a > b`.
134
+ *
135
+ * @note NaN values are ordered at the extremes per IEEE 754 totalOrder
136
+ * (negative NaN < all finite < positive NaN). Callers requiring NaN-exclusion
137
+ * semantics must filter NaN before calling.
138
+ */
139
+ NK_DYNAMIC int nk_f16_order(nk_f16_t a, nk_f16_t b);
140
+ /** @copydoc nk_f16_order */
141
+ NK_DYNAMIC int nk_bf16_order(nk_bf16_t a, nk_bf16_t b);
142
+ /** @copydoc nk_f16_order */
143
+ NK_DYNAMIC int nk_e4m3_order(nk_e4m3_t a, nk_e4m3_t b);
144
+ /** @copydoc nk_f16_order */
145
+ NK_DYNAMIC int nk_e5m2_order(nk_e5m2_t a, nk_e5m2_t b);
146
+ /** @copydoc nk_f16_order */
147
+ NK_DYNAMIC int nk_e2m3_order(nk_e2m3_t a, nk_e2m3_t b);
148
+ /** @copydoc nk_f16_order */
149
+ NK_DYNAMIC int nk_e3m2_order(nk_e3m2_t a, nk_e3m2_t b);
150
+
151
+ /** @copydoc nk_f32_sqrt */
152
+ NK_PUBLIC nk_f32_t nk_f32_sqrt_serial(nk_f32_t x);
153
+ /** @copydoc nk_f64_sqrt */
154
+ NK_PUBLIC nk_f64_t nk_f64_sqrt_serial(nk_f64_t x);
155
+ /** @copydoc nk_f32_rsqrt */
156
+ NK_PUBLIC nk_f32_t nk_f32_rsqrt_serial(nk_f32_t x);
157
+ /** @copydoc nk_f64_rsqrt */
158
+ NK_PUBLIC nk_f64_t nk_f64_rsqrt_serial(nk_f64_t x);
159
+ /** @copydoc nk_f32_fma */
160
+ NK_PUBLIC nk_f32_t nk_f32_fma_serial(nk_f32_t a, nk_f32_t b, nk_f32_t c);
161
+ /** @copydoc nk_f64_fma */
162
+ NK_PUBLIC nk_f64_t nk_f64_fma_serial(nk_f64_t a, nk_f64_t b, nk_f64_t c);
163
+
164
+ /** @copydoc nk_f16_sqrt */
165
+ NK_PUBLIC nk_f16_t nk_f16_sqrt_serial(nk_f16_t x);
166
+ /** @copydoc nk_f16_rsqrt */
167
+ NK_PUBLIC nk_f16_t nk_f16_rsqrt_serial(nk_f16_t x);
168
+ /** @copydoc nk_f16_fma */
169
+ NK_PUBLIC nk_f16_t nk_f16_fma_serial(nk_f16_t a, nk_f16_t b, nk_f16_t c);
170
+
171
+ /** @copydoc nk_u8_saturating_add */
172
+ NK_PUBLIC nk_u8_t nk_u8_saturating_add_serial(nk_u8_t a, nk_u8_t b);
173
+ /** @copydoc nk_u8_saturating_add */
174
+ NK_PUBLIC nk_i8_t nk_i8_saturating_add_serial(nk_i8_t a, nk_i8_t b);
175
+ /** @copydoc nk_u8_saturating_add */
176
+ NK_PUBLIC nk_u16_t nk_u16_saturating_add_serial(nk_u16_t a, nk_u16_t b);
177
+ /** @copydoc nk_u8_saturating_add */
178
+ NK_PUBLIC nk_i16_t nk_i16_saturating_add_serial(nk_i16_t a, nk_i16_t b);
179
+ /** @copydoc nk_u8_saturating_add */
180
+ NK_PUBLIC nk_u32_t nk_u32_saturating_add_serial(nk_u32_t a, nk_u32_t b);
181
+ /** @copydoc nk_u8_saturating_add */
182
+ NK_PUBLIC nk_i32_t nk_i32_saturating_add_serial(nk_i32_t a, nk_i32_t b);
183
+ /** @copydoc nk_u8_saturating_add */
184
+ NK_PUBLIC nk_u64_t nk_u64_saturating_add_serial(nk_u64_t a, nk_u64_t b);
185
+ /** @copydoc nk_u8_saturating_add */
186
+ NK_PUBLIC nk_i64_t nk_i64_saturating_add_serial(nk_i64_t a, nk_i64_t b);
187
+ /** @copydoc nk_u8_saturating_add */
188
+ NK_PUBLIC nk_i4x2_t nk_i4x2_saturating_add_serial(nk_i4x2_t a, nk_i4x2_t b);
189
+ /** @copydoc nk_u8_saturating_add */
190
+ NK_PUBLIC nk_u4x2_t nk_u4x2_saturating_add_serial(nk_u4x2_t a, nk_u4x2_t b);
191
+
192
+ /** @copydoc nk_u8_saturating_mul */
193
+ NK_PUBLIC nk_u8_t nk_u8_saturating_mul_serial(nk_u8_t a, nk_u8_t b);
194
+ /** @copydoc nk_u8_saturating_mul */
195
+ NK_PUBLIC nk_i8_t nk_i8_saturating_mul_serial(nk_i8_t a, nk_i8_t b);
196
+ /** @copydoc nk_u8_saturating_mul */
197
+ NK_PUBLIC nk_u16_t nk_u16_saturating_mul_serial(nk_u16_t a, nk_u16_t b);
198
+ /** @copydoc nk_u8_saturating_mul */
199
+ NK_PUBLIC nk_i16_t nk_i16_saturating_mul_serial(nk_i16_t a, nk_i16_t b);
200
+ /** @copydoc nk_u8_saturating_mul */
201
+ NK_PUBLIC nk_u32_t nk_u32_saturating_mul_serial(nk_u32_t a, nk_u32_t b);
202
+ /** @copydoc nk_u8_saturating_mul */
203
+ NK_PUBLIC nk_i32_t nk_i32_saturating_mul_serial(nk_i32_t a, nk_i32_t b);
204
+ /** @copydoc nk_u8_saturating_mul */
205
+ NK_PUBLIC nk_u64_t nk_u64_saturating_mul_serial(nk_u64_t a, nk_u64_t b);
206
+ /** @copydoc nk_u8_saturating_mul */
207
+ NK_PUBLIC nk_i64_t nk_i64_saturating_mul_serial(nk_i64_t a, nk_i64_t b);
208
+ /** @copydoc nk_u8_saturating_mul */
209
+ NK_PUBLIC nk_i4x2_t nk_i4x2_saturating_mul_serial(nk_i4x2_t a, nk_i4x2_t b);
210
+ /** @copydoc nk_u8_saturating_mul */
211
+ NK_PUBLIC nk_u4x2_t nk_u4x2_saturating_mul_serial(nk_u4x2_t a, nk_u4x2_t b);
212
+
213
+ /** @copydoc nk_f16_order */
214
+ NK_PUBLIC int nk_f16_order_serial(nk_f16_t a, nk_f16_t b);
215
+ /** @copydoc nk_f16_order */
216
+ NK_PUBLIC int nk_bf16_order_serial(nk_bf16_t a, nk_bf16_t b);
217
+ /** @copydoc nk_f16_order */
218
+ NK_PUBLIC int nk_e4m3_order_serial(nk_e4m3_t a, nk_e4m3_t b);
219
+ /** @copydoc nk_f16_order */
220
+ NK_PUBLIC int nk_e5m2_order_serial(nk_e5m2_t a, nk_e5m2_t b);
221
+ /** @copydoc nk_f16_order */
222
+ NK_PUBLIC int nk_e2m3_order_serial(nk_e2m3_t a, nk_e2m3_t b);
223
+ /** @copydoc nk_f16_order */
224
+ NK_PUBLIC int nk_e3m2_order_serial(nk_e3m2_t a, nk_e3m2_t b);
225
+
226
+ #if NK_TARGET_NEON
227
+ /** @copydoc nk_f32_sqrt */
228
+ NK_PUBLIC nk_f32_t nk_f32_sqrt_neon(nk_f32_t x);
229
+ /** @copydoc nk_f64_sqrt */
230
+ NK_PUBLIC nk_f64_t nk_f64_sqrt_neon(nk_f64_t x);
231
+ /** @copydoc nk_f32_rsqrt */
232
+ NK_PUBLIC nk_f32_t nk_f32_rsqrt_neon(nk_f32_t x);
233
+ /** @copydoc nk_f64_rsqrt */
234
+ NK_PUBLIC nk_f64_t nk_f64_rsqrt_neon(nk_f64_t x);
235
+ /** @copydoc nk_f32_fma */
236
+ NK_PUBLIC nk_f32_t nk_f32_fma_neon(nk_f32_t a, nk_f32_t b, nk_f32_t c);
237
+ /** @copydoc nk_f64_fma */
238
+ NK_PUBLIC nk_f64_t nk_f64_fma_neon(nk_f64_t a, nk_f64_t b, nk_f64_t c);
239
+ /** @copydoc nk_u8_saturating_add */
240
+ NK_PUBLIC nk_u8_t nk_u8_saturating_add_neon(nk_u8_t a, nk_u8_t b);
241
+ /** @copydoc nk_u8_saturating_add */
242
+ NK_PUBLIC nk_i8_t nk_i8_saturating_add_neon(nk_i8_t a, nk_i8_t b);
243
+ /** @copydoc nk_u8_saturating_add */
244
+ NK_PUBLIC nk_u16_t nk_u16_saturating_add_neon(nk_u16_t a, nk_u16_t b);
245
+ /** @copydoc nk_u8_saturating_add */
246
+ NK_PUBLIC nk_i16_t nk_i16_saturating_add_neon(nk_i16_t a, nk_i16_t b);
247
+ /** @copydoc nk_u8_saturating_add */
248
+ NK_PUBLIC nk_u32_t nk_u32_saturating_add_neon(nk_u32_t a, nk_u32_t b);
249
+ /** @copydoc nk_u8_saturating_add */
250
+ NK_PUBLIC nk_i32_t nk_i32_saturating_add_neon(nk_i32_t a, nk_i32_t b);
251
+ /** @copydoc nk_u8_saturating_add */
252
+ NK_PUBLIC nk_u64_t nk_u64_saturating_add_neon(nk_u64_t a, nk_u64_t b);
253
+ /** @copydoc nk_u8_saturating_add */
254
+ NK_PUBLIC nk_i64_t nk_i64_saturating_add_neon(nk_i64_t a, nk_i64_t b);
255
+ /** @copydoc nk_u8_saturating_mul */
256
+ NK_PUBLIC nk_u64_t nk_u64_saturating_mul_neon(nk_u64_t a, nk_u64_t b);
257
+ /** @copydoc nk_u8_saturating_mul */
258
+ NK_PUBLIC nk_i64_t nk_i64_saturating_mul_neon(nk_i64_t a, nk_i64_t b);
259
+ #endif // NK_TARGET_NEON
260
+
261
+ #if NK_TARGET_NEONHALF
262
+ /** @copydoc nk_f16_sqrt */
263
+ NK_PUBLIC nk_f16_t nk_f16_sqrt_neonhalf(nk_f16_t x);
264
+ /** @copydoc nk_f16_rsqrt */
265
+ NK_PUBLIC nk_f16_t nk_f16_rsqrt_neonhalf(nk_f16_t x);
266
+ /** @copydoc nk_f16_fma */
267
+ NK_PUBLIC nk_f16_t nk_f16_fma_neonhalf(nk_f16_t a, nk_f16_t b, nk_f16_t c);
268
+ #endif // NK_TARGET_NEONHALF
269
+
270
+ #if NK_TARGET_HASWELL
271
+ /** @copydoc nk_f32_sqrt */
272
+ NK_PUBLIC nk_f32_t nk_f32_sqrt_haswell(nk_f32_t x);
273
+ /** @copydoc nk_f64_sqrt */
274
+ NK_PUBLIC nk_f64_t nk_f64_sqrt_haswell(nk_f64_t x);
275
+ /** @copydoc nk_f32_rsqrt */
276
+ NK_PUBLIC nk_f32_t nk_f32_rsqrt_haswell(nk_f32_t x);
277
+ /** @copydoc nk_f64_rsqrt */
278
+ NK_PUBLIC nk_f64_t nk_f64_rsqrt_haswell(nk_f64_t x);
279
+ /** @copydoc nk_f32_fma */
280
+ NK_PUBLIC nk_f32_t nk_f32_fma_haswell(nk_f32_t a, nk_f32_t b, nk_f32_t c);
281
+ /** @copydoc nk_f64_fma */
282
+ NK_PUBLIC nk_f64_t nk_f64_fma_haswell(nk_f64_t a, nk_f64_t b, nk_f64_t c);
283
+ /** @copydoc nk_u8_saturating_add */
284
+ NK_PUBLIC nk_u8_t nk_u8_saturating_add_haswell(nk_u8_t a, nk_u8_t b);
285
+ /** @copydoc nk_u8_saturating_add */
286
+ NK_PUBLIC nk_i8_t nk_i8_saturating_add_haswell(nk_i8_t a, nk_i8_t b);
287
+ /** @copydoc nk_u8_saturating_add */
288
+ NK_PUBLIC nk_u16_t nk_u16_saturating_add_haswell(nk_u16_t a, nk_u16_t b);
289
+ /** @copydoc nk_u8_saturating_add */
290
+ NK_PUBLIC nk_i16_t nk_i16_saturating_add_haswell(nk_i16_t a, nk_i16_t b);
291
+ /** @copydoc nk_u8_saturating_mul */
292
+ NK_PUBLIC nk_u64_t nk_u64_saturating_mul_haswell(nk_u64_t a, nk_u64_t b);
293
+ /** @copydoc nk_u8_saturating_mul */
294
+ NK_PUBLIC nk_i64_t nk_i64_saturating_mul_haswell(nk_i64_t a, nk_i64_t b);
295
+ /** @copydoc nk_f16_sqrt */
296
+ NK_PUBLIC nk_f16_t nk_f16_sqrt_haswell(nk_f16_t x);
297
+ /** @copydoc nk_f16_rsqrt */
298
+ NK_PUBLIC nk_f16_t nk_f16_rsqrt_haswell(nk_f16_t x);
299
+ /** @copydoc nk_f16_fma */
300
+ NK_PUBLIC nk_f16_t nk_f16_fma_haswell(nk_f16_t a, nk_f16_t b, nk_f16_t c);
301
+ #endif // NK_TARGET_HASWELL
302
+
303
+ #if NK_TARGET_SAPPHIRE
304
+ /** @copydoc nk_f16_order */
305
+ NK_PUBLIC int nk_f16_order_sapphire(nk_f16_t a, nk_f16_t b);
306
+ /** @copydoc nk_f16_sqrt */
307
+ NK_PUBLIC nk_f16_t nk_f16_sqrt_sapphire(nk_f16_t x);
308
+ /** @copydoc nk_f16_rsqrt */
309
+ NK_PUBLIC nk_f16_t nk_f16_rsqrt_sapphire(nk_f16_t x);
310
+ /** @copydoc nk_f16_fma */
311
+ NK_PUBLIC nk_f16_t nk_f16_fma_sapphire(nk_f16_t a, nk_f16_t b, nk_f16_t c);
312
+ #endif // NK_TARGET_SAPPHIRE
313
+
314
+ #if NK_TARGET_RVV
315
+ /** @copydoc nk_f32_sqrt */
316
+ NK_PUBLIC nk_f32_t nk_f32_sqrt_rvv(nk_f32_t x);
317
+ /** @copydoc nk_f64_sqrt */
318
+ NK_PUBLIC nk_f64_t nk_f64_sqrt_rvv(nk_f64_t x);
319
+ /** @copydoc nk_f32_rsqrt */
320
+ NK_PUBLIC nk_f32_t nk_f32_rsqrt_rvv(nk_f32_t x);
321
+ /** @copydoc nk_f64_rsqrt */
322
+ NK_PUBLIC nk_f64_t nk_f64_rsqrt_rvv(nk_f64_t x);
323
+ /** @copydoc nk_f32_fma */
324
+ NK_PUBLIC nk_f32_t nk_f32_fma_rvv(nk_f32_t a, nk_f32_t b, nk_f32_t c);
325
+ /** @copydoc nk_f64_fma */
326
+ NK_PUBLIC nk_f64_t nk_f64_fma_rvv(nk_f64_t a, nk_f64_t b, nk_f64_t c);
327
+ /** @copydoc nk_u8_saturating_add */
328
+ NK_PUBLIC nk_u8_t nk_u8_saturating_add_rvv(nk_u8_t a, nk_u8_t b);
329
+ /** @copydoc nk_u8_saturating_add */
330
+ NK_PUBLIC nk_i8_t nk_i8_saturating_add_rvv(nk_i8_t a, nk_i8_t b);
331
+ /** @copydoc nk_u8_saturating_add */
332
+ NK_PUBLIC nk_u16_t nk_u16_saturating_add_rvv(nk_u16_t a, nk_u16_t b);
333
+ /** @copydoc nk_u8_saturating_add */
334
+ NK_PUBLIC nk_i16_t nk_i16_saturating_add_rvv(nk_i16_t a, nk_i16_t b);
335
+ /** @copydoc nk_u8_saturating_add */
336
+ NK_PUBLIC nk_u32_t nk_u32_saturating_add_rvv(nk_u32_t a, nk_u32_t b);
337
+ /** @copydoc nk_u8_saturating_add */
338
+ NK_PUBLIC nk_i32_t nk_i32_saturating_add_rvv(nk_i32_t a, nk_i32_t b);
339
+ /** @copydoc nk_u8_saturating_add */
340
+ NK_PUBLIC nk_u64_t nk_u64_saturating_add_rvv(nk_u64_t a, nk_u64_t b);
341
+ /** @copydoc nk_u8_saturating_add */
342
+ NK_PUBLIC nk_i64_t nk_i64_saturating_add_rvv(nk_i64_t a, nk_i64_t b);
343
+ /** @copydoc nk_u8_saturating_mul */
344
+ NK_PUBLIC nk_u8_t nk_u8_saturating_mul_rvv(nk_u8_t a, nk_u8_t b);
345
+ /** @copydoc nk_u8_saturating_mul */
346
+ NK_PUBLIC nk_i8_t nk_i8_saturating_mul_rvv(nk_i8_t a, nk_i8_t b);
347
+ /** @copydoc nk_u8_saturating_mul */
348
+ NK_PUBLIC nk_u16_t nk_u16_saturating_mul_rvv(nk_u16_t a, nk_u16_t b);
349
+ /** @copydoc nk_u8_saturating_mul */
350
+ NK_PUBLIC nk_i16_t nk_i16_saturating_mul_rvv(nk_i16_t a, nk_i16_t b);
351
+ /** @copydoc nk_u8_saturating_mul */
352
+ NK_PUBLIC nk_u32_t nk_u32_saturating_mul_rvv(nk_u32_t a, nk_u32_t b);
353
+ /** @copydoc nk_u8_saturating_mul */
354
+ NK_PUBLIC nk_i32_t nk_i32_saturating_mul_rvv(nk_i32_t a, nk_i32_t b);
355
+ /** @copydoc nk_u8_saturating_mul */
356
+ NK_PUBLIC nk_u64_t nk_u64_saturating_mul_rvv(nk_u64_t a, nk_u64_t b);
357
+ /** @copydoc nk_u8_saturating_mul */
358
+ NK_PUBLIC nk_i64_t nk_i64_saturating_mul_rvv(nk_i64_t a, nk_i64_t b);
359
+ #endif // NK_TARGET_RVV
360
+
361
+ #if NK_TARGET_V128RELAXED
362
+ /** @copydoc nk_f32_sqrt */
363
+ NK_PUBLIC nk_f32_t nk_f32_sqrt_v128relaxed(nk_f32_t x);
364
+ /** @copydoc nk_f64_sqrt */
365
+ NK_PUBLIC nk_f64_t nk_f64_sqrt_v128relaxed(nk_f64_t x);
366
+ /** @copydoc nk_f32_rsqrt */
367
+ NK_PUBLIC nk_f32_t nk_f32_rsqrt_v128relaxed(nk_f32_t x);
368
+ /** @copydoc nk_f64_rsqrt */
369
+ NK_PUBLIC nk_f64_t nk_f64_rsqrt_v128relaxed(nk_f64_t x);
370
+ /** @copydoc nk_f32_fma */
371
+ NK_PUBLIC nk_f32_t nk_f32_fma_v128relaxed(nk_f32_t a, nk_f32_t b, nk_f32_t c);
372
+ /** @copydoc nk_f64_fma */
373
+ NK_PUBLIC nk_f64_t nk_f64_fma_v128relaxed(nk_f64_t a, nk_f64_t b, nk_f64_t c);
374
+ #endif // NK_TARGET_V128RELAXED
375
+
376
+ #if defined(__cplusplus)
377
+ } // extern "C"
378
+ #endif
379
+
380
+ #include "numkong/scalar/serial.h" // `nk_f32_rsqrt_serial`
381
+ #include "numkong/scalar/neon.h" // `nk_f32_sqrt_neon`
382
+ #include "numkong/scalar/neonhalf.h" // `nk_f16_sqrt_neonhalf`
383
+ #include "numkong/scalar/haswell.h" // `nk_f32_sqrt_haswell`
384
+ #include "numkong/scalar/sapphire.h" // `nk_f16_order_sapphire`
385
+ #include "numkong/scalar/rvv.h" // `nk_f32_rsqrt_rvv`
386
+ #include "numkong/scalar/powervsx.h" // `nk_f32_sqrt_powervsx`
387
+ #include "numkong/scalar/v128relaxed.h" // `nk_f32_sqrt_v128relaxed`
388
+
389
+ #if defined(__cplusplus)
390
+ extern "C" {
391
+ #endif
392
+
393
+ #if !NK_DYNAMIC_DISPATCH
394
+
395
+ NK_PUBLIC nk_f32_t nk_f32_sqrt(nk_f32_t x) {
396
+ #if NK_TARGET_HASWELL
397
+ return nk_f32_sqrt_haswell(x);
398
+ #elif NK_TARGET_NEON
399
+ return nk_f32_sqrt_neon(x);
400
+ #elif NK_TARGET_POWERVSX
401
+ return nk_f32_sqrt_powervsx(x);
402
+ #elif NK_TARGET_RVV
403
+ return nk_f32_sqrt_rvv(x);
404
+ #elif NK_TARGET_V128RELAXED
405
+ return nk_f32_sqrt_v128relaxed(x);
406
+ #else
407
+ return nk_f32_sqrt_serial(x);
408
+ #endif
409
+ }
410
+
411
+ NK_PUBLIC nk_f64_t nk_f64_sqrt(nk_f64_t x) {
412
+ #if NK_TARGET_HASWELL
413
+ return nk_f64_sqrt_haswell(x);
414
+ #elif NK_TARGET_NEON
415
+ return nk_f64_sqrt_neon(x);
416
+ #elif NK_TARGET_POWERVSX
417
+ return nk_f64_sqrt_powervsx(x);
418
+ #elif NK_TARGET_RVV
419
+ return nk_f64_sqrt_rvv(x);
420
+ #elif NK_TARGET_V128RELAXED
421
+ return nk_f64_sqrt_v128relaxed(x);
422
+ #else
423
+ return nk_f64_sqrt_serial(x);
424
+ #endif
425
+ }
426
+
427
+ NK_PUBLIC nk_f32_t nk_f32_rsqrt(nk_f32_t x) {
428
+ #if NK_TARGET_HASWELL
429
+ return nk_f32_rsqrt_haswell(x);
430
+ #elif NK_TARGET_NEON
431
+ return nk_f32_rsqrt_neon(x);
432
+ #elif NK_TARGET_POWERVSX
433
+ return nk_f32_rsqrt_powervsx(x);
434
+ #elif NK_TARGET_RVV
435
+ return nk_f32_rsqrt_rvv(x);
436
+ #elif NK_TARGET_V128RELAXED
437
+ return nk_f32_rsqrt_v128relaxed(x);
438
+ #else
439
+ return nk_f32_rsqrt_serial(x);
440
+ #endif
441
+ }
442
+
443
+ NK_PUBLIC nk_f64_t nk_f64_rsqrt(nk_f64_t x) {
444
+ #if NK_TARGET_HASWELL
445
+ return nk_f64_rsqrt_haswell(x);
446
+ #elif NK_TARGET_NEON
447
+ return nk_f64_rsqrt_neon(x);
448
+ #elif NK_TARGET_POWERVSX
449
+ return nk_f64_rsqrt_powervsx(x);
450
+ #elif NK_TARGET_RVV
451
+ return nk_f64_rsqrt_rvv(x);
452
+ #elif NK_TARGET_V128RELAXED
453
+ return nk_f64_rsqrt_v128relaxed(x);
454
+ #else
455
+ return nk_f64_rsqrt_serial(x);
456
+ #endif
457
+ }
458
+
459
+ NK_PUBLIC nk_f32_t nk_f32_fma(nk_f32_t a, nk_f32_t b, nk_f32_t c) {
460
+ #if NK_TARGET_HASWELL
461
+ return nk_f32_fma_haswell(a, b, c);
462
+ #elif NK_TARGET_NEON
463
+ return nk_f32_fma_neon(a, b, c);
464
+ #elif NK_TARGET_POWERVSX
465
+ return nk_f32_fma_powervsx(a, b, c);
466
+ #elif NK_TARGET_RVV
467
+ return nk_f32_fma_rvv(a, b, c);
468
+ #elif NK_TARGET_V128RELAXED
469
+ return nk_f32_fma_v128relaxed(a, b, c);
470
+ #else
471
+ return nk_f32_fma_serial(a, b, c);
472
+ #endif
473
+ }
474
+
475
+ NK_PUBLIC nk_f64_t nk_f64_fma(nk_f64_t a, nk_f64_t b, nk_f64_t c) {
476
+ #if NK_TARGET_HASWELL
477
+ return nk_f64_fma_haswell(a, b, c);
478
+ #elif NK_TARGET_NEON
479
+ return nk_f64_fma_neon(a, b, c);
480
+ #elif NK_TARGET_POWERVSX
481
+ return nk_f64_fma_powervsx(a, b, c);
482
+ #elif NK_TARGET_RVV
483
+ return nk_f64_fma_rvv(a, b, c);
484
+ #elif NK_TARGET_V128RELAXED
485
+ return nk_f64_fma_v128relaxed(a, b, c);
486
+ #else
487
+ return nk_f64_fma_serial(a, b, c);
488
+ #endif
489
+ }
490
+
491
+ NK_PUBLIC nk_f16_t nk_f16_sqrt(nk_f16_t x) {
492
+ #if NK_TARGET_SAPPHIRE
493
+ return nk_f16_sqrt_sapphire(x);
494
+ #elif NK_TARGET_NEONHALF
495
+ return nk_f16_sqrt_neonhalf(x);
496
+ #elif NK_TARGET_HASWELL
497
+ return nk_f16_sqrt_haswell(x);
498
+ #else
499
+ return nk_f16_sqrt_serial(x);
500
+ #endif
501
+ }
502
+
503
+ NK_PUBLIC nk_f16_t nk_f16_rsqrt(nk_f16_t x) {
504
+ #if NK_TARGET_SAPPHIRE
505
+ return nk_f16_rsqrt_sapphire(x);
506
+ #elif NK_TARGET_NEONHALF
507
+ return nk_f16_rsqrt_neonhalf(x);
508
+ #elif NK_TARGET_HASWELL
509
+ return nk_f16_rsqrt_haswell(x);
510
+ #else
511
+ return nk_f16_rsqrt_serial(x);
512
+ #endif
513
+ }
514
+
515
+ NK_PUBLIC nk_f16_t nk_f16_fma(nk_f16_t a, nk_f16_t b, nk_f16_t c) {
516
+ #if NK_TARGET_SAPPHIRE
517
+ return nk_f16_fma_sapphire(a, b, c);
518
+ #elif NK_TARGET_NEONHALF
519
+ return nk_f16_fma_neonhalf(a, b, c);
520
+ #elif NK_TARGET_HASWELL
521
+ return nk_f16_fma_haswell(a, b, c);
522
+ #else
523
+ return nk_f16_fma_serial(a, b, c);
524
+ #endif
525
+ }
526
+
527
+ NK_PUBLIC nk_u8_t nk_u8_saturating_add(nk_u8_t a, nk_u8_t b) {
528
+ #if NK_TARGET_HASWELL
529
+ return nk_u8_saturating_add_haswell(a, b);
530
+ #elif NK_TARGET_NEON
531
+ return nk_u8_saturating_add_neon(a, b);
532
+ #elif NK_TARGET_RVV
533
+ return nk_u8_saturating_add_rvv(a, b);
534
+ #else
535
+ return nk_u8_saturating_add_serial(a, b);
536
+ #endif
537
+ }
538
+ NK_PUBLIC nk_i8_t nk_i8_saturating_add(nk_i8_t a, nk_i8_t b) {
539
+ #if NK_TARGET_HASWELL
540
+ return nk_i8_saturating_add_haswell(a, b);
541
+ #elif NK_TARGET_NEON
542
+ return nk_i8_saturating_add_neon(a, b);
543
+ #elif NK_TARGET_RVV
544
+ return nk_i8_saturating_add_rvv(a, b);
545
+ #else
546
+ return nk_i8_saturating_add_serial(a, b);
547
+ #endif
548
+ }
549
+ NK_PUBLIC nk_u16_t nk_u16_saturating_add(nk_u16_t a, nk_u16_t b) {
550
+ #if NK_TARGET_HASWELL
551
+ return nk_u16_saturating_add_haswell(a, b);
552
+ #elif NK_TARGET_NEON
553
+ return nk_u16_saturating_add_neon(a, b);
554
+ #elif NK_TARGET_RVV
555
+ return nk_u16_saturating_add_rvv(a, b);
556
+ #else
557
+ return nk_u16_saturating_add_serial(a, b);
558
+ #endif
559
+ }
560
+ NK_PUBLIC nk_i16_t nk_i16_saturating_add(nk_i16_t a, nk_i16_t b) {
561
+ #if NK_TARGET_HASWELL
562
+ return nk_i16_saturating_add_haswell(a, b);
563
+ #elif NK_TARGET_NEON
564
+ return nk_i16_saturating_add_neon(a, b);
565
+ #elif NK_TARGET_RVV
566
+ return nk_i16_saturating_add_rvv(a, b);
567
+ #else
568
+ return nk_i16_saturating_add_serial(a, b);
569
+ #endif
570
+ }
571
+ NK_PUBLIC nk_u32_t nk_u32_saturating_add(nk_u32_t a, nk_u32_t b) {
572
+ #if NK_TARGET_NEON
573
+ return nk_u32_saturating_add_neon(a, b);
574
+ #elif NK_TARGET_RVV
575
+ return nk_u32_saturating_add_rvv(a, b);
576
+ #else
577
+ return nk_u32_saturating_add_serial(a, b);
578
+ #endif
579
+ }
580
+ NK_PUBLIC nk_i32_t nk_i32_saturating_add(nk_i32_t a, nk_i32_t b) {
581
+ #if NK_TARGET_NEON
582
+ return nk_i32_saturating_add_neon(a, b);
583
+ #elif NK_TARGET_RVV
584
+ return nk_i32_saturating_add_rvv(a, b);
585
+ #else
586
+ return nk_i32_saturating_add_serial(a, b);
587
+ #endif
588
+ }
589
+ NK_PUBLIC nk_u64_t nk_u64_saturating_add(nk_u64_t a, nk_u64_t b) {
590
+ #if NK_TARGET_NEON
591
+ return nk_u64_saturating_add_neon(a, b);
592
+ #elif NK_TARGET_RVV
593
+ return nk_u64_saturating_add_rvv(a, b);
594
+ #else
595
+ return nk_u64_saturating_add_serial(a, b);
596
+ #endif
597
+ }
598
+ NK_PUBLIC nk_i64_t nk_i64_saturating_add(nk_i64_t a, nk_i64_t b) {
599
+ #if NK_TARGET_NEON
600
+ return nk_i64_saturating_add_neon(a, b);
601
+ #elif NK_TARGET_RVV
602
+ return nk_i64_saturating_add_rvv(a, b);
603
+ #else
604
+ return nk_i64_saturating_add_serial(a, b);
605
+ #endif
606
+ }
607
+ NK_PUBLIC nk_i4x2_t nk_i4x2_saturating_add(nk_i4x2_t a, nk_i4x2_t b) { return nk_i4x2_saturating_add_serial(a, b); }
608
+ NK_PUBLIC nk_u4x2_t nk_u4x2_saturating_add(nk_u4x2_t a, nk_u4x2_t b) { return nk_u4x2_saturating_add_serial(a, b); }
609
+
610
+ NK_PUBLIC nk_u8_t nk_u8_saturating_mul(nk_u8_t a, nk_u8_t b) {
611
+ #if NK_TARGET_RVV
612
+ return nk_u8_saturating_mul_rvv(a, b);
613
+ #else
614
+ return nk_u8_saturating_mul_serial(a, b);
615
+ #endif
616
+ }
617
+ NK_PUBLIC nk_i8_t nk_i8_saturating_mul(nk_i8_t a, nk_i8_t b) {
618
+ #if NK_TARGET_RVV
619
+ return nk_i8_saturating_mul_rvv(a, b);
620
+ #else
621
+ return nk_i8_saturating_mul_serial(a, b);
622
+ #endif
623
+ }
624
+ NK_PUBLIC nk_u16_t nk_u16_saturating_mul(nk_u16_t a, nk_u16_t b) {
625
+ #if NK_TARGET_RVV
626
+ return nk_u16_saturating_mul_rvv(a, b);
627
+ #else
628
+ return nk_u16_saturating_mul_serial(a, b);
629
+ #endif
630
+ }
631
+ NK_PUBLIC nk_i16_t nk_i16_saturating_mul(nk_i16_t a, nk_i16_t b) {
632
+ #if NK_TARGET_RVV
633
+ return nk_i16_saturating_mul_rvv(a, b);
634
+ #else
635
+ return nk_i16_saturating_mul_serial(a, b);
636
+ #endif
637
+ }
638
+ NK_PUBLIC nk_u32_t nk_u32_saturating_mul(nk_u32_t a, nk_u32_t b) {
639
+ #if NK_TARGET_RVV
640
+ return nk_u32_saturating_mul_rvv(a, b);
641
+ #else
642
+ return nk_u32_saturating_mul_serial(a, b);
643
+ #endif
644
+ }
645
+ NK_PUBLIC nk_i32_t nk_i32_saturating_mul(nk_i32_t a, nk_i32_t b) {
646
+ #if NK_TARGET_RVV
647
+ return nk_i32_saturating_mul_rvv(a, b);
648
+ #else
649
+ return nk_i32_saturating_mul_serial(a, b);
650
+ #endif
651
+ }
652
+ NK_PUBLIC nk_u64_t nk_u64_saturating_mul(nk_u64_t a, nk_u64_t b) {
653
+ #if NK_TARGET_HASWELL
654
+ return nk_u64_saturating_mul_haswell(a, b);
655
+ #elif NK_TARGET_NEON
656
+ return nk_u64_saturating_mul_neon(a, b);
657
+ #elif NK_TARGET_RVV
658
+ return nk_u64_saturating_mul_rvv(a, b);
659
+ #else
660
+ return nk_u64_saturating_mul_serial(a, b);
661
+ #endif
662
+ }
663
+ NK_PUBLIC nk_i64_t nk_i64_saturating_mul(nk_i64_t a, nk_i64_t b) {
664
+ #if NK_TARGET_HASWELL
665
+ return nk_i64_saturating_mul_haswell(a, b);
666
+ #elif NK_TARGET_NEON
667
+ return nk_i64_saturating_mul_neon(a, b);
668
+ #elif NK_TARGET_RVV
669
+ return nk_i64_saturating_mul_rvv(a, b);
670
+ #else
671
+ return nk_i64_saturating_mul_serial(a, b);
672
+ #endif
673
+ }
674
+ NK_PUBLIC nk_i4x2_t nk_i4x2_saturating_mul(nk_i4x2_t a, nk_i4x2_t b) { return nk_i4x2_saturating_mul_serial(a, b); }
675
+ NK_PUBLIC nk_u4x2_t nk_u4x2_saturating_mul(nk_u4x2_t a, nk_u4x2_t b) { return nk_u4x2_saturating_mul_serial(a, b); }
676
+
677
+ NK_PUBLIC int nk_f16_order(nk_f16_t a, nk_f16_t b) {
678
+ #if NK_TARGET_SAPPHIRE
679
+ return nk_f16_order_sapphire(a, b);
680
+ #else
681
+ return nk_f16_order_serial(a, b);
682
+ #endif
683
+ }
684
+ NK_PUBLIC int nk_bf16_order(nk_bf16_t a, nk_bf16_t b) { return nk_bf16_order_serial(a, b); }
685
+ NK_PUBLIC int nk_e4m3_order(nk_e4m3_t a, nk_e4m3_t b) { return nk_e4m3_order_serial(a, b); }
686
+ NK_PUBLIC int nk_e5m2_order(nk_e5m2_t a, nk_e5m2_t b) { return nk_e5m2_order_serial(a, b); }
687
+ NK_PUBLIC int nk_e2m3_order(nk_e2m3_t a, nk_e2m3_t b) { return nk_e2m3_order_serial(a, b); }
688
+ NK_PUBLIC int nk_e3m2_order(nk_e3m2_t a, nk_e3m2_t b) { return nk_e3m2_order_serial(a, b); }
689
+
690
+ #endif // !NK_DYNAMIC_DISPATCH
691
+
692
+ #if defined(__cplusplus)
693
+ } // extern "C"
694
+ #endif
695
+
696
+ #endif // NK_SCALAR_H