carray 3.0.1 → 3.0.3

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 (229) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +824 -0
  3. data/README.md +5 -6
  4. data/carray.gemspec +1 -1
  5. data/ext/ca_axis_dispatch.c +258 -4
  6. data/ext/ca_axis_group.c +368 -184
  7. data/ext/ca_binop_dispatch.c +54 -32
  8. data/ext/ca_binop_dispatch.h +1 -0
  9. data/ext/ca_categorical_iterator.c +90 -41
  10. data/ext/ca_compare.c +8 -2
  11. data/ext/ca_for_buffer.h +21 -68
  12. data/ext/ca_group_iter.c +27 -11
  13. data/ext/ca_kernel_iterator.c +960 -245
  14. data/ext/ca_kernel_iterator.h +352 -181
  15. data/ext/ca_monop_dispatch.c +4 -4
  16. data/ext/ca_monop_dispatch.h +4 -0
  17. data/ext/ca_obj_array.c +194 -42
  18. data/ext/ca_obj_bincmp.c +152 -121
  19. data/ext/ca_obj_binop.c +107 -210
  20. data/ext/ca_obj_bitarray.c +37 -24
  21. data/ext/ca_obj_bitfield.c +95 -62
  22. data/ext/ca_obj_block.c +5 -4
  23. data/ext/ca_obj_byte_swap.c +40 -40
  24. data/ext/ca_obj_const_string.c +180 -50
  25. data/ext/ca_obj_face.c +428 -62
  26. data/ext/ca_obj_face.h +107 -47
  27. data/ext/ca_obj_fake.c +21 -50
  28. data/ext/ca_obj_farray.c +1 -0
  29. data/ext/ca_obj_field.c +16 -3
  30. data/ext/ca_obj_fixlen_string.c +39 -26
  31. data/ext/ca_obj_grid.c +181 -124
  32. data/ext/ca_obj_meld.c +235 -55
  33. data/ext/ca_obj_moncmp.c +61 -61
  34. data/ext/ca_obj_monop.c +125 -107
  35. data/ext/ca_obj_object.c +551 -233
  36. data/ext/ca_obj_record.c +51 -16
  37. data/ext/ca_obj_reduce.c +5 -8
  38. data/ext/ca_obj_refer.c +117 -33
  39. data/ext/ca_obj_remap.c +57 -17
  40. data/ext/ca_obj_repeat.c +21 -5
  41. data/ext/ca_obj_roll.c +115 -11
  42. data/ext/ca_obj_select.c +88 -75
  43. data/ext/ca_obj_select_axis.c +58 -60
  44. data/ext/ca_obj_shift.c +22 -102
  45. data/ext/ca_obj_stack.c +223 -123
  46. data/ext/ca_obj_stride.c +267 -35
  47. data/ext/ca_obj_string.c +25 -22
  48. data/ext/ca_obj_tile.c +32 -16
  49. data/ext/ca_obj_time.c +23 -25
  50. data/ext/ca_obj_timedelta.c +21 -23
  51. data/ext/ca_obj_transpose.c +12 -3
  52. data/ext/ca_obj_triop.c +110 -117
  53. data/ext/ca_obj_window.c +157 -29
  54. data/ext/ca_op_ipower.c +25 -13
  55. data/ext/ca_op_powi.h +57 -30
  56. data/ext/ca_pow5_table.h +656 -0
  57. data/ext/ca_rng_normal.h +42 -0
  58. data/ext/ca_rng_xoshiro256pp.h +105 -0
  59. data/ext/ca_sort_kernels.h +70 -0
  60. data/ext/ca_sweep_engine.c +385 -198
  61. data/ext/ca_sweep_engine.h +31 -23
  62. data/ext/ca_triop_dispatch.c +4 -1
  63. data/ext/ca_triop_dispatch.h +5 -2
  64. data/ext/caframe_csv_reader.c +463 -0
  65. data/ext/carray.h +90 -28
  66. data/ext/carray_access.c +487 -231
  67. data/ext/carray_address_basis.c +731 -0
  68. data/ext/carray_attribute.c +45 -3
  69. data/ext/carray_bincount.c +32 -2
  70. data/ext/carray_broadcast.c +49 -17
  71. data/ext/carray_call_cfunc.c +667 -511
  72. data/ext/carray_cast.c +1556 -247
  73. data/ext/carray_cast_func.rb +34 -21
  74. data/ext/carray_conversion.c +197 -73
  75. data/ext/carray_copy.c +84 -38
  76. data/ext/carray_core.c +591 -119
  77. data/ext/carray_count.c +148 -96
  78. data/ext/carray_element.c +18 -27
  79. data/ext/carray_factorize.c +604 -291
  80. data/ext/carray_generate.c +76 -40
  81. data/ext/carray_histogram.c +152 -94
  82. data/ext/carray_hold.c +2 -1
  83. data/ext/carray_index_classifier.c +63 -96
  84. data/ext/carray_internal.h +400 -1
  85. data/ext/carray_lazy.c +834 -79
  86. data/ext/carray_loop.c +88 -66
  87. data/ext/carray_mask.c +705 -324
  88. data/ext/carray_math_kernel.h +1 -0
  89. data/ext/carray_median_percentile.c +263 -63
  90. data/ext/carray_memory_view.c +254 -248
  91. data/ext/carray_operator.c +1093 -363
  92. data/ext/carray_order.c +133 -69
  93. data/ext/carray_partition.c +102 -56
  94. data/ext/carray_random.c +582 -204
  95. data/ext/carray_scatter.c +308 -65
  96. data/ext/carray_segment.c +257 -0
  97. data/ext/carray_slab.c +183 -70
  98. data/ext/carray_sort.c +235 -240
  99. data/ext/carray_sort_kernel.c +8 -1
  100. data/ext/carray_struct.c +99 -21
  101. data/ext/carray_test.c +167 -64
  102. data/ext/carray_time_text.c +1182 -0
  103. data/ext/carray_utils.c +363 -98
  104. data/ext/extconf.rb +27 -2
  105. data/ext/mk_call_cfunc.rb +103 -118
  106. data/ext/mk_pow5_table.rb +35 -0
  107. data/ext/mkkernel.rb +1349 -851
  108. data/ext/ruby_carray.c +17 -2
  109. data/ext/version.h +4 -4
  110. data/ext/version.rb +4 -2
  111. data/lib/carray/attribute.rb +39 -0
  112. data/lib/carray/autoload_carray.rb +24 -3
  113. data/lib/carray/autoload_method_extension.rb +18 -0
  114. data/lib/carray/axis_group.rb +245 -20
  115. data/lib/carray/basics.rb +95 -25
  116. data/lib/carray/bincount_nd.rb +6 -0
  117. data/lib/carray/block_iterator.rb +200 -54
  118. data/lib/carray/boolean_reduce.rb +21 -29
  119. data/lib/carray/categorical.rb +244 -59
  120. data/lib/carray/categorical_iterator.rb +391 -757
  121. data/lib/carray/complex.rb +36 -29
  122. data/lib/carray/conditional.rb +94 -7
  123. data/lib/carray/const_string.rb +177 -27
  124. data/lib/carray/construct.rb +40 -0
  125. data/lib/carray/data_type_extension.rb +3 -0
  126. data/lib/carray/data_type_limits.rb +91 -0
  127. data/lib/carray/fixlen_string.rb +1 -1
  128. data/lib/carray/frame/concat.rb +157 -6
  129. data/lib/carray/frame/convert.rb +13 -7
  130. data/lib/carray/frame/csv_parser.rb +590 -76
  131. data/lib/carray/frame/describe.rb +79 -0
  132. data/lib/carray/frame/frame.rb +205 -35
  133. data/lib/carray/frame/group.rb +199 -40
  134. data/lib/carray/frame/io.rb +452 -60
  135. data/lib/carray/frame/join.rb +134 -46
  136. data/lib/carray/frame/records.rb +54 -19
  137. data/lib/carray/frame/reshape.rb +448 -0
  138. data/lib/carray/frame/sort.rb +26 -2
  139. data/lib/carray/frame/verbs.rb +726 -56
  140. data/lib/carray/frame.rb +2 -0
  141. data/lib/carray/fuse_source.rb +111 -2
  142. data/lib/carray/fusion.rb +229 -38
  143. data/lib/carray/inspect.rb +71 -20
  144. data/lib/carray/iterator.rb +157 -2
  145. data/lib/carray/lazy.rb +54 -67
  146. data/lib/carray/mask_gap_fill.rb +66 -50
  147. data/lib/carray/math.rb +32 -19
  148. data/lib/carray/meld_reduce.rb +40 -7
  149. data/lib/carray/methods/align_addr.rb +8 -4
  150. data/lib/carray/methods/bincount.rb +2 -2
  151. data/lib/carray/methods/bit_string.rb +14 -3
  152. data/lib/carray/methods/composition.rb +16 -10
  153. data/lib/carray/methods/discovery_along.rb +74 -0
  154. data/lib/carray/methods/factorize.rb +50 -0
  155. data/lib/carray/methods/gather_nd.rb +13 -2
  156. data/lib/carray/methods/insert_block.rb +9 -14
  157. data/lib/carray/methods/is_in.rb +130 -6
  158. data/lib/carray/methods/join.rb +1 -1
  159. data/lib/carray/methods/locate_addr.rb +235 -21
  160. data/lib/carray/methods/mask_duplicates.rb +35 -1
  161. data/lib/carray/methods/mode.rb +18 -1
  162. data/lib/carray/methods/nunique.rb +22 -1
  163. data/lib/carray/methods/repeat.rb +91 -0
  164. data/lib/carray/methods/resize.rb +21 -23
  165. data/lib/carray/methods/snap.rb +34 -12
  166. data/lib/carray/methods/unique.rb +52 -3
  167. data/lib/carray/record_order.rb +208 -0
  168. data/lib/carray/rng.rb +86 -0
  169. data/lib/carray/runtime.rb +14 -11
  170. data/lib/carray/segment_iterator.rb +990 -0
  171. data/lib/carray/serialize.rb +197 -27
  172. data/lib/carray/slab_iterator.rb +109 -40
  173. data/lib/carray/stack.rb +10 -4
  174. data/lib/carray/string_operation_extension.rb +9 -4
  175. data/lib/carray/struct.rb +142 -51
  176. data/lib/carray/struct_builder.rb +110 -14
  177. data/lib/carray/table.rb +2 -2
  178. data/lib/carray/time.rb +535 -105
  179. data/lib/carray/window_iterator.rb +259 -82
  180. data/lib/carray.rb +4 -2
  181. data/yard-stubs/ca_obj_array.rb +4 -4
  182. data/yard-stubs/ca_obj_bitarray.rb +7 -0
  183. data/yard-stubs/ca_obj_bitfield.rb +23 -12
  184. data/yard-stubs/ca_obj_block.rb +2 -7
  185. data/yard-stubs/ca_obj_fake.rb +1 -1
  186. data/yard-stubs/ca_obj_field.rb +1 -1
  187. data/yard-stubs/ca_obj_refer.rb +3 -3
  188. data/yard-stubs/ca_obj_roll.rb +0 -1
  189. data/yard-stubs/ca_obj_stride.rb +10 -7
  190. data/yard-stubs/ca_obj_transpose.rb +1 -1
  191. data/yard-stubs/ca_obj_window.rb +11 -4
  192. data/yard-stubs/carray_access.rb +6 -5
  193. data/yard-stubs/carray_broadcast.rb +2 -2
  194. data/yard-stubs/carray_cast.rb +78 -43
  195. data/yard-stubs/carray_conversion.rb +13 -1
  196. data/yard-stubs/carray_copy.rb +8 -3
  197. data/yard-stubs/carray_core.rb +3 -83
  198. data/yard-stubs/carray_count.rb +16 -2
  199. data/yard-stubs/carray_lazy.rb +210 -1
  200. data/yard-stubs/carray_loop.rb +4 -1
  201. data/yard-stubs/carray_mask.rb +34 -10
  202. data/yard-stubs/carray_math.rb +1499 -4
  203. data/yard-stubs/carray_median_percentile.rb +26 -8
  204. data/yard-stubs/carray_order.rb +43 -82
  205. data/yard-stubs/carray_scatter.rb +10 -3
  206. data/yard-stubs/carray_segment.rb +72 -0
  207. data/yard-stubs/carray_slab.rb +11 -8
  208. data/yard-stubs/carray_sort.rb +50 -8
  209. data/yard-stubs/carray_test.rb +10 -0
  210. data/yard-stubs/carray_utils.rb +0 -26
  211. metadata +19 -19
  212. data/ext/ca_for_each_element.h +0 -239
  213. data/ext/carray_build_flags.h +0 -3
  214. data/ext/carray_config.h +0 -28
  215. data/ext/carray_kernels_bincmp.c +0 -4446
  216. data/ext/carray_kernels_binop.c +0 -11001
  217. data/ext/carray_kernels_init.c +0 -1131
  218. data/ext/carray_kernels_map.c +0 -3467
  219. data/ext/carray_kernels_moncmp.c +0 -2097
  220. data/ext/carray_kernels_monop.c +0 -18313
  221. data/ext/carray_kernels_reduce_aggregate.c +0 -25837
  222. data/ext/carray_kernels_reduce_boolean.c +0 -330
  223. data/ext/carray_kernels_reduce_cumulative.c +0 -14593
  224. data/ext/carray_kernels_reduce_extreme.c +0 -16948
  225. data/ext/carray_kernels_reduce_variance.c +0 -3910
  226. data/ext/carray_kernels_scan.c +0 -3693
  227. data/ext/carray_kernels_search.c +0 -32138
  228. data/ext/carray_kernels_sort.c +0 -10626
  229. data/ext/carray_kernels_triop.c +0 -1392
@@ -1,1392 +0,0 @@
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
- }