carray 3.0.6 → 3.0.7

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 (139) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +110 -0
  3. data/README.md +24 -3
  4. data/carray.gemspec +1 -1
  5. data/ext/ca_axis_group.c +6 -6
  6. data/ext/ca_binop_dispatch.c +8 -0
  7. data/ext/ca_binop_dispatch.h +1 -0
  8. data/ext/ca_categorical_iterator.c +7 -7
  9. data/ext/ca_kernel_iterator.h +6 -4
  10. data/ext/ca_obj_array.c +4 -4
  11. data/ext/ca_obj_bincmp.c +19 -3
  12. data/ext/ca_obj_binop.c +36 -11
  13. data/ext/ca_obj_bitarray.c +2 -4
  14. data/ext/ca_obj_bitfield.c +86 -4
  15. data/ext/ca_obj_byte_swap.c +2 -4
  16. data/ext/ca_obj_const_string.c +422 -257
  17. data/ext/ca_obj_face.c +71 -33
  18. data/ext/ca_obj_fake.c +112 -13
  19. data/ext/ca_obj_farray.c +7 -1
  20. data/ext/ca_obj_fixlen_string.c +51 -17
  21. data/ext/ca_obj_grid.c +12 -7
  22. data/ext/ca_obj_meld.c +5 -5
  23. data/ext/ca_obj_monop.c +65 -39
  24. data/ext/ca_obj_object.c +9 -9
  25. data/ext/ca_obj_reduce.c +2 -4
  26. data/ext/ca_obj_refer.c +104 -10
  27. data/ext/ca_obj_repeat.c +1 -1
  28. data/ext/ca_obj_roll.c +2 -4
  29. data/ext/ca_obj_select.c +8 -6
  30. data/ext/ca_obj_select_axis.c +8 -6
  31. data/ext/ca_obj_stack.c +5 -5
  32. data/ext/ca_obj_stride.c +46 -8
  33. data/ext/ca_obj_string.c +2 -2
  34. data/ext/ca_obj_tile.c +2 -4
  35. data/ext/ca_obj_triop.c +15 -12
  36. data/ext/ca_obj_window.c +22 -15
  37. data/ext/ca_op_ipower.c +63 -15
  38. data/ext/ca_op_powi.h +6 -29
  39. data/ext/ca_sort_kernels.h +3 -0
  40. data/ext/ca_sweep_engine.c +90 -23
  41. data/ext/ca_sweep_engine.h +5 -6
  42. data/ext/caframe_csv_reader.c +1 -1
  43. data/ext/carray.h +3 -1
  44. data/ext/carray_access.c +98 -39
  45. data/ext/carray_address_basis.c +98 -24
  46. data/ext/carray_broadcast.c +2 -2
  47. data/ext/carray_call_cfunc.c +5 -8
  48. data/ext/carray_cast.c +311 -37
  49. data/ext/carray_cast_func.rb +37 -5
  50. data/ext/carray_conversion.c +56 -2
  51. data/ext/carray_copy.c +24 -0
  52. data/ext/carray_core.c +69 -6
  53. data/ext/carray_count.c +28 -9
  54. data/ext/carray_element.c +9 -3
  55. data/ext/carray_factorize.c +11 -11
  56. data/ext/carray_histogram.c +2 -2
  57. data/ext/carray_index_classifier.c +7 -5
  58. data/ext/carray_internal.h +94 -0
  59. data/ext/carray_kernels_binop.c +55 -55
  60. data/ext/carray_kernels_init.c +14 -14
  61. data/ext/carray_kernels_monop.c +90 -140
  62. data/ext/carray_lazy.c +16 -1
  63. data/ext/carray_loop.c +9 -2
  64. data/ext/carray_mask.c +118 -11
  65. data/ext/carray_median_percentile.c +13 -8
  66. data/ext/carray_memory_view.c +41 -22
  67. data/ext/carray_operator.c +72 -11
  68. data/ext/carray_order.c +52 -9
  69. data/ext/carray_partition.c +1 -1
  70. data/ext/carray_random.c +1 -1
  71. data/ext/carray_round.c +24 -1
  72. data/ext/carray_scatter.c +4 -0
  73. data/ext/carray_segment.c +1 -1
  74. data/ext/carray_slab.c +13 -4
  75. data/ext/carray_sort.c +6 -3
  76. data/ext/carray_sort_kernel.c +24 -0
  77. data/ext/carray_struct.c +21 -6
  78. data/ext/carray_test.c +85 -39
  79. data/ext/carray_time_text.c +6 -0
  80. data/ext/carray_utils.c +124 -54
  81. data/ext/mk_call_cfunc.rb +6 -11
  82. data/ext/mkkernel.rb +37 -27
  83. data/ext/version.h +4 -4
  84. data/lib/carray/axis_group.rb +9 -6
  85. data/lib/carray/basics.rb +26 -8
  86. data/lib/carray/bincount_nd.rb +8 -2
  87. data/lib/carray/block_iterator.rb +48 -21
  88. data/lib/carray/categorical.rb +21 -8
  89. data/lib/carray/categorical_iterator.rb +2 -1
  90. data/lib/carray/conditional.rb +52 -4
  91. data/lib/carray/const_string.rb +74 -0
  92. data/lib/carray/construct.rb +2 -2
  93. data/lib/carray/core_extensions.rb +19 -68
  94. data/lib/carray/data_type_extension.rb +1 -0
  95. data/lib/carray/fixlen_string.rb +83 -1
  96. data/lib/carray/frame/column_verbs.rb +61 -6
  97. data/lib/carray/frame/concat.rb +50 -6
  98. data/lib/carray/frame/csv_parser.rb +13 -4
  99. data/lib/carray/frame/frame.rb +38 -6
  100. data/lib/carray/frame/group.rb +67 -40
  101. data/lib/carray/frame/io.rb +10 -5
  102. data/lib/carray/frame/join.rb +20 -6
  103. data/lib/carray/frame/records.rb +6 -4
  104. data/lib/carray/frame/reshape.rb +25 -5
  105. data/lib/carray/frame/verbs.rb +78 -25
  106. data/lib/carray/frame/windows.rb +30 -6
  107. data/lib/carray/fuse_source.rb +4 -2
  108. data/lib/carray/iterator.rb +8 -0
  109. data/lib/carray/key_windows.rb +10 -4
  110. data/lib/carray/lazy.rb +12 -17
  111. data/lib/carray/methods/bin.rb +3 -0
  112. data/lib/carray/methods/composition.rb +1 -1
  113. data/lib/carray/methods/factorize.rb +2 -0
  114. data/lib/carray/methods/gather_nd.rb +4 -1
  115. data/lib/carray/methods/is_in.rb +23 -3
  116. data/lib/carray/methods/locate_addr.rb +63 -12
  117. data/lib/carray/methods/repeat.rb +11 -1
  118. data/lib/carray/record_order.rb +35 -6
  119. data/lib/carray/runtime.rb +10 -0
  120. data/lib/carray/segment_iterator.rb +19 -16
  121. data/lib/carray/serialize.rb +22 -0
  122. data/lib/carray/slab_iterator.rb +1 -1
  123. data/lib/carray/stack.rb +3 -3
  124. data/lib/carray/string.rb +6 -6
  125. data/lib/carray/string_operation_extension.rb +25 -4
  126. data/lib/carray/struct_builder.rb +4 -1
  127. data/lib/carray/time.rb +190 -46
  128. data/lib/carray/window_iterator.rb +48 -12
  129. data/yard-stubs/ca_obj_bitfield.rb +4 -1
  130. data/yard-stubs/ca_obj_refer.rb +3 -0
  131. data/yard-stubs/ca_obj_window.rb +2 -1
  132. data/yard-stubs/carray_access.rb +4 -2
  133. data/yard-stubs/carray_cast.rb +6 -0
  134. data/yard-stubs/carray_count.rb +6 -3
  135. data/yard-stubs/carray_math.rb +5 -0
  136. data/yard-stubs/carray_order.rb +6 -0
  137. data/yard-stubs/carray_scatter.rb +2 -1
  138. data/yard-stubs/carray_test.rb +18 -5
  139. metadata +2 -2
