usearch 2.21.3 → 2.25.0

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 (602) hide show
  1. package/README.md +24 -24
  2. package/binding.gyp +15 -37
  3. package/c/CMakeLists.txt +4 -5
  4. package/c/README.md +7 -7
  5. package/c/lib.cpp +32 -14
  6. package/c/test.c +83 -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 +235 -52
  13. package/include/usearch/index_dense.hpp +105 -40
  14. package/include/usearch/index_plugins.hpp +1387 -204
  15. package/javascript/dist/cjs/usearch.d.ts +8 -3
  16. package/javascript/dist/cjs/usearch.js +12 -4
  17. package/javascript/dist/esm/usearch.d.ts +8 -3
  18. package/javascript/dist/esm/usearch.js +12 -4
  19. package/javascript/lib.cpp +17 -0
  20. package/javascript/usearch.ts +14 -6
  21. package/numkong/.clang-tidy +30 -0
  22. package/{simsimd → numkong}/.cmake-format.py +18 -0
  23. package/numkong/.editorconfig +12 -0
  24. package/numkong/.git-blame-ignore-revs +123 -0
  25. package/numkong/.mailmap +15 -0
  26. package/numkong/.spi.yml +11 -0
  27. package/numkong/.swift-format +14 -0
  28. package/numkong/CITATION.cff +81 -0
  29. package/numkong/CONTRIBUTING.md +500 -0
  30. package/numkong/Cargo.toml +54 -0
  31. package/numkong/MANIFEST.in +8 -0
  32. package/numkong/Package.swift +84 -0
  33. package/numkong/README.md +569 -0
  34. package/numkong/bench/README.md +217 -0
  35. package/numkong/bench/bench-browser.html +323 -0
  36. package/numkong/bench/bench.cpp +344 -0
  37. package/numkong/bench/bench.hpp +816 -0
  38. package/numkong/bench/bench.js +148 -0
  39. package/numkong/bench/bench.mjs +616 -0
  40. package/numkong/bench/bench_attention.cpp +113 -0
  41. package/numkong/bench/bench_cast.cpp +264 -0
  42. package/numkong/bench/bench_cross_amx.cpp +62 -0
  43. package/numkong/bench/bench_cross_arm.cpp +245 -0
  44. package/numkong/bench/bench_cross_blas.cpp +309 -0
  45. package/numkong/bench/bench_cross_loongarch.cpp +106 -0
  46. package/numkong/bench/bench_cross_power.cpp +84 -0
  47. package/numkong/bench/bench_cross_rvv.cpp +121 -0
  48. package/numkong/bench/bench_cross_serial.cpp +151 -0
  49. package/numkong/bench/bench_cross_sme.cpp +163 -0
  50. package/numkong/bench/bench_cross_wasm.cpp +142 -0
  51. package/numkong/bench/bench_cross_x86.cpp +455 -0
  52. package/numkong/bench/bench_curved.cpp +210 -0
  53. package/numkong/bench/bench_dot.cpp +315 -0
  54. package/numkong/bench/bench_each.cpp +503 -0
  55. package/numkong/bench/bench_geospatial.cpp +112 -0
  56. package/numkong/bench/bench_maxsim.cpp +154 -0
  57. package/numkong/bench/bench_mesh.cpp +148 -0
  58. package/numkong/bench/bench_probability.cpp +60 -0
  59. package/numkong/bench/bench_reduce.cpp +371 -0
  60. package/numkong/bench/bench_set.cpp +73 -0
  61. package/numkong/bench/bench_sparse.cpp +198 -0
  62. package/numkong/bench/bench_spatial.cpp +347 -0
  63. package/numkong/bench/bench_trigonometry.cpp +137 -0
  64. package/numkong/bench/swift/Bench.swift +506 -0
  65. package/numkong/binding.gyp +169 -0
  66. package/numkong/build.rs +484 -0
  67. package/numkong/c/dispatch.h +512 -0
  68. package/numkong/c/dispatch_bf16.c +447 -0
  69. package/numkong/c/dispatch_bf16c.c +52 -0
  70. package/numkong/c/dispatch_e2m3.c +296 -0
  71. package/numkong/c/dispatch_e3m2.c +284 -0
  72. package/numkong/c/dispatch_e4m3.c +318 -0
  73. package/numkong/c/dispatch_e5m2.c +316 -0
  74. package/numkong/c/dispatch_f16.c +452 -0
  75. package/numkong/c/dispatch_f16c.c +58 -0
  76. package/numkong/c/dispatch_f32.c +434 -0
  77. package/numkong/c/dispatch_f32c.c +99 -0
  78. package/numkong/c/dispatch_f64.c +348 -0
  79. package/numkong/c/dispatch_f64c.c +98 -0
  80. package/numkong/c/dispatch_i16.c +96 -0
  81. package/numkong/c/dispatch_i32.c +89 -0
  82. package/numkong/c/dispatch_i4.c +153 -0
  83. package/numkong/c/dispatch_i64.c +86 -0
  84. package/numkong/c/dispatch_i8.c +348 -0
  85. package/numkong/c/dispatch_other.c +348 -0
  86. package/numkong/c/dispatch_u1.c +193 -0
  87. package/numkong/c/dispatch_u16.c +124 -0
  88. package/numkong/c/dispatch_u32.c +118 -0
  89. package/numkong/c/dispatch_u4.c +153 -0
  90. package/numkong/c/dispatch_u64.c +102 -0
  91. package/numkong/c/dispatch_u8.c +364 -0
  92. package/numkong/c/numkong.c +940 -0
  93. package/numkong/cmake/nk_arm_isa_probes.cmake +61 -0
  94. package/numkong/cmake/nk_isa_probe.cmake +90 -0
  95. package/numkong/cmake/nk_loongarch_isa_probes.cmake +15 -0
  96. package/numkong/cmake/nk_math_lib.cmake +46 -0
  97. package/numkong/cmake/nk_power_isa_probes.cmake +15 -0
  98. package/numkong/cmake/nk_riscv_isa_probes.cmake +19 -0
  99. package/numkong/cmake/nk_x86_isa_probes.cmake +35 -0
  100. package/numkong/cmake/toolchain-aarch64-gnu.cmake +86 -0
  101. package/numkong/cmake/toolchain-android-arm64.cmake +25 -0
  102. package/numkong/cmake/toolchain-android-armv7.cmake +25 -0
  103. package/numkong/cmake/toolchain-loongarch64-gnu.cmake +68 -0
  104. package/numkong/cmake/toolchain-ppc64le-gnu.cmake +74 -0
  105. package/numkong/cmake/toolchain-riscv64-gnu.cmake +107 -0
  106. package/numkong/cmake/toolchain-riscv64-llvm.cmake +114 -0
  107. package/numkong/cmake/toolchain-wasi.cmake +77 -0
  108. package/numkong/cmake/toolchain-wasm.cmake +70 -0
  109. package/numkong/cmake/toolchain-wasm64.cmake +62 -0
  110. package/numkong/cmake/toolchain-x86_64-llvm.cmake +47 -0
  111. package/numkong/include/README.md +643 -0
  112. package/numkong/include/module.modulemap +129 -0
  113. package/numkong/include/numkong/attention/sapphireamx.h +1363 -0
  114. package/numkong/include/numkong/attention/sme.h +2075 -0
  115. package/numkong/include/numkong/attention.h +49 -0
  116. package/numkong/include/numkong/capabilities.h +930 -0
  117. package/numkong/include/numkong/cast/README.md +262 -0
  118. package/numkong/include/numkong/cast/diamond.h +64 -0
  119. package/numkong/include/numkong/cast/haswell.h +823 -0
  120. package/numkong/include/numkong/cast/icelake.h +475 -0
  121. package/numkong/include/numkong/cast/loongsonasx.h +252 -0
  122. package/numkong/include/numkong/cast/neon.h +1174 -0
  123. package/numkong/include/numkong/cast/powervsx.h +449 -0
  124. package/numkong/include/numkong/cast/rvv.h +970 -0
  125. package/numkong/include/numkong/cast/sapphire.h +262 -0
  126. package/numkong/include/numkong/cast/serial.h +2336 -0
  127. package/numkong/include/numkong/cast/skylake.h +915 -0
  128. package/numkong/include/numkong/cast/v128relaxed.h +537 -0
  129. package/numkong/include/numkong/cast.h +254 -0
  130. package/numkong/include/numkong/cast.hpp +44 -0
  131. package/numkong/include/numkong/curved/README.md +223 -0
  132. package/numkong/include/numkong/curved/genoa.h +182 -0
  133. package/numkong/include/numkong/curved/haswell.h +276 -0
  134. package/numkong/include/numkong/curved/neon.h +329 -0
  135. package/numkong/include/numkong/curved/neonbfdot.h +211 -0
  136. package/numkong/include/numkong/curved/rvv.h +305 -0
  137. package/numkong/include/numkong/curved/serial.h +207 -0
  138. package/numkong/include/numkong/curved/skylake.h +457 -0
  139. package/numkong/include/numkong/curved/smef64.h +530 -0
  140. package/numkong/include/numkong/curved.h +513 -0
  141. package/numkong/include/numkong/curved.hpp +144 -0
  142. package/numkong/include/numkong/dot/README.md +442 -0
  143. package/numkong/include/numkong/dot/alder.h +563 -0
  144. package/numkong/include/numkong/dot/diamond.h +158 -0
  145. package/numkong/include/numkong/dot/genoa.h +289 -0
  146. package/numkong/include/numkong/dot/haswell.h +1723 -0
  147. package/numkong/include/numkong/dot/icelake.h +997 -0
  148. package/numkong/include/numkong/dot/loongsonasx.h +671 -0
  149. package/numkong/include/numkong/dot/neon.h +869 -0
  150. package/numkong/include/numkong/dot/neonbfdot.h +243 -0
  151. package/numkong/include/numkong/dot/neonfhm.h +358 -0
  152. package/numkong/include/numkong/dot/neonfp8.h +323 -0
  153. package/numkong/include/numkong/dot/neonsdot.h +622 -0
  154. package/numkong/include/numkong/dot/powervsx.h +752 -0
  155. package/numkong/include/numkong/dot/rvv.h +722 -0
  156. package/numkong/include/numkong/dot/rvvbb.h +72 -0
  157. package/numkong/include/numkong/dot/rvvbf16.h +123 -0
  158. package/numkong/include/numkong/dot/rvvhalf.h +129 -0
  159. package/numkong/include/numkong/dot/sapphire.h +141 -0
  160. package/numkong/include/numkong/dot/serial.h +874 -0
  161. package/numkong/include/numkong/dot/sierra.h +405 -0
  162. package/numkong/include/numkong/dot/skylake.h +1116 -0
  163. package/numkong/include/numkong/dot/sve.h +420 -0
  164. package/numkong/include/numkong/dot/svebfdot.h +75 -0
  165. package/numkong/include/numkong/dot/svehalf.h +168 -0
  166. package/numkong/include/numkong/dot/svesdot.h +90 -0
  167. package/numkong/include/numkong/dot/v128relaxed.h +1293 -0
  168. package/numkong/include/numkong/dot.h +1136 -0
  169. package/numkong/include/numkong/dot.hpp +94 -0
  170. package/numkong/include/numkong/dots/README.md +496 -0
  171. package/numkong/include/numkong/dots/alder.h +117 -0
  172. package/numkong/include/numkong/dots/diamond.h +86 -0
  173. package/numkong/include/numkong/dots/genoa.h +100 -0
  174. package/numkong/include/numkong/dots/graniteamx.h +733 -0
  175. package/numkong/include/numkong/dots/haswell.h +310 -0
  176. package/numkong/include/numkong/dots/icelake.h +180 -0
  177. package/numkong/include/numkong/dots/loongsonasx.h +176 -0
  178. package/numkong/include/numkong/dots/neon.h +123 -0
  179. package/numkong/include/numkong/dots/neonbfdot.h +59 -0
  180. package/numkong/include/numkong/dots/neonfhm.h +96 -0
  181. package/numkong/include/numkong/dots/neonfp8.h +99 -0
  182. package/numkong/include/numkong/dots/neonsdot.h +144 -0
  183. package/numkong/include/numkong/dots/powervsx.h +194 -0
  184. package/numkong/include/numkong/dots/rvv.h +2593 -0
  185. package/numkong/include/numkong/dots/sapphireamx.h +4017 -0
  186. package/numkong/include/numkong/dots/serial.h +2867 -0
  187. package/numkong/include/numkong/dots/sierra.h +100 -0
  188. package/numkong/include/numkong/dots/skylake.h +207 -0
  189. package/numkong/include/numkong/dots/sme.h +5041 -0
  190. package/numkong/include/numkong/dots/smebi32.h +477 -0
  191. package/numkong/include/numkong/dots/smef64.h +1328 -0
  192. package/numkong/include/numkong/dots/smehalf.h +47 -0
  193. package/numkong/include/numkong/dots/v128relaxed.h +317 -0
  194. package/numkong/include/numkong/dots.h +3110 -0
  195. package/numkong/include/numkong/dots.hpp +641 -0
  196. package/numkong/include/numkong/each/README.md +465 -0
  197. package/numkong/include/numkong/each/haswell.h +1658 -0
  198. package/numkong/include/numkong/each/icelake.h +272 -0
  199. package/numkong/include/numkong/each/neon.h +1138 -0
  200. package/numkong/include/numkong/each/neonbfdot.h +211 -0
  201. package/numkong/include/numkong/each/neonhalf.h +318 -0
  202. package/numkong/include/numkong/each/rvv.h +1121 -0
  203. package/numkong/include/numkong/each/sapphire.h +343 -0
  204. package/numkong/include/numkong/each/serial.h +282 -0
  205. package/numkong/include/numkong/each/skylake.h +1562 -0
  206. package/numkong/include/numkong/each/v128relaxed.h +562 -0
  207. package/numkong/include/numkong/each.h +2232 -0
  208. package/numkong/include/numkong/each.hpp +434 -0
  209. package/numkong/include/numkong/geospatial/README.md +147 -0
  210. package/numkong/include/numkong/geospatial/haswell.h +633 -0
  211. package/numkong/include/numkong/geospatial/neon.h +615 -0
  212. package/numkong/include/numkong/geospatial/rvv.h +701 -0
  213. package/numkong/include/numkong/geospatial/serial.h +309 -0
  214. package/numkong/include/numkong/geospatial/skylake.h +613 -0
  215. package/numkong/include/numkong/geospatial/v128relaxed.h +652 -0
  216. package/numkong/include/numkong/geospatial.h +453 -0
  217. package/numkong/include/numkong/geospatial.hpp +235 -0
  218. package/numkong/include/numkong/matrix.hpp +336 -0
  219. package/numkong/include/numkong/maxsim/README.md +187 -0
  220. package/numkong/include/numkong/maxsim/alder.h +511 -0
  221. package/numkong/include/numkong/maxsim/genoa.h +115 -0
  222. package/numkong/include/numkong/maxsim/haswell.h +553 -0
  223. package/numkong/include/numkong/maxsim/icelake.h +480 -0
  224. package/numkong/include/numkong/maxsim/neonsdot.h +394 -0
  225. package/numkong/include/numkong/maxsim/sapphireamx.h +877 -0
  226. package/numkong/include/numkong/maxsim/serial.h +490 -0
  227. package/numkong/include/numkong/maxsim/sme.h +993 -0
  228. package/numkong/include/numkong/maxsim/v128relaxed.h +280 -0
  229. package/numkong/include/numkong/maxsim.h +571 -0
  230. package/numkong/include/numkong/maxsim.hpp +133 -0
  231. package/numkong/include/numkong/mesh/README.md +219 -0
  232. package/numkong/include/numkong/mesh/haswell.h +2013 -0
  233. package/numkong/include/numkong/mesh/neon.h +1821 -0
  234. package/numkong/include/numkong/mesh/neonbfdot.h +771 -0
  235. package/numkong/include/numkong/mesh/rvv.h +936 -0
  236. package/numkong/include/numkong/mesh/serial.h +721 -0
  237. package/numkong/include/numkong/mesh/skylake.h +2344 -0
  238. package/numkong/include/numkong/mesh/v128relaxed.h +1081 -0
  239. package/numkong/include/numkong/mesh.h +666 -0
  240. package/numkong/include/numkong/mesh.hpp +701 -0
  241. package/numkong/include/numkong/numkong.h +78 -0
  242. package/numkong/include/numkong/numkong.hpp +58 -0
  243. package/numkong/include/numkong/probability/README.md +177 -0
  244. package/numkong/include/numkong/probability/haswell.h +267 -0
  245. package/numkong/include/numkong/probability/neon.h +255 -0
  246. package/numkong/include/numkong/probability/rvv.h +414 -0
  247. package/numkong/include/numkong/probability/serial.h +181 -0
  248. package/numkong/include/numkong/probability/skylake.h +324 -0
  249. package/numkong/include/numkong/probability.h +380 -0
  250. package/numkong/include/numkong/probability.hpp +120 -0
  251. package/numkong/include/numkong/random.h +50 -0
  252. package/numkong/include/numkong/random.hpp +285 -0
  253. package/numkong/include/numkong/reduce/README.md +552 -0
  254. package/numkong/include/numkong/reduce/alder.h +636 -0
  255. package/numkong/include/numkong/reduce/genoa.h +201 -0
  256. package/numkong/include/numkong/reduce/haswell.h +3785 -0
  257. package/numkong/include/numkong/reduce/icelake.h +549 -0
  258. package/numkong/include/numkong/reduce/neon.h +3980 -0
  259. package/numkong/include/numkong/reduce/neonbfdot.h +142 -0
  260. package/numkong/include/numkong/reduce/neonfhm.h +293 -0
  261. package/numkong/include/numkong/reduce/neonsdot.h +357 -0
  262. package/numkong/include/numkong/reduce/rvv.h +3533 -0
  263. package/numkong/include/numkong/reduce/serial.h +753 -0
  264. package/numkong/include/numkong/reduce/sierra.h +338 -0
  265. package/numkong/include/numkong/reduce/skylake.h +3794 -0
  266. package/numkong/include/numkong/reduce/sve.h +52 -0
  267. package/numkong/include/numkong/reduce/v128relaxed.h +2302 -0
  268. package/numkong/include/numkong/reduce.h +1582 -0
  269. package/numkong/include/numkong/reduce.hpp +778 -0
  270. package/numkong/include/numkong/scalar/README.md +89 -0
  271. package/numkong/include/numkong/scalar/haswell.h +122 -0
  272. package/numkong/include/numkong/scalar/loongsonasx.h +74 -0
  273. package/numkong/include/numkong/scalar/neon.h +122 -0
  274. package/numkong/include/numkong/scalar/neonhalf.h +70 -0
  275. package/numkong/include/numkong/scalar/powervsx.h +96 -0
  276. package/numkong/include/numkong/scalar/rvv.h +211 -0
  277. package/numkong/include/numkong/scalar/sapphire.h +74 -0
  278. package/numkong/include/numkong/scalar/serial.h +332 -0
  279. package/numkong/include/numkong/scalar/v128relaxed.h +56 -0
  280. package/numkong/include/numkong/scalar.h +696 -0
  281. package/numkong/include/numkong/set/README.md +179 -0
  282. package/numkong/include/numkong/set/haswell.h +334 -0
  283. package/numkong/include/numkong/set/icelake.h +485 -0
  284. package/numkong/include/numkong/set/loongsonasx.h +181 -0
  285. package/numkong/include/numkong/set/neon.h +363 -0
  286. package/numkong/include/numkong/set/powervsx.h +326 -0
  287. package/numkong/include/numkong/set/rvv.h +226 -0
  288. package/numkong/include/numkong/set/rvvbb.h +117 -0
  289. package/numkong/include/numkong/set/serial.h +174 -0
  290. package/numkong/include/numkong/set/sve.h +187 -0
  291. package/numkong/include/numkong/set/v128relaxed.h +240 -0
  292. package/numkong/include/numkong/set.h +471 -0
  293. package/numkong/include/numkong/set.hpp +114 -0
  294. package/numkong/include/numkong/sets/README.md +149 -0
  295. package/numkong/include/numkong/sets/haswell.h +63 -0
  296. package/numkong/include/numkong/sets/icelake.h +66 -0
  297. package/numkong/include/numkong/sets/loongsonasx.h +52 -0
  298. package/numkong/include/numkong/sets/neon.h +61 -0
  299. package/numkong/include/numkong/sets/powervsx.h +65 -0
  300. package/numkong/include/numkong/sets/serial.h +43 -0
  301. package/numkong/include/numkong/sets/smebi32.h +1135 -0
  302. package/numkong/include/numkong/sets/v128relaxed.h +58 -0
  303. package/numkong/include/numkong/sets.h +382 -0
  304. package/numkong/include/numkong/sparse/README.md +156 -0
  305. package/numkong/include/numkong/sparse/icelake.h +463 -0
  306. package/numkong/include/numkong/sparse/neon.h +288 -0
  307. package/numkong/include/numkong/sparse/serial.h +117 -0
  308. package/numkong/include/numkong/sparse/sve2.h +504 -0
  309. package/numkong/include/numkong/sparse/turin.h +322 -0
  310. package/numkong/include/numkong/sparse.h +363 -0
  311. package/numkong/include/numkong/sparse.hpp +113 -0
  312. package/numkong/include/numkong/spatial/README.md +439 -0
  313. package/numkong/include/numkong/spatial/alder.h +604 -0
  314. package/numkong/include/numkong/spatial/diamond.h +240 -0
  315. package/numkong/include/numkong/spatial/genoa.h +222 -0
  316. package/numkong/include/numkong/spatial/haswell.h +979 -0
  317. package/numkong/include/numkong/spatial/icelake.h +1067 -0
  318. package/numkong/include/numkong/spatial/loongsonasx.h +483 -0
  319. package/numkong/include/numkong/spatial/neon.h +846 -0
  320. package/numkong/include/numkong/spatial/neonbfdot.h +164 -0
  321. package/numkong/include/numkong/spatial/neonfp8.h +258 -0
  322. package/numkong/include/numkong/spatial/neonsdot.h +429 -0
  323. package/numkong/include/numkong/spatial/powervsx.h +738 -0
  324. package/numkong/include/numkong/spatial/rvv.h +991 -0
  325. package/numkong/include/numkong/spatial/rvvbf16.h +128 -0
  326. package/numkong/include/numkong/spatial/rvvhalf.h +120 -0
  327. package/numkong/include/numkong/spatial/serial.h +347 -0
  328. package/numkong/include/numkong/spatial/sierra.h +516 -0
  329. package/numkong/include/numkong/spatial/skylake.h +605 -0
  330. package/numkong/include/numkong/spatial/sve.h +246 -0
  331. package/numkong/include/numkong/spatial/svebfdot.h +125 -0
  332. package/numkong/include/numkong/spatial/svehalf.h +136 -0
  333. package/numkong/include/numkong/spatial/svesdot.h +143 -0
  334. package/numkong/include/numkong/spatial/v128relaxed.h +969 -0
  335. package/numkong/include/numkong/spatial.h +1681 -0
  336. package/numkong/include/numkong/spatial.hpp +183 -0
  337. package/numkong/include/numkong/spatials/README.md +580 -0
  338. package/numkong/include/numkong/spatials/alder.h +94 -0
  339. package/numkong/include/numkong/spatials/diamond.h +82 -0
  340. package/numkong/include/numkong/spatials/genoa.h +94 -0
  341. package/numkong/include/numkong/spatials/graniteamx.h +173 -0
  342. package/numkong/include/numkong/spatials/haswell.h +219 -0
  343. package/numkong/include/numkong/spatials/icelake.h +113 -0
  344. package/numkong/include/numkong/spatials/loongsonasx.h +153 -0
  345. package/numkong/include/numkong/spatials/neon.h +109 -0
  346. package/numkong/include/numkong/spatials/neonbfdot.h +60 -0
  347. package/numkong/include/numkong/spatials/neonfhm.h +92 -0
  348. package/numkong/include/numkong/spatials/neonfp8.h +111 -0
  349. package/numkong/include/numkong/spatials/neonsdot.h +143 -0
  350. package/numkong/include/numkong/spatials/powervsx.h +153 -0
  351. package/numkong/include/numkong/spatials/rvv.h +1976 -0
  352. package/numkong/include/numkong/spatials/sapphireamx.h +1149 -0
  353. package/numkong/include/numkong/spatials/serial.h +248 -0
  354. package/numkong/include/numkong/spatials/sierra.h +96 -0
  355. package/numkong/include/numkong/spatials/skylake.h +184 -0
  356. package/numkong/include/numkong/spatials/sme.h +1927 -0
  357. package/numkong/include/numkong/spatials/smef64.h +483 -0
  358. package/numkong/include/numkong/spatials/v128relaxed.h +240 -0
  359. package/numkong/include/numkong/spatials.h +3374 -0
  360. package/numkong/include/numkong/spatials.hpp +509 -0
  361. package/numkong/include/numkong/tensor.hpp +1981 -0
  362. package/numkong/include/numkong/trigonometry/README.md +184 -0
  363. package/numkong/include/numkong/trigonometry/haswell.h +653 -0
  364. package/numkong/include/numkong/trigonometry/neon.h +638 -0
  365. package/numkong/include/numkong/trigonometry/rvv.h +700 -0
  366. package/numkong/include/numkong/trigonometry/serial.h +703 -0
  367. package/numkong/include/numkong/trigonometry/skylake.h +725 -0
  368. package/numkong/include/numkong/trigonometry/v128relaxed.h +667 -0
  369. package/numkong/include/numkong/trigonometry.h +467 -0
  370. package/numkong/include/numkong/trigonometry.hpp +166 -0
  371. package/numkong/include/numkong/types.h +1695 -0
  372. package/numkong/include/numkong/types.hpp +6027 -0
  373. package/numkong/include/numkong/vector.hpp +766 -0
  374. package/numkong/javascript/@numkong-darwin-arm64/package.json +26 -0
  375. package/numkong/javascript/@numkong-darwin-x64/package.json +26 -0
  376. package/numkong/javascript/@numkong-linux-arm64/package.json +25 -0
  377. package/numkong/javascript/@numkong-linux-x64/package.json +25 -0
  378. package/numkong/javascript/@numkong-win32-arm64/package.json +25 -0
  379. package/numkong/javascript/@numkong-win32-x64/package.json +25 -0
  380. package/numkong/javascript/README.md +254 -0
  381. package/numkong/javascript/node-gyp-build.d.ts +4 -0
  382. package/numkong/javascript/numkong-browser.ts +40 -0
  383. package/numkong/javascript/numkong-wasm.ts +750 -0
  384. package/numkong/javascript/numkong.c +712 -0
  385. package/numkong/javascript/numkong.ts +613 -0
  386. package/{simsimd → numkong}/javascript/tsconfig-base.json +6 -3
  387. package/numkong/javascript/tsconfig-cjs.json +13 -0
  388. package/{simsimd → numkong}/javascript/tsconfig-esm.json +1 -1
  389. package/numkong/javascript/types.ts +784 -0
  390. package/numkong/numkong.gypi +104 -0
  391. package/numkong/package.json +108 -0
  392. package/numkong/probes/arm_neon.c +8 -0
  393. package/numkong/probes/arm_neon_bfdot.c +9 -0
  394. package/numkong/probes/arm_neon_fhm.c +9 -0
  395. package/numkong/probes/arm_neon_half.c +8 -0
  396. package/numkong/probes/arm_neon_sdot.c +9 -0
  397. package/numkong/probes/arm_neonfp8.c +9 -0
  398. package/numkong/probes/arm_sme.c +16 -0
  399. package/numkong/probes/arm_sme2.c +16 -0
  400. package/numkong/probes/arm_sme2p1.c +16 -0
  401. package/numkong/probes/arm_sme_bf16.c +16 -0
  402. package/numkong/probes/arm_sme_bi32.c +16 -0
  403. package/numkong/probes/arm_sme_f64.c +16 -0
  404. package/numkong/probes/arm_sme_fa64.c +14 -0
  405. package/numkong/probes/arm_sme_half.c +16 -0
  406. package/numkong/probes/arm_sme_lut2.c +15 -0
  407. package/numkong/probes/arm_sve.c +18 -0
  408. package/numkong/probes/arm_sve2.c +20 -0
  409. package/numkong/probes/arm_sve2p1.c +18 -0
  410. package/numkong/probes/arm_sve_bfdot.c +20 -0
  411. package/numkong/probes/arm_sve_half.c +18 -0
  412. package/numkong/probes/arm_sve_sdot.c +21 -0
  413. package/numkong/probes/loongarch_lasx.c +12 -0
  414. package/numkong/probes/power_vsx.c +12 -0
  415. package/numkong/probes/probe.js +127 -0
  416. package/numkong/probes/riscv_rvv.c +14 -0
  417. package/numkong/probes/riscv_rvv_bb.c +15 -0
  418. package/numkong/probes/riscv_rvv_bf16.c +17 -0
  419. package/numkong/probes/riscv_rvv_half.c +14 -0
  420. package/numkong/probes/wasm_v128relaxed.c +11 -0
  421. package/numkong/probes/x86_alder.c +17 -0
  422. package/numkong/probes/x86_diamond.c +17 -0
  423. package/numkong/probes/x86_genoa.c +17 -0
  424. package/numkong/probes/x86_graniteamx.c +19 -0
  425. package/numkong/probes/x86_haswell.c +11 -0
  426. package/numkong/probes/x86_icelake.c +17 -0
  427. package/numkong/probes/x86_sapphire.c +16 -0
  428. package/numkong/probes/x86_sapphireamx.c +18 -0
  429. package/numkong/probes/x86_sierra.c +17 -0
  430. package/numkong/probes/x86_skylake.c +15 -0
  431. package/numkong/probes/x86_turin.c +17 -0
  432. package/numkong/rust/README.md +698 -0
  433. package/numkong/rust/capabilities.rs +96 -0
  434. package/numkong/rust/cast.rs +314 -0
  435. package/numkong/rust/curved.rs +391 -0
  436. package/numkong/rust/each.rs +2721 -0
  437. package/numkong/rust/geospatial.rs +343 -0
  438. package/numkong/rust/matrix.rs +5424 -0
  439. package/numkong/rust/maxsim.rs +540 -0
  440. package/numkong/rust/mesh.rs +837 -0
  441. package/numkong/rust/numkong.rs +409 -0
  442. package/numkong/rust/probability.rs +272 -0
  443. package/numkong/rust/reduce.rs +1249 -0
  444. package/numkong/rust/set.rs +194 -0
  445. package/numkong/rust/sparse.rs +513 -0
  446. package/numkong/rust/spatial.rs +1815 -0
  447. package/numkong/rust/tensor.rs +7565 -0
  448. package/numkong/rust/types.rs +3666 -0
  449. package/numkong/rust/vector.rs +1899 -0
  450. package/numkong/rustfmt.toml +2 -0
  451. package/numkong/swift/Matrix.swift +1388 -0
  452. package/numkong/swift/MaxSim.swift +151 -0
  453. package/numkong/swift/NumKong.swift +283 -0
  454. package/numkong/swift/Numerics.swift +329 -0
  455. package/numkong/swift/README.md +433 -0
  456. package/numkong/swift/Scalar.swift +741 -0
  457. package/numkong/swift/Tensor.swift +209 -0
  458. package/numkong/test/README.md +315 -0
  459. package/numkong/test/playwright.config.ts +16 -0
  460. package/numkong/test/swift/Test.swift +534 -0
  461. package/numkong/test/test-browser-bundle-runner.mjs +36 -0
  462. package/numkong/test/test-browser-bundle.html +188 -0
  463. package/numkong/test/test-browser-runner.mjs +43 -0
  464. package/numkong/test/test-browser.html +305 -0
  465. package/numkong/test/test-dtypes.mjs +453 -0
  466. package/numkong/test/test-wasm.mjs +267 -0
  467. package/numkong/test/test.cpp +442 -0
  468. package/numkong/test/test.hpp +580 -0
  469. package/numkong/test/test.mjs +363 -0
  470. package/numkong/test/test_base.py +1041 -0
  471. package/numkong/test/test_cast.cpp +242 -0
  472. package/numkong/test/test_cross.hpp +551 -0
  473. package/numkong/test/test_cross.py +467 -0
  474. package/numkong/test/test_cross_amx.cpp +50 -0
  475. package/numkong/test/test_cross_arm.cpp +225 -0
  476. package/numkong/test/test_cross_blas.cpp +354 -0
  477. package/numkong/test/test_cross_loongarch.cpp +90 -0
  478. package/numkong/test/test_cross_power.cpp +73 -0
  479. package/numkong/test/test_cross_rvv.cpp +109 -0
  480. package/numkong/test/test_cross_serial.cpp +181 -0
  481. package/numkong/test/test_cross_sme.cpp +148 -0
  482. package/numkong/test/test_cross_wasm.cpp +141 -0
  483. package/numkong/test/test_cross_x86.cpp +442 -0
  484. package/numkong/test/test_curved.cpp +182 -0
  485. package/numkong/test/test_curved.py +207 -0
  486. package/numkong/test/test_dot.cpp +353 -0
  487. package/numkong/test/test_dot.py +296 -0
  488. package/numkong/test/test_each.cpp +437 -0
  489. package/numkong/test/test_each.py +756 -0
  490. package/numkong/test/test_geospatial.cpp +155 -0
  491. package/numkong/test/test_geospatial.py +241 -0
  492. package/numkong/test/test_maxsim.cpp +138 -0
  493. package/numkong/test/test_maxsim.py +209 -0
  494. package/numkong/test/test_mesh.cpp +203 -0
  495. package/numkong/test/test_mesh.py +394 -0
  496. package/numkong/test/test_probability.cpp +136 -0
  497. package/numkong/test/test_probability.py +166 -0
  498. package/numkong/test/test_reduce.cpp +563 -0
  499. package/numkong/test/test_reduce.py +781 -0
  500. package/numkong/test/test_set.cpp +151 -0
  501. package/numkong/test/test_set.py +120 -0
  502. package/numkong/test/test_similarities.py +579 -0
  503. package/numkong/test/test_sparse.cpp +121 -0
  504. package/numkong/test/test_sparse.py +118 -0
  505. package/numkong/test/test_spatial.cpp +518 -0
  506. package/numkong/test/test_spatial.py +269 -0
  507. package/numkong/test/test_tensor.cpp +884 -0
  508. package/numkong/test/test_tensor.py +1417 -0
  509. package/numkong/test/test_trigonometry.cpp +156 -0
  510. package/numkong/test/test_trigonometry.py +180 -0
  511. package/package.json +7 -8
  512. package/prebuilds/darwin-arm64+x64/usearch.node +0 -0
  513. package/prebuilds/linux-arm64/usearch.node +0 -0
  514. package/prebuilds/linux-x64/usearch.node +0 -0
  515. package/fp16/CMakeLists.txt +0 -176
  516. package/fp16/LICENSE +0 -11
  517. package/fp16/README.md +0 -20
  518. package/fp16/bench/alt-element.cc +0 -89
  519. package/fp16/bench/from-alt-array.cc +0 -175
  520. package/fp16/bench/from-ieee-array.cc +0 -399
  521. package/fp16/bench/ieee-element.cc +0 -272
  522. package/fp16/bench/to-alt-array.cc +0 -91
  523. package/fp16/bench/to-ieee-array.cc +0 -303
  524. package/fp16/cmake/DownloadGoogleBenchmark.cmake +0 -15
  525. package/fp16/cmake/DownloadGoogleTest.cmake +0 -15
  526. package/fp16/cmake/DownloadPSimd.cmake +0 -15
  527. package/fp16/configure.py +0 -65
  528. package/fp16/confu.yaml +0 -8
  529. package/fp16/include/fp16/__init__.py +0 -0
  530. package/fp16/include/fp16/avx.py +0 -50
  531. package/fp16/include/fp16/avx2.py +0 -53
  532. package/fp16/include/fp16/bitcasts.h +0 -92
  533. package/fp16/include/fp16/fp16.h +0 -451
  534. package/fp16/include/fp16/psimd.h +0 -131
  535. package/fp16/include/fp16.h +0 -11
  536. package/fp16/jni/Android.mk +0 -6
  537. package/fp16/jni/Application.mk +0 -4
  538. package/fp16/test/alt-from-fp32-value.cc +0 -498
  539. package/fp16/test/alt-to-fp32-bits.cc +0 -263
  540. package/fp16/test/alt-to-fp32-psimd.cc +0 -145
  541. package/fp16/test/alt-to-fp32-value.cc +0 -348
  542. package/fp16/test/alt-to-fp32x2-psimd.cc +0 -245
  543. package/fp16/test/bitcasts.cc +0 -56
  544. package/fp16/test/ieee-from-fp32-value.cc +0 -523
  545. package/fp16/test/ieee-to-fp32-bits.cc +0 -333
  546. package/fp16/test/ieee-to-fp32-psimd.cc +0 -312
  547. package/fp16/test/ieee-to-fp32-value.cc +0 -420
  548. package/fp16/test/ieee-to-fp32x2-psimd.cc +0 -541
  549. package/fp16/test/peachpy/alt-xmm-to-fp32-xmm-avx.cc +0 -96
  550. package/fp16/test/peachpy/alt-xmm-to-fp32-ymm-avx2.cc +0 -96
  551. package/fp16/test/peachpy/stubs.py +0 -38
  552. package/fp16/test/tables.cc +0 -530
  553. package/fp16/test/tables.h +0 -13
  554. package/fp16/third-party/THHalf.h +0 -92
  555. package/fp16/third-party/eigen-half.h +0 -170
  556. package/fp16/third-party/float16-compressor.h +0 -80
  557. package/fp16/third-party/half.hpp +0 -2916
  558. package/fp16/third-party/npy-halffloat.h +0 -328
  559. package/simsimd/.git-blame-ignore-revs +0 -2
  560. package/simsimd/CONTRIBUTING.md +0 -321
  561. package/simsimd/Cargo.toml +0 -49
  562. package/simsimd/MANIFEST.in +0 -4
  563. package/simsimd/Package.swift +0 -28
  564. package/simsimd/README.md +0 -1493
  565. package/simsimd/binding.gyp +0 -35
  566. package/simsimd/build.rs +0 -70
  567. package/simsimd/c/lib.c +0 -374
  568. package/simsimd/include/module.modulemap +0 -4
  569. package/simsimd/include/simsimd/binary.h +0 -486
  570. package/simsimd/include/simsimd/curved.h +0 -1541
  571. package/simsimd/include/simsimd/dot.h +0 -1853
  572. package/simsimd/include/simsimd/elementwise.h +0 -2465
  573. package/simsimd/include/simsimd/geospatial.h +0 -43
  574. package/simsimd/include/simsimd/mesh.h +0 -69
  575. package/simsimd/include/simsimd/probability.h +0 -606
  576. package/simsimd/include/simsimd/simsimd.h +0 -2567
  577. package/simsimd/include/simsimd/sparse.h +0 -1384
  578. package/simsimd/include/simsimd/spatial.h +0 -2335
  579. package/simsimd/include/simsimd/types.h +0 -666
  580. package/simsimd/javascript/fallback.ts +0 -233
  581. package/simsimd/javascript/lib.c +0 -125
  582. package/simsimd/javascript/node-gyp-build.d.ts +0 -1
  583. package/simsimd/javascript/simsimd.ts +0 -179
  584. package/simsimd/javascript/tsconfig-cjs.json +0 -8
  585. package/simsimd/package-lock.json +0 -1761
  586. package/simsimd/package.json +0 -61
  587. package/simsimd/rust/lib.rs +0 -1821
  588. package/simsimd/scripts/bench.cxx +0 -1170
  589. package/simsimd/scripts/bench.ipynb +0 -187
  590. package/simsimd/scripts/bench.js +0 -127
  591. package/simsimd/scripts/bench.rs +0 -876
  592. package/simsimd/scripts/bench_vectors.py +0 -734
  593. package/simsimd/scripts/bench_vectors_live.py +0 -213
  594. package/simsimd/scripts/test.c +0 -187
  595. package/simsimd/scripts/test.mjs +0 -220
  596. package/simsimd/scripts/test.py +0 -1505
  597. package/simsimd/swift/SimSIMD.swift +0 -149
  598. package/simsimd/swift/Test.swift +0 -128
  599. /package/{simsimd → numkong}/CODE_OF_CONDUCT.md +0 -0
  600. /package/{simsimd → numkong}/LICENSE +0 -0
  601. /package/{simsimd → numkong}/javascript/dist-package-cjs.json +0 -0
  602. /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