carray 2.0.1 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (386) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +6 -25
  3. data/CHANGELOG.md +338 -0
  4. data/{NEWS.md → CHANGELOG.v1.md} +3 -0
  5. data/LICENSE +1 -1
  6. data/README.md +120 -36
  7. data/carray.gemspec +32 -30
  8. data/ext/ca_array_pool.c +91 -0
  9. data/ext/ca_axis_descriptor.h +186 -0
  10. data/ext/ca_axis_dispatch.c +924 -0
  11. data/ext/ca_axis_group.c +1244 -0
  12. data/ext/ca_bincmp_dispatch.c +76 -0
  13. data/ext/ca_bincmp_dispatch.h +85 -0
  14. data/ext/ca_binop_dispatch.c +124 -0
  15. data/ext/ca_binop_dispatch.h +152 -0
  16. data/ext/ca_categorical_iterator.c +1375 -0
  17. data/ext/ca_compare.c +94 -0
  18. data/ext/ca_compare.h +26 -0
  19. data/ext/ca_composite_dispatch.c +414 -0
  20. data/ext/ca_composite_dispatch.h +116 -0
  21. data/ext/ca_for_buffer.h +96 -0
  22. data/ext/ca_for_each_element.h +239 -0
  23. data/ext/ca_group_iter.c +304 -0
  24. data/ext/ca_iter_substrate.h +325 -0
  25. data/ext/ca_kernel_iterator.c +4367 -0
  26. data/ext/ca_kernel_iterator.h +2596 -0
  27. data/ext/ca_moncmp_dispatch.c +37 -0
  28. data/ext/ca_moncmp_dispatch.h +62 -0
  29. data/ext/ca_monop_dispatch.c +200 -0
  30. data/ext/ca_monop_dispatch.h +235 -0
  31. data/ext/ca_obj_array.c +355 -359
  32. data/ext/ca_obj_bincmp.c +839 -0
  33. data/ext/ca_obj_binop.c +948 -0
  34. data/ext/ca_obj_bitarray.c +369 -164
  35. data/ext/ca_obj_bitfield.c +294 -234
  36. data/ext/ca_obj_block.c +189 -711
  37. data/ext/ca_obj_byte_swap.c +766 -0
  38. data/ext/ca_obj_const_string.c +967 -0
  39. data/ext/ca_obj_face.c +750 -0
  40. data/ext/ca_obj_face.h +279 -0
  41. data/ext/ca_obj_fake.c +239 -100
  42. data/ext/ca_obj_farray.c +54 -441
  43. data/ext/ca_obj_field.c +82 -529
  44. data/ext/ca_obj_fixlen_string.c +308 -0
  45. data/ext/ca_obj_grid.c +866 -440
  46. data/ext/ca_obj_meld.c +1039 -0
  47. data/ext/ca_obj_moncmp.c +588 -0
  48. data/ext/ca_obj_monop.c +1123 -0
  49. data/ext/ca_obj_object.c +866 -296
  50. data/ext/ca_obj_record.c +470 -0
  51. data/ext/ca_obj_reduce.c +97 -82
  52. data/ext/ca_obj_refer.c +593 -459
  53. data/ext/ca_obj_remap.c +475 -0
  54. data/ext/ca_obj_repeat.c +92 -477
  55. data/ext/ca_obj_roll.c +624 -0
  56. data/ext/ca_obj_select.c +344 -296
  57. data/ext/ca_obj_select_axis.c +1306 -0
  58. data/ext/ca_obj_shift.c +231 -793
  59. data/ext/ca_obj_source.c +78 -0
  60. data/ext/ca_obj_stack.c +1173 -0
  61. data/ext/ca_obj_stride.c +2584 -0
  62. data/ext/ca_obj_string.c +270 -0
  63. data/ext/ca_obj_tile.c +622 -0
  64. data/ext/ca_obj_time.c +548 -0
  65. data/ext/ca_obj_timedelta.c +437 -0
  66. data/ext/ca_obj_transpose.c +62 -516
  67. data/ext/ca_obj_triop.c +785 -0
  68. data/ext/ca_obj_window.c +1202 -565
  69. data/ext/ca_op_byte_swap.c +175 -0
  70. data/ext/ca_op_cmplx64.h +123 -0
  71. data/ext/ca_op_ipower.c +316 -0
  72. data/ext/ca_op_powi.h +88 -0
  73. data/ext/ca_sort_kernels.h +132 -0
  74. data/ext/ca_sweep_engine.c +473 -0
  75. data/ext/ca_sweep_engine.h +166 -0
  76. data/ext/ca_transform_common.c +235 -0
  77. data/ext/ca_triop_dispatch.c +55 -0
  78. data/ext/ca_triop_dispatch.h +62 -0
  79. data/ext/carray.h +810 -420
  80. data/ext/carray_access.c +873 -731
  81. data/ext/carray_attribute.c +98 -329
  82. data/ext/carray_bincount.c +255 -0
  83. data/ext/carray_broadcast.c +376 -0
  84. data/ext/carray_build_flags.h +3 -0
  85. data/ext/carray_call_cfunc.c +2897 -874
  86. data/ext/carray_call_cfunc.h +313 -0
  87. data/ext/carray_cast.c +1264 -315
  88. data/ext/carray_cast_func.rb +81 -40
  89. data/ext/carray_class.c +53 -63
  90. data/ext/carray_config.h +28 -0
  91. data/ext/carray_conversion.c +350 -346
  92. data/ext/carray_copy.c +168 -270
  93. data/ext/carray_core.c +1396 -206
  94. data/ext/carray_count.c +312 -0
  95. data/ext/carray_data_type.c +43 -19
  96. data/ext/carray_element.c +585 -213
  97. data/ext/carray_factorize.c +2542 -0
  98. data/ext/carray_generate.c +230 -559
  99. data/ext/carray_histogram.c +490 -0
  100. data/ext/carray_hold.c +228 -0
  101. data/ext/carray_index_classifier.c +1021 -0
  102. data/ext/carray_index_classifier.h +27 -0
  103. data/ext/carray_internal.h +136 -0
  104. data/ext/carray_kernels_bincmp.c +4446 -0
  105. data/ext/carray_kernels_binop.c +11001 -0
  106. data/ext/carray_kernels_init.c +1131 -0
  107. data/ext/carray_kernels_map.c +3467 -0
  108. data/ext/carray_kernels_moncmp.c +2097 -0
  109. data/ext/carray_kernels_monop.c +18313 -0
  110. data/ext/carray_kernels_reduce_aggregate.c +25837 -0
  111. data/ext/carray_kernels_reduce_boolean.c +330 -0
  112. data/ext/carray_kernels_reduce_cumulative.c +14593 -0
  113. data/ext/carray_kernels_reduce_extreme.c +16948 -0
  114. data/ext/carray_kernels_reduce_variance.c +3910 -0
  115. data/ext/carray_kernels_scan.c +3693 -0
  116. data/ext/carray_kernels_search.c +32138 -0
  117. data/ext/carray_kernels_sort.c +10626 -0
  118. data/ext/carray_kernels_triop.c +1392 -0
  119. data/ext/carray_lazy.c +737 -0
  120. data/ext/carray_loop.c +88 -200
  121. data/ext/carray_mask.c +853 -158
  122. data/ext/carray_math_kernel.h +120 -0
  123. data/ext/carray_mathfunc.c +10 -241
  124. data/ext/carray_median_percentile.c +1257 -0
  125. data/ext/carray_memory_view.c +1650 -0
  126. data/ext/carray_operator.c +1525 -320
  127. data/ext/carray_order.c +664 -1394
  128. data/ext/carray_partition.c +416 -0
  129. data/ext/carray_random.c +518 -0
  130. data/ext/carray_scatter.c +357 -0
  131. data/ext/carray_slab.c +1219 -0
  132. data/ext/carray_slab.h +84 -0
  133. data/ext/carray_sort.c +829 -0
  134. data/ext/carray_sort_kernel.c +620 -0
  135. data/ext/carray_struct.c +695 -0
  136. data/ext/carray_test.c +343 -229
  137. data/ext/carray_undef.c +34 -17
  138. data/ext/carray_utils.c +175 -74
  139. data/ext/extconf.rb +234 -55
  140. data/ext/mk_call_cfunc.rb +671 -0
  141. data/ext/mkkernel.rb +9096 -0
  142. data/ext/ruby_carray.c +211 -108
  143. data/ext/version.h +4 -14
  144. data/ext/version.rb +5 -13
  145. data/lib/carray/arrow_tensor.rb +401 -0
  146. data/lib/carray/attribute.rb +166 -0
  147. data/lib/carray/autoload_carray.rb +239 -0
  148. data/lib/carray/autoload_method_extension.rb +45 -0
  149. data/lib/carray/axis_group.rb +711 -0
  150. data/lib/carray/basics.rb +481 -0
  151. data/lib/carray/bincount_nd.rb +358 -0
  152. data/lib/carray/block_iterator.rb +614 -0
  153. data/lib/carray/boolean_reduce.rb +109 -0
  154. data/lib/carray/categorical.rb +561 -0
  155. data/lib/carray/categorical_iterator.rb +1084 -0
  156. data/lib/carray/complex.rb +150 -0
  157. data/lib/carray/conditional.rb +216 -0
  158. data/lib/carray/const_string.rb +228 -0
  159. data/lib/carray/construct.rb +160 -328
  160. data/lib/carray/core_extensions.rb +297 -0
  161. data/lib/carray/data_type_extension.rb +250 -0
  162. data/lib/carray/fixlen_string.rb +95 -0
  163. data/lib/carray/frame/concat.rb +132 -0
  164. data/lib/carray/frame/convert.rb +95 -0
  165. data/lib/carray/frame/csv_parser.rb +211 -0
  166. data/lib/carray/frame/frame.rb +642 -0
  167. data/lib/carray/frame/group.rb +186 -0
  168. data/lib/carray/frame/io.rb +321 -0
  169. data/lib/carray/frame/join.rb +248 -0
  170. data/lib/carray/frame/records.rb +99 -0
  171. data/lib/carray/frame/sort.rb +113 -0
  172. data/lib/carray/frame/verbs.rb +316 -0
  173. data/lib/carray/frame.rb +16 -0
  174. data/lib/carray/fuse_source.rb +123 -0
  175. data/lib/carray/fusion.rb +218 -0
  176. data/lib/carray/histogram.rb +512 -0
  177. data/lib/carray/inspect.rb +37 -26
  178. data/lib/carray/iterator.rb +58 -349
  179. data/lib/carray/lazy.rb +941 -0
  180. data/lib/carray/mask_gap_fill.rb +200 -0
  181. data/lib/carray/math.rb +78 -342
  182. data/lib/carray/meld_reduce.rb +289 -0
  183. data/lib/carray/methods/align_addr.rb +116 -0
  184. data/lib/carray/methods/bin.rb +128 -0
  185. data/lib/carray/methods/bincount.rb +87 -0
  186. data/lib/carray/methods/bit_string.rb +92 -0
  187. data/lib/carray/methods/broadcast.rb +63 -0
  188. data/lib/carray/methods/choose.rb +39 -0
  189. data/lib/carray/methods/composition.rb +280 -0
  190. data/lib/carray/methods/gather_nd.rb +206 -0
  191. data/lib/carray/methods/index.rb +39 -0
  192. data/lib/carray/methods/insert_block.rb +99 -0
  193. data/lib/carray/methods/is_in.rb +141 -0
  194. data/lib/carray/methods/join.rb +90 -0
  195. data/lib/carray/methods/locate_addr.rb +52 -0
  196. data/lib/carray/methods/mask_duplicates.rb +41 -0
  197. data/lib/carray/methods/meshgrid.rb +90 -0
  198. data/lib/carray/methods/mode.rb +126 -0
  199. data/lib/carray/methods/nunique.rb +46 -0
  200. data/lib/carray/methods/resize.rb +56 -0
  201. data/lib/carray/methods/snap.rb +161 -0
  202. data/lib/carray/methods/string_format.rb +57 -0
  203. data/lib/carray/methods/unique.rb +47 -0
  204. data/lib/carray/methods/value_counts.rb +71 -0
  205. data/lib/carray/mkmf.rb +124 -101
  206. data/lib/carray/runtime.rb +89 -0
  207. data/lib/carray/serialize.rb +478 -167
  208. data/lib/carray/slab_iterator.rb +305 -0
  209. data/lib/carray/stack.rb +291 -0
  210. data/lib/carray/string.rb +56 -180
  211. data/lib/carray/string_operation_extension.rb +289 -0
  212. data/lib/carray/struct.rb +335 -323
  213. data/lib/carray/struct_builder.rb +697 -0
  214. data/lib/carray/table.rb +41 -2
  215. data/lib/carray/time.rb +2654 -38
  216. data/lib/carray/window_iterator.rb +927 -0
  217. data/lib/carray.rb +55 -57
  218. data/yard-stubs/ca_obj_array.rb +385 -0
  219. data/yard-stubs/ca_obj_bitarray.rb +38 -0
  220. data/yard-stubs/ca_obj_bitfield.rb +43 -0
  221. data/yard-stubs/ca_obj_block.rb +73 -0
  222. data/yard-stubs/ca_obj_byte_swap.rb +56 -0
  223. data/yard-stubs/ca_obj_fake.rb +31 -0
  224. data/yard-stubs/ca_obj_farray.rb +32 -0
  225. data/yard-stubs/ca_obj_field.rb +45 -0
  226. data/yard-stubs/ca_obj_grid.rb +35 -0
  227. data/yard-stubs/ca_obj_refer.rb +72 -0
  228. data/yard-stubs/ca_obj_roll.rb +45 -0
  229. data/yard-stubs/ca_obj_shift.rb +43 -0
  230. data/yard-stubs/ca_obj_stride.rb +181 -0
  231. data/yard-stubs/ca_obj_tile.rb +29 -0
  232. data/yard-stubs/ca_obj_transpose.rb +40 -0
  233. data/yard-stubs/ca_obj_window.rb +49 -0
  234. data/yard-stubs/carray_access.rb +131 -0
  235. data/yard-stubs/carray_attribute.rb +246 -0
  236. data/yard-stubs/carray_broadcast.rb +37 -0
  237. data/yard-stubs/carray_cast.rb +489 -0
  238. data/yard-stubs/carray_class.rb +65 -0
  239. data/yard-stubs/carray_conversion.rb +76 -0
  240. data/yard-stubs/carray_copy.rb +79 -0
  241. data/yard-stubs/carray_core.rb +114 -0
  242. data/yard-stubs/carray_count.rb +79 -0
  243. data/yard-stubs/carray_element.rb +108 -0
  244. data/yard-stubs/carray_generate.rb +66 -0
  245. data/yard-stubs/carray_lazy.rb +23 -0
  246. data/yard-stubs/carray_loop.rb +140 -0
  247. data/yard-stubs/carray_mask.rb +259 -0
  248. data/yard-stubs/carray_math.rb +132 -0
  249. data/yard-stubs/carray_mathfunc.rb +45 -0
  250. data/yard-stubs/carray_median_percentile.rb +89 -0
  251. data/yard-stubs/carray_memory_view.rb +163 -0
  252. data/yard-stubs/carray_order.rb +312 -0
  253. data/yard-stubs/carray_random.rb +89 -0
  254. data/yard-stubs/carray_scatter.rb +106 -0
  255. data/yard-stubs/carray_slab.rb +57 -0
  256. data/yard-stubs/carray_sort.rb +163 -0
  257. data/yard-stubs/carray_test.rb +85 -0
  258. data/yard-stubs/carray_undef.rb +64 -0
  259. data/yard-stubs/carray_utils.rb +97 -0
  260. data/yard-stubs/ruby_carray.rb +193 -0
  261. metadata +220 -138
  262. data/Rakefile +0 -51
  263. data/TODO.md +0 -18
  264. data/ext/ca_iter_block.c +0 -257
  265. data/ext/ca_iter_dimension.c +0 -299
  266. data/ext/ca_iter_window.c +0 -214
  267. data/ext/ca_obj_mapping.c +0 -644
  268. data/ext/ca_obj_unbound_repeat.c +0 -529
  269. data/ext/carray_iterator.c +0 -641
  270. data/ext/carray_math.rb +0 -850
  271. data/ext/carray_numeric.c +0 -259
  272. data/ext/carray_sort_addr.c +0 -254
  273. data/ext/carray_stat.c +0 -2100
  274. data/ext/carray_stat_proc.rb +0 -1999
  275. data/ext/mkmath.rb +0 -741
  276. data/ext/ruby_ccomplex.c +0 -509
  277. data/ext/ruby_float_func.c +0 -86
  278. data/lib/carray/array.rb +0 -8
  279. data/lib/carray/autoload/autoload_base.rb +0 -19
  280. data/lib/carray/autoload/autoload_gem_cairo.rb +0 -9
  281. data/lib/carray/autoload/autoload_gem_ffi.rb +0 -9
  282. data/lib/carray/autoload/autoload_gem_gnuplot.rb +0 -2
  283. data/lib/carray/autoload/autoload_gem_io_csv.rb +0 -14
  284. data/lib/carray/autoload/autoload_gem_io_pg.rb +0 -6
  285. data/lib/carray/autoload/autoload_gem_io_sqlite3.rb +0 -12
  286. data/lib/carray/autoload/autoload_gem_narray.rb +0 -10
  287. data/lib/carray/autoload/autoload_gem_numo_narray.rb +0 -15
  288. data/lib/carray/autoload/autoload_gem_opencv.rb +0 -16
  289. data/lib/carray/autoload/autoload_gem_random.rb +0 -8
  290. data/lib/carray/autoload/autoload_gem_rmagick.rb +0 -23
  291. data/lib/carray/autoload/autoload_gem_zimg.rb +0 -3
  292. data/lib/carray/autoload/autoload_io_imagemagick.rb +0 -6
  293. data/lib/carray/autoload/autoload_math_histogram.rb +0 -5
  294. data/lib/carray/autoload/autoload_math_recurrence.rb +0 -6
  295. data/lib/carray/autoload/autoload_object_iterator.rb +0 -1
  296. data/lib/carray/autoload/autoload_object_link.rb +0 -1
  297. data/lib/carray/autoload/autoload_object_pack.rb +0 -2
  298. data/lib/carray/autoload.rb +0 -141
  299. data/lib/carray/basic.rb +0 -191
  300. data/lib/carray/broadcast.rb +0 -101
  301. data/lib/carray/compose.rb +0 -315
  302. data/lib/carray/convert.rb +0 -115
  303. data/lib/carray/info.rb +0 -110
  304. data/lib/carray/io/imagemagick.rb +0 -235
  305. data/lib/carray/mask.rb +0 -102
  306. data/lib/carray/math/histogram.rb +0 -177
  307. data/lib/carray/math/recurrence.rb +0 -93
  308. data/lib/carray/object/ca_obj_iterator.rb +0 -50
  309. data/lib/carray/object/ca_obj_link.rb +0 -50
  310. data/lib/carray/object/ca_obj_pack.rb +0 -99
  311. data/lib/carray/obsolete.rb +0 -256
  312. data/lib/carray/ordering.rb +0 -181
  313. data/lib/carray/testing.rb +0 -51
  314. data/lib/carray/transform.rb +0 -109
  315. data/mailmap +0 -1
  316. data/misc/Methods.ja.md +0 -182
  317. data/misc/NOTE +0 -51
  318. data/spec/Classes/CABitfield_spec.rb +0 -58
  319. data/spec/Classes/CABlockIterator_spec.rb +0 -114
  320. data/spec/Classes/CABlock_spec.rb +0 -205
  321. data/spec/Classes/CAField_spec.rb +0 -39
  322. data/spec/Classes/CAGrid_spec.rb +0 -75
  323. data/spec/Classes/CAMap_spec.rb +0 -0
  324. data/spec/Classes/CAMapping_spec.rb +0 -105
  325. data/spec/Classes/CAObject_attribute_spec.rb +0 -33
  326. data/spec/Classes/CAObject_spec.rb +0 -33
  327. data/spec/Classes/CARefer_spec.rb +0 -93
  328. data/spec/Classes/CARepeat_spec.rb +0 -65
  329. data/spec/Classes/CASelect_spec.rb +0 -22
  330. data/spec/Classes/CAShift_spec.rb +0 -16
  331. data/spec/Classes/CAStruct_spec.rb +0 -71
  332. data/spec/Classes/CATranspose_spec.rb +0 -60
  333. data/spec/Classes/CAUnboudRepeat_spec.rb +0 -102
  334. data/spec/Classes/CAWindow_spec.rb +0 -54
  335. data/spec/Classes/CAWrap_spec.rb +0 -8
  336. data/spec/Classes/CArray_spec.rb +0 -184
  337. data/spec/Classes/CScalar_spec.rb +0 -55
  338. data/spec/Features/feature_130_spec.rb +0 -19
  339. data/spec/Features/feature_attributes_spec.rb +0 -280
  340. data/spec/Features/feature_boolean_spec.rb +0 -98
  341. data/spec/Features/feature_broadcast.rb +0 -116
  342. data/spec/Features/feature_cast_function.rb +0 -19
  343. data/spec/Features/feature_cast_spec.rb +0 -33
  344. data/spec/Features/feature_class_spec.rb +0 -84
  345. data/spec/Features/feature_complex_spec.rb +0 -42
  346. data/spec/Features/feature_composite_spec.rb +0 -124
  347. data/spec/Features/feature_convert_spec.rb +0 -46
  348. data/spec/Features/feature_copy_spec.rb +0 -123
  349. data/spec/Features/feature_creation_spec.rb +0 -84
  350. data/spec/Features/feature_element_spec.rb +0 -144
  351. data/spec/Features/feature_extream_spec.rb +0 -54
  352. data/spec/Features/feature_generate_spec.rb +0 -74
  353. data/spec/Features/feature_index_spec.rb +0 -69
  354. data/spec/Features/feature_mask_spec.rb +0 -580
  355. data/spec/Features/feature_math_spec.rb +0 -97
  356. data/spec/Features/feature_order_spec.rb +0 -146
  357. data/spec/Features/feature_ref_store_spec.rb +0 -209
  358. data/spec/Features/feature_serialization_spec.rb +0 -125
  359. data/spec/Features/feature_stat_spec.rb +0 -397
  360. data/spec/Features/feature_virtual_spec.rb +0 -48
  361. data/spec/Features/method_eq_spec.rb +0 -81
  362. data/spec/Features/method_is_nan_spec.rb +0 -12
  363. data/spec/Features/method_map_spec.rb +0 -54
  364. data/spec/Features/method_max_with.rb +0 -20
  365. data/spec/Features/method_min_with.rb +0 -19
  366. data/spec/Features/method_ne_spec.rb +0 -18
  367. data/spec/Features/method_project_spec.rb +0 -188
  368. data/spec/Features/method_ref_spec.rb +0 -27
  369. data/spec/Features/method_round_spec.rb +0 -11
  370. data/spec/Features/method_s_linspace_spec.rb +0 -48
  371. data/spec/Features/method_s_span_spec.rb +0 -14
  372. data/spec/Features/method_seq_spec.rb +0 -47
  373. data/spec/Features/method_sort_with.rb +0 -43
  374. data/spec/Features/method_sorted_with.rb +0 -29
  375. data/spec/Features/method_span_spec.rb +0 -42
  376. data/spec/Features/method_wrap_readonly_spec.rb +0 -43
  377. data/spec/UnitTest/test_CAVirtual.rb +0 -214
  378. data/spec/spec_all.rb +0 -10
  379. data/utils/ca_ase.rb +0 -21
  380. data/utils/ca_methods.rb +0 -15
  381. data/utils/cast_checker.rb +0 -30
  382. data/utils/convert_test.rb +0 -73
  383. data/utils/extract_yard.rb +0 -22
  384. data/utils/guess_shape.rb +0 -76
  385. data/utils/monkey_patch_methods.rb +0 -62
  386. data/utils/remove_resource_fork.sh +0 -5
