carray 3.0.3 → 3.0.4

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