carray 2.0.1 → 3.0.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 (386) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +6 -25
  3. data/CHANGELOG.md +338 -0
  4. data/{NEWS.md → CHANGELOG.v1.md} +3 -0
  5. data/LICENSE +1 -1
  6. data/README.md +120 -36
  7. data/carray.gemspec +32 -30
  8. data/ext/ca_array_pool.c +91 -0
  9. data/ext/ca_axis_descriptor.h +186 -0
  10. data/ext/ca_axis_dispatch.c +924 -0
  11. data/ext/ca_axis_group.c +1244 -0
  12. data/ext/ca_bincmp_dispatch.c +76 -0
  13. data/ext/ca_bincmp_dispatch.h +85 -0
  14. data/ext/ca_binop_dispatch.c +124 -0
  15. data/ext/ca_binop_dispatch.h +152 -0
  16. data/ext/ca_categorical_iterator.c +1375 -0
  17. data/ext/ca_compare.c +94 -0
  18. data/ext/ca_compare.h +26 -0
  19. data/ext/ca_composite_dispatch.c +414 -0
  20. data/ext/ca_composite_dispatch.h +116 -0
  21. data/ext/ca_for_buffer.h +96 -0
  22. data/ext/ca_for_each_element.h +239 -0
  23. data/ext/ca_group_iter.c +304 -0
  24. data/ext/ca_iter_substrate.h +325 -0
  25. data/ext/ca_kernel_iterator.c +4367 -0
  26. data/ext/ca_kernel_iterator.h +2596 -0
  27. data/ext/ca_moncmp_dispatch.c +37 -0
  28. data/ext/ca_moncmp_dispatch.h +62 -0
  29. data/ext/ca_monop_dispatch.c +200 -0
  30. data/ext/ca_monop_dispatch.h +235 -0
  31. data/ext/ca_obj_array.c +355 -359
  32. data/ext/ca_obj_bincmp.c +839 -0
  33. data/ext/ca_obj_binop.c +948 -0
  34. data/ext/ca_obj_bitarray.c +369 -164
  35. data/ext/ca_obj_bitfield.c +294 -234
  36. data/ext/ca_obj_block.c +189 -711
  37. data/ext/ca_obj_byte_swap.c +766 -0
  38. data/ext/ca_obj_const_string.c +967 -0
  39. data/ext/ca_obj_face.c +750 -0
  40. data/ext/ca_obj_face.h +279 -0
  41. data/ext/ca_obj_fake.c +239 -100
  42. data/ext/ca_obj_farray.c +54 -441
  43. data/ext/ca_obj_field.c +82 -529
  44. data/ext/ca_obj_fixlen_string.c +308 -0
  45. data/ext/ca_obj_grid.c +866 -440
  46. data/ext/ca_obj_meld.c +1039 -0
  47. data/ext/ca_obj_moncmp.c +588 -0
  48. data/ext/ca_obj_monop.c +1123 -0
  49. data/ext/ca_obj_object.c +866 -296
  50. data/ext/ca_obj_record.c +470 -0
  51. data/ext/ca_obj_reduce.c +97 -82
  52. data/ext/ca_obj_refer.c +593 -459
  53. data/ext/ca_obj_remap.c +475 -0
  54. data/ext/ca_obj_repeat.c +92 -477
  55. data/ext/ca_obj_roll.c +624 -0
  56. data/ext/ca_obj_select.c +344 -296
  57. data/ext/ca_obj_select_axis.c +1306 -0
  58. data/ext/ca_obj_shift.c +231 -793
  59. data/ext/ca_obj_source.c +78 -0
  60. data/ext/ca_obj_stack.c +1173 -0
  61. data/ext/ca_obj_stride.c +2584 -0
  62. data/ext/ca_obj_string.c +270 -0
  63. data/ext/ca_obj_tile.c +622 -0
  64. data/ext/ca_obj_time.c +548 -0
  65. data/ext/ca_obj_timedelta.c +437 -0
  66. data/ext/ca_obj_transpose.c +62 -516
  67. data/ext/ca_obj_triop.c +785 -0
  68. data/ext/ca_obj_window.c +1202 -565
  69. data/ext/ca_op_byte_swap.c +175 -0
  70. data/ext/ca_op_cmplx64.h +123 -0
  71. data/ext/ca_op_ipower.c +316 -0
  72. data/ext/ca_op_powi.h +88 -0
  73. data/ext/ca_sort_kernels.h +132 -0
  74. data/ext/ca_sweep_engine.c +473 -0
  75. data/ext/ca_sweep_engine.h +166 -0
  76. data/ext/ca_transform_common.c +235 -0
  77. data/ext/ca_triop_dispatch.c +55 -0
  78. data/ext/ca_triop_dispatch.h +62 -0
  79. data/ext/carray.h +810 -420
  80. data/ext/carray_access.c +873 -731
  81. data/ext/carray_attribute.c +98 -329
  82. data/ext/carray_bincount.c +255 -0
  83. data/ext/carray_broadcast.c +376 -0
  84. data/ext/carray_build_flags.h +3 -0
  85. data/ext/carray_call_cfunc.c +2897 -874
  86. data/ext/carray_call_cfunc.h +313 -0
  87. data/ext/carray_cast.c +1264 -315
  88. data/ext/carray_cast_func.rb +81 -40
  89. data/ext/carray_class.c +53 -63
  90. data/ext/carray_config.h +28 -0
  91. data/ext/carray_conversion.c +350 -346
  92. data/ext/carray_copy.c +168 -270
  93. data/ext/carray_core.c +1396 -206
  94. data/ext/carray_count.c +312 -0
  95. data/ext/carray_data_type.c +43 -19
  96. data/ext/carray_element.c +585 -213
  97. data/ext/carray_factorize.c +2542 -0
  98. data/ext/carray_generate.c +230 -559
  99. data/ext/carray_histogram.c +490 -0
  100. data/ext/carray_hold.c +228 -0
  101. data/ext/carray_index_classifier.c +1021 -0
  102. data/ext/carray_index_classifier.h +27 -0
  103. data/ext/carray_internal.h +136 -0
  104. data/ext/carray_kernels_bincmp.c +4446 -0
  105. data/ext/carray_kernels_binop.c +11001 -0
  106. data/ext/carray_kernels_init.c +1131 -0
  107. data/ext/carray_kernels_map.c +3467 -0
  108. data/ext/carray_kernels_moncmp.c +2097 -0
  109. data/ext/carray_kernels_monop.c +18313 -0
  110. data/ext/carray_kernels_reduce_aggregate.c +25837 -0
  111. data/ext/carray_kernels_reduce_boolean.c +330 -0
  112. data/ext/carray_kernels_reduce_cumulative.c +14593 -0
  113. data/ext/carray_kernels_reduce_extreme.c +16948 -0
  114. data/ext/carray_kernels_reduce_variance.c +3910 -0
  115. data/ext/carray_kernels_scan.c +3693 -0
  116. data/ext/carray_kernels_search.c +32138 -0
  117. data/ext/carray_kernels_sort.c +10626 -0
  118. data/ext/carray_kernels_triop.c +1392 -0
  119. data/ext/carray_lazy.c +737 -0
  120. data/ext/carray_loop.c +88 -200
  121. data/ext/carray_mask.c +853 -158
  122. data/ext/carray_math_kernel.h +120 -0
  123. data/ext/carray_mathfunc.c +10 -241
  124. data/ext/carray_median_percentile.c +1257 -0
  125. data/ext/carray_memory_view.c +1650 -0
  126. data/ext/carray_operator.c +1525 -320
  127. data/ext/carray_order.c +664 -1394
  128. data/ext/carray_partition.c +416 -0
  129. data/ext/carray_random.c +518 -0
  130. data/ext/carray_scatter.c +357 -0
  131. data/ext/carray_slab.c +1219 -0
  132. data/ext/carray_slab.h +84 -0
  133. data/ext/carray_sort.c +829 -0
  134. data/ext/carray_sort_kernel.c +620 -0
  135. data/ext/carray_struct.c +695 -0
  136. data/ext/carray_test.c +343 -229
  137. data/ext/carray_undef.c +34 -17
  138. data/ext/carray_utils.c +175 -74
  139. data/ext/extconf.rb +234 -55
  140. data/ext/mk_call_cfunc.rb +671 -0
  141. data/ext/mkkernel.rb +9096 -0
  142. data/ext/ruby_carray.c +211 -108
  143. data/ext/version.h +4 -14
  144. data/ext/version.rb +5 -13
  145. data/lib/carray/arrow_tensor.rb +401 -0
  146. data/lib/carray/attribute.rb +166 -0
  147. data/lib/carray/autoload_carray.rb +239 -0
  148. data/lib/carray/autoload_method_extension.rb +45 -0
  149. data/lib/carray/axis_group.rb +711 -0
  150. data/lib/carray/basics.rb +481 -0
  151. data/lib/carray/bincount_nd.rb +358 -0
  152. data/lib/carray/block_iterator.rb +614 -0
  153. data/lib/carray/boolean_reduce.rb +109 -0
  154. data/lib/carray/categorical.rb +561 -0
  155. data/lib/carray/categorical_iterator.rb +1084 -0
  156. data/lib/carray/complex.rb +150 -0
  157. data/lib/carray/conditional.rb +216 -0
  158. data/lib/carray/const_string.rb +228 -0
  159. data/lib/carray/construct.rb +160 -328
  160. data/lib/carray/core_extensions.rb +297 -0
  161. data/lib/carray/data_type_extension.rb +250 -0
  162. data/lib/carray/fixlen_string.rb +95 -0
  163. data/lib/carray/frame/concat.rb +132 -0
  164. data/lib/carray/frame/convert.rb +95 -0
  165. data/lib/carray/frame/csv_parser.rb +211 -0
  166. data/lib/carray/frame/frame.rb +642 -0
  167. data/lib/carray/frame/group.rb +186 -0
  168. data/lib/carray/frame/io.rb +321 -0
  169. data/lib/carray/frame/join.rb +248 -0
  170. data/lib/carray/frame/records.rb +99 -0
  171. data/lib/carray/frame/sort.rb +113 -0
  172. data/lib/carray/frame/verbs.rb +316 -0
  173. data/lib/carray/frame.rb +16 -0
  174. data/lib/carray/fuse_source.rb +123 -0
  175. data/lib/carray/fusion.rb +218 -0
  176. data/lib/carray/histogram.rb +512 -0
  177. data/lib/carray/inspect.rb +37 -26
  178. data/lib/carray/iterator.rb +58 -349
  179. data/lib/carray/lazy.rb +941 -0
  180. data/lib/carray/mask_gap_fill.rb +200 -0
  181. data/lib/carray/math.rb +78 -342
  182. data/lib/carray/meld_reduce.rb +289 -0
  183. data/lib/carray/methods/align_addr.rb +116 -0
  184. data/lib/carray/methods/bin.rb +128 -0
  185. data/lib/carray/methods/bincount.rb +87 -0
  186. data/lib/carray/methods/bit_string.rb +92 -0
  187. data/lib/carray/methods/broadcast.rb +63 -0
  188. data/lib/carray/methods/choose.rb +39 -0
  189. data/lib/carray/methods/composition.rb +280 -0
  190. data/lib/carray/methods/gather_nd.rb +206 -0
  191. data/lib/carray/methods/index.rb +39 -0
  192. data/lib/carray/methods/insert_block.rb +99 -0
  193. data/lib/carray/methods/is_in.rb +141 -0
  194. data/lib/carray/methods/join.rb +90 -0
  195. data/lib/carray/methods/locate_addr.rb +52 -0
  196. data/lib/carray/methods/mask_duplicates.rb +41 -0
  197. data/lib/carray/methods/meshgrid.rb +90 -0
  198. data/lib/carray/methods/mode.rb +126 -0
  199. data/lib/carray/methods/nunique.rb +46 -0
  200. data/lib/carray/methods/resize.rb +56 -0
  201. data/lib/carray/methods/snap.rb +161 -0
  202. data/lib/carray/methods/string_format.rb +57 -0
  203. data/lib/carray/methods/unique.rb +47 -0
  204. data/lib/carray/methods/value_counts.rb +71 -0
  205. data/lib/carray/mkmf.rb +124 -101
  206. data/lib/carray/runtime.rb +89 -0
  207. data/lib/carray/serialize.rb +478 -167
  208. data/lib/carray/slab_iterator.rb +305 -0
  209. data/lib/carray/stack.rb +291 -0
  210. data/lib/carray/string.rb +56 -180
  211. data/lib/carray/string_operation_extension.rb +289 -0
  212. data/lib/carray/struct.rb +335 -323
  213. data/lib/carray/struct_builder.rb +697 -0
  214. data/lib/carray/table.rb +41 -2
  215. data/lib/carray/time.rb +2654 -38
  216. data/lib/carray/window_iterator.rb +927 -0
  217. data/lib/carray.rb +55 -57
  218. data/yard-stubs/ca_obj_array.rb +385 -0
  219. data/yard-stubs/ca_obj_bitarray.rb +38 -0
  220. data/yard-stubs/ca_obj_bitfield.rb +43 -0
  221. data/yard-stubs/ca_obj_block.rb +73 -0
  222. data/yard-stubs/ca_obj_byte_swap.rb +56 -0
  223. data/yard-stubs/ca_obj_fake.rb +31 -0
  224. data/yard-stubs/ca_obj_farray.rb +32 -0
  225. data/yard-stubs/ca_obj_field.rb +45 -0
  226. data/yard-stubs/ca_obj_grid.rb +35 -0
  227. data/yard-stubs/ca_obj_refer.rb +72 -0
  228. data/yard-stubs/ca_obj_roll.rb +45 -0
  229. data/yard-stubs/ca_obj_shift.rb +43 -0
  230. data/yard-stubs/ca_obj_stride.rb +181 -0
  231. data/yard-stubs/ca_obj_tile.rb +29 -0
  232. data/yard-stubs/ca_obj_transpose.rb +40 -0
  233. data/yard-stubs/ca_obj_window.rb +49 -0
  234. data/yard-stubs/carray_access.rb +131 -0
  235. data/yard-stubs/carray_attribute.rb +246 -0
  236. data/yard-stubs/carray_broadcast.rb +37 -0
  237. data/yard-stubs/carray_cast.rb +489 -0
  238. data/yard-stubs/carray_class.rb +65 -0
  239. data/yard-stubs/carray_conversion.rb +76 -0
  240. data/yard-stubs/carray_copy.rb +79 -0
  241. data/yard-stubs/carray_core.rb +114 -0
  242. data/yard-stubs/carray_count.rb +79 -0
  243. data/yard-stubs/carray_element.rb +108 -0
  244. data/yard-stubs/carray_generate.rb +66 -0
  245. data/yard-stubs/carray_lazy.rb +23 -0
  246. data/yard-stubs/carray_loop.rb +140 -0
  247. data/yard-stubs/carray_mask.rb +259 -0
  248. data/yard-stubs/carray_math.rb +132 -0
  249. data/yard-stubs/carray_mathfunc.rb +45 -0
  250. data/yard-stubs/carray_median_percentile.rb +89 -0
  251. data/yard-stubs/carray_memory_view.rb +163 -0
  252. data/yard-stubs/carray_order.rb +312 -0
  253. data/yard-stubs/carray_random.rb +89 -0
  254. data/yard-stubs/carray_scatter.rb +106 -0
  255. data/yard-stubs/carray_slab.rb +57 -0
  256. data/yard-stubs/carray_sort.rb +163 -0
  257. data/yard-stubs/carray_test.rb +85 -0
  258. data/yard-stubs/carray_undef.rb +64 -0
  259. data/yard-stubs/carray_utils.rb +97 -0
  260. data/yard-stubs/ruby_carray.rb +193 -0
  261. metadata +220 -138
  262. data/Rakefile +0 -51
  263. data/TODO.md +0 -18
  264. data/ext/ca_iter_block.c +0 -257
  265. data/ext/ca_iter_dimension.c +0 -299
  266. data/ext/ca_iter_window.c +0 -214
  267. data/ext/ca_obj_mapping.c +0 -644
  268. data/ext/ca_obj_unbound_repeat.c +0 -529
  269. data/ext/carray_iterator.c +0 -641
  270. data/ext/carray_math.rb +0 -850
  271. data/ext/carray_numeric.c +0 -259
  272. data/ext/carray_sort_addr.c +0 -254
  273. data/ext/carray_stat.c +0 -2100
  274. data/ext/carray_stat_proc.rb +0 -1999
  275. data/ext/mkmath.rb +0 -741
  276. data/ext/ruby_ccomplex.c +0 -509
  277. data/ext/ruby_float_func.c +0 -86
  278. data/lib/carray/array.rb +0 -8
  279. data/lib/carray/autoload/autoload_base.rb +0 -19
  280. data/lib/carray/autoload/autoload_gem_cairo.rb +0 -9
  281. data/lib/carray/autoload/autoload_gem_ffi.rb +0 -9
  282. data/lib/carray/autoload/autoload_gem_gnuplot.rb +0 -2
  283. data/lib/carray/autoload/autoload_gem_io_csv.rb +0 -14
  284. data/lib/carray/autoload/autoload_gem_io_pg.rb +0 -6
  285. data/lib/carray/autoload/autoload_gem_io_sqlite3.rb +0 -12
  286. data/lib/carray/autoload/autoload_gem_narray.rb +0 -10
  287. data/lib/carray/autoload/autoload_gem_numo_narray.rb +0 -15
  288. data/lib/carray/autoload/autoload_gem_opencv.rb +0 -16
  289. data/lib/carray/autoload/autoload_gem_random.rb +0 -8
  290. data/lib/carray/autoload/autoload_gem_rmagick.rb +0 -23
  291. data/lib/carray/autoload/autoload_gem_zimg.rb +0 -3
  292. data/lib/carray/autoload/autoload_io_imagemagick.rb +0 -6
  293. data/lib/carray/autoload/autoload_math_histogram.rb +0 -5
  294. data/lib/carray/autoload/autoload_math_recurrence.rb +0 -6
  295. data/lib/carray/autoload/autoload_object_iterator.rb +0 -1
  296. data/lib/carray/autoload/autoload_object_link.rb +0 -1
  297. data/lib/carray/autoload/autoload_object_pack.rb +0 -2
  298. data/lib/carray/autoload.rb +0 -141
  299. data/lib/carray/basic.rb +0 -191
  300. data/lib/carray/broadcast.rb +0 -101
  301. data/lib/carray/compose.rb +0 -315
  302. data/lib/carray/convert.rb +0 -115
  303. data/lib/carray/info.rb +0 -110
  304. data/lib/carray/io/imagemagick.rb +0 -235
  305. data/lib/carray/mask.rb +0 -102
  306. data/lib/carray/math/histogram.rb +0 -177
  307. data/lib/carray/math/recurrence.rb +0 -93
  308. data/lib/carray/object/ca_obj_iterator.rb +0 -50
  309. data/lib/carray/object/ca_obj_link.rb +0 -50
  310. data/lib/carray/object/ca_obj_pack.rb +0 -99
  311. data/lib/carray/obsolete.rb +0 -256
  312. data/lib/carray/ordering.rb +0 -181
  313. data/lib/carray/testing.rb +0 -51
  314. data/lib/carray/transform.rb +0 -109
  315. data/mailmap +0 -1
  316. data/misc/Methods.ja.md +0 -182
  317. data/misc/NOTE +0 -51
  318. data/spec/Classes/CABitfield_spec.rb +0 -58
  319. data/spec/Classes/CABlockIterator_spec.rb +0 -114
  320. data/spec/Classes/CABlock_spec.rb +0 -205
  321. data/spec/Classes/CAField_spec.rb +0 -39
  322. data/spec/Classes/CAGrid_spec.rb +0 -75
  323. data/spec/Classes/CAMap_spec.rb +0 -0
  324. data/spec/Classes/CAMapping_spec.rb +0 -105
  325. data/spec/Classes/CAObject_attribute_spec.rb +0 -33
  326. data/spec/Classes/CAObject_spec.rb +0 -33
  327. data/spec/Classes/CARefer_spec.rb +0 -93
  328. data/spec/Classes/CARepeat_spec.rb +0 -65
  329. data/spec/Classes/CASelect_spec.rb +0 -22
  330. data/spec/Classes/CAShift_spec.rb +0 -16
  331. data/spec/Classes/CAStruct_spec.rb +0 -71
  332. data/spec/Classes/CATranspose_spec.rb +0 -60
  333. data/spec/Classes/CAUnboudRepeat_spec.rb +0 -102
  334. data/spec/Classes/CAWindow_spec.rb +0 -54
  335. data/spec/Classes/CAWrap_spec.rb +0 -8
  336. data/spec/Classes/CArray_spec.rb +0 -184
  337. data/spec/Classes/CScalar_spec.rb +0 -55
  338. data/spec/Features/feature_130_spec.rb +0 -19
  339. data/spec/Features/feature_attributes_spec.rb +0 -280
  340. data/spec/Features/feature_boolean_spec.rb +0 -98
  341. data/spec/Features/feature_broadcast.rb +0 -116
  342. data/spec/Features/feature_cast_function.rb +0 -19
  343. data/spec/Features/feature_cast_spec.rb +0 -33
  344. data/spec/Features/feature_class_spec.rb +0 -84
  345. data/spec/Features/feature_complex_spec.rb +0 -42
  346. data/spec/Features/feature_composite_spec.rb +0 -124
  347. data/spec/Features/feature_convert_spec.rb +0 -46
  348. data/spec/Features/feature_copy_spec.rb +0 -123
  349. data/spec/Features/feature_creation_spec.rb +0 -84
  350. data/spec/Features/feature_element_spec.rb +0 -144
  351. data/spec/Features/feature_extream_spec.rb +0 -54
  352. data/spec/Features/feature_generate_spec.rb +0 -74
  353. data/spec/Features/feature_index_spec.rb +0 -69
  354. data/spec/Features/feature_mask_spec.rb +0 -580
  355. data/spec/Features/feature_math_spec.rb +0 -97
  356. data/spec/Features/feature_order_spec.rb +0 -146
  357. data/spec/Features/feature_ref_store_spec.rb +0 -209
  358. data/spec/Features/feature_serialization_spec.rb +0 -125
  359. data/spec/Features/feature_stat_spec.rb +0 -397
  360. data/spec/Features/feature_virtual_spec.rb +0 -48
  361. data/spec/Features/method_eq_spec.rb +0 -81
  362. data/spec/Features/method_is_nan_spec.rb +0 -12
  363. data/spec/Features/method_map_spec.rb +0 -54
  364. data/spec/Features/method_max_with.rb +0 -20
  365. data/spec/Features/method_min_with.rb +0 -19
  366. data/spec/Features/method_ne_spec.rb +0 -18
  367. data/spec/Features/method_project_spec.rb +0 -188
  368. data/spec/Features/method_ref_spec.rb +0 -27
  369. data/spec/Features/method_round_spec.rb +0 -11
  370. data/spec/Features/method_s_linspace_spec.rb +0 -48
  371. data/spec/Features/method_s_span_spec.rb +0 -14
  372. data/spec/Features/method_seq_spec.rb +0 -47
  373. data/spec/Features/method_sort_with.rb +0 -43
  374. data/spec/Features/method_sorted_with.rb +0 -29
  375. data/spec/Features/method_span_spec.rb +0 -42
  376. data/spec/Features/method_wrap_readonly_spec.rb +0 -43
  377. data/spec/UnitTest/test_CAVirtual.rb +0 -214
  378. data/spec/spec_all.rb +0 -10
  379. data/utils/ca_ase.rb +0 -21
  380. data/utils/ca_methods.rb +0 -15
  381. data/utils/cast_checker.rb +0 -30
  382. data/utils/convert_test.rb +0 -73
  383. data/utils/extract_yard.rb +0 -22
  384. data/utils/guess_shape.rb +0 -76
  385. data/utils/monkey_patch_methods.rb +0 -62
  386. data/utils/remove_resource_fork.sh +0 -5