@@ -21260,7 +21260,7 @@ ca_binop_bit_or_i_boolean8_t (ca_size_t n, boolean8_t *m,
21260
21260
  p1 = q1 + k*i1;
21261
21261
  p2 = q2 + k*i2;
21262
21262
  p3 = q3 + k*i3;
21263
- { (*p3) = (*p1) | (*p2); }
21263
+ { (*p3) = ((*p1) | (*p2)) ? 1 : 0; }
21264
21264
  }
21265
21265
  }
21266
21266
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -21284,7 +21284,7 @@ ca_binop_bit_or_i_boolean8_t (ca_size_t n, boolean8_t *m,
21284
21284
  #pragma omp simd
21285
21285
  for (k=0; k<n; k++) {
21286
21286
  p1 = r1 + k; p2 = r2 + k; p3 = r3 + k;
21287
- { (*p3) = (*p1) | (*p2); }
21287
+ { (*p3) = ((*p1) | (*p2)) ? 1 : 0; }
21288
21288
  }
21289
21289
  }
21290
21290
  else if ( ( apart1 || a1 == a3 ) && ( apart2 || a2 == a3 ) ) {
@@ -21292,13 +21292,13 @@ ca_binop_bit_or_i_boolean8_t (ca_size_t n, boolean8_t *m,
21292
21292
  #pragma omp simd
21293
21293
  for (k=0; k<n; k++) {
21294
21294
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
21295
- { (*p3) = (*p1) | (*p2); }
21295
+ { (*p3) = ((*p1) | (*p2)) ? 1 : 0; }
21296
21296
  }
21297
21297
  }
21298
21298
  else {
21299
21299
  for (k=0; k<n; k++) {
21300
21300
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
21301
- { (*p3) = (*p1) | (*p2); }
21301
+ { (*p3) = ((*p1) | (*p2)) ? 1 : 0; }
21302
21302
  }
21303
21303
  }
21304
21304
  } else if ( i3 == 1 && ( ( i1 == 1 && i2 == 0 ) || ( i1 == 0 && i2 == 1 ) ) ) {
@@ -21319,20 +21319,20 @@ ca_binop_bit_or_i_boolean8_t (ca_size_t n, boolean8_t *m,
21319
21319
  #pragma omp simd
21320
21320
  for (k=0; k<n; k++) {
21321
21321
  p2 = ra + k; p3 = r3 + k;
21322
- { (*p3) = (*p1) | (*p2); }
21322
+ { (*p3) = ((*p1) | (*p2)) ? 1 : 0; }
21323
21323
  }
21324
21324
  }
21325
21325
  else if ( aa == a3 ) {
21326
21326
  #pragma omp simd
21327
21327
  for (k=0; k<n; k++) {
21328
21328
  p2 = qa + k; p3 = q3 + k;
21329
- { (*p3) = (*p1) | (*p2); }
21329
+ { (*p3) = ((*p1) | (*p2)) ? 1 : 0; }
21330
21330
  }
21331
21331
  }
21332
21332
  else {
21333
21333
  for (k=0; k<n; k++) {
21334
21334
  p2 = qa + k; p3 = q3 + k;
21335
- { (*p3) = (*p1) | (*p2); }
21335
+ { (*p3) = ((*p1) | (*p2)) ? 1 : 0; }
21336
21336
  }
21337
21337
  }
21338
21338
  }
@@ -21344,20 +21344,20 @@ ca_binop_bit_or_i_boolean8_t (ca_size_t n, boolean8_t *m,
21344
21344
  #pragma omp simd
21345
21345
  for (k=0; k<n; k++) {
21346
21346
  p1 = ra + k; p3 = r3 + k;
21347
- { (*p3) = (*p1) | (*p2); }
21347
+ { (*p3) = ((*p1) | (*p2)) ? 1 : 0; }
21348
21348
  }
21349
21349
  }
