carray 3.0.2 → 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 (247) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +568 -0
  3. data/README.md +6 -6
  4. data/carray.gemspec +1 -1
  5. data/ext/ca_axis_descriptor.h +27 -24
  6. data/ext/ca_axis_dispatch.c +220 -0
  7. data/ext/ca_axis_group.c +201 -123
  8. data/ext/ca_binop_dispatch.c +46 -52
  9. data/ext/ca_binop_dispatch.h +1 -1
  10. data/ext/ca_categorical_iterator.c +249 -183
  11. data/ext/ca_compare.c +7 -12
  12. data/ext/ca_for_buffer.h +21 -68
  13. data/ext/ca_group_iter.c +38 -23
  14. data/ext/ca_kernel_iterator.c +1765 -2076
  15. data/ext/ca_kernel_iterator.h +584 -566
  16. data/ext/ca_monop_dispatch.c +86 -63
  17. data/ext/ca_monop_dispatch.h +5 -0
  18. data/ext/ca_obj_array.c +223 -56
  19. data/ext/ca_obj_bincmp.c +172 -138
  20. data/ext/ca_obj_binop.c +116 -230
  21. data/ext/ca_obj_bitarray.c +40 -26
  22. data/ext/ca_obj_bitfield.c +100 -68
  23. data/ext/ca_obj_block.c +19 -9
  24. data/ext/ca_obj_byte_swap.c +45 -46
  25. data/ext/ca_obj_const_string.c +269 -44
  26. data/ext/ca_obj_face.c +612 -89
  27. data/ext/ca_obj_face.h +111 -47
  28. data/ext/ca_obj_fake.c +36 -79
  29. data/ext/ca_obj_farray.c +7 -3
  30. data/ext/ca_obj_field.c +33 -8
  31. data/ext/ca_obj_fixlen_string.c +23 -24
  32. data/ext/ca_obj_grid.c +541 -210
  33. data/ext/ca_obj_meld.c +331 -111
  34. data/ext/ca_obj_moncmp.c +80 -65
  35. data/ext/ca_obj_monop.c +177 -149
  36. data/ext/ca_obj_object.c +664 -248
  37. data/ext/ca_obj_record.c +63 -23
  38. data/ext/ca_obj_reduce.c +18 -16
  39. data/ext/ca_obj_refer.c +140 -58
  40. data/ext/ca_obj_remap.c +85 -24
  41. data/ext/ca_obj_repeat.c +24 -9
  42. data/ext/ca_obj_roll.c +121 -16
  43. data/ext/ca_obj_select.c +61 -58
  44. data/ext/ca_obj_select_axis.c +73 -107
  45. data/ext/ca_obj_shift.c +32 -102
  46. data/ext/ca_obj_stack.c +372 -122
  47. data/ext/ca_obj_stride.c +348 -140
  48. data/ext/ca_obj_string.c +88 -22
  49. data/ext/ca_obj_tile.c +38 -21
  50. data/ext/ca_obj_time.c +45 -31
  51. data/ext/ca_obj_timedelta.c +43 -29
  52. data/ext/ca_obj_transpose.c +17 -6
  53. data/ext/ca_obj_triop.c +125 -141
  54. data/ext/ca_obj_window.c +330 -44
  55. data/ext/ca_op_ipower.c +24 -11
  56. data/ext/ca_op_powi.h +57 -30
  57. data/ext/ca_pow5_table.h +656 -0
  58. data/ext/ca_sort_kernels.h +70 -0
  59. data/ext/ca_sweep_engine.c +104 -81
  60. data/ext/ca_sweep_engine.h +7 -20
  61. data/ext/ca_triop_dispatch.c +4 -1
  62. data/ext/ca_triop_dispatch.h +5 -2
  63. data/ext/caframe_csv_reader.c +542 -0
  64. data/ext/carray.h +241 -92
  65. data/ext/carray_access.c +608 -276
  66. data/ext/carray_address_basis.c +494 -97
  67. data/ext/carray_attribute.c +129 -4
  68. data/ext/carray_bincount.c +39 -7
  69. data/ext/carray_broadcast.c +56 -19
  70. data/ext/carray_build_flags.h +1 -1
  71. data/ext/carray_call_cfunc.c +108 -28
  72. data/ext/carray_cast.c +1576 -223
  73. data/ext/carray_cast_func.rb +77 -24
  74. data/ext/carray_class.c +4 -3
  75. data/ext/carray_conversion.c +208 -75
  76. data/ext/carray_copy.c +82 -24
  77. data/ext/carray_core.c +646 -162
  78. data/ext/carray_count.c +171 -88
  79. data/ext/carray_element.c +94 -60
  80. data/ext/carray_factorize.c +670 -324
  81. data/ext/carray_generate.c +260 -83
  82. data/ext/carray_histogram.c +209 -106
  83. data/ext/carray_hold.c +14 -16
  84. data/ext/carray_index_classifier.c +422 -243
  85. data/ext/carray_internal.h +692 -3
  86. data/ext/carray_kernels_bincmp.c +7 -0
  87. data/ext/carray_kernels_binop.c +487 -120
  88. data/ext/carray_kernels_init.c +653 -50
  89. data/ext/carray_kernels_moncmp.c +15 -8
  90. data/ext/carray_kernels_monop.c +99 -43
  91. data/ext/carray_kernels_reduce_aggregate.c +3925 -6112
  92. data/ext/carray_kernels_reduce_boolean.c +112 -36
  93. data/ext/carray_kernels_reduce_cumulative.c +2127 -6903
  94. data/ext/carray_kernels_reduce_extreme.c +3032 -2892
  95. data/ext/carray_kernels_reduce_variance.c +439 -500
  96. data/ext/carray_kernels_scan.c +1097 -488
  97. data/ext/carray_kernels_search.c +3787 -2176
  98. data/ext/carray_kernels_sort.c +1200 -920
  99. data/ext/carray_kernels_triop.c +479 -7
  100. data/ext/carray_key_windows.c +216 -0
  101. data/ext/carray_lazy.c +967 -153
  102. data/ext/carray_loop.c +81 -65
  103. data/ext/carray_mask.c +910 -324
  104. data/ext/carray_math_kernel.h +1 -0
  105. data/ext/carray_median_percentile.c +299 -100
  106. data/ext/carray_memory_view.c +872 -758
  107. data/ext/carray_operator.c +1171 -364
  108. data/ext/carray_order.c +505 -133
  109. data/ext/carray_partition.c +112 -65
  110. data/ext/carray_random.c +327 -239
  111. data/ext/carray_round.c +273 -0
  112. data/ext/carray_scatter.c +346 -78
  113. data/ext/carray_segment.c +257 -0
  114. data/ext/carray_slab.c +249 -86
  115. data/ext/carray_sort.c +224 -227
  116. data/ext/carray_sort_kernel.c +8 -1
  117. data/ext/carray_struct.c +118 -39
  118. data/ext/carray_test.c +193 -69
  119. data/ext/carray_time_text.c +1182 -0
  120. data/ext/carray_undef.c +4 -0
  121. data/ext/carray_utils.c +579 -113
  122. data/ext/extconf.rb +27 -2
  123. data/ext/mk_call_cfunc.rb +19 -4
  124. data/ext/mk_pow5_table.rb +35 -0
  125. data/ext/mkkernel.rb +1202 -1014
  126. data/ext/ruby_carray.c +17 -5
  127. data/ext/version.h +4 -4
  128. data/ext/version.rb +4 -2
  129. data/lib/carray/attribute.rb +160 -17
  130. data/lib/carray/autoload_carray.rb +23 -27
  131. data/lib/carray/autoload_method_extension.rb +20 -5
  132. data/lib/carray/axis_group.rb +360 -63
  133. data/lib/carray/basics.rb +162 -28
  134. data/lib/carray/bincount_nd.rb +18 -2
  135. data/lib/carray/block_iterator.rb +231 -58
  136. data/lib/carray/boolean_reduce.rb +34 -42
  137. data/lib/carray/categorical.rb +242 -52
  138. data/lib/carray/categorical_iterator.rb +437 -827
  139. data/lib/carray/complex.rb +41 -34
  140. data/lib/carray/conditional.rb +150 -14
  141. data/lib/carray/const_string.rb +59 -4
  142. data/lib/carray/construct.rb +15 -11
  143. data/lib/carray/data_type_extension.rb +1 -0
  144. data/lib/carray/distance_limit.rb +77 -0
  145. data/lib/carray/fixlen_string.rb +7 -1
  146. data/lib/carray/frame/column_verbs.rb +70 -0
  147. data/lib/carray/frame/concat.rb +157 -6
  148. data/lib/carray/frame/convert.rb +82 -7
  149. data/lib/carray/frame/csv_parser.rb +688 -87
  150. data/lib/carray/frame/describe.rb +80 -0
  151. data/lib/carray/frame/frame.rb +369 -45
  152. data/lib/carray/frame/group.rb +631 -90
  153. data/lib/carray/frame/io.rb +506 -79
  154. data/lib/carray/frame/join.rb +411 -62
  155. data/lib/carray/frame/records.rb +116 -19
  156. data/lib/carray/frame/reshape.rb +455 -0
  157. data/lib/carray/frame/sort.rb +30 -18
  158. data/lib/carray/frame/verbs.rb +868 -61
  159. data/lib/carray/frame/windows.rb +117 -0
  160. data/lib/carray/frame.rb +4 -0
  161. data/lib/carray/fuse_source.rb +118 -2
  162. data/lib/carray/fusion.rb +257 -42
  163. data/lib/carray/histogram.rb +6 -1
  164. data/lib/carray/inspect.rb +54 -13
  165. data/lib/carray/iterator.rb +99 -9
  166. data/lib/carray/key_windows.rb +620 -0
  167. data/lib/carray/lazy.rb +216 -193
  168. data/lib/carray/mask_gap_fill.rb +112 -92
  169. data/lib/carray/math.rb +32 -19
  170. data/lib/carray/meld_reduce.rb +52 -21
  171. data/lib/carray/methods/align_addr.rb +8 -4
  172. data/lib/carray/methods/bin.rb +26 -18
  173. data/lib/carray/methods/bincount.rb +18 -2
  174. data/lib/carray/methods/bit_string.rb +15 -4
  175. data/lib/carray/methods/choose.rb +16 -3
  176. data/lib/carray/methods/composition.rb +18 -10
  177. data/lib/carray/methods/factorize.rb +2 -2
  178. data/lib/carray/methods/gather_nd.rb +25 -5
  179. data/lib/carray/methods/insert_block.rb +9 -14
  180. data/lib/carray/methods/is_between.rb +59 -0
  181. data/lib/carray/methods/is_in.rb +140 -10
  182. data/lib/carray/methods/join.rb +2 -7
  183. data/lib/carray/methods/lag.rb +49 -0
  184. data/lib/carray/methods/locate_addr.rb +182 -45
  185. data/lib/carray/methods/mode.rb +18 -1
  186. data/lib/carray/methods/nunique.rb +11 -6
  187. data/lib/carray/methods/repeat.rb +1 -20
  188. data/lib/carray/methods/resize.rb +21 -23
  189. data/lib/carray/methods/snap.rb +34 -12
  190. data/lib/carray/methods/unique.rb +11 -2
  191. data/lib/carray/methods/value_counts.rb +4 -11
  192. data/lib/carray/record_order.rb +208 -0
  193. data/lib/carray/rng.rb +3 -0
  194. data/lib/carray/runtime.rb +65 -17
  195. data/lib/carray/segment_iterator.rb +1221 -0
  196. data/lib/carray/serialize.rb +214 -30
  197. data/lib/carray/slab_iterator.rb +101 -27
  198. data/lib/carray/stack.rb +10 -4
  199. data/lib/carray/string.rb +105 -5
  200. data/lib/carray/string_operation_extension.rb +12 -4
  201. data/lib/carray/struct.rb +137 -58
  202. data/lib/carray/struct_builder.rb +124 -17
  203. data/lib/carray/time.rb +1222 -186
  204. data/lib/carray/window_iterator.rb +242 -81
  205. data/lib/carray.rb +9 -2
  206. data/yard-stubs/ca_obj_array.rb +4 -4
  207. data/yard-stubs/ca_obj_bitarray.rb +7 -0
  208. data/yard-stubs/ca_obj_bitfield.rb +23 -12
  209. data/yard-stubs/ca_obj_fake.rb +1 -1
  210. data/yard-stubs/ca_obj_field.rb +5 -1
  211. data/yard-stubs/ca_obj_grid.rb +21 -10
  212. data/yard-stubs/ca_obj_refer.rb +5 -4
  213. data/yard-stubs/ca_obj_roll.rb +2 -3
  214. data/yard-stubs/ca_obj_shift.rb +5 -1
  215. data/yard-stubs/ca_obj_stride.rb +10 -7
  216. data/yard-stubs/ca_obj_tile.rb +1 -1
  217. data/yard-stubs/ca_obj_transpose.rb +1 -1
  218. data/yard-stubs/ca_obj_window.rb +9 -5
  219. data/yard-stubs/carray_access.rb +11 -5
  220. data/yard-stubs/carray_attribute.rb +0 -5
  221. data/yard-stubs/carray_broadcast.rb +1 -1
  222. data/yard-stubs/carray_cast.rb +88 -43
  223. data/yard-stubs/carray_conversion.rb +15 -2
  224. data/yard-stubs/carray_copy.rb +12 -5
  225. data/yard-stubs/carray_core.rb +3 -3
  226. data/yard-stubs/carray_count.rb +9 -0
  227. data/yard-stubs/carray_element.rb +10 -4
  228. data/yard-stubs/carray_generate.rb +21 -1
  229. data/yard-stubs/carray_lazy.rb +5 -1
  230. data/yard-stubs/carray_loop.rb +4 -1
  231. data/yard-stubs/carray_mask.rb +60 -12
  232. data/yard-stubs/carray_math.rb +52 -14
  233. data/yard-stubs/carray_median_percentile.rb +15 -8
  234. data/yard-stubs/carray_memory_view.rb +40 -23
  235. data/yard-stubs/carray_order.rb +61 -29
  236. data/yard-stubs/carray_random.rb +13 -4
  237. data/yard-stubs/carray_scatter.rb +21 -9
  238. data/yard-stubs/carray_segment.rb +72 -0
  239. data/yard-stubs/carray_slab.rb +10 -2
  240. data/yard-stubs/carray_sort.rb +49 -8
  241. data/yard-stubs/carray_test.rb +15 -3
  242. data/yard-stubs/carray_utils.rb +0 -26
  243. metadata +19 -5
  244. data/ext/ca_for_each_element.h +0 -239
  245. data/ext/carray_kernels_map.c +0 -3467
  246. data/lib/carray/arrow_tensor.rb +0 -401
  247. data/lib/carray/table.rb +0 -108
