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,61 @@
1
+ # cmake/nk_arm_isa_probes.cmake — Arm ISA compiler-capability probes
2
+ #
3
+ # Detect which ISA extensions the compiler can emit.
4
+ # Probe source lives in probes/arm_*.c — shared with setup.py and build.rs.
5
+
6
+ # Apple Clang 21+ recognises M-series CPUs under -mcpu=native and advertises
7
+ # SME/SME2/BF16 feature macros correctly. Older Apple Clang didn't, which is
8
+ # why earlier code hardcoded -mcpu=apple-m4 — but on a pre-M4 runner that
9
+ # hardcode over-reports capabilities and compiles in bfdot/SME kernels that
10
+ # SIGILL at runtime on hardware lacking those features.
11
+ if (APPLE)
12
+ set(nk_native_flags_ "-mcpu=native")
13
+ else ()
14
+ set(nk_native_flags_ "-march=native")
15
+ endif ()
16
+ include(cmake/nk_isa_probe.cmake)
17
+
18
+ nk_isa_probes_begin_()
19
+
20
+ # NEON base probes — MSVC /arch:armv8.X sets __ARM_ARCH but not __ARM_FEATURE_*
21
+ # macros; the probes accept __ARM_ARCH fallback (e.g., __ARM_ARCH >= 804 for dotprod).
22
+ # FEAT_AdvSIMD (baseline ARM64)
23
+ nk_isa_probe_(nk_target_neon "" "-march=armv8-a+simd" "probes/arm_neon.c")
24
+ # FEAT_FP16: optional from ARMv8.2, mandatory at ARMv9.0 with AdvSIMD
25
+ nk_isa_probe_(nk_target_neonhalf "/arch:armv8.2" "-march=armv8.2-a+simd+fp16" "probes/arm_neon_half.c")
26
+ # FEAT_DotProd: optional from ARMv8.1, mandatory at ARMv8.4 with AdvSIMD
27
+ nk_isa_probe_(nk_target_neonsdot "/arch:armv8.4" "-march=armv8.2-a+dotprod" "probes/arm_neon_sdot.c")
28
+ # FEAT_BF16: optional from ARMv8.2, mandatory at ARMv8.6 with FP
29
+ nk_isa_probe_(nk_target_neonbfdot "/arch:armv8.6" "-march=armv8.6-a+simd+bf16" "probes/arm_neon_bfdot.c")
30
+ # FEAT_FHM: optional from ARMv8.1, mandatory at ARMv8.4 with FP16
31
+ nk_isa_probe_(nk_target_neonfhm "/arch:armv8.4" "-march=armv8.2-a+simd+fp16+fp16fml" "probes/arm_neon_fhm.c")
32
+
33
+ # SVE probes
34
+ nk_isa_probe_(nk_target_sve "" "-march=armv8.2-a+sve" "probes/arm_sve.c")
35
+ nk_isa_probe_(nk_target_svehalf "" "-march=armv8.2-a+sve+fp16" "probes/arm_sve_half.c")
36
+ nk_isa_probe_(nk_target_svebfdot "" "-march=armv8.2-a+sve+bf16" "probes/arm_sve_bfdot.c")
37
+ nk_isa_probe_(nk_target_svesdot "" "-march=armv8.2-a+sve+dotprod" "probes/arm_sve_sdot.c")
38
+ nk_isa_probe_(nk_target_sve2 "" "-march=armv8.2-a+sve2" "probes/arm_sve2.c")
39
+ nk_isa_probe_(nk_target_sve2p1 "" "-march=armv8.2-a+sve2p1" "probes/arm_sve2p1.c")
40
+
41
+ # NEON FP8
42
+ nk_isa_probe_(nk_target_neonfp8 "" "-march=armv8-a+simd+fp8dot4" "probes/arm_neonfp8.c")
43
+
44
+ # SME probes
45
+ nk_isa_probe_(nk_target_sme "" "-march=armv8-a+sme" "probes/arm_sme.c")
46
+ nk_isa_probe_(nk_target_sme2 "" "-march=armv8-a+sme2" "probes/arm_sme2.c")
47
+ nk_isa_probe_(nk_target_sme2p1 "" "-march=armv8-a+sme2p1" "probes/arm_sme2p1.c")
48
+ nk_isa_probe_(nk_target_smef64 "" "-march=armv8-a+sme+sme-f64f64" "probes/arm_sme_f64.c")
49
+ nk_isa_probe_(nk_target_smehalf "" "-march=armv8-a+sme+sme-f16f16" "probes/arm_sme_half.c")
50
+ nk_isa_probe_(nk_target_smebf16 "" "-march=armv8-a+sme2+sme-b16b16" "probes/arm_sme_bf16.c")
51
+ nk_isa_probe_(nk_target_smebi32 "" "-march=armv8-a+sme2" "probes/arm_sme_bi32.c")
52
+ nk_isa_probe_(nk_target_smelut2 "" "-march=armv8-a+sme2+lut" "probes/arm_sme_lut2.c")
53
+ nk_isa_probe_(nk_target_smefa64 "" "-march=armv8-a+sme+sme-fa64" "probes/arm_sme_fa64.c")
54
+
55
+ nk_isa_probes_end_()
56
+
57
+ nk_build_isa_defs_(
58
+ arm
59
+ "Arm"
60
+ "NEON;NEONHALF;NEONSDOT;NEONBFDOT;NEONFHM;SVE;SVEHALF;SVEBFDOT;SVESDOT;SVE2;SVE2P1;NEONFP8;SME;SME2;SME2P1;SMEF64;SMEHALF;SMEBF16;SMEBI32;SMELUT2;SMEFA64"
61
+ )
@@ -0,0 +1,90 @@
1
+ # cmake/nk_isa_probe.cmake — shared ISA probe infrastructure
2
+ #
3
+ # Provides the two-pass probe macro and result-list builder used by all
4
+ # per-architecture probe files (nk_x86_isa_probes.cmake, etc.).
5
+ #
6
+ # Each architecture file sets `nk_native_flags_` before including this file,
7
+ # then calls `nk_isa_probe_()` for each ISA and `nk_build_isa_defs_()` once
8
+ # to collect the results.
9
+
10
+ include(CheckSourceCompiles)
11
+ if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.19)
12
+ include(CheckSourceRuns)
13
+ endif ()
14
+
15
+ # Save and restore CMAKE_REQUIRED_FLAGS around probes.
16
+ # Force Release config for try_compile to avoid ASAN DLL-not-found failures.
17
+ # Call nk_isa_probes_begin_() before probe calls, nk_isa_probes_end_() after.
18
+ macro (nk_isa_probes_begin_)
19
+ set(nk_saved_required_flags_ "${CMAKE_REQUIRED_FLAGS}")
20
+ set(nk_saved_try_compile_config_ "${CMAKE_TRY_COMPILE_CONFIGURATION}")
21
+ set(CMAKE_TRY_COMPILE_CONFIGURATION "Release")
22
+ endmacro ()
23
+
24
+ macro (nk_isa_probes_end_)
25
+ set(CMAKE_REQUIRED_FLAGS "${nk_saved_required_flags_}")
26
+ set(CMAKE_TRY_COMPILE_CONFIGURATION "${nk_saved_try_compile_config_}")
27
+ endmacro ()
28
+
29
+ # Two-pass probe: compile with ISA flags (Pass 1) and native flags (Pass 2).
30
+ # Pass 1 result drives nk_shared (dynamic dispatch — compile all the compiler supports).
31
+ # Pass 2 result drives nk_test/nk_bench (must actually run on the local CPU).
32
+ #
33
+ # The native flag (`nk_native_flags_`) is set by the caller:
34
+ # x86/ARM/LoongArch: -march=native
35
+ # Power: -mcpu=native
36
+ # RISC-V: "" (no equivalent — falls back to Pass 1)
37
+ macro (nk_isa_probe_ var_ msvc_arch_ gcc_flags_ probe_file_)
38
+ file(READ "${CMAKE_CURRENT_SOURCE_DIR}/${probe_file_}" nk_probe_source_)
39
+ # Pass 1: can the compiler emit this ISA?
40
+ if (MSVC)
41
+ set(CMAKE_REQUIRED_FLAGS "${msvc_arch_}")
42
+ else ()
43
+ set(CMAKE_REQUIRED_FLAGS "${gcc_flags_}")
44
+ endif ()
45
+ check_source_compiles(C "${nk_probe_source_}" ${var_}_compiles)
46
+ # Pass 2: does the local CPU support it?
47
+ if (NOT CMAKE_CROSSCOMPILING AND NOT MSVC AND NOT "${nk_native_flags_}" STREQUAL "")
48
+ set(CMAKE_REQUIRED_FLAGS "${nk_native_flags_}")
49
+ check_source_compiles(C "${nk_probe_source_}" ${var_}_native)
50
+ elseif (NOT CMAKE_CROSSCOMPILING AND MSVC AND ${var_}_compiles AND CMAKE_VERSION VERSION_GREATER_EQUAL 3.19)
51
+ # MSVC has no -march=native; instead compile with ISA-specific flags and
52
+ # run the probe. If the CPU lacks the ISA the process will crash and
53
+ # check_source_runs() will report failure.
54
+ set(CMAKE_REQUIRED_FLAGS "${msvc_arch_}")
55
+ check_source_runs(C "${nk_probe_source_}" ${var_}_native)
56
+ else ()
57
+ set(${var_}_native ${${var_}_compiles})
58
+ endif ()
59
+ endmacro ()
60
+
61
+ # Build compile-only and native def lists from probe results.
62
+ # arch_prefix_: variable prefix, e.g. "x86" → nk_x86_compile_defs_
63
+ # arch_display_: human-readable name for status messages
64
+ # isa_list_: semicolon-separated list of ISA names, e.g. "HASWELL;SKYLAKE;..."
65
+ function (nk_build_isa_defs_ arch_prefix_ arch_display_ isa_list_)
66
+ set(compile_defs_ "")
67
+ set(native_defs_ "")
68
+ foreach (isa_ IN LISTS isa_list_)
69
+ string(TOLOWER "${isa_}" isa_lower_)
70
+ if (nk_target_${isa_lower_}_compiles)
71
+ list(APPEND compile_defs_ "NK_TARGET_${isa_}=1")
72
+ else ()
73
+ list(APPEND compile_defs_ "NK_TARGET_${isa_}=0")
74
+ endif ()
75
+ if (nk_target_${isa_lower_}_native)
76
+ list(APPEND native_defs_ "NK_TARGET_${isa_}=1")
77
+ else ()
78
+ list(APPEND native_defs_ "NK_TARGET_${isa_}=0")
79
+ endif ()
80
+ endforeach ()
81
+ if (compile_defs_)
82
+ message(STATUS "${arch_display_} ISA compile probes: ${compile_defs_}")
83
+ endif ()
84
+ if (native_defs_)
85
+ message(STATUS "${arch_display_} ISA native probes: ${native_defs_}")
86
+ endif ()
87
+ set(nk_${arch_prefix_}_compile_defs_ "${compile_defs_}" PARENT_SCOPE)
88
+ set(nk_${arch_prefix_}_native_defs_ "${native_defs_}" PARENT_SCOPE)
89
+ set(nk_${arch_prefix_}_isa_defs_ "${native_defs_}" PARENT_SCOPE)
90
+ endfunction ()
@@ -0,0 +1,15 @@
1
+ # cmake/nk_loongarch_isa_probes.cmake — LoongArch ISA compiler-capability probes
2
+ #
3
+ # Detect which ISA extensions the compiler can emit.
4
+ # Probe source lives in probes/loongarch_*.c — shared with setup.py and build.rs.
5
+
6
+ set(nk_native_flags_ "-march=native")
7
+ include(cmake/nk_isa_probe.cmake)
8
+
9
+ nk_isa_probes_begin_()
10
+
11
+ nk_isa_probe_(nk_target_loongsonasx "" "-mlasx" "probes/loongarch_lasx.c")
12
+
13
+ nk_isa_probes_end_()
14
+
15
+ nk_build_isa_defs_(loongarch "LoongArch" "LOONGSONASX")
@@ -0,0 +1,46 @@
1
+ # cmake/nk_math_lib.cmake
2
+ #
3
+ # Detect whether C++ targets need explicit linkage against `libm`.
4
+ # Some Unix toolchains require `-lm` for cmath symbols, while MSVC and
5
+ # WASM/WASI toolchains do not provide a separate math archive.
6
+ #
7
+ # Contract:
8
+ # Input: MSVC, NK_IS_WASI_PROJECT_, CMAKE_SYSTEM_NAME
9
+ # Output: caller-provided output variable with either "" or "m"
10
+
11
+ include(CheckCXXSourceCompiles)
12
+
13
+ function (nk_detect_cxx_math_lib_ output_var_)
14
+ set(${output_var_} "" PARENT_SCOPE)
15
+
16
+ if (MSVC OR NK_IS_WASI_PROJECT_ OR CMAKE_SYSTEM_NAME STREQUAL "Emscripten")
17
+ return()
18
+ endif ()
19
+
20
+ set(nk_cxx_math_probe_src_
21
+ "
22
+ #include <cmath>
23
+ int main() {
24
+ volatile double x = std::sqrt(2.0);
25
+ volatile double y = std::sin(x);
26
+ volatile double z = std::fma(x, y, 1.0);
27
+ return z == 0.0;
28
+ }
29
+ "
30
+ )
31
+
32
+ set(CMAKE_REQUIRED_QUIET ON)
33
+ set(CMAKE_REQUIRED_LIBRARIES "")
34
+ check_cxx_source_compiles("${nk_cxx_math_probe_src_}" nk_cxx_links_math_without_libm_)
35
+
36
+ if (NOT nk_cxx_links_math_without_libm_)
37
+ set(CMAKE_REQUIRED_LIBRARIES m)
38
+ check_cxx_source_compiles("${nk_cxx_math_probe_src_}" nk_cxx_links_math_with_libm_)
39
+ if (nk_cxx_links_math_with_libm_)
40
+ set(${output_var_} "m" PARENT_SCOPE)
41
+ endif ()
42
+ endif ()
43
+
44
+ unset(CMAKE_REQUIRED_LIBRARIES)
45
+ unset(CMAKE_REQUIRED_QUIET)
46
+ endfunction ()
@@ -0,0 +1,15 @@
1
+ # cmake/nk_power_isa_probes.cmake — Power ISA compiler-capability probes
2
+ #
3
+ # Detect which ISA extensions the compiler can emit.
4
+ # Probe source lives in probes/power_*.c — shared with setup.py and build.rs.
5
+
6
+ set(nk_native_flags_ "-mcpu=native")
7
+ include(cmake/nk_isa_probe.cmake)
8
+
9
+ nk_isa_probes_begin_()
10
+
11
+ nk_isa_probe_(nk_target_powervsx "" "-mcpu=power9 -mvsx" "probes/power_vsx.c")
12
+
13
+ nk_isa_probes_end_()
14
+
15
+ nk_build_isa_defs_(power "Power" "POWERVSX")
@@ -0,0 +1,19 @@
1
+ # cmake/nk_riscv_isa_probes.cmake — RISC-V ISA compiler-capability probes
2
+ #
3
+ # Detect which ISA extensions the compiler can emit.
4
+ # RISC-V has no -march=native, so native falls back to compile result.
5
+ # Probe source lives in probes/riscv_*.c — shared with setup.py and build.rs.
6
+
7
+ set(nk_native_flags_ "")
8
+ include(cmake/nk_isa_probe.cmake)
9
+
10
+ nk_isa_probes_begin_()
11
+
12
+ nk_isa_probe_(nk_target_rvv "" "-march=rv64gcv" "probes/riscv_rvv.c")
13
+ nk_isa_probe_(nk_target_rvvhalf "" "-march=rv64gcv_zvfh" "probes/riscv_rvv_half.c")
14
+ nk_isa_probe_(nk_target_rvvbf16 "" "-march=rv64gcv_zvfbfwma" "probes/riscv_rvv_bf16.c")
15
+ nk_isa_probe_(nk_target_rvvbb "" "-march=rv64gcv_zvbb" "probes/riscv_rvv_bb.c")
16
+
17
+ nk_isa_probes_end_()
18
+
19
+ nk_build_isa_defs_(riscv "RISC-V" "RVV;RVVHALF;RVVBF16;RVVBB")
@@ -0,0 +1,35 @@
1
+ # cmake/nk_x86_isa_probes.cmake — x86 ISA compiler-capability probes
2
+ #
3
+ # Detect which ISA extensions the compiler can emit.
4
+ # Probe source lives in probes/x86_*.c — shared with setup.py and build.rs.
5
+
6
+ set(nk_native_flags_ "-march=native")
7
+ include(cmake/nk_isa_probe.cmake)
8
+
9
+ nk_isa_probes_begin_()
10
+
11
+ nk_isa_probe_(nk_target_haswell "/arch:AVX2" "-mavx2 -mfma -mf16c" "probes/x86_haswell.c")
12
+
13
+ nk_isa_probe_(nk_target_skylake "/arch:AVX512" "-mavx512f -mavx512bw -mavx512dq -mavx512vl" "probes/x86_skylake.c")
14
+
15
+ nk_isa_probe_(nk_target_icelake "/arch:AVX512" "-mavx512vnni -mavx512vl" "probes/x86_icelake.c")
16
+
17
+ nk_isa_probe_(nk_target_genoa "/arch:AVX512" "-mavx512bf16 -mavx512vl" "probes/x86_genoa.c")
18
+
19
+ nk_isa_probe_(nk_target_sapphire "/arch:AVX512" "-mavx512fp16 -mavx512vl" "probes/x86_sapphire.c")
20
+
21
+ nk_isa_probe_(nk_target_sapphireamx "/arch:AVX512" "-mamx-tile -mamx-int8" "probes/x86_sapphireamx.c")
22
+
23
+ nk_isa_probe_(nk_target_graniteamx "/arch:AVX512" "-mamx-tile -mamx-fp16" "probes/x86_graniteamx.c")
24
+
25
+ nk_isa_probe_(nk_target_diamond "/arch:AVX10.2" "-mavx10.2-512" "probes/x86_diamond.c")
26
+
27
+ nk_isa_probe_(nk_target_turin "/arch:AVX512" "-mavx512vp2intersect" "probes/x86_turin.c")
28
+
29
+ nk_isa_probe_(nk_target_alder "/arch:AVX2" "-mavxvnni" "probes/x86_alder.c")
30
+
31
+ nk_isa_probe_(nk_target_sierra "/arch:AVX2" "-mavxvnniint8" "probes/x86_sierra.c")
32
+
33
+ nk_isa_probes_end_()
34
+
35
+ nk_build_isa_defs_(x86 "x86" "HASWELL;SKYLAKE;ICELAKE;GENOA;SAPPHIRE;SAPPHIREAMX;GRANITEAMX;DIAMOND;TURIN;ALDER;SIERRA")
@@ -0,0 +1,86 @@
1
+ # AArch64 GNU toolchain for NumKong.
2
+ #
3
+ # Usage:
4
+ # cmake -B build_arm64 -D CMAKE_TOOLCHAIN_FILE=cmake/toolchain-aarch64-gnu.cmake
5
+ # cmake --build build_arm64
6
+ #
7
+ # Prerequisites (choose one):
8
+ # Option A - Ubuntu/Debian packages:
9
+ # sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu qemu-user
10
+ # Option B - Arm GNU Toolchain (recommended for latest ISA support):
11
+ # Download from: https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads
12
+ # Set via AARCH64_TOOLCHAIN_PATH
13
+ #
14
+ # Testing with QEMU:
15
+ # Tests will automatically run under QEMU via CMAKE_CROSSCOMPILING_EMULATOR
16
+ #
17
+ # To customize the architecture, set AARCH64_MARCH before configuring:
18
+ # cmake -B build_arm64 -D CMAKE_TOOLCHAIN_FILE=cmake/toolchain-aarch64-gnu.cmake -D AARCH64_MARCH=armv8.2-a+sve
19
+
20
+ set(CMAKE_SYSTEM_NAME Linux)
21
+ set(CMAKE_SYSTEM_PROCESSOR aarch64)
22
+
23
+ # Cross-compiler detection with fallback chain:
24
+ # 1. AARCH64_TOOLCHAIN_PATH (explicit path to Arm GNU Toolchain)
25
+ # 2. /tmp/aarch64 (default Arm GNU Toolchain location)
26
+ # 3. System packages (aarch64-linux-gnu-)
27
+ if (DEFINED AARCH64_TOOLCHAIN_PATH)
28
+ set(AARCH64_TOOLCHAIN_PREFIX "${AARCH64_TOOLCHAIN_PATH}/bin/aarch64-none-linux-gnu-")
29
+ set(CMAKE_SYSROOT "${AARCH64_TOOLCHAIN_PATH}/aarch64-none-linux-gnu/libc")
30
+ elseif (NOT DEFINED AARCH64_TOOLCHAIN_PREFIX)
31
+ set(AARCH64_TOOLCHAIN_PREFIX "aarch64-linux-gnu-")
32
+ endif ()
33
+
34
+ set(CMAKE_C_COMPILER ${AARCH64_TOOLCHAIN_PREFIX}gcc)
35
+ set(CMAKE_CXX_COMPILER ${AARCH64_TOOLCHAIN_PREFIX}g++)
36
+
37
+ # Target architecture with modern Arm extensions
38
+ # Default: Enables all extensions supported by NumKong
39
+ #
40
+ # Architecture hierarchy:
41
+ # armv8-a : Base AArch64 (NEON mandatory)
42
+ # armv8.2-a : +fp16 (half-precision), +dotprod available
43
+ # armv8.4-a : +bf16 (bfloat16) available
44
+ # armv8.6-a : +i8mm (int8 matrix multiply) available
45
+ # armv9-a : SVE2 mandatory, +sme available
46
+ # armv9.2-a : +sme2 available
47
+ #
48
+ # NumKong Arm targets and required extensions:
49
+ # NK_TARGET_NEON : Base NEON (automatic with aarch64)
50
+ # NK_TARGET_NEONHALF : +fp16
51
+ # NK_TARGET_NEONBFDOT : +bf16
52
+ # NK_TARGET_NEONFHM : +fp16fml (FMLAL/FMLSL widening ops)
53
+ # NK_TARGET_NEONSDOT : +dotprod
54
+ # NK_TARGET_SVE : +sve
55
+ # NK_TARGET_SVEHALF : +sve +fp16
56
+ # NK_TARGET_SVEBFDOT : +sve +bf16
57
+ # NK_TARGET_SVE2 : +sve2
58
+ # NK_TARGET_SME : +sme
59
+ # NK_TARGET_SME2 : +sme2
60
+ #
61
+ # Common CPU profiles:
62
+ # armv8.2-a+fp16+dotprod : Apple M1, Ampere Altra
63
+ # armv8.4-a+sve+fp16+bf16+i8mm : AWS Graviton 3, Neoverse V1
64
+ # armv9-a+sve2+fp16+bf16+i8mm : Neoverse V2, Cortex-X3
65
+ # armv9.2-a+sve2+sme2+fp16+bf16+i8mm+fp16fml : Future SME2-capable CPUs
66
+ #
67
+ # Default: armv9-a with SVE2 and common extensions (GCC 13 compatible)
68
+ # For SME/SME2 support, use GCC 14+ and set:
69
+ # -DAARCH64_MARCH="armv9.2-a+sve2+sme2+fp16+bf16+i8mm+dotprod+fp16fml"
70
+ if (NOT DEFINED AARCH64_MARCH)
71
+ set(AARCH64_MARCH "armv9-a+sve2+fp16+bf16+i8mm+dotprod+fp16fml")
72
+ endif ()
73
+
74
+ set(CMAKE_C_FLAGS_INIT "-march=${AARCH64_MARCH}")
75
+ set(CMAKE_CXX_FLAGS_INIT "-march=${AARCH64_MARCH}")
76
+
77
+ # QEMU user-mode emulation for running tests.
78
+ # -cpu max enables all supported features.
79
+ # For specific CPU emulation: -cpu neoverse-v1, -cpu neoverse-v2, etc.
80
+ set(CMAKE_CROSSCOMPILING_EMULATOR "qemu-aarch64;-cpu;max")
81
+
82
+ # Search paths for libraries and headers (target system only).
83
+ set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
84
+ set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
85
+ set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
86
+ set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
@@ -0,0 +1,25 @@
1
+ # Android ARM64 toolchain for NumKong.
2
+ #
3
+ # Usage:
4
+ # export ANDROID_NDK_ROOT=/path/to/android-ndk-r29
5
+ # cmake -B build_android -D CMAKE_TOOLCHAIN_FILE=cmake/toolchain-android-arm64.cmake \
6
+ # -D NK_BUILD_SHARED=ON
7
+ # cmake --build build_android
8
+ #
9
+ # Requires ANDROID_NDK_ROOT or ANDROID_NDK to point to the NDK.
10
+
11
+ # Locate the NDK.
12
+ if (DEFINED ENV{ANDROID_NDK_ROOT})
13
+ set(_ndk_root "$ENV{ANDROID_NDK_ROOT}")
14
+ elseif (DEFINED ENV{ANDROID_NDK})
15
+ set(_ndk_root "$ENV{ANDROID_NDK}")
16
+ else ()
17
+ message(FATAL_ERROR "Set ANDROID_NDK_ROOT or ANDROID_NDK to the NDK installation path")
18
+ endif ()
19
+
20
+ # Defaults for ARM64 Android.
21
+ set(ANDROID_ABI "arm64-v8a" CACHE STRING "Android ABI")
22
+ set(ANDROID_PLATFORM "android-28" CACHE STRING "Minimum Android API level")
23
+
24
+ # Delegate to the NDK's own toolchain.
25
+ include("${_ndk_root}/build/cmake/android.toolchain.cmake")
@@ -0,0 +1,25 @@
1
+ # Android ARMv7 toolchain for NumKong.
2
+ #
3
+ # Usage:
4
+ # export ANDROID_NDK_ROOT=/path/to/android-ndk-r29
5
+ # cmake -B build_android_armv7 -D CMAKE_TOOLCHAIN_FILE=cmake/toolchain-android-armv7.cmake \
6
+ # -D NK_BUILD_SHARED=ON
7
+ # cmake --build build_android_armv7
8
+ #
9
+ # Requires ANDROID_NDK_ROOT or ANDROID_NDK to point to the NDK.
10
+
11
+ # Locate the NDK.
12
+ if (DEFINED ENV{ANDROID_NDK_ROOT})
13
+ set(_ndk_root "$ENV{ANDROID_NDK_ROOT}")
14
+ elseif (DEFINED ENV{ANDROID_NDK})
15
+ set(_ndk_root "$ENV{ANDROID_NDK}")
16
+ else ()
17
+ message(FATAL_ERROR "Set ANDROID_NDK_ROOT or ANDROID_NDK to the NDK installation path")
18
+ endif ()
19
+
20
+ # Defaults for 32-bit ARM Android with NEON.
21
+ set(ANDROID_ABI "armeabi-v7a" CACHE STRING "Android ABI")
22
+ set(ANDROID_PLATFORM "android-28" CACHE STRING "Minimum Android API level")
23
+
24
+ # Delegate to the NDK's own toolchain.
25
+ include("${_ndk_root}/build/cmake/android.toolchain.cmake")
@@ -0,0 +1,68 @@
1
+ # LoongArch 64 GNU toolchain for NumKong.
2
+ #
3
+ # Usage:
4
+ # cmake -B build_loongarch -D CMAKE_TOOLCHAIN_FILE=cmake/toolchain-loongarch64-gnu.cmake
5
+ # cmake --build build_loongarch
6
+ #
7
+ # Optional inputs:
8
+ # -D LOONGARCH_TOOLCHAIN_PATH=/path/to/loongarch-gnu-toolchain
9
+ # -D LOONGARCH_SYSROOT=/path/to/loongarch64/sysroot
10
+ #
11
+ # Prerequisites:
12
+ # sudo apt install gcc-loongarch64-linux-gnu g++-loongarch64-linux-gnu qemu-user
13
+ #
14
+ # Testing with QEMU:
15
+ # Tests will automatically run under QEMU via CMAKE_CROSSCOMPILING_EMULATOR
16
+
17
+ set(CMAKE_SYSTEM_NAME Linux)
18
+ set(CMAKE_SYSTEM_PROCESSOR loongarch64)
19
+
20
+ # Cross-compiler.
21
+ # Set LOONGARCH_TOOLCHAIN_PATH to override the default location.
22
+ if (NOT DEFINED LOONGARCH_TOOLCHAIN_PATH)
23
+ if (DEFINED ENV{LOONGARCH_TOOLCHAIN_PATH})
24
+ set(LOONGARCH_TOOLCHAIN_PATH "$ENV{LOONGARCH_TOOLCHAIN_PATH}")
25
+ else ()
26
+ set(LOONGARCH_TOOLCHAIN_PATH "/tmp/loongarch")
27
+ endif ()
28
+ endif ()
29
+ set(LOONGARCH_TOOLCHAIN_PATH "${LOONGARCH_TOOLCHAIN_PATH}" CACHE PATH "LoongArch GNU toolchain root")
30
+ set(ENV{LOONGARCH_TOOLCHAIN_PATH} "${LOONGARCH_TOOLCHAIN_PATH}")
31
+
32
+ set(CMAKE_C_COMPILER "${LOONGARCH_TOOLCHAIN_PATH}/bin/loongarch64-unknown-linux-gnu-gcc")
33
+ set(CMAKE_CXX_COMPILER "${LOONGARCH_TOOLCHAIN_PATH}/bin/loongarch64-unknown-linux-gnu-g++")
34
+
35
+ # Sysroot for the target system.
36
+ if (NOT DEFINED LOONGARCH_SYSROOT)
37
+ if (DEFINED ENV{LOONGARCH_SYSROOT})
38
+ set(LOONGARCH_SYSROOT "$ENV{LOONGARCH_SYSROOT}")
39
+ else ()
40
+ set(LOONGARCH_SYSROOT "${LOONGARCH_TOOLCHAIN_PATH}/sysroot")
41
+ endif ()
42
+ endif ()
43
+ set(LOONGARCH_SYSROOT "${LOONGARCH_SYSROOT}" CACHE PATH "LoongArch sysroot for GNU cross-compilation")
44
+ set(ENV{LOONGARCH_SYSROOT} "${LOONGARCH_SYSROOT}")
45
+ set(CMAKE_SYSROOT "${LOONGARCH_SYSROOT}")
46
+
47
+ # Forward custom variables to nested try_compile() projects.
48
+ list(APPEND CMAKE_TRY_COMPILE_PLATFORM_VARIABLES LOONGARCH_TOOLCHAIN_PATH LOONGARCH_SYSROOT)
49
+
50
+ # Toolchain validation only needs to prove the project compiles.
51
+ set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
52
+
53
+ # Enable LASX (256-bit SIMD) by default.
54
+ # The base ABI is lp64d (64-bit pointers, double-precision floats in FP registers).
55
+ set(CMAKE_C_FLAGS_INIT "-mlasx")
56
+ set(CMAKE_CXX_FLAGS_INIT "-mlasx")
57
+
58
+ # QEMU user-mode emulation for running tests.
59
+ # -L sysroot provides the dynamic linker path.
60
+ # -cpu max enables all supported extensions.
61
+ set(CMAKE_CROSSCOMPILING_EMULATOR "qemu-loongarch64;-L;${LOONGARCH_SYSROOT};-cpu;max")
62
+
63
+ # Search paths for libraries and headers (target system only).
64
+ set(CMAKE_FIND_ROOT_PATH "${LOONGARCH_SYSROOT}")
65
+ set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
66
+ set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
67
+ set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
68
+ set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
@@ -0,0 +1,74 @@
1
+ # Power ppc64le GNU toolchain for NumKong.
2
+ #
3
+ # Usage:
4
+ # cmake -B build_ppc -D CMAKE_TOOLCHAIN_FILE=cmake/toolchain-ppc64le-gnu.cmake
5
+ # cmake --build build_ppc
6
+ #
7
+ # Optional inputs:
8
+ # -D PPC_TOOLCHAIN_PATH=/path/to/powerpc64le-linux-gnu
9
+ # -D PPC_SYSROOT=/path/to/ppc64le/sysroot
10
+ # -D PPC_MCPU=power10
11
+ #
12
+ # Prerequisites:
13
+ # sudo apt install gcc-powerpc64le-linux-gnu g++-powerpc64le-linux-gnu libc6-dev-ppc64el-cross qemu-user
14
+ #
15
+ # Testing with QEMU:
16
+ # Tests will automatically run under QEMU via CMAKE_CROSSCOMPILING_EMULATOR
17
+
18
+ set(CMAKE_SYSTEM_NAME Linux)
19
+ set(CMAKE_SYSTEM_PROCESSOR ppc64le)
20
+
21
+ # Cross-compiler from the system package (gcc-powerpc64le-linux-gnu).
22
+ set(CMAKE_C_COMPILER powerpc64le-linux-gnu-gcc)
23
+ set(CMAKE_CXX_COMPILER powerpc64le-linux-gnu-g++)
24
+
25
+ # Sysroot for the target system.
26
+ if (NOT DEFINED PPC_SYSROOT)
27
+ if (DEFINED ENV{PPC_SYSROOT})
28
+ set(PPC_SYSROOT "$ENV{PPC_SYSROOT}")
29
+ else ()
30
+ # Default: derive from the cross-compiler
31
+ execute_process(
32
+ COMMAND powerpc64le-linux-gnu-gcc -print-sysroot OUTPUT_VARIABLE PPC_SYSROOT
33
+ OUTPUT_STRIP_TRAILING_WHITESPACE ERROR_QUIET
34
+ )
35
+ if (NOT PPC_SYSROOT OR PPC_SYSROOT STREQUAL "")
36
+ set(PPC_SYSROOT "/usr/powerpc64le-linux-gnu")
37
+ endif ()
38
+ endif ()
39
+ endif ()
40
+ set(PPC_SYSROOT "${PPC_SYSROOT}" CACHE PATH "ppc64le sysroot for GNU cross-compilation")
41
+ set(CMAKE_SYSROOT "${PPC_SYSROOT}")
42
+
43
+ # Target CPU microarchitecture.
44
+ # power9: VSX + vec_xl_len + vec_cmpne + f16 conversion (minimum for NumKong powervsx backend).
45
+ # power10: adds MMA + native bf16 conversions (future powermma backend).
46
+ if (NOT DEFINED PPC_MCPU)
47
+ if (DEFINED ENV{PPC_MCPU})
48
+ set(PPC_MCPU "$ENV{PPC_MCPU}")
49
+ else ()
50
+ set(PPC_MCPU "power9")
51
+ endif ()
52
+ endif ()
53
+ set(PPC_MCPU "${PPC_MCPU}" CACHE STRING "Power CPU target for cross-compilation")
54
+
55
+ # Forward settings to nested try_compile() invocations.
56
+ list(APPEND CMAKE_TRY_COMPILE_PLATFORM_VARIABLES PPC_SYSROOT PPC_MCPU)
57
+
58
+ # Toolchain validation only needs to prove the project compiles.
59
+ set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
60
+
61
+ set(CMAKE_C_FLAGS_INIT "-mcpu=${PPC_MCPU} -mvsx")
62
+ set(CMAKE_CXX_FLAGS_INIT "-mcpu=${PPC_MCPU} -mvsx")
63
+
64
+ # QEMU user-mode emulation for running tests.
65
+ # -L sysroot provides the dynamic linker path.
66
+ # -cpu power9 matches our POWER9+ baseline (older QEMU lacks "-cpu max" for ppc64le).
67
+ set(CMAKE_CROSSCOMPILING_EMULATOR "qemu-ppc64le;-L;${PPC_SYSROOT};-cpu;power9")
68
+
69
+ # Search paths for libraries and headers (target system only).
70
+ set(CMAKE_FIND_ROOT_PATH "${PPC_SYSROOT}")
71
+ set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
72
+ set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
73
+ set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
74
+ set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)