21350
21350
  else if ( aa == a3 ) {
21351
21351
  #pragma omp simd
21352
21352
  for (k=0; k<n; k++) {
21353
21353
  p1 = qa + k; p3 = q3 + k;
21354
- { (*p3) = (*p1) | (*p2); }
21354
+ { (*p3) = ((*p1) | (*p2)) ? 1 : 0; }
21355
21355
  }
21356
21356
  }
21357
21357
  else {
21358
21358
  for (k=0; k<n; k++) {
21359
21359
  p1 = qa + k; p3 = q3 + k;
21360
- { (*p3) = (*p1) | (*p2); }
21360
+ { (*p3) = ((*p1) | (*p2)) ? 1 : 0; }
21361
21361
  }
21362
21362
  }
21363
21363
  }
@@ -21365,7 +21365,7 @@ ca_binop_bit_or_i_boolean8_t (ca_size_t n, boolean8_t *m,
21365
21365
  /* strided branch: numo-shape `p += s` increment form. */
21366
21366
  boolean8_t *p1 = q1, *p2 = q2, *p3 = q3;
21367
21367
  for (k=0; k<n; k++) {
21368
- { (*p3) = (*p1) | (*p2); }
21368
+ { (*p3) = ((*p1) | (*p2)) ? 1 : 0; }
21369
21369
  p1 += i1; p2 += i2; p3 += i3;
21370
21370
  }
21371
21371
  }
@@ -28098,7 +28098,7 @@ ca_binop_power_float32_t (ca_size_t n, boolean8_t *m,
28098
28098
  p1 = q1 + k*i1;
28099
28099
  p2 = q2 + k*i2;
28100
28100
  p3 = q3 + k*i3;
28101
- { (*p3) = powf((*p1), (*p2)); }
28101
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : powf((*p1), (*p2)); }
28102
28102
  }
28103
28103
  }
28104
28104
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -28122,7 +28122,7 @@ ca_binop_power_float32_t (ca_size_t n, boolean8_t *m,
28122
28122
  #pragma omp simd
28123
28123
  for (k=0; k<n; k++) {
28124
28124
  p1 = r1 + k; p2 = r2 + k; p3 = r3 + k;
28125
- { (*p3) = powf((*p1), (*p2)); }
28125
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : powf((*p1), (*p2)); }
28126
28126
  }
28127
28127
  }
28128
28128
  else if ( ( apart1 || a1 == a3 ) && ( apart2 || a2 == a3 ) ) {
@@ -28130,13 +28130,13 @@ ca_binop_power_float32_t (ca_size_t n, boolean8_t *m,
28130
28130
  #pragma omp simd
28131
28131
  for (k=0; k<n; k++) {
28132
28132
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
28133
- { (*p3) = powf((*p1), (*p2)); }
28133
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : powf((*p1), (*p2)); }
28134
28134
  }
28135
28135
  }
28136
28136
  else {
28137
28137
  for (k=0; k<n; k++) {
28138
28138
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
28139
- { (*p3) = powf((*p1), (*p2)); }
28139
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : powf((*p1), (*p2)); }
28140
28140
  }
28141
28141
  }
28142
28142
  } else if ( i3 == 1 && ( ( i1 == 1 && i2 == 0 ) || ( i1 == 0 && i2 == 1 ) ) ) {
@@ -28157,20 +28157,20 @@ ca_binop_power_float32_t (ca_size_t n, boolean8_t *m,
28157
28157
  #pragma omp simd
28158
28158
  for (k=0; k<n; k++) {
28159
28159
  p2 = ra + k; p3 = r3 + k;
28160
- { (*p3) = powf((*p1), (*p2)); }
28160
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : powf((*p1), (*p2)); }
28161
28161
  }
28162
28162
  }
28163
28163
  else if ( aa == a3 ) {
28164
28164
  #pragma omp simd
28165
28165
  for (k=0; k<n; k++) {
28166
28166
  p2 = qa + k; p3 = q3 + k;
28167
- { (*p3) = powf((*p1), (*p2)); }
28167
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : powf((*p1), (*p2)); }
28168
28168
  }
28169
28169
  }
28170
28170
  else {
28171
28171
  for (k=0; k<n; k++) {
28172
28172
  p2 = qa + k; p3 = q3 + k;
28173
- { (*p3) = powf((*p1), (*p2)); }
28173
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : powf((*p1), (*p2)); }
28174
28174
  }
28175
28175
  }
28176
28176
  }
@@ -28182,20 +28182,20 @@ ca_binop_power_float32_t (ca_size_t n, boolean8_t *m,
28182
28182
  #pragma omp simd
28183
28183
  for (k=0; k<n; k++) {
28184
28184
  p1 = ra + k; p3 = r3 + k;
28185
- { (*p3) = powf((*p1), (*p2)); }
28185
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : powf((*p1), (*p2)); }
28186
28186
  }
28187
28187
  }
28188
28188
  else if ( aa == a3 ) {
28189
28189
  #pragma omp simd
28190
28190
  for (k=0; k<n; k++) {
28191
28191
  p1 = qa + k; p3 = q3 + k;
28192
- { (*p3) = powf((*p1), (*p2)); }
28192
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : powf((*p1), (*p2)); }
28193
28193
  }
28194
28194
  }
28195
28195
  else {
28196
28196
  for (k=0; k<n; k++) {
28197
28197
  p1 = qa + k; p3 = q3 + k;
28198
- { (*p3) = powf((*p1), (*p2)); }
28198
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : powf((*p1), (*p2)); }
28199
28199
  }
28200
28200
  }
28201
28201
  }
@@ -28203,7 +28203,7 @@ ca_binop_power_float32_t (ca_size_t n, boolean8_t *m,
28203
28203
  /* strided branch: numo-shape `p += s` increment form. */
28204
28204
  ca_u_float32_t *p1 = q1, *p2 = q2, *p3 = q3;
28205
28205
  for (k=0; k<n; k++) {
28206
- { (*p3) = powf((*p1), (*p2)); }
28206
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : powf((*p1), (*p2)); }
28207
28207
  p1 += i1; p2 += i2; p3 += i3;
28208
28208
  }
28209
28209
  }