@@ -24,6 +24,13 @@
24
24
  probed by operation-table function pointer (obj_type is runtime-
25
25
  assigned, so no CA_OBJ_STACK compile-time constant exists). */
26
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
+
27
34
  /* BOOL2VAL: bool -> Ruby (Qtrue/Qfalse). Used as ruby_scalar wrapper
28
35
  for the all/any flat-reduction Ruby surface so `a.all` / `a.any`
29
36
  return real true/false, not Integer 0/1. (BOOL2OBJ already exists
@@ -507,7 +514,7 @@ ca_binop_pmax_VALUE (ca_size_t n, boolean8_t *m,
507
514
  p1 = q1 + k*i1;
508
515
  p2 = q2 + k*i2;
509
516
  p3 = q3 + k*i3;
510
- { (*p3) = rb_funcall(rb_assoc_new((*p1),(*p2)), rb_intern("max"), 0); }
517
+ { (*p3) = ca_obj_extremum_replaces((*p2), (*p1), rb_intern(">")) ? (*p2) : (*p1); }
511
518
  }
512
519
  }
513
520
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -521,13 +528,13 @@ ca_binop_pmax_VALUE (ca_size_t n, boolean8_t *m,
521
528
  #pragma omp simd
522
529
  for (k=0; k<n; k++) {
523
530
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
524
- { (*p3) = rb_funcall(rb_assoc_new((*p1),(*p2)), rb_intern("max"), 0); }
531
+ { (*p3) = ca_obj_extremum_replaces((*p2), (*p1), rb_intern(">")) ? (*p2) : (*p1); }
525
532
  }
526
533
  } else {
527
534
  /* strided branch: numo-shape `p += s` increment form. */
528
535
  VALUE *p1 = q1, *p2 = q2, *p3 = q3;
529
536
  for (k=0; k<n; k++) {
530
- { (*p3) = rb_funcall(rb_assoc_new((*p1),(*p2)), rb_intern("max"), 0); }
537
+ { (*p3) = ca_obj_extremum_replaces((*p2), (*p1), rb_intern(">")) ? (*p2) : (*p1); }
531
538
  p1 += i1; p2 += i2; p3 += i3;
532
539
  }
533
540
  }
@@ -1036,7 +1043,7 @@ ca_binop_pmin_VALUE (ca_size_t n, boolean8_t *m,
1036
1043
  p1 = q1 + k*i1;
1037
1044
  p2 = q2 + k*i2;
1038
1045
  p3 = q3 + k*i3;
1039
- { (*p3) = rb_funcall(rb_assoc_new((*p1),(*p2)), rb_intern("min"), 0); }
1046
+ { (*p3) = ca_obj_extremum_replaces((*p2), (*p1), rb_intern("<")) ? (*p2) : (*p1); }
1040
1047
  }
1041
1048
  }
1042
1049
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -1050,13 +1057,13 @@ ca_binop_pmin_VALUE (ca_size_t n, boolean8_t *m,
1050
1057
  #pragma omp simd
1051
1058
  for (k=0; k<n; k++) {
1052
1059
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
1053
- { (*p3) = rb_funcall(rb_assoc_new((*p1),(*p2)), rb_intern("min"), 0); }
1060
+ { (*p3) = ca_obj_extremum_replaces((*p2), (*p1), rb_intern("<")) ? (*p2) : (*p1); }
1054
1061
  }
1055
1062
  } else {
1056
1063
  /* strided branch: numo-shape `p += s` increment form. */
1057
1064
  VALUE *p1 = q1, *p2 = q2, *p3 = q3;
1058
1065
  for (k=0; k<n; k++) {
1059
- { (*p3) = rb_funcall(rb_assoc_new((*p1),(*p2)), rb_intern("min"), 0); }
1066
+ { (*p3) = ca_obj_extremum_replaces((*p2), (*p1), rb_intern("<")) ? (*p2) : (*p1); }
1060
1067
  p1 += i1; p2 += i2; p3 += i3;
1061
1068
  }
1062
1069
  }
@@ -1475,7 +1482,7 @@ ca_binop_maximum_float32_t (ca_size_t n, boolean8_t *m,
1475
1482
  p1 = q1 + k*i1;
1476
1483
  p2 = q2 + k*i2;
1477
1484
  p3 = q3 + k*i3;
1478
- { (*p3) = isnan(*p1) ? (*p1) : (isnan(*p2) ? (*p2) : ((*p1) > (*p2) ? (*p1) : (*p2))); }
1485
+ { (*p3) = isnan(*p1) ? (*p1) : isnan(*p2) ? (*p2) : ((*p1) > (*p2) || ((*p1) == (*p2) && !signbit(*p1))) ? (*p1) : (*p2); }
1479
1486
  }
1480
1487
  }
1481
1488
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -1489,13 +1496,13 @@ ca_binop_maximum_float32_t (ca_size_t n, boolean8_t *m,
1489
1496
  #pragma omp simd
1490
1497
  for (k=0; k<n; k++) {
1491
1498
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
1492
- { (*p3) = isnan(*p1) ? (*p1) : (isnan(*p2) ? (*p2) : ((*p1) > (*p2) ? (*p1) : (*p2))); }
1499
+ { (*p3) = isnan(*p1) ? (*p1) : isnan(*p2) ? (*p2) : ((*p1) > (*p2) || ((*p1) == (*p2) && !signbit(*p1))) ? (*p1) : (*p2); }
1493
1500
  }
1494
1501
  } else {
1495
1502
  /* strided branch: numo-shape `p += s` increment form. */
1496
1503
  float *p1 = q1, *p2 = q2, *p3 = q3;
1497
1504
  for (k=0; k<n; k++) {
1498
- { (*p3) = isnan(*p1) ? (*p1) : (isnan(*p2) ? (*p2) : ((*p1) > (*p2) ? (*p1) : (*p2))); }
1505
+ { (*p3) = isnan(*p1) ? (*p1) : isnan(*p2) ? (*p2) : ((*p1) > (*p2) || ((*p1) == (*p2) && !signbit(*p1))) ? (*p1) : (*p2); }
1499
1506
  p1 += i1; p2 += i2; p3 += i3;
1500
1507
  }
1501
1508
  }
@@ -1520,7 +1527,7 @@ ca_binop_maximum_float64_t (ca_size_t n, boolean8_t *m,
1520
1527
  p1 = q1 + k*i1;
1521
1528
  p2 = q2 + k*i2;
1522
1529
  p3 = q3 + k*i3;
1523
- { (*p3) = isnan(*p1) ? (*p1) : (isnan(*p2) ? (*p2) : ((*p1) > (*p2) ? (*p1) : (*p2))); }
1530
+ { (*p3) = isnan(*p1) ? (*p1) : isnan(*p2) ? (*p2) : ((*p1) > (*p2) || ((*p1) == (*p2) && !signbit(*p1))) ? (*p1) : (*p2); }
1524
1531
  }
1525
1532
  }
1526
1533
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -1534,13 +1541,13 @@ ca_binop_maximum_float64_t (ca_size_t n, boolean8_t *m,
1534
1541
  #pragma omp simd
1535
1542
  for (k=0; k<n; k++) {
1536
1543
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
1537
- { (*p3) = isnan(*p1) ? (*p1) : (isnan(*p2) ? (*p2) : ((*p1) > (*p2) ? (*p1) : (*p2))); }
1544
+ { (*p3) = isnan(*p1) ? (*p1) : isnan(*p2) ? (*p2) : ((*p1) > (*p2) || ((*p1) == (*p2) && !signbit(*p1))) ? (*p1) : (*p2); }
1538
1545
  }
1539
1546
  } else {
1540
1547
  /* strided branch: numo-shape `p += s` increment form. */
1541
1548
  double *p1 = q1, *p2 = q2, *p3 = q3;
1542
1549
  for (k=0; k<n; k++) {
1543
- { (*p3) = isnan(*p1) ? (*p1) : (isnan(*p2) ? (*p2) : ((*p1) > (*p2) ? (*p1) : (*p2))); }
1550
+ { (*p3) = isnan(*p1) ? (*p1) : isnan(*p2) ? (*p2) : ((*p1) > (*p2) || ((*p1) == (*p2) && !signbit(*p1))) ? (*p1) : (*p2); }
1544
1551
  p1 += i1; p2 += i2; p3 += i3;
1545
1552
  }
1546
1553
  }
@@ -1565,7 +1572,7 @@ ca_binop_maximum_VALUE (ca_size_t n, boolean8_t *m,
1565
1572
  p1 = q1 + k*i1;
1566
1573
  p2 = q2 + k*i2;
1567
1574
  p3 = q3 + k*i3;
1568
- { (*p3) = rb_funcall(rb_assoc_new((*p1),(*p2)), rb_intern("max"), 0); }
1575
+ { (*p3) = CA_OBJ_ISNAN(*p1) ? (*p1) : CA_OBJ_ISNAN(*p2) ? (*p2) : ca_obj_cmp((*p2), (*p1)) > 0 ? (*p2) : (*p1); }
1569
1576
  }
1570
1577
  }
1571
1578
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -1579,13 +1586,13 @@ ca_binop_maximum_VALUE (ca_size_t n, boolean8_t *m,
1579
1586
  #pragma omp simd
1580
1587
  for (k=0; k<n; k++) {
1581
1588
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
1582
- { (*p3) = rb_funcall(rb_assoc_new((*p1),(*p2)), rb_intern("max"), 0); }
1589
+ { (*p3) = CA_OBJ_ISNAN(*p1) ? (*p1) : CA_OBJ_ISNAN(*p2) ? (*p2) : ca_obj_cmp((*p2), (*p1)) > 0 ? (*p2) : (*p1); }
1583
1590
  }
1584
1591
  } else {
1585
1592
  /* strided branch: numo-shape `p += s` increment form. */
1586
1593
  VALUE *p1 = q1, *p2 = q2, *p3 = q3;
1587
1594
  for (k=0; k<n; k++) {
1588
- { (*p3) = rb_funcall(rb_assoc_new((*p1),(*p2)), rb_intern("max"), 0); }
1595
+ { (*p3) = CA_OBJ_ISNAN(*p1) ? (*p1) : CA_OBJ_ISNAN(*p2) ? (*p2) : ca_obj_cmp((*p2), (*p1)) > 0 ? (*p2) : (*p1); }
1589
1596
  p1 += i1; p2 += i2; p3 += i3;
1590
1597
  }
1591
1598
  }
@@ -2004,7 +2011,7 @@ ca_binop_minimum_float32_t (ca_size_t n, boolean8_t *m,
2004
2011
  p1 = q1 + k*i1;
2005
2012
  p2 = q2 + k*i2;
2006
2013
  p3 = q3 + k*i3;
2007
- { (*p3) = isnan(*p1) ? (*p1) : (isnan(*p2) ? (*p2) : ((*p1) < (*p2) ? (*p1) : (*p2))); }
2014
+ { (*p3) = isnan(*p1) ? (*p1) : isnan(*p2) ? (*p2) : ((*p1) < (*p2) || ((*p1) == (*p2) && signbit(*p1))) ? (*p1) : (*p2); }
2008
2015
  }
