carray 2.0.1 → 3.0.0

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