@@ -28228,7 +28228,7 @@ ca_binop_power_float64_t (ca_size_t n, boolean8_t *m,
28228
28228
  p1 = q1 + k*i1;
28229
28229
  p2 = q2 + k*i2;
28230
28230
  p3 = q3 + k*i3;
28231
- { (*p3) = pow((*p1), (*p2)); }
28231
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : pow((*p1), (*p2)); }
28232
28232
  }
28233
28233
  }
28234
28234
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -28252,7 +28252,7 @@ ca_binop_power_float64_t (ca_size_t n, boolean8_t *m,
28252
28252
  #pragma omp simd
28253
28253
  for (k=0; k<n; k++) {
28254
28254
  p1 = r1 + k; p2 = r2 + k; p3 = r3 + k;
28255
- { (*p3) = pow((*p1), (*p2)); }
28255
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : pow((*p1), (*p2)); }
28256
28256
  }
28257
28257
  }
28258
28258
  else if ( ( apart1 || a1 == a3 ) && ( apart2 || a2 == a3 ) ) {
@@ -28260,13 +28260,13 @@ ca_binop_power_float64_t (ca_size_t n, boolean8_t *m,
28260
28260
  #pragma omp simd
28261
28261
  for (k=0; k<n; k++) {
28262
28262
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
28263
- { (*p3) = pow((*p1), (*p2)); }
28263
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : pow((*p1), (*p2)); }
28264
28264
  }
28265
28265
  }
28266
28266
  else {
28267
28267
  for (k=0; k<n; k++) {
28268
28268
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
28269
- { (*p3) = pow((*p1), (*p2)); }
28269
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : pow((*p1), (*p2)); }
28270
28270
  }
28271
28271
  }
28272
28272
  } else if ( i3 == 1 && ( ( i1 == 1 && i2 == 0 ) || ( i1 == 0 && i2 == 1 ) ) ) {
@@ -28287,20 +28287,20 @@ ca_binop_power_float64_t (ca_size_t n, boolean8_t *m,
28287
28287
  #pragma omp simd
28288
28288
  for (k=0; k<n; k++) {
28289
28289
  p2 = ra + k; p3 = r3 + k;
28290
- { (*p3) = pow((*p1), (*p2)); }
28290
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : pow((*p1), (*p2)); }
28291
28291
  }
28292
28292
  }
28293
28293
  else if ( aa == a3 ) {
28294
28294
  #pragma omp simd
28295
28295
  for (k=0; k<n; k++) {
28296
28296
  p2 = qa + k; p3 = q3 + k;
28297
- { (*p3) = pow((*p1), (*p2)); }
28297
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : pow((*p1), (*p2)); }
28298
28298
  }
28299
28299
  }
28300
28300
  else {
28301
28301
  for (k=0; k<n; k++) {
28302
28302
  p2 = qa + k; p3 = q3 + k;
28303
- { (*p3) = pow((*p1), (*p2)); }
28303
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : pow((*p1), (*p2)); }
28304
28304
  }
28305
28305
  }
28306
28306
  }
@@ -28312,20 +28312,20 @@ ca_binop_power_float64_t (ca_size_t n, boolean8_t *m,
28312
28312
  #pragma omp simd
28313
28313
  for (k=0; k<n; k++) {
28314
28314
  p1 = ra + k; p3 = r3 + k;
28315
- { (*p3) = pow((*p1), (*p2)); }
28315
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : pow((*p1), (*p2)); }
28316
28316
  }
28317
28317
  }
28318
28318
  else if ( aa == a3 ) {
28319
28319
  #pragma omp simd
28320
28320
  for (k=0; k<n; k++) {
28321
28321
  p1 = qa + k; p3 = q3 + k;
28322
- { (*p3) = pow((*p1), (*p2)); }
28322
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : pow((*p1), (*p2)); }
28323
28323
  }
28324
28324
  }
28325
28325
  else {
28326
28326
  for (k=0; k<n; k++) {
28327
28327
  p1 = qa + k; p3 = q3 + k;
28328
- { (*p3) = pow((*p1), (*p2)); }
28328
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : pow((*p1), (*p2)); }
28329
28329
  }
28330
28330
  }
28331
28331
  }
@@ -28333,7 +28333,7 @@ ca_binop_power_float64_t (ca_size_t n, boolean8_t *m,
28333
28333
  /* strided branch: numo-shape `p += s` increment form. */
28334
28334
  ca_u_float64_t *p1 = q1, *p2 = q2, *p3 = q3;
28335
28335
  for (k=0; k<n; k++) {
28336
- { (*p3) = pow((*p1), (*p2)); }
28336
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : pow((*p1), (*p2)); }
28337
28337
  p1 += i1; p2 += i2; p3 += i3;
28338
28338
  }
28339
28339
  }
@@ -28358,7 +28358,7 @@ ca_binop_power_cmplx64_t (ca_size_t n, boolean8_t *m,
28358
28358
  p1 = q1 + k*i1;
28359
28359
  p2 = q2 + k*i2;
28360
28360
  p3 = q3 + k*i3;
28361
- { (*p3) = cpow((*p1), (*p2)); }
28361
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : cpow((*p1), (*p2)); }
28362
28362
  }
28363
28363
  }
28364
28364
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -28382,7 +28382,7 @@ ca_binop_power_cmplx64_t (ca_size_t n, boolean8_t *m,
28382
28382
  #pragma omp simd
28383
28383
  for (k=0; k<n; k++) {
28384
28384
  p1 = r1 + k; p2 = r2 + k; p3 = r3 + k;
28385
- { (*p3) = cpow((*p1), (*p2)); }
28385
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : cpow((*p1), (*p2)); }
28386
28386
  }
28387
28387
  }
28388
28388
  else if ( ( apart1 || a1 == a3 ) && ( apart2 || a2 == a3 ) ) {
@@ -28390,13 +28390,13 @@ ca_binop_power_cmplx64_t (ca_size_t n, boolean8_t *m,
28390
28390
  #pragma omp simd
28391
28391
  for (k=0; k<n; k++) {
28392
28392
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
28393
- { (*p3) = cpow((*p1), (*p2)); }
28393
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : cpow((*p1), (*p2)); }
28394
28394
  }
28395
28395
  }