@@ -0,0 +1,1392 @@
1
+ /* ---------------------------------------------------------------------------
2
+
3
+ carray_kernels.c -- GENERATED by ext/mkkernel.rb -- DO NOT EDIT
4
+
5
+ Kernel definitions live in mkkernel.rb (search for `MkKernel.reduce`).
6
+ Regenerate by running:
7
+
8
+ cd ext && ruby mkkernel.rb > carray_kernels.c
9
+
10
+ extconf.rb regenerates automatically when mkkernel.rb is touched.
11
+
12
+ --------------------------------------------------------------------------- */
13
+
14
+ #include "carray.h"
15
+ #include "ca_kernel_iterator.h"
16
+ #include "ca_sort_kernels.h" /* sort kernels: internal, not via the carray.h umbrella */
17
+ #include "carray_internal.h" /* ca_lazy_arena_*, ca_is_lazy_view (streaming reduce) */
18
+ #include "ca_obj_face.h" /* rb_ca_strip_face_value (Face ordering gate) */
19
+ #include <math.h>
20
+ #include <stdint.h>
21
+ #include <stdlib.h> /* qsort, mergesort (HAVE_MERGESORT) -- for :sort kind */
22
+
23
+ /* MEMO_REDUCTION_FASTPATH_ENTITY_ONLY_GUARD Tier 2: CAStack identity is
24
+ probed by operation-table function pointer (obj_type is runtime-
25
+ assigned, so no CA_OBJ_STACK compile-time constant exists). */
26
+ extern ca_operation_function_t ca_stack_func;
27
+ /* BOOL2VAL: bool -> Ruby (Qtrue/Qfalse). Used as ruby_scalar wrapper
28
+ for the all/any flat-reduction Ruby surface so `a.all` / `a.any`
29
+ return real true/false, not Integer 0/1. (BOOL2OBJ already exists
30
+ but returns Integer per CArray's boolean-as-int convention.) */
31
+ #ifndef CARRAY_BOOL2VAL_DEFINED
32
+ #define CARRAY_BOOL2VAL_DEFINED
33
+ static inline VALUE BOOL2VAL (boolean8_t x) { return x ? Qtrue : Qfalse; }
34
+ #endif
35
+
36
+ #include "ca_op_powi.h"
37
+ #include "ca_op_cmplx64.h"
38
+
39
+ /* ===== triop fma ============================================ */
40
+
41
+ static void
42
+ ca_triop_fma_int8_t (ca_size_t n, boolean8_t *m,
43
+ char *ptr1, ca_size_t i1,
44
+ char *ptr2, ca_size_t i2,
45
+ char *ptr3, ca_size_t i3,
46
+ char *ptr4, ca_size_t i4)
47
+ {
48
+ int8_t *q1 = (int8_t *) ptr1, *q2 = (int8_t *) ptr2,
49
+ *q3 = (int8_t *) ptr3, *q4 = (int8_t *) ptr4;
50
+ int8_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
51
+ ca_size_t k;
52
+ if ( m ) {
53
+ boolean8_t *pm;
54
+ for (k=0; k<n; k++) {
55
+ pm = m + k;
56
+ if ( ! *pm ) {
57
+ p1 = q1 + k*i1;
58
+ p2 = q2 + k*i2;
59
+ p3 = q3 + k*i3;
60
+ p4 = q4 + k*i4;
61
+ { (*p4) = (*p1) * (*p2) + (*p3); }
62
+ }
63
+ }
64
+ } else {
65
+ for (k=0; k<n; k++) {
66
+ p1 = q1 + k*i1;
67
+ p2 = q2 + k*i2;
68
+ p3 = q3 + k*i3;
69
+ p4 = q4 + k*i4;
70
+ { (*p4) = (*p1) * (*p2) + (*p3); }
71
+ }
72
+ }
73
+ }
74
+
75
+ static void
76
+ ca_triop_fma_uint8_t (ca_size_t n, boolean8_t *m,
77
+ char *ptr1, ca_size_t i1,
78
+ char *ptr2, ca_size_t i2,
79
+ char *ptr3, ca_size_t i3,
80
+ char *ptr4, ca_size_t i4)
81
+ {
82
+ uint8_t *q1 = (uint8_t *) ptr1, *q2 = (uint8_t *) ptr2,
83
+ *q3 = (uint8_t *) ptr3, *q4 = (uint8_t *) ptr4;
84
+ uint8_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
85
+ ca_size_t k;
86
+ if ( m ) {
87
+ boolean8_t *pm;
88
+ for (k=0; k<n; k++) {
89
+ pm = m + k;
90
+ if ( ! *pm ) {
91
+ p1 = q1 + k*i1;
92
+ p2 = q2 + k*i2;
93
+ p3 = q3 + k*i3;
94
+ p4 = q4 + k*i4;
95
+ { (*p4) = (*p1) * (*p2) + (*p3); }
96
+ }
97
+ }
98
+ } else {
99
+ for (k=0; k<n; k++) {
100
+ p1 = q1 + k*i1;
101
+ p2 = q2 + k*i2;
102
+ p3 = q3 + k*i3;
103
+ p4 = q4 + k*i4;
104
+ { (*p4) = (*p1) * (*p2) + (*p3); }
105
+ }
106
+ }
107
+ }
108
+
109
+ static void
110
+ ca_triop_fma_int16_t (ca_size_t n, boolean8_t *m,
111
+ char *ptr1, ca_size_t i1,
112
+ char *ptr2, ca_size_t i2,
113
+ char *ptr3, ca_size_t i3,
114
+ char *ptr4, ca_size_t i4)
115
+ {
116
+ int16_t *q1 = (int16_t *) ptr1, *q2 = (int16_t *) ptr2,
117
+ *q3 = (int16_t *) ptr3, *q4 = (int16_t *) ptr4;
118
+ int16_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
119
+ ca_size_t k;
120
+ if ( m ) {
121
+ boolean8_t *pm;
122
+ for (k=0; k<n; k++) {
123
+ pm = m + k;
124
+ if ( ! *pm ) {
125
+ p1 = q1 + k*i1;
126
+ p2 = q2 + k*i2;
127
+ p3 = q3 + k*i3;
128
+ p4 = q4 + k*i4;
129
+ { (*p4) = (*p1) * (*p2) + (*p3); }
130
+ }
131
+ }
132
+ } else {
133
+ for (k=0; k<n; k++) {
134
+ p1 = q1 + k*i1;
135
+ p2 = q2 + k*i2;
136
+ p3 = q3 + k*i3;
137
+ p4 = q4 + k*i4;
138
+ { (*p4) = (*p1) * (*p2) + (*p3); }
139
+ }
140
+ }
141
+ }
142
+
143
+ static void
144
+ ca_triop_fma_uint16_t (ca_size_t n, boolean8_t *m,
145
+ char *ptr1, ca_size_t i1,
146
+ char *ptr2, ca_size_t i2,
147
+ char *ptr3, ca_size_t i3,
148
+ char *ptr4, ca_size_t i4)
149
+ {
150
+ uint16_t *q1 = (uint16_t *) ptr1, *q2 = (uint16_t *) ptr2,
151
+ *q3 = (uint16_t *) ptr3, *q4 = (uint16_t *) ptr4;
152
+ uint16_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
153
+ ca_size_t k;
154
+ if ( m ) {
155
+ boolean8_t *pm;
156
+ for (k=0; k<n; k++) {
157
+ pm = m + k;
158
+ if ( ! *pm ) {
159
+ p1 = q1 + k*i1;
160
+ p2 = q2 + k*i2;
161
+ p3 = q3 + k*i3;
162
+ p4 = q4 + k*i4;
163
+ { (*p4) = (*p1) * (*p2) + (*p3); }
164
+ }
165
+ }
166
+ } else {
167
+ for (k=0; k<n; k++) {
168
+ p1 = q1 + k*i1;
169
+ p2 = q2 + k*i2;
170
+ p3 = q3 + k*i3;
171
+ p4 = q4 + k*i4;
172
+ { (*p4) = (*p1) * (*p2) + (*p3); }
173
+ }
174
+ }
175
+ }
176
+
177
+ static void
178
+ ca_triop_fma_int32_t (ca_size_t n, boolean8_t *m,
179
+ char *ptr1, ca_size_t i1,
180
+ char *ptr2, ca_size_t i2,
181
+ char *ptr3, ca_size_t i3,
182
+ char *ptr4, ca_size_t i4)
183
+ {
184
+ int32_t *q1 = (int32_t *) ptr1, *q2 = (int32_t *) ptr2,
185
+ *q3 = (int32_t *) ptr3, *q4 = (int32_t *) ptr4;
186
+ int32_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
187
+ ca_size_t k;
188
+ if ( m ) {
189
+ boolean8_t *pm;
190
+ for (k=0; k<n; k++) {
191
+ pm = m + k;
192
+ if ( ! *pm ) {
193
+ p1 = q1 + k*i1;
194
+ p2 = q2 + k*i2;
195
+ p3 = q3 + k*i3;
196
+ p4 = q4 + k*i4;
197
+ { (*p4) = (*p1) * (*p2) + (*p3); }
198
+ }
199
+ }
200
+ } else {
201
+ for (k=0; k<n; k++) {
202
+ p1 = q1 + k*i1;
203
+ p2 = q2 + k*i2;
204
+ p3 = q3 + k*i3;
205
+ p4 = q4 + k*i4;
206
+ { (*p4) = (*p1) * (*p2) + (*p3); }
207
+ }
208
+ }
209
+ }
210
+
211
+ static void
212
+ ca_triop_fma_uint32_t (ca_size_t n, boolean8_t *m,
213
+ char *ptr1, ca_size_t i1,
214
+ char *ptr2, ca_size_t i2,
215
+ char *ptr3, ca_size_t i3,
216
+ char *ptr4, ca_size_t i4)
217
+ {
218
+ uint32_t *q1 = (uint32_t *) ptr1, *q2 = (uint32_t *) ptr2,
219
+ *q3 = (uint32_t *) ptr3, *q4 = (uint32_t *) ptr4;
220
+ uint32_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
221
+ ca_size_t k;
222
+ if ( m ) {
223
+ boolean8_t *pm;
224
+ for (k=0; k<n; k++) {
225
+ pm = m + k;
226
+ if ( ! *pm ) {
227
+ p1 = q1 + k*i1;
228
+ p2 = q2 + k*i2;
229
+ p3 = q3 + k*i3;
230
+ p4 = q4 + k*i4;
231
+ { (*p4) = (*p1) * (*p2) + (*p3); }
232
+ }
233
+ }
234
+ } else {
235
+ for (k=0; k<n; k++) {
236
+ p1 = q1 + k*i1;
237
+ p2 = q2 + k*i2;
238
+ p3 = q3 + k*i3;
239
+ p4 = q4 + k*i4;
240
+ { (*p4) = (*p1) * (*p2) + (*p3); }
241
+ }
242
+ }
243
+ }
244
+
245
+ static void
246
+ ca_triop_fma_int64_t (ca_size_t n, boolean8_t *m,
247
+ char *ptr1, ca_size_t i1,
248
+ char *ptr2, ca_size_t i2,
249
+ char *ptr3, ca_size_t i3,
250
+ char *ptr4, ca_size_t i4)
251
+ {
252
+ int64_t *q1 = (int64_t *) ptr1, *q2 = (int64_t *) ptr2,
253
+ *q3 = (int64_t *) ptr3, *q4 = (int64_t *) ptr4;
254
+ int64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
255
+ ca_size_t k;
256
+ if ( m ) {
257
+ boolean8_t *pm;
258
+ for (k=0; k<n; k++) {
259
+ pm = m + k;
260
+ if ( ! *pm ) {
261
+ p1 = q1 + k*i1;
262
+ p2 = q2 + k*i2;
263
+ p3 = q3 + k*i3;
264
+ p4 = q4 + k*i4;
265
+ { (*p4) = (*p1) * (*p2) + (*p3); }
266
+ }
267
+ }
268
+ } else {
269
+ for (k=0; k<n; k++) {
270
+ p1 = q1 + k*i1;
271
+ p2 = q2 + k*i2;
272
+ p3 = q3 + k*i3;
273
+ p4 = q4 + k*i4;
274
+ { (*p4) = (*p1) * (*p2) + (*p3); }
275
+ }
276
+ }
277
+ }
278
+
279
+ static void
280
+ ca_triop_fma_uint64_t (ca_size_t n, boolean8_t *m,
281
+ char *ptr1, ca_size_t i1,
282
+ char *ptr2, ca_size_t i2,
283
+ char *ptr3, ca_size_t i3,
284
+ char *ptr4, ca_size_t i4)
285
+ {
286
+ uint64_t *q1 = (uint64_t *) ptr1, *q2 = (uint64_t *) ptr2,
287
+ *q3 = (uint64_t *) ptr3, *q4 = (uint64_t *) ptr4;
288
+ uint64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
289
+ ca_size_t k;
290
+ if ( m ) {
291
+ boolean8_t *pm;
292
+ for (k=0; k<n; k++) {
293
+ pm = m + k;
294
+ if ( ! *pm ) {
295
+ p1 = q1 + k*i1;
296
+ p2 = q2 + k*i2;
297
+ p3 = q3 + k*i3;
298
+ p4 = q4 + k*i4;
299
+ { (*p4) = (*p1) * (*p2) + (*p3); }
300
+ }
301
+ }
302
+ } else {
303
+ for (k=0; k<n; k++) {
304
+ p1 = q1 + k*i1;
305
+ p2 = q2 + k*i2;
306
+ p3 = q3 + k*i3;
307
+ p4 = q4 + k*i4;
308
+ { (*p4) = (*p1) * (*p2) + (*p3); }
309
+ }
310
+ }
311
+ }
312
+
313
+ static void
314
+ ca_triop_fma_float32_t (ca_size_t n, boolean8_t *m,
315
+ char *ptr1, ca_size_t i1,
316
+ char *ptr2, ca_size_t i2,
317
+ char *ptr3, ca_size_t i3,
318
+ char *ptr4, ca_size_t i4)
319
+ {
320
+ float *q1 = (float *) ptr1, *q2 = (float *) ptr2,
321
+ *q3 = (float *) ptr3, *q4 = (float *) ptr4;
322
+ float *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
323
+ ca_size_t k;
324
+ if ( m ) {
325
+ boolean8_t *pm;
326
+ for (k=0; k<n; k++) {
327
+ pm = m + k;
328
+ if ( ! *pm ) {
329
+ p1 = q1 + k*i1;
330
+ p2 = q2 + k*i2;
331
+ p3 = q3 + k*i3;
332
+ p4 = q4 + k*i4;
333
+ { (*p4) = fma((*p1), (*p2), (*p3)); }
334
+ }
335
+ }
336
+ } else {
337
+ for (k=0; k<n; k++) {
338
+ p1 = q1 + k*i1;
339
+ p2 = q2 + k*i2;
340
+ p3 = q3 + k*i3;
341
+ p4 = q4 + k*i4;
342
+ { (*p4) = fma((*p1), (*p2), (*p3)); }
343
+ }
344
+ }
345
+ }
346
+
347
+ static void
348
+ ca_triop_fma_float64_t (ca_size_t n, boolean8_t *m,
349
+ char *ptr1, ca_size_t i1,
350
+ char *ptr2, ca_size_t i2,
351
+ char *ptr3, ca_size_t i3,
352
+ char *ptr4, ca_size_t i4)
353
+ {
354
+ double *q1 = (double *) ptr1, *q2 = (double *) ptr2,
355
+ *q3 = (double *) ptr3, *q4 = (double *) ptr4;
356
+ double *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
357
+ ca_size_t k;
358
+ if ( m ) {
359
+ boolean8_t *pm;
360
+ for (k=0; k<n; k++) {
361
+ pm = m + k;
362
+ if ( ! *pm ) {
363
+ p1 = q1 + k*i1;
364
+ p2 = q2 + k*i2;
365
+ p3 = q3 + k*i3;
366
+ p4 = q4 + k*i4;
367
+ { (*p4) = fma((*p1), (*p2), (*p3)); }
368
+ }
369
+ }
370
+ } else {
371
+ for (k=0; k<n; k++) {
372
+ p1 = q1 + k*i1;
373
+ p2 = q2 + k*i2;
374
+ p3 = q3 + k*i3;
375
+ p4 = q4 + k*i4;
376
+ { (*p4) = fma((*p1), (*p2), (*p3)); }
377
+ }
378
+ }
379
+ }
380
+
381
+ static void
382
+ ca_triop_fma_cmplx64_t (ca_size_t n, boolean8_t *m,
383
+ char *ptr1, ca_size_t i1,
384
+ char *ptr2, ca_size_t i2,
385
+ char *ptr3, ca_size_t i3,
386
+ char *ptr4, ca_size_t i4)
387
+ {
388
+ cmplx64_t *q1 = (cmplx64_t *) ptr1, *q2 = (cmplx64_t *) ptr2,
389
+ *q3 = (cmplx64_t *) ptr3, *q4 = (cmplx64_t *) ptr4;
390
+ cmplx64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
391
+ ca_size_t k;
392
+ if ( m ) {
393
+ boolean8_t *pm;
394
+ for (k=0; k<n; k++) {
395
+ pm = m + k;
396
+ if ( ! *pm ) {
397
+ p1 = q1 + k*i1;
398
+ p2 = q2 + k*i2;
399
+ p3 = q3 + k*i3;
400
+ p4 = q4 + k*i4;
401
+ { (*p4) = (*p1) * (*p2) + (*p3); }
402
+ }
403
+ }
404
+ } else {
405
+ for (k=0; k<n; k++) {
406
+ p1 = q1 + k*i1;
407
+ p2 = q2 + k*i2;
408
+ p3 = q3 + k*i3;
409
+ p4 = q4 + k*i4;
410
+ { (*p4) = (*p1) * (*p2) + (*p3); }
411
+ }
412
+ }
413
+ }
414
+
415
+ static void
416
+ ca_triop_fma_cmplx128_t (ca_size_t n, boolean8_t *m,
417
+ char *ptr1, ca_size_t i1,
418
+ char *ptr2, ca_size_t i2,
419
+ char *ptr3, ca_size_t i3,
420
+ char *ptr4, ca_size_t i4)
421
+ {
422
+ cmplx128_t *q1 = (cmplx128_t *) ptr1, *q2 = (cmplx128_t *) ptr2,
423
+ *q3 = (cmplx128_t *) ptr3, *q4 = (cmplx128_t *) ptr4;
424
+ cmplx128_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
425
+ ca_size_t k;
426
+ if ( m ) {
427
+ boolean8_t *pm;
428
+ for (k=0; k<n; k++) {
429
+ pm = m + k;
430
+ if ( ! *pm ) {
431
+ p1 = q1 + k*i1;
432
+ p2 = q2 + k*i2;
433
+ p3 = q3 + k*i3;
434
+ p4 = q4 + k*i4;
435
+ { (*p4) = (*p1) * (*p2) + (*p3); }
436
+ }
437
+ }
438
+ } else {
439
+ for (k=0; k<n; k++) {
440
+ p1 = q1 + k*i1;
441
+ p2 = q2 + k*i2;
442
+ p3 = q3 + k*i3;
443
+ p4 = q4 + k*i4;
444
+ { (*p4) = (*p1) * (*p2) + (*p3); }
445
+ }
446
+ }
447
+ }
448
+
449
+ static void
450
+ ca_triop_fma_VALUE (ca_size_t n, boolean8_t *m,
451
+ char *ptr1, ca_size_t i1,
452
+ char *ptr2, ca_size_t i2,
453
+ char *ptr3, ca_size_t i3,
454
+ char *ptr4, ca_size_t i4)
455
+ {
456
+ VALUE *q1 = (VALUE *) ptr1, *q2 = (VALUE *) ptr2,
457
+ *q3 = (VALUE *) ptr3, *q4 = (VALUE *) ptr4;
458
+ VALUE *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
459
+ ca_size_t k;
460
+ if ( m ) {
461
+ boolean8_t *pm;
462
+ for (k=0; k<n; k++) {
463
+ pm = m + k;
464
+ if ( ! *pm ) {
465
+ p1 = q1 + k*i1;
466
+ p2 = q2 + k*i2;
467
+ p3 = q3 + k*i3;
468
+ p4 = q4 + k*i4;
469
+ { (*p4) = rb_funcall(rb_funcall((*p1), rb_intern("*"), 1, (*p2)), rb_intern("+"), 1, (*p3)); }
470
+ }
471
+ }
472
+ } else {
473
+ for (k=0; k<n; k++) {
474
+ p1 = q1 + k*i1;
475
+ p2 = q2 + k*i2;
476
+ p3 = q3 + k*i3;
477
+ p4 = q4 + k*i4;
478
+ { (*p4) = rb_funcall(rb_funcall((*p1), rb_intern("*"), 1, (*p2)), rb_intern("+"), 1, (*p3)); }
479
+ }
480
+ }
481
+ }
482
+
483
+ ca_triop_func_t
484
+ ca_triop_fma[CA_NTYPE] = {
485
+ ca_triop_not_implement,
486
+ ca_triop_not_implement,
487
+ ca_triop_fma_int8_t,
488
+ ca_triop_fma_uint8_t,
489
+ ca_triop_fma_int16_t,
490
+ ca_triop_fma_uint16_t,
491
+ ca_triop_fma_int32_t,
492
+ ca_triop_fma_uint32_t,
493
+ ca_triop_fma_int64_t,
494
+ ca_triop_fma_uint64_t,
495
+ ca_triop_fma_float32_t,
496
+ ca_triop_fma_float64_t,
497
+ ca_triop_not_implement,
498
+ ca_triop_fma_cmplx64_t,
499
+ ca_triop_fma_cmplx128_t,
500
+ ca_triop_not_implement,
501
+ ca_triop_fma_VALUE,
502
+ };
503
+
504
+ VALUE rb_ca_fma (VALUE self, VALUE other2, VALUE other3)
505
+ { return rb_ca_call_triop(self, other2, other3, ca_triop_fma); }
506
+
507
+ VALUE rb_ca_fma_bang (VALUE self, VALUE other2, VALUE other3)
508
+ { return rb_ca_call_triop_bang(self, other2, other3, ca_triop_fma); }
509
+
510
+ /* ===== triop fms ============================================ */
511
+
512
+ static void
513
+ ca_triop_fms_int8_t (ca_size_t n, boolean8_t *m,
514
+ char *ptr1, ca_size_t i1,
515
+ char *ptr2, ca_size_t i2,
516
+ char *ptr3, ca_size_t i3,
517
+ char *ptr4, ca_size_t i4)
518
+ {
519
+ int8_t *q1 = (int8_t *) ptr1, *q2 = (int8_t *) ptr2,
520
+ *q3 = (int8_t *) ptr3, *q4 = (int8_t *) ptr4;
521
+ int8_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
522
+ ca_size_t k;
523
+ if ( m ) {
524
+ boolean8_t *pm;
525
+ for (k=0; k<n; k++) {
526
+ pm = m + k;
527
+ if ( ! *pm ) {
528
+ p1 = q1 + k*i1;
529
+ p2 = q2 + k*i2;
530
+ p3 = q3 + k*i3;
531
+ p4 = q4 + k*i4;
532
+ { (*p4) = (*p1) * (*p2) - (*p3); }
533
+ }
534
+ }
535
+ } else {
536
+ for (k=0; k<n; k++) {
537
+ p1 = q1 + k*i1;
538
+ p2 = q2 + k*i2;
539
+ p3 = q3 + k*i3;
540
+ p4 = q4 + k*i4;
541
+ { (*p4) = (*p1) * (*p2) - (*p3); }
542
+ }
543
+ }
544
+ }
545
+
546
+ static void
547
+ ca_triop_fms_uint8_t (ca_size_t n, boolean8_t *m,
548
+ char *ptr1, ca_size_t i1,
549
+ char *ptr2, ca_size_t i2,
550
+ char *ptr3, ca_size_t i3,
551
+ char *ptr4, ca_size_t i4)
552
+ {
553
+ uint8_t *q1 = (uint8_t *) ptr1, *q2 = (uint8_t *) ptr2,
554
+ *q3 = (uint8_t *) ptr3, *q4 = (uint8_t *) ptr4;
555
+ uint8_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
556
+ ca_size_t k;
557
+ if ( m ) {
558
+ boolean8_t *pm;
559
+ for (k=0; k<n; k++) {
560
+ pm = m + k;
561
+ if ( ! *pm ) {
562
+ p1 = q1 + k*i1;
563
+ p2 = q2 + k*i2;
564
+ p3 = q3 + k*i3;
565
+ p4 = q4 + k*i4;
566
+ { (*p4) = (*p1) * (*p2) - (*p3); }
567
+ }
568
+ }
569
+ } else {
570
+ for (k=0; k<n; k++) {
571
+ p1 = q1 + k*i1;
572
+ p2 = q2 + k*i2;
573
+ p3 = q3 + k*i3;
574
+ p4 = q4 + k*i4;
575
+ { (*p4) = (*p1) * (*p2) - (*p3); }
576
+ }
577
+ }
578
+ }
579
+
580
+ static void
581
+ ca_triop_fms_int16_t (ca_size_t n, boolean8_t *m,
582
+ char *ptr1, ca_size_t i1,
583
+ char *ptr2, ca_size_t i2,
584
+ char *ptr3, ca_size_t i3,
585
+ char *ptr4, ca_size_t i4)
586
+ {
587
+ int16_t *q1 = (int16_t *) ptr1, *q2 = (int16_t *) ptr2,
588
+ *q3 = (int16_t *) ptr3, *q4 = (int16_t *) ptr4;
589
+ int16_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
590
+ ca_size_t k;
591
+ if ( m ) {
592
+ boolean8_t *pm;
593
+ for (k=0; k<n; k++) {
594
+ pm = m + k;
595
+ if ( ! *pm ) {
596
+ p1 = q1 + k*i1;
597
+ p2 = q2 + k*i2;
598
+ p3 = q3 + k*i3;
599
+ p4 = q4 + k*i4;
600
+ { (*p4) = (*p1) * (*p2) - (*p3); }
601
+ }
602
+ }
603
+ } else {
604
+ for (k=0; k<n; k++) {
605
+ p1 = q1 + k*i1;
606
+ p2 = q2 + k*i2;
607
+ p3 = q3 + k*i3;
608
+ p4 = q4 + k*i4;
609
+ { (*p4) = (*p1) * (*p2) - (*p3); }
610
+ }
611
+ }
612
+ }
613
+
614
+ static void
615
+ ca_triop_fms_uint16_t (ca_size_t n, boolean8_t *m,
616
+ char *ptr1, ca_size_t i1,
617
+ char *ptr2, ca_size_t i2,
618
+ char *ptr3, ca_size_t i3,
619
+ char *ptr4, ca_size_t i4)
620
+ {
621
+ uint16_t *q1 = (uint16_t *) ptr1, *q2 = (uint16_t *) ptr2,
622
+ *q3 = (uint16_t *) ptr3, *q4 = (uint16_t *) ptr4;
623
+ uint16_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
624
+ ca_size_t k;
625
+ if ( m ) {
626
+ boolean8_t *pm;
627
+ for (k=0; k<n; k++) {
628
+ pm = m + k;
629
+ if ( ! *pm ) {
630
+ p1 = q1 + k*i1;
631
+ p2 = q2 + k*i2;
632
+ p3 = q3 + k*i3;
633
+ p4 = q4 + k*i4;
634
+ { (*p4) = (*p1) * (*p2) - (*p3); }
635
+ }
636
+ }
637
+ } else {
638
+ for (k=0; k<n; k++) {
639
+ p1 = q1 + k*i1;
640
+ p2 = q2 + k*i2;
641
+ p3 = q3 + k*i3;
642
+ p4 = q4 + k*i4;
643
+ { (*p4) = (*p1) * (*p2) - (*p3); }
644
+ }
645
+ }
646
+ }
647
+
648
+ static void
649
+ ca_triop_fms_int32_t (ca_size_t n, boolean8_t *m,
650
+ char *ptr1, ca_size_t i1,
651
+ char *ptr2, ca_size_t i2,
652
+ char *ptr3, ca_size_t i3,
653
+ char *ptr4, ca_size_t i4)
654
+ {
655
+ int32_t *q1 = (int32_t *) ptr1, *q2 = (int32_t *) ptr2,
656
+ *q3 = (int32_t *) ptr3, *q4 = (int32_t *) ptr4;
657
+ int32_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
658
+ ca_size_t k;
659
+ if ( m ) {
660
+ boolean8_t *pm;
661
+ for (k=0; k<n; k++) {
662
+ pm = m + k;
663
+ if ( ! *pm ) {
664
+ p1 = q1 + k*i1;
665
+ p2 = q2 + k*i2;
666
+ p3 = q3 + k*i3;
667
+ p4 = q4 + k*i4;
668
+ { (*p4) = (*p1) * (*p2) - (*p3); }
669
+ }
670
+ }
671
+ } else {
672
+ for (k=0; k<n; k++) {
673
+ p1 = q1 + k*i1;
674
+ p2 = q2 + k*i2;
675
+ p3 = q3 + k*i3;
676
+ p4 = q4 + k*i4;
677
+ { (*p4) = (*p1) * (*p2) - (*p3); }
678
+ }
679
+ }
680
+ }
681
+
682
+ static void
683
+ ca_triop_fms_uint32_t (ca_size_t n, boolean8_t *m,
684
+ char *ptr1, ca_size_t i1,
685
+ char *ptr2, ca_size_t i2,
686
+ char *ptr3, ca_size_t i3,
687
+ char *ptr4, ca_size_t i4)
688
+ {
689
+ uint32_t *q1 = (uint32_t *) ptr1, *q2 = (uint32_t *) ptr2,
690
+ *q3 = (uint32_t *) ptr3, *q4 = (uint32_t *) ptr4;
691
+ uint32_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
692
+ ca_size_t k;
693
+ if ( m ) {
694
+ boolean8_t *pm;
695
+ for (k=0; k<n; k++) {
696
+ pm = m + k;
697
+ if ( ! *pm ) {
698
+ p1 = q1 + k*i1;
699
+ p2 = q2 + k*i2;
700
+ p3 = q3 + k*i3;
701
+ p4 = q4 + k*i4;
702
+ { (*p4) = (*p1) * (*p2) - (*p3); }
703
+ }
704
+ }
705
+ } else {
706
+ for (k=0; k<n; k++) {
707
+ p1 = q1 + k*i1;
708
+ p2 = q2 + k*i2;
709
+ p3 = q3 + k*i3;
710
+ p4 = q4 + k*i4;
711
+ { (*p4) = (*p1) * (*p2) - (*p3); }
712
+ }
713
+ }
714
+ }
715
+
716
+ static void
717
+ ca_triop_fms_int64_t (ca_size_t n, boolean8_t *m,
718
+ char *ptr1, ca_size_t i1,
719
+ char *ptr2, ca_size_t i2,
720
+ char *ptr3, ca_size_t i3,
721
+ char *ptr4, ca_size_t i4)
722
+ {
723
+ int64_t *q1 = (int64_t *) ptr1, *q2 = (int64_t *) ptr2,
724
+ *q3 = (int64_t *) ptr3, *q4 = (int64_t *) ptr4;
725
+ int64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
726
+ ca_size_t k;
727
+ if ( m ) {
728
+ boolean8_t *pm;
729
+ for (k=0; k<n; k++) {
730
+ pm = m + k;
731
+ if ( ! *pm ) {
732
+ p1 = q1 + k*i1;
733
+ p2 = q2 + k*i2;
734
+ p3 = q3 + k*i3;
735
+ p4 = q4 + k*i4;
736
+ { (*p4) = (*p1) * (*p2) - (*p3); }
737
+ }
738
+ }
739
+ } else {
740
+ for (k=0; k<n; k++) {
741
+ p1 = q1 + k*i1;
742
+ p2 = q2 + k*i2;
743
+ p3 = q3 + k*i3;
744
+ p4 = q4 + k*i4;
745
+ { (*p4) = (*p1) * (*p2) - (*p3); }
746
+ }
747
+ }
748
+ }
749
+
750
+ static void
751
+ ca_triop_fms_uint64_t (ca_size_t n, boolean8_t *m,
752
+ char *ptr1, ca_size_t i1,
753
+ char *ptr2, ca_size_t i2,
754
+ char *ptr3, ca_size_t i3,
755
+ char *ptr4, ca_size_t i4)
756
+ {
757
+ uint64_t *q1 = (uint64_t *) ptr1, *q2 = (uint64_t *) ptr2,
758
+ *q3 = (uint64_t *) ptr3, *q4 = (uint64_t *) ptr4;
759
+ uint64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
760
+ ca_size_t k;
761
+ if ( m ) {
762
+ boolean8_t *pm;
763
+ for (k=0; k<n; k++) {
764
+ pm = m + k;
765
+ if ( ! *pm ) {
766
+ p1 = q1 + k*i1;
767
+ p2 = q2 + k*i2;
768
+ p3 = q3 + k*i3;
769
+ p4 = q4 + k*i4;
770
+ { (*p4) = (*p1) * (*p2) - (*p3); }
771
+ }
772
+ }
773
+ } else {
774
+ for (k=0; k<n; k++) {
775
+ p1 = q1 + k*i1;
776
+ p2 = q2 + k*i2;
777
+ p3 = q3 + k*i3;
778
+ p4 = q4 + k*i4;
779
+ { (*p4) = (*p1) * (*p2) - (*p3); }
780
+ }
781
+ }
782
+ }
783
+
784
+ static void
785
+ ca_triop_fms_float32_t (ca_size_t n, boolean8_t *m,
786
+ char *ptr1, ca_size_t i1,
787
+ char *ptr2, ca_size_t i2,
788
+ char *ptr3, ca_size_t i3,
789
+ char *ptr4, ca_size_t i4)
790
+ {
791
+ float *q1 = (float *) ptr1, *q2 = (float *) ptr2,
792
+ *q3 = (float *) ptr3, *q4 = (float *) ptr4;
793
+ float *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
794
+ ca_size_t k;
795
+ if ( m ) {
796
+ boolean8_t *pm;
797
+ for (k=0; k<n; k++) {
798
+ pm = m + k;
799
+ if ( ! *pm ) {
800
+ p1 = q1 + k*i1;
801
+ p2 = q2 + k*i2;
802
+ p3 = q3 + k*i3;
803
+ p4 = q4 + k*i4;
804
+ { (*p4) = fma((*p1), (*p2), -(*p3)); }
805
+ }
806
+ }
807
+ } else {
808
+ for (k=0; k<n; k++) {
809
+ p1 = q1 + k*i1;
810
+ p2 = q2 + k*i2;
811
+ p3 = q3 + k*i3;
812
+ p4 = q4 + k*i4;
813
+ { (*p4) = fma((*p1), (*p2), -(*p3)); }
814
+ }
815
+ }
816
+ }
817
+
818
+ static void
819
+ ca_triop_fms_float64_t (ca_size_t n, boolean8_t *m,
820
+ char *ptr1, ca_size_t i1,
821
+ char *ptr2, ca_size_t i2,
822
+ char *ptr3, ca_size_t i3,
823
+ char *ptr4, ca_size_t i4)
824
+ {
825
+ double *q1 = (double *) ptr1, *q2 = (double *) ptr2,
826
+ *q3 = (double *) ptr3, *q4 = (double *) ptr4;
827
+ double *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
828
+ ca_size_t k;
829
+ if ( m ) {
830
+ boolean8_t *pm;
831
+ for (k=0; k<n; k++) {
832
+ pm = m + k;
833
+ if ( ! *pm ) {
834
+ p1 = q1 + k*i1;
835
+ p2 = q2 + k*i2;
836
+ p3 = q3 + k*i3;
837
+ p4 = q4 + k*i4;
838
+ { (*p4) = fma((*p1), (*p2), -(*p3)); }
839
+ }
840
+ }
841
+ } else {
842
+ for (k=0; k<n; k++) {
843
+ p1 = q1 + k*i1;
844
+ p2 = q2 + k*i2;
845
+ p3 = q3 + k*i3;
846
+ p4 = q4 + k*i4;
847
+ { (*p4) = fma((*p1), (*p2), -(*p3)); }
848
+ }
849
+ }
850
+ }
851
+
852
+ static void
853
+ ca_triop_fms_cmplx64_t (ca_size_t n, boolean8_t *m,
854
+ char *ptr1, ca_size_t i1,
855
+ char *ptr2, ca_size_t i2,
856
+ char *ptr3, ca_size_t i3,
857
+ char *ptr4, ca_size_t i4)
858
+ {
859
+ cmplx64_t *q1 = (cmplx64_t *) ptr1, *q2 = (cmplx64_t *) ptr2,
860
+ *q3 = (cmplx64_t *) ptr3, *q4 = (cmplx64_t *) ptr4;
861
+ cmplx64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
862
+ ca_size_t k;
863
+ if ( m ) {
864
+ boolean8_t *pm;
865
+ for (k=0; k<n; k++) {
866
+ pm = m + k;
867
+ if ( ! *pm ) {
868
+ p1 = q1 + k*i1;
869
+ p2 = q2 + k*i2;
870
+ p3 = q3 + k*i3;
871
+ p4 = q4 + k*i4;
872
+ { (*p4) = (*p1) * (*p2) - (*p3); }
873
+ }
874
+ }
875
+ } else {
876
+ for (k=0; k<n; k++) {
877
+ p1 = q1 + k*i1;
878
+ p2 = q2 + k*i2;
879
+ p3 = q3 + k*i3;
880
+ p4 = q4 + k*i4;
881
+ { (*p4) = (*p1) * (*p2) - (*p3); }
882
+ }
883
+ }
884
+ }
885
+
886
+ static void
887
+ ca_triop_fms_cmplx128_t (ca_size_t n, boolean8_t *m,
888
+ char *ptr1, ca_size_t i1,
889
+ char *ptr2, ca_size_t i2,
890
+ char *ptr3, ca_size_t i3,
891
+ char *ptr4, ca_size_t i4)
892
+ {
893
+ cmplx128_t *q1 = (cmplx128_t *) ptr1, *q2 = (cmplx128_t *) ptr2,
894
+ *q3 = (cmplx128_t *) ptr3, *q4 = (cmplx128_t *) ptr4;
895
+ cmplx128_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
896
+ ca_size_t k;
897
+ if ( m ) {
898
+ boolean8_t *pm;
899
+ for (k=0; k<n; k++) {
900
+ pm = m + k;
901
+ if ( ! *pm ) {
902
+ p1 = q1 + k*i1;
903
+ p2 = q2 + k*i2;
904
+ p3 = q3 + k*i3;
905
+ p4 = q4 + k*i4;
906
+ { (*p4) = (*p1) * (*p2) - (*p3); }
907
+ }
908
+ }
909
+ } else {
910
+ for (k=0; k<n; k++) {
911
+ p1 = q1 + k*i1;
912
+ p2 = q2 + k*i2;
913
+ p3 = q3 + k*i3;
914
+ p4 = q4 + k*i4;
915
+ { (*p4) = (*p1) * (*p2) - (*p3); }
916
+ }
917
+ }
918
+ }
919
+
920
+ static void
921
+ ca_triop_fms_VALUE (ca_size_t n, boolean8_t *m,
922
+ char *ptr1, ca_size_t i1,
923
+ char *ptr2, ca_size_t i2,
924
+ char *ptr3, ca_size_t i3,
925
+ char *ptr4, ca_size_t i4)
926
+ {
927
+ VALUE *q1 = (VALUE *) ptr1, *q2 = (VALUE *) ptr2,
928
+ *q3 = (VALUE *) ptr3, *q4 = (VALUE *) ptr4;
929
+ VALUE *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
930
+ ca_size_t k;
931
+ if ( m ) {
932
+ boolean8_t *pm;
933
+ for (k=0; k<n; k++) {
934
+ pm = m + k;
935
+ if ( ! *pm ) {
936
+ p1 = q1 + k*i1;
937
+ p2 = q2 + k*i2;
938
+ p3 = q3 + k*i3;
939
+ p4 = q4 + k*i4;
940
+ { (*p4) = rb_funcall(rb_funcall((*p1), rb_intern("*"), 1, (*p2)), rb_intern("-"), 1, (*p3)); }
941
+ }
942
+ }
943
+ } else {
944
+ for (k=0; k<n; k++) {
945
+ p1 = q1 + k*i1;
946
+ p2 = q2 + k*i2;
947
+ p3 = q3 + k*i3;
948
+ p4 = q4 + k*i4;
949
+ { (*p4) = rb_funcall(rb_funcall((*p1), rb_intern("*"), 1, (*p2)), rb_intern("-"), 1, (*p3)); }
950
+ }
951
+ }
952
+ }
953
+
954
+ ca_triop_func_t
955
+ ca_triop_fms[CA_NTYPE] = {
956
+ ca_triop_not_implement,
957
+ ca_triop_not_implement,
958
+ ca_triop_fms_int8_t,
959
+ ca_triop_fms_uint8_t,
960
+ ca_triop_fms_int16_t,
961
+ ca_triop_fms_uint16_t,
962
+ ca_triop_fms_int32_t,
963
+ ca_triop_fms_uint32_t,
964
+ ca_triop_fms_int64_t,
965
+ ca_triop_fms_uint64_t,
966
+ ca_triop_fms_float32_t,
967
+ ca_triop_fms_float64_t,
968
+ ca_triop_not_implement,
969
+ ca_triop_fms_cmplx64_t,
970
+ ca_triop_fms_cmplx128_t,
971
+ ca_triop_not_implement,
972
+ ca_triop_fms_VALUE,
973
+ };
974
+
975
+ VALUE rb_ca_fms (VALUE self, VALUE other2, VALUE other3)
976
+ { return rb_ca_call_triop(self, other2, other3, ca_triop_fms); }
977
+
978
+ VALUE rb_ca_fms_bang (VALUE self, VALUE other2, VALUE other3)
979
+ { return rb_ca_call_triop_bang(self, other2, other3, ca_triop_fms); }
980
+
981
+ /* ===== triop clip ============================================ */
982
+
983
+ static void
984
+ ca_triop_clip_int8_t (ca_size_t n, boolean8_t *m,
985
+ char *ptr1, ca_size_t i1,
986
+ char *ptr2, ca_size_t i2,
987
+ char *ptr3, ca_size_t i3,
988
+ char *ptr4, ca_size_t i4)
989
+ {
990
+ int8_t *q1 = (int8_t *) ptr1, *q2 = (int8_t *) ptr2,
991
+ *q3 = (int8_t *) ptr3, *q4 = (int8_t *) ptr4;
992
+ int8_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
993
+ ca_size_t k;
994
+ if ( m ) {
995
+ boolean8_t *pm;
996
+ for (k=0; k<n; k++) {
997
+ pm = m + k;
998
+ if ( ! *pm ) {
999
+ p1 = q1 + k*i1;
1000
+ p2 = q2 + k*i2;
1001
+ p3 = q3 + k*i3;
1002
+ p4 = q4 + k*i4;
1003
+ { (*p4) = ((*p1) < (*p2)) ? (*p2) : (((*p1) > (*p3)) ? (*p3) : (*p1)); }
1004
+ }
1005
+ }
1006
+ } else {
1007
+ for (k=0; k<n; k++) {
1008
+ p1 = q1 + k*i1;
1009
+ p2 = q2 + k*i2;
1010
+ p3 = q3 + k*i3;
1011
+ p4 = q4 + k*i4;
1012
+ { (*p4) = ((*p1) < (*p2)) ? (*p2) : (((*p1) > (*p3)) ? (*p3) : (*p1)); }
1013
+ }
1014
+ }
1015
+ }
1016
+
1017
+ static void
1018
+ ca_triop_clip_uint8_t (ca_size_t n, boolean8_t *m,
1019
+ char *ptr1, ca_size_t i1,
1020
+ char *ptr2, ca_size_t i2,
1021
+ char *ptr3, ca_size_t i3,
1022
+ char *ptr4, ca_size_t i4)
1023
+ {
1024
+ uint8_t *q1 = (uint8_t *) ptr1, *q2 = (uint8_t *) ptr2,
1025
+ *q3 = (uint8_t *) ptr3, *q4 = (uint8_t *) ptr4;
1026
+ uint8_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1027
+ ca_size_t k;
1028
+ if ( m ) {
1029
+ boolean8_t *pm;
1030
+ for (k=0; k<n; k++) {
1031
+ pm = m + k;
1032
+ if ( ! *pm ) {
1033
+ p1 = q1 + k*i1;
1034
+ p2 = q2 + k*i2;
1035
+ p3 = q3 + k*i3;
1036
+ p4 = q4 + k*i4;
1037
+ { (*p4) = ((*p1) < (*p2)) ? (*p2) : (((*p1) > (*p3)) ? (*p3) : (*p1)); }
1038
+ }
1039
+ }
1040
+ } else {
1041
+ for (k=0; k<n; k++) {
1042
+ p1 = q1 + k*i1;
1043
+ p2 = q2 + k*i2;
1044
+ p3 = q3 + k*i3;
1045
+ p4 = q4 + k*i4;
1046
+ { (*p4) = ((*p1) < (*p2)) ? (*p2) : (((*p1) > (*p3)) ? (*p3) : (*p1)); }
1047
+ }
1048
+ }
1049
+ }
1050
+
1051
+ static void
1052
+ ca_triop_clip_int16_t (ca_size_t n, boolean8_t *m,
1053
+ char *ptr1, ca_size_t i1,
1054
+ char *ptr2, ca_size_t i2,
1055
+ char *ptr3, ca_size_t i3,
1056
+ char *ptr4, ca_size_t i4)
1057
+ {
1058
+ int16_t *q1 = (int16_t *) ptr1, *q2 = (int16_t *) ptr2,
1059
+ *q3 = (int16_t *) ptr3, *q4 = (int16_t *) ptr4;
1060
+ int16_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1061
+ ca_size_t k;
1062
+ if ( m ) {
1063
+ boolean8_t *pm;
1064
+ for (k=0; k<n; k++) {
1065
+ pm = m + k;
1066
+ if ( ! *pm ) {
1067
+ p1 = q1 + k*i1;
1068
+ p2 = q2 + k*i2;
1069
+ p3 = q3 + k*i3;
1070
+ p4 = q4 + k*i4;
1071
+ { (*p4) = ((*p1) < (*p2)) ? (*p2) : (((*p1) > (*p3)) ? (*p3) : (*p1)); }
1072
+ }
1073
+ }
1074
+ } else {
1075
+ for (k=0; k<n; k++) {
1076
+ p1 = q1 + k*i1;
1077
+ p2 = q2 + k*i2;
1078
+ p3 = q3 + k*i3;
1079
+ p4 = q4 + k*i4;
1080
+ { (*p4) = ((*p1) < (*p2)) ? (*p2) : (((*p1) > (*p3)) ? (*p3) : (*p1)); }
1081
+ }
1082
+ }
1083
+ }
1084
+
1085
+ static void
1086
+ ca_triop_clip_uint16_t (ca_size_t n, boolean8_t *m,
1087
+ char *ptr1, ca_size_t i1,
1088
+ char *ptr2, ca_size_t i2,
1089
+ char *ptr3, ca_size_t i3,
1090
+ char *ptr4, ca_size_t i4)
1091
+ {
1092
+ uint16_t *q1 = (uint16_t *) ptr1, *q2 = (uint16_t *) ptr2,
1093
+ *q3 = (uint16_t *) ptr3, *q4 = (uint16_t *) ptr4;
1094
+ uint16_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1095
+ ca_size_t k;
1096
+ if ( m ) {
1097
+ boolean8_t *pm;
1098
+ for (k=0; k<n; k++) {
1099
+ pm = m + k;
1100
+ if ( ! *pm ) {
1101
+ p1 = q1 + k*i1;
1102
+ p2 = q2 + k*i2;
1103
+ p3 = q3 + k*i3;
1104
+ p4 = q4 + k*i4;
1105
+ { (*p4) = ((*p1) < (*p2)) ? (*p2) : (((*p1) > (*p3)) ? (*p3) : (*p1)); }
1106
+ }
1107
+ }
1108
+ } else {
1109
+ for (k=0; k<n; k++) {
1110
+ p1 = q1 + k*i1;
1111
+ p2 = q2 + k*i2;
1112
+ p3 = q3 + k*i3;
1113
+ p4 = q4 + k*i4;
1114
+ { (*p4) = ((*p1) < (*p2)) ? (*p2) : (((*p1) > (*p3)) ? (*p3) : (*p1)); }
1115
+ }
1116
+ }
1117
+ }
1118
+
1119
+ static void
1120
+ ca_triop_clip_int32_t (ca_size_t n, boolean8_t *m,
1121
+ char *ptr1, ca_size_t i1,
1122
+ char *ptr2, ca_size_t i2,
1123
+ char *ptr3, ca_size_t i3,
1124
+ char *ptr4, ca_size_t i4)
1125
+ {
1126
+ int32_t *q1 = (int32_t *) ptr1, *q2 = (int32_t *) ptr2,
1127
+ *q3 = (int32_t *) ptr3, *q4 = (int32_t *) ptr4;
1128
+ int32_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1129
+ ca_size_t k;
1130
+ if ( m ) {
1131
+ boolean8_t *pm;
1132
+ for (k=0; k<n; k++) {
1133
+ pm = m + k;
1134
+ if ( ! *pm ) {
1135
+ p1 = q1 + k*i1;
1136
+ p2 = q2 + k*i2;
1137
+ p3 = q3 + k*i3;
1138
+ p4 = q4 + k*i4;
1139
+ { (*p4) = ((*p1) < (*p2)) ? (*p2) : (((*p1) > (*p3)) ? (*p3) : (*p1)); }
1140
+ }
1141
+ }
1142
+ } else {
1143
+ for (k=0; k<n; k++) {
1144
+ p1 = q1 + k*i1;
1145
+ p2 = q2 + k*i2;
1146
+ p3 = q3 + k*i3;
1147
+ p4 = q4 + k*i4;
1148
+ { (*p4) = ((*p1) < (*p2)) ? (*p2) : (((*p1) > (*p3)) ? (*p3) : (*p1)); }
1149
+ }
1150
+ }
1151
+ }
1152
+
1153
+ static void
1154
+ ca_triop_clip_uint32_t (ca_size_t n, boolean8_t *m,
1155
+ char *ptr1, ca_size_t i1,
1156
+ char *ptr2, ca_size_t i2,
1157
+ char *ptr3, ca_size_t i3,
1158
+ char *ptr4, ca_size_t i4)
1159
+ {
1160
+ uint32_t *q1 = (uint32_t *) ptr1, *q2 = (uint32_t *) ptr2,
1161
+ *q3 = (uint32_t *) ptr3, *q4 = (uint32_t *) ptr4;
1162
+ uint32_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1163
+ ca_size_t k;
1164
+ if ( m ) {
1165
+ boolean8_t *pm;
1166
+ for (k=0; k<n; k++) {
1167
+ pm = m + k;
1168
+ if ( ! *pm ) {
1169
+ p1 = q1 + k*i1;
1170
+ p2 = q2 + k*i2;
1171
+ p3 = q3 + k*i3;
1172
+ p4 = q4 + k*i4;
1173
+ { (*p4) = ((*p1) < (*p2)) ? (*p2) : (((*p1) > (*p3)) ? (*p3) : (*p1)); }
1174
+ }
1175
+ }
1176
+ } else {
1177
+ for (k=0; k<n; k++) {
1178
+ p1 = q1 + k*i1;
1179
+ p2 = q2 + k*i2;
1180
+ p3 = q3 + k*i3;
1181
+ p4 = q4 + k*i4;
1182
+ { (*p4) = ((*p1) < (*p2)) ? (*p2) : (((*p1) > (*p3)) ? (*p3) : (*p1)); }
1183
+ }
1184
+ }
1185
+ }
1186
+
1187
+ static void
1188
+ ca_triop_clip_int64_t (ca_size_t n, boolean8_t *m,
1189
+ char *ptr1, ca_size_t i1,
1190
+ char *ptr2, ca_size_t i2,
1191
+ char *ptr3, ca_size_t i3,
1192
+ char *ptr4, ca_size_t i4)
1193
+ {
1194
+ int64_t *q1 = (int64_t *) ptr1, *q2 = (int64_t *) ptr2,
1195
+ *q3 = (int64_t *) ptr3, *q4 = (int64_t *) ptr4;
1196
+ int64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1197
+ ca_size_t k;
1198
+ if ( m ) {
1199
+ boolean8_t *pm;
1200
+ for (k=0; k<n; k++) {
1201
+ pm = m + k;
1202
+ if ( ! *pm ) {
1203
+ p1 = q1 + k*i1;
1204
+ p2 = q2 + k*i2;
1205
+ p3 = q3 + k*i3;
1206
+ p4 = q4 + k*i4;
1207
+ { (*p4) = ((*p1) < (*p2)) ? (*p2) : (((*p1) > (*p3)) ? (*p3) : (*p1)); }
1208
+ }
1209
+ }
1210
+ } else {
1211
+ for (k=0; k<n; k++) {
1212
+ p1 = q1 + k*i1;
1213
+ p2 = q2 + k*i2;
1214
+ p3 = q3 + k*i3;
1215
+ p4 = q4 + k*i4;
1216
+ { (*p4) = ((*p1) < (*p2)) ? (*p2) : (((*p1) > (*p3)) ? (*p3) : (*p1)); }
1217
+ }
1218
+ }
1219
+ }
1220
+
1221
+ static void
1222
+ ca_triop_clip_uint64_t (ca_size_t n, boolean8_t *m,
1223
+ char *ptr1, ca_size_t i1,
1224
+ char *ptr2, ca_size_t i2,
1225
+ char *ptr3, ca_size_t i3,
1226
+ char *ptr4, ca_size_t i4)
1227
+ {
1228
+ uint64_t *q1 = (uint64_t *) ptr1, *q2 = (uint64_t *) ptr2,
1229
+ *q3 = (uint64_t *) ptr3, *q4 = (uint64_t *) ptr4;
1230
+ uint64_t *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1231
+ ca_size_t k;
1232
+ if ( m ) {
1233
+ boolean8_t *pm;
1234
+ for (k=0; k<n; k++) {
1235
+ pm = m + k;
1236
+ if ( ! *pm ) {
1237
+ p1 = q1 + k*i1;
1238
+ p2 = q2 + k*i2;
1239
+ p3 = q3 + k*i3;
1240
+ p4 = q4 + k*i4;
1241
+ { (*p4) = ((*p1) < (*p2)) ? (*p2) : (((*p1) > (*p3)) ? (*p3) : (*p1)); }
1242
+ }
1243
+ }
1244
+ } else {
1245
+ for (k=0; k<n; k++) {
1246
+ p1 = q1 + k*i1;
1247
+ p2 = q2 + k*i2;
1248
+ p3 = q3 + k*i3;
1249
+ p4 = q4 + k*i4;
1250
+ { (*p4) = ((*p1) < (*p2)) ? (*p2) : (((*p1) > (*p3)) ? (*p3) : (*p1)); }
1251
+ }
1252
+ }
1253
+ }
1254
+
1255
+ static void
1256
+ ca_triop_clip_float32_t (ca_size_t n, boolean8_t *m,
1257
+ char *ptr1, ca_size_t i1,
1258
+ char *ptr2, ca_size_t i2,
1259
+ char *ptr3, ca_size_t i3,
1260
+ char *ptr4, ca_size_t i4)
1261
+ {
1262
+ float *q1 = (float *) ptr1, *q2 = (float *) ptr2,
1263
+ *q3 = (float *) ptr3, *q4 = (float *) ptr4;
1264
+ float *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1265
+ ca_size_t k;
1266
+ if ( m ) {
1267
+ boolean8_t *pm;
1268
+ for (k=0; k<n; k++) {
1269
+ pm = m + k;
1270
+ if ( ! *pm ) {
1271
+ p1 = q1 + k*i1;
1272
+ p2 = q2 + k*i2;
1273
+ p3 = q3 + k*i3;
1274
+ p4 = q4 + k*i4;
1275
+ { (*p4) = isnan(*p1) ? (*p1) : fmin(fmax((*p1), (*p2)), (*p3)); }
1276
+ }
1277
+ }
1278
+ } else {
1279
+ for (k=0; k<n; k++) {
1280
+ p1 = q1 + k*i1;
1281
+ p2 = q2 + k*i2;
1282
+ p3 = q3 + k*i3;
1283
+ p4 = q4 + k*i4;
1284
+ { (*p4) = isnan(*p1) ? (*p1) : fmin(fmax((*p1), (*p2)), (*p3)); }
1285
+ }
1286
+ }
1287
+ }
1288
+
1289
+ static void
1290
+ ca_triop_clip_float64_t (ca_size_t n, boolean8_t *m,
1291
+ char *ptr1, ca_size_t i1,
1292
+ char *ptr2, ca_size_t i2,
1293
+ char *ptr3, ca_size_t i3,
1294
+ char *ptr4, ca_size_t i4)
1295
+ {
1296
+ double *q1 = (double *) ptr1, *q2 = (double *) ptr2,
1297
+ *q3 = (double *) ptr3, *q4 = (double *) ptr4;
1298
+ double *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1299
+ ca_size_t k;
1300
+ if ( m ) {
1301
+ boolean8_t *pm;
1302
+ for (k=0; k<n; k++) {
1303
+ pm = m + k;
1304
+ if ( ! *pm ) {
1305
+ p1 = q1 + k*i1;
1306
+ p2 = q2 + k*i2;
1307
+ p3 = q3 + k*i3;
1308
+ p4 = q4 + k*i4;
1309
+ { (*p4) = isnan(*p1) ? (*p1) : fmin(fmax((*p1), (*p2)), (*p3)); }
1310
+ }
1311
+ }
1312
+ } else {
1313
+ for (k=0; k<n; k++) {
1314
+ p1 = q1 + k*i1;
1315
+ p2 = q2 + k*i2;
1316
+ p3 = q3 + k*i3;
1317
+ p4 = q4 + k*i4;
1318
+ { (*p4) = isnan(*p1) ? (*p1) : fmin(fmax((*p1), (*p2)), (*p3)); }
1319
+ }
1320
+ }
1321
+ }
1322
+
1323
+ static void
1324
+ ca_triop_clip_VALUE (ca_size_t n, boolean8_t *m,
1325
+ char *ptr1, ca_size_t i1,
1326
+ char *ptr2, ca_size_t i2,
1327
+ char *ptr3, ca_size_t i3,
1328
+ char *ptr4, ca_size_t i4)
1329
+ {
1330
+ VALUE *q1 = (VALUE *) ptr1, *q2 = (VALUE *) ptr2,
1331
+ *q3 = (VALUE *) ptr3, *q4 = (VALUE *) ptr4;
1332
+ VALUE *p1 = q1, *p2 = q2, *p3 = q3, *p4 = q4;
1333
+ ca_size_t k;
1334
+ if ( m ) {
1335
+ boolean8_t *pm;
1336
+ for (k=0; k<n; k++) {
1337
+ pm = m + k;
1338
+ if ( ! *pm ) {
1339
+ p1 = q1 + k*i1;
1340
+ p2 = q2 + k*i2;
1341
+ p3 = q3 + k*i3;
1342
+ p4 = q4 + k*i4;
1343
+ { { VALUE _v=(*p1); if (rb_funcall(_v, rb_intern("<"), 1, (*p2))) _v=(*p2); else if (rb_funcall(_v, rb_intern(">"), 1, (*p3))) _v=(*p3); (*p4) = _v; } }
1344
+ }
1345
+ }
1346
+ } else {
1347
+ for (k=0; k<n; k++) {
1348
+ p1 = q1 + k*i1;
1349
+ p2 = q2 + k*i2;
1350
+ p3 = q3 + k*i3;
1351
+ p4 = q4 + k*i4;
1352
+ { { VALUE _v=(*p1); if (rb_funcall(_v, rb_intern("<"), 1, (*p2))) _v=(*p2); else if (rb_funcall(_v, rb_intern(">"), 1, (*p3))) _v=(*p3); (*p4) = _v; } }
1353
+ }
1354
+ }
1355
+ }
1356
+
1357
+ ca_triop_func_t
1358
+ ca_triop_clip[CA_NTYPE] = {
1359
+ ca_triop_not_implement,
1360
+ ca_triop_not_implement,
1361
+ ca_triop_clip_int8_t,
1362
+ ca_triop_clip_uint8_t,
1363
+ ca_triop_clip_int16_t,
1364
+ ca_triop_clip_uint16_t,
1365
+ ca_triop_clip_int32_t,
1366
+ ca_triop_clip_uint32_t,
1367
+ ca_triop_clip_int64_t,
1368
+ ca_triop_clip_uint64_t,
1369
+ ca_triop_clip_float32_t,
1370
+ ca_triop_clip_float64_t,
1371
+ ca_triop_not_implement,
1372
+ ca_triop_not_implement,
1373
+ ca_triop_not_implement,
1374
+ ca_triop_not_implement,
1375
+ ca_triop_clip_VALUE,
1376
+ };
1377
+
1378
+ VALUE rb_ca_clip (VALUE self, VALUE other2, VALUE other3)
1379
+ { return rb_ca_call_triop(self, other2, other3, ca_triop_clip); }
1380
+
1381
+ VALUE rb_ca_clip_bang (VALUE self, VALUE other2, VALUE other3)
1382
+ { return rb_ca_call_triop_bang(self, other2, other3, ca_triop_clip); }
1383
+
1384
+ void
1385
+ Init_carray_kernels_triop (void)
1386
+ {
1387
+ rb_define_method(rb_cCArray, "fma", rb_ca_fma, 2);
1388
+ rb_define_method(rb_cCArray, "fma!", rb_ca_fma_bang, 2);
1389
+ rb_define_method(rb_cCArray, "fms", rb_ca_fms, 2);
1390
+ rb_define_method(rb_cCArray, "fms!", rb_ca_fms_bang, 2);
1391
+ rb_define_method(rb_cCArray, "__clip_ki__", rb_ca_clip, 2);
1392
+ }