2009
2016
  }
2010
2017
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -2018,13 +2025,13 @@ ca_binop_minimum_float32_t (ca_size_t n, boolean8_t *m,
2018
2025
  #pragma omp simd
2019
2026
  for (k=0; k<n; k++) {
2020
2027
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
2021
- { (*p3) = isnan(*p1) ? (*p1) : (isnan(*p2) ? (*p2) : ((*p1) < (*p2) ? (*p1) : (*p2))); }
2028
+ { (*p3) = isnan(*p1) ? (*p1) : isnan(*p2) ? (*p2) : ((*p1) < (*p2) || ((*p1) == (*p2) && signbit(*p1))) ? (*p1) : (*p2); }
2022
2029
  }
2023
2030
  } else {
2024
2031
  /* strided branch: numo-shape `p += s` increment form. */
2025
2032
  float *p1 = q1, *p2 = q2, *p3 = q3;
2026
2033
  for (k=0; k<n; k++) {
2027
- { (*p3) = isnan(*p1) ? (*p1) : (isnan(*p2) ? (*p2) : ((*p1) < (*p2) ? (*p1) : (*p2))); }
2034
+ { (*p3) = isnan(*p1) ? (*p1) : isnan(*p2) ? (*p2) : ((*p1) < (*p2) || ((*p1) == (*p2) && signbit(*p1))) ? (*p1) : (*p2); }
2028
2035
  p1 += i1; p2 += i2; p3 += i3;
2029
2036
  }
2030
2037
  }
@@ -2049,7 +2056,7 @@ ca_binop_minimum_float64_t (ca_size_t n, boolean8_t *m,
2049
2056
  p1 = q1 + k*i1;
2050
2057
  p2 = q2 + k*i2;
2051
2058
  p3 = q3 + k*i3;
2052
- { (*p3) = isnan(*p1) ? (*p1) : (isnan(*p2) ? (*p2) : ((*p1) < (*p2) ? (*p1) : (*p2))); }
2059
+ { (*p3) = isnan(*p1) ? (*p1) : isnan(*p2) ? (*p2) : ((*p1) < (*p2) || ((*p1) == (*p2) && signbit(*p1))) ? (*p1) : (*p2); }
2053
2060
  }
2054
2061
  }
2055
2062
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -2063,13 +2070,13 @@ ca_binop_minimum_float64_t (ca_size_t n, boolean8_t *m,
2063
2070
  #pragma omp simd
2064
2071
  for (k=0; k<n; k++) {
2065
2072
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
2066
- { (*p3) = isnan(*p1) ? (*p1) : (isnan(*p2) ? (*p2) : ((*p1) < (*p2) ? (*p1) : (*p2))); }
2073
+ { (*p3) = isnan(*p1) ? (*p1) : isnan(*p2) ? (*p2) : ((*p1) < (*p2) || ((*p1) == (*p2) && signbit(*p1))) ? (*p1) : (*p2); }
2067
2074
  }
2068
2075
  } else {
2069
2076
  /* strided branch: numo-shape `p += s` increment form. */
2070
2077
  double *p1 = q1, *p2 = q2, *p3 = q3;
2071
2078
  for (k=0; k<n; k++) {
2072
- { (*p3) = isnan(*p1) ? (*p1) : (isnan(*p2) ? (*p2) : ((*p1) < (*p2) ? (*p1) : (*p2))); }
2079
+ { (*p3) = isnan(*p1) ? (*p1) : isnan(*p2) ? (*p2) : ((*p1) < (*p2) || ((*p1) == (*p2) && signbit(*p1))) ? (*p1) : (*p2); }
2073
2080
  p1 += i1; p2 += i2; p3 += i3;
2074
2081
  }
2075
2082
  }
@@ -2094,7 +2101,7 @@ ca_binop_minimum_VALUE (ca_size_t n, boolean8_t *m,
2094
2101
  p1 = q1 + k*i1;
2095
2102
  p2 = q2 + k*i2;
2096
2103
  p3 = q3 + k*i3;
2097
- { (*p3) = rb_funcall(rb_assoc_new((*p1),(*p2)), rb_intern("min"), 0); }
2104
+ { (*p3) = CA_OBJ_ISNAN(*p1) ? (*p1) : CA_OBJ_ISNAN(*p2) ? (*p2) : ca_obj_cmp((*p2), (*p1)) < 0 ? (*p2) : (*p1); }
2098
2105
  }
2099
2106
  }
2100
2107
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -2108,13 +2115,13 @@ ca_binop_minimum_VALUE (ca_size_t n, boolean8_t *m,
2108
2115
  #pragma omp simd
2109
2116
  for (k=0; k<n; k++) {
2110
2117
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
2111
- { (*p3) = rb_funcall(rb_assoc_new((*p1),(*p2)), rb_intern("min"), 0); }
2118
+ { (*p3) = CA_OBJ_ISNAN(*p1) ? (*p1) : CA_OBJ_ISNAN(*p2) ? (*p2) : ca_obj_cmp((*p2), (*p1)) < 0 ? (*p2) : (*p1); }
2112
2119
  }
2113
2120
  } else {
2114
2121
  /* strided branch: numo-shape `p += s` increment form. */
2115
2122
  VALUE *p1 = q1, *p2 = q2, *p3 = q3;
2116
2123
  for (k=0; k<n; k++) {
2117
- { (*p3) = rb_funcall(rb_assoc_new((*p1),(*p2)), rb_intern("min"), 0); }
2124
+ { (*p3) = CA_OBJ_ISNAN(*p1) ? (*p1) : CA_OBJ_ISNAN(*p2) ? (*p2) : ca_obj_cmp((*p2), (*p1)) < 0 ? (*p2) : (*p1); }
2118
2125
  p1 += i1; p2 += i2; p3 += i3;
2119
2126
  }
2120
2127
  }