28396
28396
  else {
28397
28397
  for (k=0; k<n; k++) {
28398
28398
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
28399
- { (*p3) = cpow((*p1), (*p2)); }
28399
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : cpow((*p1), (*p2)); }
28400
28400
  }
28401
28401
  }
28402
28402
  } else if ( i3 == 1 && ( ( i1 == 1 && i2 == 0 ) || ( i1 == 0 && i2 == 1 ) ) ) {
@@ -28417,20 +28417,20 @@ ca_binop_power_cmplx64_t (ca_size_t n, boolean8_t *m,
28417
28417
  #pragma omp simd
28418
28418
  for (k=0; k<n; k++) {
28419
28419
  p2 = ra + k; p3 = r3 + k;
28420
- { (*p3) = cpow((*p1), (*p2)); }
28420
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : cpow((*p1), (*p2)); }
28421
28421
  }
28422
28422
  }
28423
28423
  else if ( aa == a3 ) {
28424
28424
  #pragma omp simd
28425
28425
  for (k=0; k<n; k++) {
28426
28426
  p2 = qa + k; p3 = q3 + k;
28427
- { (*p3) = cpow((*p1), (*p2)); }
28427
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : cpow((*p1), (*p2)); }
28428
28428
  }
28429
28429
  }
28430
28430
  else {
28431
28431
  for (k=0; k<n; k++) {
28432
28432
  p2 = qa + k; p3 = q3 + k;
28433
- { (*p3) = cpow((*p1), (*p2)); }
28433
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : cpow((*p1), (*p2)); }
28434
28434
  }
28435
28435
  }
28436
28436
  }
@@ -28442,20 +28442,20 @@ ca_binop_power_cmplx64_t (ca_size_t n, boolean8_t *m,
28442
28442
  #pragma omp simd
28443
28443
  for (k=0; k<n; k++) {
28444
28444
  p1 = ra + k; p3 = r3 + k;
28445
- { (*p3) = cpow((*p1), (*p2)); }
28445
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : cpow((*p1), (*p2)); }
28446
28446
  }
28447
28447
  }
28448
28448
  else if ( aa == a3 ) {
28449
28449
  #pragma omp simd
28450
28450
  for (k=0; k<n; k++) {
28451
28451
  p1 = qa + k; p3 = q3 + k;
28452
- { (*p3) = cpow((*p1), (*p2)); }
28452
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : cpow((*p1), (*p2)); }
28453
28453
  }
28454
28454
  }
28455
28455
  else {
28456
28456
  for (k=0; k<n; k++) {
28457
28457
  p1 = qa + k; p3 = q3 + k;
28458
- { (*p3) = cpow((*p1), (*p2)); }
28458
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : cpow((*p1), (*p2)); }
28459
28459
  }
28460
28460
  }
28461
28461
  }
@@ -28463,7 +28463,7 @@ ca_binop_power_cmplx64_t (ca_size_t n, boolean8_t *m,
28463
28463
  /* strided branch: numo-shape `p += s` increment form. */
28464
28464
  ca_u_cmplx64_t *p1 = q1, *p2 = q2, *p3 = q3;
28465
28465
  for (k=0; k<n; k++) {
28466
- { (*p3) = cpow((*p1), (*p2)); }
28466
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : cpow((*p1), (*p2)); }
28467
28467
  p1 += i1; p2 += i2; p3 += i3;
28468
28468
  }
28469
28469
  }
@@ -28488,7 +28488,7 @@ ca_binop_power_cmplx128_t (ca_size_t n, boolean8_t *m,
28488
28488
  p1 = q1 + k*i1;
28489
28489
  p2 = q2 + k*i2;
28490
28490
  p3 = q3 + k*i3;
28491
- { (*p3) = cpow((*p1), (*p2)); }
28491
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : cpow((*p1), (*p2)); }
28492
28492
  }
28493
28493
  }
28494
28494
  } else if ( i1 == 1 && i2 == 1 && i3 == 1 ) {
@@ -28512,7 +28512,7 @@ ca_binop_power_cmplx128_t (ca_size_t n, boolean8_t *m,
28512
28512
  #pragma omp simd
28513
28513
  for (k=0; k<n; k++) {
28514
28514
  p1 = r1 + k; p2 = r2 + k; p3 = r3 + k;
28515
- { (*p3) = cpow((*p1), (*p2)); }
28515
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : cpow((*p1), (*p2)); }
28516
28516
  }
28517
28517
  }
28518
28518
  else if ( ( apart1 || a1 == a3 ) && ( apart2 || a2 == a3 ) ) {
@@ -28520,13 +28520,13 @@ ca_binop_power_cmplx128_t (ca_size_t n, boolean8_t *m,
28520
28520
  #pragma omp simd
28521
28521
  for (k=0; k<n; k++) {
28522
28522
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
28523
- { (*p3) = cpow((*p1), (*p2)); }
28523
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : cpow((*p1), (*p2)); }
28524
28524
  }
28525
28525
  }
28526
28526
  else {
28527
28527
  for (k=0; k<n; k++) {
28528
28528
  p1 = q1 + k; p2 = q2 + k; p3 = q3 + k;
28529
- { (*p3) = cpow((*p1), (*p2)); }
28529
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : cpow((*p1), (*p2)); }
28530
28530
  }
28531
28531
  }
28532
28532
  } else if ( i3 == 1 && ( ( i1 == 1 && i2 == 0 ) || ( i1 == 0 && i2 == 1 ) ) ) {
@@ -28547,20 +28547,20 @@ ca_binop_power_cmplx128_t (ca_size_t n, boolean8_t *m,
28547
28547
  #pragma omp simd
28548
28548
  for (k=0; k<n; k++) {
28549
28549
  p2 = ra + k; p3 = r3 + k;
28550
- { (*p3) = cpow((*p1), (*p2)); }
28550
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : cpow((*p1), (*p2)); }
28551
28551
  }
28552
28552
  }
28553
28553
  else if ( aa == a3 ) {
28554
28554
  #pragma omp simd
28555
28555
  for (k=0; k<n; k++) {
28556
28556
  p2 = qa + k; p3 = q3 + k;
28557
- { (*p3) = cpow((*p1), (*p2)); }
28557
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : cpow((*p1), (*p2)); }
28558
28558
  }