@@ -0,0 +1,2097 @@
1
+ /* ---------------------------------------------------------------------------
2
+
3
+ carray_kernels.c -- GENERATED by ext/mkkernel.rb -- DO NOT EDIT
4
+
5
+ Kernel definitions live in mkkernel.rb (search for `MkKernel.reduce`).
6
+ Regenerate by running:
7
+
8
+ cd ext && ruby mkkernel.rb > carray_kernels.c
9
+
10
+ extconf.rb regenerates automatically when mkkernel.rb is touched.
11
+
12
+ --------------------------------------------------------------------------- */
13
+
14
+ #include "carray.h"
15
+ #include "ca_kernel_iterator.h"
16
+ #include "ca_sort_kernels.h" /* sort kernels: internal, not via the carray.h umbrella */
17
+ #include "carray_internal.h" /* ca_lazy_arena_*, ca_is_lazy_view (streaming reduce) */
18
+ #include "ca_obj_face.h" /* rb_ca_strip_face_value (Face ordering gate) */
19
+ #include <math.h>
20
+ #include <stdint.h>
21
+ #include <stdlib.h> /* qsort, mergesort (HAVE_MERGESORT) -- for :sort kind */
22
+
23
+ /* MEMO_REDUCTION_FASTPATH_ENTITY_ONLY_GUARD Tier 2: CAStack identity is
24
+ probed by operation-table function pointer (obj_type is runtime-
25
+ assigned, so no CA_OBJ_STACK compile-time constant exists). */
26
+ extern ca_operation_function_t ca_stack_func;
27
+ /* BOOL2VAL: bool -> Ruby (Qtrue/Qfalse). Used as ruby_scalar wrapper
28
+ for the all/any flat-reduction Ruby surface so `a.all` / `a.any`
29
+ return real true/false, not Integer 0/1. (BOOL2OBJ already exists
30
+ but returns Integer per CArray's boolean-as-int convention.) */
31
+ #ifndef CARRAY_BOOL2VAL_DEFINED
32
+ #define CARRAY_BOOL2VAL_DEFINED
33
+ static inline VALUE BOOL2VAL (boolean8_t x) { return x ? Qtrue : Qfalse; }
34
+ #endif
35
+
36
+ #include "ca_op_powi.h"
37
+ #include "ca_op_cmplx64.h"
38
+
39
+ /* ===== moncmp is_nan ============================================ */
40
+
41
+ static void
42
+ ca_moncmp_is_nan_int8_t (ca_size_t n, boolean8_t *m,
43
+ char *ptr1, ca_size_t i1,
44
+ boolean8_t *ptr2, ca_size_t i2)
45
+ {
46
+ int8_t *q1 = (int8_t *) ptr1;
47
+ int8_t *p1 = q1;
48
+ boolean8_t *q2 = (boolean8_t *) ptr2;
49
+ boolean8_t *p2 = q2;
50
+ ca_size_t k;
51
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
52
+ if ( m ) {
53
+ boolean8_t *pm;
54
+ for (k=0; k<n; k++) {
55
+ pm = m + k;
56
+ if ( ! *pm ) {
57
+ p1 = q1 + k*i1;
58
+ p2 = q2 + k*i2;
59
+ { (*p2) = 0; }
60
+ }
61
+ }
62
+ } else {
63
+ for (k=0; k<n; k++) {
64
+ p1 = q1 + k*i1;
65
+ p2 = q2 + k*i2;
66
+ { (*p2) = 0; }
67
+ }
68
+ }
69
+ }
70
+
71
+ static void
72
+ ca_moncmp_is_nan_uint8_t (ca_size_t n, boolean8_t *m,
73
+ char *ptr1, ca_size_t i1,
74
+ boolean8_t *ptr2, ca_size_t i2)
75
+ {
76
+ uint8_t *q1 = (uint8_t *) ptr1;
77
+ uint8_t *p1 = q1;
78
+ boolean8_t *q2 = (boolean8_t *) ptr2;
79
+ boolean8_t *p2 = q2;
80
+ ca_size_t k;
81
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
82
+ if ( m ) {
83
+ boolean8_t *pm;
84
+ for (k=0; k<n; k++) {
85
+ pm = m + k;
86
+ if ( ! *pm ) {
87
+ p1 = q1 + k*i1;
88
+ p2 = q2 + k*i2;
89
+ { (*p2) = 0; }
90
+ }
91
+ }
92
+ } else {
93
+ for (k=0; k<n; k++) {
94
+ p1 = q1 + k*i1;
95
+ p2 = q2 + k*i2;
96
+ { (*p2) = 0; }
97
+ }
98
+ }
99
+ }
100
+
101
+ static void
102
+ ca_moncmp_is_nan_int16_t (ca_size_t n, boolean8_t *m,
103
+ char *ptr1, ca_size_t i1,
104
+ boolean8_t *ptr2, ca_size_t i2)
105
+ {
106
+ int16_t *q1 = (int16_t *) ptr1;
107
+ int16_t *p1 = q1;
108
+ boolean8_t *q2 = (boolean8_t *) ptr2;
109
+ boolean8_t *p2 = q2;
110
+ ca_size_t k;
111
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
112
+ if ( m ) {
113
+ boolean8_t *pm;
114
+ for (k=0; k<n; k++) {
115
+ pm = m + k;
116
+ if ( ! *pm ) {
117
+ p1 = q1 + k*i1;
118
+ p2 = q2 + k*i2;
119
+ { (*p2) = 0; }
120
+ }
121
+ }
122
+ } else {
123
+ for (k=0; k<n; k++) {
124
+ p1 = q1 + k*i1;
125
+ p2 = q2 + k*i2;
126
+ { (*p2) = 0; }
127
+ }
128
+ }
129
+ }
130
+
131
+ static void
132
+ ca_moncmp_is_nan_uint16_t (ca_size_t n, boolean8_t *m,
133
+ char *ptr1, ca_size_t i1,
134
+ boolean8_t *ptr2, ca_size_t i2)
135
+ {
136
+ uint16_t *q1 = (uint16_t *) ptr1;
137
+ uint16_t *p1 = q1;
138
+ boolean8_t *q2 = (boolean8_t *) ptr2;
139
+ boolean8_t *p2 = q2;
140
+ ca_size_t k;
141
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
142
+ if ( m ) {
143
+ boolean8_t *pm;
144
+ for (k=0; k<n; k++) {
145
+ pm = m + k;
146
+ if ( ! *pm ) {
147
+ p1 = q1 + k*i1;
148
+ p2 = q2 + k*i2;
149
+ { (*p2) = 0; }
150
+ }
151
+ }
152
+ } else {
153
+ for (k=0; k<n; k++) {
154
+ p1 = q1 + k*i1;
155
+ p2 = q2 + k*i2;
156
+ { (*p2) = 0; }
157
+ }
158
+ }
159
+ }
160
+
161
+ static void
162
+ ca_moncmp_is_nan_int32_t (ca_size_t n, boolean8_t *m,
163
+ char *ptr1, ca_size_t i1,
164
+ boolean8_t *ptr2, ca_size_t i2)
165
+ {
166
+ int32_t *q1 = (int32_t *) ptr1;
167
+ int32_t *p1 = q1;
168
+ boolean8_t *q2 = (boolean8_t *) ptr2;
169
+ boolean8_t *p2 = q2;
170
+ ca_size_t k;
171
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
172
+ if ( m ) {
173
+ boolean8_t *pm;
174
+ for (k=0; k<n; k++) {
175
+ pm = m + k;
176
+ if ( ! *pm ) {
177
+ p1 = q1 + k*i1;
178
+ p2 = q2 + k*i2;
179
+ { (*p2) = 0; }
180
+ }
181
+ }
182
+ } else {
183
+ for (k=0; k<n; k++) {
184
+ p1 = q1 + k*i1;
185
+ p2 = q2 + k*i2;
186
+ { (*p2) = 0; }
187
+ }
188
+ }
189
+ }
190
+
191
+ static void
192
+ ca_moncmp_is_nan_uint32_t (ca_size_t n, boolean8_t *m,
193
+ char *ptr1, ca_size_t i1,
194
+ boolean8_t *ptr2, ca_size_t i2)
195
+ {
196
+ uint32_t *q1 = (uint32_t *) ptr1;
197
+ uint32_t *p1 = q1;
198
+ boolean8_t *q2 = (boolean8_t *) ptr2;
199
+ boolean8_t *p2 = q2;
200
+ ca_size_t k;
201
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
202
+ if ( m ) {
203
+ boolean8_t *pm;
204
+ for (k=0; k<n; k++) {
205
+ pm = m + k;
206
+ if ( ! *pm ) {
207
+ p1 = q1 + k*i1;
208
+ p2 = q2 + k*i2;
209
+ { (*p2) = 0; }
210
+ }
211
+ }
212
+ } else {
213
+ for (k=0; k<n; k++) {
214
+ p1 = q1 + k*i1;
215
+ p2 = q2 + k*i2;
216
+ { (*p2) = 0; }
217
+ }
218
+ }
219
+ }
220
+
221
+ static void
222
+ ca_moncmp_is_nan_int64_t (ca_size_t n, boolean8_t *m,
223
+ char *ptr1, ca_size_t i1,
224
+ boolean8_t *ptr2, ca_size_t i2)
225
+ {
226
+ int64_t *q1 = (int64_t *) ptr1;
227
+ int64_t *p1 = q1;
228
+ boolean8_t *q2 = (boolean8_t *) ptr2;
229
+ boolean8_t *p2 = q2;
230
+ ca_size_t k;
231
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
232
+ if ( m ) {
233
+ boolean8_t *pm;
234
+ for (k=0; k<n; k++) {
235
+ pm = m + k;
236
+ if ( ! *pm ) {
237
+ p1 = q1 + k*i1;
238
+ p2 = q2 + k*i2;
239
+ { (*p2) = 0; }
240
+ }
241
+ }
242
+ } else {
243
+ for (k=0; k<n; k++) {
244
+ p1 = q1 + k*i1;
245
+ p2 = q2 + k*i2;
246
+ { (*p2) = 0; }
247
+ }
248
+ }
249
+ }
250
+
251
+ static void
252
+ ca_moncmp_is_nan_uint64_t (ca_size_t n, boolean8_t *m,
253
+ char *ptr1, ca_size_t i1,
254
+ boolean8_t *ptr2, ca_size_t i2)
255
+ {
256
+ uint64_t *q1 = (uint64_t *) ptr1;
257
+ uint64_t *p1 = q1;
258
+ boolean8_t *q2 = (boolean8_t *) ptr2;
259
+ boolean8_t *p2 = q2;
260
+ ca_size_t k;
261
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
262
+ if ( m ) {
263
+ boolean8_t *pm;
264
+ for (k=0; k<n; k++) {
265
+ pm = m + k;
266
+ if ( ! *pm ) {
267
+ p1 = q1 + k*i1;
268
+ p2 = q2 + k*i2;
269
+ { (*p2) = 0; }
270
+ }
271
+ }
272
+ } else {
273
+ for (k=0; k<n; k++) {
274
+ p1 = q1 + k*i1;
275
+ p2 = q2 + k*i2;
276
+ { (*p2) = 0; }
277
+ }
278
+ }
279
+ }
280
+
281
+ static void
282
+ ca_moncmp_is_nan_float32_t (ca_size_t n, boolean8_t *m,
283
+ char *ptr1, ca_size_t i1,
284
+ boolean8_t *ptr2, ca_size_t i2)
285
+ {
286
+ float *q1 = (float *) ptr1;
287
+ float *p1 = q1;
288
+ boolean8_t *q2 = (boolean8_t *) ptr2;
289
+ boolean8_t *p2 = q2;
290
+ ca_size_t k;
291
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
292
+ if ( m ) {
293
+ boolean8_t *pm;
294
+ for (k=0; k<n; k++) {
295
+ pm = m + k;
296
+ if ( ! *pm ) {
297
+ p1 = q1 + k*i1;
298
+ p2 = q2 + k*i2;
299
+ { (*p2) = isnan(*p1); }
300
+ }
301
+ }
302
+ } else {
303
+ for (k=0; k<n; k++) {
304
+ p1 = q1 + k*i1;
305
+ p2 = q2 + k*i2;
306
+ { (*p2) = isnan(*p1); }
307
+ }
308
+ }
309
+ }
310
+
311
+ static void
312
+ ca_moncmp_is_nan_float64_t (ca_size_t n, boolean8_t *m,
313
+ char *ptr1, ca_size_t i1,
314
+ boolean8_t *ptr2, ca_size_t i2)
315
+ {
316
+ double *q1 = (double *) ptr1;
317
+ double *p1 = q1;
318
+ boolean8_t *q2 = (boolean8_t *) ptr2;
319
+ boolean8_t *p2 = q2;
320
+ ca_size_t k;
321
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
322
+ if ( m ) {
323
+ boolean8_t *pm;
324
+ for (k=0; k<n; k++) {
325
+ pm = m + k;
326
+ if ( ! *pm ) {
327
+ p1 = q1 + k*i1;
328
+ p2 = q2 + k*i2;
329
+ { (*p2) = isnan(*p1); }
330
+ }
331
+ }
332
+ } else {
333
+ for (k=0; k<n; k++) {
334
+ p1 = q1 + k*i1;
335
+ p2 = q2 + k*i2;
336
+ { (*p2) = isnan(*p1); }
337
+ }
338
+ }
339
+ }
340
+
341
+ static void
342
+ ca_moncmp_is_nan_cmplx64_t (ca_size_t n, boolean8_t *m,
343
+ char *ptr1, ca_size_t i1,
344
+ boolean8_t *ptr2, ca_size_t i2)
345
+ {
346
+ cmplx64_t *q1 = (cmplx64_t *) ptr1;
347
+ cmplx64_t *p1 = q1;
348
+ boolean8_t *q2 = (boolean8_t *) ptr2;
349
+ boolean8_t *p2 = q2;
350
+ ca_size_t k;
351
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
352
+ if ( m ) {
353
+ boolean8_t *pm;
354
+ for (k=0; k<n; k++) {
355
+ pm = m + k;
356
+ if ( ! *pm ) {
357
+ p1 = q1 + k*i1;
358
+ p2 = q2 + k*i2;
359
+ { (*p2) = (isnan(creal(*p1)) || isnan(cimag(*p1))); }
360
+ }
361
+ }
362
+ } else {
363
+ for (k=0; k<n; k++) {
364
+ p1 = q1 + k*i1;
365
+ p2 = q2 + k*i2;
366
+ { (*p2) = (isnan(creal(*p1)) || isnan(cimag(*p1))); }
367
+ }
368
+ }
369
+ }
370
+
371
+ static void
372
+ ca_moncmp_is_nan_cmplx128_t (ca_size_t n, boolean8_t *m,
373
+ char *ptr1, ca_size_t i1,
374
+ boolean8_t *ptr2, ca_size_t i2)
375
+ {
376
+ cmplx128_t *q1 = (cmplx128_t *) ptr1;
377
+ cmplx128_t *p1 = q1;
378
+ boolean8_t *q2 = (boolean8_t *) ptr2;
379
+ boolean8_t *p2 = q2;
380
+ ca_size_t k;
381
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
382
+ if ( m ) {
383
+ boolean8_t *pm;
384
+ for (k=0; k<n; k++) {
385
+ pm = m + k;
386
+ if ( ! *pm ) {
387
+ p1 = q1 + k*i1;
388
+ p2 = q2 + k*i2;
389
+ { (*p2) = (isnan(creal(*p1)) || isnan(cimag(*p1))); }
390
+ }
391
+ }
392
+ } else {
393
+ for (k=0; k<n; k++) {
394
+ p1 = q1 + k*i1;
395
+ p2 = q2 + k*i2;
396
+ { (*p2) = (isnan(creal(*p1)) || isnan(cimag(*p1))); }
397
+ }
398
+ }
399
+ }
400
+
401
+ static void
402
+ ca_moncmp_is_nan_VALUE (ca_size_t n, boolean8_t *m,
403
+ char *ptr1, ca_size_t i1,
404
+ boolean8_t *ptr2, ca_size_t i2)
405
+ {
406
+ VALUE *q1 = (VALUE *) ptr1;
407
+ VALUE *p1 = q1;
408
+ boolean8_t *q2 = (boolean8_t *) ptr2;
409
+ boolean8_t *p2 = q2;
410
+ ca_size_t k;
411
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
412
+ if ( m ) {
413
+ boolean8_t *pm;
414
+ for (k=0; k<n; k++) {
415
+ pm = m + k;
416
+ if ( ! *pm ) {
417
+ p1 = q1 + k*i1;
418
+ p2 = q2 + k*i2;
419
+ { (*p2) = rb_funcall((*p1), rb_intern("nan?"), 0); }
420
+ }
421
+ }
422
+ } else {
423
+ for (k=0; k<n; k++) {
424
+ p1 = q1 + k*i1;
425
+ p2 = q2 + k*i2;
426
+ { (*p2) = rb_funcall((*p1), rb_intern("nan?"), 0); }
427
+ }
428
+ }
429
+ }
430
+
431
+ ca_moncmp_func_t
432
+ ca_moncmp_is_nan[CA_NTYPE] = {
433
+ ca_moncmp_not_implement,
434
+ ca_moncmp_not_implement,
435
+ ca_moncmp_is_nan_int8_t,
436
+ ca_moncmp_is_nan_uint8_t,
437
+ ca_moncmp_is_nan_int16_t,
438
+ ca_moncmp_is_nan_uint16_t,
439
+ ca_moncmp_is_nan_int32_t,
440
+ ca_moncmp_is_nan_uint32_t,
441
+ ca_moncmp_is_nan_int64_t,
442
+ ca_moncmp_is_nan_uint64_t,
443
+ ca_moncmp_is_nan_float32_t,
444
+ ca_moncmp_is_nan_float64_t,
445
+ ca_moncmp_not_implement,
446
+ ca_moncmp_is_nan_cmplx64_t,
447
+ ca_moncmp_is_nan_cmplx128_t,
448
+ ca_moncmp_not_implement,
449
+ ca_moncmp_is_nan_VALUE,
450
+ };
451
+
452
+ VALUE rb_ca_is_nan (VALUE self)
453
+ { return rb_ca_call_moncmp(self, ca_moncmp_is_nan); }
454
+
455
+ /* ===== moncmp is_inf ============================================ */
456
+
457
+ static void
458
+ ca_moncmp_is_inf_int8_t (ca_size_t n, boolean8_t *m,
459
+ char *ptr1, ca_size_t i1,
460
+ boolean8_t *ptr2, ca_size_t i2)
461
+ {
462
+ int8_t *q1 = (int8_t *) ptr1;
463
+ int8_t *p1 = q1;
464
+ boolean8_t *q2 = (boolean8_t *) ptr2;
465
+ boolean8_t *p2 = q2;
466
+ ca_size_t k;
467
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
468
+ if ( m ) {
469
+ boolean8_t *pm;
470
+ for (k=0; k<n; k++) {
471
+ pm = m + k;
472
+ if ( ! *pm ) {
473
+ p1 = q1 + k*i1;
474
+ p2 = q2 + k*i2;
475
+ { (*p2) = 0; }
476
+ }
477
+ }
478
+ } else {
479
+ for (k=0; k<n; k++) {
480
+ p1 = q1 + k*i1;
481
+ p2 = q2 + k*i2;
482
+ { (*p2) = 0; }
483
+ }
484
+ }
485
+ }
486
+
487
+ static void
488
+ ca_moncmp_is_inf_uint8_t (ca_size_t n, boolean8_t *m,
489
+ char *ptr1, ca_size_t i1,
490
+ boolean8_t *ptr2, ca_size_t i2)
491
+ {
492
+ uint8_t *q1 = (uint8_t *) ptr1;
493
+ uint8_t *p1 = q1;
494
+ boolean8_t *q2 = (boolean8_t *) ptr2;
495
+ boolean8_t *p2 = q2;
496
+ ca_size_t k;
497
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
498
+ if ( m ) {
499
+ boolean8_t *pm;
500
+ for (k=0; k<n; k++) {
501
+ pm = m + k;
502
+ if ( ! *pm ) {
503
+ p1 = q1 + k*i1;
504
+ p2 = q2 + k*i2;
505
+ { (*p2) = 0; }
506
+ }
507
+ }
508
+ } else {
509
+ for (k=0; k<n; k++) {
510
+ p1 = q1 + k*i1;
511
+ p2 = q2 + k*i2;
512
+ { (*p2) = 0; }
513
+ }
514
+ }
515
+ }
516
+
517
+ static void
518
+ ca_moncmp_is_inf_int16_t (ca_size_t n, boolean8_t *m,
519
+ char *ptr1, ca_size_t i1,
520
+ boolean8_t *ptr2, ca_size_t i2)
521
+ {
522
+ int16_t *q1 = (int16_t *) ptr1;
523
+ int16_t *p1 = q1;
524
+ boolean8_t *q2 = (boolean8_t *) ptr2;
525
+ boolean8_t *p2 = q2;
526
+ ca_size_t k;
527
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
528
+ if ( m ) {
529
+ boolean8_t *pm;
530
+ for (k=0; k<n; k++) {
531
+ pm = m + k;
532
+ if ( ! *pm ) {
533
+ p1 = q1 + k*i1;
534
+ p2 = q2 + k*i2;
535
+ { (*p2) = 0; }
536
+ }
537
+ }
538
+ } else {
539
+ for (k=0; k<n; k++) {
540
+ p1 = q1 + k*i1;
541
+ p2 = q2 + k*i2;
542
+ { (*p2) = 0; }
543
+ }
544
+ }
545
+ }
546
+
547
+ static void
548
+ ca_moncmp_is_inf_uint16_t (ca_size_t n, boolean8_t *m,
549
+ char *ptr1, ca_size_t i1,
550
+ boolean8_t *ptr2, ca_size_t i2)
551
+ {
552
+ uint16_t *q1 = (uint16_t *) ptr1;
553
+ uint16_t *p1 = q1;
554
+ boolean8_t *q2 = (boolean8_t *) ptr2;
555
+ boolean8_t *p2 = q2;
556
+ ca_size_t k;
557
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
558
+ if ( m ) {
559
+ boolean8_t *pm;
560
+ for (k=0; k<n; k++) {
561
+ pm = m + k;
562
+ if ( ! *pm ) {
563
+ p1 = q1 + k*i1;
564
+ p2 = q2 + k*i2;
565
+ { (*p2) = 0; }
566
+ }
567
+ }
568
+ } else {
569
+ for (k=0; k<n; k++) {
570
+ p1 = q1 + k*i1;
571
+ p2 = q2 + k*i2;
572
+ { (*p2) = 0; }
573
+ }
574
+ }
575
+ }
576
+
577
+ static void
578
+ ca_moncmp_is_inf_int32_t (ca_size_t n, boolean8_t *m,
579
+ char *ptr1, ca_size_t i1,
580
+ boolean8_t *ptr2, ca_size_t i2)
581
+ {
582
+ int32_t *q1 = (int32_t *) ptr1;
583
+ int32_t *p1 = q1;
584
+ boolean8_t *q2 = (boolean8_t *) ptr2;
585
+ boolean8_t *p2 = q2;
586
+ ca_size_t k;
587
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
588
+ if ( m ) {
589
+ boolean8_t *pm;
590
+ for (k=0; k<n; k++) {
591
+ pm = m + k;
592
+ if ( ! *pm ) {
593
+ p1 = q1 + k*i1;
594
+ p2 = q2 + k*i2;
595
+ { (*p2) = 0; }
596
+ }
597
+ }
598
+ } else {
599
+ for (k=0; k<n; k++) {
600
+ p1 = q1 + k*i1;
601
+ p2 = q2 + k*i2;
602
+ { (*p2) = 0; }
603
+ }
604
+ }
605
+ }
606
+
607
+ static void
608
+ ca_moncmp_is_inf_uint32_t (ca_size_t n, boolean8_t *m,
609
+ char *ptr1, ca_size_t i1,
610
+ boolean8_t *ptr2, ca_size_t i2)
611
+ {
612
+ uint32_t *q1 = (uint32_t *) ptr1;
613
+ uint32_t *p1 = q1;
614
+ boolean8_t *q2 = (boolean8_t *) ptr2;
615
+ boolean8_t *p2 = q2;
616
+ ca_size_t k;
617
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
618
+ if ( m ) {
619
+ boolean8_t *pm;
620
+ for (k=0; k<n; k++) {
621
+ pm = m + k;
622
+ if ( ! *pm ) {
623
+ p1 = q1 + k*i1;
624
+ p2 = q2 + k*i2;
625
+ { (*p2) = 0; }
626
+ }
627
+ }
628
+ } else {
629
+ for (k=0; k<n; k++) {
630
+ p1 = q1 + k*i1;
631
+ p2 = q2 + k*i2;
632
+ { (*p2) = 0; }
633
+ }
634
+ }
635
+ }
636
+
637
+ static void
638
+ ca_moncmp_is_inf_int64_t (ca_size_t n, boolean8_t *m,
639
+ char *ptr1, ca_size_t i1,
640
+ boolean8_t *ptr2, ca_size_t i2)
641
+ {
642
+ int64_t *q1 = (int64_t *) ptr1;
643
+ int64_t *p1 = q1;
644
+ boolean8_t *q2 = (boolean8_t *) ptr2;
645
+ boolean8_t *p2 = q2;
646
+ ca_size_t k;
647
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
648
+ if ( m ) {
649
+ boolean8_t *pm;
650
+ for (k=0; k<n; k++) {
651
+ pm = m + k;
652
+ if ( ! *pm ) {
653
+ p1 = q1 + k*i1;
654
+ p2 = q2 + k*i2;
655
+ { (*p2) = 0; }
656
+ }
657
+ }
658
+ } else {
659
+ for (k=0; k<n; k++) {
660
+ p1 = q1 + k*i1;
661
+ p2 = q2 + k*i2;
662
+ { (*p2) = 0; }
663
+ }
664
+ }
665
+ }
666
+
667
+ static void
668
+ ca_moncmp_is_inf_uint64_t (ca_size_t n, boolean8_t *m,
669
+ char *ptr1, ca_size_t i1,
670
+ boolean8_t *ptr2, ca_size_t i2)
671
+ {
672
+ uint64_t *q1 = (uint64_t *) ptr1;
673
+ uint64_t *p1 = q1;
674
+ boolean8_t *q2 = (boolean8_t *) ptr2;
675
+ boolean8_t *p2 = q2;
676
+ ca_size_t k;
677
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
678
+ if ( m ) {
679
+ boolean8_t *pm;
680
+ for (k=0; k<n; k++) {
681
+ pm = m + k;
682
+ if ( ! *pm ) {
683
+ p1 = q1 + k*i1;
684
+ p2 = q2 + k*i2;
685
+ { (*p2) = 0; }
686
+ }
687
+ }
688
+ } else {
689
+ for (k=0; k<n; k++) {
690
+ p1 = q1 + k*i1;
691
+ p2 = q2 + k*i2;
692
+ { (*p2) = 0; }
693
+ }
694
+ }
695
+ }
696
+
697
+ static void
698
+ ca_moncmp_is_inf_float32_t (ca_size_t n, boolean8_t *m,
699
+ char *ptr1, ca_size_t i1,
700
+ boolean8_t *ptr2, ca_size_t i2)
701
+ {
702
+ float *q1 = (float *) ptr1;
703
+ float *p1 = q1;
704
+ boolean8_t *q2 = (boolean8_t *) ptr2;
705
+ boolean8_t *p2 = q2;
706
+ ca_size_t k;
707
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
708
+ if ( m ) {
709
+ boolean8_t *pm;
710
+ for (k=0; k<n; k++) {
711
+ pm = m + k;
712
+ if ( ! *pm ) {
713
+ p1 = q1 + k*i1;
714
+ p2 = q2 + k*i2;
715
+ { (*p2) = isinf(*p1); }
716
+ }
717
+ }
718
+ } else {
719
+ for (k=0; k<n; k++) {
720
+ p1 = q1 + k*i1;
721
+ p2 = q2 + k*i2;
722
+ { (*p2) = isinf(*p1); }
723
+ }
724
+ }
725
+ }
726
+
727
+ static void
728
+ ca_moncmp_is_inf_float64_t (ca_size_t n, boolean8_t *m,
729
+ char *ptr1, ca_size_t i1,
730
+ boolean8_t *ptr2, ca_size_t i2)
731
+ {
732
+ double *q1 = (double *) ptr1;
733
+ double *p1 = q1;
734
+ boolean8_t *q2 = (boolean8_t *) ptr2;
735
+ boolean8_t *p2 = q2;
736
+ ca_size_t k;
737
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
738
+ if ( m ) {
739
+ boolean8_t *pm;
740
+ for (k=0; k<n; k++) {
741
+ pm = m + k;
742
+ if ( ! *pm ) {
743
+ p1 = q1 + k*i1;
744
+ p2 = q2 + k*i2;
745
+ { (*p2) = isinf(*p1); }
746
+ }
747
+ }
748
+ } else {
749
+ for (k=0; k<n; k++) {
750
+ p1 = q1 + k*i1;
751
+ p2 = q2 + k*i2;
752
+ { (*p2) = isinf(*p1); }
753
+ }
754
+ }
755
+ }
756
+
757
+ static void
758
+ ca_moncmp_is_inf_cmplx64_t (ca_size_t n, boolean8_t *m,
759
+ char *ptr1, ca_size_t i1,
760
+ boolean8_t *ptr2, ca_size_t i2)
761
+ {
762
+ cmplx64_t *q1 = (cmplx64_t *) ptr1;
763
+ cmplx64_t *p1 = q1;
764
+ boolean8_t *q2 = (boolean8_t *) ptr2;
765
+ boolean8_t *p2 = q2;
766
+ ca_size_t k;
767
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
768
+ if ( m ) {
769
+ boolean8_t *pm;
770
+ for (k=0; k<n; k++) {
771
+ pm = m + k;
772
+ if ( ! *pm ) {
773
+ p1 = q1 + k*i1;
774
+ p2 = q2 + k*i2;
775
+ { (*p2) = (isinf(creal(*p1)) || isinf(cimag(*p1))); }
776
+ }
777
+ }
778
+ } else {
779
+ for (k=0; k<n; k++) {
780
+ p1 = q1 + k*i1;
781
+ p2 = q2 + k*i2;
782
+ { (*p2) = (isinf(creal(*p1)) || isinf(cimag(*p1))); }
783
+ }
784
+ }
785
+ }
786
+
787
+ static void
788
+ ca_moncmp_is_inf_cmplx128_t (ca_size_t n, boolean8_t *m,
789
+ char *ptr1, ca_size_t i1,
790
+ boolean8_t *ptr2, ca_size_t i2)
791
+ {
792
+ cmplx128_t *q1 = (cmplx128_t *) ptr1;
793
+ cmplx128_t *p1 = q1;
794
+ boolean8_t *q2 = (boolean8_t *) ptr2;
795
+ boolean8_t *p2 = q2;
796
+ ca_size_t k;
797
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
798
+ if ( m ) {
799
+ boolean8_t *pm;
800
+ for (k=0; k<n; k++) {
801
+ pm = m + k;
802
+ if ( ! *pm ) {
803
+ p1 = q1 + k*i1;
804
+ p2 = q2 + k*i2;
805
+ { (*p2) = (isinf(creal(*p1)) || isinf(cimag(*p1))); }
806
+ }
807
+ }
808
+ } else {
809
+ for (k=0; k<n; k++) {
810
+ p1 = q1 + k*i1;
811
+ p2 = q2 + k*i2;
812
+ { (*p2) = (isinf(creal(*p1)) || isinf(cimag(*p1))); }
813
+ }
814
+ }
815
+ }
816
+
817
+ static void
818
+ ca_moncmp_is_inf_VALUE (ca_size_t n, boolean8_t *m,
819
+ char *ptr1, ca_size_t i1,
820
+ boolean8_t *ptr2, ca_size_t i2)
821
+ {
822
+ VALUE *q1 = (VALUE *) ptr1;
823
+ VALUE *p1 = q1;
824
+ boolean8_t *q2 = (boolean8_t *) ptr2;
825
+ boolean8_t *p2 = q2;
826
+ ca_size_t k;
827
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
828
+ if ( m ) {
829
+ boolean8_t *pm;
830
+ for (k=0; k<n; k++) {
831
+ pm = m + k;
832
+ if ( ! *pm ) {
833
+ p1 = q1 + k*i1;
834
+ p2 = q2 + k*i2;
835
+ { (*p2) = rb_funcall((*p1), rb_intern("infinite?"), 0); }
836
+ }
837
+ }
838
+ } else {
839
+ for (k=0; k<n; k++) {
840
+ p1 = q1 + k*i1;
841
+ p2 = q2 + k*i2;
842
+ { (*p2) = rb_funcall((*p1), rb_intern("infinite?"), 0); }
843
+ }
844
+ }
845
+ }
846
+
847
+ ca_moncmp_func_t
848
+ ca_moncmp_is_inf[CA_NTYPE] = {
849
+ ca_moncmp_not_implement,
850
+ ca_moncmp_not_implement,
851
+ ca_moncmp_is_inf_int8_t,
852
+ ca_moncmp_is_inf_uint8_t,
853
+ ca_moncmp_is_inf_int16_t,
854
+ ca_moncmp_is_inf_uint16_t,
855
+ ca_moncmp_is_inf_int32_t,
856
+ ca_moncmp_is_inf_uint32_t,
857
+ ca_moncmp_is_inf_int64_t,
858
+ ca_moncmp_is_inf_uint64_t,
859
+ ca_moncmp_is_inf_float32_t,
860
+ ca_moncmp_is_inf_float64_t,
861
+ ca_moncmp_not_implement,
862
+ ca_moncmp_is_inf_cmplx64_t,
863
+ ca_moncmp_is_inf_cmplx128_t,
864
+ ca_moncmp_not_implement,
865
+ ca_moncmp_is_inf_VALUE,
866
+ };
867
+
868
+ VALUE rb_ca_is_inf (VALUE self)
869
+ { return rb_ca_call_moncmp(self, ca_moncmp_is_inf); }
870
+
871
+ /* ===== moncmp is_finite ============================================ */
872
+
873
+ static void
874
+ ca_moncmp_is_finite_int8_t (ca_size_t n, boolean8_t *m,
875
+ char *ptr1, ca_size_t i1,
876
+ boolean8_t *ptr2, ca_size_t i2)
877
+ {
878
+ int8_t *q1 = (int8_t *) ptr1;
879
+ int8_t *p1 = q1;
880
+ boolean8_t *q2 = (boolean8_t *) ptr2;
881
+ boolean8_t *p2 = q2;
882
+ ca_size_t k;
883
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
884
+ if ( m ) {
885
+ boolean8_t *pm;
886
+ for (k=0; k<n; k++) {
887
+ pm = m + k;
888
+ if ( ! *pm ) {
889
+ p1 = q1 + k*i1;
890
+ p2 = q2 + k*i2;
891
+ { (*p2) = 1; }
892
+ }
893
+ }
894
+ } else {
895
+ for (k=0; k<n; k++) {
896
+ p1 = q1 + k*i1;
897
+ p2 = q2 + k*i2;
898
+ { (*p2) = 1; }
899
+ }
900
+ }
901
+ }
902
+
903
+ static void
904
+ ca_moncmp_is_finite_uint8_t (ca_size_t n, boolean8_t *m,
905
+ char *ptr1, ca_size_t i1,
906
+ boolean8_t *ptr2, ca_size_t i2)
907
+ {
908
+ uint8_t *q1 = (uint8_t *) ptr1;
909
+ uint8_t *p1 = q1;
910
+ boolean8_t *q2 = (boolean8_t *) ptr2;
911
+ boolean8_t *p2 = q2;
912
+ ca_size_t k;
913
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
914
+ if ( m ) {
915
+ boolean8_t *pm;
916
+ for (k=0; k<n; k++) {
917
+ pm = m + k;
918
+ if ( ! *pm ) {
919
+ p1 = q1 + k*i1;
920
+ p2 = q2 + k*i2;
921
+ { (*p2) = 1; }
922
+ }
923
+ }
924
+ } else {
925
+ for (k=0; k<n; k++) {
926
+ p1 = q1 + k*i1;
927
+ p2 = q2 + k*i2;
928
+ { (*p2) = 1; }
929
+ }
930
+ }
931
+ }
932
+
933
+ static void
934
+ ca_moncmp_is_finite_int16_t (ca_size_t n, boolean8_t *m,
935
+ char *ptr1, ca_size_t i1,
936
+ boolean8_t *ptr2, ca_size_t i2)
937
+ {
938
+ int16_t *q1 = (int16_t *) ptr1;
939
+ int16_t *p1 = q1;
940
+ boolean8_t *q2 = (boolean8_t *) ptr2;
941
+ boolean8_t *p2 = q2;
942
+ ca_size_t k;
943
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
944
+ if ( m ) {
945
+ boolean8_t *pm;
946
+ for (k=0; k<n; k++) {
947
+ pm = m + k;
948
+ if ( ! *pm ) {
949
+ p1 = q1 + k*i1;
950
+ p2 = q2 + k*i2;
951
+ { (*p2) = 1; }
952
+ }
953
+ }
954
+ } else {
955
+ for (k=0; k<n; k++) {
956
+ p1 = q1 + k*i1;
957
+ p2 = q2 + k*i2;
958
+ { (*p2) = 1; }
959
+ }
960
+ }
961
+ }
962
+
963
+ static void
964
+ ca_moncmp_is_finite_uint16_t (ca_size_t n, boolean8_t *m,
965
+ char *ptr1, ca_size_t i1,
966
+ boolean8_t *ptr2, ca_size_t i2)
967
+ {
968
+ uint16_t *q1 = (uint16_t *) ptr1;
969
+ uint16_t *p1 = q1;
970
+ boolean8_t *q2 = (boolean8_t *) ptr2;
971
+ boolean8_t *p2 = q2;
972
+ ca_size_t k;
973
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
974
+ if ( m ) {
975
+ boolean8_t *pm;
976
+ for (k=0; k<n; k++) {
977
+ pm = m + k;
978
+ if ( ! *pm ) {
979
+ p1 = q1 + k*i1;
980
+ p2 = q2 + k*i2;
981
+ { (*p2) = 1; }
982
+ }
983
+ }
984
+ } else {
985
+ for (k=0; k<n; k++) {
986
+ p1 = q1 + k*i1;
987
+ p2 = q2 + k*i2;
988
+ { (*p2) = 1; }
989
+ }
990
+ }
991
+ }
992
+
993
+ static void
994
+ ca_moncmp_is_finite_int32_t (ca_size_t n, boolean8_t *m,
995
+ char *ptr1, ca_size_t i1,
996
+ boolean8_t *ptr2, ca_size_t i2)
997
+ {
998
+ int32_t *q1 = (int32_t *) ptr1;
999
+ int32_t *p1 = q1;
1000
+ boolean8_t *q2 = (boolean8_t *) ptr2;
1001
+ boolean8_t *p2 = q2;
1002
+ ca_size_t k;
1003
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
1004
+ if ( m ) {
1005
+ boolean8_t *pm;
1006
+ for (k=0; k<n; k++) {
1007
+ pm = m + k;
1008
+ if ( ! *pm ) {
1009
+ p1 = q1 + k*i1;
1010
+ p2 = q2 + k*i2;
1011
+ { (*p2) = 1; }
1012
+ }
1013
+ }
1014
+ } else {
1015
+ for (k=0; k<n; k++) {
1016
+ p1 = q1 + k*i1;
1017
+ p2 = q2 + k*i2;
1018
+ { (*p2) = 1; }
1019
+ }
1020
+ }
1021
+ }
1022
+
1023
+ static void
1024
+ ca_moncmp_is_finite_uint32_t (ca_size_t n, boolean8_t *m,
1025
+ char *ptr1, ca_size_t i1,
1026
+ boolean8_t *ptr2, ca_size_t i2)
1027
+ {
1028
+ uint32_t *q1 = (uint32_t *) ptr1;
1029
+ uint32_t *p1 = q1;
1030
+ boolean8_t *q2 = (boolean8_t *) ptr2;
1031
+ boolean8_t *p2 = q2;
1032
+ ca_size_t k;
1033
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
1034
+ if ( m ) {
1035
+ boolean8_t *pm;
1036
+ for (k=0; k<n; k++) {
1037
+ pm = m + k;
1038
+ if ( ! *pm ) {
1039
+ p1 = q1 + k*i1;
1040
+ p2 = q2 + k*i2;
1041
+ { (*p2) = 1; }
1042
+ }
1043
+ }
1044
+ } else {
1045
+ for (k=0; k<n; k++) {
1046
+ p1 = q1 + k*i1;
1047
+ p2 = q2 + k*i2;
1048
+ { (*p2) = 1; }
1049
+ }
1050
+ }
1051
+ }
1052
+
1053
+ static void
1054
+ ca_moncmp_is_finite_int64_t (ca_size_t n, boolean8_t *m,
1055
+ char *ptr1, ca_size_t i1,
1056
+ boolean8_t *ptr2, ca_size_t i2)
1057
+ {
1058
+ int64_t *q1 = (int64_t *) ptr1;
1059
+ int64_t *p1 = q1;
1060
+ boolean8_t *q2 = (boolean8_t *) ptr2;
1061
+ boolean8_t *p2 = q2;
1062
+ ca_size_t k;
1063
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
1064
+ if ( m ) {
1065
+ boolean8_t *pm;
1066
+ for (k=0; k<n; k++) {
1067
+ pm = m + k;
1068
+ if ( ! *pm ) {
1069
+ p1 = q1 + k*i1;
1070
+ p2 = q2 + k*i2;
1071
+ { (*p2) = 1; }
1072
+ }
1073
+ }
1074
+ } else {
1075
+ for (k=0; k<n; k++) {
1076
+ p1 = q1 + k*i1;
1077
+ p2 = q2 + k*i2;
1078
+ { (*p2) = 1; }
1079
+ }
1080
+ }
1081
+ }
1082
+
1083
+ static void
1084
+ ca_moncmp_is_finite_uint64_t (ca_size_t n, boolean8_t *m,
1085
+ char *ptr1, ca_size_t i1,
1086
+ boolean8_t *ptr2, ca_size_t i2)
1087
+ {
1088
+ uint64_t *q1 = (uint64_t *) ptr1;
1089
+ uint64_t *p1 = q1;
1090
+ boolean8_t *q2 = (boolean8_t *) ptr2;
1091
+ boolean8_t *p2 = q2;
1092
+ ca_size_t k;
1093
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
1094
+ if ( m ) {
1095
+ boolean8_t *pm;
1096
+ for (k=0; k<n; k++) {
1097
+ pm = m + k;
1098
+ if ( ! *pm ) {
1099
+ p1 = q1 + k*i1;
1100
+ p2 = q2 + k*i2;
1101
+ { (*p2) = 1; }
1102
+ }
1103
+ }
1104
+ } else {
1105
+ for (k=0; k<n; k++) {
1106
+ p1 = q1 + k*i1;
1107
+ p2 = q2 + k*i2;
1108
+ { (*p2) = 1; }
1109
+ }
1110
+ }
1111
+ }
1112
+
1113
+ static void
1114
+ ca_moncmp_is_finite_float32_t (ca_size_t n, boolean8_t *m,
1115
+ char *ptr1, ca_size_t i1,
1116
+ boolean8_t *ptr2, ca_size_t i2)
1117
+ {
1118
+ float *q1 = (float *) ptr1;
1119
+ float *p1 = q1;
1120
+ boolean8_t *q2 = (boolean8_t *) ptr2;
1121
+ boolean8_t *p2 = q2;
1122
+ ca_size_t k;
1123
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
1124
+ if ( m ) {
1125
+ boolean8_t *pm;
1126
+ for (k=0; k<n; k++) {
1127
+ pm = m + k;
1128
+ if ( ! *pm ) {
1129
+ p1 = q1 + k*i1;
1130
+ p2 = q2 + k*i2;
1131
+ { (*p2) = isfinite(*p1); }
1132
+ }
1133
+ }
1134
+ } else {
1135
+ for (k=0; k<n; k++) {
1136
+ p1 = q1 + k*i1;
1137
+ p2 = q2 + k*i2;
1138
+ { (*p2) = isfinite(*p1); }
1139
+ }
1140
+ }
1141
+ }
1142
+
1143
+ static void
1144
+ ca_moncmp_is_finite_float64_t (ca_size_t n, boolean8_t *m,
1145
+ char *ptr1, ca_size_t i1,
1146
+ boolean8_t *ptr2, ca_size_t i2)
1147
+ {
1148
+ double *q1 = (double *) ptr1;
1149
+ double *p1 = q1;
1150
+ boolean8_t *q2 = (boolean8_t *) ptr2;
1151
+ boolean8_t *p2 = q2;
1152
+ ca_size_t k;
1153
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
1154
+ if ( m ) {
1155
+ boolean8_t *pm;
1156
+ for (k=0; k<n; k++) {
1157
+ pm = m + k;
1158
+ if ( ! *pm ) {
1159
+ p1 = q1 + k*i1;
1160
+ p2 = q2 + k*i2;
1161
+ { (*p2) = isfinite(*p1); }
1162
+ }
1163
+ }
1164
+ } else {
1165
+ for (k=0; k<n; k++) {
1166
+ p1 = q1 + k*i1;
1167
+ p2 = q2 + k*i2;
1168
+ { (*p2) = isfinite(*p1); }
1169
+ }
1170
+ }
1171
+ }
1172
+
1173
+ static void
1174
+ ca_moncmp_is_finite_cmplx64_t (ca_size_t n, boolean8_t *m,
1175
+ char *ptr1, ca_size_t i1,
1176
+ boolean8_t *ptr2, ca_size_t i2)
1177
+ {
1178
+ cmplx64_t *q1 = (cmplx64_t *) ptr1;
1179
+ cmplx64_t *p1 = q1;
1180
+ boolean8_t *q2 = (boolean8_t *) ptr2;
1181
+ boolean8_t *p2 = q2;
1182
+ ca_size_t k;
1183
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
1184
+ if ( m ) {
1185
+ boolean8_t *pm;
1186
+ for (k=0; k<n; k++) {
1187
+ pm = m + k;
1188
+ if ( ! *pm ) {
1189
+ p1 = q1 + k*i1;
1190
+ p2 = q2 + k*i2;
1191
+ { (*p2) = (isfinite(creal(*p1)) && isfinite(cimag(*p1))); }
1192
+ }
1193
+ }
1194
+ } else {
1195
+ for (k=0; k<n; k++) {
1196
+ p1 = q1 + k*i1;
1197
+ p2 = q2 + k*i2;
1198
+ { (*p2) = (isfinite(creal(*p1)) && isfinite(cimag(*p1))); }
1199
+ }
1200
+ }
1201
+ }
1202
+
1203
+ static void
1204
+ ca_moncmp_is_finite_cmplx128_t (ca_size_t n, boolean8_t *m,
1205
+ char *ptr1, ca_size_t i1,
1206
+ boolean8_t *ptr2, ca_size_t i2)
1207
+ {
1208
+ cmplx128_t *q1 = (cmplx128_t *) ptr1;
1209
+ cmplx128_t *p1 = q1;
1210
+ boolean8_t *q2 = (boolean8_t *) ptr2;
1211
+ boolean8_t *p2 = q2;
1212
+ ca_size_t k;
1213
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
1214
+ if ( m ) {
1215
+ boolean8_t *pm;
1216
+ for (k=0; k<n; k++) {
1217
+ pm = m + k;
1218
+ if ( ! *pm ) {
1219
+ p1 = q1 + k*i1;
1220
+ p2 = q2 + k*i2;
1221
+ { (*p2) = (isfinite(creal(*p1)) && isfinite(cimag(*p1))); }
1222
+ }
1223
+ }
1224
+ } else {
1225
+ for (k=0; k<n; k++) {
1226
+ p1 = q1 + k*i1;
1227
+ p2 = q2 + k*i2;
1228
+ { (*p2) = (isfinite(creal(*p1)) && isfinite(cimag(*p1))); }
1229
+ }
1230
+ }
1231
+ }
1232
+
1233
+ static void
1234
+ ca_moncmp_is_finite_VALUE (ca_size_t n, boolean8_t *m,
1235
+ char *ptr1, ca_size_t i1,
1236
+ boolean8_t *ptr2, ca_size_t i2)
1237
+ {
1238
+ VALUE *q1 = (VALUE *) ptr1;
1239
+ VALUE *p1 = q1;
1240
+ boolean8_t *q2 = (boolean8_t *) ptr2;
1241
+ boolean8_t *p2 = q2;
1242
+ ca_size_t k;
1243
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
1244
+ if ( m ) {
1245
+ boolean8_t *pm;
1246
+ for (k=0; k<n; k++) {
1247
+ pm = m + k;
1248
+ if ( ! *pm ) {
1249
+ p1 = q1 + k*i1;
1250
+ p2 = q2 + k*i2;
1251
+ { (*p2) = rb_funcall((*p1), rb_intern("finite?"), 0); }
1252
+ }
1253
+ }
1254
+ } else {
1255
+ for (k=0; k<n; k++) {
1256
+ p1 = q1 + k*i1;
1257
+ p2 = q2 + k*i2;
1258
+ { (*p2) = rb_funcall((*p1), rb_intern("finite?"), 0); }
1259
+ }
1260
+ }
1261
+ }
1262
+
1263
+ ca_moncmp_func_t
1264
+ ca_moncmp_is_finite[CA_NTYPE] = {
1265
+ ca_moncmp_not_implement,
1266
+ ca_moncmp_not_implement,
1267
+ ca_moncmp_is_finite_int8_t,
1268
+ ca_moncmp_is_finite_uint8_t,
1269
+ ca_moncmp_is_finite_int16_t,
1270
+ ca_moncmp_is_finite_uint16_t,
1271
+ ca_moncmp_is_finite_int32_t,
1272
+ ca_moncmp_is_finite_uint32_t,
1273
+ ca_moncmp_is_finite_int64_t,
1274
+ ca_moncmp_is_finite_uint64_t,
1275
+ ca_moncmp_is_finite_float32_t,
1276
+ ca_moncmp_is_finite_float64_t,
1277
+ ca_moncmp_not_implement,
1278
+ ca_moncmp_is_finite_cmplx64_t,
1279
+ ca_moncmp_is_finite_cmplx128_t,
1280
+ ca_moncmp_not_implement,
1281
+ ca_moncmp_is_finite_VALUE,
1282
+ };
1283
+
1284
+ VALUE rb_ca_is_finite (VALUE self)
1285
+ { return rb_ca_call_moncmp(self, ca_moncmp_is_finite); }
1286
+
1287
+ /* ===== moncmp is_invalid ============================================ */
1288
+
1289
+ static void
1290
+ ca_moncmp_is_invalid_boolean8_t (ca_size_t n, boolean8_t *m,
1291
+ char *ptr1, ca_size_t i1,
1292
+ boolean8_t *ptr2, ca_size_t i2)
1293
+ {
1294
+ boolean8_t *q1 = (boolean8_t *) ptr1;
1295
+ boolean8_t *p1 = q1;
1296
+ boolean8_t *q2 = (boolean8_t *) ptr2;
1297
+ boolean8_t *p2 = q2;
1298
+ ca_size_t k;
1299
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
1300
+ if ( m ) {
1301
+ boolean8_t *pm;
1302
+ for (k=0; k<n; k++) {
1303
+ pm = m + k;
1304
+ if ( ! *pm ) {
1305
+ p1 = q1 + k*i1;
1306
+ p2 = q2 + k*i2;
1307
+ { (*p2) = 0; }
1308
+ }
1309
+ }
1310
+ } else {
1311
+ for (k=0; k<n; k++) {
1312
+ p1 = q1 + k*i1;
1313
+ p2 = q2 + k*i2;
1314
+ { (*p2) = 0; }
1315
+ }
1316
+ }
1317
+ }
1318
+
1319
+ static void
1320
+ ca_moncmp_is_invalid_int8_t (ca_size_t n, boolean8_t *m,
1321
+ char *ptr1, ca_size_t i1,
1322
+ boolean8_t *ptr2, ca_size_t i2)
1323
+ {
1324
+ int8_t *q1 = (int8_t *) ptr1;
1325
+ int8_t *p1 = q1;
1326
+ boolean8_t *q2 = (boolean8_t *) ptr2;
1327
+ boolean8_t *p2 = q2;
1328
+ ca_size_t k;
1329
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
1330
+ if ( m ) {
1331
+ boolean8_t *pm;
1332
+ for (k=0; k<n; k++) {
1333
+ pm = m + k;
1334
+ if ( ! *pm ) {
1335
+ p1 = q1 + k*i1;
1336
+ p2 = q2 + k*i2;
1337
+ { (*p2) = 0; }
1338
+ }
1339
+ }
1340
+ } else {
1341
+ for (k=0; k<n; k++) {
1342
+ p1 = q1 + k*i1;
1343
+ p2 = q2 + k*i2;
1344
+ { (*p2) = 0; }
1345
+ }
1346
+ }
1347
+ }
1348
+
1349
+ static void
1350
+ ca_moncmp_is_invalid_uint8_t (ca_size_t n, boolean8_t *m,
1351
+ char *ptr1, ca_size_t i1,
1352
+ boolean8_t *ptr2, ca_size_t i2)
1353
+ {
1354
+ uint8_t *q1 = (uint8_t *) ptr1;
1355
+ uint8_t *p1 = q1;
1356
+ boolean8_t *q2 = (boolean8_t *) ptr2;
1357
+ boolean8_t *p2 = q2;
1358
+ ca_size_t k;
1359
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
1360
+ if ( m ) {
1361
+ boolean8_t *pm;
1362
+ for (k=0; k<n; k++) {
1363
+ pm = m + k;
1364
+ if ( ! *pm ) {
1365
+ p1 = q1 + k*i1;
1366
+ p2 = q2 + k*i2;
1367
+ { (*p2) = 0; }
1368
+ }
1369
+ }
1370
+ } else {
1371
+ for (k=0; k<n; k++) {
1372
+ p1 = q1 + k*i1;
1373
+ p2 = q2 + k*i2;
1374
+ { (*p2) = 0; }
1375
+ }
1376
+ }
1377
+ }
1378
+
1379
+ static void
1380
+ ca_moncmp_is_invalid_int16_t (ca_size_t n, boolean8_t *m,
1381
+ char *ptr1, ca_size_t i1,
1382
+ boolean8_t *ptr2, ca_size_t i2)
1383
+ {
1384
+ int16_t *q1 = (int16_t *) ptr1;
1385
+ int16_t *p1 = q1;
1386
+ boolean8_t *q2 = (boolean8_t *) ptr2;
1387
+ boolean8_t *p2 = q2;
1388
+ ca_size_t k;
1389
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
1390
+ if ( m ) {
1391
+ boolean8_t *pm;
1392
+ for (k=0; k<n; k++) {
1393
+ pm = m + k;
1394
+ if ( ! *pm ) {
1395
+ p1 = q1 + k*i1;
1396
+ p2 = q2 + k*i2;
1397
+ { (*p2) = 0; }
1398
+ }
1399
+ }
1400
+ } else {
1401
+ for (k=0; k<n; k++) {
1402
+ p1 = q1 + k*i1;
1403
+ p2 = q2 + k*i2;
1404
+ { (*p2) = 0; }
1405
+ }
1406
+ }
1407
+ }
1408
+
1409
+ static void
1410
+ ca_moncmp_is_invalid_uint16_t (ca_size_t n, boolean8_t *m,
1411
+ char *ptr1, ca_size_t i1,
1412
+ boolean8_t *ptr2, ca_size_t i2)
1413
+ {
1414
+ uint16_t *q1 = (uint16_t *) ptr1;
1415
+ uint16_t *p1 = q1;
1416
+ boolean8_t *q2 = (boolean8_t *) ptr2;
1417
+ boolean8_t *p2 = q2;
1418
+ ca_size_t k;
1419
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
1420
+ if ( m ) {
1421
+ boolean8_t *pm;
1422
+ for (k=0; k<n; k++) {
1423
+ pm = m + k;
1424
+ if ( ! *pm ) {
1425
+ p1 = q1 + k*i1;
1426
+ p2 = q2 + k*i2;
1427
+ { (*p2) = 0; }
1428
+ }
1429
+ }
1430
+ } else {
1431
+ for (k=0; k<n; k++) {
1432
+ p1 = q1 + k*i1;
1433
+ p2 = q2 + k*i2;
1434
+ { (*p2) = 0; }
1435
+ }
1436
+ }
1437
+ }
1438
+
1439
+ static void
1440
+ ca_moncmp_is_invalid_int32_t (ca_size_t n, boolean8_t *m,
1441
+ char *ptr1, ca_size_t i1,
1442
+ boolean8_t *ptr2, ca_size_t i2)
1443
+ {
1444
+ int32_t *q1 = (int32_t *) ptr1;
1445
+ int32_t *p1 = q1;
1446
+ boolean8_t *q2 = (boolean8_t *) ptr2;
1447
+ boolean8_t *p2 = q2;
1448
+ ca_size_t k;
1449
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
1450
+ if ( m ) {
1451
+ boolean8_t *pm;
1452
+ for (k=0; k<n; k++) {
1453
+ pm = m + k;
1454
+ if ( ! *pm ) {
1455
+ p1 = q1 + k*i1;
1456
+ p2 = q2 + k*i2;
1457
+ { (*p2) = 0; }
1458
+ }
1459
+ }
1460
+ } else {
1461
+ for (k=0; k<n; k++) {
1462
+ p1 = q1 + k*i1;
1463
+ p2 = q2 + k*i2;
1464
+ { (*p2) = 0; }
1465
+ }
1466
+ }
1467
+ }
1468
+
1469
+ static void
1470
+ ca_moncmp_is_invalid_uint32_t (ca_size_t n, boolean8_t *m,
1471
+ char *ptr1, ca_size_t i1,
1472
+ boolean8_t *ptr2, ca_size_t i2)
1473
+ {
1474
+ uint32_t *q1 = (uint32_t *) ptr1;
1475
+ uint32_t *p1 = q1;
1476
+ boolean8_t *q2 = (boolean8_t *) ptr2;
1477
+ boolean8_t *p2 = q2;
1478
+ ca_size_t k;
1479
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
1480
+ if ( m ) {
1481
+ boolean8_t *pm;
1482
+ for (k=0; k<n; k++) {
1483
+ pm = m + k;
1484
+ if ( ! *pm ) {
1485
+ p1 = q1 + k*i1;
1486
+ p2 = q2 + k*i2;
1487
+ { (*p2) = 0; }
1488
+ }
1489
+ }
1490
+ } else {
1491
+ for (k=0; k<n; k++) {
1492
+ p1 = q1 + k*i1;
1493
+ p2 = q2 + k*i2;
1494
+ { (*p2) = 0; }
1495
+ }
1496
+ }
1497
+ }
1498
+
1499
+ static void
1500
+ ca_moncmp_is_invalid_int64_t (ca_size_t n, boolean8_t *m,
1501
+ char *ptr1, ca_size_t i1,
1502
+ boolean8_t *ptr2, ca_size_t i2)
1503
+ {
1504
+ int64_t *q1 = (int64_t *) ptr1;
1505
+ int64_t *p1 = q1;
1506
+ boolean8_t *q2 = (boolean8_t *) ptr2;
1507
+ boolean8_t *p2 = q2;
1508
+ ca_size_t k;
1509
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
1510
+ if ( m ) {
1511
+ boolean8_t *pm;
1512
+ for (k=0; k<n; k++) {
1513
+ pm = m + k;
1514
+ if ( ! *pm ) {
1515
+ p1 = q1 + k*i1;
1516
+ p2 = q2 + k*i2;
1517
+ { (*p2) = 0; }
1518
+ }
1519
+ }
1520
+ } else {
1521
+ for (k=0; k<n; k++) {
1522
+ p1 = q1 + k*i1;
1523
+ p2 = q2 + k*i2;
1524
+ { (*p2) = 0; }
1525
+ }
1526
+ }
1527
+ }
1528
+
1529
+ static void
1530
+ ca_moncmp_is_invalid_uint64_t (ca_size_t n, boolean8_t *m,
1531
+ char *ptr1, ca_size_t i1,
1532
+ boolean8_t *ptr2, ca_size_t i2)
1533
+ {
1534
+ uint64_t *q1 = (uint64_t *) ptr1;
1535
+ uint64_t *p1 = q1;
1536
+ boolean8_t *q2 = (boolean8_t *) ptr2;
1537
+ boolean8_t *p2 = q2;
1538
+ ca_size_t k;
1539
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
1540
+ if ( m ) {
1541
+ boolean8_t *pm;
1542
+ for (k=0; k<n; k++) {
1543
+ pm = m + k;
1544
+ if ( ! *pm ) {
1545
+ p1 = q1 + k*i1;
1546
+ p2 = q2 + k*i2;
1547
+ { (*p2) = 0; }
1548
+ }
1549
+ }
1550
+ } else {
1551
+ for (k=0; k<n; k++) {
1552
+ p1 = q1 + k*i1;
1553
+ p2 = q2 + k*i2;
1554
+ { (*p2) = 0; }
1555
+ }
1556
+ }
1557
+ }
1558
+
1559
+ static void
1560
+ ca_moncmp_is_invalid_float32_t (ca_size_t n, boolean8_t *m,
1561
+ char *ptr1, ca_size_t i1,
1562
+ boolean8_t *ptr2, ca_size_t i2)
1563
+ {
1564
+ float *q1 = (float *) ptr1;
1565
+ float *p1 = q1;
1566
+ boolean8_t *q2 = (boolean8_t *) ptr2;
1567
+ boolean8_t *p2 = q2;
1568
+ ca_size_t k;
1569
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
1570
+ if ( m ) {
1571
+ boolean8_t *pm;
1572
+ for (k=0; k<n; k++) {
1573
+ pm = m + k;
1574
+ if ( ! *pm ) {
1575
+ p1 = q1 + k*i1;
1576
+ p2 = q2 + k*i2;
1577
+ { (*p2) = (!isfinite(*p1)); }
1578
+ }
1579
+ }
1580
+ } else {
1581
+ for (k=0; k<n; k++) {
1582
+ p1 = q1 + k*i1;
1583
+ p2 = q2 + k*i2;
1584
+ { (*p2) = (!isfinite(*p1)); }
1585
+ }
1586
+ }
1587
+ }
1588
+
1589
+ static void
1590
+ ca_moncmp_is_invalid_float64_t (ca_size_t n, boolean8_t *m,
1591
+ char *ptr1, ca_size_t i1,
1592
+ boolean8_t *ptr2, ca_size_t i2)
1593
+ {
1594
+ double *q1 = (double *) ptr1;
1595
+ double *p1 = q1;
1596
+ boolean8_t *q2 = (boolean8_t *) ptr2;
1597
+ boolean8_t *p2 = q2;
1598
+ ca_size_t k;
1599
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
1600
+ if ( m ) {
1601
+ boolean8_t *pm;
1602
+ for (k=0; k<n; k++) {
1603
+ pm = m + k;
1604
+ if ( ! *pm ) {
1605
+ p1 = q1 + k*i1;
1606
+ p2 = q2 + k*i2;
1607
+ { (*p2) = (!isfinite(*p1)); }
1608
+ }
1609
+ }
1610
+ } else {
1611
+ for (k=0; k<n; k++) {
1612
+ p1 = q1 + k*i1;
1613
+ p2 = q2 + k*i2;
1614
+ { (*p2) = (!isfinite(*p1)); }
1615
+ }
1616
+ }
1617
+ }
1618
+
1619
+ static void
1620
+ ca_moncmp_is_invalid_cmplx64_t (ca_size_t n, boolean8_t *m,
1621
+ char *ptr1, ca_size_t i1,
1622
+ boolean8_t *ptr2, ca_size_t i2)
1623
+ {
1624
+ cmplx64_t *q1 = (cmplx64_t *) ptr1;
1625
+ cmplx64_t *p1 = q1;
1626
+ boolean8_t *q2 = (boolean8_t *) ptr2;
1627
+ boolean8_t *p2 = q2;
1628
+ ca_size_t k;
1629
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
1630
+ if ( m ) {
1631
+ boolean8_t *pm;
1632
+ for (k=0; k<n; k++) {
1633
+ pm = m + k;
1634
+ if ( ! *pm ) {
1635
+ p1 = q1 + k*i1;
1636
+ p2 = q2 + k*i2;
1637
+ { (*p2) = (!isfinite(creal(*p1)) || !isfinite(cimag(*p1))); }
1638
+ }
1639
+ }
1640
+ } else {
1641
+ for (k=0; k<n; k++) {
1642
+ p1 = q1 + k*i1;
1643
+ p2 = q2 + k*i2;
1644
+ { (*p2) = (!isfinite(creal(*p1)) || !isfinite(cimag(*p1))); }
1645
+ }
1646
+ }
1647
+ }
1648
+
1649
+ static void
1650
+ ca_moncmp_is_invalid_cmplx128_t (ca_size_t n, boolean8_t *m,
1651
+ char *ptr1, ca_size_t i1,
1652
+ boolean8_t *ptr2, ca_size_t i2)
1653
+ {
1654
+ cmplx128_t *q1 = (cmplx128_t *) ptr1;
1655
+ cmplx128_t *p1 = q1;
1656
+ boolean8_t *q2 = (boolean8_t *) ptr2;
1657
+ boolean8_t *p2 = q2;
1658
+ ca_size_t k;
1659
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
1660
+ if ( m ) {
1661
+ boolean8_t *pm;
1662
+ for (k=0; k<n; k++) {
1663
+ pm = m + k;
1664
+ if ( ! *pm ) {
1665
+ p1 = q1 + k*i1;
1666
+ p2 = q2 + k*i2;
1667
+ { (*p2) = (!isfinite(creal(*p1)) || !isfinite(cimag(*p1))); }
1668
+ }
1669
+ }
1670
+ } else {
1671
+ for (k=0; k<n; k++) {
1672
+ p1 = q1 + k*i1;
1673
+ p2 = q2 + k*i2;
1674
+ { (*p2) = (!isfinite(creal(*p1)) || !isfinite(cimag(*p1))); }
1675
+ }
1676
+ }
1677
+ }
1678
+
1679
+ static void
1680
+ ca_moncmp_is_invalid_VALUE (ca_size_t n, boolean8_t *m,
1681
+ char *ptr1, ca_size_t i1,
1682
+ boolean8_t *ptr2, ca_size_t i2)
1683
+ {
1684
+ VALUE *q1 = (VALUE *) ptr1;
1685
+ VALUE *p1 = q1;
1686
+ boolean8_t *q2 = (boolean8_t *) ptr2;
1687
+ boolean8_t *p2 = q2;
1688
+ ca_size_t k;
1689
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
1690
+ if ( m ) {
1691
+ boolean8_t *pm;
1692
+ for (k=0; k<n; k++) {
1693
+ pm = m + k;
1694
+ if ( ! *pm ) {
1695
+ p1 = q1 + k*i1;
1696
+ p2 = q2 + k*i2;
1697
+ { (*p2) = (RTEST(rb_funcall((*p1), rb_intern("finite?"), 0)) ? 0 : 1); }
1698
+ }
1699
+ }
1700
+ } else {
1701
+ for (k=0; k<n; k++) {
1702
+ p1 = q1 + k*i1;
1703
+ p2 = q2 + k*i2;
1704
+ { (*p2) = (RTEST(rb_funcall((*p1), rb_intern("finite?"), 0)) ? 0 : 1); }
1705
+ }
1706
+ }
1707
+ }
1708
+
1709
+ ca_moncmp_func_t
1710
+ ca_moncmp_is_invalid[CA_NTYPE] = {
1711
+ ca_moncmp_not_implement,
1712
+ ca_moncmp_is_invalid_boolean8_t,
1713
+ ca_moncmp_is_invalid_int8_t,
1714
+ ca_moncmp_is_invalid_uint8_t,
1715
+ ca_moncmp_is_invalid_int16_t,
1716
+ ca_moncmp_is_invalid_uint16_t,
1717
+ ca_moncmp_is_invalid_int32_t,
1718
+ ca_moncmp_is_invalid_uint32_t,
1719
+ ca_moncmp_is_invalid_int64_t,
1720
+ ca_moncmp_is_invalid_uint64_t,
1721
+ ca_moncmp_is_invalid_float32_t,
1722
+ ca_moncmp_is_invalid_float64_t,
1723
+ ca_moncmp_not_implement,
1724
+ ca_moncmp_is_invalid_cmplx64_t,
1725
+ ca_moncmp_is_invalid_cmplx128_t,
1726
+ ca_moncmp_not_implement,
1727
+ ca_moncmp_is_invalid_VALUE,
1728
+ };
1729
+
1730
+ VALUE rb_ca_is_invalid (VALUE self)
1731
+ { return rb_ca_call_moncmp(self, ca_moncmp_is_invalid); }
1732
+
1733
+ /* ===== moncmp signbit ============================================ */
1734
+
1735
+ static void
1736
+ ca_moncmp_signbit_int8_t (ca_size_t n, boolean8_t *m,
1737
+ char *ptr1, ca_size_t i1,
1738
+ boolean8_t *ptr2, ca_size_t i2)
1739
+ {
1740
+ int8_t *q1 = (int8_t *) ptr1;
1741
+ int8_t *p1 = q1;
1742
+ boolean8_t *q2 = (boolean8_t *) ptr2;
1743
+ boolean8_t *p2 = q2;
1744
+ ca_size_t k;
1745
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
1746
+ if ( m ) {
1747
+ boolean8_t *pm;
1748
+ for (k=0; k<n; k++) {
1749
+ pm = m + k;
1750
+ if ( ! *pm ) {
1751
+ p1 = q1 + k*i1;
1752
+ p2 = q2 + k*i2;
1753
+ { (*p2) = ((*p1) < 0); }
1754
+ }
1755
+ }
1756
+ } else {
1757
+ for (k=0; k<n; k++) {
1758
+ p1 = q1 + k*i1;
1759
+ p2 = q2 + k*i2;
1760
+ { (*p2) = ((*p1) < 0); }
1761
+ }
1762
+ }
1763
+ }
1764
+
1765
+ static void
1766
+ ca_moncmp_signbit_int16_t (ca_size_t n, boolean8_t *m,
1767
+ char *ptr1, ca_size_t i1,
1768
+ boolean8_t *ptr2, ca_size_t i2)
1769
+ {
1770
+ int16_t *q1 = (int16_t *) ptr1;
1771
+ int16_t *p1 = q1;
1772
+ boolean8_t *q2 = (boolean8_t *) ptr2;
1773
+ boolean8_t *p2 = q2;
1774
+ ca_size_t k;
1775
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
1776
+ if ( m ) {
1777
+ boolean8_t *pm;
1778
+ for (k=0; k<n; k++) {
1779
+ pm = m + k;
1780
+ if ( ! *pm ) {
1781
+ p1 = q1 + k*i1;
1782
+ p2 = q2 + k*i2;
1783
+ { (*p2) = ((*p1) < 0); }
1784
+ }
1785
+ }
1786
+ } else {
1787
+ for (k=0; k<n; k++) {
1788
+ p1 = q1 + k*i1;
1789
+ p2 = q2 + k*i2;
1790
+ { (*p2) = ((*p1) < 0); }
1791
+ }
1792
+ }
1793
+ }
1794
+
1795
+ static void
1796
+ ca_moncmp_signbit_int32_t (ca_size_t n, boolean8_t *m,
1797
+ char *ptr1, ca_size_t i1,
1798
+ boolean8_t *ptr2, ca_size_t i2)
1799
+ {
1800
+ int32_t *q1 = (int32_t *) ptr1;
1801
+ int32_t *p1 = q1;
1802
+ boolean8_t *q2 = (boolean8_t *) ptr2;
1803
+ boolean8_t *p2 = q2;
1804
+ ca_size_t k;
1805
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
1806
+ if ( m ) {
1807
+ boolean8_t *pm;
1808
+ for (k=0; k<n; k++) {
1809
+ pm = m + k;
1810
+ if ( ! *pm ) {
1811
+ p1 = q1 + k*i1;
1812
+ p2 = q2 + k*i2;
1813
+ { (*p2) = ((*p1) < 0); }
1814
+ }
1815
+ }
1816
+ } else {
1817
+ for (k=0; k<n; k++) {
1818
+ p1 = q1 + k*i1;
1819
+ p2 = q2 + k*i2;
1820
+ { (*p2) = ((*p1) < 0); }
1821
+ }
1822
+ }
1823
+ }
1824
+
1825
+ static void
1826
+ ca_moncmp_signbit_int64_t (ca_size_t n, boolean8_t *m,
1827
+ char *ptr1, ca_size_t i1,
1828
+ boolean8_t *ptr2, ca_size_t i2)
1829
+ {
1830
+ int64_t *q1 = (int64_t *) ptr1;
1831
+ int64_t *p1 = q1;
1832
+ boolean8_t *q2 = (boolean8_t *) ptr2;
1833
+ boolean8_t *p2 = q2;
1834
+ ca_size_t k;
1835
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
1836
+ if ( m ) {
1837
+ boolean8_t *pm;
1838
+ for (k=0; k<n; k++) {
1839
+ pm = m + k;
1840
+ if ( ! *pm ) {
1841
+ p1 = q1 + k*i1;
1842
+ p2 = q2 + k*i2;
1843
+ { (*p2) = ((*p1) < 0); }
1844
+ }
1845
+ }
1846
+ } else {
1847
+ for (k=0; k<n; k++) {
1848
+ p1 = q1 + k*i1;
1849
+ p2 = q2 + k*i2;
1850
+ { (*p2) = ((*p1) < 0); }
1851
+ }
1852
+ }
1853
+ }
1854
+
1855
+ static void
1856
+ ca_moncmp_signbit_uint8_t (ca_size_t n, boolean8_t *m,
1857
+ char *ptr1, ca_size_t i1,
1858
+ boolean8_t *ptr2, ca_size_t i2)
1859
+ {
1860
+ uint8_t *q1 = (uint8_t *) ptr1;
1861
+ uint8_t *p1 = q1;
1862
+ boolean8_t *q2 = (boolean8_t *) ptr2;
1863
+ boolean8_t *p2 = q2;
1864
+ ca_size_t k;
1865
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
1866
+ if ( m ) {
1867
+ boolean8_t *pm;
1868
+ for (k=0; k<n; k++) {
1869
+ pm = m + k;
1870
+ if ( ! *pm ) {
1871
+ p1 = q1 + k*i1;
1872
+ p2 = q2 + k*i2;
1873
+ { (*p2) = 0; }
1874
+ }
1875
+ }
1876
+ } else {
1877
+ for (k=0; k<n; k++) {
1878
+ p1 = q1 + k*i1;
1879
+ p2 = q2 + k*i2;
1880
+ { (*p2) = 0; }
1881
+ }
1882
+ }
1883
+ }
1884
+
1885
+ static void
1886
+ ca_moncmp_signbit_uint16_t (ca_size_t n, boolean8_t *m,
1887
+ char *ptr1, ca_size_t i1,
1888
+ boolean8_t *ptr2, ca_size_t i2)
1889
+ {
1890
+ uint16_t *q1 = (uint16_t *) ptr1;
1891
+ uint16_t *p1 = q1;
1892
+ boolean8_t *q2 = (boolean8_t *) ptr2;
1893
+ boolean8_t *p2 = q2;
1894
+ ca_size_t k;
1895
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
1896
+ if ( m ) {
1897
+ boolean8_t *pm;
1898
+ for (k=0; k<n; k++) {
1899
+ pm = m + k;
1900
+ if ( ! *pm ) {
1901
+ p1 = q1 + k*i1;
1902
+ p2 = q2 + k*i2;
1903
+ { (*p2) = 0; }
1904
+ }
1905
+ }
1906
+ } else {
1907
+ for (k=0; k<n; k++) {
1908
+ p1 = q1 + k*i1;
1909
+ p2 = q2 + k*i2;
1910
+ { (*p2) = 0; }
1911
+ }
1912
+ }
1913
+ }
1914
+
1915
+ static void
1916
+ ca_moncmp_signbit_uint32_t (ca_size_t n, boolean8_t *m,
1917
+ char *ptr1, ca_size_t i1,
1918
+ boolean8_t *ptr2, ca_size_t i2)
1919
+ {
1920
+ uint32_t *q1 = (uint32_t *) ptr1;
1921
+ uint32_t *p1 = q1;
1922
+ boolean8_t *q2 = (boolean8_t *) ptr2;
1923
+ boolean8_t *p2 = q2;
1924
+ ca_size_t k;
1925
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
1926
+ if ( m ) {
1927
+ boolean8_t *pm;
1928
+ for (k=0; k<n; k++) {
1929
+ pm = m + k;
1930
+ if ( ! *pm ) {
1931
+ p1 = q1 + k*i1;
1932
+ p2 = q2 + k*i2;
1933
+ { (*p2) = 0; }
1934
+ }
1935
+ }
1936
+ } else {
1937
+ for (k=0; k<n; k++) {
1938
+ p1 = q1 + k*i1;
1939
+ p2 = q2 + k*i2;
1940
+ { (*p2) = 0; }
1941
+ }
1942
+ }
1943
+ }
1944
+
1945
+ static void
1946
+ ca_moncmp_signbit_uint64_t (ca_size_t n, boolean8_t *m,
1947
+ char *ptr1, ca_size_t i1,
1948
+ boolean8_t *ptr2, ca_size_t i2)
1949
+ {
1950
+ uint64_t *q1 = (uint64_t *) ptr1;
1951
+ uint64_t *p1 = q1;
1952
+ boolean8_t *q2 = (boolean8_t *) ptr2;
1953
+ boolean8_t *p2 = q2;
1954
+ ca_size_t k;
1955
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
1956
+ if ( m ) {
1957
+ boolean8_t *pm;
1958
+ for (k=0; k<n; k++) {
1959
+ pm = m + k;
1960
+ if ( ! *pm ) {
1961
+ p1 = q1 + k*i1;
1962
+ p2 = q2 + k*i2;
1963
+ { (*p2) = 0; }
1964
+ }
1965
+ }
1966
+ } else {
1967
+ for (k=0; k<n; k++) {
1968
+ p1 = q1 + k*i1;
1969
+ p2 = q2 + k*i2;
1970
+ { (*p2) = 0; }
1971
+ }
1972
+ }
1973
+ }
1974
+
1975
+ static void
1976
+ ca_moncmp_signbit_float32_t (ca_size_t n, boolean8_t *m,
1977
+ char *ptr1, ca_size_t i1,
1978
+ boolean8_t *ptr2, ca_size_t i2)
1979
+ {
1980
+ float *q1 = (float *) ptr1;
1981
+ float *p1 = q1;
1982
+ boolean8_t *q2 = (boolean8_t *) ptr2;
1983
+ boolean8_t *p2 = q2;
1984
+ ca_size_t k;
1985
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
1986
+ if ( m ) {
1987
+ boolean8_t *pm;
1988
+ for (k=0; k<n; k++) {
1989
+ pm = m + k;
1990
+ if ( ! *pm ) {
1991
+ p1 = q1 + k*i1;
1992
+ p2 = q2 + k*i2;
1993
+ { (*p2) = signbit(*p1); }
1994
+ }
1995
+ }
1996
+ } else {
1997
+ for (k=0; k<n; k++) {
1998
+ p1 = q1 + k*i1;
1999
+ p2 = q2 + k*i2;
2000
+ { (*p2) = signbit(*p1); }
2001
+ }
2002
+ }
2003
+ }
2004
+
2005
+ static void
2006
+ ca_moncmp_signbit_float64_t (ca_size_t n, boolean8_t *m,
2007
+ char *ptr1, ca_size_t i1,
2008
+ boolean8_t *ptr2, ca_size_t i2)
2009
+ {
2010
+ double *q1 = (double *) ptr1;
2011
+ double *p1 = q1;
2012
+ boolean8_t *q2 = (boolean8_t *) ptr2;
2013
+ boolean8_t *p2 = q2;
2014
+ ca_size_t k;
2015
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
2016
+ if ( m ) {
2017
+ boolean8_t *pm;
2018
+ for (k=0; k<n; k++) {
2019
+ pm = m + k;
2020
+ if ( ! *pm ) {
2021
+ p1 = q1 + k*i1;
2022
+ p2 = q2 + k*i2;
2023
+ { (*p2) = signbit(*p1); }
2024
+ }
2025
+ }
2026
+ } else {
2027
+ for (k=0; k<n; k++) {
2028
+ p1 = q1 + k*i1;
2029
+ p2 = q2 + k*i2;
2030
+ { (*p2) = signbit(*p1); }
2031
+ }
2032
+ }
2033
+ }
2034
+
2035
+ static void
2036
+ ca_moncmp_signbit_VALUE (ca_size_t n, boolean8_t *m,
2037
+ char *ptr1, ca_size_t i1,
2038
+ boolean8_t *ptr2, ca_size_t i2)
2039
+ {
2040
+ VALUE *q1 = (VALUE *) ptr1;
2041
+ VALUE *p1 = q1;
2042
+ boolean8_t *q2 = (boolean8_t *) ptr2;
2043
+ boolean8_t *p2 = q2;
2044
+ ca_size_t k;
2045
+ (void) p1; /* expr may not reference *p1 (e.g. constant predicate) */
2046
+ if ( m ) {
2047
+ boolean8_t *pm;
2048
+ for (k=0; k<n; k++) {
2049
+ pm = m + k;
2050
+ if ( ! *pm ) {
2051
+ p1 = q1 + k*i1;
2052
+ p2 = q2 + k*i2;
2053
+ { (*p2) = (RTEST(rb_funcall((*p1), rb_intern("negative?"), 0)) ? 1 : 0); }
2054
+ }
2055
+ }
2056
+ } else {
2057
+ for (k=0; k<n; k++) {
2058
+ p1 = q1 + k*i1;
2059
+ p2 = q2 + k*i2;
2060
+ { (*p2) = (RTEST(rb_funcall((*p1), rb_intern("negative?"), 0)) ? 1 : 0); }
2061
+ }
2062
+ }
2063
+ }
2064
+
2065
+ ca_moncmp_func_t
2066
+ ca_moncmp_signbit[CA_NTYPE] = {
2067
+ ca_moncmp_not_implement,
2068
+ ca_moncmp_not_implement,
2069
+ ca_moncmp_signbit_int8_t,
2070
+ ca_moncmp_signbit_uint8_t,
2071
+ ca_moncmp_signbit_int16_t,
2072
+ ca_moncmp_signbit_uint16_t,
2073
+ ca_moncmp_signbit_int32_t,
2074
+ ca_moncmp_signbit_uint32_t,
2075
+ ca_moncmp_signbit_int64_t,
2076
+ ca_moncmp_signbit_uint64_t,
2077
+ ca_moncmp_signbit_float32_t,
2078
+ ca_moncmp_signbit_float64_t,
2079
+ ca_moncmp_not_implement,
2080
+ ca_moncmp_not_implement,
2081
+ ca_moncmp_not_implement,
2082
+ ca_moncmp_not_implement,
2083
+ ca_moncmp_signbit_VALUE,
2084
+ };
2085
+
2086
+ VALUE rb_ca_signbit (VALUE self)
2087
+ { return rb_ca_call_moncmp(self, ca_moncmp_signbit); }
2088
+
2089
+ void
2090
+ Init_carray_kernels_moncmp (void)
2091
+ {
2092
+ rb_define_method(rb_cCArray, "is_nan", rb_ca_is_nan, 0);
2093
+ rb_define_method(rb_cCArray, "is_inf", rb_ca_is_inf, 0);
2094
+ rb_define_method(rb_cCArray, "is_finite", rb_ca_is_finite, 0);
2095
+ rb_define_method(rb_cCArray, "is_invalid", rb_ca_is_invalid, 0);
2096
+ rb_define_method(rb_cCArray, "signbit", rb_ca_signbit, 0);
2097
+ }