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,4445 @@
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
+ /* ===== bincmp feq ============================================ */
39
+
40
+ static void
41
+ ca_bincmp_feq_float32_t (ca_size_t n, boolean8_t *m,
42
+ char *ptr1, ca_size_t b1, ca_size_t i1,
43
+ char *ptr2, ca_size_t b2, ca_size_t i2,
44
+ char *ptr3, ca_size_t b3, ca_size_t i3,
45
+ double tol)
46
+ {
47
+ float *q1 = (float *) ptr1, *q2 = (float *) ptr2;
48
+ float *p1 = q1, *p2 = q2;
49
+ boolean8_t *q3 = (boolean8_t *) ptr3;
50
+ boolean8_t *p3 = q3;
51
+ ca_size_t k;
52
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
53
+ (void) tol;
54
+ if ( m ) {
55
+ boolean8_t *pm;
56
+ for (k=0; k<n; k++) {
57
+ pm = m + k;
58
+ if ( ! *pm ) {
59
+ p1 = q1 + k*i1;
60
+ p2 = q2 + k*i2;
61
+ p3 = q3 + k*i3;
62
+ {
63
+ float f1a = fabs((float64_t) *p1);
64
+ float f2a = fabs((float64_t) *p2);
65
+ float fmax = (f1a > f2a) ? f1a : f2a;
66
+ (*p3) = ( fabs(((float64_t) *p1)-( (float64_t) *p2)) <= fmax * FLT_EPSILON ) ? 1 : 0;
67
+ }
68
+ }
69
+ }
70
+ } else {
71
+ for (k=0; k<n; k++) {
72
+ p1 = q1 + k*i1;
73
+ p2 = q2 + k*i2;
74
+ p3 = q3 + k*i3;
75
+ {
76
+ float f1a = fabs((float64_t) *p1);
77
+ float f2a = fabs((float64_t) *p2);
78
+ float fmax = (f1a > f2a) ? f1a : f2a;
79
+ (*p3) = ( fabs(((float64_t) *p1)-( (float64_t) *p2)) <= fmax * FLT_EPSILON ) ? 1 : 0;
80
+ }
81
+ }
82
+ }
83
+ }
84
+
85
+ static void
86
+ ca_bincmp_feq_float64_t (ca_size_t n, boolean8_t *m,
87
+ char *ptr1, ca_size_t b1, ca_size_t i1,
88
+ char *ptr2, ca_size_t b2, ca_size_t i2,
89
+ char *ptr3, ca_size_t b3, ca_size_t i3,
90
+ double tol)
91
+ {
92
+ double *q1 = (double *) ptr1, *q2 = (double *) ptr2;
93
+ double *p1 = q1, *p2 = q2;
94
+ boolean8_t *q3 = (boolean8_t *) ptr3;
95
+ boolean8_t *p3 = q3;
96
+ ca_size_t k;
97
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
98
+ (void) tol;
99
+ if ( m ) {
100
+ boolean8_t *pm;
101
+ for (k=0; k<n; k++) {
102
+ pm = m + k;
103
+ if ( ! *pm ) {
104
+ p1 = q1 + k*i1;
105
+ p2 = q2 + k*i2;
106
+ p3 = q3 + k*i3;
107
+ {
108
+ double f1a = fabs((float64_t) *p1);
109
+ double f2a = fabs((float64_t) *p2);
110
+ double fmax = (f1a > f2a) ? f1a : f2a;
111
+ (*p3) = ( fabs(((float64_t) *p1)-( (float64_t) *p2)) <= fmax * DBL_EPSILON ) ? 1 : 0;
112
+ }
113
+ }
114
+ }
115
+ } else {
116
+ for (k=0; k<n; k++) {
117
+ p1 = q1 + k*i1;
118
+ p2 = q2 + k*i2;
119
+ p3 = q3 + k*i3;
120
+ {
121
+ double f1a = fabs((float64_t) *p1);
122
+ double f2a = fabs((float64_t) *p2);
123
+ double fmax = (f1a > f2a) ? f1a : f2a;
124
+ (*p3) = ( fabs(((float64_t) *p1)-( (float64_t) *p2)) <= fmax * DBL_EPSILON ) ? 1 : 0;
125
+ }
126
+ }
127
+ }
128
+ }
129
+
130
+ ca_bincmp_func_t
131
+ ca_bincmp_feq[CA_NTYPE] = {
132
+ ca_bincmp_not_implement,
133
+ ca_bincmp_not_implement,
134
+ ca_bincmp_not_implement,
135
+ ca_bincmp_not_implement,
136
+ ca_bincmp_not_implement,
137
+ ca_bincmp_not_implement,
138
+ ca_bincmp_not_implement,
139
+ ca_bincmp_not_implement,
140
+ ca_bincmp_not_implement,
141
+ ca_bincmp_not_implement,
142
+ ca_bincmp_feq_float32_t,
143
+ ca_bincmp_feq_float64_t,
144
+ ca_bincmp_not_implement,
145
+ ca_bincmp_not_implement,
146
+ ca_bincmp_not_implement,
147
+ ca_bincmp_not_implement,
148
+ ca_bincmp_not_implement,
149
+ };
150
+
151
+ VALUE rb_ca_feq (VALUE self, VALUE other)
152
+ {
153
+ if ( ! rb_ca_test_castable(other) ) {
154
+ return rb_ca_binop_pass_to_other(self, other, rb_intern("feq"));
155
+ }
156
+ return rb_ca_call_bincmp(self, other, ca_bincmp_feq, 0.0);
157
+ }
158
+
159
+ /* ===== bincmp eq ============================================ */
160
+
161
+ static void
162
+ ca_bincmp_eq_fixlen (ca_size_t n, boolean8_t *m,
163
+ char *ptr1, ca_size_t b1, ca_size_t i1,
164
+ char *ptr2, ca_size_t b2, ca_size_t i2,
165
+ char *ptr3, ca_size_t b3, ca_size_t i3,
166
+ double tol)
167
+ {
168
+ char *q1 = ptr1, *q2 = ptr2;
169
+ char *p1 = q1, *p2 = q2;
170
+ boolean8_t *q3 = (boolean8_t *) ptr3;
171
+ boolean8_t *p3 = q3;
172
+ ca_size_t s1 = b1*i1, s2 = b2*i2, s3 = b3*i3;
173
+ ca_size_t k;
174
+ (void) tol;
175
+ if ( m ) {
176
+ boolean8_t *pm;
177
+ for (k=0; k<n; k++) {
178
+ pm = m + k;
179
+ if ( ! *pm ) {
180
+ p1 = q1 + k*s1;
181
+ p2 = q2 + k*s2;
182
+ p3 = q3 + k*s3;
183
+ { (*p3) = ( b1 == b2 && (! memcmp(p1, p2, b1)) ); }
184
+ }
185
+ }
186
+ } else {
187
+ for (k=0; k<n; k++) {
188
+ p1 = q1 + k*s1;
189
+ p2 = q2 + k*s2;
190
+ p3 = q3 + k*s3;
191
+ { (*p3) = ( b1 == b2 && (! memcmp(p1, p2, b1)) ); }
192
+ }
193
+ }
194
+ }
195
+
196
+ static void
197
+ ca_bincmp_eq_boolean8_t (ca_size_t n, boolean8_t *m,
198
+ char *ptr1, ca_size_t b1, ca_size_t i1,
199
+ char *ptr2, ca_size_t b2, ca_size_t i2,
200
+ char *ptr3, ca_size_t b3, ca_size_t i3,
201
+ double tol)
202
+ {
203
+ boolean8_t *q1 = (boolean8_t *) ptr1, *q2 = (boolean8_t *) ptr2;
204
+ boolean8_t *p1 = q1, *p2 = q2;
205
+ boolean8_t *q3 = (boolean8_t *) ptr3;
206
+ boolean8_t *p3 = q3;
207
+ ca_size_t k;
208
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
209
+ (void) tol;
210
+ if ( m ) {
211
+ boolean8_t *pm;
212
+ for (k=0; k<n; k++) {
213
+ pm = m + k;
214
+ if ( ! *pm ) {
215
+ p1 = q1 + k*i1;
216
+ p2 = q2 + k*i2;
217
+ p3 = q3 + k*i3;
218
+ { (*p3) = ( (*p1) == (*p2) ); }
219
+ }
220
+ }
221
+ } else {
222
+ for (k=0; k<n; k++) {
223
+ p1 = q1 + k*i1;
224
+ p2 = q2 + k*i2;
225
+ p3 = q3 + k*i3;
226
+ { (*p3) = ( (*p1) == (*p2) ); }
227
+ }
228
+ }
229
+ }
230
+
231
+ static void
232
+ ca_bincmp_eq_int8_t (ca_size_t n, boolean8_t *m,
233
+ char *ptr1, ca_size_t b1, ca_size_t i1,
234
+ char *ptr2, ca_size_t b2, ca_size_t i2,
235
+ char *ptr3, ca_size_t b3, ca_size_t i3,
236
+ double tol)
237
+ {
238
+ int8_t *q1 = (int8_t *) ptr1, *q2 = (int8_t *) ptr2;
239
+ int8_t *p1 = q1, *p2 = q2;
240
+ boolean8_t *q3 = (boolean8_t *) ptr3;
241
+ boolean8_t *p3 = q3;
242
+ ca_size_t k;
243
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
244
+ (void) tol;
245
+ if ( m ) {
246
+ boolean8_t *pm;
247
+ for (k=0; k<n; k++) {
248
+ pm = m + k;
249
+ if ( ! *pm ) {
250
+ p1 = q1 + k*i1;
251
+ p2 = q2 + k*i2;
252
+ p3 = q3 + k*i3;
253
+ { (*p3) = ( (*p1) == (*p2) ); }
254
+ }
255
+ }
256
+ } else {
257
+ for (k=0; k<n; k++) {
258
+ p1 = q1 + k*i1;
259
+ p2 = q2 + k*i2;
260
+ p3 = q3 + k*i3;
261
+ { (*p3) = ( (*p1) == (*p2) ); }
262
+ }
263
+ }
264
+ }
265
+
266
+ static void
267
+ ca_bincmp_eq_uint8_t (ca_size_t n, boolean8_t *m,
268
+ char *ptr1, ca_size_t b1, ca_size_t i1,
269
+ char *ptr2, ca_size_t b2, ca_size_t i2,
270
+ char *ptr3, ca_size_t b3, ca_size_t i3,
271
+ double tol)
272
+ {
273
+ uint8_t *q1 = (uint8_t *) ptr1, *q2 = (uint8_t *) ptr2;
274
+ uint8_t *p1 = q1, *p2 = q2;
275
+ boolean8_t *q3 = (boolean8_t *) ptr3;
276
+ boolean8_t *p3 = q3;
277
+ ca_size_t k;
278
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
279
+ (void) tol;
280
+ if ( m ) {
281
+ boolean8_t *pm;
282
+ for (k=0; k<n; k++) {
283
+ pm = m + k;
284
+ if ( ! *pm ) {
285
+ p1 = q1 + k*i1;
286
+ p2 = q2 + k*i2;
287
+ p3 = q3 + k*i3;
288
+ { (*p3) = ( (*p1) == (*p2) ); }
289
+ }
290
+ }
291
+ } else {
292
+ for (k=0; k<n; k++) {
293
+ p1 = q1 + k*i1;
294
+ p2 = q2 + k*i2;
295
+ p3 = q3 + k*i3;
296
+ { (*p3) = ( (*p1) == (*p2) ); }
297
+ }
298
+ }
299
+ }
300
+
301
+ static void
302
+ ca_bincmp_eq_int16_t (ca_size_t n, boolean8_t *m,
303
+ char *ptr1, ca_size_t b1, ca_size_t i1,
304
+ char *ptr2, ca_size_t b2, ca_size_t i2,
305
+ char *ptr3, ca_size_t b3, ca_size_t i3,
306
+ double tol)
307
+ {
308
+ int16_t *q1 = (int16_t *) ptr1, *q2 = (int16_t *) ptr2;
309
+ int16_t *p1 = q1, *p2 = q2;
310
+ boolean8_t *q3 = (boolean8_t *) ptr3;
311
+ boolean8_t *p3 = q3;
312
+ ca_size_t k;
313
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
314
+ (void) tol;
315
+ if ( m ) {
316
+ boolean8_t *pm;
317
+ for (k=0; k<n; k++) {
318
+ pm = m + k;
319
+ if ( ! *pm ) {
320
+ p1 = q1 + k*i1;
321
+ p2 = q2 + k*i2;
322
+ p3 = q3 + k*i3;
323
+ { (*p3) = ( (*p1) == (*p2) ); }
324
+ }
325
+ }
326
+ } else {
327
+ for (k=0; k<n; k++) {
328
+ p1 = q1 + k*i1;
329
+ p2 = q2 + k*i2;
330
+ p3 = q3 + k*i3;
331
+ { (*p3) = ( (*p1) == (*p2) ); }
332
+ }
333
+ }
334
+ }
335
+
336
+ static void
337
+ ca_bincmp_eq_uint16_t (ca_size_t n, boolean8_t *m,
338
+ char *ptr1, ca_size_t b1, ca_size_t i1,
339
+ char *ptr2, ca_size_t b2, ca_size_t i2,
340
+ char *ptr3, ca_size_t b3, ca_size_t i3,
341
+ double tol)
342
+ {
343
+ uint16_t *q1 = (uint16_t *) ptr1, *q2 = (uint16_t *) ptr2;
344
+ uint16_t *p1 = q1, *p2 = q2;
345
+ boolean8_t *q3 = (boolean8_t *) ptr3;
346
+ boolean8_t *p3 = q3;
347
+ ca_size_t k;
348
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
349
+ (void) tol;
350
+ if ( m ) {
351
+ boolean8_t *pm;
352
+ for (k=0; k<n; k++) {
353
+ pm = m + k;
354
+ if ( ! *pm ) {
355
+ p1 = q1 + k*i1;
356
+ p2 = q2 + k*i2;
357
+ p3 = q3 + k*i3;
358
+ { (*p3) = ( (*p1) == (*p2) ); }
359
+ }
360
+ }
361
+ } else {
362
+ for (k=0; k<n; k++) {
363
+ p1 = q1 + k*i1;
364
+ p2 = q2 + k*i2;
365
+ p3 = q3 + k*i3;
366
+ { (*p3) = ( (*p1) == (*p2) ); }
367
+ }
368
+ }
369
+ }
370
+
371
+ static void
372
+ ca_bincmp_eq_int32_t (ca_size_t n, boolean8_t *m,
373
+ char *ptr1, ca_size_t b1, ca_size_t i1,
374
+ char *ptr2, ca_size_t b2, ca_size_t i2,
375
+ char *ptr3, ca_size_t b3, ca_size_t i3,
376
+ double tol)
377
+ {
378
+ int32_t *q1 = (int32_t *) ptr1, *q2 = (int32_t *) ptr2;
379
+ int32_t *p1 = q1, *p2 = q2;
380
+ boolean8_t *q3 = (boolean8_t *) ptr3;
381
+ boolean8_t *p3 = q3;
382
+ ca_size_t k;
383
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
384
+ (void) tol;
385
+ if ( m ) {
386
+ boolean8_t *pm;
387
+ for (k=0; k<n; k++) {
388
+ pm = m + k;
389
+ if ( ! *pm ) {
390
+ p1 = q1 + k*i1;
391
+ p2 = q2 + k*i2;
392
+ p3 = q3 + k*i3;
393
+ { (*p3) = ( (*p1) == (*p2) ); }
394
+ }
395
+ }
396
+ } else {
397
+ for (k=0; k<n; k++) {
398
+ p1 = q1 + k*i1;
399
+ p2 = q2 + k*i2;
400
+ p3 = q3 + k*i3;
401
+ { (*p3) = ( (*p1) == (*p2) ); }
402
+ }
403
+ }
404
+ }
405
+
406
+ static void
407
+ ca_bincmp_eq_uint32_t (ca_size_t n, boolean8_t *m,
408
+ char *ptr1, ca_size_t b1, ca_size_t i1,
409
+ char *ptr2, ca_size_t b2, ca_size_t i2,
410
+ char *ptr3, ca_size_t b3, ca_size_t i3,
411
+ double tol)
412
+ {
413
+ uint32_t *q1 = (uint32_t *) ptr1, *q2 = (uint32_t *) ptr2;
414
+ uint32_t *p1 = q1, *p2 = q2;
415
+ boolean8_t *q3 = (boolean8_t *) ptr3;
416
+ boolean8_t *p3 = q3;
417
+ ca_size_t k;
418
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
419
+ (void) tol;
420
+ if ( m ) {
421
+ boolean8_t *pm;
422
+ for (k=0; k<n; k++) {
423
+ pm = m + k;
424
+ if ( ! *pm ) {
425
+ p1 = q1 + k*i1;
426
+ p2 = q2 + k*i2;
427
+ p3 = q3 + k*i3;
428
+ { (*p3) = ( (*p1) == (*p2) ); }
429
+ }
430
+ }
431
+ } else {
432
+ for (k=0; k<n; k++) {
433
+ p1 = q1 + k*i1;
434
+ p2 = q2 + k*i2;
435
+ p3 = q3 + k*i3;
436
+ { (*p3) = ( (*p1) == (*p2) ); }
437
+ }
438
+ }
439
+ }
440
+
441
+ static void
442
+ ca_bincmp_eq_int64_t (ca_size_t n, boolean8_t *m,
443
+ char *ptr1, ca_size_t b1, ca_size_t i1,
444
+ char *ptr2, ca_size_t b2, ca_size_t i2,
445
+ char *ptr3, ca_size_t b3, ca_size_t i3,
446
+ double tol)
447
+ {
448
+ int64_t *q1 = (int64_t *) ptr1, *q2 = (int64_t *) ptr2;
449
+ int64_t *p1 = q1, *p2 = q2;
450
+ boolean8_t *q3 = (boolean8_t *) ptr3;
451
+ boolean8_t *p3 = q3;
452
+ ca_size_t k;
453
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
454
+ (void) tol;
455
+ if ( m ) {
456
+ boolean8_t *pm;
457
+ for (k=0; k<n; k++) {
458
+ pm = m + k;
459
+ if ( ! *pm ) {
460
+ p1 = q1 + k*i1;
461
+ p2 = q2 + k*i2;
462
+ p3 = q3 + k*i3;
463
+ { (*p3) = ( (*p1) == (*p2) ); }
464
+ }
465
+ }
466
+ } else {
467
+ for (k=0; k<n; k++) {
468
+ p1 = q1 + k*i1;
469
+ p2 = q2 + k*i2;
470
+ p3 = q3 + k*i3;
471
+ { (*p3) = ( (*p1) == (*p2) ); }
472
+ }
473
+ }
474
+ }
475
+
476
+ static void
477
+ ca_bincmp_eq_uint64_t (ca_size_t n, boolean8_t *m,
478
+ char *ptr1, ca_size_t b1, ca_size_t i1,
479
+ char *ptr2, ca_size_t b2, ca_size_t i2,
480
+ char *ptr3, ca_size_t b3, ca_size_t i3,
481
+ double tol)
482
+ {
483
+ uint64_t *q1 = (uint64_t *) ptr1, *q2 = (uint64_t *) ptr2;
484
+ uint64_t *p1 = q1, *p2 = q2;
485
+ boolean8_t *q3 = (boolean8_t *) ptr3;
486
+ boolean8_t *p3 = q3;
487
+ ca_size_t k;
488
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
489
+ (void) tol;
490
+ if ( m ) {
491
+ boolean8_t *pm;
492
+ for (k=0; k<n; k++) {
493
+ pm = m + k;
494
+ if ( ! *pm ) {
495
+ p1 = q1 + k*i1;
496
+ p2 = q2 + k*i2;
497
+ p3 = q3 + k*i3;
498
+ { (*p3) = ( (*p1) == (*p2) ); }
499
+ }
500
+ }
501
+ } else {
502
+ for (k=0; k<n; k++) {
503
+ p1 = q1 + k*i1;
504
+ p2 = q2 + k*i2;
505
+ p3 = q3 + k*i3;
506
+ { (*p3) = ( (*p1) == (*p2) ); }
507
+ }
508
+ }
509
+ }
510
+
511
+ static void
512
+ ca_bincmp_eq_float32_t (ca_size_t n, boolean8_t *m,
513
+ char *ptr1, ca_size_t b1, ca_size_t i1,
514
+ char *ptr2, ca_size_t b2, ca_size_t i2,
515
+ char *ptr3, ca_size_t b3, ca_size_t i3,
516
+ double tol)
517
+ {
518
+ float *q1 = (float *) ptr1, *q2 = (float *) ptr2;
519
+ float *p1 = q1, *p2 = q2;
520
+ boolean8_t *q3 = (boolean8_t *) ptr3;
521
+ boolean8_t *p3 = q3;
522
+ ca_size_t k;
523
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
524
+ (void) tol;
525
+ if ( m ) {
526
+ boolean8_t *pm;
527
+ for (k=0; k<n; k++) {
528
+ pm = m + k;
529
+ if ( ! *pm ) {
530
+ p1 = q1 + k*i1;
531
+ p2 = q2 + k*i2;
532
+ p3 = q3 + k*i3;
533
+ { (*p3) = ( (*p1) == (*p2) ); }
534
+ }
535
+ }
536
+ } else {
537
+ for (k=0; k<n; k++) {
538
+ p1 = q1 + k*i1;
539
+ p2 = q2 + k*i2;
540
+ p3 = q3 + k*i3;
541
+ { (*p3) = ( (*p1) == (*p2) ); }
542
+ }
543
+ }
544
+ }
545
+
546
+ static void
547
+ ca_bincmp_eq_float64_t (ca_size_t n, boolean8_t *m,
548
+ char *ptr1, ca_size_t b1, ca_size_t i1,
549
+ char *ptr2, ca_size_t b2, ca_size_t i2,
550
+ char *ptr3, ca_size_t b3, ca_size_t i3,
551
+ double tol)
552
+ {
553
+ double *q1 = (double *) ptr1, *q2 = (double *) ptr2;
554
+ double *p1 = q1, *p2 = q2;
555
+ boolean8_t *q3 = (boolean8_t *) ptr3;
556
+ boolean8_t *p3 = q3;
557
+ ca_size_t k;
558
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
559
+ (void) tol;
560
+ if ( m ) {
561
+ boolean8_t *pm;
562
+ for (k=0; k<n; k++) {
563
+ pm = m + k;
564
+ if ( ! *pm ) {
565
+ p1 = q1 + k*i1;
566
+ p2 = q2 + k*i2;
567
+ p3 = q3 + k*i3;
568
+ { (*p3) = ( (*p1) == (*p2) ); }
569
+ }
570
+ }
571
+ } else {
572
+ for (k=0; k<n; k++) {
573
+ p1 = q1 + k*i1;
574
+ p2 = q2 + k*i2;
575
+ p3 = q3 + k*i3;
576
+ { (*p3) = ( (*p1) == (*p2) ); }
577
+ }
578
+ }
579
+ }
580
+
581
+ static void
582
+ ca_bincmp_eq_VALUE (ca_size_t n, boolean8_t *m,
583
+ char *ptr1, ca_size_t b1, ca_size_t i1,
584
+ char *ptr2, ca_size_t b2, ca_size_t i2,
585
+ char *ptr3, ca_size_t b3, ca_size_t i3,
586
+ double tol)
587
+ {
588
+ VALUE *q1 = (VALUE *) ptr1, *q2 = (VALUE *) ptr2;
589
+ VALUE *p1 = q1, *p2 = q2;
590
+ boolean8_t *q3 = (boolean8_t *) ptr3;
591
+ boolean8_t *p3 = q3;
592
+ ca_size_t k;
593
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
594
+ (void) tol;
595
+ if ( m ) {
596
+ boolean8_t *pm;
597
+ for (k=0; k<n; k++) {
598
+ pm = m + k;
599
+ if ( ! *pm ) {
600
+ p1 = q1 + k*i1;
601
+ p2 = q2 + k*i2;
602
+ p3 = q3 + k*i3;
603
+ { (*p3) = RTEST(rb_funcall((*p1), rb_intern("=="), 1, (*p2))) ? 1 : 0; }
604
+ }
605
+ }
606
+ } else {
607
+ for (k=0; k<n; k++) {
608
+ p1 = q1 + k*i1;
609
+ p2 = q2 + k*i2;
610
+ p3 = q3 + k*i3;
611
+ { (*p3) = RTEST(rb_funcall((*p1), rb_intern("=="), 1, (*p2))) ? 1 : 0; }
612
+ }
613
+ }
614
+ }
615
+
616
+ static void
617
+ ca_bincmp_eq_cmplx64_t (ca_size_t n, boolean8_t *m,
618
+ char *ptr1, ca_size_t b1, ca_size_t i1,
619
+ char *ptr2, ca_size_t b2, ca_size_t i2,
620
+ char *ptr3, ca_size_t b3, ca_size_t i3,
621
+ double tol)
622
+ {
623
+ cmplx64_t *q1 = (cmplx64_t *) ptr1, *q2 = (cmplx64_t *) ptr2;
624
+ cmplx64_t *p1 = q1, *p2 = q2;
625
+ boolean8_t *q3 = (boolean8_t *) ptr3;
626
+ boolean8_t *p3 = q3;
627
+ ca_size_t k;
628
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
629
+ (void) tol;
630
+ if ( m ) {
631
+ boolean8_t *pm;
632
+ for (k=0; k<n; k++) {
633
+ pm = m + k;
634
+ if ( ! *pm ) {
635
+ p1 = q1 + k*i1;
636
+ p2 = q2 + k*i2;
637
+ p3 = q3 + k*i3;
638
+ { (*p3) = (*p1) == (*p2); }
639
+ }
640
+ }
641
+ } else {
642
+ for (k=0; k<n; k++) {
643
+ p1 = q1 + k*i1;
644
+ p2 = q2 + k*i2;
645
+ p3 = q3 + k*i3;
646
+ { (*p3) = (*p1) == (*p2); }
647
+ }
648
+ }
649
+ }
650
+
651
+ static void
652
+ ca_bincmp_eq_cmplx128_t (ca_size_t n, boolean8_t *m,
653
+ char *ptr1, ca_size_t b1, ca_size_t i1,
654
+ char *ptr2, ca_size_t b2, ca_size_t i2,
655
+ char *ptr3, ca_size_t b3, ca_size_t i3,
656
+ double tol)
657
+ {
658
+ cmplx128_t *q1 = (cmplx128_t *) ptr1, *q2 = (cmplx128_t *) ptr2;
659
+ cmplx128_t *p1 = q1, *p2 = q2;
660
+ boolean8_t *q3 = (boolean8_t *) ptr3;
661
+ boolean8_t *p3 = q3;
662
+ ca_size_t k;
663
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
664
+ (void) tol;
665
+ if ( m ) {
666
+ boolean8_t *pm;
667
+ for (k=0; k<n; k++) {
668
+ pm = m + k;
669
+ if ( ! *pm ) {
670
+ p1 = q1 + k*i1;
671
+ p2 = q2 + k*i2;
672
+ p3 = q3 + k*i3;
673
+ { (*p3) = (*p1) == (*p2); }
674
+ }
675
+ }
676
+ } else {
677
+ for (k=0; k<n; k++) {
678
+ p1 = q1 + k*i1;
679
+ p2 = q2 + k*i2;
680
+ p3 = q3 + k*i3;
681
+ { (*p3) = (*p1) == (*p2); }
682
+ }
683
+ }
684
+ }
685
+
686
+ ca_bincmp_func_t
687
+ ca_bincmp_eq[CA_NTYPE] = {
688
+ ca_bincmp_eq_fixlen,
689
+ ca_bincmp_eq_boolean8_t,
690
+ ca_bincmp_eq_int8_t,
691
+ ca_bincmp_eq_uint8_t,
692
+ ca_bincmp_eq_int16_t,
693
+ ca_bincmp_eq_uint16_t,
694
+ ca_bincmp_eq_int32_t,
695
+ ca_bincmp_eq_uint32_t,
696
+ ca_bincmp_eq_int64_t,
697
+ ca_bincmp_eq_uint64_t,
698
+ ca_bincmp_eq_float32_t,
699
+ ca_bincmp_eq_float64_t,
700
+ ca_bincmp_not_implement,
701
+ ca_bincmp_eq_cmplx64_t,
702
+ ca_bincmp_eq_cmplx128_t,
703
+ ca_bincmp_not_implement,
704
+ ca_bincmp_eq_VALUE,
705
+ };
706
+
707
+ VALUE rb_ca_eq (VALUE self, VALUE other)
708
+ {
709
+ if ( ! rb_ca_test_castable(other) ) {
710
+ return rb_ca_binop_pass_to_other(self, other, rb_intern("eq"));
711
+ }
712
+ return rb_ca_call_bincmp(self, other, ca_bincmp_eq, 0.0);
713
+ }
714
+
715
+ /* ===== bincmp ne ============================================ */
716
+
717
+ static void
718
+ ca_bincmp_ne_fixlen (ca_size_t n, boolean8_t *m,
719
+ char *ptr1, ca_size_t b1, ca_size_t i1,
720
+ char *ptr2, ca_size_t b2, ca_size_t i2,
721
+ char *ptr3, ca_size_t b3, ca_size_t i3,
722
+ double tol)
723
+ {
724
+ char *q1 = ptr1, *q2 = ptr2;
725
+ char *p1 = q1, *p2 = q2;
726
+ boolean8_t *q3 = (boolean8_t *) ptr3;
727
+ boolean8_t *p3 = q3;
728
+ ca_size_t s1 = b1*i1, s2 = b2*i2, s3 = b3*i3;
729
+ ca_size_t k;
730
+ (void) tol;
731
+ if ( m ) {
732
+ boolean8_t *pm;
733
+ for (k=0; k<n; k++) {
734
+ pm = m + k;
735
+ if ( ! *pm ) {
736
+ p1 = q1 + k*s1;
737
+ p2 = q2 + k*s2;
738
+ p3 = q3 + k*s3;
739
+ { (*p3) = ( b1 != b2 || memcmp(p1, p2, b1) ); }
740
+ }
741
+ }
742
+ } else {
743
+ for (k=0; k<n; k++) {
744
+ p1 = q1 + k*s1;
745
+ p2 = q2 + k*s2;
746
+ p3 = q3 + k*s3;
747
+ { (*p3) = ( b1 != b2 || memcmp(p1, p2, b1) ); }
748
+ }
749
+ }
750
+ }
751
+
752
+ static void
753
+ ca_bincmp_ne_boolean8_t (ca_size_t n, boolean8_t *m,
754
+ char *ptr1, ca_size_t b1, ca_size_t i1,
755
+ char *ptr2, ca_size_t b2, ca_size_t i2,
756
+ char *ptr3, ca_size_t b3, ca_size_t i3,
757
+ double tol)
758
+ {
759
+ boolean8_t *q1 = (boolean8_t *) ptr1, *q2 = (boolean8_t *) ptr2;
760
+ boolean8_t *p1 = q1, *p2 = q2;
761
+ boolean8_t *q3 = (boolean8_t *) ptr3;
762
+ boolean8_t *p3 = q3;
763
+ ca_size_t k;
764
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
765
+ (void) tol;
766
+ if ( m ) {
767
+ boolean8_t *pm;
768
+ for (k=0; k<n; k++) {
769
+ pm = m + k;
770
+ if ( ! *pm ) {
771
+ p1 = q1 + k*i1;
772
+ p2 = q2 + k*i2;
773
+ p3 = q3 + k*i3;
774
+ { (*p3) = ( (*p1) != (*p2) ); }
775
+ }
776
+ }
777
+ } else {
778
+ for (k=0; k<n; k++) {
779
+ p1 = q1 + k*i1;
780
+ p2 = q2 + k*i2;
781
+ p3 = q3 + k*i3;
782
+ { (*p3) = ( (*p1) != (*p2) ); }
783
+ }
784
+ }
785
+ }
786
+
787
+ static void
788
+ ca_bincmp_ne_int8_t (ca_size_t n, boolean8_t *m,
789
+ char *ptr1, ca_size_t b1, ca_size_t i1,
790
+ char *ptr2, ca_size_t b2, ca_size_t i2,
791
+ char *ptr3, ca_size_t b3, ca_size_t i3,
792
+ double tol)
793
+ {
794
+ int8_t *q1 = (int8_t *) ptr1, *q2 = (int8_t *) ptr2;
795
+ int8_t *p1 = q1, *p2 = q2;
796
+ boolean8_t *q3 = (boolean8_t *) ptr3;
797
+ boolean8_t *p3 = q3;
798
+ ca_size_t k;
799
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
800
+ (void) tol;
801
+ if ( m ) {
802
+ boolean8_t *pm;
803
+ for (k=0; k<n; k++) {
804
+ pm = m + k;
805
+ if ( ! *pm ) {
806
+ p1 = q1 + k*i1;
807
+ p2 = q2 + k*i2;
808
+ p3 = q3 + k*i3;
809
+ { (*p3) = ( (*p1) != (*p2) ); }
810
+ }
811
+ }
812
+ } else {
813
+ for (k=0; k<n; k++) {
814
+ p1 = q1 + k*i1;
815
+ p2 = q2 + k*i2;
816
+ p3 = q3 + k*i3;
817
+ { (*p3) = ( (*p1) != (*p2) ); }
818
+ }
819
+ }
820
+ }
821
+
822
+ static void
823
+ ca_bincmp_ne_uint8_t (ca_size_t n, boolean8_t *m,
824
+ char *ptr1, ca_size_t b1, ca_size_t i1,
825
+ char *ptr2, ca_size_t b2, ca_size_t i2,
826
+ char *ptr3, ca_size_t b3, ca_size_t i3,
827
+ double tol)
828
+ {
829
+ uint8_t *q1 = (uint8_t *) ptr1, *q2 = (uint8_t *) ptr2;
830
+ uint8_t *p1 = q1, *p2 = q2;
831
+ boolean8_t *q3 = (boolean8_t *) ptr3;
832
+ boolean8_t *p3 = q3;
833
+ ca_size_t k;
834
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
835
+ (void) tol;
836
+ if ( m ) {
837
+ boolean8_t *pm;
838
+ for (k=0; k<n; k++) {
839
+ pm = m + k;
840
+ if ( ! *pm ) {
841
+ p1 = q1 + k*i1;
842
+ p2 = q2 + k*i2;
843
+ p3 = q3 + k*i3;
844
+ { (*p3) = ( (*p1) != (*p2) ); }
845
+ }
846
+ }
847
+ } else {
848
+ for (k=0; k<n; k++) {
849
+ p1 = q1 + k*i1;
850
+ p2 = q2 + k*i2;
851
+ p3 = q3 + k*i3;
852
+ { (*p3) = ( (*p1) != (*p2) ); }
853
+ }
854
+ }
855
+ }
856
+
857
+ static void
858
+ ca_bincmp_ne_int16_t (ca_size_t n, boolean8_t *m,
859
+ char *ptr1, ca_size_t b1, ca_size_t i1,
860
+ char *ptr2, ca_size_t b2, ca_size_t i2,
861
+ char *ptr3, ca_size_t b3, ca_size_t i3,
862
+ double tol)
863
+ {
864
+ int16_t *q1 = (int16_t *) ptr1, *q2 = (int16_t *) ptr2;
865
+ int16_t *p1 = q1, *p2 = q2;
866
+ boolean8_t *q3 = (boolean8_t *) ptr3;
867
+ boolean8_t *p3 = q3;
868
+ ca_size_t k;
869
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
870
+ (void) tol;
871
+ if ( m ) {
872
+ boolean8_t *pm;
873
+ for (k=0; k<n; k++) {
874
+ pm = m + k;
875
+ if ( ! *pm ) {
876
+ p1 = q1 + k*i1;
877
+ p2 = q2 + k*i2;
878
+ p3 = q3 + k*i3;
879
+ { (*p3) = ( (*p1) != (*p2) ); }
880
+ }
881
+ }
882
+ } else {
883
+ for (k=0; k<n; k++) {
884
+ p1 = q1 + k*i1;
885
+ p2 = q2 + k*i2;
886
+ p3 = q3 + k*i3;
887
+ { (*p3) = ( (*p1) != (*p2) ); }
888
+ }
889
+ }
890
+ }
891
+
892
+ static void
893
+ ca_bincmp_ne_uint16_t (ca_size_t n, boolean8_t *m,
894
+ char *ptr1, ca_size_t b1, ca_size_t i1,
895
+ char *ptr2, ca_size_t b2, ca_size_t i2,
896
+ char *ptr3, ca_size_t b3, ca_size_t i3,
897
+ double tol)
898
+ {
899
+ uint16_t *q1 = (uint16_t *) ptr1, *q2 = (uint16_t *) ptr2;
900
+ uint16_t *p1 = q1, *p2 = q2;
901
+ boolean8_t *q3 = (boolean8_t *) ptr3;
902
+ boolean8_t *p3 = q3;
903
+ ca_size_t k;
904
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
905
+ (void) tol;
906
+ if ( m ) {
907
+ boolean8_t *pm;
908
+ for (k=0; k<n; k++) {
909
+ pm = m + k;
910
+ if ( ! *pm ) {
911
+ p1 = q1 + k*i1;
912
+ p2 = q2 + k*i2;
913
+ p3 = q3 + k*i3;
914
+ { (*p3) = ( (*p1) != (*p2) ); }
915
+ }
916
+ }
917
+ } else {
918
+ for (k=0; k<n; k++) {
919
+ p1 = q1 + k*i1;
920
+ p2 = q2 + k*i2;
921
+ p3 = q3 + k*i3;
922
+ { (*p3) = ( (*p1) != (*p2) ); }
923
+ }
924
+ }
925
+ }
926
+
927
+ static void
928
+ ca_bincmp_ne_int32_t (ca_size_t n, boolean8_t *m,
929
+ char *ptr1, ca_size_t b1, ca_size_t i1,
930
+ char *ptr2, ca_size_t b2, ca_size_t i2,
931
+ char *ptr3, ca_size_t b3, ca_size_t i3,
932
+ double tol)
933
+ {
934
+ int32_t *q1 = (int32_t *) ptr1, *q2 = (int32_t *) ptr2;
935
+ int32_t *p1 = q1, *p2 = q2;
936
+ boolean8_t *q3 = (boolean8_t *) ptr3;
937
+ boolean8_t *p3 = q3;
938
+ ca_size_t k;
939
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
940
+ (void) tol;
941
+ if ( m ) {
942
+ boolean8_t *pm;
943
+ for (k=0; k<n; k++) {
944
+ pm = m + k;
945
+ if ( ! *pm ) {
946
+ p1 = q1 + k*i1;
947
+ p2 = q2 + k*i2;
948
+ p3 = q3 + k*i3;
949
+ { (*p3) = ( (*p1) != (*p2) ); }
950
+ }
951
+ }
952
+ } else {
953
+ for (k=0; k<n; k++) {
954
+ p1 = q1 + k*i1;
955
+ p2 = q2 + k*i2;
956
+ p3 = q3 + k*i3;
957
+ { (*p3) = ( (*p1) != (*p2) ); }
958
+ }
959
+ }
960
+ }
961
+
962
+ static void
963
+ ca_bincmp_ne_uint32_t (ca_size_t n, boolean8_t *m,
964
+ char *ptr1, ca_size_t b1, ca_size_t i1,
965
+ char *ptr2, ca_size_t b2, ca_size_t i2,
966
+ char *ptr3, ca_size_t b3, ca_size_t i3,
967
+ double tol)
968
+ {
969
+ uint32_t *q1 = (uint32_t *) ptr1, *q2 = (uint32_t *) ptr2;
970
+ uint32_t *p1 = q1, *p2 = q2;
971
+ boolean8_t *q3 = (boolean8_t *) ptr3;
972
+ boolean8_t *p3 = q3;
973
+ ca_size_t k;
974
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
975
+ (void) tol;
976
+ if ( m ) {
977
+ boolean8_t *pm;
978
+ for (k=0; k<n; k++) {
979
+ pm = m + k;
980
+ if ( ! *pm ) {
981
+ p1 = q1 + k*i1;
982
+ p2 = q2 + k*i2;
983
+ p3 = q3 + k*i3;
984
+ { (*p3) = ( (*p1) != (*p2) ); }
985
+ }
986
+ }
987
+ } else {
988
+ for (k=0; k<n; k++) {
989
+ p1 = q1 + k*i1;
990
+ p2 = q2 + k*i2;
991
+ p3 = q3 + k*i3;
992
+ { (*p3) = ( (*p1) != (*p2) ); }
993
+ }
994
+ }
995
+ }
996
+
997
+ static void
998
+ ca_bincmp_ne_int64_t (ca_size_t n, boolean8_t *m,
999
+ char *ptr1, ca_size_t b1, ca_size_t i1,
1000
+ char *ptr2, ca_size_t b2, ca_size_t i2,
1001
+ char *ptr3, ca_size_t b3, ca_size_t i3,
1002
+ double tol)
1003
+ {
1004
+ int64_t *q1 = (int64_t *) ptr1, *q2 = (int64_t *) ptr2;
1005
+ int64_t *p1 = q1, *p2 = q2;
1006
+ boolean8_t *q3 = (boolean8_t *) ptr3;
1007
+ boolean8_t *p3 = q3;
1008
+ ca_size_t k;
1009
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
1010
+ (void) tol;
1011
+ if ( m ) {
1012
+ boolean8_t *pm;
1013
+ for (k=0; k<n; k++) {
1014
+ pm = m + k;
1015
+ if ( ! *pm ) {
1016
+ p1 = q1 + k*i1;
1017
+ p2 = q2 + k*i2;
1018
+ p3 = q3 + k*i3;
1019
+ { (*p3) = ( (*p1) != (*p2) ); }
1020
+ }
1021
+ }
1022
+ } else {
1023
+ for (k=0; k<n; k++) {
1024
+ p1 = q1 + k*i1;
1025
+ p2 = q2 + k*i2;
1026
+ p3 = q3 + k*i3;
1027
+ { (*p3) = ( (*p1) != (*p2) ); }
1028
+ }
1029
+ }
1030
+ }
1031
+
1032
+ static void
1033
+ ca_bincmp_ne_uint64_t (ca_size_t n, boolean8_t *m,
1034
+ char *ptr1, ca_size_t b1, ca_size_t i1,
1035
+ char *ptr2, ca_size_t b2, ca_size_t i2,
1036
+ char *ptr3, ca_size_t b3, ca_size_t i3,
1037
+ double tol)
1038
+ {
1039
+ uint64_t *q1 = (uint64_t *) ptr1, *q2 = (uint64_t *) ptr2;
1040
+ uint64_t *p1 = q1, *p2 = q2;
1041
+ boolean8_t *q3 = (boolean8_t *) ptr3;
1042
+ boolean8_t *p3 = q3;
1043
+ ca_size_t k;
1044
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
1045
+ (void) tol;
1046
+ if ( m ) {
1047
+ boolean8_t *pm;
1048
+ for (k=0; k<n; k++) {
1049
+ pm = m + k;
1050
+ if ( ! *pm ) {
1051
+ p1 = q1 + k*i1;
1052
+ p2 = q2 + k*i2;
1053
+ p3 = q3 + k*i3;
1054
+ { (*p3) = ( (*p1) != (*p2) ); }
1055
+ }
1056
+ }
1057
+ } else {
1058
+ for (k=0; k<n; k++) {
1059
+ p1 = q1 + k*i1;
1060
+ p2 = q2 + k*i2;
1061
+ p3 = q3 + k*i3;
1062
+ { (*p3) = ( (*p1) != (*p2) ); }
1063
+ }
1064
+ }
1065
+ }
1066
+
1067
+ static void
1068
+ ca_bincmp_ne_float32_t (ca_size_t n, boolean8_t *m,
1069
+ char *ptr1, ca_size_t b1, ca_size_t i1,
1070
+ char *ptr2, ca_size_t b2, ca_size_t i2,
1071
+ char *ptr3, ca_size_t b3, ca_size_t i3,
1072
+ double tol)
1073
+ {
1074
+ float *q1 = (float *) ptr1, *q2 = (float *) ptr2;
1075
+ float *p1 = q1, *p2 = q2;
1076
+ boolean8_t *q3 = (boolean8_t *) ptr3;
1077
+ boolean8_t *p3 = q3;
1078
+ ca_size_t k;
1079
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
1080
+ (void) tol;
1081
+ if ( m ) {
1082
+ boolean8_t *pm;
1083
+ for (k=0; k<n; k++) {
1084
+ pm = m + k;
1085
+ if ( ! *pm ) {
1086
+ p1 = q1 + k*i1;
1087
+ p2 = q2 + k*i2;
1088
+ p3 = q3 + k*i3;
1089
+ { (*p3) = ( (*p1) != (*p2) ); }
1090
+ }
1091
+ }
1092
+ } else {
1093
+ for (k=0; k<n; k++) {
1094
+ p1 = q1 + k*i1;
1095
+ p2 = q2 + k*i2;
1096
+ p3 = q3 + k*i3;
1097
+ { (*p3) = ( (*p1) != (*p2) ); }
1098
+ }
1099
+ }
1100
+ }
1101
+
1102
+ static void
1103
+ ca_bincmp_ne_float64_t (ca_size_t n, boolean8_t *m,
1104
+ char *ptr1, ca_size_t b1, ca_size_t i1,
1105
+ char *ptr2, ca_size_t b2, ca_size_t i2,
1106
+ char *ptr3, ca_size_t b3, ca_size_t i3,
1107
+ double tol)
1108
+ {
1109
+ double *q1 = (double *) ptr1, *q2 = (double *) ptr2;
1110
+ double *p1 = q1, *p2 = q2;
1111
+ boolean8_t *q3 = (boolean8_t *) ptr3;
1112
+ boolean8_t *p3 = q3;
1113
+ ca_size_t k;
1114
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
1115
+ (void) tol;
1116
+ if ( m ) {
1117
+ boolean8_t *pm;
1118
+ for (k=0; k<n; k++) {
1119
+ pm = m + k;
1120
+ if ( ! *pm ) {
1121
+ p1 = q1 + k*i1;
1122
+ p2 = q2 + k*i2;
1123
+ p3 = q3 + k*i3;
1124
+ { (*p3) = ( (*p1) != (*p2) ); }
1125
+ }
1126
+ }
1127
+ } else {
1128
+ for (k=0; k<n; k++) {
1129
+ p1 = q1 + k*i1;
1130
+ p2 = q2 + k*i2;
1131
+ p3 = q3 + k*i3;
1132
+ { (*p3) = ( (*p1) != (*p2) ); }
1133
+ }
1134
+ }
1135
+ }
1136
+
1137
+ static void
1138
+ ca_bincmp_ne_VALUE (ca_size_t n, boolean8_t *m,
1139
+ char *ptr1, ca_size_t b1, ca_size_t i1,
1140
+ char *ptr2, ca_size_t b2, ca_size_t i2,
1141
+ char *ptr3, ca_size_t b3, ca_size_t i3,
1142
+ double tol)
1143
+ {
1144
+ VALUE *q1 = (VALUE *) ptr1, *q2 = (VALUE *) ptr2;
1145
+ VALUE *p1 = q1, *p2 = q2;
1146
+ boolean8_t *q3 = (boolean8_t *) ptr3;
1147
+ boolean8_t *p3 = q3;
1148
+ ca_size_t k;
1149
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
1150
+ (void) tol;
1151
+ if ( m ) {
1152
+ boolean8_t *pm;
1153
+ for (k=0; k<n; k++) {
1154
+ pm = m + k;
1155
+ if ( ! *pm ) {
1156
+ p1 = q1 + k*i1;
1157
+ p2 = q2 + k*i2;
1158
+ p3 = q3 + k*i3;
1159
+ { (*p3) = RTEST(rb_funcall((*p1), rb_intern("=="), 1, (*p2))) ? 0 : 1; }
1160
+ }
1161
+ }
1162
+ } else {
1163
+ for (k=0; k<n; k++) {
1164
+ p1 = q1 + k*i1;
1165
+ p2 = q2 + k*i2;
1166
+ p3 = q3 + k*i3;
1167
+ { (*p3) = RTEST(rb_funcall((*p1), rb_intern("=="), 1, (*p2))) ? 0 : 1; }
1168
+ }
1169
+ }
1170
+ }
1171
+
1172
+ static void
1173
+ ca_bincmp_ne_cmplx64_t (ca_size_t n, boolean8_t *m,
1174
+ char *ptr1, ca_size_t b1, ca_size_t i1,
1175
+ char *ptr2, ca_size_t b2, ca_size_t i2,
1176
+ char *ptr3, ca_size_t b3, ca_size_t i3,
1177
+ double tol)
1178
+ {
1179
+ cmplx64_t *q1 = (cmplx64_t *) ptr1, *q2 = (cmplx64_t *) ptr2;
1180
+ cmplx64_t *p1 = q1, *p2 = q2;
1181
+ boolean8_t *q3 = (boolean8_t *) ptr3;
1182
+ boolean8_t *p3 = q3;
1183
+ ca_size_t k;
1184
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
1185
+ (void) tol;
1186
+ if ( m ) {
1187
+ boolean8_t *pm;
1188
+ for (k=0; k<n; k++) {
1189
+ pm = m + k;
1190
+ if ( ! *pm ) {
1191
+ p1 = q1 + k*i1;
1192
+ p2 = q2 + k*i2;
1193
+ p3 = q3 + k*i3;
1194
+ { (*p3) = (*p1) != (*p2); }
1195
+ }
1196
+ }
1197
+ } else {
1198
+ for (k=0; k<n; k++) {
1199
+ p1 = q1 + k*i1;
1200
+ p2 = q2 + k*i2;
1201
+ p3 = q3 + k*i3;
1202
+ { (*p3) = (*p1) != (*p2); }
1203
+ }
1204
+ }
1205
+ }
1206
+
1207
+ static void
1208
+ ca_bincmp_ne_cmplx128_t (ca_size_t n, boolean8_t *m,
1209
+ char *ptr1, ca_size_t b1, ca_size_t i1,
1210
+ char *ptr2, ca_size_t b2, ca_size_t i2,
1211
+ char *ptr3, ca_size_t b3, ca_size_t i3,
1212
+ double tol)
1213
+ {
1214
+ cmplx128_t *q1 = (cmplx128_t *) ptr1, *q2 = (cmplx128_t *) ptr2;
1215
+ cmplx128_t *p1 = q1, *p2 = q2;
1216
+ boolean8_t *q3 = (boolean8_t *) ptr3;
1217
+ boolean8_t *p3 = q3;
1218
+ ca_size_t k;
1219
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
1220
+ (void) tol;
1221
+ if ( m ) {
1222
+ boolean8_t *pm;
1223
+ for (k=0; k<n; k++) {
1224
+ pm = m + k;
1225
+ if ( ! *pm ) {
1226
+ p1 = q1 + k*i1;
1227
+ p2 = q2 + k*i2;
1228
+ p3 = q3 + k*i3;
1229
+ { (*p3) = (*p1) != (*p2); }
1230
+ }
1231
+ }
1232
+ } else {
1233
+ for (k=0; k<n; k++) {
1234
+ p1 = q1 + k*i1;
1235
+ p2 = q2 + k*i2;
1236
+ p3 = q3 + k*i3;
1237
+ { (*p3) = (*p1) != (*p2); }
1238
+ }
1239
+ }
1240
+ }
1241
+
1242
+ ca_bincmp_func_t
1243
+ ca_bincmp_ne[CA_NTYPE] = {
1244
+ ca_bincmp_ne_fixlen,
1245
+ ca_bincmp_ne_boolean8_t,
1246
+ ca_bincmp_ne_int8_t,
1247
+ ca_bincmp_ne_uint8_t,
1248
+ ca_bincmp_ne_int16_t,
1249
+ ca_bincmp_ne_uint16_t,
1250
+ ca_bincmp_ne_int32_t,
1251
+ ca_bincmp_ne_uint32_t,
1252
+ ca_bincmp_ne_int64_t,
1253
+ ca_bincmp_ne_uint64_t,
1254
+ ca_bincmp_ne_float32_t,
1255
+ ca_bincmp_ne_float64_t,
1256
+ ca_bincmp_not_implement,
1257
+ ca_bincmp_ne_cmplx64_t,
1258
+ ca_bincmp_ne_cmplx128_t,
1259
+ ca_bincmp_not_implement,
1260
+ ca_bincmp_ne_VALUE,
1261
+ };
1262
+
1263
+ VALUE rb_ca_ne (VALUE self, VALUE other)
1264
+ {
1265
+ if ( ! rb_ca_test_castable(other) ) {
1266
+ return rb_ca_binop_pass_to_other(self, other, rb_intern("ne"));
1267
+ }
1268
+ return rb_ca_call_bincmp(self, other, ca_bincmp_ne, 0.0);
1269
+ }
1270
+
1271
+ /* ===== bincmp gt ============================================ */
1272
+
1273
+ static void
1274
+ ca_bincmp_gt_fixlen (ca_size_t n, boolean8_t *m,
1275
+ char *ptr1, ca_size_t b1, ca_size_t i1,
1276
+ char *ptr2, ca_size_t b2, ca_size_t i2,
1277
+ char *ptr3, ca_size_t b3, ca_size_t i3,
1278
+ double tol)
1279
+ {
1280
+ char *q1 = ptr1, *q2 = ptr2;
1281
+ char *p1 = q1, *p2 = q2;
1282
+ boolean8_t *q3 = (boolean8_t *) ptr3;
1283
+ boolean8_t *p3 = q3;
1284
+ ca_size_t s1 = b1*i1, s2 = b2*i2, s3 = b3*i3;
1285
+ ca_size_t k;
1286
+ (void) tol;
1287
+ if ( m ) {
1288
+ boolean8_t *pm;
1289
+ for (k=0; k<n; k++) {
1290
+ pm = m + k;
1291
+ if ( ! *pm ) {
1292
+ p1 = q1 + k*s1;
1293
+ p2 = q2 + k*s2;
1294
+ p3 = q3 + k*s3;
1295
+ {
1296
+ int cmp = memcmp(p1, p2, b1 < b2 ? b1 : b2);
1297
+ (*p3) = ( cmp > 0 || ( cmp == 0 && b1 > b2 ) );
1298
+ }
1299
+ }
1300
+ }
1301
+ } else {
1302
+ for (k=0; k<n; k++) {
1303
+ p1 = q1 + k*s1;
1304
+ p2 = q2 + k*s2;
1305
+ p3 = q3 + k*s3;
1306
+ {
1307
+ int cmp = memcmp(p1, p2, b1 < b2 ? b1 : b2);
1308
+ (*p3) = ( cmp > 0 || ( cmp == 0 && b1 > b2 ) );
1309
+ }
1310
+ }
1311
+ }
1312
+ }
1313
+
1314
+ static void
1315
+ ca_bincmp_gt_boolean8_t (ca_size_t n, boolean8_t *m,
1316
+ char *ptr1, ca_size_t b1, ca_size_t i1,
1317
+ char *ptr2, ca_size_t b2, ca_size_t i2,
1318
+ char *ptr3, ca_size_t b3, ca_size_t i3,
1319
+ double tol)
1320
+ {
1321
+ boolean8_t *q1 = (boolean8_t *) ptr1, *q2 = (boolean8_t *) ptr2;
1322
+ boolean8_t *p1 = q1, *p2 = q2;
1323
+ boolean8_t *q3 = (boolean8_t *) ptr3;
1324
+ boolean8_t *p3 = q3;
1325
+ ca_size_t k;
1326
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
1327
+ (void) tol;
1328
+ if ( m ) {
1329
+ boolean8_t *pm;
1330
+ for (k=0; k<n; k++) {
1331
+ pm = m + k;
1332
+ if ( ! *pm ) {
1333
+ p1 = q1 + k*i1;
1334
+ p2 = q2 + k*i2;
1335
+ p3 = q3 + k*i3;
1336
+ { (*p3) = ( (*p1) > (*p2) ); }
1337
+ }
1338
+ }
1339
+ } else {
1340
+ for (k=0; k<n; k++) {
1341
+ p1 = q1 + k*i1;
1342
+ p2 = q2 + k*i2;
1343
+ p3 = q3 + k*i3;
1344
+ { (*p3) = ( (*p1) > (*p2) ); }
1345
+ }
1346
+ }
1347
+ }
1348
+
1349
+ static void
1350
+ ca_bincmp_gt_int8_t (ca_size_t n, boolean8_t *m,
1351
+ char *ptr1, ca_size_t b1, ca_size_t i1,
1352
+ char *ptr2, ca_size_t b2, ca_size_t i2,
1353
+ char *ptr3, ca_size_t b3, ca_size_t i3,
1354
+ double tol)
1355
+ {
1356
+ int8_t *q1 = (int8_t *) ptr1, *q2 = (int8_t *) ptr2;
1357
+ int8_t *p1 = q1, *p2 = q2;
1358
+ boolean8_t *q3 = (boolean8_t *) ptr3;
1359
+ boolean8_t *p3 = q3;
1360
+ ca_size_t k;
1361
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
1362
+ (void) tol;
1363
+ if ( m ) {
1364
+ boolean8_t *pm;
1365
+ for (k=0; k<n; k++) {
1366
+ pm = m + k;
1367
+ if ( ! *pm ) {
1368
+ p1 = q1 + k*i1;
1369
+ p2 = q2 + k*i2;
1370
+ p3 = q3 + k*i3;
1371
+ { (*p3) = ( (*p1) > (*p2) ); }
1372
+ }
1373
+ }
1374
+ } else {
1375
+ for (k=0; k<n; k++) {
1376
+ p1 = q1 + k*i1;
1377
+ p2 = q2 + k*i2;
1378
+ p3 = q3 + k*i3;
1379
+ { (*p3) = ( (*p1) > (*p2) ); }
1380
+ }
1381
+ }
1382
+ }
1383
+
1384
+ static void
1385
+ ca_bincmp_gt_uint8_t (ca_size_t n, boolean8_t *m,
1386
+ char *ptr1, ca_size_t b1, ca_size_t i1,
1387
+ char *ptr2, ca_size_t b2, ca_size_t i2,
1388
+ char *ptr3, ca_size_t b3, ca_size_t i3,
1389
+ double tol)
1390
+ {
1391
+ uint8_t *q1 = (uint8_t *) ptr1, *q2 = (uint8_t *) ptr2;
1392
+ uint8_t *p1 = q1, *p2 = q2;
1393
+ boolean8_t *q3 = (boolean8_t *) ptr3;
1394
+ boolean8_t *p3 = q3;
1395
+ ca_size_t k;
1396
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
1397
+ (void) tol;
1398
+ if ( m ) {
1399
+ boolean8_t *pm;
1400
+ for (k=0; k<n; k++) {
1401
+ pm = m + k;
1402
+ if ( ! *pm ) {
1403
+ p1 = q1 + k*i1;
1404
+ p2 = q2 + k*i2;
1405
+ p3 = q3 + k*i3;
1406
+ { (*p3) = ( (*p1) > (*p2) ); }
1407
+ }
1408
+ }
1409
+ } else {
1410
+ for (k=0; k<n; k++) {
1411
+ p1 = q1 + k*i1;
1412
+ p2 = q2 + k*i2;
1413
+ p3 = q3 + k*i3;
1414
+ { (*p3) = ( (*p1) > (*p2) ); }
1415
+ }
1416
+ }
1417
+ }
1418
+
1419
+ static void
1420
+ ca_bincmp_gt_int16_t (ca_size_t n, boolean8_t *m,
1421
+ char *ptr1, ca_size_t b1, ca_size_t i1,
1422
+ char *ptr2, ca_size_t b2, ca_size_t i2,
1423
+ char *ptr3, ca_size_t b3, ca_size_t i3,
1424
+ double tol)
1425
+ {
1426
+ int16_t *q1 = (int16_t *) ptr1, *q2 = (int16_t *) ptr2;
1427
+ int16_t *p1 = q1, *p2 = q2;
1428
+ boolean8_t *q3 = (boolean8_t *) ptr3;
1429
+ boolean8_t *p3 = q3;
1430
+ ca_size_t k;
1431
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
1432
+ (void) tol;
1433
+ if ( m ) {
1434
+ boolean8_t *pm;
1435
+ for (k=0; k<n; k++) {
1436
+ pm = m + k;
1437
+ if ( ! *pm ) {
1438
+ p1 = q1 + k*i1;
1439
+ p2 = q2 + k*i2;
1440
+ p3 = q3 + k*i3;
1441
+ { (*p3) = ( (*p1) > (*p2) ); }
1442
+ }
1443
+ }
1444
+ } else {
1445
+ for (k=0; k<n; k++) {
1446
+ p1 = q1 + k*i1;
1447
+ p2 = q2 + k*i2;
1448
+ p3 = q3 + k*i3;
1449
+ { (*p3) = ( (*p1) > (*p2) ); }
1450
+ }
1451
+ }
1452
+ }
1453
+
1454
+ static void
1455
+ ca_bincmp_gt_uint16_t (ca_size_t n, boolean8_t *m,
1456
+ char *ptr1, ca_size_t b1, ca_size_t i1,
1457
+ char *ptr2, ca_size_t b2, ca_size_t i2,
1458
+ char *ptr3, ca_size_t b3, ca_size_t i3,
1459
+ double tol)
1460
+ {
1461
+ uint16_t *q1 = (uint16_t *) ptr1, *q2 = (uint16_t *) ptr2;
1462
+ uint16_t *p1 = q1, *p2 = q2;
1463
+ boolean8_t *q3 = (boolean8_t *) ptr3;
1464
+ boolean8_t *p3 = q3;
1465
+ ca_size_t k;
1466
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
1467
+ (void) tol;
1468
+ if ( m ) {
1469
+ boolean8_t *pm;
1470
+ for (k=0; k<n; k++) {
1471
+ pm = m + k;
1472
+ if ( ! *pm ) {
1473
+ p1 = q1 + k*i1;
1474
+ p2 = q2 + k*i2;
1475
+ p3 = q3 + k*i3;
1476
+ { (*p3) = ( (*p1) > (*p2) ); }
1477
+ }
1478
+ }
1479
+ } else {
1480
+ for (k=0; k<n; k++) {
1481
+ p1 = q1 + k*i1;
1482
+ p2 = q2 + k*i2;
1483
+ p3 = q3 + k*i3;
1484
+ { (*p3) = ( (*p1) > (*p2) ); }
1485
+ }
1486
+ }
1487
+ }
1488
+
1489
+ static void
1490
+ ca_bincmp_gt_int32_t (ca_size_t n, boolean8_t *m,
1491
+ char *ptr1, ca_size_t b1, ca_size_t i1,
1492
+ char *ptr2, ca_size_t b2, ca_size_t i2,
1493
+ char *ptr3, ca_size_t b3, ca_size_t i3,
1494
+ double tol)
1495
+ {
1496
+ int32_t *q1 = (int32_t *) ptr1, *q2 = (int32_t *) ptr2;
1497
+ int32_t *p1 = q1, *p2 = q2;
1498
+ boolean8_t *q3 = (boolean8_t *) ptr3;
1499
+ boolean8_t *p3 = q3;
1500
+ ca_size_t k;
1501
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
1502
+ (void) tol;
1503
+ if ( m ) {
1504
+ boolean8_t *pm;
1505
+ for (k=0; k<n; k++) {
1506
+ pm = m + k;
1507
+ if ( ! *pm ) {
1508
+ p1 = q1 + k*i1;
1509
+ p2 = q2 + k*i2;
1510
+ p3 = q3 + k*i3;
1511
+ { (*p3) = ( (*p1) > (*p2) ); }
1512
+ }
1513
+ }
1514
+ } else {
1515
+ for (k=0; k<n; k++) {
1516
+ p1 = q1 + k*i1;
1517
+ p2 = q2 + k*i2;
1518
+ p3 = q3 + k*i3;
1519
+ { (*p3) = ( (*p1) > (*p2) ); }
1520
+ }
1521
+ }
1522
+ }
1523
+
1524
+ static void
1525
+ ca_bincmp_gt_uint32_t (ca_size_t n, boolean8_t *m,
1526
+ char *ptr1, ca_size_t b1, ca_size_t i1,
1527
+ char *ptr2, ca_size_t b2, ca_size_t i2,
1528
+ char *ptr3, ca_size_t b3, ca_size_t i3,
1529
+ double tol)
1530
+ {
1531
+ uint32_t *q1 = (uint32_t *) ptr1, *q2 = (uint32_t *) ptr2;
1532
+ uint32_t *p1 = q1, *p2 = q2;
1533
+ boolean8_t *q3 = (boolean8_t *) ptr3;
1534
+ boolean8_t *p3 = q3;
1535
+ ca_size_t k;
1536
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
1537
+ (void) tol;
1538
+ if ( m ) {
1539
+ boolean8_t *pm;
1540
+ for (k=0; k<n; k++) {
1541
+ pm = m + k;
1542
+ if ( ! *pm ) {
1543
+ p1 = q1 + k*i1;
1544
+ p2 = q2 + k*i2;
1545
+ p3 = q3 + k*i3;
1546
+ { (*p3) = ( (*p1) > (*p2) ); }
1547
+ }
1548
+ }
1549
+ } else {
1550
+ for (k=0; k<n; k++) {
1551
+ p1 = q1 + k*i1;
1552
+ p2 = q2 + k*i2;
1553
+ p3 = q3 + k*i3;
1554
+ { (*p3) = ( (*p1) > (*p2) ); }
1555
+ }
1556
+ }
1557
+ }
1558
+
1559
+ static void
1560
+ ca_bincmp_gt_int64_t (ca_size_t n, boolean8_t *m,
1561
+ char *ptr1, ca_size_t b1, ca_size_t i1,
1562
+ char *ptr2, ca_size_t b2, ca_size_t i2,
1563
+ char *ptr3, ca_size_t b3, ca_size_t i3,
1564
+ double tol)
1565
+ {
1566
+ int64_t *q1 = (int64_t *) ptr1, *q2 = (int64_t *) ptr2;
1567
+ int64_t *p1 = q1, *p2 = q2;
1568
+ boolean8_t *q3 = (boolean8_t *) ptr3;
1569
+ boolean8_t *p3 = q3;
1570
+ ca_size_t k;
1571
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
1572
+ (void) tol;
1573
+ if ( m ) {
1574
+ boolean8_t *pm;
1575
+ for (k=0; k<n; k++) {
1576
+ pm = m + k;
1577
+ if ( ! *pm ) {
1578
+ p1 = q1 + k*i1;
1579
+ p2 = q2 + k*i2;
1580
+ p3 = q3 + k*i3;
1581
+ { (*p3) = ( (*p1) > (*p2) ); }
1582
+ }
1583
+ }
1584
+ } else {
1585
+ for (k=0; k<n; k++) {
1586
+ p1 = q1 + k*i1;
1587
+ p2 = q2 + k*i2;
1588
+ p3 = q3 + k*i3;
1589
+ { (*p3) = ( (*p1) > (*p2) ); }
1590
+ }
1591
+ }
1592
+ }
1593
+
1594
+ static void
1595
+ ca_bincmp_gt_uint64_t (ca_size_t n, boolean8_t *m,
1596
+ char *ptr1, ca_size_t b1, ca_size_t i1,
1597
+ char *ptr2, ca_size_t b2, ca_size_t i2,
1598
+ char *ptr3, ca_size_t b3, ca_size_t i3,
1599
+ double tol)
1600
+ {
1601
+ uint64_t *q1 = (uint64_t *) ptr1, *q2 = (uint64_t *) ptr2;
1602
+ uint64_t *p1 = q1, *p2 = q2;
1603
+ boolean8_t *q3 = (boolean8_t *) ptr3;
1604
+ boolean8_t *p3 = q3;
1605
+ ca_size_t k;
1606
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
1607
+ (void) tol;
1608
+ if ( m ) {
1609
+ boolean8_t *pm;
1610
+ for (k=0; k<n; k++) {
1611
+ pm = m + k;
1612
+ if ( ! *pm ) {
1613
+ p1 = q1 + k*i1;
1614
+ p2 = q2 + k*i2;
1615
+ p3 = q3 + k*i3;
1616
+ { (*p3) = ( (*p1) > (*p2) ); }
1617
+ }
1618
+ }
1619
+ } else {
1620
+ for (k=0; k<n; k++) {
1621
+ p1 = q1 + k*i1;
1622
+ p2 = q2 + k*i2;
1623
+ p3 = q3 + k*i3;
1624
+ { (*p3) = ( (*p1) > (*p2) ); }
1625
+ }
1626
+ }
1627
+ }
1628
+
1629
+ static void
1630
+ ca_bincmp_gt_float32_t (ca_size_t n, boolean8_t *m,
1631
+ char *ptr1, ca_size_t b1, ca_size_t i1,
1632
+ char *ptr2, ca_size_t b2, ca_size_t i2,
1633
+ char *ptr3, ca_size_t b3, ca_size_t i3,
1634
+ double tol)
1635
+ {
1636
+ float *q1 = (float *) ptr1, *q2 = (float *) ptr2;
1637
+ float *p1 = q1, *p2 = q2;
1638
+ boolean8_t *q3 = (boolean8_t *) ptr3;
1639
+ boolean8_t *p3 = q3;
1640
+ ca_size_t k;
1641
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
1642
+ (void) tol;
1643
+ if ( m ) {
1644
+ boolean8_t *pm;
1645
+ for (k=0; k<n; k++) {
1646
+ pm = m + k;
1647
+ if ( ! *pm ) {
1648
+ p1 = q1 + k*i1;
1649
+ p2 = q2 + k*i2;
1650
+ p3 = q3 + k*i3;
1651
+ { (*p3) = ( (*p1) > (*p2) ); }
1652
+ }
1653
+ }
1654
+ } else {
1655
+ for (k=0; k<n; k++) {
1656
+ p1 = q1 + k*i1;
1657
+ p2 = q2 + k*i2;
1658
+ p3 = q3 + k*i3;
1659
+ { (*p3) = ( (*p1) > (*p2) ); }
1660
+ }
1661
+ }
1662
+ }
1663
+
1664
+ static void
1665
+ ca_bincmp_gt_float64_t (ca_size_t n, boolean8_t *m,
1666
+ char *ptr1, ca_size_t b1, ca_size_t i1,
1667
+ char *ptr2, ca_size_t b2, ca_size_t i2,
1668
+ char *ptr3, ca_size_t b3, ca_size_t i3,
1669
+ double tol)
1670
+ {
1671
+ double *q1 = (double *) ptr1, *q2 = (double *) ptr2;
1672
+ double *p1 = q1, *p2 = q2;
1673
+ boolean8_t *q3 = (boolean8_t *) ptr3;
1674
+ boolean8_t *p3 = q3;
1675
+ ca_size_t k;
1676
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
1677
+ (void) tol;
1678
+ if ( m ) {
1679
+ boolean8_t *pm;
1680
+ for (k=0; k<n; k++) {
1681
+ pm = m + k;
1682
+ if ( ! *pm ) {
1683
+ p1 = q1 + k*i1;
1684
+ p2 = q2 + k*i2;
1685
+ p3 = q3 + k*i3;
1686
+ { (*p3) = ( (*p1) > (*p2) ); }
1687
+ }
1688
+ }
1689
+ } else {
1690
+ for (k=0; k<n; k++) {
1691
+ p1 = q1 + k*i1;
1692
+ p2 = q2 + k*i2;
1693
+ p3 = q3 + k*i3;
1694
+ { (*p3) = ( (*p1) > (*p2) ); }
1695
+ }
1696
+ }
1697
+ }
1698
+
1699
+ static void
1700
+ ca_bincmp_gt_VALUE (ca_size_t n, boolean8_t *m,
1701
+ char *ptr1, ca_size_t b1, ca_size_t i1,
1702
+ char *ptr2, ca_size_t b2, ca_size_t i2,
1703
+ char *ptr3, ca_size_t b3, ca_size_t i3,
1704
+ double tol)
1705
+ {
1706
+ VALUE *q1 = (VALUE *) ptr1, *q2 = (VALUE *) ptr2;
1707
+ VALUE *p1 = q1, *p2 = q2;
1708
+ boolean8_t *q3 = (boolean8_t *) ptr3;
1709
+ boolean8_t *p3 = q3;
1710
+ ca_size_t k;
1711
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
1712
+ (void) tol;
1713
+ if ( m ) {
1714
+ boolean8_t *pm;
1715
+ for (k=0; k<n; k++) {
1716
+ pm = m + k;
1717
+ if ( ! *pm ) {
1718
+ p1 = q1 + k*i1;
1719
+ p2 = q2 + k*i2;
1720
+ p3 = q3 + k*i3;
1721
+ { (*p3) = RTEST(rb_funcall((*p1), rb_intern(">"), 1, (*p2))) ? 1 : 0; }
1722
+ }
1723
+ }
1724
+ } else {
1725
+ for (k=0; k<n; k++) {
1726
+ p1 = q1 + k*i1;
1727
+ p2 = q2 + k*i2;
1728
+ p3 = q3 + k*i3;
1729
+ { (*p3) = RTEST(rb_funcall((*p1), rb_intern(">"), 1, (*p2))) ? 1 : 0; }
1730
+ }
1731
+ }
1732
+ }
1733
+
1734
+ ca_bincmp_func_t
1735
+ ca_bincmp_gt[CA_NTYPE] = {
1736
+ ca_bincmp_gt_fixlen,
1737
+ ca_bincmp_gt_boolean8_t,
1738
+ ca_bincmp_gt_int8_t,
1739
+ ca_bincmp_gt_uint8_t,
1740
+ ca_bincmp_gt_int16_t,
1741
+ ca_bincmp_gt_uint16_t,
1742
+ ca_bincmp_gt_int32_t,
1743
+ ca_bincmp_gt_uint32_t,
1744
+ ca_bincmp_gt_int64_t,
1745
+ ca_bincmp_gt_uint64_t,
1746
+ ca_bincmp_gt_float32_t,
1747
+ ca_bincmp_gt_float64_t,
1748
+ ca_bincmp_not_implement,
1749
+ ca_bincmp_not_implement,
1750
+ ca_bincmp_not_implement,
1751
+ ca_bincmp_not_implement,
1752
+ ca_bincmp_gt_VALUE,
1753
+ };
1754
+
1755
+ VALUE rb_ca_gt (VALUE self, VALUE other)
1756
+ {
1757
+ if ( ! rb_ca_test_castable(other) ) {
1758
+ return rb_ca_binop_pass_to_other(self, other, rb_intern("gt"));
1759
+ }
1760
+ return rb_ca_call_bincmp(self, other, ca_bincmp_gt, 0.0);
1761
+ }
1762
+
1763
+ /* ===== bincmp lt ============================================ */
1764
+
1765
+ static void
1766
+ ca_bincmp_lt_fixlen (ca_size_t n, boolean8_t *m,
1767
+ char *ptr1, ca_size_t b1, ca_size_t i1,
1768
+ char *ptr2, ca_size_t b2, ca_size_t i2,
1769
+ char *ptr3, ca_size_t b3, ca_size_t i3,
1770
+ double tol)
1771
+ {
1772
+ char *q1 = ptr1, *q2 = ptr2;
1773
+ char *p1 = q1, *p2 = q2;
1774
+ boolean8_t *q3 = (boolean8_t *) ptr3;
1775
+ boolean8_t *p3 = q3;
1776
+ ca_size_t s1 = b1*i1, s2 = b2*i2, s3 = b3*i3;
1777
+ ca_size_t k;
1778
+ (void) tol;
1779
+ if ( m ) {
1780
+ boolean8_t *pm;
1781
+ for (k=0; k<n; k++) {
1782
+ pm = m + k;
1783
+ if ( ! *pm ) {
1784
+ p1 = q1 + k*s1;
1785
+ p2 = q2 + k*s2;
1786
+ p3 = q3 + k*s3;
1787
+ {
1788
+ int cmp = memcmp(p1, p2, b1 < b2 ? b1 : b2);
1789
+ (*p3) = ( cmp < 0 || ( cmp == 0 && b1 < b2 ) );
1790
+ }
1791
+ }
1792
+ }
1793
+ } else {
1794
+ for (k=0; k<n; k++) {
1795
+ p1 = q1 + k*s1;
1796
+ p2 = q2 + k*s2;
1797
+ p3 = q3 + k*s3;
1798
+ {
1799
+ int cmp = memcmp(p1, p2, b1 < b2 ? b1 : b2);
1800
+ (*p3) = ( cmp < 0 || ( cmp == 0 && b1 < b2 ) );
1801
+ }
1802
+ }
1803
+ }
1804
+ }
1805
+
1806
+ static void
1807
+ ca_bincmp_lt_boolean8_t (ca_size_t n, boolean8_t *m,
1808
+ char *ptr1, ca_size_t b1, ca_size_t i1,
1809
+ char *ptr2, ca_size_t b2, ca_size_t i2,
1810
+ char *ptr3, ca_size_t b3, ca_size_t i3,
1811
+ double tol)
1812
+ {
1813
+ boolean8_t *q1 = (boolean8_t *) ptr1, *q2 = (boolean8_t *) ptr2;
1814
+ boolean8_t *p1 = q1, *p2 = q2;
1815
+ boolean8_t *q3 = (boolean8_t *) ptr3;
1816
+ boolean8_t *p3 = q3;
1817
+ ca_size_t k;
1818
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
1819
+ (void) tol;
1820
+ if ( m ) {
1821
+ boolean8_t *pm;
1822
+ for (k=0; k<n; k++) {
1823
+ pm = m + k;
1824
+ if ( ! *pm ) {
1825
+ p1 = q1 + k*i1;
1826
+ p2 = q2 + k*i2;
1827
+ p3 = q3 + k*i3;
1828
+ { (*p3) = ( (*p1) < (*p2) ); }
1829
+ }
1830
+ }
1831
+ } else {
1832
+ for (k=0; k<n; k++) {
1833
+ p1 = q1 + k*i1;
1834
+ p2 = q2 + k*i2;
1835
+ p3 = q3 + k*i3;
1836
+ { (*p3) = ( (*p1) < (*p2) ); }
1837
+ }
1838
+ }
1839
+ }
1840
+
1841
+ static void
1842
+ ca_bincmp_lt_int8_t (ca_size_t n, boolean8_t *m,
1843
+ char *ptr1, ca_size_t b1, ca_size_t i1,
1844
+ char *ptr2, ca_size_t b2, ca_size_t i2,
1845
+ char *ptr3, ca_size_t b3, ca_size_t i3,
1846
+ double tol)
1847
+ {
1848
+ int8_t *q1 = (int8_t *) ptr1, *q2 = (int8_t *) ptr2;
1849
+ int8_t *p1 = q1, *p2 = q2;
1850
+ boolean8_t *q3 = (boolean8_t *) ptr3;
1851
+ boolean8_t *p3 = q3;
1852
+ ca_size_t k;
1853
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
1854
+ (void) tol;
1855
+ if ( m ) {
1856
+ boolean8_t *pm;
1857
+ for (k=0; k<n; k++) {
1858
+ pm = m + k;
1859
+ if ( ! *pm ) {
1860
+ p1 = q1 + k*i1;
1861
+ p2 = q2 + k*i2;
1862
+ p3 = q3 + k*i3;
1863
+ { (*p3) = ( (*p1) < (*p2) ); }
1864
+ }
1865
+ }
1866
+ } else {
1867
+ for (k=0; k<n; k++) {
1868
+ p1 = q1 + k*i1;
1869
+ p2 = q2 + k*i2;
1870
+ p3 = q3 + k*i3;
1871
+ { (*p3) = ( (*p1) < (*p2) ); }
1872
+ }
1873
+ }
1874
+ }
1875
+
1876
+ static void
1877
+ ca_bincmp_lt_uint8_t (ca_size_t n, boolean8_t *m,
1878
+ char *ptr1, ca_size_t b1, ca_size_t i1,
1879
+ char *ptr2, ca_size_t b2, ca_size_t i2,
1880
+ char *ptr3, ca_size_t b3, ca_size_t i3,
1881
+ double tol)
1882
+ {
1883
+ uint8_t *q1 = (uint8_t *) ptr1, *q2 = (uint8_t *) ptr2;
1884
+ uint8_t *p1 = q1, *p2 = q2;
1885
+ boolean8_t *q3 = (boolean8_t *) ptr3;
1886
+ boolean8_t *p3 = q3;
1887
+ ca_size_t k;
1888
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
1889
+ (void) tol;
1890
+ if ( m ) {
1891
+ boolean8_t *pm;
1892
+ for (k=0; k<n; k++) {
1893
+ pm = m + k;
1894
+ if ( ! *pm ) {
1895
+ p1 = q1 + k*i1;
1896
+ p2 = q2 + k*i2;
1897
+ p3 = q3 + k*i3;
1898
+ { (*p3) = ( (*p1) < (*p2) ); }
1899
+ }
1900
+ }
1901
+ } else {
1902
+ for (k=0; k<n; k++) {
1903
+ p1 = q1 + k*i1;
1904
+ p2 = q2 + k*i2;
1905
+ p3 = q3 + k*i3;
1906
+ { (*p3) = ( (*p1) < (*p2) ); }
1907
+ }
1908
+ }
1909
+ }
1910
+
1911
+ static void
1912
+ ca_bincmp_lt_int16_t (ca_size_t n, boolean8_t *m,
1913
+ char *ptr1, ca_size_t b1, ca_size_t i1,
1914
+ char *ptr2, ca_size_t b2, ca_size_t i2,
1915
+ char *ptr3, ca_size_t b3, ca_size_t i3,
1916
+ double tol)
1917
+ {
1918
+ int16_t *q1 = (int16_t *) ptr1, *q2 = (int16_t *) ptr2;
1919
+ int16_t *p1 = q1, *p2 = q2;
1920
+ boolean8_t *q3 = (boolean8_t *) ptr3;
1921
+ boolean8_t *p3 = q3;
1922
+ ca_size_t k;
1923
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
1924
+ (void) tol;
1925
+ if ( m ) {
1926
+ boolean8_t *pm;
1927
+ for (k=0; k<n; k++) {
1928
+ pm = m + k;
1929
+ if ( ! *pm ) {
1930
+ p1 = q1 + k*i1;
1931
+ p2 = q2 + k*i2;
1932
+ p3 = q3 + k*i3;
1933
+ { (*p3) = ( (*p1) < (*p2) ); }
1934
+ }
1935
+ }
1936
+ } else {
1937
+ for (k=0; k<n; k++) {
1938
+ p1 = q1 + k*i1;
1939
+ p2 = q2 + k*i2;
1940
+ p3 = q3 + k*i3;
1941
+ { (*p3) = ( (*p1) < (*p2) ); }
1942
+ }
1943
+ }
1944
+ }
1945
+
1946
+ static void
1947
+ ca_bincmp_lt_uint16_t (ca_size_t n, boolean8_t *m,
1948
+ char *ptr1, ca_size_t b1, ca_size_t i1,
1949
+ char *ptr2, ca_size_t b2, ca_size_t i2,
1950
+ char *ptr3, ca_size_t b3, ca_size_t i3,
1951
+ double tol)
1952
+ {
1953
+ uint16_t *q1 = (uint16_t *) ptr1, *q2 = (uint16_t *) ptr2;
1954
+ uint16_t *p1 = q1, *p2 = q2;
1955
+ boolean8_t *q3 = (boolean8_t *) ptr3;
1956
+ boolean8_t *p3 = q3;
1957
+ ca_size_t k;
1958
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
1959
+ (void) tol;
1960
+ if ( m ) {
1961
+ boolean8_t *pm;
1962
+ for (k=0; k<n; k++) {
1963
+ pm = m + k;
1964
+ if ( ! *pm ) {
1965
+ p1 = q1 + k*i1;
1966
+ p2 = q2 + k*i2;
1967
+ p3 = q3 + k*i3;
1968
+ { (*p3) = ( (*p1) < (*p2) ); }
1969
+ }
1970
+ }
1971
+ } else {
1972
+ for (k=0; k<n; k++) {
1973
+ p1 = q1 + k*i1;
1974
+ p2 = q2 + k*i2;
1975
+ p3 = q3 + k*i3;
1976
+ { (*p3) = ( (*p1) < (*p2) ); }
1977
+ }
1978
+ }
1979
+ }
1980
+
1981
+ static void
1982
+ ca_bincmp_lt_int32_t (ca_size_t n, boolean8_t *m,
1983
+ char *ptr1, ca_size_t b1, ca_size_t i1,
1984
+ char *ptr2, ca_size_t b2, ca_size_t i2,
1985
+ char *ptr3, ca_size_t b3, ca_size_t i3,
1986
+ double tol)
1987
+ {
1988
+ int32_t *q1 = (int32_t *) ptr1, *q2 = (int32_t *) ptr2;
1989
+ int32_t *p1 = q1, *p2 = q2;
1990
+ boolean8_t *q3 = (boolean8_t *) ptr3;
1991
+ boolean8_t *p3 = q3;
1992
+ ca_size_t k;
1993
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
1994
+ (void) tol;
1995
+ if ( m ) {
1996
+ boolean8_t *pm;
1997
+ for (k=0; k<n; k++) {
1998
+ pm = m + k;
1999
+ if ( ! *pm ) {
2000
+ p1 = q1 + k*i1;
2001
+ p2 = q2 + k*i2;
2002
+ p3 = q3 + k*i3;
2003
+ { (*p3) = ( (*p1) < (*p2) ); }
2004
+ }
2005
+ }
2006
+ } else {
2007
+ for (k=0; k<n; k++) {
2008
+ p1 = q1 + k*i1;
2009
+ p2 = q2 + k*i2;
2010
+ p3 = q3 + k*i3;
2011
+ { (*p3) = ( (*p1) < (*p2) ); }
2012
+ }
2013
+ }
2014
+ }
2015
+
2016
+ static void
2017
+ ca_bincmp_lt_uint32_t (ca_size_t n, boolean8_t *m,
2018
+ char *ptr1, ca_size_t b1, ca_size_t i1,
2019
+ char *ptr2, ca_size_t b2, ca_size_t i2,
2020
+ char *ptr3, ca_size_t b3, ca_size_t i3,
2021
+ double tol)
2022
+ {
2023
+ uint32_t *q1 = (uint32_t *) ptr1, *q2 = (uint32_t *) ptr2;
2024
+ uint32_t *p1 = q1, *p2 = q2;
2025
+ boolean8_t *q3 = (boolean8_t *) ptr3;
2026
+ boolean8_t *p3 = q3;
2027
+ ca_size_t k;
2028
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
2029
+ (void) tol;
2030
+ if ( m ) {
2031
+ boolean8_t *pm;
2032
+ for (k=0; k<n; k++) {
2033
+ pm = m + k;
2034
+ if ( ! *pm ) {
2035
+ p1 = q1 + k*i1;
2036
+ p2 = q2 + k*i2;
2037
+ p3 = q3 + k*i3;
2038
+ { (*p3) = ( (*p1) < (*p2) ); }
2039
+ }
2040
+ }
2041
+ } else {
2042
+ for (k=0; k<n; k++) {
2043
+ p1 = q1 + k*i1;
2044
+ p2 = q2 + k*i2;
2045
+ p3 = q3 + k*i3;
2046
+ { (*p3) = ( (*p1) < (*p2) ); }
2047
+ }
2048
+ }
2049
+ }
2050
+
2051
+ static void
2052
+ ca_bincmp_lt_int64_t (ca_size_t n, boolean8_t *m,
2053
+ char *ptr1, ca_size_t b1, ca_size_t i1,
2054
+ char *ptr2, ca_size_t b2, ca_size_t i2,
2055
+ char *ptr3, ca_size_t b3, ca_size_t i3,
2056
+ double tol)
2057
+ {
2058
+ int64_t *q1 = (int64_t *) ptr1, *q2 = (int64_t *) ptr2;
2059
+ int64_t *p1 = q1, *p2 = q2;
2060
+ boolean8_t *q3 = (boolean8_t *) ptr3;
2061
+ boolean8_t *p3 = q3;
2062
+ ca_size_t k;
2063
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
2064
+ (void) tol;
2065
+ if ( m ) {
2066
+ boolean8_t *pm;
2067
+ for (k=0; k<n; k++) {
2068
+ pm = m + k;
2069
+ if ( ! *pm ) {
2070
+ p1 = q1 + k*i1;
2071
+ p2 = q2 + k*i2;
2072
+ p3 = q3 + k*i3;
2073
+ { (*p3) = ( (*p1) < (*p2) ); }
2074
+ }
2075
+ }
2076
+ } else {
2077
+ for (k=0; k<n; k++) {
2078
+ p1 = q1 + k*i1;
2079
+ p2 = q2 + k*i2;
2080
+ p3 = q3 + k*i3;
2081
+ { (*p3) = ( (*p1) < (*p2) ); }
2082
+ }
2083
+ }
2084
+ }
2085
+
2086
+ static void
2087
+ ca_bincmp_lt_uint64_t (ca_size_t n, boolean8_t *m,
2088
+ char *ptr1, ca_size_t b1, ca_size_t i1,
2089
+ char *ptr2, ca_size_t b2, ca_size_t i2,
2090
+ char *ptr3, ca_size_t b3, ca_size_t i3,
2091
+ double tol)
2092
+ {
2093
+ uint64_t *q1 = (uint64_t *) ptr1, *q2 = (uint64_t *) ptr2;
2094
+ uint64_t *p1 = q1, *p2 = q2;
2095
+ boolean8_t *q3 = (boolean8_t *) ptr3;
2096
+ boolean8_t *p3 = q3;
2097
+ ca_size_t k;
2098
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
2099
+ (void) tol;
2100
+ if ( m ) {
2101
+ boolean8_t *pm;
2102
+ for (k=0; k<n; k++) {
2103
+ pm = m + k;
2104
+ if ( ! *pm ) {
2105
+ p1 = q1 + k*i1;
2106
+ p2 = q2 + k*i2;
2107
+ p3 = q3 + k*i3;
2108
+ { (*p3) = ( (*p1) < (*p2) ); }
2109
+ }
2110
+ }
2111
+ } else {
2112
+ for (k=0; k<n; k++) {
2113
+ p1 = q1 + k*i1;
2114
+ p2 = q2 + k*i2;
2115
+ p3 = q3 + k*i3;
2116
+ { (*p3) = ( (*p1) < (*p2) ); }
2117
+ }
2118
+ }
2119
+ }
2120
+
2121
+ static void
2122
+ ca_bincmp_lt_float32_t (ca_size_t n, boolean8_t *m,
2123
+ char *ptr1, ca_size_t b1, ca_size_t i1,
2124
+ char *ptr2, ca_size_t b2, ca_size_t i2,
2125
+ char *ptr3, ca_size_t b3, ca_size_t i3,
2126
+ double tol)
2127
+ {
2128
+ float *q1 = (float *) ptr1, *q2 = (float *) ptr2;
2129
+ float *p1 = q1, *p2 = q2;
2130
+ boolean8_t *q3 = (boolean8_t *) ptr3;
2131
+ boolean8_t *p3 = q3;
2132
+ ca_size_t k;
2133
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
2134
+ (void) tol;
2135
+ if ( m ) {
2136
+ boolean8_t *pm;
2137
+ for (k=0; k<n; k++) {
2138
+ pm = m + k;
2139
+ if ( ! *pm ) {
2140
+ p1 = q1 + k*i1;
2141
+ p2 = q2 + k*i2;
2142
+ p3 = q3 + k*i3;
2143
+ { (*p3) = ( (*p1) < (*p2) ); }
2144
+ }
2145
+ }
2146
+ } else {
2147
+ for (k=0; k<n; k++) {
2148
+ p1 = q1 + k*i1;
2149
+ p2 = q2 + k*i2;
2150
+ p3 = q3 + k*i3;
2151
+ { (*p3) = ( (*p1) < (*p2) ); }
2152
+ }
2153
+ }
2154
+ }
2155
+
2156
+ static void
2157
+ ca_bincmp_lt_float64_t (ca_size_t n, boolean8_t *m,
2158
+ char *ptr1, ca_size_t b1, ca_size_t i1,
2159
+ char *ptr2, ca_size_t b2, ca_size_t i2,
2160
+ char *ptr3, ca_size_t b3, ca_size_t i3,
2161
+ double tol)
2162
+ {
2163
+ double *q1 = (double *) ptr1, *q2 = (double *) ptr2;
2164
+ double *p1 = q1, *p2 = q2;
2165
+ boolean8_t *q3 = (boolean8_t *) ptr3;
2166
+ boolean8_t *p3 = q3;
2167
+ ca_size_t k;
2168
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
2169
+ (void) tol;
2170
+ if ( m ) {
2171
+ boolean8_t *pm;
2172
+ for (k=0; k<n; k++) {
2173
+ pm = m + k;
2174
+ if ( ! *pm ) {
2175
+ p1 = q1 + k*i1;
2176
+ p2 = q2 + k*i2;
2177
+ p3 = q3 + k*i3;
2178
+ { (*p3) = ( (*p1) < (*p2) ); }
2179
+ }
2180
+ }
2181
+ } else {
2182
+ for (k=0; k<n; k++) {
2183
+ p1 = q1 + k*i1;
2184
+ p2 = q2 + k*i2;
2185
+ p3 = q3 + k*i3;
2186
+ { (*p3) = ( (*p1) < (*p2) ); }
2187
+ }
2188
+ }
2189
+ }
2190
+
2191
+ static void
2192
+ ca_bincmp_lt_VALUE (ca_size_t n, boolean8_t *m,
2193
+ char *ptr1, ca_size_t b1, ca_size_t i1,
2194
+ char *ptr2, ca_size_t b2, ca_size_t i2,
2195
+ char *ptr3, ca_size_t b3, ca_size_t i3,
2196
+ double tol)
2197
+ {
2198
+ VALUE *q1 = (VALUE *) ptr1, *q2 = (VALUE *) ptr2;
2199
+ VALUE *p1 = q1, *p2 = q2;
2200
+ boolean8_t *q3 = (boolean8_t *) ptr3;
2201
+ boolean8_t *p3 = q3;
2202
+ ca_size_t k;
2203
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
2204
+ (void) tol;
2205
+ if ( m ) {
2206
+ boolean8_t *pm;
2207
+ for (k=0; k<n; k++) {
2208
+ pm = m + k;
2209
+ if ( ! *pm ) {
2210
+ p1 = q1 + k*i1;
2211
+ p2 = q2 + k*i2;
2212
+ p3 = q3 + k*i3;
2213
+ { (*p3) = RTEST(rb_funcall((*p1), rb_intern("<"), 1, (*p2))) ? 1 : 0; }
2214
+ }
2215
+ }
2216
+ } else {
2217
+ for (k=0; k<n; k++) {
2218
+ p1 = q1 + k*i1;
2219
+ p2 = q2 + k*i2;
2220
+ p3 = q3 + k*i3;
2221
+ { (*p3) = RTEST(rb_funcall((*p1), rb_intern("<"), 1, (*p2))) ? 1 : 0; }
2222
+ }
2223
+ }
2224
+ }
2225
+
2226
+ ca_bincmp_func_t
2227
+ ca_bincmp_lt[CA_NTYPE] = {
2228
+ ca_bincmp_lt_fixlen,
2229
+ ca_bincmp_lt_boolean8_t,
2230
+ ca_bincmp_lt_int8_t,
2231
+ ca_bincmp_lt_uint8_t,
2232
+ ca_bincmp_lt_int16_t,
2233
+ ca_bincmp_lt_uint16_t,
2234
+ ca_bincmp_lt_int32_t,
2235
+ ca_bincmp_lt_uint32_t,
2236
+ ca_bincmp_lt_int64_t,
2237
+ ca_bincmp_lt_uint64_t,
2238
+ ca_bincmp_lt_float32_t,
2239
+ ca_bincmp_lt_float64_t,
2240
+ ca_bincmp_not_implement,
2241
+ ca_bincmp_not_implement,
2242
+ ca_bincmp_not_implement,
2243
+ ca_bincmp_not_implement,
2244
+ ca_bincmp_lt_VALUE,
2245
+ };
2246
+
2247
+ VALUE rb_ca_lt (VALUE self, VALUE other)
2248
+ {
2249
+ if ( ! rb_ca_test_castable(other) ) {
2250
+ return rb_ca_binop_pass_to_other(self, other, rb_intern("lt"));
2251
+ }
2252
+ return rb_ca_call_bincmp(self, other, ca_bincmp_lt, 0.0);
2253
+ }
2254
+
2255
+ /* ===== bincmp ge ============================================ */
2256
+
2257
+ static void
2258
+ ca_bincmp_ge_fixlen (ca_size_t n, boolean8_t *m,
2259
+ char *ptr1, ca_size_t b1, ca_size_t i1,
2260
+ char *ptr2, ca_size_t b2, ca_size_t i2,
2261
+ char *ptr3, ca_size_t b3, ca_size_t i3,
2262
+ double tol)
2263
+ {
2264
+ char *q1 = ptr1, *q2 = ptr2;
2265
+ char *p1 = q1, *p2 = q2;
2266
+ boolean8_t *q3 = (boolean8_t *) ptr3;
2267
+ boolean8_t *p3 = q3;
2268
+ ca_size_t s1 = b1*i1, s2 = b2*i2, s3 = b3*i3;
2269
+ ca_size_t k;
2270
+ (void) tol;
2271
+ if ( m ) {
2272
+ boolean8_t *pm;
2273
+ for (k=0; k<n; k++) {
2274
+ pm = m + k;
2275
+ if ( ! *pm ) {
2276
+ p1 = q1 + k*s1;
2277
+ p2 = q2 + k*s2;
2278
+ p3 = q3 + k*s3;
2279
+ {
2280
+ int cmp = memcmp(p1, p2, b1 < b2 ? b1 : b2);
2281
+ (*p3) = ( cmp > 0 || ( cmp == 0 && b1 >= b2 ) );
2282
+ }
2283
+ }
2284
+ }
2285
+ } else {
2286
+ for (k=0; k<n; k++) {
2287
+ p1 = q1 + k*s1;
2288
+ p2 = q2 + k*s2;
2289
+ p3 = q3 + k*s3;
2290
+ {
2291
+ int cmp = memcmp(p1, p2, b1 < b2 ? b1 : b2);
2292
+ (*p3) = ( cmp > 0 || ( cmp == 0 && b1 >= b2 ) );
2293
+ }
2294
+ }
2295
+ }
2296
+ }
2297
+
2298
+ static void
2299
+ ca_bincmp_ge_boolean8_t (ca_size_t n, boolean8_t *m,
2300
+ char *ptr1, ca_size_t b1, ca_size_t i1,
2301
+ char *ptr2, ca_size_t b2, ca_size_t i2,
2302
+ char *ptr3, ca_size_t b3, ca_size_t i3,
2303
+ double tol)
2304
+ {
2305
+ boolean8_t *q1 = (boolean8_t *) ptr1, *q2 = (boolean8_t *) ptr2;
2306
+ boolean8_t *p1 = q1, *p2 = q2;
2307
+ boolean8_t *q3 = (boolean8_t *) ptr3;
2308
+ boolean8_t *p3 = q3;
2309
+ ca_size_t k;
2310
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
2311
+ (void) tol;
2312
+ if ( m ) {
2313
+ boolean8_t *pm;
2314
+ for (k=0; k<n; k++) {
2315
+ pm = m + k;
2316
+ if ( ! *pm ) {
2317
+ p1 = q1 + k*i1;
2318
+ p2 = q2 + k*i2;
2319
+ p3 = q3 + k*i3;
2320
+ { (*p3) = ( (*p1) >= (*p2) ); }
2321
+ }
2322
+ }
2323
+ } else {
2324
+ for (k=0; k<n; k++) {
2325
+ p1 = q1 + k*i1;
2326
+ p2 = q2 + k*i2;
2327
+ p3 = q3 + k*i3;
2328
+ { (*p3) = ( (*p1) >= (*p2) ); }
2329
+ }
2330
+ }
2331
+ }
2332
+
2333
+ static void
2334
+ ca_bincmp_ge_int8_t (ca_size_t n, boolean8_t *m,
2335
+ char *ptr1, ca_size_t b1, ca_size_t i1,
2336
+ char *ptr2, ca_size_t b2, ca_size_t i2,
2337
+ char *ptr3, ca_size_t b3, ca_size_t i3,
2338
+ double tol)
2339
+ {
2340
+ int8_t *q1 = (int8_t *) ptr1, *q2 = (int8_t *) ptr2;
2341
+ int8_t *p1 = q1, *p2 = q2;
2342
+ boolean8_t *q3 = (boolean8_t *) ptr3;
2343
+ boolean8_t *p3 = q3;
2344
+ ca_size_t k;
2345
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
2346
+ (void) tol;
2347
+ if ( m ) {
2348
+ boolean8_t *pm;
2349
+ for (k=0; k<n; k++) {
2350
+ pm = m + k;
2351
+ if ( ! *pm ) {
2352
+ p1 = q1 + k*i1;
2353
+ p2 = q2 + k*i2;
2354
+ p3 = q3 + k*i3;
2355
+ { (*p3) = ( (*p1) >= (*p2) ); }
2356
+ }
2357
+ }
2358
+ } else {
2359
+ for (k=0; k<n; k++) {
2360
+ p1 = q1 + k*i1;
2361
+ p2 = q2 + k*i2;
2362
+ p3 = q3 + k*i3;
2363
+ { (*p3) = ( (*p1) >= (*p2) ); }
2364
+ }
2365
+ }
2366
+ }
2367
+
2368
+ static void
2369
+ ca_bincmp_ge_uint8_t (ca_size_t n, boolean8_t *m,
2370
+ char *ptr1, ca_size_t b1, ca_size_t i1,
2371
+ char *ptr2, ca_size_t b2, ca_size_t i2,
2372
+ char *ptr3, ca_size_t b3, ca_size_t i3,
2373
+ double tol)
2374
+ {
2375
+ uint8_t *q1 = (uint8_t *) ptr1, *q2 = (uint8_t *) ptr2;
2376
+ uint8_t *p1 = q1, *p2 = q2;
2377
+ boolean8_t *q3 = (boolean8_t *) ptr3;
2378
+ boolean8_t *p3 = q3;
2379
+ ca_size_t k;
2380
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
2381
+ (void) tol;
2382
+ if ( m ) {
2383
+ boolean8_t *pm;
2384
+ for (k=0; k<n; k++) {
2385
+ pm = m + k;
2386
+ if ( ! *pm ) {
2387
+ p1 = q1 + k*i1;
2388
+ p2 = q2 + k*i2;
2389
+ p3 = q3 + k*i3;
2390
+ { (*p3) = ( (*p1) >= (*p2) ); }
2391
+ }
2392
+ }
2393
+ } else {
2394
+ for (k=0; k<n; k++) {
2395
+ p1 = q1 + k*i1;
2396
+ p2 = q2 + k*i2;
2397
+ p3 = q3 + k*i3;
2398
+ { (*p3) = ( (*p1) >= (*p2) ); }
2399
+ }
2400
+ }
2401
+ }
2402
+
2403
+ static void
2404
+ ca_bincmp_ge_int16_t (ca_size_t n, boolean8_t *m,
2405
+ char *ptr1, ca_size_t b1, ca_size_t i1,
2406
+ char *ptr2, ca_size_t b2, ca_size_t i2,
2407
+ char *ptr3, ca_size_t b3, ca_size_t i3,
2408
+ double tol)
2409
+ {
2410
+ int16_t *q1 = (int16_t *) ptr1, *q2 = (int16_t *) ptr2;
2411
+ int16_t *p1 = q1, *p2 = q2;
2412
+ boolean8_t *q3 = (boolean8_t *) ptr3;
2413
+ boolean8_t *p3 = q3;
2414
+ ca_size_t k;
2415
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
2416
+ (void) tol;
2417
+ if ( m ) {
2418
+ boolean8_t *pm;
2419
+ for (k=0; k<n; k++) {
2420
+ pm = m + k;
2421
+ if ( ! *pm ) {
2422
+ p1 = q1 + k*i1;
2423
+ p2 = q2 + k*i2;
2424
+ p3 = q3 + k*i3;
2425
+ { (*p3) = ( (*p1) >= (*p2) ); }
2426
+ }
2427
+ }
2428
+ } else {
2429
+ for (k=0; k<n; k++) {
2430
+ p1 = q1 + k*i1;
2431
+ p2 = q2 + k*i2;
2432
+ p3 = q3 + k*i3;
2433
+ { (*p3) = ( (*p1) >= (*p2) ); }
2434
+ }
2435
+ }
2436
+ }
2437
+
2438
+ static void
2439
+ ca_bincmp_ge_uint16_t (ca_size_t n, boolean8_t *m,
2440
+ char *ptr1, ca_size_t b1, ca_size_t i1,
2441
+ char *ptr2, ca_size_t b2, ca_size_t i2,
2442
+ char *ptr3, ca_size_t b3, ca_size_t i3,
2443
+ double tol)
2444
+ {
2445
+ uint16_t *q1 = (uint16_t *) ptr1, *q2 = (uint16_t *) ptr2;
2446
+ uint16_t *p1 = q1, *p2 = q2;
2447
+ boolean8_t *q3 = (boolean8_t *) ptr3;
2448
+ boolean8_t *p3 = q3;
2449
+ ca_size_t k;
2450
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
2451
+ (void) tol;
2452
+ if ( m ) {
2453
+ boolean8_t *pm;
2454
+ for (k=0; k<n; k++) {
2455
+ pm = m + k;
2456
+ if ( ! *pm ) {
2457
+ p1 = q1 + k*i1;
2458
+ p2 = q2 + k*i2;
2459
+ p3 = q3 + k*i3;
2460
+ { (*p3) = ( (*p1) >= (*p2) ); }
2461
+ }
2462
+ }
2463
+ } else {
2464
+ for (k=0; k<n; k++) {
2465
+ p1 = q1 + k*i1;
2466
+ p2 = q2 + k*i2;
2467
+ p3 = q3 + k*i3;
2468
+ { (*p3) = ( (*p1) >= (*p2) ); }
2469
+ }
2470
+ }
2471
+ }
2472
+
2473
+ static void
2474
+ ca_bincmp_ge_int32_t (ca_size_t n, boolean8_t *m,
2475
+ char *ptr1, ca_size_t b1, ca_size_t i1,
2476
+ char *ptr2, ca_size_t b2, ca_size_t i2,
2477
+ char *ptr3, ca_size_t b3, ca_size_t i3,
2478
+ double tol)
2479
+ {
2480
+ int32_t *q1 = (int32_t *) ptr1, *q2 = (int32_t *) ptr2;
2481
+ int32_t *p1 = q1, *p2 = q2;
2482
+ boolean8_t *q3 = (boolean8_t *) ptr3;
2483
+ boolean8_t *p3 = q3;
2484
+ ca_size_t k;
2485
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
2486
+ (void) tol;
2487
+ if ( m ) {
2488
+ boolean8_t *pm;
2489
+ for (k=0; k<n; k++) {
2490
+ pm = m + k;
2491
+ if ( ! *pm ) {
2492
+ p1 = q1 + k*i1;
2493
+ p2 = q2 + k*i2;
2494
+ p3 = q3 + k*i3;
2495
+ { (*p3) = ( (*p1) >= (*p2) ); }
2496
+ }
2497
+ }
2498
+ } else {
2499
+ for (k=0; k<n; k++) {
2500
+ p1 = q1 + k*i1;
2501
+ p2 = q2 + k*i2;
2502
+ p3 = q3 + k*i3;
2503
+ { (*p3) = ( (*p1) >= (*p2) ); }
2504
+ }
2505
+ }
2506
+ }
2507
+
2508
+ static void
2509
+ ca_bincmp_ge_uint32_t (ca_size_t n, boolean8_t *m,
2510
+ char *ptr1, ca_size_t b1, ca_size_t i1,
2511
+ char *ptr2, ca_size_t b2, ca_size_t i2,
2512
+ char *ptr3, ca_size_t b3, ca_size_t i3,
2513
+ double tol)
2514
+ {
2515
+ uint32_t *q1 = (uint32_t *) ptr1, *q2 = (uint32_t *) ptr2;
2516
+ uint32_t *p1 = q1, *p2 = q2;
2517
+ boolean8_t *q3 = (boolean8_t *) ptr3;
2518
+ boolean8_t *p3 = q3;
2519
+ ca_size_t k;
2520
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
2521
+ (void) tol;
2522
+ if ( m ) {
2523
+ boolean8_t *pm;
2524
+ for (k=0; k<n; k++) {
2525
+ pm = m + k;
2526
+ if ( ! *pm ) {
2527
+ p1 = q1 + k*i1;
2528
+ p2 = q2 + k*i2;
2529
+ p3 = q3 + k*i3;
2530
+ { (*p3) = ( (*p1) >= (*p2) ); }
2531
+ }
2532
+ }
2533
+ } else {
2534
+ for (k=0; k<n; k++) {
2535
+ p1 = q1 + k*i1;
2536
+ p2 = q2 + k*i2;
2537
+ p3 = q3 + k*i3;
2538
+ { (*p3) = ( (*p1) >= (*p2) ); }
2539
+ }
2540
+ }
2541
+ }
2542
+
2543
+ static void
2544
+ ca_bincmp_ge_int64_t (ca_size_t n, boolean8_t *m,
2545
+ char *ptr1, ca_size_t b1, ca_size_t i1,
2546
+ char *ptr2, ca_size_t b2, ca_size_t i2,
2547
+ char *ptr3, ca_size_t b3, ca_size_t i3,
2548
+ double tol)
2549
+ {
2550
+ int64_t *q1 = (int64_t *) ptr1, *q2 = (int64_t *) ptr2;
2551
+ int64_t *p1 = q1, *p2 = q2;
2552
+ boolean8_t *q3 = (boolean8_t *) ptr3;
2553
+ boolean8_t *p3 = q3;
2554
+ ca_size_t k;
2555
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
2556
+ (void) tol;
2557
+ if ( m ) {
2558
+ boolean8_t *pm;
2559
+ for (k=0; k<n; k++) {
2560
+ pm = m + k;
2561
+ if ( ! *pm ) {
2562
+ p1 = q1 + k*i1;
2563
+ p2 = q2 + k*i2;
2564
+ p3 = q3 + k*i3;
2565
+ { (*p3) = ( (*p1) >= (*p2) ); }
2566
+ }
2567
+ }
2568
+ } else {
2569
+ for (k=0; k<n; k++) {
2570
+ p1 = q1 + k*i1;
2571
+ p2 = q2 + k*i2;
2572
+ p3 = q3 + k*i3;
2573
+ { (*p3) = ( (*p1) >= (*p2) ); }
2574
+ }
2575
+ }
2576
+ }
2577
+
2578
+ static void
2579
+ ca_bincmp_ge_uint64_t (ca_size_t n, boolean8_t *m,
2580
+ char *ptr1, ca_size_t b1, ca_size_t i1,
2581
+ char *ptr2, ca_size_t b2, ca_size_t i2,
2582
+ char *ptr3, ca_size_t b3, ca_size_t i3,
2583
+ double tol)
2584
+ {
2585
+ uint64_t *q1 = (uint64_t *) ptr1, *q2 = (uint64_t *) ptr2;
2586
+ uint64_t *p1 = q1, *p2 = q2;
2587
+ boolean8_t *q3 = (boolean8_t *) ptr3;
2588
+ boolean8_t *p3 = q3;
2589
+ ca_size_t k;
2590
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
2591
+ (void) tol;
2592
+ if ( m ) {
2593
+ boolean8_t *pm;
2594
+ for (k=0; k<n; k++) {
2595
+ pm = m + k;
2596
+ if ( ! *pm ) {
2597
+ p1 = q1 + k*i1;
2598
+ p2 = q2 + k*i2;
2599
+ p3 = q3 + k*i3;
2600
+ { (*p3) = ( (*p1) >= (*p2) ); }
2601
+ }
2602
+ }
2603
+ } else {
2604
+ for (k=0; k<n; k++) {
2605
+ p1 = q1 + k*i1;
2606
+ p2 = q2 + k*i2;
2607
+ p3 = q3 + k*i3;
2608
+ { (*p3) = ( (*p1) >= (*p2) ); }
2609
+ }
2610
+ }
2611
+ }
2612
+
2613
+ static void
2614
+ ca_bincmp_ge_float32_t (ca_size_t n, boolean8_t *m,
2615
+ char *ptr1, ca_size_t b1, ca_size_t i1,
2616
+ char *ptr2, ca_size_t b2, ca_size_t i2,
2617
+ char *ptr3, ca_size_t b3, ca_size_t i3,
2618
+ double tol)
2619
+ {
2620
+ float *q1 = (float *) ptr1, *q2 = (float *) ptr2;
2621
+ float *p1 = q1, *p2 = q2;
2622
+ boolean8_t *q3 = (boolean8_t *) ptr3;
2623
+ boolean8_t *p3 = q3;
2624
+ ca_size_t k;
2625
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
2626
+ (void) tol;
2627
+ if ( m ) {
2628
+ boolean8_t *pm;
2629
+ for (k=0; k<n; k++) {
2630
+ pm = m + k;
2631
+ if ( ! *pm ) {
2632
+ p1 = q1 + k*i1;
2633
+ p2 = q2 + k*i2;
2634
+ p3 = q3 + k*i3;
2635
+ { (*p3) = ( (*p1) >= (*p2) ); }
2636
+ }
2637
+ }
2638
+ } else {
2639
+ for (k=0; k<n; k++) {
2640
+ p1 = q1 + k*i1;
2641
+ p2 = q2 + k*i2;
2642
+ p3 = q3 + k*i3;
2643
+ { (*p3) = ( (*p1) >= (*p2) ); }
2644
+ }
2645
+ }
2646
+ }
2647
+
2648
+ static void
2649
+ ca_bincmp_ge_float64_t (ca_size_t n, boolean8_t *m,
2650
+ char *ptr1, ca_size_t b1, ca_size_t i1,
2651
+ char *ptr2, ca_size_t b2, ca_size_t i2,
2652
+ char *ptr3, ca_size_t b3, ca_size_t i3,
2653
+ double tol)
2654
+ {
2655
+ double *q1 = (double *) ptr1, *q2 = (double *) ptr2;
2656
+ double *p1 = q1, *p2 = q2;
2657
+ boolean8_t *q3 = (boolean8_t *) ptr3;
2658
+ boolean8_t *p3 = q3;
2659
+ ca_size_t k;
2660
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
2661
+ (void) tol;
2662
+ if ( m ) {
2663
+ boolean8_t *pm;
2664
+ for (k=0; k<n; k++) {
2665
+ pm = m + k;
2666
+ if ( ! *pm ) {
2667
+ p1 = q1 + k*i1;
2668
+ p2 = q2 + k*i2;
2669
+ p3 = q3 + k*i3;
2670
+ { (*p3) = ( (*p1) >= (*p2) ); }
2671
+ }
2672
+ }
2673
+ } else {
2674
+ for (k=0; k<n; k++) {
2675
+ p1 = q1 + k*i1;
2676
+ p2 = q2 + k*i2;
2677
+ p3 = q3 + k*i3;
2678
+ { (*p3) = ( (*p1) >= (*p2) ); }
2679
+ }
2680
+ }
2681
+ }
2682
+
2683
+ static void
2684
+ ca_bincmp_ge_VALUE (ca_size_t n, boolean8_t *m,
2685
+ char *ptr1, ca_size_t b1, ca_size_t i1,
2686
+ char *ptr2, ca_size_t b2, ca_size_t i2,
2687
+ char *ptr3, ca_size_t b3, ca_size_t i3,
2688
+ double tol)
2689
+ {
2690
+ VALUE *q1 = (VALUE *) ptr1, *q2 = (VALUE *) ptr2;
2691
+ VALUE *p1 = q1, *p2 = q2;
2692
+ boolean8_t *q3 = (boolean8_t *) ptr3;
2693
+ boolean8_t *p3 = q3;
2694
+ ca_size_t k;
2695
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
2696
+ (void) tol;
2697
+ if ( m ) {
2698
+ boolean8_t *pm;
2699
+ for (k=0; k<n; k++) {
2700
+ pm = m + k;
2701
+ if ( ! *pm ) {
2702
+ p1 = q1 + k*i1;
2703
+ p2 = q2 + k*i2;
2704
+ p3 = q3 + k*i3;
2705
+ { (*p3) = RTEST(rb_funcall((*p1), rb_intern(">="), 1, (*p2))) ? 1 : 0; }
2706
+ }
2707
+ }
2708
+ } else {
2709
+ for (k=0; k<n; k++) {
2710
+ p1 = q1 + k*i1;
2711
+ p2 = q2 + k*i2;
2712
+ p3 = q3 + k*i3;
2713
+ { (*p3) = RTEST(rb_funcall((*p1), rb_intern(">="), 1, (*p2))) ? 1 : 0; }
2714
+ }
2715
+ }
2716
+ }
2717
+
2718
+ ca_bincmp_func_t
2719
+ ca_bincmp_ge[CA_NTYPE] = {
2720
+ ca_bincmp_ge_fixlen,
2721
+ ca_bincmp_ge_boolean8_t,
2722
+ ca_bincmp_ge_int8_t,
2723
+ ca_bincmp_ge_uint8_t,
2724
+ ca_bincmp_ge_int16_t,
2725
+ ca_bincmp_ge_uint16_t,
2726
+ ca_bincmp_ge_int32_t,
2727
+ ca_bincmp_ge_uint32_t,
2728
+ ca_bincmp_ge_int64_t,
2729
+ ca_bincmp_ge_uint64_t,
2730
+ ca_bincmp_ge_float32_t,
2731
+ ca_bincmp_ge_float64_t,
2732
+ ca_bincmp_not_implement,
2733
+ ca_bincmp_not_implement,
2734
+ ca_bincmp_not_implement,
2735
+ ca_bincmp_not_implement,
2736
+ ca_bincmp_ge_VALUE,
2737
+ };
2738
+
2739
+ VALUE rb_ca_ge (VALUE self, VALUE other)
2740
+ {
2741
+ if ( ! rb_ca_test_castable(other) ) {
2742
+ return rb_ca_binop_pass_to_other(self, other, rb_intern("ge"));
2743
+ }
2744
+ return rb_ca_call_bincmp(self, other, ca_bincmp_ge, 0.0);
2745
+ }
2746
+
2747
+ /* ===== bincmp le ============================================ */
2748
+
2749
+ static void
2750
+ ca_bincmp_le_fixlen (ca_size_t n, boolean8_t *m,
2751
+ char *ptr1, ca_size_t b1, ca_size_t i1,
2752
+ char *ptr2, ca_size_t b2, ca_size_t i2,
2753
+ char *ptr3, ca_size_t b3, ca_size_t i3,
2754
+ double tol)
2755
+ {
2756
+ char *q1 = ptr1, *q2 = ptr2;
2757
+ char *p1 = q1, *p2 = q2;
2758
+ boolean8_t *q3 = (boolean8_t *) ptr3;
2759
+ boolean8_t *p3 = q3;
2760
+ ca_size_t s1 = b1*i1, s2 = b2*i2, s3 = b3*i3;
2761
+ ca_size_t k;
2762
+ (void) tol;
2763
+ if ( m ) {
2764
+ boolean8_t *pm;
2765
+ for (k=0; k<n; k++) {
2766
+ pm = m + k;
2767
+ if ( ! *pm ) {
2768
+ p1 = q1 + k*s1;
2769
+ p2 = q2 + k*s2;
2770
+ p3 = q3 + k*s3;
2771
+ {
2772
+ int cmp = memcmp(p1, p2, b1 < b2 ? b1 : b2);
2773
+ (*p3) = ( cmp < 0 || ( cmp == 0 && b1 <= b2 ) );
2774
+ }
2775
+ }
2776
+ }
2777
+ } else {
2778
+ for (k=0; k<n; k++) {
2779
+ p1 = q1 + k*s1;
2780
+ p2 = q2 + k*s2;
2781
+ p3 = q3 + k*s3;
2782
+ {
2783
+ int cmp = memcmp(p1, p2, b1 < b2 ? b1 : b2);
2784
+ (*p3) = ( cmp < 0 || ( cmp == 0 && b1 <= b2 ) );
2785
+ }
2786
+ }
2787
+ }
2788
+ }
2789
+
2790
+ static void
2791
+ ca_bincmp_le_boolean8_t (ca_size_t n, boolean8_t *m,
2792
+ char *ptr1, ca_size_t b1, ca_size_t i1,
2793
+ char *ptr2, ca_size_t b2, ca_size_t i2,
2794
+ char *ptr3, ca_size_t b3, ca_size_t i3,
2795
+ double tol)
2796
+ {
2797
+ boolean8_t *q1 = (boolean8_t *) ptr1, *q2 = (boolean8_t *) ptr2;
2798
+ boolean8_t *p1 = q1, *p2 = q2;
2799
+ boolean8_t *q3 = (boolean8_t *) ptr3;
2800
+ boolean8_t *p3 = q3;
2801
+ ca_size_t k;
2802
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
2803
+ (void) tol;
2804
+ if ( m ) {
2805
+ boolean8_t *pm;
2806
+ for (k=0; k<n; k++) {
2807
+ pm = m + k;
2808
+ if ( ! *pm ) {
2809
+ p1 = q1 + k*i1;
2810
+ p2 = q2 + k*i2;
2811
+ p3 = q3 + k*i3;
2812
+ { (*p3) = ( (*p1) <= (*p2) ); }
2813
+ }
2814
+ }
2815
+ } else {
2816
+ for (k=0; k<n; k++) {
2817
+ p1 = q1 + k*i1;
2818
+ p2 = q2 + k*i2;
2819
+ p3 = q3 + k*i3;
2820
+ { (*p3) = ( (*p1) <= (*p2) ); }
2821
+ }
2822
+ }
2823
+ }
2824
+
2825
+ static void
2826
+ ca_bincmp_le_int8_t (ca_size_t n, boolean8_t *m,
2827
+ char *ptr1, ca_size_t b1, ca_size_t i1,
2828
+ char *ptr2, ca_size_t b2, ca_size_t i2,
2829
+ char *ptr3, ca_size_t b3, ca_size_t i3,
2830
+ double tol)
2831
+ {
2832
+ int8_t *q1 = (int8_t *) ptr1, *q2 = (int8_t *) ptr2;
2833
+ int8_t *p1 = q1, *p2 = q2;
2834
+ boolean8_t *q3 = (boolean8_t *) ptr3;
2835
+ boolean8_t *p3 = q3;
2836
+ ca_size_t k;
2837
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
2838
+ (void) tol;
2839
+ if ( m ) {
2840
+ boolean8_t *pm;
2841
+ for (k=0; k<n; k++) {
2842
+ pm = m + k;
2843
+ if ( ! *pm ) {
2844
+ p1 = q1 + k*i1;
2845
+ p2 = q2 + k*i2;
2846
+ p3 = q3 + k*i3;
2847
+ { (*p3) = ( (*p1) <= (*p2) ); }
2848
+ }
2849
+ }
2850
+ } else {
2851
+ for (k=0; k<n; k++) {
2852
+ p1 = q1 + k*i1;
2853
+ p2 = q2 + k*i2;
2854
+ p3 = q3 + k*i3;
2855
+ { (*p3) = ( (*p1) <= (*p2) ); }
2856
+ }
2857
+ }
2858
+ }
2859
+
2860
+ static void
2861
+ ca_bincmp_le_uint8_t (ca_size_t n, boolean8_t *m,
2862
+ char *ptr1, ca_size_t b1, ca_size_t i1,
2863
+ char *ptr2, ca_size_t b2, ca_size_t i2,
2864
+ char *ptr3, ca_size_t b3, ca_size_t i3,
2865
+ double tol)
2866
+ {
2867
+ uint8_t *q1 = (uint8_t *) ptr1, *q2 = (uint8_t *) ptr2;
2868
+ uint8_t *p1 = q1, *p2 = q2;
2869
+ boolean8_t *q3 = (boolean8_t *) ptr3;
2870
+ boolean8_t *p3 = q3;
2871
+ ca_size_t k;
2872
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
2873
+ (void) tol;
2874
+ if ( m ) {
2875
+ boolean8_t *pm;
2876
+ for (k=0; k<n; k++) {
2877
+ pm = m + k;
2878
+ if ( ! *pm ) {
2879
+ p1 = q1 + k*i1;
2880
+ p2 = q2 + k*i2;
2881
+ p3 = q3 + k*i3;
2882
+ { (*p3) = ( (*p1) <= (*p2) ); }
2883
+ }
2884
+ }
2885
+ } else {
2886
+ for (k=0; k<n; k++) {
2887
+ p1 = q1 + k*i1;
2888
+ p2 = q2 + k*i2;
2889
+ p3 = q3 + k*i3;
2890
+ { (*p3) = ( (*p1) <= (*p2) ); }
2891
+ }
2892
+ }
2893
+ }
2894
+
2895
+ static void
2896
+ ca_bincmp_le_int16_t (ca_size_t n, boolean8_t *m,
2897
+ char *ptr1, ca_size_t b1, ca_size_t i1,
2898
+ char *ptr2, ca_size_t b2, ca_size_t i2,
2899
+ char *ptr3, ca_size_t b3, ca_size_t i3,
2900
+ double tol)
2901
+ {
2902
+ int16_t *q1 = (int16_t *) ptr1, *q2 = (int16_t *) ptr2;
2903
+ int16_t *p1 = q1, *p2 = q2;
2904
+ boolean8_t *q3 = (boolean8_t *) ptr3;
2905
+ boolean8_t *p3 = q3;
2906
+ ca_size_t k;
2907
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
2908
+ (void) tol;
2909
+ if ( m ) {
2910
+ boolean8_t *pm;
2911
+ for (k=0; k<n; k++) {
2912
+ pm = m + k;
2913
+ if ( ! *pm ) {
2914
+ p1 = q1 + k*i1;
2915
+ p2 = q2 + k*i2;
2916
+ p3 = q3 + k*i3;
2917
+ { (*p3) = ( (*p1) <= (*p2) ); }
2918
+ }
2919
+ }
2920
+ } else {
2921
+ for (k=0; k<n; k++) {
2922
+ p1 = q1 + k*i1;
2923
+ p2 = q2 + k*i2;
2924
+ p3 = q3 + k*i3;
2925
+ { (*p3) = ( (*p1) <= (*p2) ); }
2926
+ }
2927
+ }
2928
+ }
2929
+
2930
+ static void
2931
+ ca_bincmp_le_uint16_t (ca_size_t n, boolean8_t *m,
2932
+ char *ptr1, ca_size_t b1, ca_size_t i1,
2933
+ char *ptr2, ca_size_t b2, ca_size_t i2,
2934
+ char *ptr3, ca_size_t b3, ca_size_t i3,
2935
+ double tol)
2936
+ {
2937
+ uint16_t *q1 = (uint16_t *) ptr1, *q2 = (uint16_t *) ptr2;
2938
+ uint16_t *p1 = q1, *p2 = q2;
2939
+ boolean8_t *q3 = (boolean8_t *) ptr3;
2940
+ boolean8_t *p3 = q3;
2941
+ ca_size_t k;
2942
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
2943
+ (void) tol;
2944
+ if ( m ) {
2945
+ boolean8_t *pm;
2946
+ for (k=0; k<n; k++) {
2947
+ pm = m + k;
2948
+ if ( ! *pm ) {
2949
+ p1 = q1 + k*i1;
2950
+ p2 = q2 + k*i2;
2951
+ p3 = q3 + k*i3;
2952
+ { (*p3) = ( (*p1) <= (*p2) ); }
2953
+ }
2954
+ }
2955
+ } else {
2956
+ for (k=0; k<n; k++) {
2957
+ p1 = q1 + k*i1;
2958
+ p2 = q2 + k*i2;
2959
+ p3 = q3 + k*i3;
2960
+ { (*p3) = ( (*p1) <= (*p2) ); }
2961
+ }
2962
+ }
2963
+ }
2964
+
2965
+ static void
2966
+ ca_bincmp_le_int32_t (ca_size_t n, boolean8_t *m,
2967
+ char *ptr1, ca_size_t b1, ca_size_t i1,
2968
+ char *ptr2, ca_size_t b2, ca_size_t i2,
2969
+ char *ptr3, ca_size_t b3, ca_size_t i3,
2970
+ double tol)
2971
+ {
2972
+ int32_t *q1 = (int32_t *) ptr1, *q2 = (int32_t *) ptr2;
2973
+ int32_t *p1 = q1, *p2 = q2;
2974
+ boolean8_t *q3 = (boolean8_t *) ptr3;
2975
+ boolean8_t *p3 = q3;
2976
+ ca_size_t k;
2977
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
2978
+ (void) tol;
2979
+ if ( m ) {
2980
+ boolean8_t *pm;
2981
+ for (k=0; k<n; k++) {
2982
+ pm = m + k;
2983
+ if ( ! *pm ) {
2984
+ p1 = q1 + k*i1;
2985
+ p2 = q2 + k*i2;
2986
+ p3 = q3 + k*i3;
2987
+ { (*p3) = ( (*p1) <= (*p2) ); }
2988
+ }
2989
+ }
2990
+ } else {
2991
+ for (k=0; k<n; k++) {
2992
+ p1 = q1 + k*i1;
2993
+ p2 = q2 + k*i2;
2994
+ p3 = q3 + k*i3;
2995
+ { (*p3) = ( (*p1) <= (*p2) ); }
2996
+ }
2997
+ }
2998
+ }
2999
+
3000
+ static void
3001
+ ca_bincmp_le_uint32_t (ca_size_t n, boolean8_t *m,
3002
+ char *ptr1, ca_size_t b1, ca_size_t i1,
3003
+ char *ptr2, ca_size_t b2, ca_size_t i2,
3004
+ char *ptr3, ca_size_t b3, ca_size_t i3,
3005
+ double tol)
3006
+ {
3007
+ uint32_t *q1 = (uint32_t *) ptr1, *q2 = (uint32_t *) ptr2;
3008
+ uint32_t *p1 = q1, *p2 = q2;
3009
+ boolean8_t *q3 = (boolean8_t *) ptr3;
3010
+ boolean8_t *p3 = q3;
3011
+ ca_size_t k;
3012
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
3013
+ (void) tol;
3014
+ if ( m ) {
3015
+ boolean8_t *pm;
3016
+ for (k=0; k<n; k++) {
3017
+ pm = m + k;
3018
+ if ( ! *pm ) {
3019
+ p1 = q1 + k*i1;
3020
+ p2 = q2 + k*i2;
3021
+ p3 = q3 + k*i3;
3022
+ { (*p3) = ( (*p1) <= (*p2) ); }
3023
+ }
3024
+ }
3025
+ } else {
3026
+ for (k=0; k<n; k++) {
3027
+ p1 = q1 + k*i1;
3028
+ p2 = q2 + k*i2;
3029
+ p3 = q3 + k*i3;
3030
+ { (*p3) = ( (*p1) <= (*p2) ); }
3031
+ }
3032
+ }
3033
+ }
3034
+
3035
+ static void
3036
+ ca_bincmp_le_int64_t (ca_size_t n, boolean8_t *m,
3037
+ char *ptr1, ca_size_t b1, ca_size_t i1,
3038
+ char *ptr2, ca_size_t b2, ca_size_t i2,
3039
+ char *ptr3, ca_size_t b3, ca_size_t i3,
3040
+ double tol)
3041
+ {
3042
+ int64_t *q1 = (int64_t *) ptr1, *q2 = (int64_t *) ptr2;
3043
+ int64_t *p1 = q1, *p2 = q2;
3044
+ boolean8_t *q3 = (boolean8_t *) ptr3;
3045
+ boolean8_t *p3 = q3;
3046
+ ca_size_t k;
3047
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
3048
+ (void) tol;
3049
+ if ( m ) {
3050
+ boolean8_t *pm;
3051
+ for (k=0; k<n; k++) {
3052
+ pm = m + k;
3053
+ if ( ! *pm ) {
3054
+ p1 = q1 + k*i1;
3055
+ p2 = q2 + k*i2;
3056
+ p3 = q3 + k*i3;
3057
+ { (*p3) = ( (*p1) <= (*p2) ); }
3058
+ }
3059
+ }
3060
+ } else {
3061
+ for (k=0; k<n; k++) {
3062
+ p1 = q1 + k*i1;
3063
+ p2 = q2 + k*i2;
3064
+ p3 = q3 + k*i3;
3065
+ { (*p3) = ( (*p1) <= (*p2) ); }
3066
+ }
3067
+ }
3068
+ }
3069
+
3070
+ static void
3071
+ ca_bincmp_le_uint64_t (ca_size_t n, boolean8_t *m,
3072
+ char *ptr1, ca_size_t b1, ca_size_t i1,
3073
+ char *ptr2, ca_size_t b2, ca_size_t i2,
3074
+ char *ptr3, ca_size_t b3, ca_size_t i3,
3075
+ double tol)
3076
+ {
3077
+ uint64_t *q1 = (uint64_t *) ptr1, *q2 = (uint64_t *) ptr2;
3078
+ uint64_t *p1 = q1, *p2 = q2;
3079
+ boolean8_t *q3 = (boolean8_t *) ptr3;
3080
+ boolean8_t *p3 = q3;
3081
+ ca_size_t k;
3082
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
3083
+ (void) tol;
3084
+ if ( m ) {
3085
+ boolean8_t *pm;
3086
+ for (k=0; k<n; k++) {
3087
+ pm = m + k;
3088
+ if ( ! *pm ) {
3089
+ p1 = q1 + k*i1;
3090
+ p2 = q2 + k*i2;
3091
+ p3 = q3 + k*i3;
3092
+ { (*p3) = ( (*p1) <= (*p2) ); }
3093
+ }
3094
+ }
3095
+ } else {
3096
+ for (k=0; k<n; k++) {
3097
+ p1 = q1 + k*i1;
3098
+ p2 = q2 + k*i2;
3099
+ p3 = q3 + k*i3;
3100
+ { (*p3) = ( (*p1) <= (*p2) ); }
3101
+ }
3102
+ }
3103
+ }
3104
+
3105
+ static void
3106
+ ca_bincmp_le_float32_t (ca_size_t n, boolean8_t *m,
3107
+ char *ptr1, ca_size_t b1, ca_size_t i1,
3108
+ char *ptr2, ca_size_t b2, ca_size_t i2,
3109
+ char *ptr3, ca_size_t b3, ca_size_t i3,
3110
+ double tol)
3111
+ {
3112
+ float *q1 = (float *) ptr1, *q2 = (float *) ptr2;
3113
+ float *p1 = q1, *p2 = q2;
3114
+ boolean8_t *q3 = (boolean8_t *) ptr3;
3115
+ boolean8_t *p3 = q3;
3116
+ ca_size_t k;
3117
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
3118
+ (void) tol;
3119
+ if ( m ) {
3120
+ boolean8_t *pm;
3121
+ for (k=0; k<n; k++) {
3122
+ pm = m + k;
3123
+ if ( ! *pm ) {
3124
+ p1 = q1 + k*i1;
3125
+ p2 = q2 + k*i2;
3126
+ p3 = q3 + k*i3;
3127
+ { (*p3) = ( (*p1) <= (*p2) ); }
3128
+ }
3129
+ }
3130
+ } else {
3131
+ for (k=0; k<n; k++) {
3132
+ p1 = q1 + k*i1;
3133
+ p2 = q2 + k*i2;
3134
+ p3 = q3 + k*i3;
3135
+ { (*p3) = ( (*p1) <= (*p2) ); }
3136
+ }
3137
+ }
3138
+ }
3139
+
3140
+ static void
3141
+ ca_bincmp_le_float64_t (ca_size_t n, boolean8_t *m,
3142
+ char *ptr1, ca_size_t b1, ca_size_t i1,
3143
+ char *ptr2, ca_size_t b2, ca_size_t i2,
3144
+ char *ptr3, ca_size_t b3, ca_size_t i3,
3145
+ double tol)
3146
+ {
3147
+ double *q1 = (double *) ptr1, *q2 = (double *) ptr2;
3148
+ double *p1 = q1, *p2 = q2;
3149
+ boolean8_t *q3 = (boolean8_t *) ptr3;
3150
+ boolean8_t *p3 = q3;
3151
+ ca_size_t k;
3152
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
3153
+ (void) tol;
3154
+ if ( m ) {
3155
+ boolean8_t *pm;
3156
+ for (k=0; k<n; k++) {
3157
+ pm = m + k;
3158
+ if ( ! *pm ) {
3159
+ p1 = q1 + k*i1;
3160
+ p2 = q2 + k*i2;
3161
+ p3 = q3 + k*i3;
3162
+ { (*p3) = ( (*p1) <= (*p2) ); }
3163
+ }
3164
+ }
3165
+ } else {
3166
+ for (k=0; k<n; k++) {
3167
+ p1 = q1 + k*i1;
3168
+ p2 = q2 + k*i2;
3169
+ p3 = q3 + k*i3;
3170
+ { (*p3) = ( (*p1) <= (*p2) ); }
3171
+ }
3172
+ }
3173
+ }
3174
+
3175
+ static void
3176
+ ca_bincmp_le_VALUE (ca_size_t n, boolean8_t *m,
3177
+ char *ptr1, ca_size_t b1, ca_size_t i1,
3178
+ char *ptr2, ca_size_t b2, ca_size_t i2,
3179
+ char *ptr3, ca_size_t b3, ca_size_t i3,
3180
+ double tol)
3181
+ {
3182
+ VALUE *q1 = (VALUE *) ptr1, *q2 = (VALUE *) ptr2;
3183
+ VALUE *p1 = q1, *p2 = q2;
3184
+ boolean8_t *q3 = (boolean8_t *) ptr3;
3185
+ boolean8_t *p3 = q3;
3186
+ ca_size_t k;
3187
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
3188
+ (void) tol;
3189
+ if ( m ) {
3190
+ boolean8_t *pm;
3191
+ for (k=0; k<n; k++) {
3192
+ pm = m + k;
3193
+ if ( ! *pm ) {
3194
+ p1 = q1 + k*i1;
3195
+ p2 = q2 + k*i2;
3196
+ p3 = q3 + k*i3;
3197
+ { (*p3) = RTEST(rb_funcall((*p1), rb_intern("<="), 1, (*p2))) ? 1 : 0; }
3198
+ }
3199
+ }
3200
+ } else {
3201
+ for (k=0; k<n; k++) {
3202
+ p1 = q1 + k*i1;
3203
+ p2 = q2 + k*i2;
3204
+ p3 = q3 + k*i3;
3205
+ { (*p3) = RTEST(rb_funcall((*p1), rb_intern("<="), 1, (*p2))) ? 1 : 0; }
3206
+ }
3207
+ }
3208
+ }
3209
+
3210
+ ca_bincmp_func_t
3211
+ ca_bincmp_le[CA_NTYPE] = {
3212
+ ca_bincmp_le_fixlen,
3213
+ ca_bincmp_le_boolean8_t,
3214
+ ca_bincmp_le_int8_t,
3215
+ ca_bincmp_le_uint8_t,
3216
+ ca_bincmp_le_int16_t,
3217
+ ca_bincmp_le_uint16_t,
3218
+ ca_bincmp_le_int32_t,
3219
+ ca_bincmp_le_uint32_t,
3220
+ ca_bincmp_le_int64_t,
3221
+ ca_bincmp_le_uint64_t,
3222
+ ca_bincmp_le_float32_t,
3223
+ ca_bincmp_le_float64_t,
3224
+ ca_bincmp_not_implement,
3225
+ ca_bincmp_not_implement,
3226
+ ca_bincmp_not_implement,
3227
+ ca_bincmp_not_implement,
3228
+ ca_bincmp_le_VALUE,
3229
+ };
3230
+
3231
+ VALUE rb_ca_le (VALUE self, VALUE other)
3232
+ {
3233
+ if ( ! rb_ca_test_castable(other) ) {
3234
+ return rb_ca_binop_pass_to_other(self, other, rb_intern("le"));
3235
+ }
3236
+ return rb_ca_call_bincmp(self, other, ca_bincmp_le, 0.0);
3237
+ }
3238
+
3239
+ /* ===== bincmp match ============================================ */
3240
+
3241
+ static void
3242
+ ca_bincmp_match_fixlen (ca_size_t n, boolean8_t *m,
3243
+ char *ptr1, ca_size_t b1, ca_size_t i1,
3244
+ char *ptr2, ca_size_t b2, ca_size_t i2,
3245
+ char *ptr3, ca_size_t b3, ca_size_t i3,
3246
+ double tol)
3247
+ {
3248
+ char *q1 = ptr1, *q2 = ptr2;
3249
+ char *p1 = q1, *p2 = q2;
3250
+ boolean8_t *q3 = (boolean8_t *) ptr3;
3251
+ boolean8_t *p3 = q3;
3252
+ ca_size_t s1 = b1*i1, s2 = b2*i2, s3 = b3*i3;
3253
+ ca_size_t k;
3254
+ (void) tol;
3255
+ if ( m ) {
3256
+ boolean8_t *pm;
3257
+ for (k=0; k<n; k++) {
3258
+ pm = m + k;
3259
+ if ( ! *pm ) {
3260
+ p1 = q1 + k*s1;
3261
+ p2 = q2 + k*s2;
3262
+ p3 = q3 + k*s3;
3263
+ {
3264
+ (*p3) = RTEST(rb_funcall(rb_str_new(p1,b1), rb_intern("=~"), 1, (*p2)));
3265
+ }
3266
+ }
3267
+ }
3268
+ } else {
3269
+ for (k=0; k<n; k++) {
3270
+ p1 = q1 + k*s1;
3271
+ p2 = q2 + k*s2;
3272
+ p3 = q3 + k*s3;
3273
+ {
3274
+ (*p3) = RTEST(rb_funcall(rb_str_new(p1,b1), rb_intern("=~"), 1, (*p2)));
3275
+ }
3276
+ }
3277
+ }
3278
+ }
3279
+
3280
+ static void
3281
+ ca_bincmp_match_VALUE (ca_size_t n, boolean8_t *m,
3282
+ char *ptr1, ca_size_t b1, ca_size_t i1,
3283
+ char *ptr2, ca_size_t b2, ca_size_t i2,
3284
+ char *ptr3, ca_size_t b3, ca_size_t i3,
3285
+ double tol)
3286
+ {
3287
+ VALUE *q1 = (VALUE *) ptr1, *q2 = (VALUE *) ptr2;
3288
+ VALUE *p1 = q1, *p2 = q2;
3289
+ boolean8_t *q3 = (boolean8_t *) ptr3;
3290
+ boolean8_t *p3 = q3;
3291
+ ca_size_t k;
3292
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
3293
+ (void) tol;
3294
+ if ( m ) {
3295
+ boolean8_t *pm;
3296
+ for (k=0; k<n; k++) {
3297
+ pm = m + k;
3298
+ if ( ! *pm ) {
3299
+ p1 = q1 + k*i1;
3300
+ p2 = q2 + k*i2;
3301
+ p3 = q3 + k*i3;
3302
+ { (*p3) = RTEST(rb_funcall((*p1), rb_intern("=~"), 1, (*p2))); }
3303
+ }
3304
+ }
3305
+ } else {
3306
+ for (k=0; k<n; k++) {
3307
+ p1 = q1 + k*i1;
3308
+ p2 = q2 + k*i2;
3309
+ p3 = q3 + k*i3;
3310
+ { (*p3) = RTEST(rb_funcall((*p1), rb_intern("=~"), 1, (*p2))); }
3311
+ }
3312
+ }
3313
+ }
3314
+
3315
+ ca_bincmp_func_t
3316
+ ca_bincmp_match[CA_NTYPE] = {
3317
+ ca_bincmp_match_fixlen,
3318
+ ca_bincmp_not_implement,
3319
+ ca_bincmp_not_implement,
3320
+ ca_bincmp_not_implement,
3321
+ ca_bincmp_not_implement,
3322
+ ca_bincmp_not_implement,
3323
+ ca_bincmp_not_implement,
3324
+ ca_bincmp_not_implement,
3325
+ ca_bincmp_not_implement,
3326
+ ca_bincmp_not_implement,
3327
+ ca_bincmp_not_implement,
3328
+ ca_bincmp_not_implement,
3329
+ ca_bincmp_not_implement,
3330
+ ca_bincmp_not_implement,
3331
+ ca_bincmp_not_implement,
3332
+ ca_bincmp_not_implement,
3333
+ ca_bincmp_match_VALUE,
3334
+ };
3335
+
3336
+ VALUE rb_ca_match (VALUE self, VALUE other)
3337
+ {
3338
+ if ( ! rb_ca_test_castable(other) ) {
3339
+ return rb_ca_binop_pass_to_other(self, other, rb_intern("match"));
3340
+ }
3341
+ return rb_ca_call_bincmp(self, other, ca_bincmp_match, 0.0);
3342
+ }
3343
+
3344
+ /* ===== bincmp is_kind_of ============================================ */
3345
+
3346
+ static void
3347
+ ca_bincmp_is_kind_of_VALUE (ca_size_t n, boolean8_t *m,
3348
+ char *ptr1, ca_size_t b1, ca_size_t i1,
3349
+ char *ptr2, ca_size_t b2, ca_size_t i2,
3350
+ char *ptr3, ca_size_t b3, ca_size_t i3,
3351
+ double tol)
3352
+ {
3353
+ VALUE *q1 = (VALUE *) ptr1, *q2 = (VALUE *) ptr2;
3354
+ VALUE *p1 = q1, *p2 = q2;
3355
+ boolean8_t *q3 = (boolean8_t *) ptr3;
3356
+ boolean8_t *p3 = q3;
3357
+ ca_size_t k;
3358
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
3359
+ (void) tol;
3360
+ if ( m ) {
3361
+ boolean8_t *pm;
3362
+ for (k=0; k<n; k++) {
3363
+ pm = m + k;
3364
+ if ( ! *pm ) {
3365
+ p1 = q1 + k*i1;
3366
+ p2 = q2 + k*i2;
3367
+ p3 = q3 + k*i3;
3368
+ { (*p3) = RTEST(rb_obj_is_kind_of((*p1), (*p2))); }
3369
+ }
3370
+ }
3371
+ } else {
3372
+ for (k=0; k<n; k++) {
3373
+ p1 = q1 + k*i1;
3374
+ p2 = q2 + k*i2;
3375
+ p3 = q3 + k*i3;
3376
+ { (*p3) = RTEST(rb_obj_is_kind_of((*p1), (*p2))); }
3377
+ }
3378
+ }
3379
+ }
3380
+
3381
+ ca_bincmp_func_t
3382
+ ca_bincmp_is_kind_of[CA_NTYPE] = {
3383
+ ca_bincmp_not_implement,
3384
+ ca_bincmp_not_implement,
3385
+ ca_bincmp_not_implement,
3386
+ ca_bincmp_not_implement,
3387
+ ca_bincmp_not_implement,
3388
+ ca_bincmp_not_implement,
3389
+ ca_bincmp_not_implement,
3390
+ ca_bincmp_not_implement,
3391
+ ca_bincmp_not_implement,
3392
+ ca_bincmp_not_implement,
3393
+ ca_bincmp_not_implement,
3394
+ ca_bincmp_not_implement,
3395
+ ca_bincmp_not_implement,
3396
+ ca_bincmp_not_implement,
3397
+ ca_bincmp_not_implement,
3398
+ ca_bincmp_not_implement,
3399
+ ca_bincmp_is_kind_of_VALUE,
3400
+ };
3401
+
3402
+ VALUE rb_ca_is_kind_of (VALUE self, VALUE other)
3403
+ {
3404
+ if ( ! rb_ca_test_castable(other) ) {
3405
+ return rb_ca_binop_pass_to_other(self, other, rb_intern("is_kind_of"));
3406
+ }
3407
+ return rb_ca_call_bincmp(self, other, ca_bincmp_is_kind_of, 0.0);
3408
+ }
3409
+
3410
+ /* ===== bincmp is_close ============================================ */
3411
+
3412
+ static void
3413
+ ca_bincmp_is_close_int8_t (ca_size_t n, boolean8_t *m,
3414
+ char *ptr1, ca_size_t b1, ca_size_t i1,
3415
+ char *ptr2, ca_size_t b2, ca_size_t i2,
3416
+ char *ptr3, ca_size_t b3, ca_size_t i3,
3417
+ double tol)
3418
+ {
3419
+ int8_t *q1 = (int8_t *) ptr1, *q2 = (int8_t *) ptr2;
3420
+ int8_t *p1 = q1, *p2 = q2;
3421
+ boolean8_t *q3 = (boolean8_t *) ptr3;
3422
+ boolean8_t *p3 = q3;
3423
+ ca_size_t k;
3424
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
3425
+
3426
+ if ( m ) {
3427
+ boolean8_t *pm;
3428
+ for (k=0; k<n; k++) {
3429
+ pm = m + k;
3430
+ if ( ! *pm ) {
3431
+ p1 = q1 + k*i1;
3432
+ p2 = q2 + k*i2;
3433
+ p3 = q3 + k*i3;
3434
+ { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
3435
+ }
3436
+ }
3437
+ } else {
3438
+ for (k=0; k<n; k++) {
3439
+ p1 = q1 + k*i1;
3440
+ p2 = q2 + k*i2;
3441
+ p3 = q3 + k*i3;
3442
+ { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
3443
+ }
3444
+ }
3445
+ }
3446
+
3447
+ static void
3448
+ ca_bincmp_is_close_uint8_t (ca_size_t n, boolean8_t *m,
3449
+ char *ptr1, ca_size_t b1, ca_size_t i1,
3450
+ char *ptr2, ca_size_t b2, ca_size_t i2,
3451
+ char *ptr3, ca_size_t b3, ca_size_t i3,
3452
+ double tol)
3453
+ {
3454
+ uint8_t *q1 = (uint8_t *) ptr1, *q2 = (uint8_t *) ptr2;
3455
+ uint8_t *p1 = q1, *p2 = q2;
3456
+ boolean8_t *q3 = (boolean8_t *) ptr3;
3457
+ boolean8_t *p3 = q3;
3458
+ ca_size_t k;
3459
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
3460
+
3461
+ if ( m ) {
3462
+ boolean8_t *pm;
3463
+ for (k=0; k<n; k++) {
3464
+ pm = m + k;
3465
+ if ( ! *pm ) {
3466
+ p1 = q1 + k*i1;
3467
+ p2 = q2 + k*i2;
3468
+ p3 = q3 + k*i3;
3469
+ { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
3470
+ }
3471
+ }
3472
+ } else {
3473
+ for (k=0; k<n; k++) {
3474
+ p1 = q1 + k*i1;
3475
+ p2 = q2 + k*i2;
3476
+ p3 = q3 + k*i3;
3477
+ { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
3478
+ }
3479
+ }
3480
+ }
3481
+
3482
+ static void
3483
+ ca_bincmp_is_close_int16_t (ca_size_t n, boolean8_t *m,
3484
+ char *ptr1, ca_size_t b1, ca_size_t i1,
3485
+ char *ptr2, ca_size_t b2, ca_size_t i2,
3486
+ char *ptr3, ca_size_t b3, ca_size_t i3,
3487
+ double tol)
3488
+ {
3489
+ int16_t *q1 = (int16_t *) ptr1, *q2 = (int16_t *) ptr2;
3490
+ int16_t *p1 = q1, *p2 = q2;
3491
+ boolean8_t *q3 = (boolean8_t *) ptr3;
3492
+ boolean8_t *p3 = q3;
3493
+ ca_size_t k;
3494
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
3495
+
3496
+ if ( m ) {
3497
+ boolean8_t *pm;
3498
+ for (k=0; k<n; k++) {
3499
+ pm = m + k;
3500
+ if ( ! *pm ) {
3501
+ p1 = q1 + k*i1;
3502
+ p2 = q2 + k*i2;
3503
+ p3 = q3 + k*i3;
3504
+ { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
3505
+ }
3506
+ }
3507
+ } else {
3508
+ for (k=0; k<n; k++) {
3509
+ p1 = q1 + k*i1;
3510
+ p2 = q2 + k*i2;
3511
+ p3 = q3 + k*i3;
3512
+ { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
3513
+ }
3514
+ }
3515
+ }
3516
+
3517
+ static void
3518
+ ca_bincmp_is_close_uint16_t (ca_size_t n, boolean8_t *m,
3519
+ char *ptr1, ca_size_t b1, ca_size_t i1,
3520
+ char *ptr2, ca_size_t b2, ca_size_t i2,
3521
+ char *ptr3, ca_size_t b3, ca_size_t i3,
3522
+ double tol)
3523
+ {
3524
+ uint16_t *q1 = (uint16_t *) ptr1, *q2 = (uint16_t *) ptr2;
3525
+ uint16_t *p1 = q1, *p2 = q2;
3526
+ boolean8_t *q3 = (boolean8_t *) ptr3;
3527
+ boolean8_t *p3 = q3;
3528
+ ca_size_t k;
3529
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
3530
+
3531
+ if ( m ) {
3532
+ boolean8_t *pm;
3533
+ for (k=0; k<n; k++) {
3534
+ pm = m + k;
3535
+ if ( ! *pm ) {
3536
+ p1 = q1 + k*i1;
3537
+ p2 = q2 + k*i2;
3538
+ p3 = q3 + k*i3;
3539
+ { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
3540
+ }
3541
+ }
3542
+ } else {
3543
+ for (k=0; k<n; k++) {
3544
+ p1 = q1 + k*i1;
3545
+ p2 = q2 + k*i2;
3546
+ p3 = q3 + k*i3;
3547
+ { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
3548
+ }
3549
+ }
3550
+ }
3551
+
3552
+ static void
3553
+ ca_bincmp_is_close_int32_t (ca_size_t n, boolean8_t *m,
3554
+ char *ptr1, ca_size_t b1, ca_size_t i1,
3555
+ char *ptr2, ca_size_t b2, ca_size_t i2,
3556
+ char *ptr3, ca_size_t b3, ca_size_t i3,
3557
+ double tol)
3558
+ {
3559
+ int32_t *q1 = (int32_t *) ptr1, *q2 = (int32_t *) ptr2;
3560
+ int32_t *p1 = q1, *p2 = q2;
3561
+ boolean8_t *q3 = (boolean8_t *) ptr3;
3562
+ boolean8_t *p3 = q3;
3563
+ ca_size_t k;
3564
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
3565
+
3566
+ if ( m ) {
3567
+ boolean8_t *pm;
3568
+ for (k=0; k<n; k++) {
3569
+ pm = m + k;
3570
+ if ( ! *pm ) {
3571
+ p1 = q1 + k*i1;
3572
+ p2 = q2 + k*i2;
3573
+ p3 = q3 + k*i3;
3574
+ { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
3575
+ }
3576
+ }
3577
+ } else {
3578
+ for (k=0; k<n; k++) {
3579
+ p1 = q1 + k*i1;
3580
+ p2 = q2 + k*i2;
3581
+ p3 = q3 + k*i3;
3582
+ { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
3583
+ }
3584
+ }
3585
+ }
3586
+
3587
+ static void
3588
+ ca_bincmp_is_close_uint32_t (ca_size_t n, boolean8_t *m,
3589
+ char *ptr1, ca_size_t b1, ca_size_t i1,
3590
+ char *ptr2, ca_size_t b2, ca_size_t i2,
3591
+ char *ptr3, ca_size_t b3, ca_size_t i3,
3592
+ double tol)
3593
+ {
3594
+ uint32_t *q1 = (uint32_t *) ptr1, *q2 = (uint32_t *) ptr2;
3595
+ uint32_t *p1 = q1, *p2 = q2;
3596
+ boolean8_t *q3 = (boolean8_t *) ptr3;
3597
+ boolean8_t *p3 = q3;
3598
+ ca_size_t k;
3599
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
3600
+
3601
+ if ( m ) {
3602
+ boolean8_t *pm;
3603
+ for (k=0; k<n; k++) {
3604
+ pm = m + k;
3605
+ if ( ! *pm ) {
3606
+ p1 = q1 + k*i1;
3607
+ p2 = q2 + k*i2;
3608
+ p3 = q3 + k*i3;
3609
+ { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
3610
+ }
3611
+ }
3612
+ } else {
3613
+ for (k=0; k<n; k++) {
3614
+ p1 = q1 + k*i1;
3615
+ p2 = q2 + k*i2;
3616
+ p3 = q3 + k*i3;
3617
+ { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
3618
+ }
3619
+ }
3620
+ }
3621
+
3622
+ static void
3623
+ ca_bincmp_is_close_int64_t (ca_size_t n, boolean8_t *m,
3624
+ char *ptr1, ca_size_t b1, ca_size_t i1,
3625
+ char *ptr2, ca_size_t b2, ca_size_t i2,
3626
+ char *ptr3, ca_size_t b3, ca_size_t i3,
3627
+ double tol)
3628
+ {
3629
+ int64_t *q1 = (int64_t *) ptr1, *q2 = (int64_t *) ptr2;
3630
+ int64_t *p1 = q1, *p2 = q2;
3631
+ boolean8_t *q3 = (boolean8_t *) ptr3;
3632
+ boolean8_t *p3 = q3;
3633
+ ca_size_t k;
3634
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
3635
+
3636
+ if ( m ) {
3637
+ boolean8_t *pm;
3638
+ for (k=0; k<n; k++) {
3639
+ pm = m + k;
3640
+ if ( ! *pm ) {
3641
+ p1 = q1 + k*i1;
3642
+ p2 = q2 + k*i2;
3643
+ p3 = q3 + k*i3;
3644
+ { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
3645
+ }
3646
+ }
3647
+ } else {
3648
+ for (k=0; k<n; k++) {
3649
+ p1 = q1 + k*i1;
3650
+ p2 = q2 + k*i2;
3651
+ p3 = q3 + k*i3;
3652
+ { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
3653
+ }
3654
+ }
3655
+ }
3656
+
3657
+ static void
3658
+ ca_bincmp_is_close_uint64_t (ca_size_t n, boolean8_t *m,
3659
+ char *ptr1, ca_size_t b1, ca_size_t i1,
3660
+ char *ptr2, ca_size_t b2, ca_size_t i2,
3661
+ char *ptr3, ca_size_t b3, ca_size_t i3,
3662
+ double tol)
3663
+ {
3664
+ uint64_t *q1 = (uint64_t *) ptr1, *q2 = (uint64_t *) ptr2;
3665
+ uint64_t *p1 = q1, *p2 = q2;
3666
+ boolean8_t *q3 = (boolean8_t *) ptr3;
3667
+ boolean8_t *p3 = q3;
3668
+ ca_size_t k;
3669
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
3670
+
3671
+ if ( m ) {
3672
+ boolean8_t *pm;
3673
+ for (k=0; k<n; k++) {
3674
+ pm = m + k;
3675
+ if ( ! *pm ) {
3676
+ p1 = q1 + k*i1;
3677
+ p2 = q2 + k*i2;
3678
+ p3 = q3 + k*i3;
3679
+ { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
3680
+ }
3681
+ }
3682
+ } else {
3683
+ for (k=0; k<n; k++) {
3684
+ p1 = q1 + k*i1;
3685
+ p2 = q2 + k*i2;
3686
+ p3 = q3 + k*i3;
3687
+ { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
3688
+ }
3689
+ }
3690
+ }
3691
+
3692
+ static void
3693
+ ca_bincmp_is_close_float32_t (ca_size_t n, boolean8_t *m,
3694
+ char *ptr1, ca_size_t b1, ca_size_t i1,
3695
+ char *ptr2, ca_size_t b2, ca_size_t i2,
3696
+ char *ptr3, ca_size_t b3, ca_size_t i3,
3697
+ double tol)
3698
+ {
3699
+ float *q1 = (float *) ptr1, *q2 = (float *) ptr2;
3700
+ float *p1 = q1, *p2 = q2;
3701
+ boolean8_t *q3 = (boolean8_t *) ptr3;
3702
+ boolean8_t *p3 = q3;
3703
+ ca_size_t k;
3704
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
3705
+
3706
+ if ( m ) {
3707
+ boolean8_t *pm;
3708
+ for (k=0; k<n; k++) {
3709
+ pm = m + k;
3710
+ if ( ! *pm ) {
3711
+ p1 = q1 + k*i1;
3712
+ p2 = q2 + k*i2;
3713
+ p3 = q3 + k*i3;
3714
+ { (*p3) = (fabs((*p1) - (*p2)) <= tol) ? 1 : 0; }
3715
+ }
3716
+ }
3717
+ } else {
3718
+ for (k=0; k<n; k++) {
3719
+ p1 = q1 + k*i1;
3720
+ p2 = q2 + k*i2;
3721
+ p3 = q3 + k*i3;
3722
+ { (*p3) = (fabs((*p1) - (*p2)) <= tol) ? 1 : 0; }
3723
+ }
3724
+ }
3725
+ }
3726
+
3727
+ static void
3728
+ ca_bincmp_is_close_float64_t (ca_size_t n, boolean8_t *m,
3729
+ char *ptr1, ca_size_t b1, ca_size_t i1,
3730
+ char *ptr2, ca_size_t b2, ca_size_t i2,
3731
+ char *ptr3, ca_size_t b3, ca_size_t i3,
3732
+ double tol)
3733
+ {
3734
+ double *q1 = (double *) ptr1, *q2 = (double *) ptr2;
3735
+ double *p1 = q1, *p2 = q2;
3736
+ boolean8_t *q3 = (boolean8_t *) ptr3;
3737
+ boolean8_t *p3 = q3;
3738
+ ca_size_t k;
3739
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
3740
+
3741
+ if ( m ) {
3742
+ boolean8_t *pm;
3743
+ for (k=0; k<n; k++) {
3744
+ pm = m + k;
3745
+ if ( ! *pm ) {
3746
+ p1 = q1 + k*i1;
3747
+ p2 = q2 + k*i2;
3748
+ p3 = q3 + k*i3;
3749
+ { (*p3) = (fabs((*p1) - (*p2)) <= tol) ? 1 : 0; }
3750
+ }
3751
+ }
3752
+ } else {
3753
+ for (k=0; k<n; k++) {
3754
+ p1 = q1 + k*i1;
3755
+ p2 = q2 + k*i2;
3756
+ p3 = q3 + k*i3;
3757
+ { (*p3) = (fabs((*p1) - (*p2)) <= tol) ? 1 : 0; }
3758
+ }
3759
+ }
3760
+ }
3761
+
3762
+ static void
3763
+ ca_bincmp_is_close_cmplx64_t (ca_size_t n, boolean8_t *m,
3764
+ char *ptr1, ca_size_t b1, ca_size_t i1,
3765
+ char *ptr2, ca_size_t b2, ca_size_t i2,
3766
+ char *ptr3, ca_size_t b3, ca_size_t i3,
3767
+ double tol)
3768
+ {
3769
+ cmplx64_t *q1 = (cmplx64_t *) ptr1, *q2 = (cmplx64_t *) ptr2;
3770
+ cmplx64_t *p1 = q1, *p2 = q2;
3771
+ boolean8_t *q3 = (boolean8_t *) ptr3;
3772
+ boolean8_t *p3 = q3;
3773
+ ca_size_t k;
3774
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
3775
+
3776
+ if ( m ) {
3777
+ boolean8_t *pm;
3778
+ for (k=0; k<n; k++) {
3779
+ pm = m + k;
3780
+ if ( ! *pm ) {
3781
+ p1 = q1 + k*i1;
3782
+ p2 = q2 + k*i2;
3783
+ p3 = q3 + k*i3;
3784
+ { (*p3) = (cabs((*p1) - (*p2)) <= tol) ? 1 : 0; }
3785
+ }
3786
+ }
3787
+ } else {
3788
+ for (k=0; k<n; k++) {
3789
+ p1 = q1 + k*i1;
3790
+ p2 = q2 + k*i2;
3791
+ p3 = q3 + k*i3;
3792
+ { (*p3) = (cabs((*p1) - (*p2)) <= tol) ? 1 : 0; }
3793
+ }
3794
+ }
3795
+ }
3796
+
3797
+ static void
3798
+ ca_bincmp_is_close_cmplx128_t (ca_size_t n, boolean8_t *m,
3799
+ char *ptr1, ca_size_t b1, ca_size_t i1,
3800
+ char *ptr2, ca_size_t b2, ca_size_t i2,
3801
+ char *ptr3, ca_size_t b3, ca_size_t i3,
3802
+ double tol)
3803
+ {
3804
+ cmplx128_t *q1 = (cmplx128_t *) ptr1, *q2 = (cmplx128_t *) ptr2;
3805
+ cmplx128_t *p1 = q1, *p2 = q2;
3806
+ boolean8_t *q3 = (boolean8_t *) ptr3;
3807
+ boolean8_t *p3 = q3;
3808
+ ca_size_t k;
3809
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
3810
+
3811
+ if ( m ) {
3812
+ boolean8_t *pm;
3813
+ for (k=0; k<n; k++) {
3814
+ pm = m + k;
3815
+ if ( ! *pm ) {
3816
+ p1 = q1 + k*i1;
3817
+ p2 = q2 + k*i2;
3818
+ p3 = q3 + k*i3;
3819
+ { (*p3) = (cabs((*p1) - (*p2)) <= tol) ? 1 : 0; }
3820
+ }
3821
+ }
3822
+ } else {
3823
+ for (k=0; k<n; k++) {
3824
+ p1 = q1 + k*i1;
3825
+ p2 = q2 + k*i2;
3826
+ p3 = q3 + k*i3;
3827
+ { (*p3) = (cabs((*p1) - (*p2)) <= tol) ? 1 : 0; }
3828
+ }
3829
+ }
3830
+ }
3831
+
3832
+ ca_bincmp_func_t
3833
+ ca_bincmp_is_close[CA_NTYPE] = {
3834
+ ca_bincmp_not_implement,
3835
+ ca_bincmp_not_implement,
3836
+ ca_bincmp_is_close_int8_t,
3837
+ ca_bincmp_is_close_uint8_t,
3838
+ ca_bincmp_is_close_int16_t,
3839
+ ca_bincmp_is_close_uint16_t,
3840
+ ca_bincmp_is_close_int32_t,
3841
+ ca_bincmp_is_close_uint32_t,
3842
+ ca_bincmp_is_close_int64_t,
3843
+ ca_bincmp_is_close_uint64_t,
3844
+ ca_bincmp_is_close_float32_t,
3845
+ ca_bincmp_is_close_float64_t,
3846
+ ca_bincmp_not_implement,
3847
+ ca_bincmp_is_close_cmplx64_t,
3848
+ ca_bincmp_is_close_cmplx128_t,
3849
+ ca_bincmp_not_implement,
3850
+ ca_bincmp_not_implement,
3851
+ };
3852
+
3853
+ VALUE rb_ca_is_close (VALUE self, VALUE other, VALUE tol_val)
3854
+ {
3855
+ double tol = fabs(NUM2DBL(tol_val));
3856
+ if ( ! rb_ca_test_castable(other) ) {
3857
+ return rb_funcall(other, rb_intern("is_close"), 2, self, tol_val);
3858
+ }
3859
+ return rb_ca_call_bincmp(self, other, ca_bincmp_is_close, tol);
3860
+ }
3861
+
3862
+ /* ===== bincmp is_equiv ============================================ */
3863
+
3864
+ static void
3865
+ ca_bincmp_is_equiv_int8_t (ca_size_t n, boolean8_t *m,
3866
+ char *ptr1, ca_size_t b1, ca_size_t i1,
3867
+ char *ptr2, ca_size_t b2, ca_size_t i2,
3868
+ char *ptr3, ca_size_t b3, ca_size_t i3,
3869
+ double tol)
3870
+ {
3871
+ int8_t *q1 = (int8_t *) ptr1, *q2 = (int8_t *) ptr2;
3872
+ int8_t *p1 = q1, *p2 = q2;
3873
+ boolean8_t *q3 = (boolean8_t *) ptr3;
3874
+ boolean8_t *p3 = q3;
3875
+ ca_size_t k;
3876
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
3877
+
3878
+ if ( m ) {
3879
+ boolean8_t *pm;
3880
+ for (k=0; k<n; k++) {
3881
+ pm = m + k;
3882
+ if ( ! *pm ) {
3883
+ p1 = q1 + k*i1;
3884
+ p2 = q2 + k*i2;
3885
+ p3 = q3 + k*i3;
3886
+ {
3887
+ double a = (double)(*p1), b = (double)(*p2);
3888
+ double aa = fabs(a), ab = fabs(b);
3889
+ double m = (aa > ab) ? aa : ab;
3890
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs(a - b) / m <= tol) ) ? 1 : 0;
3891
+ }
3892
+ }
3893
+ }
3894
+ } else {
3895
+ for (k=0; k<n; k++) {
3896
+ p1 = q1 + k*i1;
3897
+ p2 = q2 + k*i2;
3898
+ p3 = q3 + k*i3;
3899
+ {
3900
+ double a = (double)(*p1), b = (double)(*p2);
3901
+ double aa = fabs(a), ab = fabs(b);
3902
+ double m = (aa > ab) ? aa : ab;
3903
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs(a - b) / m <= tol) ) ? 1 : 0;
3904
+ }
3905
+ }
3906
+ }
3907
+ }
3908
+
3909
+ static void
3910
+ ca_bincmp_is_equiv_uint8_t (ca_size_t n, boolean8_t *m,
3911
+ char *ptr1, ca_size_t b1, ca_size_t i1,
3912
+ char *ptr2, ca_size_t b2, ca_size_t i2,
3913
+ char *ptr3, ca_size_t b3, ca_size_t i3,
3914
+ double tol)
3915
+ {
3916
+ uint8_t *q1 = (uint8_t *) ptr1, *q2 = (uint8_t *) ptr2;
3917
+ uint8_t *p1 = q1, *p2 = q2;
3918
+ boolean8_t *q3 = (boolean8_t *) ptr3;
3919
+ boolean8_t *p3 = q3;
3920
+ ca_size_t k;
3921
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
3922
+
3923
+ if ( m ) {
3924
+ boolean8_t *pm;
3925
+ for (k=0; k<n; k++) {
3926
+ pm = m + k;
3927
+ if ( ! *pm ) {
3928
+ p1 = q1 + k*i1;
3929
+ p2 = q2 + k*i2;
3930
+ p3 = q3 + k*i3;
3931
+ {
3932
+ double a = (double)(*p1), b = (double)(*p2);
3933
+ double aa = fabs(a), ab = fabs(b);
3934
+ double m = (aa > ab) ? aa : ab;
3935
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs(a - b) / m <= tol) ) ? 1 : 0;
3936
+ }
3937
+ }
3938
+ }
3939
+ } else {
3940
+ for (k=0; k<n; k++) {
3941
+ p1 = q1 + k*i1;
3942
+ p2 = q2 + k*i2;
3943
+ p3 = q3 + k*i3;
3944
+ {
3945
+ double a = (double)(*p1), b = (double)(*p2);
3946
+ double aa = fabs(a), ab = fabs(b);
3947
+ double m = (aa > ab) ? aa : ab;
3948
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs(a - b) / m <= tol) ) ? 1 : 0;
3949
+ }
3950
+ }
3951
+ }
3952
+ }
3953
+
3954
+ static void
3955
+ ca_bincmp_is_equiv_int16_t (ca_size_t n, boolean8_t *m,
3956
+ char *ptr1, ca_size_t b1, ca_size_t i1,
3957
+ char *ptr2, ca_size_t b2, ca_size_t i2,
3958
+ char *ptr3, ca_size_t b3, ca_size_t i3,
3959
+ double tol)
3960
+ {
3961
+ int16_t *q1 = (int16_t *) ptr1, *q2 = (int16_t *) ptr2;
3962
+ int16_t *p1 = q1, *p2 = q2;
3963
+ boolean8_t *q3 = (boolean8_t *) ptr3;
3964
+ boolean8_t *p3 = q3;
3965
+ ca_size_t k;
3966
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
3967
+
3968
+ if ( m ) {
3969
+ boolean8_t *pm;
3970
+ for (k=0; k<n; k++) {
3971
+ pm = m + k;
3972
+ if ( ! *pm ) {
3973
+ p1 = q1 + k*i1;
3974
+ p2 = q2 + k*i2;
3975
+ p3 = q3 + k*i3;
3976
+ {
3977
+ double a = (double)(*p1), b = (double)(*p2);
3978
+ double aa = fabs(a), ab = fabs(b);
3979
+ double m = (aa > ab) ? aa : ab;
3980
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs(a - b) / m <= tol) ) ? 1 : 0;
3981
+ }
3982
+ }
3983
+ }
3984
+ } else {
3985
+ for (k=0; k<n; k++) {
3986
+ p1 = q1 + k*i1;
3987
+ p2 = q2 + k*i2;
3988
+ p3 = q3 + k*i3;
3989
+ {
3990
+ double a = (double)(*p1), b = (double)(*p2);
3991
+ double aa = fabs(a), ab = fabs(b);
3992
+ double m = (aa > ab) ? aa : ab;
3993
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs(a - b) / m <= tol) ) ? 1 : 0;
3994
+ }
3995
+ }
3996
+ }
3997
+ }
3998
+
3999
+ static void
4000
+ ca_bincmp_is_equiv_uint16_t (ca_size_t n, boolean8_t *m,
4001
+ char *ptr1, ca_size_t b1, ca_size_t i1,
4002
+ char *ptr2, ca_size_t b2, ca_size_t i2,
4003
+ char *ptr3, ca_size_t b3, ca_size_t i3,
4004
+ double tol)
4005
+ {
4006
+ uint16_t *q1 = (uint16_t *) ptr1, *q2 = (uint16_t *) ptr2;
4007
+ uint16_t *p1 = q1, *p2 = q2;
4008
+ boolean8_t *q3 = (boolean8_t *) ptr3;
4009
+ boolean8_t *p3 = q3;
4010
+ ca_size_t k;
4011
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
4012
+
4013
+ if ( m ) {
4014
+ boolean8_t *pm;
4015
+ for (k=0; k<n; k++) {
4016
+ pm = m + k;
4017
+ if ( ! *pm ) {
4018
+ p1 = q1 + k*i1;
4019
+ p2 = q2 + k*i2;
4020
+ p3 = q3 + k*i3;
4021
+ {
4022
+ double a = (double)(*p1), b = (double)(*p2);
4023
+ double aa = fabs(a), ab = fabs(b);
4024
+ double m = (aa > ab) ? aa : ab;
4025
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs(a - b) / m <= tol) ) ? 1 : 0;
4026
+ }
4027
+ }
4028
+ }
4029
+ } else {
4030
+ for (k=0; k<n; k++) {
4031
+ p1 = q1 + k*i1;
4032
+ p2 = q2 + k*i2;
4033
+ p3 = q3 + k*i3;
4034
+ {
4035
+ double a = (double)(*p1), b = (double)(*p2);
4036
+ double aa = fabs(a), ab = fabs(b);
4037
+ double m = (aa > ab) ? aa : ab;
4038
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs(a - b) / m <= tol) ) ? 1 : 0;
4039
+ }
4040
+ }
4041
+ }
4042
+ }
4043
+
4044
+ static void
4045
+ ca_bincmp_is_equiv_int32_t (ca_size_t n, boolean8_t *m,
4046
+ char *ptr1, ca_size_t b1, ca_size_t i1,
4047
+ char *ptr2, ca_size_t b2, ca_size_t i2,
4048
+ char *ptr3, ca_size_t b3, ca_size_t i3,
4049
+ double tol)
4050
+ {
4051
+ int32_t *q1 = (int32_t *) ptr1, *q2 = (int32_t *) ptr2;
4052
+ int32_t *p1 = q1, *p2 = q2;
4053
+ boolean8_t *q3 = (boolean8_t *) ptr3;
4054
+ boolean8_t *p3 = q3;
4055
+ ca_size_t k;
4056
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
4057
+
4058
+ if ( m ) {
4059
+ boolean8_t *pm;
4060
+ for (k=0; k<n; k++) {
4061
+ pm = m + k;
4062
+ if ( ! *pm ) {
4063
+ p1 = q1 + k*i1;
4064
+ p2 = q2 + k*i2;
4065
+ p3 = q3 + k*i3;
4066
+ {
4067
+ double a = (double)(*p1), b = (double)(*p2);
4068
+ double aa = fabs(a), ab = fabs(b);
4069
+ double m = (aa > ab) ? aa : ab;
4070
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs(a - b) / m <= tol) ) ? 1 : 0;
4071
+ }
4072
+ }
4073
+ }
4074
+ } else {
4075
+ for (k=0; k<n; k++) {
4076
+ p1 = q1 + k*i1;
4077
+ p2 = q2 + k*i2;
4078
+ p3 = q3 + k*i3;
4079
+ {
4080
+ double a = (double)(*p1), b = (double)(*p2);
4081
+ double aa = fabs(a), ab = fabs(b);
4082
+ double m = (aa > ab) ? aa : ab;
4083
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs(a - b) / m <= tol) ) ? 1 : 0;
4084
+ }
4085
+ }
4086
+ }
4087
+ }
4088
+
4089
+ static void
4090
+ ca_bincmp_is_equiv_uint32_t (ca_size_t n, boolean8_t *m,
4091
+ char *ptr1, ca_size_t b1, ca_size_t i1,
4092
+ char *ptr2, ca_size_t b2, ca_size_t i2,
4093
+ char *ptr3, ca_size_t b3, ca_size_t i3,
4094
+ double tol)
4095
+ {
4096
+ uint32_t *q1 = (uint32_t *) ptr1, *q2 = (uint32_t *) ptr2;
4097
+ uint32_t *p1 = q1, *p2 = q2;
4098
+ boolean8_t *q3 = (boolean8_t *) ptr3;
4099
+ boolean8_t *p3 = q3;
4100
+ ca_size_t k;
4101
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
4102
+
4103
+ if ( m ) {
4104
+ boolean8_t *pm;
4105
+ for (k=0; k<n; k++) {
4106
+ pm = m + k;
4107
+ if ( ! *pm ) {
4108
+ p1 = q1 + k*i1;
4109
+ p2 = q2 + k*i2;
4110
+ p3 = q3 + k*i3;
4111
+ {
4112
+ double a = (double)(*p1), b = (double)(*p2);
4113
+ double aa = fabs(a), ab = fabs(b);
4114
+ double m = (aa > ab) ? aa : ab;
4115
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs(a - b) / m <= tol) ) ? 1 : 0;
4116
+ }
4117
+ }
4118
+ }
4119
+ } else {
4120
+ for (k=0; k<n; k++) {
4121
+ p1 = q1 + k*i1;
4122
+ p2 = q2 + k*i2;
4123
+ p3 = q3 + k*i3;
4124
+ {
4125
+ double a = (double)(*p1), b = (double)(*p2);
4126
+ double aa = fabs(a), ab = fabs(b);
4127
+ double m = (aa > ab) ? aa : ab;
4128
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs(a - b) / m <= tol) ) ? 1 : 0;
4129
+ }
4130
+ }
4131
+ }
4132
+ }
4133
+
4134
+ static void
4135
+ ca_bincmp_is_equiv_int64_t (ca_size_t n, boolean8_t *m,
4136
+ char *ptr1, ca_size_t b1, ca_size_t i1,
4137
+ char *ptr2, ca_size_t b2, ca_size_t i2,
4138
+ char *ptr3, ca_size_t b3, ca_size_t i3,
4139
+ double tol)
4140
+ {
4141
+ int64_t *q1 = (int64_t *) ptr1, *q2 = (int64_t *) ptr2;
4142
+ int64_t *p1 = q1, *p2 = q2;
4143
+ boolean8_t *q3 = (boolean8_t *) ptr3;
4144
+ boolean8_t *p3 = q3;
4145
+ ca_size_t k;
4146
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
4147
+
4148
+ if ( m ) {
4149
+ boolean8_t *pm;
4150
+ for (k=0; k<n; k++) {
4151
+ pm = m + k;
4152
+ if ( ! *pm ) {
4153
+ p1 = q1 + k*i1;
4154
+ p2 = q2 + k*i2;
4155
+ p3 = q3 + k*i3;
4156
+ {
4157
+ double a = (double)(*p1), b = (double)(*p2);
4158
+ double aa = fabs(a), ab = fabs(b);
4159
+ double m = (aa > ab) ? aa : ab;
4160
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs(a - b) / m <= tol) ) ? 1 : 0;
4161
+ }
4162
+ }
4163
+ }
4164
+ } else {
4165
+ for (k=0; k<n; k++) {
4166
+ p1 = q1 + k*i1;
4167
+ p2 = q2 + k*i2;
4168
+ p3 = q3 + k*i3;
4169
+ {
4170
+ double a = (double)(*p1), b = (double)(*p2);
4171
+ double aa = fabs(a), ab = fabs(b);
4172
+ double m = (aa > ab) ? aa : ab;
4173
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs(a - b) / m <= tol) ) ? 1 : 0;
4174
+ }
4175
+ }
4176
+ }
4177
+ }
4178
+
4179
+ static void
4180
+ ca_bincmp_is_equiv_uint64_t (ca_size_t n, boolean8_t *m,
4181
+ char *ptr1, ca_size_t b1, ca_size_t i1,
4182
+ char *ptr2, ca_size_t b2, ca_size_t i2,
4183
+ char *ptr3, ca_size_t b3, ca_size_t i3,
4184
+ double tol)
4185
+ {
4186
+ uint64_t *q1 = (uint64_t *) ptr1, *q2 = (uint64_t *) ptr2;
4187
+ uint64_t *p1 = q1, *p2 = q2;
4188
+ boolean8_t *q3 = (boolean8_t *) ptr3;
4189
+ boolean8_t *p3 = q3;
4190
+ ca_size_t k;
4191
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
4192
+
4193
+ if ( m ) {
4194
+ boolean8_t *pm;
4195
+ for (k=0; k<n; k++) {
4196
+ pm = m + k;
4197
+ if ( ! *pm ) {
4198
+ p1 = q1 + k*i1;
4199
+ p2 = q2 + k*i2;
4200
+ p3 = q3 + k*i3;
4201
+ {
4202
+ double a = (double)(*p1), b = (double)(*p2);
4203
+ double aa = fabs(a), ab = fabs(b);
4204
+ double m = (aa > ab) ? aa : ab;
4205
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs(a - b) / m <= tol) ) ? 1 : 0;
4206
+ }
4207
+ }
4208
+ }
4209
+ } else {
4210
+ for (k=0; k<n; k++) {
4211
+ p1 = q1 + k*i1;
4212
+ p2 = q2 + k*i2;
4213
+ p3 = q3 + k*i3;
4214
+ {
4215
+ double a = (double)(*p1), b = (double)(*p2);
4216
+ double aa = fabs(a), ab = fabs(b);
4217
+ double m = (aa > ab) ? aa : ab;
4218
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs(a - b) / m <= tol) ) ? 1 : 0;
4219
+ }
4220
+ }
4221
+ }
4222
+ }
4223
+
4224
+ static void
4225
+ ca_bincmp_is_equiv_float32_t (ca_size_t n, boolean8_t *m,
4226
+ char *ptr1, ca_size_t b1, ca_size_t i1,
4227
+ char *ptr2, ca_size_t b2, ca_size_t i2,
4228
+ char *ptr3, ca_size_t b3, ca_size_t i3,
4229
+ double tol)
4230
+ {
4231
+ float *q1 = (float *) ptr1, *q2 = (float *) ptr2;
4232
+ float *p1 = q1, *p2 = q2;
4233
+ boolean8_t *q3 = (boolean8_t *) ptr3;
4234
+ boolean8_t *p3 = q3;
4235
+ ca_size_t k;
4236
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
4237
+
4238
+ if ( m ) {
4239
+ boolean8_t *pm;
4240
+ for (k=0; k<n; k++) {
4241
+ pm = m + k;
4242
+ if ( ! *pm ) {
4243
+ p1 = q1 + k*i1;
4244
+ p2 = q2 + k*i2;
4245
+ p3 = q3 + k*i3;
4246
+ {
4247
+ float aa = fabs((*p1)), ab = fabs((*p2));
4248
+ float m = (aa > ab) ? aa : ab;
4249
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs((*p1) - (*p2)) / m <= tol) ) ? 1 : 0;
4250
+ }
4251
+ }
4252
+ }
4253
+ } else {
4254
+ for (k=0; k<n; k++) {
4255
+ p1 = q1 + k*i1;
4256
+ p2 = q2 + k*i2;
4257
+ p3 = q3 + k*i3;
4258
+ {
4259
+ float aa = fabs((*p1)), ab = fabs((*p2));
4260
+ float m = (aa > ab) ? aa : ab;
4261
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs((*p1) - (*p2)) / m <= tol) ) ? 1 : 0;
4262
+ }
4263
+ }
4264
+ }
4265
+ }
4266
+
4267
+ static void
4268
+ ca_bincmp_is_equiv_float64_t (ca_size_t n, boolean8_t *m,
4269
+ char *ptr1, ca_size_t b1, ca_size_t i1,
4270
+ char *ptr2, ca_size_t b2, ca_size_t i2,
4271
+ char *ptr3, ca_size_t b3, ca_size_t i3,
4272
+ double tol)
4273
+ {
4274
+ double *q1 = (double *) ptr1, *q2 = (double *) ptr2;
4275
+ double *p1 = q1, *p2 = q2;
4276
+ boolean8_t *q3 = (boolean8_t *) ptr3;
4277
+ boolean8_t *p3 = q3;
4278
+ ca_size_t k;
4279
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
4280
+
4281
+ if ( m ) {
4282
+ boolean8_t *pm;
4283
+ for (k=0; k<n; k++) {
4284
+ pm = m + k;
4285
+ if ( ! *pm ) {
4286
+ p1 = q1 + k*i1;
4287
+ p2 = q2 + k*i2;
4288
+ p3 = q3 + k*i3;
4289
+ {
4290
+ double aa = fabs((*p1)), ab = fabs((*p2));
4291
+ double m = (aa > ab) ? aa : ab;
4292
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs((*p1) - (*p2)) / m <= tol) ) ? 1 : 0;
4293
+ }
4294
+ }
4295
+ }
4296
+ } else {
4297
+ for (k=0; k<n; k++) {
4298
+ p1 = q1 + k*i1;
4299
+ p2 = q2 + k*i2;
4300
+ p3 = q3 + k*i3;
4301
+ {
4302
+ double aa = fabs((*p1)), ab = fabs((*p2));
4303
+ double m = (aa > ab) ? aa : ab;
4304
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs((*p1) - (*p2)) / m <= tol) ) ? 1 : 0;
4305
+ }
4306
+ }
4307
+ }
4308
+ }
4309
+
4310
+ static void
4311
+ ca_bincmp_is_equiv_cmplx64_t (ca_size_t n, boolean8_t *m,
4312
+ char *ptr1, ca_size_t b1, ca_size_t i1,
4313
+ char *ptr2, ca_size_t b2, ca_size_t i2,
4314
+ char *ptr3, ca_size_t b3, ca_size_t i3,
4315
+ double tol)
4316
+ {
4317
+ cmplx64_t *q1 = (cmplx64_t *) ptr1, *q2 = (cmplx64_t *) ptr2;
4318
+ cmplx64_t *p1 = q1, *p2 = q2;
4319
+ boolean8_t *q3 = (boolean8_t *) ptr3;
4320
+ boolean8_t *p3 = q3;
4321
+ ca_size_t k;
4322
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
4323
+
4324
+ if ( m ) {
4325
+ boolean8_t *pm;
4326
+ for (k=0; k<n; k++) {
4327
+ pm = m + k;
4328
+ if ( ! *pm ) {
4329
+ p1 = q1 + k*i1;
4330
+ p2 = q2 + k*i2;
4331
+ p3 = q3 + k*i3;
4332
+ {
4333
+ double aa = cabs((*p1)), ab = cabs((*p2));
4334
+ double m = (aa > ab) ? aa : ab;
4335
+ (*p3) = ( m > 0 && cabs((*p1) - (*p2)) / m <= tol ) ? 1 : 0;
4336
+ }
4337
+ }
4338
+ }
4339
+ } else {
4340
+ for (k=0; k<n; k++) {
4341
+ p1 = q1 + k*i1;
4342
+ p2 = q2 + k*i2;
4343
+ p3 = q3 + k*i3;
4344
+ {
4345
+ double aa = cabs((*p1)), ab = cabs((*p2));
4346
+ double m = (aa > ab) ? aa : ab;
4347
+ (*p3) = ( m > 0 && cabs((*p1) - (*p2)) / m <= tol ) ? 1 : 0;
4348
+ }
4349
+ }
4350
+ }
4351
+ }
4352
+
4353
+ static void
4354
+ ca_bincmp_is_equiv_cmplx128_t (ca_size_t n, boolean8_t *m,
4355
+ char *ptr1, ca_size_t b1, ca_size_t i1,
4356
+ char *ptr2, ca_size_t b2, ca_size_t i2,
4357
+ char *ptr3, ca_size_t b3, ca_size_t i3,
4358
+ double tol)
4359
+ {
4360
+ cmplx128_t *q1 = (cmplx128_t *) ptr1, *q2 = (cmplx128_t *) ptr2;
4361
+ cmplx128_t *p1 = q1, *p2 = q2;
4362
+ boolean8_t *q3 = (boolean8_t *) ptr3;
4363
+ boolean8_t *p3 = q3;
4364
+ ca_size_t k;
4365
+ (void) b1; (void) b2; (void) b3; /* unused for non-fixlen kernels */
4366
+
4367
+ if ( m ) {
4368
+ boolean8_t *pm;
4369
+ for (k=0; k<n; k++) {
4370
+ pm = m + k;
4371
+ if ( ! *pm ) {
4372
+ p1 = q1 + k*i1;
4373
+ p2 = q2 + k*i2;
4374
+ p3 = q3 + k*i3;
4375
+ {
4376
+ double aa = cabs((*p1)), ab = cabs((*p2));
4377
+ double m = (aa > ab) ? aa : ab;
4378
+ (*p3) = ( m > 0 && cabs((*p1) - (*p2)) / m <= tol ) ? 1 : 0;
4379
+ }
4380
+ }
4381
+ }
4382
+ } else {
4383
+ for (k=0; k<n; k++) {
4384
+ p1 = q1 + k*i1;
4385
+ p2 = q2 + k*i2;
4386
+ p3 = q3 + k*i3;
4387
+ {
4388
+ double aa = cabs((*p1)), ab = cabs((*p2));
4389
+ double m = (aa > ab) ? aa : ab;
4390
+ (*p3) = ( m > 0 && cabs((*p1) - (*p2)) / m <= tol ) ? 1 : 0;
4391
+ }
4392
+ }
4393
+ }
4394
+ }
4395
+
4396
+ ca_bincmp_func_t
4397
+ ca_bincmp_is_equiv[CA_NTYPE] = {
4398
+ ca_bincmp_not_implement,
4399
+ ca_bincmp_not_implement,
4400
+ ca_bincmp_is_equiv_int8_t,
4401
+ ca_bincmp_is_equiv_uint8_t,
4402
+ ca_bincmp_is_equiv_int16_t,
4403
+ ca_bincmp_is_equiv_uint16_t,
4404
+ ca_bincmp_is_equiv_int32_t,
4405
+ ca_bincmp_is_equiv_uint32_t,
4406
+ ca_bincmp_is_equiv_int64_t,
4407
+ ca_bincmp_is_equiv_uint64_t,
4408
+ ca_bincmp_is_equiv_float32_t,
4409
+ ca_bincmp_is_equiv_float64_t,
4410
+ ca_bincmp_not_implement,
4411
+ ca_bincmp_is_equiv_cmplx64_t,
4412
+ ca_bincmp_is_equiv_cmplx128_t,
4413
+ ca_bincmp_not_implement,
4414
+ ca_bincmp_not_implement,
4415
+ };
4416
+
4417
+ VALUE rb_ca_is_equiv (VALUE self, VALUE other, VALUE tol_val)
4418
+ {
4419
+ double tol = fabs(NUM2DBL(tol_val));
4420
+ if ( ! rb_ca_test_castable(other) ) {
4421
+ return rb_funcall(other, rb_intern("is_equiv"), 2, self, tol_val);
4422
+ }
4423
+ return rb_ca_call_bincmp(self, other, ca_bincmp_is_equiv, tol);
4424
+ }
4425
+
4426
+ void
4427
+ Init_carray_kernels_bincmp (void)
4428
+ {
4429
+ rb_define_method(rb_cCArray, "feq", rb_ca_feq, 1);
4430
+ rb_define_method(rb_cCArray, "eq", rb_ca_eq, 1);
4431
+ rb_define_method(rb_cCArray, "ne", rb_ca_ne, 1);
4432
+ rb_define_method(rb_cCArray, "gt", rb_ca_gt, 1);
4433
+ rb_define_method(rb_cCArray, "lt", rb_ca_lt, 1);
4434
+ rb_define_method(rb_cCArray, "ge", rb_ca_ge, 1);
4435
+ rb_define_method(rb_cCArray, "le", rb_ca_le, 1);
4436
+ rb_define_method(rb_cCArray, "match", rb_ca_match, 1);
4437
+ rb_define_method(rb_cCArray, "is_kind_of", rb_ca_is_kind_of, 1);
4438
+ rb_define_alias(rb_cCArray, ">", "gt");
4439
+ rb_define_alias(rb_cCArray, "<", "lt");
4440
+ rb_define_alias(rb_cCArray, ">=", "ge");
4441
+ rb_define_alias(rb_cCArray, "<=", "le");
4442
+ rb_define_alias(rb_cCArray, "=~", "match");
4443
+ rb_define_method(rb_cCArray, "is_close", rb_ca_is_close, 2);
4444
+ rb_define_method(rb_cCArray, "is_equiv", rb_ca_is_equiv, 2);
4445
+ }