28559
28559
  }
28560
28560
  else {
28561
28561
  for (k=0; k<n; k++) {
28562
28562
  p2 = qa + k; p3 = q3 + k;
28563
- { (*p3) = cpow((*p1), (*p2)); }
28563
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : cpow((*p1), (*p2)); }
28564
28564
  }
28565
28565
  }
28566
28566
  }
@@ -28572,20 +28572,20 @@ ca_binop_power_cmplx128_t (ca_size_t n, boolean8_t *m,
28572
28572
  #pragma omp simd
28573
28573
  for (k=0; k<n; k++) {
28574
28574
  p1 = ra + k; p3 = r3 + k;
28575
- { (*p3) = cpow((*p1), (*p2)); }
28575
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : cpow((*p1), (*p2)); }
28576
28576
  }
28577
28577
  }
28578
28578
  else if ( aa == a3 ) {
28579
28579
  #pragma omp simd
28580
28580
  for (k=0; k<n; k++) {
28581
28581
  p1 = qa + k; p3 = q3 + k;
28582
- { (*p3) = cpow((*p1), (*p2)); }
28582
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : cpow((*p1), (*p2)); }
28583
28583
  }
28584
28584
  }
28585
28585
  else {
28586
28586
  for (k=0; k<n; k++) {
28587
28587
  p1 = qa + k; p3 = q3 + k;
28588
- { (*p3) = cpow((*p1), (*p2)); }
28588
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : cpow((*p1), (*p2)); }
28589
28589
  }
28590
28590
  }
28591
28591
  }
@@ -28593,7 +28593,7 @@ ca_binop_power_cmplx128_t (ca_size_t n, boolean8_t *m,
28593
28593
  /* strided branch: numo-shape `p += s` increment form. */
28594
28594
  ca_u_cmplx128_t *p1 = q1, *p2 = q2, *p3 = q3;
28595
28595
  for (k=0; k<n; k++) {
28596
- { (*p3) = cpow((*p1), (*p2)); }
28596
+ { (*p3) = (*p2) == 2 ? (*p1) * (*p1) : (*p2) == 3 ? (*p1) * (*p1) * (*p1) : (*p2) == 4 ? ((*p1) * (*p1)) * ((*p1) * (*p1)) : (*p2) == 1 ? (*p1) : (*p2) == 0 ? 1 : (*p2) == -1 ? 1 / (*p1) : (*p2) == -2 ? 1 / ((*p1) * (*p1)) : cpow((*p1), (*p2)); }
28597
28597
  p1 += i1; p2 += i2; p3 += i3;
28598
28598
  }
28599
28599
  }
@@ -28,13 +28,13 @@ typedef struct {
28
28
 
29
29
  static const ca_kernel_body_t ca_kernel_bodies[] = {
30
30
  { "binop", "ipow", "float32",
31
- "(#3) = op_powi_<type>((#1), (#2));" },
31
+ "(#3) = (#2) == 2 ? (#1) * (#1) : (#2) == 3 ? (#1) * (#1) * (#1) : (#2) == 4 ? ((#1) * (#1)) * ((#1) * (#1)) : (#2) == 1 ? (#1) : (#2) == 0 ? 1 : (#2) == -1 ? 1 / (#1) : (#2) == -2 ? 1 / ((#1) * (#1)) : powf((#1), (float)(double)(#2));" },
32
32
  { "binop", "ipow", "float64",
33
- "(#3) = op_powi_<type>((#1), (#2));" },
33
+ "(#3) = (#2) == 2 ? (#1) * (#1) : (#2) == 3 ? (#1) * (#1) * (#1) : (#2) == 4 ? ((#1) * (#1)) * ((#1) * (#1)) : (#2) == 1 ? (#1) : (#2) == 0 ? 1 : (#2) == -1 ? 1 / (#1) : (#2) == -2 ? 1 / ((#1) * (#1)) : pow((#1), (double)(#2));" },
34
34
  { "binop", "ipow", "cmplx64",
35
- "(#3) = op_powi_<type>((#1), (#2));" },
35
+ "(#3) = (#2) == 2 ? (#1) * (#1) : (#2) == 3 ? (#1) * (#1) * (#1) : (#2) == 4 ? ((#1) * (#1)) * ((#1) * (#1)) : (#2) == 1 ? (#1) : (#2) == 0 ? 1 : (#2) == -1 ? 1 / (#1) : (#2) == -2 ? 1 / ((#1) * (#1)) : cpow((#1), (float)(double)(#2));" },
36
36
  { "binop", "ipow", "cmplx128",
37
- "(#3) = op_powi_<type>((#1), (#2));" },
37
+ "(#3) = (#2) == 2 ? (#1) * (#1) : (#2) == 3 ? (#1) * (#1) * (#1) : (#2) == 4 ? ((#1) * (#1)) * ((#1) * (#1)) : (#2) == 1 ? (#1) : (#2) == 0 ? 1 : (#2) == -1 ? 1 / (#1) : (#2) == -2 ? 1 / ((#1) * (#1)) : cpow((#1), (double)(#2));" },
38
38
  { "monop", "cast_int8", "boolean",
39
39
  "(#2) = (int8_t)(#1);" },