@@ -4032,7 +4039,8 @@ ca_binop_div_int8_t (ca_size_t n, boolean8_t *m,
4032
4039
  p3 = q3 + k*i3;
4033
4040
  {
4034
4041
  if ((*p2)==0) {ca_zerodiv();};
4035
- {
4042
+ if ((*p2)==-1) { (*p3) = (int8_t) (0 - (uint64_t) (*p1)); }
4043
+ else {
4036
4044
  int8_t _q = (*p1) / (*p2);
4037
4045
  if ( (*p1) % (*p2) != 0 && (((*p1) < 0) != ((*p2) < 0)) ) { _q -= 1; }
4038
4046
  (*p3) = _q;
@@ -4053,7 +4061,8 @@ ca_binop_div_int8_t (ca_size_t n, boolean8_t *m,
4053
4061
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
4054
4062
  {
4055
4063
  if ((*p2)==0) {ca_zerodiv();};
4056
- {
4064
+ if ((*p2)==-1) { (*p3) = (int8_t) (0 - (uint64_t) (*p1)); }
4065
+ else {
4057
4066
  int8_t _q = (*p1) / (*p2);
4058
4067
  if ( (*p1) % (*p2) != 0 && (((*p1) < 0) != ((*p2) < 0)) ) { _q -= 1; }
4059
4068
  (*p3) = _q;
@@ -4066,7 +4075,8 @@ ca_binop_div_int8_t (ca_size_t n, boolean8_t *m,
4066
4075
  for (k=0; k<n; k++) {
4067
4076
  {
4068
4077
  if ((*p2)==0) {ca_zerodiv();};
4069
- {
4078
+ if ((*p2)==-1) { (*p3) = (int8_t) (0 - (uint64_t) (*p1)); }
4079
+ else {
4070
4080
  int8_t _q = (*p1) / (*p2);
4071
4081
  if ( (*p1) % (*p2) != 0 && (((*p1) < 0) != ((*p2) < 0)) ) { _q -= 1; }
4072
4082
  (*p3) = _q;
@@ -4143,7 +4153,8 @@ ca_binop_div_int16_t (ca_size_t n, boolean8_t *m,
4143
4153
  p3 = q3 + k*i3;
4144
4154
  {
4145
4155
  if ((*p2)==0) {ca_zerodiv();};
4146
- {
4156
+ if ((*p2)==-1) { (*p3) = (int16_t) (0 - (uint64_t) (*p1)); }
4157
+ else {
4147
4158
  int16_t _q = (*p1) / (*p2);
4148
4159
  if ( (*p1) % (*p2) != 0 && (((*p1) < 0) != ((*p2) < 0)) ) { _q -= 1; }
4149
4160
  (*p3) = _q;
@@ -4164,7 +4175,8 @@ ca_binop_div_int16_t (ca_size_t n, boolean8_t *m,
4164
4175
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
4165
4176
  {
4166
4177
  if ((*p2)==0) {ca_zerodiv();};
4167
- {
4178
+ if ((*p2)==-1) { (*p3) = (int16_t) (0 - (uint64_t) (*p1)); }
4179
+ else {
4168
4180
  int16_t _q = (*p1) / (*p2);
4169
4181
  if ( (*p1) % (*p2) != 0 && (((*p1) < 0) != ((*p2) < 0)) ) { _q -= 1; }
4170
4182
  (*p3) = _q;
@@ -4177,7 +4189,8 @@ ca_binop_div_int16_t (ca_size_t n, boolean8_t *m,
4177
4189
  for (k=0; k<n; k++) {
4178
4190
  {
4179
4191
  if ((*p2)==0) {ca_zerodiv();};
4180
- {
4192
+ if ((*p2)==-1) { (*p3) = (int16_t) (0 - (uint64_t) (*p1)); }
4193
+ else {
4181
4194
  int16_t _q = (*p1) / (*p2);
4182
4195
  if ( (*p1) % (*p2) != 0 && (((*p1) < 0) != ((*p2) < 0)) ) { _q -= 1; }
4183
4196
  (*p3) = _q;
@@ -4254,7 +4267,8 @@ ca_binop_div_int32_t (ca_size_t n, boolean8_t *m,
4254
4267
  p3 = q3 + k*i3;
4255
4268
  {
4256
4269
  if ((*p2)==0) {ca_zerodiv();};
4257
- {
4270
+ if ((*p2)==-1) { (*p3) = (int32_t) (0 - (uint64_t) (*p1)); }
4271
+ else {
4258
4272
  int32_t _q = (*p1) / (*p2);
4259
4273
  if ( (*p1) % (*p2) != 0 && (((*p1) < 0) != ((*p2) < 0)) ) { _q -= 1; }
4260
4274
  (*p3) = _q;
@@ -4275,7 +4289,8 @@ ca_binop_div_int32_t (ca_size_t n, boolean8_t *m,
4275
4289
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
4276
4290
  {
4277
4291
  if ((*p2)==0) {ca_zerodiv();};
4278
- {
4292
+ if ((*p2)==-1) { (*p3) = (int32_t) (0 - (uint64_t) (*p1)); }
4293
+ else {
4279
4294
  int32_t _q = (*p1) / (*p2);
4280
4295
  if ( (*p1) % (*p2) != 0 && (((*p1) < 0) != ((*p2) < 0)) ) { _q -= 1; }
4281
4296
  (*p3) = _q;
@@ -4288,7 +4303,8 @@ ca_binop_div_int32_t (ca_size_t n, boolean8_t *m,
4288
4303
  for (k=0; k<n; k++) {
4289
4304
  {
4290
4305
  if ((*p2)==0) {ca_zerodiv();};
4291
- {
4306
+ if ((*p2)==-1) { (*p3) = (int32_t) (0 - (uint64_t) (*p1)); }
4307
+ else {
4292
4308
  int32_t _q = (*p1) / (*p2);
4293
4309
  if ( (*p1) % (*p2) != 0 && (((*p1) < 0) != ((*p2) < 0)) ) { _q -= 1; }
4294
4310
  (*p3) = _q;
@@ -4365,7 +4381,8 @@ ca_binop_div_int64_t (ca_size_t n, boolean8_t *m,
4365
4381
  p3 = q3 + k*i3;
4366
4382
  {
4367
4383
  if ((*p2)==0) {ca_zerodiv();};
4368
- {
4384
+ if ((*p2)==-1) { (*p3) = (int64_t) (0 - (uint64_t) (*p1)); }
4385
+ else {
4369
4386
  int64_t _q = (*p1) / (*p2);
4370
4387
  if ( (*p1) % (*p2) != 0 && (((*p1) < 0) != ((*p2) < 0)) ) { _q -= 1; }
4371
4388
  (*p3) = _q;
@@ -4386,7 +4403,8 @@ ca_binop_div_int64_t (ca_size_t n, boolean8_t *m,
4386
4403
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
4387
4404
  {
4388
4405
  if ((*p2)==0) {ca_zerodiv();};
4389
- {
4406
+ if ((*p2)==-1) { (*p3) = (int64_t) (0 - (uint64_t) (*p1)); }
4407
+ else {
4390
4408
  int64_t _q = (*p1) / (*p2);
4391
4409
  if ( (*p1) % (*p2) != 0 && (((*p1) < 0) != ((*p2) < 0)) ) { _q -= 1; }
4392
4410
  (*p3) = _q;
@@ -4399,7 +4417,8 @@ ca_binop_div_int64_t (ca_size_t n, boolean8_t *m,
4399
4417
  for (k=0; k<n; k++) {
4400
4418
  {
4401
4419
  if ((*p2)==0) {ca_zerodiv();};
4402
- {
4420
+ if ((*p2)==-1) { (*p3) = (int64_t) (0 - (uint64_t) (*p1)); }
4421
+ else {
4403
4422
  int64_t _q = (*p1) / (*p2);
4404
4423
  if ( (*p1) % (*p2) != 0 && (((*p1) < 0) != ((*p2) < 0)) ) { _q -= 1; }
4405
4424
  (*p3) = _q;
@@ -4812,7 +4831,15 @@ ca_binop_rcp_mul_int8_t (ca_size_t n, boolean8_t *m,
4812
4831
  p1 = q1 + k*i1;
4813
4832
  p2 = q2 + k*i2;
4814
4833
  p3 = q3 + k*i3;
4815
- { if ((*p1)==0) {ca_zerodiv();}; (*p3) = (*p2) / (*p1); }
4834
+ {
4835
+ if ((*p1)==0) {ca_zerodiv();};
4836
+ if ((*p1)==-1) { (*p3) = (int8_t) (0 - (uint64_t) (*p2)); }
4837
+ else {
4838
+ int8_t _q = (*p2) / (*p1);
4839
+ if ( (*p2) % (*p1) != 0 && (((*p2) < 0) != ((*p1) < 0)) ) { _q -= 1; }
4840
+ (*p3) = _q;
4841
+ }
4842
+ }
4816
4843
  }
4817
4844
  }
4818
4845
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -4826,13 +4853,29 @@ ca_binop_rcp_mul_int8_t (ca_size_t n, boolean8_t *m,
4826
4853
  #pragma omp simd
4827
4854
  for (k=0; k<n; k++) {
4828
4855
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
4829
- { if ((*p1)==0) {ca_zerodiv();}; (*p3) = (*p2) / (*p1); }
4856
+ {
4857
+ if ((*p1)==0) {ca_zerodiv();};
4858
+ if ((*p1)==-1) { (*p3) = (int8_t) (0 - (uint64_t) (*p2)); }
4859
+ else {
4860
+ int8_t _q = (*p2) / (*p1);
4861
+ if ( (*p2) % (*p1) != 0 && (((*p2) < 0) != ((*p1) < 0)) ) { _q -= 1; }
4862
+ (*p3) = _q;
4863
+ }
4864
+ }
4830
4865
  }
4831
4866
  } else {
4832
4867
  /* strided branch: numo-shape `p += s` increment form. */
4833
4868
  int8_t *p1 = q1, *p2 = q2, *p3 = q3;
4834
4869
  for (k=0; k<n; k++) {
4835
- { if ((*p1)==0) {ca_zerodiv();}; (*p3) = (*p2) / (*p1); }
4870
+ {
4871
+ if ((*p1)==0) {ca_zerodiv();};
4872
+ if ((*p1)==-1) { (*p3) = (int8_t) (0 - (uint64_t) (*p2)); }
4873
+ else {
4874
+ int8_t _q = (*p2) / (*p1);
4875
+ if ( (*p2) % (*p1) != 0 && (((*p2) < 0) != ((*p1) < 0)) ) { _q -= 1; }
4876
+ (*p3) = _q;
4877
+ }
4878
+ }
4836
4879
  p1 += i1; p2 += i2; p3 += i3;
4837
4880
  }
4838
4881
  }
@@ -4902,7 +4945,15 @@ ca_binop_rcp_mul_int16_t (ca_size_t n, boolean8_t *m,
4902
4945
  p1 = q1 + k*i1;
4903
4946
  p2 = q2 + k*i2;
4904
4947
  p3 = q3 + k*i3;
4905
- { if ((*p1)==0) {ca_zerodiv();}; (*p3) = (*p2) / (*p1); }
4948
+ {
4949
+ if ((*p1)==0) {ca_zerodiv();};
4950
+ if ((*p1)==-1) { (*p3) = (int16_t) (0 - (uint64_t) (*p2)); }
4951
+ else {
4952
+ int16_t _q = (*p2) / (*p1);
4953
+ if ( (*p2) % (*p1) != 0 && (((*p2) < 0) != ((*p1) < 0)) ) { _q -= 1; }
4954
+ (*p3) = _q;
4955
+ }
4956
+ }
4906
4957
  }
4907
4958
  }
4908
4959
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -4916,13 +4967,29 @@ ca_binop_rcp_mul_int16_t (ca_size_t n, boolean8_t *m,
4916
4967
  #pragma omp simd
4917
4968
  for (k=0; k<n; k++) {
4918
4969
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
4919
- { if ((*p1)==0) {ca_zerodiv();}; (*p3) = (*p2) / (*p1); }
4970
+ {
4971
+ if ((*p1)==0) {ca_zerodiv();};
4972
+ if ((*p1)==-1) { (*p3) = (int16_t) (0 - (uint64_t) (*p2)); }
4973
+ else {
4974
+ int16_t _q = (*p2) / (*p1);
4975
+ if ( (*p2) % (*p1) != 0 && (((*p2) < 0) != ((*p1) < 0)) ) { _q -= 1; }
4976
+ (*p3) = _q;
4977
+ }
4978
+ }
4920
4979
  }
4921
4980
  } else {
4922
4981
  /* strided branch: numo-shape `p += s` increment form. */
4923
4982
  int16_t *p1 = q1, *p2 = q2, *p3 = q3;
4924
4983
  for (k=0; k<n; k++) {
4925
- { if ((*p1)==0) {ca_zerodiv();}; (*p3) = (*p2) / (*p1); }
4984
+ {
4985
+ if ((*p1)==0) {ca_zerodiv();};
4986
+ if ((*p1)==-1) { (*p3) = (int16_t) (0 - (uint64_t) (*p2)); }
4987
+ else {
4988
+ int16_t _q = (*p2) / (*p1);
4989
+ if ( (*p2) % (*p1) != 0 && (((*p2) < 0) != ((*p1) < 0)) ) { _q -= 1; }
4990
+ (*p3) = _q;
4991
+ }
4992
+ }
4926
4993
  p1 += i1; p2 += i2; p3 += i3;
4927
4994
  }
4928
4995
  }
@@ -4992,7 +5059,15 @@ ca_binop_rcp_mul_int32_t (ca_size_t n, boolean8_t *m,
4992
5059
  p1 = q1 + k*i1;
4993
5060
  p2 = q2 + k*i2;
4994
5061
  p3 = q3 + k*i3;
4995
- { if ((*p1)==0) {ca_zerodiv();}; (*p3) = (*p2) / (*p1); }
5062
+ {
5063
+ if ((*p1)==0) {ca_zerodiv();};
5064
+ if ((*p1)==-1) { (*p3) = (int32_t) (0 - (uint64_t) (*p2)); }
5065
+ else {
5066
+ int32_t _q = (*p2) / (*p1);
5067
+ if ( (*p2) % (*p1) != 0 && (((*p2) < 0) != ((*p1) < 0)) ) { _q -= 1; }
5068
+ (*p3) = _q;
5069
+ }
5070
+ }
4996
5071
  }
4997
5072
  }
4998
5073
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -5006,13 +5081,29 @@ ca_binop_rcp_mul_int32_t (ca_size_t n, boolean8_t *m,
5006
5081
  #pragma omp simd
5007
5082
  for (k=0; k<n; k++) {
5008
5083
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
5009
- { if ((*p1)==0) {ca_zerodiv();}; (*p3) = (*p2) / (*p1); }
5084
+ {
5085
+ if ((*p1)==0) {ca_zerodiv();};
5086
+ if ((*p1)==-1) { (*p3) = (int32_t) (0 - (uint64_t) (*p2)); }
5087
+ else {
5088
+ int32_t _q = (*p2) / (*p1);
5089
+ if ( (*p2) % (*p1) != 0 && (((*p2) < 0) != ((*p1) < 0)) ) { _q -= 1; }
5090
+ (*p3) = _q;
5091
+ }
5092
+ }
5010
5093
  }
5011
5094
  } else {
5012
5095
  /* strided branch: numo-shape `p += s` increment form. */
5013
5096
  int32_t *p1 = q1, *p2 = q2, *p3 = q3;
5014
5097
  for (k=0; k<n; k++) {
5015
- { if ((*p1)==0) {ca_zerodiv();}; (*p3) = (*p2) / (*p1); }
5098
+ {
5099
+ if ((*p1)==0) {ca_zerodiv();};
5100
+ if ((*p1)==-1) { (*p3) = (int32_t) (0 - (uint64_t) (*p2)); }
5101
+ else {
5102
+ int32_t _q = (*p2) / (*p1);
5103
+ if ( (*p2) % (*p1) != 0 && (((*p2) < 0) != ((*p1) < 0)) ) { _q -= 1; }
5104
+ (*p3) = _q;
5105
+ }
5106
+ }
5016
5107
  p1 += i1; p2 += i2; p3 += i3;
5017
5108
  }
5018
5109
  }
@@ -5082,7 +5173,15 @@ ca_binop_rcp_mul_int64_t (ca_size_t n, boolean8_t *m,
5082
5173
  p1 = q1 + k*i1;
5083
5174
  p2 = q2 + k*i2;
5084
5175
  p3 = q3 + k*i3;
5085
- { if ((*p1)==0) {ca_zerodiv();}; (*p3) = (*p2) / (*p1); }
5176
+ {
5177
+ if ((*p1)==0) {ca_zerodiv();};
5178
+ if ((*p1)==-1) { (*p3) = (int64_t) (0 - (uint64_t) (*p2)); }
5179
+ else {
5180
+ int64_t _q = (*p2) / (*p1);
5181
+ if ( (*p2) % (*p1) != 0 && (((*p2) < 0) != ((*p1) < 0)) ) { _q -= 1; }
5182
+ (*p3) = _q;
5183
+ }
5184
+ }
5086
5185
  }
5087
5186
  }
5088
5187
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -5096,13 +5195,29 @@ ca_binop_rcp_mul_int64_t (ca_size_t n, boolean8_t *m,
5096
5195
  #pragma omp simd
5097
5196
  for (k=0; k<n; k++) {
5098
5197
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
5099
- { if ((*p1)==0) {ca_zerodiv();}; (*p3) = (*p2) / (*p1); }
5198
+ {
5199
+ if ((*p1)==0) {ca_zerodiv();};
5200
+ if ((*p1)==-1) { (*p3) = (int64_t) (0 - (uint64_t) (*p2)); }
5201
+ else {
5202
+ int64_t _q = (*p2) / (*p1);
5203
+ if ( (*p2) % (*p1) != 0 && (((*p2) < 0) != ((*p1) < 0)) ) { _q -= 1; }
5204
+ (*p3) = _q;
5205
+ }
5206
+ }
5100
5207
  }
5101
5208
  } else {
5102
5209
  /* strided branch: numo-shape `p += s` increment form. */
5103
5210
  int64_t *p1 = q1, *p2 = q2, *p3 = q3;
5104
5211
  for (k=0; k<n; k++) {
5105
- { if ((*p1)==0) {ca_zerodiv();}; (*p3) = (*p2) / (*p1); }
5212
+ {
5213
+ if ((*p1)==0) {ca_zerodiv();};
5214
+ if ((*p1)==-1) { (*p3) = (int64_t) (0 - (uint64_t) (*p2)); }
5215
+ else {
5216
+ int64_t _q = (*p2) / (*p1);
5217
+ if ( (*p2) % (*p1) != 0 && (((*p2) < 0) != ((*p1) < 0)) ) { _q -= 1; }
5218
+ (*p3) = _q;
5219
+ }
5220
+ }
5106
5221
  p1 += i1; p2 += i2; p3 += i3;
5107
5222
  }
5108
5223
  }
@@ -5433,7 +5548,8 @@ ca_binop_mod_int8_t (ca_size_t n, boolean8_t *m,
5433
5548
  p3 = q3 + k*i3;
5434
5549
  {
5435
5550
  if ((*p2)==0) {ca_zerodiv();};
5436
- {
5551
+ if ((*p2)==-1) { (*p3) = 0; }
5552
+ else {
5437
5553
  int8_t _r = (*p1) % (*p2);
5438
5554
  if ( _r != 0 && ((_r < 0) != ((*p2) < 0)) ) { _r += (*p2); }
5439
5555
  (*p3) = _r;
@@ -5454,7 +5570,8 @@ ca_binop_mod_int8_t (ca_size_t n, boolean8_t *m,
5454
5570
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
5455
5571
  {
5456
5572
  if ((*p2)==0) {ca_zerodiv();};
5457
- {
5573
+ if ((*p2)==-1) { (*p3) = 0; }
5574
+ else {
5458
5575
  int8_t _r = (*p1) % (*p2);
5459
5576
  if ( _r != 0 && ((_r < 0) != ((*p2) < 0)) ) { _r += (*p2); }
5460
5577
  (*p3) = _r;
@@ -5467,7 +5584,8 @@ ca_binop_mod_int8_t (ca_size_t n, boolean8_t *m,
5467
5584
  for (k=0; k<n; k++) {
5468
5585
  {
5469
5586
  if ((*p2)==0) {ca_zerodiv();};
5470
- {
5587
+ if ((*p2)==-1) { (*p3) = 0; }
5588
+ else {
5471
5589
  int8_t _r = (*p1) % (*p2);
5472
5590
  if ( _r != 0 && ((_r < 0) != ((*p2) < 0)) ) { _r += (*p2); }
5473
5591
  (*p3) = _r;
@@ -5544,7 +5662,8 @@ ca_binop_mod_int16_t (ca_size_t n, boolean8_t *m,
5544
5662
  p3 = q3 + k*i3;
5545
5663
  {
5546
5664
  if ((*p2)==0) {ca_zerodiv();};
5547
- {
5665
+ if ((*p2)==-1) { (*p3) = 0; }
5666
+ else {
5548
5667
  int16_t _r = (*p1) % (*p2);
5549
5668
  if ( _r != 0 && ((_r < 0) != ((*p2) < 0)) ) { _r += (*p2); }
5550
5669
  (*p3) = _r;
@@ -5565,7 +5684,8 @@ ca_binop_mod_int16_t (ca_size_t n, boolean8_t *m,
5565
5684
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
5566
5685
  {
5567
5686
  if ((*p2)==0) {ca_zerodiv();};
5568
- {
5687
+ if ((*p2)==-1) { (*p3) = 0; }
5688
+ else {
5569
5689
  int16_t _r = (*p1) % (*p2);
5570
5690
  if ( _r != 0 && ((_r < 0) != ((*p2) < 0)) ) { _r += (*p2); }
5571
5691
  (*p3) = _r;
@@ -5578,7 +5698,8 @@ ca_binop_mod_int16_t (ca_size_t n, boolean8_t *m,
5578
5698
  for (k=0; k<n; k++) {
5579
5699
  {
5580
5700
  if ((*p2)==0) {ca_zerodiv();};
5581
- {
5701
+ if ((*p2)==-1) { (*p3) = 0; }
5702
+ else {
5582
5703
  int16_t _r = (*p1) % (*p2);
5583
5704
  if ( _r != 0 && ((_r < 0) != ((*p2) < 0)) ) { _r += (*p2); }
5584
5705
  (*p3) = _r;
@@ -5655,7 +5776,8 @@ ca_binop_mod_int32_t (ca_size_t n, boolean8_t *m,
5655
5776
  p3 = q3 + k*i3;
5656
5777
  {
5657
5778
  if ((*p2)==0) {ca_zerodiv();};
5658
- {
5779
+ if ((*p2)==-1) { (*p3) = 0; }
5780
+ else {
5659
5781
  int32_t _r = (*p1) % (*p2);
5660
5782
  if ( _r != 0 && ((_r < 0) != ((*p2) < 0)) ) { _r += (*p2); }
5661
5783
  (*p3) = _r;
@@ -5676,7 +5798,8 @@ ca_binop_mod_int32_t (ca_size_t n, boolean8_t *m,
5676
5798
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
5677
5799
  {
5678
5800
  if ((*p2)==0) {ca_zerodiv();};
5679
- {
5801
+ if ((*p2)==-1) { (*p3) = 0; }
5802
+ else {
5680
5803
  int32_t _r = (*p1) % (*p2);
5681
5804
  if ( _r != 0 && ((_r < 0) != ((*p2) < 0)) ) { _r += (*p2); }
5682
5805
  (*p3) = _r;
@@ -5689,7 +5812,8 @@ ca_binop_mod_int32_t (ca_size_t n, boolean8_t *m,
5689
5812
  for (k=0; k<n; k++) {
5690
5813
  {
5691
5814
  if ((*p2)==0) {ca_zerodiv();};
5692
- {
5815
+ if ((*p2)==-1) { (*p3) = 0; }
5816
+ else {
5693
5817
  int32_t _r = (*p1) % (*p2);
5694
5818
  if ( _r != 0 && ((_r < 0) != ((*p2) < 0)) ) { _r += (*p2); }
5695
5819
  (*p3) = _r;
@@ -5766,7 +5890,8 @@ ca_binop_mod_int64_t (ca_size_t n, boolean8_t *m,
5766
5890
  p3 = q3 + k*i3;
5767
5891
  {
5768
5892
  if ((*p2)==0) {ca_zerodiv();};
5769
- {
5893
+ if ((*p2)==-1) { (*p3) = 0; }
5894
+ else {
5770
5895
  int64_t _r = (*p1) % (*p2);
5771
5896
  if ( _r != 0 && ((_r < 0) != ((*p2) < 0)) ) { _r += (*p2); }
5772
5897
  (*p3) = _r;
@@ -5787,7 +5912,8 @@ ca_binop_mod_int64_t (ca_size_t n, boolean8_t *m,
5787
5912
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
5788
5913
  {
5789
5914
  if ((*p2)==0) {ca_zerodiv();};
5790
- {
5915
+ if ((*p2)==-1) { (*p3) = 0; }
5916
+ else {
5791
5917
  int64_t _r = (*p1) % (*p2);
5792
5918
  if ( _r != 0 && ((_r < 0) != ((*p2) < 0)) ) { _r += (*p2); }
5793
5919
  (*p3) = _r;
@@ -5800,7 +5926,8 @@ ca_binop_mod_int64_t (ca_size_t n, boolean8_t *m,
5800
5926
  for (k=0; k<n; k++) {
5801
5927
  {
5802
5928
  if ((*p2)==0) {ca_zerodiv();};
5803
- {
5929
+ if ((*p2)==-1) { (*p3) = 0; }
5930
+ else {
5804
5931
  int64_t _r = (*p1) % (*p2);
5805
5932
  if ( _r != 0 && ((_r < 0) != ((*p2) < 0)) ) { _r += (*p2); }
5806
5933
  (*p3) = _r;
@@ -6098,7 +6225,7 @@ ca_binop_fmod_int8_t (ca_size_t n, boolean8_t *m,
6098
6225
  p1 = q1 + k*i1;
6099
6226
  p2 = q2 + k*i2;
6100
6227
  p3 = q3 + k*i3;
6101
- { if ((*p2)==0) {ca_zerodiv();}; (*p3) = (*p1) % (*p2); }
6228
+ { if ((*p2)==0) {ca_zerodiv();}; (*p3) = ((*p2)==-1) ? 0 : (*p1) % (*p2); }
6102
6229
  }
6103
6230
  }
6104
6231
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -6112,13 +6239,13 @@ ca_binop_fmod_int8_t (ca_size_t n, boolean8_t *m,
6112
6239
  #pragma omp simd
6113
6240
  for (k=0; k<n; k++) {
6114
6241
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
6115
- { if ((*p2)==0) {ca_zerodiv();}; (*p3) = (*p1) % (*p2); }
6242
+ { if ((*p2)==0) {ca_zerodiv();}; (*p3) = ((*p2)==-1) ? 0 : (*p1) % (*p2); }
6116
6243
  }
6117
6244
  } else {
6118
6245
  /* strided branch: numo-shape `p += s` increment form. */
6119
6246
  int8_t *p1 = q1, *p2 = q2, *p3 = q3;
6120
6247
  for (k=0; k<n; k++) {
6121
- { if ((*p2)==0) {ca_zerodiv();}; (*p3) = (*p1) % (*p2); }
6248
+ { if ((*p2)==0) {ca_zerodiv();}; (*p3) = ((*p2)==-1) ? 0 : (*p1) % (*p2); }
6122
6249
  p1 += i1; p2 += i2; p3 += i3;
6123
6250
  }
6124
6251
  }
@@ -6188,7 +6315,7 @@ ca_binop_fmod_int16_t (ca_size_t n, boolean8_t *m,
6188
6315
  p1 = q1 + k*i1;
6189
6316
  p2 = q2 + k*i2;
6190
6317
  p3 = q3 + k*i3;
6191
- { if ((*p2)==0) {ca_zerodiv();}; (*p3) = (*p1) % (*p2); }
6318
+ { if ((*p2)==0) {ca_zerodiv();}; (*p3) = ((*p2)==-1) ? 0 : (*p1) % (*p2); }
6192
6319
  }
6193
6320
  }
6194
6321
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -6202,13 +6329,13 @@ ca_binop_fmod_int16_t (ca_size_t n, boolean8_t *m,
6202
6329
  #pragma omp simd
6203
6330
  for (k=0; k<n; k++) {
6204
6331
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
6205
- { if ((*p2)==0) {ca_zerodiv();}; (*p3) = (*p1) % (*p2); }
6332
+ { if ((*p2)==0) {ca_zerodiv();}; (*p3) = ((*p2)==-1) ? 0 : (*p1) % (*p2); }
6206
6333
  }
6207
6334
  } else {
6208
6335
  /* strided branch: numo-shape `p += s` increment form. */
6209
6336
  int16_t *p1 = q1, *p2 = q2, *p3 = q3;
6210
6337
  for (k=0; k<n; k++) {
6211
- { if ((*p2)==0) {ca_zerodiv();}; (*p3) = (*p1) % (*p2); }
6338
+ { if ((*p2)==0) {ca_zerodiv();}; (*p3) = ((*p2)==-1) ? 0 : (*p1) % (*p2); }
6212
6339
  p1 += i1; p2 += i2; p3 += i3;
6213
6340
  }
6214
6341
  }
@@ -6278,7 +6405,7 @@ ca_binop_fmod_int32_t (ca_size_t n, boolean8_t *m,
6278
6405
  p1 = q1 + k*i1;
6279
6406
  p2 = q2 + k*i2;
6280
6407
  p3 = q3 + k*i3;
6281
- { if ((*p2)==0) {ca_zerodiv();}; (*p3) = (*p1) % (*p2); }
6408
+ { if ((*p2)==0) {ca_zerodiv();}; (*p3) = ((*p2)==-1) ? 0 : (*p1) % (*p2); }
6282
6409
  }
6283
6410
  }
6284
6411
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -6292,13 +6419,13 @@ ca_binop_fmod_int32_t (ca_size_t n, boolean8_t *m,
6292
6419
  #pragma omp simd
6293
6420
  for (k=0; k<n; k++) {
6294
6421
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
6295
- { if ((*p2)==0) {ca_zerodiv();}; (*p3) = (*p1) % (*p2); }
6422
+ { if ((*p2)==0) {ca_zerodiv();}; (*p3) = ((*p2)==-1) ? 0 : (*p1) % (*p2); }
6296
6423
  }
6297
6424
  } else {
6298
6425
  /* strided branch: numo-shape `p += s` increment form. */
6299
6426
  int32_t *p1 = q1, *p2 = q2, *p3 = q3;
6300
6427
  for (k=0; k<n; k++) {
6301
- { if ((*p2)==0) {ca_zerodiv();}; (*p3) = (*p1) % (*p2); }
6428
+ { if ((*p2)==0) {ca_zerodiv();}; (*p3) = ((*p2)==-1) ? 0 : (*p1) % (*p2); }
6302
6429
  p1 += i1; p2 += i2; p3 += i3;
6303
6430
  }
6304
6431
  }
@@ -6368,7 +6495,7 @@ ca_binop_fmod_int64_t (ca_size_t n, boolean8_t *m,
6368
6495
  p1 = q1 + k*i1;
6369
6496
  p2 = q2 + k*i2;
6370
6497
  p3 = q3 + k*i3;
6371
- { if ((*p2)==0) {ca_zerodiv();}; (*p3) = (*p1) % (*p2); }
6498
+ { if ((*p2)==0) {ca_zerodiv();}; (*p3) = ((*p2)==-1) ? 0 : (*p1) % (*p2); }
6372
6499
  }
6373
6500
  }
6374
6501
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -6382,13 +6509,13 @@ ca_binop_fmod_int64_t (ca_size_t n, boolean8_t *m,
6382
6509
  #pragma omp simd
6383
6510
  for (k=0; k<n; k++) {
6384
6511
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
6385
- { if ((*p2)==0) {ca_zerodiv();}; (*p3) = (*p1) % (*p2); }
6512
+ { if ((*p2)==0) {ca_zerodiv();}; (*p3) = ((*p2)==-1) ? 0 : (*p1) % (*p2); }
6386
6513
  }
6387
6514
  } else {
6388
6515
  /* strided branch: numo-shape `p += s` increment form. */
6389
6516
  int64_t *p1 = q1, *p2 = q2, *p3 = q3;
6390
6517
  for (k=0; k<n; k++) {
6391
- { if ((*p2)==0) {ca_zerodiv();}; (*p3) = (*p1) % (*p2); }
6518
+ { if ((*p2)==0) {ca_zerodiv();}; (*p3) = ((*p2)==-1) ? 0 : (*p1) % (*p2); }
6392
6519
  p1 += i1; p2 += i2; p3 += i3;
6393
6520
  }
6394
6521
  }
@@ -8079,7 +8206,17 @@ ca_binop_bit_lshift_int8_t (ca_size_t n, boolean8_t *m,
8079
8206
  p1 = q1 + k*i1;
8080
8207
  p2 = q2 + k*i2;
8081
8208
  p3 = q3 + k*i3;
8082
- { (*p3) = (*p1) << (*p2); }
8209
+ {
8210
+ {
8211
+ int64_t _x = (int64_t) (*p1), _n = (int64_t) (*p2), _r;
8212
+ const int64_t _w = (int64_t) (8 * sizeof(int8_t));
8213
+ if ( _n >= _w ) _r = 0;
8214
+ else if ( _n <= -_w ) _r = _x < 0 ? -1 : 0;
8215
+ else if ( _n < 0 ) _r = _x >> -_n;
8216
+ else _r = (int64_t) ((uint64_t) _x << _n);
8217
+ (*p3) = (int8_t) _r;
8218
+ }
8219
+ }
8083
8220
  }
8084
8221
  }
8085
8222
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -8093,13 +8230,33 @@ ca_binop_bit_lshift_int8_t (ca_size_t n, boolean8_t *m,
8093
8230
  #pragma omp simd
8094
8231
  for (k=0; k<n; k++) {
8095
8232
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
8096
- { (*p3) = (*p1) << (*p2); }
8233
+ {
8234
+ {
8235
+ int64_t _x = (int64_t) (*p1), _n = (int64_t) (*p2), _r;
8236
+ const int64_t _w = (int64_t) (8 * sizeof(int8_t));
8237
+ if ( _n >= _w ) _r = 0;
8238
+ else if ( _n <= -_w ) _r = _x < 0 ? -1 : 0;
8239
+ else if ( _n < 0 ) _r = _x >> -_n;
8240
+ else _r = (int64_t) ((uint64_t) _x << _n);
8241
+ (*p3) = (int8_t) _r;
8242
+ }
8243
+ }
8097
8244
  }
8098
8245
  } else {
8099
8246
  /* strided branch: numo-shape `p += s` increment form. */
8100
8247
  int8_t *p1 = q1, *p2 = q2, *p3 = q3;
8101
8248
  for (k=0; k<n; k++) {
8102
- { (*p3) = (*p1) << (*p2); }
8249
+ {
8250
+ {
8251
+ int64_t _x = (int64_t) (*p1), _n = (int64_t) (*p2), _r;
8252
+ const int64_t _w = (int64_t) (8 * sizeof(int8_t));
8253
+ if ( _n >= _w ) _r = 0;
8254
+ else if ( _n <= -_w ) _r = _x < 0 ? -1 : 0;
8255
+ else if ( _n < 0 ) _r = _x >> -_n;
8256
+ else _r = (int64_t) ((uint64_t) _x << _n);
8257
+ (*p3) = (int8_t) _r;
8258
+ }
8259
+ }
8103
8260
  p1 += i1; p2 += i2; p3 += i3;
8104
8261
  }
8105
8262
  }
@@ -8124,7 +8281,7 @@ ca_binop_bit_lshift_uint8_t (ca_size_t n, boolean8_t *m,
8124
8281
  p1 = q1 + k*i1;
8125
8282
  p2 = q2 + k*i2;
8126
8283
  p3 = q3 + k*i3;
8127
- { (*p3) = (*p1) << (*p2); }
8284
+ { (*p3) = ((uint64_t) (*p2) >= 8 * sizeof(uint8_t)) ? 0 : (uint8_t) ((uint64_t) (*p1) << (*p2)); }
8128
8285
  }
8129
8286
  }
8130
8287
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -8138,13 +8295,13 @@ ca_binop_bit_lshift_uint8_t (ca_size_t n, boolean8_t *m,
8138
8295
  #pragma omp simd
8139
8296
  for (k=0; k<n; k++) {
8140
8297
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
8141
- { (*p3) = (*p1) << (*p2); }
8298
+ { (*p3) = ((uint64_t) (*p2) >= 8 * sizeof(uint8_t)) ? 0 : (uint8_t) ((uint64_t) (*p1) << (*p2)); }
8142
8299
  }
8143
8300
  } else {
8144
8301
  /* strided branch: numo-shape `p += s` increment form. */
8145
8302
  uint8_t *p1 = q1, *p2 = q2, *p3 = q3;
8146
8303
  for (k=0; k<n; k++) {
8147
- { (*p3) = (*p1) << (*p2); }
8304
+ { (*p3) = ((uint64_t) (*p2) >= 8 * sizeof(uint8_t)) ? 0 : (uint8_t) ((uint64_t) (*p1) << (*p2)); }
8148
8305
  p1 += i1; p2 += i2; p3 += i3;
8149
8306
  }
8150
8307
  }
@@ -8169,7 +8326,17 @@ ca_binop_bit_lshift_int16_t (ca_size_t n, boolean8_t *m,
8169
8326
  p1 = q1 + k*i1;
8170
8327
  p2 = q2 + k*i2;
8171
8328
  p3 = q3 + k*i3;
8172
- { (*p3) = (*p1) << (*p2); }
8329
+ {
8330
+ {
8331
+ int64_t _x = (int64_t) (*p1), _n = (int64_t) (*p2), _r;
8332
+ const int64_t _w = (int64_t) (8 * sizeof(int16_t));
8333
+ if ( _n >= _w ) _r = 0;
8334
+ else if ( _n <= -_w ) _r = _x < 0 ? -1 : 0;
8335
+ else if ( _n < 0 ) _r = _x >> -_n;
8336
+ else _r = (int64_t) ((uint64_t) _x << _n);
8337
+ (*p3) = (int16_t) _r;
8338
+ }
8339
+ }
8173
8340
  }
8174
8341
  }
8175
8342
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -8183,13 +8350,33 @@ ca_binop_bit_lshift_int16_t (ca_size_t n, boolean8_t *m,
8183
8350
  #pragma omp simd
8184
8351
  for (k=0; k<n; k++) {
8185
8352
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
8186
- { (*p3) = (*p1) << (*p2); }
8353
+ {
8354
+ {
8355
+ int64_t _x = (int64_t) (*p1), _n = (int64_t) (*p2), _r;
8356
+ const int64_t _w = (int64_t) (8 * sizeof(int16_t));
8357
+ if ( _n >= _w ) _r = 0;
8358
+ else if ( _n <= -_w ) _r = _x < 0 ? -1 : 0;
8359
+ else if ( _n < 0 ) _r = _x >> -_n;
8360
+ else _r = (int64_t) ((uint64_t) _x << _n);
8361
+ (*p3) = (int16_t) _r;
8362
+ }
8363
+ }
8187
8364
  }
8188
8365
  } else {
8189
8366
  /* strided branch: numo-shape `p += s` increment form. */
8190
8367
  int16_t *p1 = q1, *p2 = q2, *p3 = q3;
8191
8368
  for (k=0; k<n; k++) {
8192
- { (*p3) = (*p1) << (*p2); }
8369
+ {
8370
+ {
8371
+ int64_t _x = (int64_t) (*p1), _n = (int64_t) (*p2), _r;
8372
+ const int64_t _w = (int64_t) (8 * sizeof(int16_t));
8373
+ if ( _n >= _w ) _r = 0;
8374
+ else if ( _n <= -_w ) _r = _x < 0 ? -1 : 0;
8375
+ else if ( _n < 0 ) _r = _x >> -_n;
8376
+ else _r = (int64_t) ((uint64_t) _x << _n);
8377
+ (*p3) = (int16_t) _r;
8378
+ }
8379
+ }
8193
8380
  p1 += i1; p2 += i2; p3 += i3;
8194
8381
  }
8195
8382
  }
@@ -8214,7 +8401,7 @@ ca_binop_bit_lshift_uint16_t (ca_size_t n, boolean8_t *m,
8214
8401
  p1 = q1 + k*i1;
8215
8402
  p2 = q2 + k*i2;
8216
8403
  p3 = q3 + k*i3;
8217
- { (*p3) = (*p1) << (*p2); }
8404
+ { (*p3) = ((uint64_t) (*p2) >= 8 * sizeof(uint16_t)) ? 0 : (uint16_t) ((uint64_t) (*p1) << (*p2)); }
8218
8405
  }
8219
8406
  }
8220
8407
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -8228,13 +8415,13 @@ ca_binop_bit_lshift_uint16_t (ca_size_t n, boolean8_t *m,
8228
8415
  #pragma omp simd
8229
8416
  for (k=0; k<n; k++) {
8230
8417
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
8231
- { (*p3) = (*p1) << (*p2); }
8418
+ { (*p3) = ((uint64_t) (*p2) >= 8 * sizeof(uint16_t)) ? 0 : (uint16_t) ((uint64_t) (*p1) << (*p2)); }
8232
8419
  }
8233
8420
  } else {
8234
8421
  /* strided branch: numo-shape `p += s` increment form. */
8235
8422
  uint16_t *p1 = q1, *p2 = q2, *p3 = q3;
8236
8423
  for (k=0; k<n; k++) {
8237
- { (*p3) = (*p1) << (*p2); }
8424
+ { (*p3) = ((uint64_t) (*p2) >= 8 * sizeof(uint16_t)) ? 0 : (uint16_t) ((uint64_t) (*p1) << (*p2)); }
8238
8425
  p1 += i1; p2 += i2; p3 += i3;
8239
8426
  }
8240
8427
  }
@@ -8259,7 +8446,17 @@ ca_binop_bit_lshift_int32_t (ca_size_t n, boolean8_t *m,
8259
8446
  p1 = q1 + k*i1;
8260
8447
  p2 = q2 + k*i2;
8261
8448
  p3 = q3 + k*i3;
8262
- { (*p3) = (*p1) << (*p2); }
8449
+ {
8450
+ {
8451
+ int64_t _x = (int64_t) (*p1), _n = (int64_t) (*p2), _r;
8452
+ const int64_t _w = (int64_t) (8 * sizeof(int32_t));
8453
+ if ( _n >= _w ) _r = 0;
8454
+ else if ( _n <= -_w ) _r = _x < 0 ? -1 : 0;
8455
+ else if ( _n < 0 ) _r = _x >> -_n;
8456
+ else _r = (int64_t) ((uint64_t) _x << _n);
8457
+ (*p3) = (int32_t) _r;
8458
+ }
8459
+ }
8263
8460
  }
8264
8461
  }
8265
8462
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -8273,13 +8470,33 @@ ca_binop_bit_lshift_int32_t (ca_size_t n, boolean8_t *m,
8273
8470
  #pragma omp simd
8274
8471
  for (k=0; k<n; k++) {
8275
8472
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
8276
- { (*p3) = (*p1) << (*p2); }
8473
+ {
8474
+ {
8475
+ int64_t _x = (int64_t) (*p1), _n = (int64_t) (*p2), _r;
8476
+ const int64_t _w = (int64_t) (8 * sizeof(int32_t));
8477
+ if ( _n >= _w ) _r = 0;
8478
+ else if ( _n <= -_w ) _r = _x < 0 ? -1 : 0;
8479
+ else if ( _n < 0 ) _r = _x >> -_n;
8480
+ else _r = (int64_t) ((uint64_t) _x << _n);
8481
+ (*p3) = (int32_t) _r;
8482
+ }
8483
+ }
8277
8484
  }
8278
8485
  } else {
8279
8486
  /* strided branch: numo-shape `p += s` increment form. */
8280
8487
  int32_t *p1 = q1, *p2 = q2, *p3 = q3;
8281
8488
  for (k=0; k<n; k++) {
8282
- { (*p3) = (*p1) << (*p2); }
8489
+ {
8490
+ {
8491
+ int64_t _x = (int64_t) (*p1), _n = (int64_t) (*p2), _r;
8492
+ const int64_t _w = (int64_t) (8 * sizeof(int32_t));
8493
+ if ( _n >= _w ) _r = 0;
8494
+ else if ( _n <= -_w ) _r = _x < 0 ? -1 : 0;
8495
+ else if ( _n < 0 ) _r = _x >> -_n;
8496
+ else _r = (int64_t) ((uint64_t) _x << _n);
8497
+ (*p3) = (int32_t) _r;
8498
+ }
8499
+ }
8283
8500
  p1 += i1; p2 += i2; p3 += i3;
8284
8501
  }
8285
8502
  }
@@ -8304,7 +8521,7 @@ ca_binop_bit_lshift_uint32_t (ca_size_t n, boolean8_t *m,
8304
8521
  p1 = q1 + k*i1;
8305
8522
  p2 = q2 + k*i2;
8306
8523
  p3 = q3 + k*i3;
8307
- { (*p3) = (*p1) << (*p2); }
8524
+ { (*p3) = ((uint64_t) (*p2) >= 8 * sizeof(uint32_t)) ? 0 : (uint32_t) ((uint64_t) (*p1) << (*p2)); }
8308
8525
  }
8309
8526
  }
8310
8527
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -8318,13 +8535,13 @@ ca_binop_bit_lshift_uint32_t (ca_size_t n, boolean8_t *m,
8318
8535
  #pragma omp simd
8319
8536
  for (k=0; k<n; k++) {
8320
8537
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
8321
- { (*p3) = (*p1) << (*p2); }
8538
+ { (*p3) = ((uint64_t) (*p2) >= 8 * sizeof(uint32_t)) ? 0 : (uint32_t) ((uint64_t) (*p1) << (*p2)); }
8322
8539
  }
8323
8540
  } else {
8324
8541
  /* strided branch: numo-shape `p += s` increment form. */
8325
8542
  uint32_t *p1 = q1, *p2 = q2, *p3 = q3;
8326
8543
  for (k=0; k<n; k++) {
8327
- { (*p3) = (*p1) << (*p2); }
8544
+ { (*p3) = ((uint64_t) (*p2) >= 8 * sizeof(uint32_t)) ? 0 : (uint32_t) ((uint64_t) (*p1) << (*p2)); }
8328
8545
  p1 += i1; p2 += i2; p3 += i3;
8329
8546
  }
8330
8547
  }
@@ -8349,7 +8566,17 @@ ca_binop_bit_lshift_int64_t (ca_size_t n, boolean8_t *m,
8349
8566
  p1 = q1 + k*i1;
8350
8567
  p2 = q2 + k*i2;
8351
8568
  p3 = q3 + k*i3;
8352
- { (*p3) = (*p1) << (*p2); }
8569
+ {
8570
+ {
8571
+ int64_t _x = (int64_t) (*p1), _n = (int64_t) (*p2), _r;
8572
+ const int64_t _w = (int64_t) (8 * sizeof(int64_t));
8573
+ if ( _n >= _w ) _r = 0;
8574
+ else if ( _n <= -_w ) _r = _x < 0 ? -1 : 0;
8575
+ else if ( _n < 0 ) _r = _x >> -_n;
8576
+ else _r = (int64_t) ((uint64_t) _x << _n);
8577
+ (*p3) = (int64_t) _r;
8578
+ }
8579
+ }
8353
8580
  }
8354
8581
  }
8355
8582
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -8363,13 +8590,33 @@ ca_binop_bit_lshift_int64_t (ca_size_t n, boolean8_t *m,
8363
8590
  #pragma omp simd
8364
8591
  for (k=0; k<n; k++) {
8365
8592
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
8366
- { (*p3) = (*p1) << (*p2); }
8593
+ {
8594
+ {
8595
+ int64_t _x = (int64_t) (*p1), _n = (int64_t) (*p2), _r;
8596
+ const int64_t _w = (int64_t) (8 * sizeof(int64_t));
8597
+ if ( _n >= _w ) _r = 0;
8598
+ else if ( _n <= -_w ) _r = _x < 0 ? -1 : 0;
8599
+ else if ( _n < 0 ) _r = _x >> -_n;
8600
+ else _r = (int64_t) ((uint64_t) _x << _n);
8601
+ (*p3) = (int64_t) _r;
8602
+ }
8603
+ }
8367
8604
  }
8368
8605
  } else {
8369
8606
  /* strided branch: numo-shape `p += s` increment form. */
8370
8607
  int64_t *p1 = q1, *p2 = q2, *p3 = q3;
8371
8608
  for (k=0; k<n; k++) {
8372
- { (*p3) = (*p1) << (*p2); }
8609
+ {
8610
+ {
8611
+ int64_t _x = (int64_t) (*p1), _n = (int64_t) (*p2), _r;
8612
+ const int64_t _w = (int64_t) (8 * sizeof(int64_t));
8613
+ if ( _n >= _w ) _r = 0;
8614
+ else if ( _n <= -_w ) _r = _x < 0 ? -1 : 0;
8615
+ else if ( _n < 0 ) _r = _x >> -_n;
8616
+ else _r = (int64_t) ((uint64_t) _x << _n);
8617
+ (*p3) = (int64_t) _r;
8618
+ }
8619
+ }
8373
8620
  p1 += i1; p2 += i2; p3 += i3;
8374
8621
  }
8375
8622
  }
@@ -8394,7 +8641,7 @@ ca_binop_bit_lshift_uint64_t (ca_size_t n, boolean8_t *m,
8394
8641
  p1 = q1 + k*i1;
8395
8642
  p2 = q2 + k*i2;
8396
8643
  p3 = q3 + k*i3;
8397
- { (*p3) = (*p1) << (*p2); }
8644
+ { (*p3) = ((uint64_t) (*p2) >= 8 * sizeof(uint64_t)) ? 0 : (uint64_t) ((uint64_t) (*p1) << (*p2)); }
8398
8645
  }
8399
8646
  }
8400
8647
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -8408,13 +8655,13 @@ ca_binop_bit_lshift_uint64_t (ca_size_t n, boolean8_t *m,
8408
8655
  #pragma omp simd
8409
8656
  for (k=0; k<n; k++) {
8410
8657
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
8411
- { (*p3) = (*p1) << (*p2); }
8658
+ { (*p3) = ((uint64_t) (*p2) >= 8 * sizeof(uint64_t)) ? 0 : (uint64_t) ((uint64_t) (*p1) << (*p2)); }
8412
8659
  }
8413
8660
  } else {
8414
8661
  /* strided branch: numo-shape `p += s` increment form. */
8415
8662
  uint64_t *p1 = q1, *p2 = q2, *p3 = q3;
8416
8663
  for (k=0; k<n; k++) {
8417
- { (*p3) = (*p1) << (*p2); }
8664
+ { (*p3) = ((uint64_t) (*p2) >= 8 * sizeof(uint64_t)) ? 0 : (uint64_t) ((uint64_t) (*p1) << (*p2)); }
8418
8665
  p1 += i1; p2 += i2; p3 += i3;
8419
8666
  }
8420
8667
  }
@@ -8518,7 +8765,17 @@ ca_binop_bit_rshift_int8_t (ca_size_t n, boolean8_t *m,
8518
8765
  p1 = q1 + k*i1;
8519
8766
  p2 = q2 + k*i2;
8520
8767
  p3 = q3 + k*i3;
8521
- { (*p3) = (*p1) >> (*p2); }
8768
+ {
8769
+ {
8770
+ int64_t _x = (int64_t) (*p1), _n = (int64_t) (*p2), _r;
8771
+ const int64_t _w = (int64_t) (8 * sizeof(int8_t));
8772
+ if ( _n >= _w ) _r = _x < 0 ? -1 : 0;
8773
+ else if ( _n <= -_w ) _r = 0;
8774
+ else if ( _n < 0 ) _r = (int64_t) ((uint64_t) _x << -_n);
8775
+ else _r = _x >> _n;
8776
+ (*p3) = (int8_t) _r;
8777
+ }
8778
+ }
8522
8779
  }
8523
8780
  }
8524
8781
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -8532,13 +8789,33 @@ ca_binop_bit_rshift_int8_t (ca_size_t n, boolean8_t *m,
8532
8789
  #pragma omp simd
8533
8790
  for (k=0; k<n; k++) {
8534
8791
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
8535
- { (*p3) = (*p1) >> (*p2); }
8792
+ {
8793
+ {
8794
+ int64_t _x = (int64_t) (*p1), _n = (int64_t) (*p2), _r;
8795
+ const int64_t _w = (int64_t) (8 * sizeof(int8_t));
8796
+ if ( _n >= _w ) _r = _x < 0 ? -1 : 0;
8797
+ else if ( _n <= -_w ) _r = 0;
8798
+ else if ( _n < 0 ) _r = (int64_t) ((uint64_t) _x << -_n);
8799
+ else _r = _x >> _n;
8800
+ (*p3) = (int8_t) _r;
8801
+ }
8802
+ }
8536
8803
  }
8537
8804
  } else {
8538
8805
  /* strided branch: numo-shape `p += s` increment form. */
8539
8806
  int8_t *p1 = q1, *p2 = q2, *p3 = q3;
8540
8807
  for (k=0; k<n; k++) {
8541
- { (*p3) = (*p1) >> (*p2); }
8808
+ {
8809
+ {
8810
+ int64_t _x = (int64_t) (*p1), _n = (int64_t) (*p2), _r;
8811
+ const int64_t _w = (int64_t) (8 * sizeof(int8_t));
8812
+ if ( _n >= _w ) _r = _x < 0 ? -1 : 0;
8813
+ else if ( _n <= -_w ) _r = 0;
8814
+ else if ( _n < 0 ) _r = (int64_t) ((uint64_t) _x << -_n);
8815
+ else _r = _x >> _n;
8816
+ (*p3) = (int8_t) _r;
8817
+ }
8818
+ }
8542
8819
  p1 += i1; p2 += i2; p3 += i3;
8543
8820
  }
8544
8821
  }
@@ -8563,7 +8840,7 @@ ca_binop_bit_rshift_uint8_t (ca_size_t n, boolean8_t *m,
8563
8840
  p1 = q1 + k*i1;
8564
8841
  p2 = q2 + k*i2;
8565
8842
  p3 = q3 + k*i3;
8566
- { (*p3) = (*p1) >> (*p2); }
8843
+ { (*p3) = ((uint64_t) (*p2) >= 8 * sizeof(uint8_t)) ? 0 : (uint8_t) ((uint64_t) (*p1) >> (*p2)); }
8567
8844
  }
8568
8845
  }
8569
8846
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -8577,13 +8854,13 @@ ca_binop_bit_rshift_uint8_t (ca_size_t n, boolean8_t *m,
8577
8854
  #pragma omp simd
8578
8855
  for (k=0; k<n; k++) {
8579
8856
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
8580
- { (*p3) = (*p1) >> (*p2); }
8857
+ { (*p3) = ((uint64_t) (*p2) >= 8 * sizeof(uint8_t)) ? 0 : (uint8_t) ((uint64_t) (*p1) >> (*p2)); }
8581
8858
  }
8582
8859
  } else {
8583
8860
  /* strided branch: numo-shape `p += s` increment form. */
8584
8861
  uint8_t *p1 = q1, *p2 = q2, *p3 = q3;
8585
8862
  for (k=0; k<n; k++) {
8586
- { (*p3) = (*p1) >> (*p2); }
8863
+ { (*p3) = ((uint64_t) (*p2) >= 8 * sizeof(uint8_t)) ? 0 : (uint8_t) ((uint64_t) (*p1) >> (*p2)); }
8587
8864
  p1 += i1; p2 += i2; p3 += i3;
8588
8865
  }
8589
8866
  }
@@ -8608,7 +8885,17 @@ ca_binop_bit_rshift_int16_t (ca_size_t n, boolean8_t *m,
8608
8885
  p1 = q1 + k*i1;
8609
8886
  p2 = q2 + k*i2;
8610
8887
  p3 = q3 + k*i3;
8611
- { (*p3) = (*p1) >> (*p2); }
8888
+ {
8889
+ {
8890
+ int64_t _x = (int64_t) (*p1), _n = (int64_t) (*p2), _r;
8891
+ const int64_t _w = (int64_t) (8 * sizeof(int16_t));
8892
+ if ( _n >= _w ) _r = _x < 0 ? -1 : 0;
8893
+ else if ( _n <= -_w ) _r = 0;
8894
+ else if ( _n < 0 ) _r = (int64_t) ((uint64_t) _x << -_n);
8895
+ else _r = _x >> _n;
8896
+ (*p3) = (int16_t) _r;
8897
+ }
8898
+ }
8612
8899
  }
8613
8900
  }
8614
8901
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -8622,13 +8909,33 @@ ca_binop_bit_rshift_int16_t (ca_size_t n, boolean8_t *m,
8622
8909
  #pragma omp simd
8623
8910
  for (k=0; k<n; k++) {
8624
8911
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
8625
- { (*p3) = (*p1) >> (*p2); }
8912
+ {
8913
+ {
8914
+ int64_t _x = (int64_t) (*p1), _n = (int64_t) (*p2), _r;
8915
+ const int64_t _w = (int64_t) (8 * sizeof(int16_t));
8916
+ if ( _n >= _w ) _r = _x < 0 ? -1 : 0;
8917
+ else if ( _n <= -_w ) _r = 0;
8918
+ else if ( _n < 0 ) _r = (int64_t) ((uint64_t) _x << -_n);
8919
+ else _r = _x >> _n;
8920
+ (*p3) = (int16_t) _r;
8921
+ }
8922
+ }
8626
8923
  }
8627
8924
  } else {
8628
8925
  /* strided branch: numo-shape `p += s` increment form. */
8629
8926
  int16_t *p1 = q1, *p2 = q2, *p3 = q3;
8630
8927
  for (k=0; k<n; k++) {
8631
- { (*p3) = (*p1) >> (*p2); }
8928
+ {
8929
+ {
8930
+ int64_t _x = (int64_t) (*p1), _n = (int64_t) (*p2), _r;
8931
+ const int64_t _w = (int64_t) (8 * sizeof(int16_t));
8932
+ if ( _n >= _w ) _r = _x < 0 ? -1 : 0;
8933
+ else if ( _n <= -_w ) _r = 0;
8934
+ else if ( _n < 0 ) _r = (int64_t) ((uint64_t) _x << -_n);
8935
+ else _r = _x >> _n;
8936
+ (*p3) = (int16_t) _r;
8937
+ }
8938
+ }
8632
8939
  p1 += i1; p2 += i2; p3 += i3;
8633
8940
  }
8634
8941
  }
@@ -8653,7 +8960,7 @@ ca_binop_bit_rshift_uint16_t (ca_size_t n, boolean8_t *m,
8653
8960
  p1 = q1 + k*i1;
8654
8961
  p2 = q2 + k*i2;
8655
8962
  p3 = q3 + k*i3;
8656
- { (*p3) = (*p1) >> (*p2); }
8963
+ { (*p3) = ((uint64_t) (*p2) >= 8 * sizeof(uint16_t)) ? 0 : (uint16_t) ((uint64_t) (*p1) >> (*p2)); }
8657
8964
  }
8658
8965
  }
8659
8966
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -8667,13 +8974,13 @@ ca_binop_bit_rshift_uint16_t (ca_size_t n, boolean8_t *m,
8667
8974
  #pragma omp simd
8668
8975
  for (k=0; k<n; k++) {
8669
8976
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
8670
- { (*p3) = (*p1) >> (*p2); }
8977
+ { (*p3) = ((uint64_t) (*p2) >= 8 * sizeof(uint16_t)) ? 0 : (uint16_t) ((uint64_t) (*p1) >> (*p2)); }
8671
8978
  }
8672
8979
  } else {
8673
8980
  /* strided branch: numo-shape `p += s` increment form. */
8674
8981
  uint16_t *p1 = q1, *p2 = q2, *p3 = q3;
8675
8982
  for (k=0; k<n; k++) {
8676
- { (*p3) = (*p1) >> (*p2); }
8983
+ { (*p3) = ((uint64_t) (*p2) >= 8 * sizeof(uint16_t)) ? 0 : (uint16_t) ((uint64_t) (*p1) >> (*p2)); }
8677
8984
  p1 += i1; p2 += i2; p3 += i3;
8678
8985
  }
8679
8986
  }
@@ -8698,7 +9005,17 @@ ca_binop_bit_rshift_int32_t (ca_size_t n, boolean8_t *m,
8698
9005
  p1 = q1 + k*i1;
8699
9006
  p2 = q2 + k*i2;
8700
9007
  p3 = q3 + k*i3;
8701
- { (*p3) = (*p1) >> (*p2); }
9008
+ {
9009
+ {
9010
+ int64_t _x = (int64_t) (*p1), _n = (int64_t) (*p2), _r;
9011
+ const int64_t _w = (int64_t) (8 * sizeof(int32_t));
9012
+ if ( _n >= _w ) _r = _x < 0 ? -1 : 0;
9013
+ else if ( _n <= -_w ) _r = 0;
9014
+ else if ( _n < 0 ) _r = (int64_t) ((uint64_t) _x << -_n);
9015
+ else _r = _x >> _n;
9016
+ (*p3) = (int32_t) _r;
9017
+ }
9018
+ }
8702
9019
  }
8703
9020
  }
8704
9021
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -8712,13 +9029,33 @@ ca_binop_bit_rshift_int32_t (ca_size_t n, boolean8_t *m,
8712
9029
  #pragma omp simd
8713
9030
  for (k=0; k<n; k++) {
8714
9031
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
8715
- { (*p3) = (*p1) >> (*p2); }
9032
+ {
9033
+ {
9034
+ int64_t _x = (int64_t) (*p1), _n = (int64_t) (*p2), _r;
9035
+ const int64_t _w = (int64_t) (8 * sizeof(int32_t));
9036
+ if ( _n >= _w ) _r = _x < 0 ? -1 : 0;
9037
+ else if ( _n <= -_w ) _r = 0;
9038
+ else if ( _n < 0 ) _r = (int64_t) ((uint64_t) _x << -_n);
9039
+ else _r = _x >> _n;
9040
+ (*p3) = (int32_t) _r;
9041
+ }
9042
+ }
8716
9043
  }
8717
9044
  } else {
8718
9045
  /* strided branch: numo-shape `p += s` increment form. */
8719
9046
  int32_t *p1 = q1, *p2 = q2, *p3 = q3;
8720
9047
  for (k=0; k<n; k++) {
8721
- { (*p3) = (*p1) >> (*p2); }
9048
+ {
9049
+ {
9050
+ int64_t _x = (int64_t) (*p1), _n = (int64_t) (*p2), _r;
9051
+ const int64_t _w = (int64_t) (8 * sizeof(int32_t));
9052
+ if ( _n >= _w ) _r = _x < 0 ? -1 : 0;
9053
+ else if ( _n <= -_w ) _r = 0;
9054
+ else if ( _n < 0 ) _r = (int64_t) ((uint64_t) _x << -_n);
9055
+ else _r = _x >> _n;
9056
+ (*p3) = (int32_t) _r;
9057
+ }
9058
+ }
8722
9059
  p1 += i1; p2 += i2; p3 += i3;
8723
9060
  }
8724
9061
  }
@@ -8743,7 +9080,7 @@ ca_binop_bit_rshift_uint32_t (ca_size_t n, boolean8_t *m,
8743
9080
  p1 = q1 + k*i1;
8744
9081
  p2 = q2 + k*i2;
8745
9082
  p3 = q3 + k*i3;
8746
- { (*p3) = (*p1) >> (*p2); }
9083
+ { (*p3) = ((uint64_t) (*p2) >= 8 * sizeof(uint32_t)) ? 0 : (uint32_t) ((uint64_t) (*p1) >> (*p2)); }
8747
9084
  }
8748
9085
  }
8749
9086
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -8757,13 +9094,13 @@ ca_binop_bit_rshift_uint32_t (ca_size_t n, boolean8_t *m,
8757
9094
  #pragma omp simd
8758
9095
  for (k=0; k<n; k++) {
8759
9096
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
8760
- { (*p3) = (*p1) >> (*p2); }
9097
+ { (*p3) = ((uint64_t) (*p2) >= 8 * sizeof(uint32_t)) ? 0 : (uint32_t) ((uint64_t) (*p1) >> (*p2)); }
8761
9098
  }
8762
9099
  } else {
8763
9100
  /* strided branch: numo-shape `p += s` increment form. */
8764
9101
  uint32_t *p1 = q1, *p2 = q2, *p3 = q3;
8765
9102
  for (k=0; k<n; k++) {
8766
- { (*p3) = (*p1) >> (*p2); }
9103
+ { (*p3) = ((uint64_t) (*p2) >= 8 * sizeof(uint32_t)) ? 0 : (uint32_t) ((uint64_t) (*p1) >> (*p2)); }
8767
9104
  p1 += i1; p2 += i2; p3 += i3;
8768
9105
  }
8769
9106
  }
@@ -8788,7 +9125,17 @@ ca_binop_bit_rshift_int64_t (ca_size_t n, boolean8_t *m,
8788
9125
  p1 = q1 + k*i1;
8789
9126
  p2 = q2 + k*i2;
8790
9127
  p3 = q3 + k*i3;
8791
- { (*p3) = (*p1) >> (*p2); }
9128
+ {
9129
+ {
9130
+ int64_t _x = (int64_t) (*p1), _n = (int64_t) (*p2), _r;
9131
+ const int64_t _w = (int64_t) (8 * sizeof(int64_t));
9132
+ if ( _n >= _w ) _r = _x < 0 ? -1 : 0;
9133
+ else if ( _n <= -_w ) _r = 0;
9134
+ else if ( _n < 0 ) _r = (int64_t) ((uint64_t) _x << -_n);
9135
+ else _r = _x >> _n;
9136
+ (*p3) = (int64_t) _r;
9137
+ }
9138
+ }
8792
9139
  }
8793
9140
  }
8794
9141
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -8802,13 +9149,33 @@ ca_binop_bit_rshift_int64_t (ca_size_t n, boolean8_t *m,
8802
9149
  #pragma omp simd
8803
9150
  for (k=0; k<n; k++) {
8804
9151
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
8805
- { (*p3) = (*p1) >> (*p2); }
9152
+ {
9153
+ {
9154
+ int64_t _x = (int64_t) (*p1), _n = (int64_t) (*p2), _r;
9155
+ const int64_t _w = (int64_t) (8 * sizeof(int64_t));
9156
+ if ( _n >= _w ) _r = _x < 0 ? -1 : 0;
9157
+ else if ( _n <= -_w ) _r = 0;
9158
+ else if ( _n < 0 ) _r = (int64_t) ((uint64_t) _x << -_n);
9159
+ else _r = _x >> _n;
9160
+ (*p3) = (int64_t) _r;
9161
+ }
9162
+ }
8806
9163
  }
8807
9164
  } else {
8808
9165
  /* strided branch: numo-shape `p += s` increment form. */
8809
9166
  int64_t *p1 = q1, *p2 = q2, *p3 = q3;
8810
9167
  for (k=0; k<n; k++) {
8811
- { (*p3) = (*p1) >> (*p2); }
9168
+ {
9169
+ {
9170
+ int64_t _x = (int64_t) (*p1), _n = (int64_t) (*p2), _r;
9171
+ const int64_t _w = (int64_t) (8 * sizeof(int64_t));
9172
+ if ( _n >= _w ) _r = _x < 0 ? -1 : 0;
9173
+ else if ( _n <= -_w ) _r = 0;
9174
+ else if ( _n < 0 ) _r = (int64_t) ((uint64_t) _x << -_n);
9175
+ else _r = _x >> _n;
9176
+ (*p3) = (int64_t) _r;
9177
+ }
9178
+ }
8812
9179
  p1 += i1; p2 += i2; p3 += i3;
8813
9180
  }
8814
9181
  }
@@ -8833,7 +9200,7 @@ ca_binop_bit_rshift_uint64_t (ca_size_t n, boolean8_t *m,
8833
9200
  p1 = q1 + k*i1;
8834
9201
  p2 = q2 + k*i2;
8835
9202
  p3 = q3 + k*i3;
8836
- { (*p3) = (*p1) >> (*p2); }
9203
+ { (*p3) = ((uint64_t) (*p2) >= 8 * sizeof(uint64_t)) ? 0 : (uint64_t) ((uint64_t) (*p1) >> (*p2)); }
8837
9204
  }
8838
9205
  }
8839
9206
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -8847,13 +9214,13 @@ ca_binop_bit_rshift_uint64_t (ca_size_t n, boolean8_t *m,
8847
9214
  #pragma omp simd
8848
9215
  for (k=0; k<n; k++) {
8849
9216
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
8850
- { (*p3) = (*p1) >> (*p2); }
9217
+ { (*p3) = ((uint64_t) (*p2) >= 8 * sizeof(uint64_t)) ? 0 : (uint64_t) ((uint64_t) (*p1) >> (*p2)); }
8851
9218
  }
8852
9219
  } else {
8853
9220
  /* strided branch: numo-shape `p += s` increment form. */
8854
9221
  uint64_t *p1 = q1, *p2 = q2, *p3 = q3;
8855
9222
  for (k=0; k<n; k++) {
8856
- { (*p3) = (*p1) >> (*p2); }
9223
+ { (*p3) = ((uint64_t) (*p2) >= 8 * sizeof(uint64_t)) ? 0 : (uint64_t) ((uint64_t) (*p1) >> (*p2)); }
8857
9224
  p1 += i1; p2 += i2; p3 += i3;
8858
9225
  }
8859
9226
  }