40
40
  { "monop", "cast_uint8", "boolean",
@@ -878,17 +878,17 @@ static const ca_kernel_body_t ca_kernel_bodies[] = {
878
878
  { "monop", "square", "cmplx128",
879
879
  "(#2) = (#1) * (#1);" },
880
880
  { "monop", "deg_360", "float32",
881
- "{\n double _a = (double)(#1);\n double _fa = _a / 360.0;\n (#2) = (_a >= 0)\n ? (_fa - floor(_fa)) * 360.0\n : (_fa - ceil(_fa) + 1.0) * 360.0;\n}\n" },
881
+ "{\n double _fa = (double)(#1) / 360.0;\n (#2) = (_fa - floor(_fa)) * 360.0;\n if ( (#2) >= 360.0 ) (#2) = 0.0; /* a tiny negative rounds to the top */\n}\n" },
882
882
  { "monop", "deg_360", "float64",
883
- "{\n double _a = (double)(#1);\n double _fa = _a / 360.0;\n (#2) = (_a >= 0)\n ? (_fa - floor(_fa)) * 360.0\n : (_fa - ceil(_fa) + 1.0) * 360.0;\n}\n" },
883
+ "{\n double _fa = (double)(#1) / 360.0;\n (#2) = (_fa - floor(_fa)) * 360.0;\n if ( (#2) >= 360.0 ) (#2) = 0.0; /* a tiny negative rounds to the top */\n}\n" },
884
884
  { "monop", "deg_180", "float32",
885
885
  "{\n double _a = (double)(#1);\n double _fa = (_a + 180.0) / 360.0;\n double _b = (_a >= 0)\n ? (_fa - floor(_fa)) * 360.0 - 180.0\n : (_fa - ceil(_fa)) * 360.0 - 180.0;\n if (_b <= -180.0) _b += 360.0;\n (#2) = _b;\n}\n" },
886
886
  { "monop", "deg_180", "float64",
887
887
  "{\n double _a = (double)(#1);\n double _fa = (_a + 180.0) / 360.0;\n double _b = (_a >= 0)\n ? (_fa - floor(_fa)) * 360.0 - 180.0\n : (_fa - ceil(_fa)) * 360.0 - 180.0;\n if (_b <= -180.0) _b += 360.0;\n (#2) = _b;\n}\n" },
888
888
  { "monop", "rad_2pi", "float32",
889
- "{\n double _two_pi = 2.0 * M_PI;\n double _a = (double)(#1);\n double _fa = _a / _two_pi;\n (#2) = (_a >= 0)\n ? (_fa - floor(_fa)) * _two_pi\n : (_fa - ceil(_fa) + 1.0) * _two_pi;\n}\n" },
889
+ "{\n double _two_pi = 2.0 * M_PI;\n double _fa = (double)(#1) / _two_pi;\n (#2) = (_fa - floor(_fa)) * _two_pi;\n if ( (#2) >= _two_pi ) (#2) = 0.0; /* a tiny negative rounds to the top */\n}\n" },
890
890
  { "monop", "rad_2pi", "float64",
891
- "{\n double _two_pi = 2.0 * M_PI;\n double _a = (double)(#1);\n double _fa = _a / _two_pi;\n (#2) = (_a >= 0)\n ? (_fa - floor(_fa)) * _two_pi\n : (_fa - ceil(_fa) + 1.0) * _two_pi;\n}\n" },
891
+ "{\n double _two_pi = 2.0 * M_PI;\n double _fa = (double)(#1) / _two_pi;\n (#2) = (_fa - floor(_fa)) * _two_pi;\n if ( (#2) >= _two_pi ) (#2) = 0.0; /* a tiny negative rounds to the top */\n}\n" },
892
892
  { "monop", "rad_pi", "float32",
893
893
  "{\n double _two_pi = 2.0 * M_PI;\n double _a = (double)(#1);\n double _fa = (_a + M_PI) / _two_pi;\n double _b = (_a >= 0)\n ? (_fa - floor(_fa)) * _two_pi - M_PI\n : (_fa - ceil(_fa)) * _two_pi - M_PI;\n if (_b <= -M_PI) _b += _two_pi;\n (#2) = _b;\n}\n" },
894
894
  { "monop", "rad_pi", "float64",
@@ -1168,7 +1168,7 @@ static const ca_kernel_body_t ca_kernel_bodies[] = {
1168
1168
  { "binop", "bit_or_i", "uint64",
1169
1169
  "(#3) = (#1) | (#2);" },
1170
1170
  { "binop", "bit_or_i", "boolean",
1171
- "(#3) = (#1) | (#2);" },
1171
+ "(#3) = ((#1) | (#2)) ? 1 : 0;" },
1172
1172
  { "binop", "bit_xor_i", "int8",
1173
1173
  "(#3) = (#1) ^ (#2);" },
1174
1174
  { "binop", "bit_xor_i", "uint8",
@@ -1336,13 +1336,13 @@ static const ca_kernel_body_t ca_kernel_bodies[] = {
1336
1336
  { "binop", "power", "uint64",
1337
1337
  "(#3) = op_powi_<type>((#1), (#2));" },
1338
1338
  { "binop", "power", "float32",
1339
- "(#3) = powf((#1), (#2));" },
1339
+ "(#3) = (#2) == 2 ? (#1) * (#1) : (#2) == 3 ? (#1) * (#1) * (#1) : (#2) == 4 ? ((#1) * (#1)) * ((#1) * (#1)) : (#2) == 1 ? (#1) : (#2) == 0 ? 1 : (#2) == -1 ? 1 / (#1) : (#2) == -2 ? 1 / ((#1) * (#1)) : powf((#1), (#2));" },
1340
1340
  { "binop", "power", "float64",
1341
- "(#3) = pow((#1), (#2));" },
1341
+ "(#3) = (#2) == 2 ? (#1) * (#1) : (#2) == 3 ? (#1) * (#1) * (#1) : (#2) == 4 ? ((#1) * (#1)) * ((#1) * (#1)) : (#2) == 1 ? (#1) : (#2) == 0 ? 1 : (#2) == -1 ? 1 / (#1) : (#2) == -2 ? 1 / ((#1) * (#1)) : pow((#1), (#2));" },
1342
1342
  { "binop", "power", "cmplx64",
1343
- "(#3) = cpow((#1), (#2));" },
1343
+ "(#3) = (#2) == 2 ? (#1) * (#1) : (#2) == 3 ? (#1) * (#1) * (#1) : (#2) == 4 ? ((#1) * (#1)) * ((#1) * (#1)) : (#2) == 1 ? (#1) : (#2) == 0 ? 1 : (#2) == -1 ? 1 / (#1) : (#2) == -2 ? 1 / ((#1) * (#1)) : cpow((#1), (#2));" },
1344
1344
  { "binop", "power", "cmplx128",
1345
- "(#3) = cpow((#1), (#2));" },
1345
+ "(#3) = (#2) == 2 ? (#1) * (#1) : (#2) == 3 ? (#1) * (#1) * (#1) : (#2) == 4 ? ((#1) * (#1)) * ((#1) * (#1)) : (#2) == 1 ? (#1) : (#2) == 0 ? 1 : (#2) == -1 ? 1 / (#1) : (#2) == -2 ? 1 / ((#1) * (#1)) : cpow((#1), (#2));" },
1346
1346
  { "binop", "copysign", "float32",
1347
1347
  "(#3) = copysignf((#1), (#2));" },
1348
1348
  { "binop", "copysign", "float64",
@@ -1703,7 +1703,7 @@ rb_ca_s_kernel_body (VALUE klass, VALUE rkind, VALUE rname, VALUE rtype)
1703
1703
  /* CArray.__kernel_helpers__ -> String: the C a body above may call
1704
1704
  beyond the standard library, for the caller to put ahead of it. */
1705
1705
  static const char ca_kernel_helpers[] =
1706
- "\n/* x raised to a non-negative power, by binary exponentiation. The power\n is unsigned so that the magnitude of INT64_MIN is representable. */\n#define op_powi_magnitude(type) \\\nstatic inline type \\\nop_powi_mag_## type (type x, uint64_t p) \\\n{ \\\n type r=1; \\\n\\\n switch(p) { \\\n case 2: return x*x; \\\n case 3: return x*x*x; \\\n case 0: return 1; \\\n case 1: return x; \\\n } \\\n while (p) { \\\n if ( p & 1 ) r *= x; \\\n x *= x; \\\n p >>= 1; \\\n } \\\n return r; \\\n}\n\n/* An integer to a negative power is 1/x^|p| in integer division, which is\n decided by x alone: 0 has no reciprocal, 1 and -1 keep their magnitude,\n anything larger truncates to 0. Answering it that way, rather than by\n computing x^|p|, keeps a power that overflows -- 2 ** -64 -- from wrapping\n to a zero divisor. */\n#define op_powi(type) \\\nop_powi_magnitude(type) \\\nstatic inline type \\\nop_powi_## type (type x, int64_t p) \\\n{ \\\n if ( p < 0 ) { \\\n if ( x == 0 ) ca_zerodiv(); \\\n if ( x == 1 ) return 1; \\\n if ( x == (type) -1 ) return ( p % 2 ) ? x : 1; \\\n return 0; \\\n } \\\n return op_powi_mag_## type(x, (uint64_t) p); \\\n}\n\n/* An unsigned x is never -1; (type) -1 is its largest value. */\n#define op_powi_u(type) \\\nop_powi_magnitude(type) \\\nstatic inline type \\\nop_powi_## type (type x, int64_t p) \\\n{ \\\n if ( p < 0 ) { \\\n if ( x == 0 ) ca_zerodiv(); \\\n return ( x == 1 ) ? 1 : 0; \\\n } \\\n return op_powi_mag_## type(x, (uint64_t) p); \\\n}\n\n#define op_powi_fc(type) \\\nop_powi_magnitude(type) \\\nstatic inline type \\\nop_powi_## type (type x, int64_t p) \\\n{ \\\n if ( p < 0 ) { \\\n return 1 / op_powi_mag_## type(x, (uint64_t) 0 - (uint64_t) p); \\\n } \\\n return op_powi_mag_## type(x, (uint64_t) p); \\\n}\n\nop_powi(int8_t)\nop_powi_u(uint8_t)\nop_powi(int16_t)\nop_powi_u(uint16_t)\nop_powi(int32_t)\nop_powi_u(uint32_t)\nop_powi(int64_t)\nop_powi_u(uint64_t)\nop_powi_fc(float32_t)\nop_powi_fc(float64_t)\n\n";
1706
+ "\n/* x raised to a non-negative power, by binary exponentiation. The power\n is unsigned so that the magnitude of INT64_MIN is representable. */\n#define op_powi_magnitude(type) \\\nstatic inline type \\\nop_powi_mag_## type (type x, uint64_t p) \\\n{ \\\n type r=1; \\\n\\\n switch(p) { \\\n case 2: return x*x; \\\n case 3: return x*x*x; \\\n case 0: return 1; \\\n case 1: return x; \\\n } \\\n while (p) { \\\n if ( p & 1 ) r *= x; \\\n x *= x; \\\n p >>= 1; \\\n } \\\n return r; \\\n}\n\n/* An integer to a negative power is 1/x^|p| in integer division, which is\n decided by x alone: 0 has no reciprocal, 1 and -1 keep their magnitude,\n anything larger truncates to 0. Answering it that way, rather than by\n computing x^|p|, keeps a power that overflows -- 2 ** -64 -- from wrapping\n to a zero divisor. */\n#define op_powi(type) \\\nop_powi_magnitude(type) \\\nstatic inline type \\\nop_powi_## type (type x, int64_t p) \\\n{ \\\n if ( p < 0 ) { \\\n if ( x == 0 ) ca_zerodiv(); \\\n if ( x == 1 ) return 1; \\\n if ( x == (type) -1 ) return ( p % 2 ) ? x : 1; \\\n return 0; \\\n } \\\n return op_powi_mag_## type(x, (uint64_t) p); \\\n}\n\n/* An unsigned x is never -1; (type) -1 is its largest value. */\n#define op_powi_u(type) \\\nop_powi_magnitude(type) \\\nstatic inline type \\\nop_powi_## type (type x, int64_t p) \\\n{ \\\n if ( p < 0 ) { \\\n if ( x == 0 ) ca_zerodiv(); \\\n return ( x == 1 ) ? 1 : 0; \\\n } \\\n return op_powi_mag_## type(x, (uint64_t) p); \\\n}\n\nop_powi(int8_t)\nop_powi_u(uint8_t)\nop_powi(int16_t)\nop_powi_u(uint16_t)\nop_powi(int32_t)\nop_powi_u(uint32_t)\nop_powi(int64_t)\nop_powi_u(uint64_t)\n\n";
1707
1707
 
1708
1708
  static VALUE
1709
1709
  rb_ca_s_kernel_helpers (VALUE klass)