carray 3.0.4 → 3.0.6

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 (155) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +438 -0
  3. data/README.md +1 -1
  4. data/carray.gemspec +3 -2
  5. data/ext/ca_array_pool.c +25 -1
  6. data/ext/ca_axis_dispatch.c +19 -20
  7. data/ext/ca_axis_group.c +1 -1
  8. data/ext/ca_categorical_iterator.c +34 -27
  9. data/ext/ca_compare.c +4 -4
  10. data/ext/ca_composite_dispatch.c +9 -9
  11. data/ext/ca_kernel_iterator.c +122 -237
  12. data/ext/ca_kernel_iterator.h +522 -337
  13. data/ext/ca_obj_array.c +69 -19
  14. data/ext/ca_obj_bincmp.c +10 -1
  15. data/ext/ca_obj_binop.c +11 -1
  16. data/ext/ca_obj_bitarray.c +5 -1
  17. data/ext/ca_obj_bitfield.c +60 -43
  18. data/ext/ca_obj_byte_swap.c +4 -1
  19. data/ext/ca_obj_const_string.c +15 -3
  20. data/ext/ca_obj_face.c +44 -1
  21. data/ext/ca_obj_fake.c +3 -1
  22. data/ext/ca_obj_field.c +13 -3
  23. data/ext/ca_obj_grid.c +219 -17
  24. data/ext/ca_obj_meld.c +69 -113
  25. data/ext/ca_obj_moncmp.c +9 -1
  26. data/ext/ca_obj_monop.c +86 -12
  27. data/ext/ca_obj_object.c +118 -32
  28. data/ext/ca_obj_record.c +3 -0
  29. data/ext/ca_obj_reduce.c +19 -1
  30. data/ext/ca_obj_refer.c +80 -26
  31. data/ext/ca_obj_remap.c +69 -10
  32. data/ext/ca_obj_roll.c +27 -6
  33. data/ext/ca_obj_select.c +38 -6
  34. data/ext/ca_obj_select_axis.c +1 -0
  35. data/ext/ca_obj_shift.c +32 -7
  36. data/ext/ca_obj_stack.c +311 -111
  37. data/ext/ca_obj_stride.c +159 -64
  38. data/ext/ca_obj_string.c +27 -2
  39. data/ext/ca_obj_tile.c +28 -7
  40. data/ext/ca_obj_transpose.c +8 -4
  41. data/ext/ca_obj_triop.c +12 -1
  42. data/ext/ca_obj_window.c +80 -50
  43. data/ext/ca_op_ipower.c +12 -12
  44. data/ext/ca_sort_kernels.h +6 -3
  45. data/ext/caframe_csv_reader.c +1 -1
  46. data/ext/carray.h +35 -1
  47. data/ext/carray_access.c +43 -67
  48. data/ext/carray_address_basis.c +134 -0
  49. data/ext/carray_attribute.c +32 -0
  50. data/ext/carray_broadcast.c +3 -4
  51. data/ext/carray_build_flags.h +1 -1
  52. data/ext/carray_cast.c +251 -93
  53. data/ext/carray_cast_func.rb +56 -26
  54. data/ext/carray_conversion.c +11 -7
  55. data/ext/carray_core.c +814 -72
  56. data/ext/carray_count.c +6 -0
  57. data/ext/carray_element.c +22 -13
  58. data/ext/carray_factorize.c +20 -20
  59. data/ext/carray_generate.c +8 -2
  60. data/ext/carray_histogram.c +26 -4
  61. data/ext/carray_index_classifier.c +4 -4
  62. data/ext/carray_internal.h +159 -12
  63. data/ext/carray_kernels_bincmp.c +2174 -170
  64. data/ext/carray_kernels_binop.c +25653 -5487
  65. data/ext/carray_kernels_init.c +8 -8
  66. data/ext/carray_kernels_moncmp.c +96 -96
  67. data/ext/carray_kernels_monop.c +12253 -5235
  68. data/ext/carray_kernels_reduce_aggregate.c +6150 -2423
  69. data/ext/carray_kernels_reduce_boolean.c +1533 -15
  70. data/ext/carray_kernels_reduce_cumulative.c +2442 -882
  71. data/ext/carray_kernels_reduce_extreme.c +5658 -1661
  72. data/ext/carray_kernels_reduce_variance.c +2534 -402
  73. data/ext/carray_kernels_scan.c +368 -368
  74. data/ext/carray_kernels_search.c +4551 -604
  75. data/ext/carray_kernels_sort.c +659 -751
  76. data/ext/carray_kernels_triop.c +114 -114
  77. data/ext/carray_key_windows.c +4 -0
  78. data/ext/carray_lazy.c +47 -0
  79. data/ext/carray_loop.c +1 -1
  80. data/ext/carray_mask.c +175 -161
  81. data/ext/carray_median_percentile.c +4 -4
  82. data/ext/carray_memory_view.c +15 -9
  83. data/ext/carray_operator.c +152 -49
  84. data/ext/carray_order.c +230 -10
  85. data/ext/carray_random.c +22 -19
  86. data/ext/carray_scatter.c +24 -7
  87. data/ext/carray_slab.c +128 -29
  88. data/ext/carray_sort.c +224 -16
  89. data/ext/carray_sort_kernel.c +5 -7
  90. data/ext/carray_struct.c +35 -43
  91. data/ext/carray_test.c +74 -19
  92. data/ext/carray_time_text.c +6 -4
  93. data/ext/carray_utils.c +63 -21
  94. data/ext/extconf.rb +11 -0
  95. data/ext/mkkernel.rb +546 -199
  96. data/ext/ruby_carray.c +4 -1
  97. data/ext/version.h +4 -4
  98. data/lib/carray/attribute.rb +42 -5
  99. data/lib/carray/autoload_carray.rb +3 -3
  100. data/lib/carray/autoload_method_extension.rb +5 -3
  101. data/lib/carray/axis_group.rb +13 -7
  102. data/lib/carray/basics.rb +28 -8
  103. data/lib/carray/block_iterator.rb +17 -3
  104. data/lib/carray/categorical.rb +35 -23
  105. data/lib/carray/categorical_iterator.rb +8 -8
  106. data/lib/carray/complex.rb +2 -2
  107. data/lib/carray/conditional.rb +3 -2
  108. data/lib/carray/const_string.rb +10 -0
  109. data/lib/carray/data_type_extension.rb +8 -1
  110. data/lib/carray/fixlen_string.rb +41 -2
  111. data/lib/carray/frame/column_verbs.rb +48 -16
  112. data/lib/carray/frame/concat.rb +17 -3
  113. data/lib/carray/frame/convert.rb +19 -0
  114. data/lib/carray/frame/csv_parser.rb +32 -32
  115. data/lib/carray/frame/describe.rb +4 -2
  116. data/lib/carray/frame/frame.rb +405 -85
  117. data/lib/carray/frame/group.rb +777 -64
  118. data/lib/carray/frame/io.rb +212 -72
  119. data/lib/carray/frame/join.rb +146 -37
  120. data/lib/carray/frame/records.rb +3 -3
  121. data/lib/carray/frame/reshape.rb +89 -11
  122. data/lib/carray/frame/sort.rb +57 -9
  123. data/lib/carray/frame/verbs.rb +384 -49
  124. data/lib/carray/frame/windows.rb +44 -6
  125. data/lib/carray/fuse_source.rb +31 -2
  126. data/lib/carray/inspect.rb +7 -2
  127. data/lib/carray/iterator.rb +32 -0
  128. data/lib/carray/lazy.rb +52 -8
  129. data/lib/carray/mask_gap_fill.rb +37 -17
  130. data/lib/carray/meld_reduce.rb +1 -1
  131. data/lib/carray/methods/choose.rb +3 -2
  132. data/lib/carray/methods/is_in.rb +8 -1
  133. data/lib/carray/methods/meshgrid.rb +3 -1
  134. data/lib/carray/runtime.rb +47 -8
  135. data/lib/carray/segment_iterator.rb +35 -16
  136. data/lib/carray/serialize.rb +53 -19
  137. data/lib/carray/stack.rb +33 -18
  138. data/lib/carray/string.rb +8 -0
  139. data/lib/carray/string_operation_extension.rb +13 -5
  140. data/lib/carray/struct_builder.rb +5 -3
  141. data/lib/carray/time.rb +112 -68
  142. data/lib/carray/window_iterator.rb +16 -4
  143. data/yard-stubs/ca_obj_array.rb +26 -1
  144. data/yard-stubs/ca_obj_transpose.rb +5 -4
  145. data/yard-stubs/carray_attribute.rb +3 -1
  146. data/yard-stubs/carray_cast.rb +10 -5
  147. data/yard-stubs/carray_conversion.rb +13 -3
  148. data/yard-stubs/carray_element.rb +7 -6
  149. data/yard-stubs/carray_mask.rb +28 -4
  150. data/yard-stubs/carray_math.rb +45 -20
  151. data/yard-stubs/carray_memory_view.rb +7 -0
  152. data/yard-stubs/carray_order.rb +100 -4
  153. data/yard-stubs/carray_scatter.rb +7 -5
  154. data/yard-stubs/carray_test.rb +7 -4
  155. metadata +18 -4
@@ -52,8 +52,8 @@ ca_bincmp_feq_float32_t (ca_size_t n, boolean8_t *m,
52
52
  char *ptr3, ca_size_t b3, ca_size_t i3,
53
53
  double tol)
54
54
  {
55
- float *q1 = (float *) ptr1, *q2 = (float *) ptr2;
56
- float *p1 = q1, *p2 = q2;
55
+ ca_u_float32_t *q1 = (ca_u_float32_t *) ptr1, *q2 = (ca_u_float32_t *) ptr2;
56
+ ca_u_float32_t *p1 = q1, *p2 = q2;
57
57
  boolean8_t *q3 = (boolean8_t *) ptr3;
58
58
  boolean8_t *p3 = q3;
59
59
  ca_size_t k;
@@ -68,22 +68,50 @@ ca_bincmp_feq_float32_t (ca_size_t n, boolean8_t *m,
68
68
  p2 = q2 + k*i2;
69
69
  p3 = q3 + k*i3;
70
70
  {
71
- float f1a = fabs((float64_t) *p1);
72
- float f2a = fabs((float64_t) *p2);
73
- float fmax = (f1a > f2a) ? f1a : f2a;
71
+ ca_u_float32_t f1a = fabs((float64_t) *p1);
72
+ ca_u_float32_t f2a = fabs((float64_t) *p2);
73
+ ca_u_float32_t fmax = (f1a > f2a) ? f1a : f2a;
74
74
  (*p3) = ( fabs(((float64_t) *p1)-( (float64_t) *p2)) <= fmax * FLT_EPSILON ) ? 1 : 0;
75
75
  }
76
76
  }
77
77
  }
78
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
79
+ /* scalar on the right: read it once, so the boolean store
80
+ cannot be taken to change it and the loop vectorizes */
81
+ ca_u_float32_t sv = *q2;
82
+ p2 = &sv;
83
+ for (k=0; k<n; k++) {
84
+ p1 = q1 + k;
85
+ p3 = q3 + k;
86
+ {
87
+ ca_u_float32_t f1a = fabs((float64_t) *p1);
88
+ ca_u_float32_t f2a = fabs((float64_t) *p2);
89
+ ca_u_float32_t fmax = (f1a > f2a) ? f1a : f2a;
90
+ (*p3) = ( fabs(((float64_t) *p1)-( (float64_t) *p2)) <= fmax * FLT_EPSILON ) ? 1 : 0;
91
+ }
92
+ }
93
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
94
+ ca_u_float32_t sv = *q1;
95
+ p1 = &sv;
96
+ for (k=0; k<n; k++) {
97
+ p2 = q2 + k;
98
+ p3 = q3 + k;
99
+ {
100
+ ca_u_float32_t f1a = fabs((float64_t) *p1);
101
+ ca_u_float32_t f2a = fabs((float64_t) *p2);
102
+ ca_u_float32_t fmax = (f1a > f2a) ? f1a : f2a;
103
+ (*p3) = ( fabs(((float64_t) *p1)-( (float64_t) *p2)) <= fmax * FLT_EPSILON ) ? 1 : 0;
104
+ }
105
+ }
78
106
  } else {
79
107
  for (k=0; k<n; k++) {
80
108
  p1 = q1 + k*i1;
81
109
  p2 = q2 + k*i2;
82
110
  p3 = q3 + k*i3;
83
111
  {
84
- float f1a = fabs((float64_t) *p1);
85
- float f2a = fabs((float64_t) *p2);
86
- float fmax = (f1a > f2a) ? f1a : f2a;
112
+ ca_u_float32_t f1a = fabs((float64_t) *p1);
113
+ ca_u_float32_t f2a = fabs((float64_t) *p2);
114
+ ca_u_float32_t fmax = (f1a > f2a) ? f1a : f2a;
87
115
  (*p3) = ( fabs(((float64_t) *p1)-( (float64_t) *p2)) <= fmax * FLT_EPSILON ) ? 1 : 0;
88
116
  }
89
117
  }
@@ -97,8 +125,8 @@ ca_bincmp_feq_float64_t (ca_size_t n, boolean8_t *m,
97
125
  char *ptr3, ca_size_t b3, ca_size_t i3,
98
126
  double tol)
99
127
  {
100
- double *q1 = (double *) ptr1, *q2 = (double *) ptr2;
101
- double *p1 = q1, *p2 = q2;
128
+ ca_u_float64_t *q1 = (ca_u_float64_t *) ptr1, *q2 = (ca_u_float64_t *) ptr2;
129
+ ca_u_float64_t *p1 = q1, *p2 = q2;
102
130
  boolean8_t *q3 = (boolean8_t *) ptr3;
103
131
  boolean8_t *p3 = q3;
104
132
  ca_size_t k;
@@ -113,22 +141,50 @@ ca_bincmp_feq_float64_t (ca_size_t n, boolean8_t *m,
113
141
  p2 = q2 + k*i2;
114
142
  p3 = q3 + k*i3;
115
143
  {
116
- double f1a = fabs((float64_t) *p1);
117
- double f2a = fabs((float64_t) *p2);
118
- double fmax = (f1a > f2a) ? f1a : f2a;
144
+ ca_u_float64_t f1a = fabs((float64_t) *p1);
145
+ ca_u_float64_t f2a = fabs((float64_t) *p2);
146
+ ca_u_float64_t fmax = (f1a > f2a) ? f1a : f2a;
119
147
  (*p3) = ( fabs(((float64_t) *p1)-( (float64_t) *p2)) <= fmax * DBL_EPSILON ) ? 1 : 0;
120
148
  }
121
149
  }
122
150
  }
151
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
152
+ /* scalar on the right: read it once, so the boolean store
153
+ cannot be taken to change it and the loop vectorizes */
154
+ ca_u_float64_t sv = *q2;
155
+ p2 = &sv;
156
+ for (k=0; k<n; k++) {
157
+ p1 = q1 + k;
158
+ p3 = q3 + k;
159
+ {
160
+ ca_u_float64_t f1a = fabs((float64_t) *p1);
161
+ ca_u_float64_t f2a = fabs((float64_t) *p2);
162
+ ca_u_float64_t fmax = (f1a > f2a) ? f1a : f2a;
163
+ (*p3) = ( fabs(((float64_t) *p1)-( (float64_t) *p2)) <= fmax * DBL_EPSILON ) ? 1 : 0;
164
+ }
165
+ }
166
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
167
+ ca_u_float64_t sv = *q1;
168
+ p1 = &sv;
169
+ for (k=0; k<n; k++) {
170
+ p2 = q2 + k;
171
+ p3 = q3 + k;
172
+ {
173
+ ca_u_float64_t f1a = fabs((float64_t) *p1);
174
+ ca_u_float64_t f2a = fabs((float64_t) *p2);
175
+ ca_u_float64_t fmax = (f1a > f2a) ? f1a : f2a;
176
+ (*p3) = ( fabs(((float64_t) *p1)-( (float64_t) *p2)) <= fmax * DBL_EPSILON ) ? 1 : 0;
177
+ }
178
+ }
123
179
  } else {
124
180
  for (k=0; k<n; k++) {
125
181
  p1 = q1 + k*i1;
126
182
  p2 = q2 + k*i2;
127
183
  p3 = q3 + k*i3;
128
184
  {
129
- double f1a = fabs((float64_t) *p1);
130
- double f2a = fabs((float64_t) *p2);
131
- double fmax = (f1a > f2a) ? f1a : f2a;
185
+ ca_u_float64_t f1a = fabs((float64_t) *p1);
186
+ ca_u_float64_t f2a = fabs((float64_t) *p2);
187
+ ca_u_float64_t fmax = (f1a > f2a) ? f1a : f2a;
132
188
  (*p3) = ( fabs(((float64_t) *p1)-( (float64_t) *p2)) <= fmax * DBL_EPSILON ) ? 1 : 0;
133
189
  }
134
190
  }
@@ -226,6 +282,24 @@ ca_bincmp_eq_boolean8_t (ca_size_t n, boolean8_t *m,
226
282
  { (*p3) = ( (*p1) == (*p2) ); }
227
283
  }
228
284
  }
285
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
286
+ /* scalar on the right: read it once, so the boolean store
287
+ cannot be taken to change it and the loop vectorizes */
288
+ boolean8_t sv = *q2;
289
+ p2 = &sv;
290
+ for (k=0; k<n; k++) {
291
+ p1 = q1 + k;
292
+ p3 = q3 + k;
293
+ { (*p3) = ( (*p1) == (*p2) ); }
294
+ }
295
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
296
+ boolean8_t sv = *q1;
297
+ p1 = &sv;
298
+ for (k=0; k<n; k++) {
299
+ p2 = q2 + k;
300
+ p3 = q3 + k;
301
+ { (*p3) = ( (*p1) == (*p2) ); }
302
+ }
229
303
  } else {
230
304
  for (k=0; k<n; k++) {
231
305
  p1 = q1 + k*i1;
@@ -261,6 +335,24 @@ ca_bincmp_eq_int8_t (ca_size_t n, boolean8_t *m,
261
335
  { (*p3) = ( (*p1) == (*p2) ); }
262
336
  }
263
337
  }
338
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
339
+ /* scalar on the right: read it once, so the boolean store
340
+ cannot be taken to change it and the loop vectorizes */
341
+ int8_t sv = *q2;
342
+ p2 = &sv;
343
+ for (k=0; k<n; k++) {
344
+ p1 = q1 + k;
345
+ p3 = q3 + k;
346
+ { (*p3) = ( (*p1) == (*p2) ); }
347
+ }
348
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
349
+ int8_t sv = *q1;
350
+ p1 = &sv;
351
+ for (k=0; k<n; k++) {
352
+ p2 = q2 + k;
353
+ p3 = q3 + k;
354
+ { (*p3) = ( (*p1) == (*p2) ); }
355
+ }
264
356
  } else {
265
357
  for (k=0; k<n; k++) {
266
358
  p1 = q1 + k*i1;
@@ -296,6 +388,24 @@ ca_bincmp_eq_uint8_t (ca_size_t n, boolean8_t *m,
296
388
  { (*p3) = ( (*p1) == (*p2) ); }
297
389
  }
298
390
  }
391
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
392
+ /* scalar on the right: read it once, so the boolean store
393
+ cannot be taken to change it and the loop vectorizes */
394
+ uint8_t sv = *q2;
395
+ p2 = &sv;
396
+ for (k=0; k<n; k++) {
397
+ p1 = q1 + k;
398
+ p3 = q3 + k;
399
+ { (*p3) = ( (*p1) == (*p2) ); }
400
+ }
401
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
402
+ uint8_t sv = *q1;
403
+ p1 = &sv;
404
+ for (k=0; k<n; k++) {
405
+ p2 = q2 + k;
406
+ p3 = q3 + k;
407
+ { (*p3) = ( (*p1) == (*p2) ); }
408
+ }
299
409
  } else {
300
410
  for (k=0; k<n; k++) {
301
411
  p1 = q1 + k*i1;
@@ -313,8 +423,8 @@ ca_bincmp_eq_int16_t (ca_size_t n, boolean8_t *m,
313
423
  char *ptr3, ca_size_t b3, ca_size_t i3,
314
424
  double tol)
315
425
  {
316
- int16_t *q1 = (int16_t *) ptr1, *q2 = (int16_t *) ptr2;
317
- int16_t *p1 = q1, *p2 = q2;
426
+ ca_u_int16_t *q1 = (ca_u_int16_t *) ptr1, *q2 = (ca_u_int16_t *) ptr2;
427
+ ca_u_int16_t *p1 = q1, *p2 = q2;
318
428
  boolean8_t *q3 = (boolean8_t *) ptr3;
319
429
  boolean8_t *p3 = q3;
320
430
  ca_size_t k;
@@ -331,6 +441,24 @@ ca_bincmp_eq_int16_t (ca_size_t n, boolean8_t *m,
331
441
  { (*p3) = ( (*p1) == (*p2) ); }
332
442
  }
333
443
  }
444
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
445
+ /* scalar on the right: read it once, so the boolean store
446
+ cannot be taken to change it and the loop vectorizes */
447
+ ca_u_int16_t sv = *q2;
448
+ p2 = &sv;
449
+ for (k=0; k<n; k++) {
450
+ p1 = q1 + k;
451
+ p3 = q3 + k;
452
+ { (*p3) = ( (*p1) == (*p2) ); }
453
+ }
454
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
455
+ ca_u_int16_t sv = *q1;
456
+ p1 = &sv;
457
+ for (k=0; k<n; k++) {
458
+ p2 = q2 + k;
459
+ p3 = q3 + k;
460
+ { (*p3) = ( (*p1) == (*p2) ); }
461
+ }
334
462
  } else {
335
463
  for (k=0; k<n; k++) {
336
464
  p1 = q1 + k*i1;
@@ -348,8 +476,8 @@ ca_bincmp_eq_uint16_t (ca_size_t n, boolean8_t *m,
348
476
  char *ptr3, ca_size_t b3, ca_size_t i3,
349
477
  double tol)
350
478
  {
351
- uint16_t *q1 = (uint16_t *) ptr1, *q2 = (uint16_t *) ptr2;
352
- uint16_t *p1 = q1, *p2 = q2;
479
+ ca_u_uint16_t *q1 = (ca_u_uint16_t *) ptr1, *q2 = (ca_u_uint16_t *) ptr2;
480
+ ca_u_uint16_t *p1 = q1, *p2 = q2;
353
481
  boolean8_t *q3 = (boolean8_t *) ptr3;
354
482
  boolean8_t *p3 = q3;
355
483
  ca_size_t k;
@@ -366,6 +494,24 @@ ca_bincmp_eq_uint16_t (ca_size_t n, boolean8_t *m,
366
494
  { (*p3) = ( (*p1) == (*p2) ); }
367
495
  }
368
496
  }
497
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
498
+ /* scalar on the right: read it once, so the boolean store
499
+ cannot be taken to change it and the loop vectorizes */
500
+ ca_u_uint16_t sv = *q2;
501
+ p2 = &sv;
502
+ for (k=0; k<n; k++) {
503
+ p1 = q1 + k;
504
+ p3 = q3 + k;
505
+ { (*p3) = ( (*p1) == (*p2) ); }
506
+ }
507
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
508
+ ca_u_uint16_t sv = *q1;
509
+ p1 = &sv;
510
+ for (k=0; k<n; k++) {
511
+ p2 = q2 + k;
512
+ p3 = q3 + k;
513
+ { (*p3) = ( (*p1) == (*p2) ); }
514
+ }
369
515
  } else {
370
516
  for (k=0; k<n; k++) {
371
517
  p1 = q1 + k*i1;
@@ -383,8 +529,8 @@ ca_bincmp_eq_int32_t (ca_size_t n, boolean8_t *m,
383
529
  char *ptr3, ca_size_t b3, ca_size_t i3,
384
530
  double tol)
385
531
  {
386
- int32_t *q1 = (int32_t *) ptr1, *q2 = (int32_t *) ptr2;
387
- int32_t *p1 = q1, *p2 = q2;
532
+ ca_u_int32_t *q1 = (ca_u_int32_t *) ptr1, *q2 = (ca_u_int32_t *) ptr2;
533
+ ca_u_int32_t *p1 = q1, *p2 = q2;
388
534
  boolean8_t *q3 = (boolean8_t *) ptr3;
389
535
  boolean8_t *p3 = q3;
390
536
  ca_size_t k;
@@ -401,6 +547,24 @@ ca_bincmp_eq_int32_t (ca_size_t n, boolean8_t *m,
401
547
  { (*p3) = ( (*p1) == (*p2) ); }
402
548
  }
403
549
  }
550
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
551
+ /* scalar on the right: read it once, so the boolean store
552
+ cannot be taken to change it and the loop vectorizes */
553
+ ca_u_int32_t sv = *q2;
554
+ p2 = &sv;
555
+ for (k=0; k<n; k++) {
556
+ p1 = q1 + k;
557
+ p3 = q3 + k;
558
+ { (*p3) = ( (*p1) == (*p2) ); }
559
+ }
560
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
561
+ ca_u_int32_t sv = *q1;
562
+ p1 = &sv;
563
+ for (k=0; k<n; k++) {
564
+ p2 = q2 + k;
565
+ p3 = q3 + k;
566
+ { (*p3) = ( (*p1) == (*p2) ); }
567
+ }
404
568
  } else {
405
569
  for (k=0; k<n; k++) {
406
570
  p1 = q1 + k*i1;
@@ -418,8 +582,8 @@ ca_bincmp_eq_uint32_t (ca_size_t n, boolean8_t *m,
418
582
  char *ptr3, ca_size_t b3, ca_size_t i3,
419
583
  double tol)
420
584
  {
421
- uint32_t *q1 = (uint32_t *) ptr1, *q2 = (uint32_t *) ptr2;
422
- uint32_t *p1 = q1, *p2 = q2;
585
+ ca_u_uint32_t *q1 = (ca_u_uint32_t *) ptr1, *q2 = (ca_u_uint32_t *) ptr2;
586
+ ca_u_uint32_t *p1 = q1, *p2 = q2;
423
587
  boolean8_t *q3 = (boolean8_t *) ptr3;
424
588
  boolean8_t *p3 = q3;
425
589
  ca_size_t k;
@@ -436,6 +600,24 @@ ca_bincmp_eq_uint32_t (ca_size_t n, boolean8_t *m,
436
600
  { (*p3) = ( (*p1) == (*p2) ); }
437
601
  }
438
602
  }
603
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
604
+ /* scalar on the right: read it once, so the boolean store
605
+ cannot be taken to change it and the loop vectorizes */
606
+ ca_u_uint32_t sv = *q2;
607
+ p2 = &sv;
608
+ for (k=0; k<n; k++) {
609
+ p1 = q1 + k;
610
+ p3 = q3 + k;
611
+ { (*p3) = ( (*p1) == (*p2) ); }
612
+ }
613
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
614
+ ca_u_uint32_t sv = *q1;
615
+ p1 = &sv;
616
+ for (k=0; k<n; k++) {
617
+ p2 = q2 + k;
618
+ p3 = q3 + k;
619
+ { (*p3) = ( (*p1) == (*p2) ); }
620
+ }
439
621
  } else {
440
622
  for (k=0; k<n; k++) {
441
623
  p1 = q1 + k*i1;
@@ -453,8 +635,8 @@ ca_bincmp_eq_int64_t (ca_size_t n, boolean8_t *m,
453
635
  char *ptr3, ca_size_t b3, ca_size_t i3,
454
636
  double tol)
455
637
  {
456
- int64_t *q1 = (int64_t *) ptr1, *q2 = (int64_t *) ptr2;
457
- int64_t *p1 = q1, *p2 = q2;
638
+ ca_u_int64_t *q1 = (ca_u_int64_t *) ptr1, *q2 = (ca_u_int64_t *) ptr2;
639
+ ca_u_int64_t *p1 = q1, *p2 = q2;
458
640
  boolean8_t *q3 = (boolean8_t *) ptr3;
459
641
  boolean8_t *p3 = q3;
460
642
  ca_size_t k;
@@ -471,6 +653,24 @@ ca_bincmp_eq_int64_t (ca_size_t n, boolean8_t *m,
471
653
  { (*p3) = ( (*p1) == (*p2) ); }
472
654
  }
473
655
  }
656
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
657
+ /* scalar on the right: read it once, so the boolean store
658
+ cannot be taken to change it and the loop vectorizes */
659
+ ca_u_int64_t sv = *q2;
660
+ p2 = &sv;
661
+ for (k=0; k<n; k++) {
662
+ p1 = q1 + k;
663
+ p3 = q3 + k;
664
+ { (*p3) = ( (*p1) == (*p2) ); }
665
+ }
666
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
667
+ ca_u_int64_t sv = *q1;
668
+ p1 = &sv;
669
+ for (k=0; k<n; k++) {
670
+ p2 = q2 + k;
671
+ p3 = q3 + k;
672
+ { (*p3) = ( (*p1) == (*p2) ); }
673
+ }
474
674
  } else {
475
675
  for (k=0; k<n; k++) {
476
676
  p1 = q1 + k*i1;
@@ -488,8 +688,8 @@ ca_bincmp_eq_uint64_t (ca_size_t n, boolean8_t *m,
488
688
  char *ptr3, ca_size_t b3, ca_size_t i3,
489
689
  double tol)
490
690
  {
491
- uint64_t *q1 = (uint64_t *) ptr1, *q2 = (uint64_t *) ptr2;
492
- uint64_t *p1 = q1, *p2 = q2;
691
+ ca_u_uint64_t *q1 = (ca_u_uint64_t *) ptr1, *q2 = (ca_u_uint64_t *) ptr2;
692
+ ca_u_uint64_t *p1 = q1, *p2 = q2;
493
693
  boolean8_t *q3 = (boolean8_t *) ptr3;
494
694
  boolean8_t *p3 = q3;
495
695
  ca_size_t k;
@@ -506,6 +706,24 @@ ca_bincmp_eq_uint64_t (ca_size_t n, boolean8_t *m,
506
706
  { (*p3) = ( (*p1) == (*p2) ); }
507
707
  }
508
708
  }
709
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
710
+ /* scalar on the right: read it once, so the boolean store
711
+ cannot be taken to change it and the loop vectorizes */
712
+ ca_u_uint64_t sv = *q2;
713
+ p2 = &sv;
714
+ for (k=0; k<n; k++) {
715
+ p1 = q1 + k;
716
+ p3 = q3 + k;
717
+ { (*p3) = ( (*p1) == (*p2) ); }
718
+ }
719
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
720
+ ca_u_uint64_t sv = *q1;
721
+ p1 = &sv;
722
+ for (k=0; k<n; k++) {
723
+ p2 = q2 + k;
724
+ p3 = q3 + k;
725
+ { (*p3) = ( (*p1) == (*p2) ); }
726
+ }
509
727
  } else {
510
728
  for (k=0; k<n; k++) {
511
729
  p1 = q1 + k*i1;
@@ -523,8 +741,8 @@ ca_bincmp_eq_float32_t (ca_size_t n, boolean8_t *m,
523
741
  char *ptr3, ca_size_t b3, ca_size_t i3,
524
742
  double tol)
525
743
  {
526
- float *q1 = (float *) ptr1, *q2 = (float *) ptr2;
527
- float *p1 = q1, *p2 = q2;
744
+ ca_u_float32_t *q1 = (ca_u_float32_t *) ptr1, *q2 = (ca_u_float32_t *) ptr2;
745
+ ca_u_float32_t *p1 = q1, *p2 = q2;
528
746
  boolean8_t *q3 = (boolean8_t *) ptr3;
529
747
  boolean8_t *p3 = q3;
530
748
  ca_size_t k;
@@ -541,6 +759,24 @@ ca_bincmp_eq_float32_t (ca_size_t n, boolean8_t *m,
541
759
  { (*p3) = ( (*p1) == (*p2) ); }
542
760
  }
543
761
  }
762
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
763
+ /* scalar on the right: read it once, so the boolean store
764
+ cannot be taken to change it and the loop vectorizes */
765
+ ca_u_float32_t sv = *q2;
766
+ p2 = &sv;
767
+ for (k=0; k<n; k++) {
768
+ p1 = q1 + k;
769
+ p3 = q3 + k;
770
+ { (*p3) = ( (*p1) == (*p2) ); }
771
+ }
772
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
773
+ ca_u_float32_t sv = *q1;
774
+ p1 = &sv;
775
+ for (k=0; k<n; k++) {
776
+ p2 = q2 + k;
777
+ p3 = q3 + k;
778
+ { (*p3) = ( (*p1) == (*p2) ); }
779
+ }
544
780
  } else {
545
781
  for (k=0; k<n; k++) {
546
782
  p1 = q1 + k*i1;
@@ -558,8 +794,8 @@ ca_bincmp_eq_float64_t (ca_size_t n, boolean8_t *m,
558
794
  char *ptr3, ca_size_t b3, ca_size_t i3,
559
795
  double tol)
560
796
  {
561
- double *q1 = (double *) ptr1, *q2 = (double *) ptr2;
562
- double *p1 = q1, *p2 = q2;
797
+ ca_u_float64_t *q1 = (ca_u_float64_t *) ptr1, *q2 = (ca_u_float64_t *) ptr2;
798
+ ca_u_float64_t *p1 = q1, *p2 = q2;
563
799
  boolean8_t *q3 = (boolean8_t *) ptr3;
564
800
  boolean8_t *p3 = q3;
565
801
  ca_size_t k;
@@ -576,6 +812,24 @@ ca_bincmp_eq_float64_t (ca_size_t n, boolean8_t *m,
576
812
  { (*p3) = ( (*p1) == (*p2) ); }
577
813
  }
578
814
  }
815
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
816
+ /* scalar on the right: read it once, so the boolean store
817
+ cannot be taken to change it and the loop vectorizes */
818
+ ca_u_float64_t sv = *q2;
819
+ p2 = &sv;
820
+ for (k=0; k<n; k++) {
821
+ p1 = q1 + k;
822
+ p3 = q3 + k;
823
+ { (*p3) = ( (*p1) == (*p2) ); }
824
+ }
825
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
826
+ ca_u_float64_t sv = *q1;
827
+ p1 = &sv;
828
+ for (k=0; k<n; k++) {
829
+ p2 = q2 + k;
830
+ p3 = q3 + k;
831
+ { (*p3) = ( (*p1) == (*p2) ); }
832
+ }
579
833
  } else {
580
834
  for (k=0; k<n; k++) {
581
835
  p1 = q1 + k*i1;
@@ -611,6 +865,24 @@ ca_bincmp_eq_VALUE (ca_size_t n, boolean8_t *m,
611
865
  { (*p3) = RTEST(rb_funcall((*p1), rb_intern("=="), 1, (*p2))) ? 1 : 0; }
612
866
  }
613
867
  }
868
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
869
+ /* scalar on the right: read it once, so the boolean store
870
+ cannot be taken to change it and the loop vectorizes */
871
+ VALUE sv = *q2;
872
+ p2 = &sv;
873
+ for (k=0; k<n; k++) {
874
+ p1 = q1 + k;
875
+ p3 = q3 + k;
876
+ { (*p3) = RTEST(rb_funcall((*p1), rb_intern("=="), 1, (*p2))) ? 1 : 0; }
877
+ }
878
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
879
+ VALUE sv = *q1;
880
+ p1 = &sv;
881
+ for (k=0; k<n; k++) {
882
+ p2 = q2 + k;
883
+ p3 = q3 + k;
884
+ { (*p3) = RTEST(rb_funcall((*p1), rb_intern("=="), 1, (*p2))) ? 1 : 0; }
885
+ }
614
886
  } else {
615
887
  for (k=0; k<n; k++) {
616
888
  p1 = q1 + k*i1;
@@ -628,8 +900,8 @@ ca_bincmp_eq_cmplx64_t (ca_size_t n, boolean8_t *m,
628
900
  char *ptr3, ca_size_t b3, ca_size_t i3,
629
901
  double tol)
630
902
  {
631
- cmplx64_t *q1 = (cmplx64_t *) ptr1, *q2 = (cmplx64_t *) ptr2;
632
- cmplx64_t *p1 = q1, *p2 = q2;
903
+ ca_u_cmplx64_t *q1 = (ca_u_cmplx64_t *) ptr1, *q2 = (ca_u_cmplx64_t *) ptr2;
904
+ ca_u_cmplx64_t *p1 = q1, *p2 = q2;
633
905
  boolean8_t *q3 = (boolean8_t *) ptr3;
634
906
  boolean8_t *p3 = q3;
635
907
  ca_size_t k;
@@ -646,6 +918,24 @@ ca_bincmp_eq_cmplx64_t (ca_size_t n, boolean8_t *m,
646
918
  { (*p3) = (*p1) == (*p2); }
647
919
  }
648
920
  }
921
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
922
+ /* scalar on the right: read it once, so the boolean store
923
+ cannot be taken to change it and the loop vectorizes */
924
+ ca_u_cmplx64_t sv = *q2;
925
+ p2 = &sv;
926
+ for (k=0; k<n; k++) {
927
+ p1 = q1 + k;
928
+ p3 = q3 + k;
929
+ { (*p3) = (*p1) == (*p2); }
930
+ }
931
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
932
+ ca_u_cmplx64_t sv = *q1;
933
+ p1 = &sv;
934
+ for (k=0; k<n; k++) {
935
+ p2 = q2 + k;
936
+ p3 = q3 + k;
937
+ { (*p3) = (*p1) == (*p2); }
938
+ }
649
939
  } else {
650
940
  for (k=0; k<n; k++) {
651
941
  p1 = q1 + k*i1;
@@ -663,8 +953,8 @@ ca_bincmp_eq_cmplx128_t (ca_size_t n, boolean8_t *m,
663
953
  char *ptr3, ca_size_t b3, ca_size_t i3,
664
954
  double tol)
665
955
  {
666
- cmplx128_t *q1 = (cmplx128_t *) ptr1, *q2 = (cmplx128_t *) ptr2;
667
- cmplx128_t *p1 = q1, *p2 = q2;
956
+ ca_u_cmplx128_t *q1 = (ca_u_cmplx128_t *) ptr1, *q2 = (ca_u_cmplx128_t *) ptr2;
957
+ ca_u_cmplx128_t *p1 = q1, *p2 = q2;
668
958
  boolean8_t *q3 = (boolean8_t *) ptr3;
669
959
  boolean8_t *p3 = q3;
670
960
  ca_size_t k;
@@ -681,6 +971,24 @@ ca_bincmp_eq_cmplx128_t (ca_size_t n, boolean8_t *m,
681
971
  { (*p3) = (*p1) == (*p2); }
682
972
  }
683
973
  }
974
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
975
+ /* scalar on the right: read it once, so the boolean store
976
+ cannot be taken to change it and the loop vectorizes */
977
+ ca_u_cmplx128_t sv = *q2;
978
+ p2 = &sv;
979
+ for (k=0; k<n; k++) {
980
+ p1 = q1 + k;
981
+ p3 = q3 + k;
982
+ { (*p3) = (*p1) == (*p2); }
983
+ }
984
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
985
+ ca_u_cmplx128_t sv = *q1;
986
+ p1 = &sv;
987
+ for (k=0; k<n; k++) {
988
+ p2 = q2 + k;
989
+ p3 = q3 + k;
990
+ { (*p3) = (*p1) == (*p2); }
991
+ }
684
992
  } else {
685
993
  for (k=0; k<n; k++) {
686
994
  p1 = q1 + k*i1;
@@ -782,6 +1090,24 @@ ca_bincmp_ne_boolean8_t (ca_size_t n, boolean8_t *m,
782
1090
  { (*p3) = ( (*p1) != (*p2) ); }
783
1091
  }
784
1092
  }
1093
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
1094
+ /* scalar on the right: read it once, so the boolean store
1095
+ cannot be taken to change it and the loop vectorizes */
1096
+ boolean8_t sv = *q2;
1097
+ p2 = &sv;
1098
+ for (k=0; k<n; k++) {
1099
+ p1 = q1 + k;
1100
+ p3 = q3 + k;
1101
+ { (*p3) = ( (*p1) != (*p2) ); }
1102
+ }
1103
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
1104
+ boolean8_t sv = *q1;
1105
+ p1 = &sv;
1106
+ for (k=0; k<n; k++) {
1107
+ p2 = q2 + k;
1108
+ p3 = q3 + k;
1109
+ { (*p3) = ( (*p1) != (*p2) ); }
1110
+ }
785
1111
  } else {
786
1112
  for (k=0; k<n; k++) {
787
1113
  p1 = q1 + k*i1;
@@ -817,6 +1143,24 @@ ca_bincmp_ne_int8_t (ca_size_t n, boolean8_t *m,
817
1143
  { (*p3) = ( (*p1) != (*p2) ); }
818
1144
  }
819
1145
  }
1146
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
1147
+ /* scalar on the right: read it once, so the boolean store
1148
+ cannot be taken to change it and the loop vectorizes */
1149
+ int8_t sv = *q2;
1150
+ p2 = &sv;
1151
+ for (k=0; k<n; k++) {
1152
+ p1 = q1 + k;
1153
+ p3 = q3 + k;
1154
+ { (*p3) = ( (*p1) != (*p2) ); }
1155
+ }
1156
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
1157
+ int8_t sv = *q1;
1158
+ p1 = &sv;
1159
+ for (k=0; k<n; k++) {
1160
+ p2 = q2 + k;
1161
+ p3 = q3 + k;
1162
+ { (*p3) = ( (*p1) != (*p2) ); }
1163
+ }
820
1164
  } else {
821
1165
  for (k=0; k<n; k++) {
822
1166
  p1 = q1 + k*i1;
@@ -852,6 +1196,24 @@ ca_bincmp_ne_uint8_t (ca_size_t n, boolean8_t *m,
852
1196
  { (*p3) = ( (*p1) != (*p2) ); }
853
1197
  }
854
1198
  }
1199
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
1200
+ /* scalar on the right: read it once, so the boolean store
1201
+ cannot be taken to change it and the loop vectorizes */
1202
+ uint8_t sv = *q2;
1203
+ p2 = &sv;
1204
+ for (k=0; k<n; k++) {
1205
+ p1 = q1 + k;
1206
+ p3 = q3 + k;
1207
+ { (*p3) = ( (*p1) != (*p2) ); }
1208
+ }
1209
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
1210
+ uint8_t sv = *q1;
1211
+ p1 = &sv;
1212
+ for (k=0; k<n; k++) {
1213
+ p2 = q2 + k;
1214
+ p3 = q3 + k;
1215
+ { (*p3) = ( (*p1) != (*p2) ); }
1216
+ }
855
1217
  } else {
856
1218
  for (k=0; k<n; k++) {
857
1219
  p1 = q1 + k*i1;
@@ -869,8 +1231,8 @@ ca_bincmp_ne_int16_t (ca_size_t n, boolean8_t *m,
869
1231
  char *ptr3, ca_size_t b3, ca_size_t i3,
870
1232
  double tol)
871
1233
  {
872
- int16_t *q1 = (int16_t *) ptr1, *q2 = (int16_t *) ptr2;
873
- int16_t *p1 = q1, *p2 = q2;
1234
+ ca_u_int16_t *q1 = (ca_u_int16_t *) ptr1, *q2 = (ca_u_int16_t *) ptr2;
1235
+ ca_u_int16_t *p1 = q1, *p2 = q2;
874
1236
  boolean8_t *q3 = (boolean8_t *) ptr3;
875
1237
  boolean8_t *p3 = q3;
876
1238
  ca_size_t k;
@@ -887,6 +1249,24 @@ ca_bincmp_ne_int16_t (ca_size_t n, boolean8_t *m,
887
1249
  { (*p3) = ( (*p1) != (*p2) ); }
888
1250
  }
889
1251
  }
1252
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
1253
+ /* scalar on the right: read it once, so the boolean store
1254
+ cannot be taken to change it and the loop vectorizes */
1255
+ ca_u_int16_t sv = *q2;
1256
+ p2 = &sv;
1257
+ for (k=0; k<n; k++) {
1258
+ p1 = q1 + k;
1259
+ p3 = q3 + k;
1260
+ { (*p3) = ( (*p1) != (*p2) ); }
1261
+ }
1262
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
1263
+ ca_u_int16_t sv = *q1;
1264
+ p1 = &sv;
1265
+ for (k=0; k<n; k++) {
1266
+ p2 = q2 + k;
1267
+ p3 = q3 + k;
1268
+ { (*p3) = ( (*p1) != (*p2) ); }
1269
+ }
890
1270
  } else {
891
1271
  for (k=0; k<n; k++) {
892
1272
  p1 = q1 + k*i1;
@@ -904,8 +1284,8 @@ ca_bincmp_ne_uint16_t (ca_size_t n, boolean8_t *m,
904
1284
  char *ptr3, ca_size_t b3, ca_size_t i3,
905
1285
  double tol)
906
1286
  {
907
- uint16_t *q1 = (uint16_t *) ptr1, *q2 = (uint16_t *) ptr2;
908
- uint16_t *p1 = q1, *p2 = q2;
1287
+ ca_u_uint16_t *q1 = (ca_u_uint16_t *) ptr1, *q2 = (ca_u_uint16_t *) ptr2;
1288
+ ca_u_uint16_t *p1 = q1, *p2 = q2;
909
1289
  boolean8_t *q3 = (boolean8_t *) ptr3;
910
1290
  boolean8_t *p3 = q3;
911
1291
  ca_size_t k;
@@ -922,6 +1302,24 @@ ca_bincmp_ne_uint16_t (ca_size_t n, boolean8_t *m,
922
1302
  { (*p3) = ( (*p1) != (*p2) ); }
923
1303
  }
924
1304
  }
1305
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
1306
+ /* scalar on the right: read it once, so the boolean store
1307
+ cannot be taken to change it and the loop vectorizes */
1308
+ ca_u_uint16_t sv = *q2;
1309
+ p2 = &sv;
1310
+ for (k=0; k<n; k++) {
1311
+ p1 = q1 + k;
1312
+ p3 = q3 + k;
1313
+ { (*p3) = ( (*p1) != (*p2) ); }
1314
+ }
1315
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
1316
+ ca_u_uint16_t sv = *q1;
1317
+ p1 = &sv;
1318
+ for (k=0; k<n; k++) {
1319
+ p2 = q2 + k;
1320
+ p3 = q3 + k;
1321
+ { (*p3) = ( (*p1) != (*p2) ); }
1322
+ }
925
1323
  } else {
926
1324
  for (k=0; k<n; k++) {
927
1325
  p1 = q1 + k*i1;
@@ -939,8 +1337,8 @@ ca_bincmp_ne_int32_t (ca_size_t n, boolean8_t *m,
939
1337
  char *ptr3, ca_size_t b3, ca_size_t i3,
940
1338
  double tol)
941
1339
  {
942
- int32_t *q1 = (int32_t *) ptr1, *q2 = (int32_t *) ptr2;
943
- int32_t *p1 = q1, *p2 = q2;
1340
+ ca_u_int32_t *q1 = (ca_u_int32_t *) ptr1, *q2 = (ca_u_int32_t *) ptr2;
1341
+ ca_u_int32_t *p1 = q1, *p2 = q2;
944
1342
  boolean8_t *q3 = (boolean8_t *) ptr3;
945
1343
  boolean8_t *p3 = q3;
946
1344
  ca_size_t k;
@@ -957,6 +1355,24 @@ ca_bincmp_ne_int32_t (ca_size_t n, boolean8_t *m,
957
1355
  { (*p3) = ( (*p1) != (*p2) ); }
958
1356
  }
959
1357
  }
1358
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
1359
+ /* scalar on the right: read it once, so the boolean store
1360
+ cannot be taken to change it and the loop vectorizes */
1361
+ ca_u_int32_t sv = *q2;
1362
+ p2 = &sv;
1363
+ for (k=0; k<n; k++) {
1364
+ p1 = q1 + k;
1365
+ p3 = q3 + k;
1366
+ { (*p3) = ( (*p1) != (*p2) ); }
1367
+ }
1368
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
1369
+ ca_u_int32_t sv = *q1;
1370
+ p1 = &sv;
1371
+ for (k=0; k<n; k++) {
1372
+ p2 = q2 + k;
1373
+ p3 = q3 + k;
1374
+ { (*p3) = ( (*p1) != (*p2) ); }
1375
+ }
960
1376
  } else {
961
1377
  for (k=0; k<n; k++) {
962
1378
  p1 = q1 + k*i1;
@@ -974,8 +1390,8 @@ ca_bincmp_ne_uint32_t (ca_size_t n, boolean8_t *m,
974
1390
  char *ptr3, ca_size_t b3, ca_size_t i3,
975
1391
  double tol)
976
1392
  {
977
- uint32_t *q1 = (uint32_t *) ptr1, *q2 = (uint32_t *) ptr2;
978
- uint32_t *p1 = q1, *p2 = q2;
1393
+ ca_u_uint32_t *q1 = (ca_u_uint32_t *) ptr1, *q2 = (ca_u_uint32_t *) ptr2;
1394
+ ca_u_uint32_t *p1 = q1, *p2 = q2;
979
1395
  boolean8_t *q3 = (boolean8_t *) ptr3;
980
1396
  boolean8_t *p3 = q3;
981
1397
  ca_size_t k;
@@ -992,6 +1408,24 @@ ca_bincmp_ne_uint32_t (ca_size_t n, boolean8_t *m,
992
1408
  { (*p3) = ( (*p1) != (*p2) ); }
993
1409
  }
994
1410
  }
1411
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
1412
+ /* scalar on the right: read it once, so the boolean store
1413
+ cannot be taken to change it and the loop vectorizes */
1414
+ ca_u_uint32_t sv = *q2;
1415
+ p2 = &sv;
1416
+ for (k=0; k<n; k++) {
1417
+ p1 = q1 + k;
1418
+ p3 = q3 + k;
1419
+ { (*p3) = ( (*p1) != (*p2) ); }
1420
+ }
1421
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
1422
+ ca_u_uint32_t sv = *q1;
1423
+ p1 = &sv;
1424
+ for (k=0; k<n; k++) {
1425
+ p2 = q2 + k;
1426
+ p3 = q3 + k;
1427
+ { (*p3) = ( (*p1) != (*p2) ); }
1428
+ }
995
1429
  } else {
996
1430
  for (k=0; k<n; k++) {
997
1431
  p1 = q1 + k*i1;
@@ -1009,8 +1443,8 @@ ca_bincmp_ne_int64_t (ca_size_t n, boolean8_t *m,
1009
1443
  char *ptr3, ca_size_t b3, ca_size_t i3,
1010
1444
  double tol)
1011
1445
  {
1012
- int64_t *q1 = (int64_t *) ptr1, *q2 = (int64_t *) ptr2;
1013
- int64_t *p1 = q1, *p2 = q2;
1446
+ ca_u_int64_t *q1 = (ca_u_int64_t *) ptr1, *q2 = (ca_u_int64_t *) ptr2;
1447
+ ca_u_int64_t *p1 = q1, *p2 = q2;
1014
1448
  boolean8_t *q3 = (boolean8_t *) ptr3;
1015
1449
  boolean8_t *p3 = q3;
1016
1450
  ca_size_t k;
@@ -1027,6 +1461,24 @@ ca_bincmp_ne_int64_t (ca_size_t n, boolean8_t *m,
1027
1461
  { (*p3) = ( (*p1) != (*p2) ); }
1028
1462
  }
1029
1463
  }
1464
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
1465
+ /* scalar on the right: read it once, so the boolean store
1466
+ cannot be taken to change it and the loop vectorizes */
1467
+ ca_u_int64_t sv = *q2;
1468
+ p2 = &sv;
1469
+ for (k=0; k<n; k++) {
1470
+ p1 = q1 + k;
1471
+ p3 = q3 + k;
1472
+ { (*p3) = ( (*p1) != (*p2) ); }
1473
+ }
1474
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
1475
+ ca_u_int64_t sv = *q1;
1476
+ p1 = &sv;
1477
+ for (k=0; k<n; k++) {
1478
+ p2 = q2 + k;
1479
+ p3 = q3 + k;
1480
+ { (*p3) = ( (*p1) != (*p2) ); }
1481
+ }
1030
1482
  } else {
1031
1483
  for (k=0; k<n; k++) {
1032
1484
  p1 = q1 + k*i1;
@@ -1044,8 +1496,8 @@ ca_bincmp_ne_uint64_t (ca_size_t n, boolean8_t *m,
1044
1496
  char *ptr3, ca_size_t b3, ca_size_t i3,
1045
1497
  double tol)
1046
1498
  {
1047
- uint64_t *q1 = (uint64_t *) ptr1, *q2 = (uint64_t *) ptr2;
1048
- uint64_t *p1 = q1, *p2 = q2;
1499
+ ca_u_uint64_t *q1 = (ca_u_uint64_t *) ptr1, *q2 = (ca_u_uint64_t *) ptr2;
1500
+ ca_u_uint64_t *p1 = q1, *p2 = q2;
1049
1501
  boolean8_t *q3 = (boolean8_t *) ptr3;
1050
1502
  boolean8_t *p3 = q3;
1051
1503
  ca_size_t k;
@@ -1062,6 +1514,24 @@ ca_bincmp_ne_uint64_t (ca_size_t n, boolean8_t *m,
1062
1514
  { (*p3) = ( (*p1) != (*p2) ); }
1063
1515
  }
1064
1516
  }
1517
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
1518
+ /* scalar on the right: read it once, so the boolean store
1519
+ cannot be taken to change it and the loop vectorizes */
1520
+ ca_u_uint64_t sv = *q2;
1521
+ p2 = &sv;
1522
+ for (k=0; k<n; k++) {
1523
+ p1 = q1 + k;
1524
+ p3 = q3 + k;
1525
+ { (*p3) = ( (*p1) != (*p2) ); }
1526
+ }
1527
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
1528
+ ca_u_uint64_t sv = *q1;
1529
+ p1 = &sv;
1530
+ for (k=0; k<n; k++) {
1531
+ p2 = q2 + k;
1532
+ p3 = q3 + k;
1533
+ { (*p3) = ( (*p1) != (*p2) ); }
1534
+ }
1065
1535
  } else {
1066
1536
  for (k=0; k<n; k++) {
1067
1537
  p1 = q1 + k*i1;
@@ -1079,8 +1549,8 @@ ca_bincmp_ne_float32_t (ca_size_t n, boolean8_t *m,
1079
1549
  char *ptr3, ca_size_t b3, ca_size_t i3,
1080
1550
  double tol)
1081
1551
  {
1082
- float *q1 = (float *) ptr1, *q2 = (float *) ptr2;
1083
- float *p1 = q1, *p2 = q2;
1552
+ ca_u_float32_t *q1 = (ca_u_float32_t *) ptr1, *q2 = (ca_u_float32_t *) ptr2;
1553
+ ca_u_float32_t *p1 = q1, *p2 = q2;
1084
1554
  boolean8_t *q3 = (boolean8_t *) ptr3;
1085
1555
  boolean8_t *p3 = q3;
1086
1556
  ca_size_t k;
@@ -1097,6 +1567,24 @@ ca_bincmp_ne_float32_t (ca_size_t n, boolean8_t *m,
1097
1567
  { (*p3) = ( (*p1) != (*p2) ); }
1098
1568
  }
1099
1569
  }
1570
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
1571
+ /* scalar on the right: read it once, so the boolean store
1572
+ cannot be taken to change it and the loop vectorizes */
1573
+ ca_u_float32_t sv = *q2;
1574
+ p2 = &sv;
1575
+ for (k=0; k<n; k++) {
1576
+ p1 = q1 + k;
1577
+ p3 = q3 + k;
1578
+ { (*p3) = ( (*p1) != (*p2) ); }
1579
+ }
1580
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
1581
+ ca_u_float32_t sv = *q1;
1582
+ p1 = &sv;
1583
+ for (k=0; k<n; k++) {
1584
+ p2 = q2 + k;
1585
+ p3 = q3 + k;
1586
+ { (*p3) = ( (*p1) != (*p2) ); }
1587
+ }
1100
1588
  } else {
1101
1589
  for (k=0; k<n; k++) {
1102
1590
  p1 = q1 + k*i1;
@@ -1114,8 +1602,8 @@ ca_bincmp_ne_float64_t (ca_size_t n, boolean8_t *m,
1114
1602
  char *ptr3, ca_size_t b3, ca_size_t i3,
1115
1603
  double tol)
1116
1604
  {
1117
- double *q1 = (double *) ptr1, *q2 = (double *) ptr2;
1118
- double *p1 = q1, *p2 = q2;
1605
+ ca_u_float64_t *q1 = (ca_u_float64_t *) ptr1, *q2 = (ca_u_float64_t *) ptr2;
1606
+ ca_u_float64_t *p1 = q1, *p2 = q2;
1119
1607
  boolean8_t *q3 = (boolean8_t *) ptr3;
1120
1608
  boolean8_t *p3 = q3;
1121
1609
  ca_size_t k;
@@ -1132,6 +1620,24 @@ ca_bincmp_ne_float64_t (ca_size_t n, boolean8_t *m,
1132
1620
  { (*p3) = ( (*p1) != (*p2) ); }
1133
1621
  }
1134
1622
  }
1623
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
1624
+ /* scalar on the right: read it once, so the boolean store
1625
+ cannot be taken to change it and the loop vectorizes */
1626
+ ca_u_float64_t sv = *q2;
1627
+ p2 = &sv;
1628
+ for (k=0; k<n; k++) {
1629
+ p1 = q1 + k;
1630
+ p3 = q3 + k;
1631
+ { (*p3) = ( (*p1) != (*p2) ); }
1632
+ }
1633
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
1634
+ ca_u_float64_t sv = *q1;
1635
+ p1 = &sv;
1636
+ for (k=0; k<n; k++) {
1637
+ p2 = q2 + k;
1638
+ p3 = q3 + k;
1639
+ { (*p3) = ( (*p1) != (*p2) ); }
1640
+ }
1135
1641
  } else {
1136
1642
  for (k=0; k<n; k++) {
1137
1643
  p1 = q1 + k*i1;
@@ -1167,6 +1673,24 @@ ca_bincmp_ne_VALUE (ca_size_t n, boolean8_t *m,
1167
1673
  { (*p3) = RTEST(rb_funcall((*p1), rb_intern("=="), 1, (*p2))) ? 0 : 1; }
1168
1674
  }
1169
1675
  }
1676
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
1677
+ /* scalar on the right: read it once, so the boolean store
1678
+ cannot be taken to change it and the loop vectorizes */
1679
+ VALUE sv = *q2;
1680
+ p2 = &sv;
1681
+ for (k=0; k<n; k++) {
1682
+ p1 = q1 + k;
1683
+ p3 = q3 + k;
1684
+ { (*p3) = RTEST(rb_funcall((*p1), rb_intern("=="), 1, (*p2))) ? 0 : 1; }
1685
+ }
1686
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
1687
+ VALUE sv = *q1;
1688
+ p1 = &sv;
1689
+ for (k=0; k<n; k++) {
1690
+ p2 = q2 + k;
1691
+ p3 = q3 + k;
1692
+ { (*p3) = RTEST(rb_funcall((*p1), rb_intern("=="), 1, (*p2))) ? 0 : 1; }
1693
+ }
1170
1694
  } else {
1171
1695
  for (k=0; k<n; k++) {
1172
1696
  p1 = q1 + k*i1;
@@ -1184,8 +1708,8 @@ ca_bincmp_ne_cmplx64_t (ca_size_t n, boolean8_t *m,
1184
1708
  char *ptr3, ca_size_t b3, ca_size_t i3,
1185
1709
  double tol)
1186
1710
  {
1187
- cmplx64_t *q1 = (cmplx64_t *) ptr1, *q2 = (cmplx64_t *) ptr2;
1188
- cmplx64_t *p1 = q1, *p2 = q2;
1711
+ ca_u_cmplx64_t *q1 = (ca_u_cmplx64_t *) ptr1, *q2 = (ca_u_cmplx64_t *) ptr2;
1712
+ ca_u_cmplx64_t *p1 = q1, *p2 = q2;
1189
1713
  boolean8_t *q3 = (boolean8_t *) ptr3;
1190
1714
  boolean8_t *p3 = q3;
1191
1715
  ca_size_t k;
@@ -1202,6 +1726,24 @@ ca_bincmp_ne_cmplx64_t (ca_size_t n, boolean8_t *m,
1202
1726
  { (*p3) = (*p1) != (*p2); }
1203
1727
  }
1204
1728
  }
1729
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
1730
+ /* scalar on the right: read it once, so the boolean store
1731
+ cannot be taken to change it and the loop vectorizes */
1732
+ ca_u_cmplx64_t sv = *q2;
1733
+ p2 = &sv;
1734
+ for (k=0; k<n; k++) {
1735
+ p1 = q1 + k;
1736
+ p3 = q3 + k;
1737
+ { (*p3) = (*p1) != (*p2); }
1738
+ }
1739
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
1740
+ ca_u_cmplx64_t sv = *q1;
1741
+ p1 = &sv;
1742
+ for (k=0; k<n; k++) {
1743
+ p2 = q2 + k;
1744
+ p3 = q3 + k;
1745
+ { (*p3) = (*p1) != (*p2); }
1746
+ }
1205
1747
  } else {
1206
1748
  for (k=0; k<n; k++) {
1207
1749
  p1 = q1 + k*i1;
@@ -1219,8 +1761,8 @@ ca_bincmp_ne_cmplx128_t (ca_size_t n, boolean8_t *m,
1219
1761
  char *ptr3, ca_size_t b3, ca_size_t i3,
1220
1762
  double tol)
1221
1763
  {
1222
- cmplx128_t *q1 = (cmplx128_t *) ptr1, *q2 = (cmplx128_t *) ptr2;
1223
- cmplx128_t *p1 = q1, *p2 = q2;
1764
+ ca_u_cmplx128_t *q1 = (ca_u_cmplx128_t *) ptr1, *q2 = (ca_u_cmplx128_t *) ptr2;
1765
+ ca_u_cmplx128_t *p1 = q1, *p2 = q2;
1224
1766
  boolean8_t *q3 = (boolean8_t *) ptr3;
1225
1767
  boolean8_t *p3 = q3;
1226
1768
  ca_size_t k;
@@ -1237,6 +1779,24 @@ ca_bincmp_ne_cmplx128_t (ca_size_t n, boolean8_t *m,
1237
1779
  { (*p3) = (*p1) != (*p2); }
1238
1780
  }
1239
1781
  }
1782
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
1783
+ /* scalar on the right: read it once, so the boolean store
1784
+ cannot be taken to change it and the loop vectorizes */
1785
+ ca_u_cmplx128_t sv = *q2;
1786
+ p2 = &sv;
1787
+ for (k=0; k<n; k++) {
1788
+ p1 = q1 + k;
1789
+ p3 = q3 + k;
1790
+ { (*p3) = (*p1) != (*p2); }
1791
+ }
1792
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
1793
+ ca_u_cmplx128_t sv = *q1;
1794
+ p1 = &sv;
1795
+ for (k=0; k<n; k++) {
1796
+ p2 = q2 + k;
1797
+ p3 = q3 + k;
1798
+ { (*p3) = (*p1) != (*p2); }
1799
+ }
1240
1800
  } else {
1241
1801
  for (k=0; k<n; k++) {
1242
1802
  p1 = q1 + k*i1;
@@ -1344,6 +1904,24 @@ ca_bincmp_gt_boolean8_t (ca_size_t n, boolean8_t *m,
1344
1904
  { (*p3) = ( (*p1) > (*p2) ); }
1345
1905
  }
1346
1906
  }
1907
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
1908
+ /* scalar on the right: read it once, so the boolean store
1909
+ cannot be taken to change it and the loop vectorizes */
1910
+ boolean8_t sv = *q2;
1911
+ p2 = &sv;
1912
+ for (k=0; k<n; k++) {
1913
+ p1 = q1 + k;
1914
+ p3 = q3 + k;
1915
+ { (*p3) = ( (*p1) > (*p2) ); }
1916
+ }
1917
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
1918
+ boolean8_t sv = *q1;
1919
+ p1 = &sv;
1920
+ for (k=0; k<n; k++) {
1921
+ p2 = q2 + k;
1922
+ p3 = q3 + k;
1923
+ { (*p3) = ( (*p1) > (*p2) ); }
1924
+ }
1347
1925
  } else {
1348
1926
  for (k=0; k<n; k++) {
1349
1927
  p1 = q1 + k*i1;
@@ -1379,6 +1957,24 @@ ca_bincmp_gt_int8_t (ca_size_t n, boolean8_t *m,
1379
1957
  { (*p3) = ( (*p1) > (*p2) ); }
1380
1958
  }
1381
1959
  }
1960
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
1961
+ /* scalar on the right: read it once, so the boolean store
1962
+ cannot be taken to change it and the loop vectorizes */
1963
+ int8_t sv = *q2;
1964
+ p2 = &sv;
1965
+ for (k=0; k<n; k++) {
1966
+ p1 = q1 + k;
1967
+ p3 = q3 + k;
1968
+ { (*p3) = ( (*p1) > (*p2) ); }
1969
+ }
1970
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
1971
+ int8_t sv = *q1;
1972
+ p1 = &sv;
1973
+ for (k=0; k<n; k++) {
1974
+ p2 = q2 + k;
1975
+ p3 = q3 + k;
1976
+ { (*p3) = ( (*p1) > (*p2) ); }
1977
+ }
1382
1978
  } else {
1383
1979
  for (k=0; k<n; k++) {
1384
1980
  p1 = q1 + k*i1;
@@ -1414,6 +2010,24 @@ ca_bincmp_gt_uint8_t (ca_size_t n, boolean8_t *m,
1414
2010
  { (*p3) = ( (*p1) > (*p2) ); }
1415
2011
  }
1416
2012
  }
2013
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
2014
+ /* scalar on the right: read it once, so the boolean store
2015
+ cannot be taken to change it and the loop vectorizes */
2016
+ uint8_t sv = *q2;
2017
+ p2 = &sv;
2018
+ for (k=0; k<n; k++) {
2019
+ p1 = q1 + k;
2020
+ p3 = q3 + k;
2021
+ { (*p3) = ( (*p1) > (*p2) ); }
2022
+ }
2023
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
2024
+ uint8_t sv = *q1;
2025
+ p1 = &sv;
2026
+ for (k=0; k<n; k++) {
2027
+ p2 = q2 + k;
2028
+ p3 = q3 + k;
2029
+ { (*p3) = ( (*p1) > (*p2) ); }
2030
+ }
1417
2031
  } else {
1418
2032
  for (k=0; k<n; k++) {
1419
2033
  p1 = q1 + k*i1;
@@ -1431,8 +2045,8 @@ ca_bincmp_gt_int16_t (ca_size_t n, boolean8_t *m,
1431
2045
  char *ptr3, ca_size_t b3, ca_size_t i3,
1432
2046
  double tol)
1433
2047
  {
1434
- int16_t *q1 = (int16_t *) ptr1, *q2 = (int16_t *) ptr2;
1435
- int16_t *p1 = q1, *p2 = q2;
2048
+ ca_u_int16_t *q1 = (ca_u_int16_t *) ptr1, *q2 = (ca_u_int16_t *) ptr2;
2049
+ ca_u_int16_t *p1 = q1, *p2 = q2;
1436
2050
  boolean8_t *q3 = (boolean8_t *) ptr3;
1437
2051
  boolean8_t *p3 = q3;
1438
2052
  ca_size_t k;
@@ -1449,6 +2063,24 @@ ca_bincmp_gt_int16_t (ca_size_t n, boolean8_t *m,
1449
2063
  { (*p3) = ( (*p1) > (*p2) ); }
1450
2064
  }
1451
2065
  }
2066
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
2067
+ /* scalar on the right: read it once, so the boolean store
2068
+ cannot be taken to change it and the loop vectorizes */
2069
+ ca_u_int16_t sv = *q2;
2070
+ p2 = &sv;
2071
+ for (k=0; k<n; k++) {
2072
+ p1 = q1 + k;
2073
+ p3 = q3 + k;
2074
+ { (*p3) = ( (*p1) > (*p2) ); }
2075
+ }
2076
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
2077
+ ca_u_int16_t sv = *q1;
2078
+ p1 = &sv;
2079
+ for (k=0; k<n; k++) {
2080
+ p2 = q2 + k;
2081
+ p3 = q3 + k;
2082
+ { (*p3) = ( (*p1) > (*p2) ); }
2083
+ }
1452
2084
  } else {
1453
2085
  for (k=0; k<n; k++) {
1454
2086
  p1 = q1 + k*i1;
@@ -1466,8 +2098,8 @@ ca_bincmp_gt_uint16_t (ca_size_t n, boolean8_t *m,
1466
2098
  char *ptr3, ca_size_t b3, ca_size_t i3,
1467
2099
  double tol)
1468
2100
  {
1469
- uint16_t *q1 = (uint16_t *) ptr1, *q2 = (uint16_t *) ptr2;
1470
- uint16_t *p1 = q1, *p2 = q2;
2101
+ ca_u_uint16_t *q1 = (ca_u_uint16_t *) ptr1, *q2 = (ca_u_uint16_t *) ptr2;
2102
+ ca_u_uint16_t *p1 = q1, *p2 = q2;
1471
2103
  boolean8_t *q3 = (boolean8_t *) ptr3;
1472
2104
  boolean8_t *p3 = q3;
1473
2105
  ca_size_t k;
@@ -1484,6 +2116,24 @@ ca_bincmp_gt_uint16_t (ca_size_t n, boolean8_t *m,
1484
2116
  { (*p3) = ( (*p1) > (*p2) ); }
1485
2117
  }
1486
2118
  }
2119
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
2120
+ /* scalar on the right: read it once, so the boolean store
2121
+ cannot be taken to change it and the loop vectorizes */
2122
+ ca_u_uint16_t sv = *q2;
2123
+ p2 = &sv;
2124
+ for (k=0; k<n; k++) {
2125
+ p1 = q1 + k;
2126
+ p3 = q3 + k;
2127
+ { (*p3) = ( (*p1) > (*p2) ); }
2128
+ }
2129
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
2130
+ ca_u_uint16_t sv = *q1;
2131
+ p1 = &sv;
2132
+ for (k=0; k<n; k++) {
2133
+ p2 = q2 + k;
2134
+ p3 = q3 + k;
2135
+ { (*p3) = ( (*p1) > (*p2) ); }
2136
+ }
1487
2137
  } else {
1488
2138
  for (k=0; k<n; k++) {
1489
2139
  p1 = q1 + k*i1;
@@ -1501,8 +2151,8 @@ ca_bincmp_gt_int32_t (ca_size_t n, boolean8_t *m,
1501
2151
  char *ptr3, ca_size_t b3, ca_size_t i3,
1502
2152
  double tol)
1503
2153
  {
1504
- int32_t *q1 = (int32_t *) ptr1, *q2 = (int32_t *) ptr2;
1505
- int32_t *p1 = q1, *p2 = q2;
2154
+ ca_u_int32_t *q1 = (ca_u_int32_t *) ptr1, *q2 = (ca_u_int32_t *) ptr2;
2155
+ ca_u_int32_t *p1 = q1, *p2 = q2;
1506
2156
  boolean8_t *q3 = (boolean8_t *) ptr3;
1507
2157
  boolean8_t *p3 = q3;
1508
2158
  ca_size_t k;
@@ -1519,6 +2169,24 @@ ca_bincmp_gt_int32_t (ca_size_t n, boolean8_t *m,
1519
2169
  { (*p3) = ( (*p1) > (*p2) ); }
1520
2170
  }
1521
2171
  }
2172
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
2173
+ /* scalar on the right: read it once, so the boolean store
2174
+ cannot be taken to change it and the loop vectorizes */
2175
+ ca_u_int32_t sv = *q2;
2176
+ p2 = &sv;
2177
+ for (k=0; k<n; k++) {
2178
+ p1 = q1 + k;
2179
+ p3 = q3 + k;
2180
+ { (*p3) = ( (*p1) > (*p2) ); }
2181
+ }
2182
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
2183
+ ca_u_int32_t sv = *q1;
2184
+ p1 = &sv;
2185
+ for (k=0; k<n; k++) {
2186
+ p2 = q2 + k;
2187
+ p3 = q3 + k;
2188
+ { (*p3) = ( (*p1) > (*p2) ); }
2189
+ }
1522
2190
  } else {
1523
2191
  for (k=0; k<n; k++) {
1524
2192
  p1 = q1 + k*i1;
@@ -1536,8 +2204,8 @@ ca_bincmp_gt_uint32_t (ca_size_t n, boolean8_t *m,
1536
2204
  char *ptr3, ca_size_t b3, ca_size_t i3,
1537
2205
  double tol)
1538
2206
  {
1539
- uint32_t *q1 = (uint32_t *) ptr1, *q2 = (uint32_t *) ptr2;
1540
- uint32_t *p1 = q1, *p2 = q2;
2207
+ ca_u_uint32_t *q1 = (ca_u_uint32_t *) ptr1, *q2 = (ca_u_uint32_t *) ptr2;
2208
+ ca_u_uint32_t *p1 = q1, *p2 = q2;
1541
2209
  boolean8_t *q3 = (boolean8_t *) ptr3;
1542
2210
  boolean8_t *p3 = q3;
1543
2211
  ca_size_t k;
@@ -1554,6 +2222,24 @@ ca_bincmp_gt_uint32_t (ca_size_t n, boolean8_t *m,
1554
2222
  { (*p3) = ( (*p1) > (*p2) ); }
1555
2223
  }
1556
2224
  }
2225
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
2226
+ /* scalar on the right: read it once, so the boolean store
2227
+ cannot be taken to change it and the loop vectorizes */
2228
+ ca_u_uint32_t sv = *q2;
2229
+ p2 = &sv;
2230
+ for (k=0; k<n; k++) {
2231
+ p1 = q1 + k;
2232
+ p3 = q3 + k;
2233
+ { (*p3) = ( (*p1) > (*p2) ); }
2234
+ }
2235
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
2236
+ ca_u_uint32_t sv = *q1;
2237
+ p1 = &sv;
2238
+ for (k=0; k<n; k++) {
2239
+ p2 = q2 + k;
2240
+ p3 = q3 + k;
2241
+ { (*p3) = ( (*p1) > (*p2) ); }
2242
+ }
1557
2243
  } else {
1558
2244
  for (k=0; k<n; k++) {
1559
2245
  p1 = q1 + k*i1;
@@ -1571,8 +2257,8 @@ ca_bincmp_gt_int64_t (ca_size_t n, boolean8_t *m,
1571
2257
  char *ptr3, ca_size_t b3, ca_size_t i3,
1572
2258
  double tol)
1573
2259
  {
1574
- int64_t *q1 = (int64_t *) ptr1, *q2 = (int64_t *) ptr2;
1575
- int64_t *p1 = q1, *p2 = q2;
2260
+ ca_u_int64_t *q1 = (ca_u_int64_t *) ptr1, *q2 = (ca_u_int64_t *) ptr2;
2261
+ ca_u_int64_t *p1 = q1, *p2 = q2;
1576
2262
  boolean8_t *q3 = (boolean8_t *) ptr3;
1577
2263
  boolean8_t *p3 = q3;
1578
2264
  ca_size_t k;
@@ -1589,6 +2275,24 @@ ca_bincmp_gt_int64_t (ca_size_t n, boolean8_t *m,
1589
2275
  { (*p3) = ( (*p1) > (*p2) ); }
1590
2276
  }
1591
2277
  }
2278
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
2279
+ /* scalar on the right: read it once, so the boolean store
2280
+ cannot be taken to change it and the loop vectorizes */
2281
+ ca_u_int64_t sv = *q2;
2282
+ p2 = &sv;
2283
+ for (k=0; k<n; k++) {
2284
+ p1 = q1 + k;
2285
+ p3 = q3 + k;
2286
+ { (*p3) = ( (*p1) > (*p2) ); }
2287
+ }
2288
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
2289
+ ca_u_int64_t sv = *q1;
2290
+ p1 = &sv;
2291
+ for (k=0; k<n; k++) {
2292
+ p2 = q2 + k;
2293
+ p3 = q3 + k;
2294
+ { (*p3) = ( (*p1) > (*p2) ); }
2295
+ }
1592
2296
  } else {
1593
2297
  for (k=0; k<n; k++) {
1594
2298
  p1 = q1 + k*i1;
@@ -1606,8 +2310,8 @@ ca_bincmp_gt_uint64_t (ca_size_t n, boolean8_t *m,
1606
2310
  char *ptr3, ca_size_t b3, ca_size_t i3,
1607
2311
  double tol)
1608
2312
  {
1609
- uint64_t *q1 = (uint64_t *) ptr1, *q2 = (uint64_t *) ptr2;
1610
- uint64_t *p1 = q1, *p2 = q2;
2313
+ ca_u_uint64_t *q1 = (ca_u_uint64_t *) ptr1, *q2 = (ca_u_uint64_t *) ptr2;
2314
+ ca_u_uint64_t *p1 = q1, *p2 = q2;
1611
2315
  boolean8_t *q3 = (boolean8_t *) ptr3;
1612
2316
  boolean8_t *p3 = q3;
1613
2317
  ca_size_t k;
@@ -1624,6 +2328,24 @@ ca_bincmp_gt_uint64_t (ca_size_t n, boolean8_t *m,
1624
2328
  { (*p3) = ( (*p1) > (*p2) ); }
1625
2329
  }
1626
2330
  }
2331
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
2332
+ /* scalar on the right: read it once, so the boolean store
2333
+ cannot be taken to change it and the loop vectorizes */
2334
+ ca_u_uint64_t sv = *q2;
2335
+ p2 = &sv;
2336
+ for (k=0; k<n; k++) {
2337
+ p1 = q1 + k;
2338
+ p3 = q3 + k;
2339
+ { (*p3) = ( (*p1) > (*p2) ); }
2340
+ }
2341
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
2342
+ ca_u_uint64_t sv = *q1;
2343
+ p1 = &sv;
2344
+ for (k=0; k<n; k++) {
2345
+ p2 = q2 + k;
2346
+ p3 = q3 + k;
2347
+ { (*p3) = ( (*p1) > (*p2) ); }
2348
+ }
1627
2349
  } else {
1628
2350
  for (k=0; k<n; k++) {
1629
2351
  p1 = q1 + k*i1;
@@ -1641,8 +2363,8 @@ ca_bincmp_gt_float32_t (ca_size_t n, boolean8_t *m,
1641
2363
  char *ptr3, ca_size_t b3, ca_size_t i3,
1642
2364
  double tol)
1643
2365
  {
1644
- float *q1 = (float *) ptr1, *q2 = (float *) ptr2;
1645
- float *p1 = q1, *p2 = q2;
2366
+ ca_u_float32_t *q1 = (ca_u_float32_t *) ptr1, *q2 = (ca_u_float32_t *) ptr2;
2367
+ ca_u_float32_t *p1 = q1, *p2 = q2;
1646
2368
  boolean8_t *q3 = (boolean8_t *) ptr3;
1647
2369
  boolean8_t *p3 = q3;
1648
2370
  ca_size_t k;
@@ -1659,6 +2381,24 @@ ca_bincmp_gt_float32_t (ca_size_t n, boolean8_t *m,
1659
2381
  { (*p3) = ( (*p1) > (*p2) ); }
1660
2382
  }
1661
2383
  }
2384
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
2385
+ /* scalar on the right: read it once, so the boolean store
2386
+ cannot be taken to change it and the loop vectorizes */
2387
+ ca_u_float32_t sv = *q2;
2388
+ p2 = &sv;
2389
+ for (k=0; k<n; k++) {
2390
+ p1 = q1 + k;
2391
+ p3 = q3 + k;
2392
+ { (*p3) = ( (*p1) > (*p2) ); }
2393
+ }
2394
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
2395
+ ca_u_float32_t sv = *q1;
2396
+ p1 = &sv;
2397
+ for (k=0; k<n; k++) {
2398
+ p2 = q2 + k;
2399
+ p3 = q3 + k;
2400
+ { (*p3) = ( (*p1) > (*p2) ); }
2401
+ }
1662
2402
  } else {
1663
2403
  for (k=0; k<n; k++) {
1664
2404
  p1 = q1 + k*i1;
@@ -1676,8 +2416,8 @@ ca_bincmp_gt_float64_t (ca_size_t n, boolean8_t *m,
1676
2416
  char *ptr3, ca_size_t b3, ca_size_t i3,
1677
2417
  double tol)
1678
2418
  {
1679
- double *q1 = (double *) ptr1, *q2 = (double *) ptr2;
1680
- double *p1 = q1, *p2 = q2;
2419
+ ca_u_float64_t *q1 = (ca_u_float64_t *) ptr1, *q2 = (ca_u_float64_t *) ptr2;
2420
+ ca_u_float64_t *p1 = q1, *p2 = q2;
1681
2421
  boolean8_t *q3 = (boolean8_t *) ptr3;
1682
2422
  boolean8_t *p3 = q3;
1683
2423
  ca_size_t k;
@@ -1694,6 +2434,24 @@ ca_bincmp_gt_float64_t (ca_size_t n, boolean8_t *m,
1694
2434
  { (*p3) = ( (*p1) > (*p2) ); }
1695
2435
  }
1696
2436
  }
2437
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
2438
+ /* scalar on the right: read it once, so the boolean store
2439
+ cannot be taken to change it and the loop vectorizes */
2440
+ ca_u_float64_t sv = *q2;
2441
+ p2 = &sv;
2442
+ for (k=0; k<n; k++) {
2443
+ p1 = q1 + k;
2444
+ p3 = q3 + k;
2445
+ { (*p3) = ( (*p1) > (*p2) ); }
2446
+ }
2447
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
2448
+ ca_u_float64_t sv = *q1;
2449
+ p1 = &sv;
2450
+ for (k=0; k<n; k++) {
2451
+ p2 = q2 + k;
2452
+ p3 = q3 + k;
2453
+ { (*p3) = ( (*p1) > (*p2) ); }
2454
+ }
1697
2455
  } else {
1698
2456
  for (k=0; k<n; k++) {
1699
2457
  p1 = q1 + k*i1;
@@ -1729,9 +2487,27 @@ ca_bincmp_gt_VALUE (ca_size_t n, boolean8_t *m,
1729
2487
  { (*p3) = RTEST(rb_funcall((*p1), rb_intern(">"), 1, (*p2))) ? 1 : 0; }
1730
2488
  }
1731
2489
  }
1732
- } else {
2490
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
2491
+ /* scalar on the right: read it once, so the boolean store
2492
+ cannot be taken to change it and the loop vectorizes */
2493
+ VALUE sv = *q2;
2494
+ p2 = &sv;
1733
2495
  for (k=0; k<n; k++) {
1734
- p1 = q1 + k*i1;
2496
+ p1 = q1 + k;
2497
+ p3 = q3 + k;
2498
+ { (*p3) = RTEST(rb_funcall((*p1), rb_intern(">"), 1, (*p2))) ? 1 : 0; }
2499
+ }
2500
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
2501
+ VALUE sv = *q1;
2502
+ p1 = &sv;
2503
+ for (k=0; k<n; k++) {
2504
+ p2 = q2 + k;
2505
+ p3 = q3 + k;
2506
+ { (*p3) = RTEST(rb_funcall((*p1), rb_intern(">"), 1, (*p2))) ? 1 : 0; }
2507
+ }
2508
+ } else {
2509
+ for (k=0; k<n; k++) {
2510
+ p1 = q1 + k*i1;
1735
2511
  p2 = q2 + k*i2;
1736
2512
  p3 = q3 + k*i3;
1737
2513
  { (*p3) = RTEST(rb_funcall((*p1), rb_intern(">"), 1, (*p2))) ? 1 : 0; }
@@ -1836,6 +2612,24 @@ ca_bincmp_lt_boolean8_t (ca_size_t n, boolean8_t *m,
1836
2612
  { (*p3) = ( (*p1) < (*p2) ); }
1837
2613
  }
1838
2614
  }
2615
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
2616
+ /* scalar on the right: read it once, so the boolean store
2617
+ cannot be taken to change it and the loop vectorizes */
2618
+ boolean8_t sv = *q2;
2619
+ p2 = &sv;
2620
+ for (k=0; k<n; k++) {
2621
+ p1 = q1 + k;
2622
+ p3 = q3 + k;
2623
+ { (*p3) = ( (*p1) < (*p2) ); }
2624
+ }
2625
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
2626
+ boolean8_t sv = *q1;
2627
+ p1 = &sv;
2628
+ for (k=0; k<n; k++) {
2629
+ p2 = q2 + k;
2630
+ p3 = q3 + k;
2631
+ { (*p3) = ( (*p1) < (*p2) ); }
2632
+ }
1839
2633
  } else {
1840
2634
  for (k=0; k<n; k++) {
1841
2635
  p1 = q1 + k*i1;
@@ -1871,6 +2665,24 @@ ca_bincmp_lt_int8_t (ca_size_t n, boolean8_t *m,
1871
2665
  { (*p3) = ( (*p1) < (*p2) ); }
1872
2666
  }
1873
2667
  }
2668
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
2669
+ /* scalar on the right: read it once, so the boolean store
2670
+ cannot be taken to change it and the loop vectorizes */
2671
+ int8_t sv = *q2;
2672
+ p2 = &sv;
2673
+ for (k=0; k<n; k++) {
2674
+ p1 = q1 + k;
2675
+ p3 = q3 + k;
2676
+ { (*p3) = ( (*p1) < (*p2) ); }
2677
+ }
2678
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
2679
+ int8_t sv = *q1;
2680
+ p1 = &sv;
2681
+ for (k=0; k<n; k++) {
2682
+ p2 = q2 + k;
2683
+ p3 = q3 + k;
2684
+ { (*p3) = ( (*p1) < (*p2) ); }
2685
+ }
1874
2686
  } else {
1875
2687
  for (k=0; k<n; k++) {
1876
2688
  p1 = q1 + k*i1;
@@ -1906,6 +2718,24 @@ ca_bincmp_lt_uint8_t (ca_size_t n, boolean8_t *m,
1906
2718
  { (*p3) = ( (*p1) < (*p2) ); }
1907
2719
  }
1908
2720
  }
2721
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
2722
+ /* scalar on the right: read it once, so the boolean store
2723
+ cannot be taken to change it and the loop vectorizes */
2724
+ uint8_t sv = *q2;
2725
+ p2 = &sv;
2726
+ for (k=0; k<n; k++) {
2727
+ p1 = q1 + k;
2728
+ p3 = q3 + k;
2729
+ { (*p3) = ( (*p1) < (*p2) ); }
2730
+ }
2731
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
2732
+ uint8_t sv = *q1;
2733
+ p1 = &sv;
2734
+ for (k=0; k<n; k++) {
2735
+ p2 = q2 + k;
2736
+ p3 = q3 + k;
2737
+ { (*p3) = ( (*p1) < (*p2) ); }
2738
+ }
1909
2739
  } else {
1910
2740
  for (k=0; k<n; k++) {
1911
2741
  p1 = q1 + k*i1;
@@ -1923,8 +2753,8 @@ ca_bincmp_lt_int16_t (ca_size_t n, boolean8_t *m,
1923
2753
  char *ptr3, ca_size_t b3, ca_size_t i3,
1924
2754
  double tol)
1925
2755
  {
1926
- int16_t *q1 = (int16_t *) ptr1, *q2 = (int16_t *) ptr2;
1927
- int16_t *p1 = q1, *p2 = q2;
2756
+ ca_u_int16_t *q1 = (ca_u_int16_t *) ptr1, *q2 = (ca_u_int16_t *) ptr2;
2757
+ ca_u_int16_t *p1 = q1, *p2 = q2;
1928
2758
  boolean8_t *q3 = (boolean8_t *) ptr3;
1929
2759
  boolean8_t *p3 = q3;
1930
2760
  ca_size_t k;
@@ -1941,6 +2771,24 @@ ca_bincmp_lt_int16_t (ca_size_t n, boolean8_t *m,
1941
2771
  { (*p3) = ( (*p1) < (*p2) ); }
1942
2772
  }
1943
2773
  }
2774
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
2775
+ /* scalar on the right: read it once, so the boolean store
2776
+ cannot be taken to change it and the loop vectorizes */
2777
+ ca_u_int16_t sv = *q2;
2778
+ p2 = &sv;
2779
+ for (k=0; k<n; k++) {
2780
+ p1 = q1 + k;
2781
+ p3 = q3 + k;
2782
+ { (*p3) = ( (*p1) < (*p2) ); }
2783
+ }
2784
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
2785
+ ca_u_int16_t sv = *q1;
2786
+ p1 = &sv;
2787
+ for (k=0; k<n; k++) {
2788
+ p2 = q2 + k;
2789
+ p3 = q3 + k;
2790
+ { (*p3) = ( (*p1) < (*p2) ); }
2791
+ }
1944
2792
  } else {
1945
2793
  for (k=0; k<n; k++) {
1946
2794
  p1 = q1 + k*i1;
@@ -1958,8 +2806,8 @@ ca_bincmp_lt_uint16_t (ca_size_t n, boolean8_t *m,
1958
2806
  char *ptr3, ca_size_t b3, ca_size_t i3,
1959
2807
  double tol)
1960
2808
  {
1961
- uint16_t *q1 = (uint16_t *) ptr1, *q2 = (uint16_t *) ptr2;
1962
- uint16_t *p1 = q1, *p2 = q2;
2809
+ ca_u_uint16_t *q1 = (ca_u_uint16_t *) ptr1, *q2 = (ca_u_uint16_t *) ptr2;
2810
+ ca_u_uint16_t *p1 = q1, *p2 = q2;
1963
2811
  boolean8_t *q3 = (boolean8_t *) ptr3;
1964
2812
  boolean8_t *p3 = q3;
1965
2813
  ca_size_t k;
@@ -1976,6 +2824,24 @@ ca_bincmp_lt_uint16_t (ca_size_t n, boolean8_t *m,
1976
2824
  { (*p3) = ( (*p1) < (*p2) ); }
1977
2825
  }
1978
2826
  }
2827
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
2828
+ /* scalar on the right: read it once, so the boolean store
2829
+ cannot be taken to change it and the loop vectorizes */
2830
+ ca_u_uint16_t sv = *q2;
2831
+ p2 = &sv;
2832
+ for (k=0; k<n; k++) {
2833
+ p1 = q1 + k;
2834
+ p3 = q3 + k;
2835
+ { (*p3) = ( (*p1) < (*p2) ); }
2836
+ }
2837
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
2838
+ ca_u_uint16_t sv = *q1;
2839
+ p1 = &sv;
2840
+ for (k=0; k<n; k++) {
2841
+ p2 = q2 + k;
2842
+ p3 = q3 + k;
2843
+ { (*p3) = ( (*p1) < (*p2) ); }
2844
+ }
1979
2845
  } else {
1980
2846
  for (k=0; k<n; k++) {
1981
2847
  p1 = q1 + k*i1;
@@ -1993,8 +2859,8 @@ ca_bincmp_lt_int32_t (ca_size_t n, boolean8_t *m,
1993
2859
  char *ptr3, ca_size_t b3, ca_size_t i3,
1994
2860
  double tol)
1995
2861
  {
1996
- int32_t *q1 = (int32_t *) ptr1, *q2 = (int32_t *) ptr2;
1997
- int32_t *p1 = q1, *p2 = q2;
2862
+ ca_u_int32_t *q1 = (ca_u_int32_t *) ptr1, *q2 = (ca_u_int32_t *) ptr2;
2863
+ ca_u_int32_t *p1 = q1, *p2 = q2;
1998
2864
  boolean8_t *q3 = (boolean8_t *) ptr3;
1999
2865
  boolean8_t *p3 = q3;
2000
2866
  ca_size_t k;
@@ -2011,6 +2877,24 @@ ca_bincmp_lt_int32_t (ca_size_t n, boolean8_t *m,
2011
2877
  { (*p3) = ( (*p1) < (*p2) ); }
2012
2878
  }
2013
2879
  }
2880
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
2881
+ /* scalar on the right: read it once, so the boolean store
2882
+ cannot be taken to change it and the loop vectorizes */
2883
+ ca_u_int32_t sv = *q2;
2884
+ p2 = &sv;
2885
+ for (k=0; k<n; k++) {
2886
+ p1 = q1 + k;
2887
+ p3 = q3 + k;
2888
+ { (*p3) = ( (*p1) < (*p2) ); }
2889
+ }
2890
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
2891
+ ca_u_int32_t sv = *q1;
2892
+ p1 = &sv;
2893
+ for (k=0; k<n; k++) {
2894
+ p2 = q2 + k;
2895
+ p3 = q3 + k;
2896
+ { (*p3) = ( (*p1) < (*p2) ); }
2897
+ }
2014
2898
  } else {
2015
2899
  for (k=0; k<n; k++) {
2016
2900
  p1 = q1 + k*i1;
@@ -2028,8 +2912,8 @@ ca_bincmp_lt_uint32_t (ca_size_t n, boolean8_t *m,
2028
2912
  char *ptr3, ca_size_t b3, ca_size_t i3,
2029
2913
  double tol)
2030
2914
  {
2031
- uint32_t *q1 = (uint32_t *) ptr1, *q2 = (uint32_t *) ptr2;
2032
- uint32_t *p1 = q1, *p2 = q2;
2915
+ ca_u_uint32_t *q1 = (ca_u_uint32_t *) ptr1, *q2 = (ca_u_uint32_t *) ptr2;
2916
+ ca_u_uint32_t *p1 = q1, *p2 = q2;
2033
2917
  boolean8_t *q3 = (boolean8_t *) ptr3;
2034
2918
  boolean8_t *p3 = q3;
2035
2919
  ca_size_t k;
@@ -2046,6 +2930,24 @@ ca_bincmp_lt_uint32_t (ca_size_t n, boolean8_t *m,
2046
2930
  { (*p3) = ( (*p1) < (*p2) ); }
2047
2931
  }
2048
2932
  }
2933
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
2934
+ /* scalar on the right: read it once, so the boolean store
2935
+ cannot be taken to change it and the loop vectorizes */
2936
+ ca_u_uint32_t sv = *q2;
2937
+ p2 = &sv;
2938
+ for (k=0; k<n; k++) {
2939
+ p1 = q1 + k;
2940
+ p3 = q3 + k;
2941
+ { (*p3) = ( (*p1) < (*p2) ); }
2942
+ }
2943
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
2944
+ ca_u_uint32_t sv = *q1;
2945
+ p1 = &sv;
2946
+ for (k=0; k<n; k++) {
2947
+ p2 = q2 + k;
2948
+ p3 = q3 + k;
2949
+ { (*p3) = ( (*p1) < (*p2) ); }
2950
+ }
2049
2951
  } else {
2050
2952
  for (k=0; k<n; k++) {
2051
2953
  p1 = q1 + k*i1;
@@ -2063,8 +2965,8 @@ ca_bincmp_lt_int64_t (ca_size_t n, boolean8_t *m,
2063
2965
  char *ptr3, ca_size_t b3, ca_size_t i3,
2064
2966
  double tol)
2065
2967
  {
2066
- int64_t *q1 = (int64_t *) ptr1, *q2 = (int64_t *) ptr2;
2067
- int64_t *p1 = q1, *p2 = q2;
2968
+ ca_u_int64_t *q1 = (ca_u_int64_t *) ptr1, *q2 = (ca_u_int64_t *) ptr2;
2969
+ ca_u_int64_t *p1 = q1, *p2 = q2;
2068
2970
  boolean8_t *q3 = (boolean8_t *) ptr3;
2069
2971
  boolean8_t *p3 = q3;
2070
2972
  ca_size_t k;
@@ -2081,6 +2983,24 @@ ca_bincmp_lt_int64_t (ca_size_t n, boolean8_t *m,
2081
2983
  { (*p3) = ( (*p1) < (*p2) ); }
2082
2984
  }
2083
2985
  }
2986
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
2987
+ /* scalar on the right: read it once, so the boolean store
2988
+ cannot be taken to change it and the loop vectorizes */
2989
+ ca_u_int64_t sv = *q2;
2990
+ p2 = &sv;
2991
+ for (k=0; k<n; k++) {
2992
+ p1 = q1 + k;
2993
+ p3 = q3 + k;
2994
+ { (*p3) = ( (*p1) < (*p2) ); }
2995
+ }
2996
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
2997
+ ca_u_int64_t sv = *q1;
2998
+ p1 = &sv;
2999
+ for (k=0; k<n; k++) {
3000
+ p2 = q2 + k;
3001
+ p3 = q3 + k;
3002
+ { (*p3) = ( (*p1) < (*p2) ); }
3003
+ }
2084
3004
  } else {
2085
3005
  for (k=0; k<n; k++) {
2086
3006
  p1 = q1 + k*i1;
@@ -2098,8 +3018,8 @@ ca_bincmp_lt_uint64_t (ca_size_t n, boolean8_t *m,
2098
3018
  char *ptr3, ca_size_t b3, ca_size_t i3,
2099
3019
  double tol)
2100
3020
  {
2101
- uint64_t *q1 = (uint64_t *) ptr1, *q2 = (uint64_t *) ptr2;
2102
- uint64_t *p1 = q1, *p2 = q2;
3021
+ ca_u_uint64_t *q1 = (ca_u_uint64_t *) ptr1, *q2 = (ca_u_uint64_t *) ptr2;
3022
+ ca_u_uint64_t *p1 = q1, *p2 = q2;
2103
3023
  boolean8_t *q3 = (boolean8_t *) ptr3;
2104
3024
  boolean8_t *p3 = q3;
2105
3025
  ca_size_t k;
@@ -2116,6 +3036,24 @@ ca_bincmp_lt_uint64_t (ca_size_t n, boolean8_t *m,
2116
3036
  { (*p3) = ( (*p1) < (*p2) ); }
2117
3037
  }
2118
3038
  }
3039
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
3040
+ /* scalar on the right: read it once, so the boolean store
3041
+ cannot be taken to change it and the loop vectorizes */
3042
+ ca_u_uint64_t sv = *q2;
3043
+ p2 = &sv;
3044
+ for (k=0; k<n; k++) {
3045
+ p1 = q1 + k;
3046
+ p3 = q3 + k;
3047
+ { (*p3) = ( (*p1) < (*p2) ); }
3048
+ }
3049
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
3050
+ ca_u_uint64_t sv = *q1;
3051
+ p1 = &sv;
3052
+ for (k=0; k<n; k++) {
3053
+ p2 = q2 + k;
3054
+ p3 = q3 + k;
3055
+ { (*p3) = ( (*p1) < (*p2) ); }
3056
+ }
2119
3057
  } else {
2120
3058
  for (k=0; k<n; k++) {
2121
3059
  p1 = q1 + k*i1;
@@ -2133,8 +3071,8 @@ ca_bincmp_lt_float32_t (ca_size_t n, boolean8_t *m,
2133
3071
  char *ptr3, ca_size_t b3, ca_size_t i3,
2134
3072
  double tol)
2135
3073
  {
2136
- float *q1 = (float *) ptr1, *q2 = (float *) ptr2;
2137
- float *p1 = q1, *p2 = q2;
3074
+ ca_u_float32_t *q1 = (ca_u_float32_t *) ptr1, *q2 = (ca_u_float32_t *) ptr2;
3075
+ ca_u_float32_t *p1 = q1, *p2 = q2;
2138
3076
  boolean8_t *q3 = (boolean8_t *) ptr3;
2139
3077
  boolean8_t *p3 = q3;
2140
3078
  ca_size_t k;
@@ -2151,6 +3089,24 @@ ca_bincmp_lt_float32_t (ca_size_t n, boolean8_t *m,
2151
3089
  { (*p3) = ( (*p1) < (*p2) ); }
2152
3090
  }
2153
3091
  }
3092
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
3093
+ /* scalar on the right: read it once, so the boolean store
3094
+ cannot be taken to change it and the loop vectorizes */
3095
+ ca_u_float32_t sv = *q2;
3096
+ p2 = &sv;
3097
+ for (k=0; k<n; k++) {
3098
+ p1 = q1 + k;
3099
+ p3 = q3 + k;
3100
+ { (*p3) = ( (*p1) < (*p2) ); }
3101
+ }
3102
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
3103
+ ca_u_float32_t sv = *q1;
3104
+ p1 = &sv;
3105
+ for (k=0; k<n; k++) {
3106
+ p2 = q2 + k;
3107
+ p3 = q3 + k;
3108
+ { (*p3) = ( (*p1) < (*p2) ); }
3109
+ }
2154
3110
  } else {
2155
3111
  for (k=0; k<n; k++) {
2156
3112
  p1 = q1 + k*i1;
@@ -2168,8 +3124,8 @@ ca_bincmp_lt_float64_t (ca_size_t n, boolean8_t *m,
2168
3124
  char *ptr3, ca_size_t b3, ca_size_t i3,
2169
3125
  double tol)
2170
3126
  {
2171
- double *q1 = (double *) ptr1, *q2 = (double *) ptr2;
2172
- double *p1 = q1, *p2 = q2;
3127
+ ca_u_float64_t *q1 = (ca_u_float64_t *) ptr1, *q2 = (ca_u_float64_t *) ptr2;
3128
+ ca_u_float64_t *p1 = q1, *p2 = q2;
2173
3129
  boolean8_t *q3 = (boolean8_t *) ptr3;
2174
3130
  boolean8_t *p3 = q3;
2175
3131
  ca_size_t k;
@@ -2186,6 +3142,24 @@ ca_bincmp_lt_float64_t (ca_size_t n, boolean8_t *m,
2186
3142
  { (*p3) = ( (*p1) < (*p2) ); }
2187
3143
  }
2188
3144
  }
3145
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
3146
+ /* scalar on the right: read it once, so the boolean store
3147
+ cannot be taken to change it and the loop vectorizes */
3148
+ ca_u_float64_t sv = *q2;
3149
+ p2 = &sv;
3150
+ for (k=0; k<n; k++) {
3151
+ p1 = q1 + k;
3152
+ p3 = q3 + k;
3153
+ { (*p3) = ( (*p1) < (*p2) ); }
3154
+ }
3155
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
3156
+ ca_u_float64_t sv = *q1;
3157
+ p1 = &sv;
3158
+ for (k=0; k<n; k++) {
3159
+ p2 = q2 + k;
3160
+ p3 = q3 + k;
3161
+ { (*p3) = ( (*p1) < (*p2) ); }
3162
+ }
2189
3163
  } else {
2190
3164
  for (k=0; k<n; k++) {
2191
3165
  p1 = q1 + k*i1;
@@ -2221,6 +3195,24 @@ ca_bincmp_lt_VALUE (ca_size_t n, boolean8_t *m,
2221
3195
  { (*p3) = RTEST(rb_funcall((*p1), rb_intern("<"), 1, (*p2))) ? 1 : 0; }
2222
3196
  }
2223
3197
  }
3198
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
3199
+ /* scalar on the right: read it once, so the boolean store
3200
+ cannot be taken to change it and the loop vectorizes */
3201
+ VALUE sv = *q2;
3202
+ p2 = &sv;
3203
+ for (k=0; k<n; k++) {
3204
+ p1 = q1 + k;
3205
+ p3 = q3 + k;
3206
+ { (*p3) = RTEST(rb_funcall((*p1), rb_intern("<"), 1, (*p2))) ? 1 : 0; }
3207
+ }
3208
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
3209
+ VALUE sv = *q1;
3210
+ p1 = &sv;
3211
+ for (k=0; k<n; k++) {
3212
+ p2 = q2 + k;
3213
+ p3 = q3 + k;
3214
+ { (*p3) = RTEST(rb_funcall((*p1), rb_intern("<"), 1, (*p2))) ? 1 : 0; }
3215
+ }
2224
3216
  } else {
2225
3217
  for (k=0; k<n; k++) {
2226
3218
  p1 = q1 + k*i1;
@@ -2328,6 +3320,24 @@ ca_bincmp_ge_boolean8_t (ca_size_t n, boolean8_t *m,
2328
3320
  { (*p3) = ( (*p1) >= (*p2) ); }
2329
3321
  }
2330
3322
  }
3323
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
3324
+ /* scalar on the right: read it once, so the boolean store
3325
+ cannot be taken to change it and the loop vectorizes */
3326
+ boolean8_t sv = *q2;
3327
+ p2 = &sv;
3328
+ for (k=0; k<n; k++) {
3329
+ p1 = q1 + k;
3330
+ p3 = q3 + k;
3331
+ { (*p3) = ( (*p1) >= (*p2) ); }
3332
+ }
3333
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
3334
+ boolean8_t sv = *q1;
3335
+ p1 = &sv;
3336
+ for (k=0; k<n; k++) {
3337
+ p2 = q2 + k;
3338
+ p3 = q3 + k;
3339
+ { (*p3) = ( (*p1) >= (*p2) ); }
3340
+ }
2331
3341
  } else {
2332
3342
  for (k=0; k<n; k++) {
2333
3343
  p1 = q1 + k*i1;
@@ -2363,6 +3373,24 @@ ca_bincmp_ge_int8_t (ca_size_t n, boolean8_t *m,
2363
3373
  { (*p3) = ( (*p1) >= (*p2) ); }
2364
3374
  }
2365
3375
  }
3376
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
3377
+ /* scalar on the right: read it once, so the boolean store
3378
+ cannot be taken to change it and the loop vectorizes */
3379
+ int8_t sv = *q2;
3380
+ p2 = &sv;
3381
+ for (k=0; k<n; k++) {
3382
+ p1 = q1 + k;
3383
+ p3 = q3 + k;
3384
+ { (*p3) = ( (*p1) >= (*p2) ); }
3385
+ }
3386
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
3387
+ int8_t sv = *q1;
3388
+ p1 = &sv;
3389
+ for (k=0; k<n; k++) {
3390
+ p2 = q2 + k;
3391
+ p3 = q3 + k;
3392
+ { (*p3) = ( (*p1) >= (*p2) ); }
3393
+ }
2366
3394
  } else {
2367
3395
  for (k=0; k<n; k++) {
2368
3396
  p1 = q1 + k*i1;
@@ -2398,6 +3426,24 @@ ca_bincmp_ge_uint8_t (ca_size_t n, boolean8_t *m,
2398
3426
  { (*p3) = ( (*p1) >= (*p2) ); }
2399
3427
  }
2400
3428
  }
3429
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
3430
+ /* scalar on the right: read it once, so the boolean store
3431
+ cannot be taken to change it and the loop vectorizes */
3432
+ uint8_t sv = *q2;
3433
+ p2 = &sv;
3434
+ for (k=0; k<n; k++) {
3435
+ p1 = q1 + k;
3436
+ p3 = q3 + k;
3437
+ { (*p3) = ( (*p1) >= (*p2) ); }
3438
+ }
3439
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
3440
+ uint8_t sv = *q1;
3441
+ p1 = &sv;
3442
+ for (k=0; k<n; k++) {
3443
+ p2 = q2 + k;
3444
+ p3 = q3 + k;
3445
+ { (*p3) = ( (*p1) >= (*p2) ); }
3446
+ }
2401
3447
  } else {
2402
3448
  for (k=0; k<n; k++) {
2403
3449
  p1 = q1 + k*i1;
@@ -2415,8 +3461,8 @@ ca_bincmp_ge_int16_t (ca_size_t n, boolean8_t *m,
2415
3461
  char *ptr3, ca_size_t b3, ca_size_t i3,
2416
3462
  double tol)
2417
3463
  {
2418
- int16_t *q1 = (int16_t *) ptr1, *q2 = (int16_t *) ptr2;
2419
- int16_t *p1 = q1, *p2 = q2;
3464
+ ca_u_int16_t *q1 = (ca_u_int16_t *) ptr1, *q2 = (ca_u_int16_t *) ptr2;
3465
+ ca_u_int16_t *p1 = q1, *p2 = q2;
2420
3466
  boolean8_t *q3 = (boolean8_t *) ptr3;
2421
3467
  boolean8_t *p3 = q3;
2422
3468
  ca_size_t k;
@@ -2433,6 +3479,24 @@ ca_bincmp_ge_int16_t (ca_size_t n, boolean8_t *m,
2433
3479
  { (*p3) = ( (*p1) >= (*p2) ); }
2434
3480
  }
2435
3481
  }
3482
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
3483
+ /* scalar on the right: read it once, so the boolean store
3484
+ cannot be taken to change it and the loop vectorizes */
3485
+ ca_u_int16_t sv = *q2;
3486
+ p2 = &sv;
3487
+ for (k=0; k<n; k++) {
3488
+ p1 = q1 + k;
3489
+ p3 = q3 + k;
3490
+ { (*p3) = ( (*p1) >= (*p2) ); }
3491
+ }
3492
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
3493
+ ca_u_int16_t sv = *q1;
3494
+ p1 = &sv;
3495
+ for (k=0; k<n; k++) {
3496
+ p2 = q2 + k;
3497
+ p3 = q3 + k;
3498
+ { (*p3) = ( (*p1) >= (*p2) ); }
3499
+ }
2436
3500
  } else {
2437
3501
  for (k=0; k<n; k++) {
2438
3502
  p1 = q1 + k*i1;
@@ -2450,8 +3514,8 @@ ca_bincmp_ge_uint16_t (ca_size_t n, boolean8_t *m,
2450
3514
  char *ptr3, ca_size_t b3, ca_size_t i3,
2451
3515
  double tol)
2452
3516
  {
2453
- uint16_t *q1 = (uint16_t *) ptr1, *q2 = (uint16_t *) ptr2;
2454
- uint16_t *p1 = q1, *p2 = q2;
3517
+ ca_u_uint16_t *q1 = (ca_u_uint16_t *) ptr1, *q2 = (ca_u_uint16_t *) ptr2;
3518
+ ca_u_uint16_t *p1 = q1, *p2 = q2;
2455
3519
  boolean8_t *q3 = (boolean8_t *) ptr3;
2456
3520
  boolean8_t *p3 = q3;
2457
3521
  ca_size_t k;
@@ -2468,6 +3532,24 @@ ca_bincmp_ge_uint16_t (ca_size_t n, boolean8_t *m,
2468
3532
  { (*p3) = ( (*p1) >= (*p2) ); }
2469
3533
  }
2470
3534
  }
3535
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
3536
+ /* scalar on the right: read it once, so the boolean store
3537
+ cannot be taken to change it and the loop vectorizes */
3538
+ ca_u_uint16_t sv = *q2;
3539
+ p2 = &sv;
3540
+ for (k=0; k<n; k++) {
3541
+ p1 = q1 + k;
3542
+ p3 = q3 + k;
3543
+ { (*p3) = ( (*p1) >= (*p2) ); }
3544
+ }
3545
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
3546
+ ca_u_uint16_t sv = *q1;
3547
+ p1 = &sv;
3548
+ for (k=0; k<n; k++) {
3549
+ p2 = q2 + k;
3550
+ p3 = q3 + k;
3551
+ { (*p3) = ( (*p1) >= (*p2) ); }
3552
+ }
2471
3553
  } else {
2472
3554
  for (k=0; k<n; k++) {
2473
3555
  p1 = q1 + k*i1;
@@ -2485,8 +3567,8 @@ ca_bincmp_ge_int32_t (ca_size_t n, boolean8_t *m,
2485
3567
  char *ptr3, ca_size_t b3, ca_size_t i3,
2486
3568
  double tol)
2487
3569
  {
2488
- int32_t *q1 = (int32_t *) ptr1, *q2 = (int32_t *) ptr2;
2489
- int32_t *p1 = q1, *p2 = q2;
3570
+ ca_u_int32_t *q1 = (ca_u_int32_t *) ptr1, *q2 = (ca_u_int32_t *) ptr2;
3571
+ ca_u_int32_t *p1 = q1, *p2 = q2;
2490
3572
  boolean8_t *q3 = (boolean8_t *) ptr3;
2491
3573
  boolean8_t *p3 = q3;
2492
3574
  ca_size_t k;
@@ -2503,6 +3585,24 @@ ca_bincmp_ge_int32_t (ca_size_t n, boolean8_t *m,
2503
3585
  { (*p3) = ( (*p1) >= (*p2) ); }
2504
3586
  }
2505
3587
  }
3588
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
3589
+ /* scalar on the right: read it once, so the boolean store
3590
+ cannot be taken to change it and the loop vectorizes */
3591
+ ca_u_int32_t sv = *q2;
3592
+ p2 = &sv;
3593
+ for (k=0; k<n; k++) {
3594
+ p1 = q1 + k;
3595
+ p3 = q3 + k;
3596
+ { (*p3) = ( (*p1) >= (*p2) ); }
3597
+ }
3598
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
3599
+ ca_u_int32_t sv = *q1;
3600
+ p1 = &sv;
3601
+ for (k=0; k<n; k++) {
3602
+ p2 = q2 + k;
3603
+ p3 = q3 + k;
3604
+ { (*p3) = ( (*p1) >= (*p2) ); }
3605
+ }
2506
3606
  } else {
2507
3607
  for (k=0; k<n; k++) {
2508
3608
  p1 = q1 + k*i1;
@@ -2520,8 +3620,8 @@ ca_bincmp_ge_uint32_t (ca_size_t n, boolean8_t *m,
2520
3620
  char *ptr3, ca_size_t b3, ca_size_t i3,
2521
3621
  double tol)
2522
3622
  {
2523
- uint32_t *q1 = (uint32_t *) ptr1, *q2 = (uint32_t *) ptr2;
2524
- uint32_t *p1 = q1, *p2 = q2;
3623
+ ca_u_uint32_t *q1 = (ca_u_uint32_t *) ptr1, *q2 = (ca_u_uint32_t *) ptr2;
3624
+ ca_u_uint32_t *p1 = q1, *p2 = q2;
2525
3625
  boolean8_t *q3 = (boolean8_t *) ptr3;
2526
3626
  boolean8_t *p3 = q3;
2527
3627
  ca_size_t k;
@@ -2538,6 +3638,24 @@ ca_bincmp_ge_uint32_t (ca_size_t n, boolean8_t *m,
2538
3638
  { (*p3) = ( (*p1) >= (*p2) ); }
2539
3639
  }
2540
3640
  }
3641
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
3642
+ /* scalar on the right: read it once, so the boolean store
3643
+ cannot be taken to change it and the loop vectorizes */
3644
+ ca_u_uint32_t sv = *q2;
3645
+ p2 = &sv;
3646
+ for (k=0; k<n; k++) {
3647
+ p1 = q1 + k;
3648
+ p3 = q3 + k;
3649
+ { (*p3) = ( (*p1) >= (*p2) ); }
3650
+ }
3651
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
3652
+ ca_u_uint32_t sv = *q1;
3653
+ p1 = &sv;
3654
+ for (k=0; k<n; k++) {
3655
+ p2 = q2 + k;
3656
+ p3 = q3 + k;
3657
+ { (*p3) = ( (*p1) >= (*p2) ); }
3658
+ }
2541
3659
  } else {
2542
3660
  for (k=0; k<n; k++) {
2543
3661
  p1 = q1 + k*i1;
@@ -2555,8 +3673,8 @@ ca_bincmp_ge_int64_t (ca_size_t n, boolean8_t *m,
2555
3673
  char *ptr3, ca_size_t b3, ca_size_t i3,
2556
3674
  double tol)
2557
3675
  {
2558
- int64_t *q1 = (int64_t *) ptr1, *q2 = (int64_t *) ptr2;
2559
- int64_t *p1 = q1, *p2 = q2;
3676
+ ca_u_int64_t *q1 = (ca_u_int64_t *) ptr1, *q2 = (ca_u_int64_t *) ptr2;
3677
+ ca_u_int64_t *p1 = q1, *p2 = q2;
2560
3678
  boolean8_t *q3 = (boolean8_t *) ptr3;
2561
3679
  boolean8_t *p3 = q3;
2562
3680
  ca_size_t k;
@@ -2573,6 +3691,24 @@ ca_bincmp_ge_int64_t (ca_size_t n, boolean8_t *m,
2573
3691
  { (*p3) = ( (*p1) >= (*p2) ); }
2574
3692
  }
2575
3693
  }
3694
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
3695
+ /* scalar on the right: read it once, so the boolean store
3696
+ cannot be taken to change it and the loop vectorizes */
3697
+ ca_u_int64_t sv = *q2;
3698
+ p2 = &sv;
3699
+ for (k=0; k<n; k++) {
3700
+ p1 = q1 + k;
3701
+ p3 = q3 + k;
3702
+ { (*p3) = ( (*p1) >= (*p2) ); }
3703
+ }
3704
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
3705
+ ca_u_int64_t sv = *q1;
3706
+ p1 = &sv;
3707
+ for (k=0; k<n; k++) {
3708
+ p2 = q2 + k;
3709
+ p3 = q3 + k;
3710
+ { (*p3) = ( (*p1) >= (*p2) ); }
3711
+ }
2576
3712
  } else {
2577
3713
  for (k=0; k<n; k++) {
2578
3714
  p1 = q1 + k*i1;
@@ -2590,8 +3726,8 @@ ca_bincmp_ge_uint64_t (ca_size_t n, boolean8_t *m,
2590
3726
  char *ptr3, ca_size_t b3, ca_size_t i3,
2591
3727
  double tol)
2592
3728
  {
2593
- uint64_t *q1 = (uint64_t *) ptr1, *q2 = (uint64_t *) ptr2;
2594
- uint64_t *p1 = q1, *p2 = q2;
3729
+ ca_u_uint64_t *q1 = (ca_u_uint64_t *) ptr1, *q2 = (ca_u_uint64_t *) ptr2;
3730
+ ca_u_uint64_t *p1 = q1, *p2 = q2;
2595
3731
  boolean8_t *q3 = (boolean8_t *) ptr3;
2596
3732
  boolean8_t *p3 = q3;
2597
3733
  ca_size_t k;
@@ -2608,6 +3744,24 @@ ca_bincmp_ge_uint64_t (ca_size_t n, boolean8_t *m,
2608
3744
  { (*p3) = ( (*p1) >= (*p2) ); }
2609
3745
  }
2610
3746
  }
3747
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
3748
+ /* scalar on the right: read it once, so the boolean store
3749
+ cannot be taken to change it and the loop vectorizes */
3750
+ ca_u_uint64_t sv = *q2;
3751
+ p2 = &sv;
3752
+ for (k=0; k<n; k++) {
3753
+ p1 = q1 + k;
3754
+ p3 = q3 + k;
3755
+ { (*p3) = ( (*p1) >= (*p2) ); }
3756
+ }
3757
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
3758
+ ca_u_uint64_t sv = *q1;
3759
+ p1 = &sv;
3760
+ for (k=0; k<n; k++) {
3761
+ p2 = q2 + k;
3762
+ p3 = q3 + k;
3763
+ { (*p3) = ( (*p1) >= (*p2) ); }
3764
+ }
2611
3765
  } else {
2612
3766
  for (k=0; k<n; k++) {
2613
3767
  p1 = q1 + k*i1;
@@ -2625,8 +3779,8 @@ ca_bincmp_ge_float32_t (ca_size_t n, boolean8_t *m,
2625
3779
  char *ptr3, ca_size_t b3, ca_size_t i3,
2626
3780
  double tol)
2627
3781
  {
2628
- float *q1 = (float *) ptr1, *q2 = (float *) ptr2;
2629
- float *p1 = q1, *p2 = q2;
3782
+ ca_u_float32_t *q1 = (ca_u_float32_t *) ptr1, *q2 = (ca_u_float32_t *) ptr2;
3783
+ ca_u_float32_t *p1 = q1, *p2 = q2;
2630
3784
  boolean8_t *q3 = (boolean8_t *) ptr3;
2631
3785
  boolean8_t *p3 = q3;
2632
3786
  ca_size_t k;
@@ -2643,6 +3797,24 @@ ca_bincmp_ge_float32_t (ca_size_t n, boolean8_t *m,
2643
3797
  { (*p3) = ( (*p1) >= (*p2) ); }
2644
3798
  }
2645
3799
  }
3800
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
3801
+ /* scalar on the right: read it once, so the boolean store
3802
+ cannot be taken to change it and the loop vectorizes */
3803
+ ca_u_float32_t sv = *q2;
3804
+ p2 = &sv;
3805
+ for (k=0; k<n; k++) {
3806
+ p1 = q1 + k;
3807
+ p3 = q3 + k;
3808
+ { (*p3) = ( (*p1) >= (*p2) ); }
3809
+ }
3810
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
3811
+ ca_u_float32_t sv = *q1;
3812
+ p1 = &sv;
3813
+ for (k=0; k<n; k++) {
3814
+ p2 = q2 + k;
3815
+ p3 = q3 + k;
3816
+ { (*p3) = ( (*p1) >= (*p2) ); }
3817
+ }
2646
3818
  } else {
2647
3819
  for (k=0; k<n; k++) {
2648
3820
  p1 = q1 + k*i1;
@@ -2660,8 +3832,8 @@ ca_bincmp_ge_float64_t (ca_size_t n, boolean8_t *m,
2660
3832
  char *ptr3, ca_size_t b3, ca_size_t i3,
2661
3833
  double tol)
2662
3834
  {
2663
- double *q1 = (double *) ptr1, *q2 = (double *) ptr2;
2664
- double *p1 = q1, *p2 = q2;
3835
+ ca_u_float64_t *q1 = (ca_u_float64_t *) ptr1, *q2 = (ca_u_float64_t *) ptr2;
3836
+ ca_u_float64_t *p1 = q1, *p2 = q2;
2665
3837
  boolean8_t *q3 = (boolean8_t *) ptr3;
2666
3838
  boolean8_t *p3 = q3;
2667
3839
  ca_size_t k;
@@ -2678,6 +3850,24 @@ ca_bincmp_ge_float64_t (ca_size_t n, boolean8_t *m,
2678
3850
  { (*p3) = ( (*p1) >= (*p2) ); }
2679
3851
  }
2680
3852
  }
3853
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
3854
+ /* scalar on the right: read it once, so the boolean store
3855
+ cannot be taken to change it and the loop vectorizes */
3856
+ ca_u_float64_t sv = *q2;
3857
+ p2 = &sv;
3858
+ for (k=0; k<n; k++) {
3859
+ p1 = q1 + k;
3860
+ p3 = q3 + k;
3861
+ { (*p3) = ( (*p1) >= (*p2) ); }
3862
+ }
3863
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
3864
+ ca_u_float64_t sv = *q1;
3865
+ p1 = &sv;
3866
+ for (k=0; k<n; k++) {
3867
+ p2 = q2 + k;
3868
+ p3 = q3 + k;
3869
+ { (*p3) = ( (*p1) >= (*p2) ); }
3870
+ }
2681
3871
  } else {
2682
3872
  for (k=0; k<n; k++) {
2683
3873
  p1 = q1 + k*i1;
@@ -2713,6 +3903,24 @@ ca_bincmp_ge_VALUE (ca_size_t n, boolean8_t *m,
2713
3903
  { (*p3) = RTEST(rb_funcall((*p1), rb_intern(">="), 1, (*p2))) ? 1 : 0; }
2714
3904
  }
2715
3905
  }
3906
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
3907
+ /* scalar on the right: read it once, so the boolean store
3908
+ cannot be taken to change it and the loop vectorizes */
3909
+ VALUE sv = *q2;
3910
+ p2 = &sv;
3911
+ for (k=0; k<n; k++) {
3912
+ p1 = q1 + k;
3913
+ p3 = q3 + k;
3914
+ { (*p3) = RTEST(rb_funcall((*p1), rb_intern(">="), 1, (*p2))) ? 1 : 0; }
3915
+ }
3916
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
3917
+ VALUE sv = *q1;
3918
+ p1 = &sv;
3919
+ for (k=0; k<n; k++) {
3920
+ p2 = q2 + k;
3921
+ p3 = q3 + k;
3922
+ { (*p3) = RTEST(rb_funcall((*p1), rb_intern(">="), 1, (*p2))) ? 1 : 0; }
3923
+ }
2716
3924
  } else {
2717
3925
  for (k=0; k<n; k++) {
2718
3926
  p1 = q1 + k*i1;
@@ -2820,6 +4028,24 @@ ca_bincmp_le_boolean8_t (ca_size_t n, boolean8_t *m,
2820
4028
  { (*p3) = ( (*p1) <= (*p2) ); }
2821
4029
  }
2822
4030
  }
4031
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
4032
+ /* scalar on the right: read it once, so the boolean store
4033
+ cannot be taken to change it and the loop vectorizes */
4034
+ boolean8_t sv = *q2;
4035
+ p2 = &sv;
4036
+ for (k=0; k<n; k++) {
4037
+ p1 = q1 + k;
4038
+ p3 = q3 + k;
4039
+ { (*p3) = ( (*p1) <= (*p2) ); }
4040
+ }
4041
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
4042
+ boolean8_t sv = *q1;
4043
+ p1 = &sv;
4044
+ for (k=0; k<n; k++) {
4045
+ p2 = q2 + k;
4046
+ p3 = q3 + k;
4047
+ { (*p3) = ( (*p1) <= (*p2) ); }
4048
+ }
2823
4049
  } else {
2824
4050
  for (k=0; k<n; k++) {
2825
4051
  p1 = q1 + k*i1;
@@ -2855,6 +4081,24 @@ ca_bincmp_le_int8_t (ca_size_t n, boolean8_t *m,
2855
4081
  { (*p3) = ( (*p1) <= (*p2) ); }
2856
4082
  }
2857
4083
  }
4084
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
4085
+ /* scalar on the right: read it once, so the boolean store
4086
+ cannot be taken to change it and the loop vectorizes */
4087
+ int8_t sv = *q2;
4088
+ p2 = &sv;
4089
+ for (k=0; k<n; k++) {
4090
+ p1 = q1 + k;
4091
+ p3 = q3 + k;
4092
+ { (*p3) = ( (*p1) <= (*p2) ); }
4093
+ }
4094
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
4095
+ int8_t sv = *q1;
4096
+ p1 = &sv;
4097
+ for (k=0; k<n; k++) {
4098
+ p2 = q2 + k;
4099
+ p3 = q3 + k;
4100
+ { (*p3) = ( (*p1) <= (*p2) ); }
4101
+ }
2858
4102
  } else {
2859
4103
  for (k=0; k<n; k++) {
2860
4104
  p1 = q1 + k*i1;
@@ -2890,6 +4134,24 @@ ca_bincmp_le_uint8_t (ca_size_t n, boolean8_t *m,
2890
4134
  { (*p3) = ( (*p1) <= (*p2) ); }
2891
4135
  }
2892
4136
  }
4137
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
4138
+ /* scalar on the right: read it once, so the boolean store
4139
+ cannot be taken to change it and the loop vectorizes */
4140
+ uint8_t sv = *q2;
4141
+ p2 = &sv;
4142
+ for (k=0; k<n; k++) {
4143
+ p1 = q1 + k;
4144
+ p3 = q3 + k;
4145
+ { (*p3) = ( (*p1) <= (*p2) ); }
4146
+ }
4147
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
4148
+ uint8_t sv = *q1;
4149
+ p1 = &sv;
4150
+ for (k=0; k<n; k++) {
4151
+ p2 = q2 + k;
4152
+ p3 = q3 + k;
4153
+ { (*p3) = ( (*p1) <= (*p2) ); }
4154
+ }
2893
4155
  } else {
2894
4156
  for (k=0; k<n; k++) {
2895
4157
  p1 = q1 + k*i1;
@@ -2907,8 +4169,8 @@ ca_bincmp_le_int16_t (ca_size_t n, boolean8_t *m,
2907
4169
  char *ptr3, ca_size_t b3, ca_size_t i3,
2908
4170
  double tol)
2909
4171
  {
2910
- int16_t *q1 = (int16_t *) ptr1, *q2 = (int16_t *) ptr2;
2911
- int16_t *p1 = q1, *p2 = q2;
4172
+ ca_u_int16_t *q1 = (ca_u_int16_t *) ptr1, *q2 = (ca_u_int16_t *) ptr2;
4173
+ ca_u_int16_t *p1 = q1, *p2 = q2;
2912
4174
  boolean8_t *q3 = (boolean8_t *) ptr3;
2913
4175
  boolean8_t *p3 = q3;
2914
4176
  ca_size_t k;
@@ -2925,6 +4187,24 @@ ca_bincmp_le_int16_t (ca_size_t n, boolean8_t *m,
2925
4187
  { (*p3) = ( (*p1) <= (*p2) ); }
2926
4188
  }
2927
4189
  }
4190
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
4191
+ /* scalar on the right: read it once, so the boolean store
4192
+ cannot be taken to change it and the loop vectorizes */
4193
+ ca_u_int16_t sv = *q2;
4194
+ p2 = &sv;
4195
+ for (k=0; k<n; k++) {
4196
+ p1 = q1 + k;
4197
+ p3 = q3 + k;
4198
+ { (*p3) = ( (*p1) <= (*p2) ); }
4199
+ }
4200
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
4201
+ ca_u_int16_t sv = *q1;
4202
+ p1 = &sv;
4203
+ for (k=0; k<n; k++) {
4204
+ p2 = q2 + k;
4205
+ p3 = q3 + k;
4206
+ { (*p3) = ( (*p1) <= (*p2) ); }
4207
+ }
2928
4208
  } else {
2929
4209
  for (k=0; k<n; k++) {
2930
4210
  p1 = q1 + k*i1;
@@ -2942,8 +4222,8 @@ ca_bincmp_le_uint16_t (ca_size_t n, boolean8_t *m,
2942
4222
  char *ptr3, ca_size_t b3, ca_size_t i3,
2943
4223
  double tol)
2944
4224
  {
2945
- uint16_t *q1 = (uint16_t *) ptr1, *q2 = (uint16_t *) ptr2;
2946
- uint16_t *p1 = q1, *p2 = q2;
4225
+ ca_u_uint16_t *q1 = (ca_u_uint16_t *) ptr1, *q2 = (ca_u_uint16_t *) ptr2;
4226
+ ca_u_uint16_t *p1 = q1, *p2 = q2;
2947
4227
  boolean8_t *q3 = (boolean8_t *) ptr3;
2948
4228
  boolean8_t *p3 = q3;
2949
4229
  ca_size_t k;
@@ -2960,6 +4240,24 @@ ca_bincmp_le_uint16_t (ca_size_t n, boolean8_t *m,
2960
4240
  { (*p3) = ( (*p1) <= (*p2) ); }
2961
4241
  }
2962
4242
  }
4243
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
4244
+ /* scalar on the right: read it once, so the boolean store
4245
+ cannot be taken to change it and the loop vectorizes */
4246
+ ca_u_uint16_t sv = *q2;
4247
+ p2 = &sv;
4248
+ for (k=0; k<n; k++) {
4249
+ p1 = q1 + k;
4250
+ p3 = q3 + k;
4251
+ { (*p3) = ( (*p1) <= (*p2) ); }
4252
+ }
4253
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
4254
+ ca_u_uint16_t sv = *q1;
4255
+ p1 = &sv;
4256
+ for (k=0; k<n; k++) {
4257
+ p2 = q2 + k;
4258
+ p3 = q3 + k;
4259
+ { (*p3) = ( (*p1) <= (*p2) ); }
4260
+ }
2963
4261
  } else {
2964
4262
  for (k=0; k<n; k++) {
2965
4263
  p1 = q1 + k*i1;
@@ -2977,8 +4275,8 @@ ca_bincmp_le_int32_t (ca_size_t n, boolean8_t *m,
2977
4275
  char *ptr3, ca_size_t b3, ca_size_t i3,
2978
4276
  double tol)
2979
4277
  {
2980
- int32_t *q1 = (int32_t *) ptr1, *q2 = (int32_t *) ptr2;
2981
- int32_t *p1 = q1, *p2 = q2;
4278
+ ca_u_int32_t *q1 = (ca_u_int32_t *) ptr1, *q2 = (ca_u_int32_t *) ptr2;
4279
+ ca_u_int32_t *p1 = q1, *p2 = q2;
2982
4280
  boolean8_t *q3 = (boolean8_t *) ptr3;
2983
4281
  boolean8_t *p3 = q3;
2984
4282
  ca_size_t k;
@@ -2995,6 +4293,24 @@ ca_bincmp_le_int32_t (ca_size_t n, boolean8_t *m,
2995
4293
  { (*p3) = ( (*p1) <= (*p2) ); }
2996
4294
  }
2997
4295
  }
4296
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
4297
+ /* scalar on the right: read it once, so the boolean store
4298
+ cannot be taken to change it and the loop vectorizes */
4299
+ ca_u_int32_t sv = *q2;
4300
+ p2 = &sv;
4301
+ for (k=0; k<n; k++) {
4302
+ p1 = q1 + k;
4303
+ p3 = q3 + k;
4304
+ { (*p3) = ( (*p1) <= (*p2) ); }
4305
+ }
4306
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
4307
+ ca_u_int32_t sv = *q1;
4308
+ p1 = &sv;
4309
+ for (k=0; k<n; k++) {
4310
+ p2 = q2 + k;
4311
+ p3 = q3 + k;
4312
+ { (*p3) = ( (*p1) <= (*p2) ); }
4313
+ }
2998
4314
  } else {
2999
4315
  for (k=0; k<n; k++) {
3000
4316
  p1 = q1 + k*i1;
@@ -3012,8 +4328,8 @@ ca_bincmp_le_uint32_t (ca_size_t n, boolean8_t *m,
3012
4328
  char *ptr3, ca_size_t b3, ca_size_t i3,
3013
4329
  double tol)
3014
4330
  {
3015
- uint32_t *q1 = (uint32_t *) ptr1, *q2 = (uint32_t *) ptr2;
3016
- uint32_t *p1 = q1, *p2 = q2;
4331
+ ca_u_uint32_t *q1 = (ca_u_uint32_t *) ptr1, *q2 = (ca_u_uint32_t *) ptr2;
4332
+ ca_u_uint32_t *p1 = q1, *p2 = q2;
3017
4333
  boolean8_t *q3 = (boolean8_t *) ptr3;
3018
4334
  boolean8_t *p3 = q3;
3019
4335
  ca_size_t k;
@@ -3030,6 +4346,24 @@ ca_bincmp_le_uint32_t (ca_size_t n, boolean8_t *m,
3030
4346
  { (*p3) = ( (*p1) <= (*p2) ); }
3031
4347
  }
3032
4348
  }
4349
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
4350
+ /* scalar on the right: read it once, so the boolean store
4351
+ cannot be taken to change it and the loop vectorizes */
4352
+ ca_u_uint32_t sv = *q2;
4353
+ p2 = &sv;
4354
+ for (k=0; k<n; k++) {
4355
+ p1 = q1 + k;
4356
+ p3 = q3 + k;
4357
+ { (*p3) = ( (*p1) <= (*p2) ); }
4358
+ }
4359
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
4360
+ ca_u_uint32_t sv = *q1;
4361
+ p1 = &sv;
4362
+ for (k=0; k<n; k++) {
4363
+ p2 = q2 + k;
4364
+ p3 = q3 + k;
4365
+ { (*p3) = ( (*p1) <= (*p2) ); }
4366
+ }
3033
4367
  } else {
3034
4368
  for (k=0; k<n; k++) {
3035
4369
  p1 = q1 + k*i1;
@@ -3047,8 +4381,8 @@ ca_bincmp_le_int64_t (ca_size_t n, boolean8_t *m,
3047
4381
  char *ptr3, ca_size_t b3, ca_size_t i3,
3048
4382
  double tol)
3049
4383
  {
3050
- int64_t *q1 = (int64_t *) ptr1, *q2 = (int64_t *) ptr2;
3051
- int64_t *p1 = q1, *p2 = q2;
4384
+ ca_u_int64_t *q1 = (ca_u_int64_t *) ptr1, *q2 = (ca_u_int64_t *) ptr2;
4385
+ ca_u_int64_t *p1 = q1, *p2 = q2;
3052
4386
  boolean8_t *q3 = (boolean8_t *) ptr3;
3053
4387
  boolean8_t *p3 = q3;
3054
4388
  ca_size_t k;
@@ -3065,6 +4399,24 @@ ca_bincmp_le_int64_t (ca_size_t n, boolean8_t *m,
3065
4399
  { (*p3) = ( (*p1) <= (*p2) ); }
3066
4400
  }
3067
4401
  }
4402
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
4403
+ /* scalar on the right: read it once, so the boolean store
4404
+ cannot be taken to change it and the loop vectorizes */
4405
+ ca_u_int64_t sv = *q2;
4406
+ p2 = &sv;
4407
+ for (k=0; k<n; k++) {
4408
+ p1 = q1 + k;
4409
+ p3 = q3 + k;
4410
+ { (*p3) = ( (*p1) <= (*p2) ); }
4411
+ }
4412
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
4413
+ ca_u_int64_t sv = *q1;
4414
+ p1 = &sv;
4415
+ for (k=0; k<n; k++) {
4416
+ p2 = q2 + k;
4417
+ p3 = q3 + k;
4418
+ { (*p3) = ( (*p1) <= (*p2) ); }
4419
+ }
3068
4420
  } else {
3069
4421
  for (k=0; k<n; k++) {
3070
4422
  p1 = q1 + k*i1;
@@ -3082,8 +4434,8 @@ ca_bincmp_le_uint64_t (ca_size_t n, boolean8_t *m,
3082
4434
  char *ptr3, ca_size_t b3, ca_size_t i3,
3083
4435
  double tol)
3084
4436
  {
3085
- uint64_t *q1 = (uint64_t *) ptr1, *q2 = (uint64_t *) ptr2;
3086
- uint64_t *p1 = q1, *p2 = q2;
4437
+ ca_u_uint64_t *q1 = (ca_u_uint64_t *) ptr1, *q2 = (ca_u_uint64_t *) ptr2;
4438
+ ca_u_uint64_t *p1 = q1, *p2 = q2;
3087
4439
  boolean8_t *q3 = (boolean8_t *) ptr3;
3088
4440
  boolean8_t *p3 = q3;
3089
4441
  ca_size_t k;
@@ -3100,6 +4452,24 @@ ca_bincmp_le_uint64_t (ca_size_t n, boolean8_t *m,
3100
4452
  { (*p3) = ( (*p1) <= (*p2) ); }
3101
4453
  }
3102
4454
  }
4455
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
4456
+ /* scalar on the right: read it once, so the boolean store
4457
+ cannot be taken to change it and the loop vectorizes */
4458
+ ca_u_uint64_t sv = *q2;
4459
+ p2 = &sv;
4460
+ for (k=0; k<n; k++) {
4461
+ p1 = q1 + k;
4462
+ p3 = q3 + k;
4463
+ { (*p3) = ( (*p1) <= (*p2) ); }
4464
+ }
4465
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
4466
+ ca_u_uint64_t sv = *q1;
4467
+ p1 = &sv;
4468
+ for (k=0; k<n; k++) {
4469
+ p2 = q2 + k;
4470
+ p3 = q3 + k;
4471
+ { (*p3) = ( (*p1) <= (*p2) ); }
4472
+ }
3103
4473
  } else {
3104
4474
  for (k=0; k<n; k++) {
3105
4475
  p1 = q1 + k*i1;
@@ -3117,8 +4487,8 @@ ca_bincmp_le_float32_t (ca_size_t n, boolean8_t *m,
3117
4487
  char *ptr3, ca_size_t b3, ca_size_t i3,
3118
4488
  double tol)
3119
4489
  {
3120
- float *q1 = (float *) ptr1, *q2 = (float *) ptr2;
3121
- float *p1 = q1, *p2 = q2;
4490
+ ca_u_float32_t *q1 = (ca_u_float32_t *) ptr1, *q2 = (ca_u_float32_t *) ptr2;
4491
+ ca_u_float32_t *p1 = q1, *p2 = q2;
3122
4492
  boolean8_t *q3 = (boolean8_t *) ptr3;
3123
4493
  boolean8_t *p3 = q3;
3124
4494
  ca_size_t k;
@@ -3135,6 +4505,24 @@ ca_bincmp_le_float32_t (ca_size_t n, boolean8_t *m,
3135
4505
  { (*p3) = ( (*p1) <= (*p2) ); }
3136
4506
  }
3137
4507
  }
4508
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
4509
+ /* scalar on the right: read it once, so the boolean store
4510
+ cannot be taken to change it and the loop vectorizes */
4511
+ ca_u_float32_t sv = *q2;
4512
+ p2 = &sv;
4513
+ for (k=0; k<n; k++) {
4514
+ p1 = q1 + k;
4515
+ p3 = q3 + k;
4516
+ { (*p3) = ( (*p1) <= (*p2) ); }
4517
+ }
4518
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
4519
+ ca_u_float32_t sv = *q1;
4520
+ p1 = &sv;
4521
+ for (k=0; k<n; k++) {
4522
+ p2 = q2 + k;
4523
+ p3 = q3 + k;
4524
+ { (*p3) = ( (*p1) <= (*p2) ); }
4525
+ }
3138
4526
  } else {
3139
4527
  for (k=0; k<n; k++) {
3140
4528
  p1 = q1 + k*i1;
@@ -3152,8 +4540,8 @@ ca_bincmp_le_float64_t (ca_size_t n, boolean8_t *m,
3152
4540
  char *ptr3, ca_size_t b3, ca_size_t i3,
3153
4541
  double tol)
3154
4542
  {
3155
- double *q1 = (double *) ptr1, *q2 = (double *) ptr2;
3156
- double *p1 = q1, *p2 = q2;
4543
+ ca_u_float64_t *q1 = (ca_u_float64_t *) ptr1, *q2 = (ca_u_float64_t *) ptr2;
4544
+ ca_u_float64_t *p1 = q1, *p2 = q2;
3157
4545
  boolean8_t *q3 = (boolean8_t *) ptr3;
3158
4546
  boolean8_t *p3 = q3;
3159
4547
  ca_size_t k;
@@ -3170,6 +4558,24 @@ ca_bincmp_le_float64_t (ca_size_t n, boolean8_t *m,
3170
4558
  { (*p3) = ( (*p1) <= (*p2) ); }
3171
4559
  }
3172
4560
  }
4561
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
4562
+ /* scalar on the right: read it once, so the boolean store
4563
+ cannot be taken to change it and the loop vectorizes */
4564
+ ca_u_float64_t sv = *q2;
4565
+ p2 = &sv;
4566
+ for (k=0; k<n; k++) {
4567
+ p1 = q1 + k;
4568
+ p3 = q3 + k;
4569
+ { (*p3) = ( (*p1) <= (*p2) ); }
4570
+ }
4571
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
4572
+ ca_u_float64_t sv = *q1;
4573
+ p1 = &sv;
4574
+ for (k=0; k<n; k++) {
4575
+ p2 = q2 + k;
4576
+ p3 = q3 + k;
4577
+ { (*p3) = ( (*p1) <= (*p2) ); }
4578
+ }
3173
4579
  } else {
3174
4580
  for (k=0; k<n; k++) {
3175
4581
  p1 = q1 + k*i1;
@@ -3205,6 +4611,24 @@ ca_bincmp_le_VALUE (ca_size_t n, boolean8_t *m,
3205
4611
  { (*p3) = RTEST(rb_funcall((*p1), rb_intern("<="), 1, (*p2))) ? 1 : 0; }
3206
4612
  }
3207
4613
  }
4614
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
4615
+ /* scalar on the right: read it once, so the boolean store
4616
+ cannot be taken to change it and the loop vectorizes */
4617
+ VALUE sv = *q2;
4618
+ p2 = &sv;
4619
+ for (k=0; k<n; k++) {
4620
+ p1 = q1 + k;
4621
+ p3 = q3 + k;
4622
+ { (*p3) = RTEST(rb_funcall((*p1), rb_intern("<="), 1, (*p2))) ? 1 : 0; }
4623
+ }
4624
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
4625
+ VALUE sv = *q1;
4626
+ p1 = &sv;
4627
+ for (k=0; k<n; k++) {
4628
+ p2 = q2 + k;
4629
+ p3 = q3 + k;
4630
+ { (*p3) = RTEST(rb_funcall((*p1), rb_intern("<="), 1, (*p2))) ? 1 : 0; }
4631
+ }
3208
4632
  } else {
3209
4633
  for (k=0; k<n; k++) {
3210
4634
  p1 = q1 + k*i1;
@@ -3310,6 +4734,24 @@ ca_bincmp_match_VALUE (ca_size_t n, boolean8_t *m,
3310
4734
  { (*p3) = RTEST(rb_funcall((*p1), rb_intern("=~"), 1, (*p2))); }
3311
4735
  }
3312
4736
  }
4737
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
4738
+ /* scalar on the right: read it once, so the boolean store
4739
+ cannot be taken to change it and the loop vectorizes */
4740
+ VALUE sv = *q2;
4741
+ p2 = &sv;
4742
+ for (k=0; k<n; k++) {
4743
+ p1 = q1 + k;
4744
+ p3 = q3 + k;
4745
+ { (*p3) = RTEST(rb_funcall((*p1), rb_intern("=~"), 1, (*p2))); }
4746
+ }
4747
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
4748
+ VALUE sv = *q1;
4749
+ p1 = &sv;
4750
+ for (k=0; k<n; k++) {
4751
+ p2 = q2 + k;
4752
+ p3 = q3 + k;
4753
+ { (*p3) = RTEST(rb_funcall((*p1), rb_intern("=~"), 1, (*p2))); }
4754
+ }
3313
4755
  } else {
3314
4756
  for (k=0; k<n; k++) {
3315
4757
  p1 = q1 + k*i1;
@@ -3376,6 +4818,24 @@ ca_bincmp_is_kind_of_VALUE (ca_size_t n, boolean8_t *m,
3376
4818
  { (*p3) = RTEST(rb_obj_is_kind_of((*p1), (*p2))); }
3377
4819
  }
3378
4820
  }
4821
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
4822
+ /* scalar on the right: read it once, so the boolean store
4823
+ cannot be taken to change it and the loop vectorizes */
4824
+ VALUE sv = *q2;
4825
+ p2 = &sv;
4826
+ for (k=0; k<n; k++) {
4827
+ p1 = q1 + k;
4828
+ p3 = q3 + k;
4829
+ { (*p3) = RTEST(rb_obj_is_kind_of((*p1), (*p2))); }
4830
+ }
4831
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
4832
+ VALUE sv = *q1;
4833
+ p1 = &sv;
4834
+ for (k=0; k<n; k++) {
4835
+ p2 = q2 + k;
4836
+ p3 = q3 + k;
4837
+ { (*p3) = RTEST(rb_obj_is_kind_of((*p1), (*p2))); }
4838
+ }
3379
4839
  } else {
3380
4840
  for (k=0; k<n; k++) {
3381
4841
  p1 = q1 + k*i1;
@@ -3442,6 +4902,24 @@ ca_bincmp_is_close_int8_t (ca_size_t n, boolean8_t *m,
3442
4902
  { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
3443
4903
  }
3444
4904
  }
4905
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
4906
+ /* scalar on the right: read it once, so the boolean store
4907
+ cannot be taken to change it and the loop vectorizes */
4908
+ int8_t sv = *q2;
4909
+ p2 = &sv;
4910
+ for (k=0; k<n; k++) {
4911
+ p1 = q1 + k;
4912
+ p3 = q3 + k;
4913
+ { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
4914
+ }
4915
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
4916
+ int8_t sv = *q1;
4917
+ p1 = &sv;
4918
+ for (k=0; k<n; k++) {
4919
+ p2 = q2 + k;
4920
+ p3 = q3 + k;
4921
+ { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
4922
+ }
3445
4923
  } else {
3446
4924
  for (k=0; k<n; k++) {
3447
4925
  p1 = q1 + k*i1;
@@ -3477,6 +4955,24 @@ ca_bincmp_is_close_uint8_t (ca_size_t n, boolean8_t *m,
3477
4955
  { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
3478
4956
  }
3479
4957
  }
4958
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
4959
+ /* scalar on the right: read it once, so the boolean store
4960
+ cannot be taken to change it and the loop vectorizes */
4961
+ uint8_t sv = *q2;
4962
+ p2 = &sv;
4963
+ for (k=0; k<n; k++) {
4964
+ p1 = q1 + k;
4965
+ p3 = q3 + k;
4966
+ { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
4967
+ }
4968
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
4969
+ uint8_t sv = *q1;
4970
+ p1 = &sv;
4971
+ for (k=0; k<n; k++) {
4972
+ p2 = q2 + k;
4973
+ p3 = q3 + k;
4974
+ { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
4975
+ }
3480
4976
  } else {
3481
4977
  for (k=0; k<n; k++) {
3482
4978
  p1 = q1 + k*i1;
@@ -3494,8 +4990,8 @@ ca_bincmp_is_close_int16_t (ca_size_t n, boolean8_t *m,
3494
4990
  char *ptr3, ca_size_t b3, ca_size_t i3,
3495
4991
  double tol)
3496
4992
  {
3497
- int16_t *q1 = (int16_t *) ptr1, *q2 = (int16_t *) ptr2;
3498
- int16_t *p1 = q1, *p2 = q2;
4993
+ ca_u_int16_t *q1 = (ca_u_int16_t *) ptr1, *q2 = (ca_u_int16_t *) ptr2;
4994
+ ca_u_int16_t *p1 = q1, *p2 = q2;
3499
4995
  boolean8_t *q3 = (boolean8_t *) ptr3;
3500
4996
  boolean8_t *p3 = q3;
3501
4997
  ca_size_t k;
@@ -3512,6 +5008,24 @@ ca_bincmp_is_close_int16_t (ca_size_t n, boolean8_t *m,
3512
5008
  { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
3513
5009
  }
3514
5010
  }
5011
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
5012
+ /* scalar on the right: read it once, so the boolean store
5013
+ cannot be taken to change it and the loop vectorizes */
5014
+ ca_u_int16_t sv = *q2;
5015
+ p2 = &sv;
5016
+ for (k=0; k<n; k++) {
5017
+ p1 = q1 + k;
5018
+ p3 = q3 + k;
5019
+ { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
5020
+ }
5021
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
5022
+ ca_u_int16_t sv = *q1;
5023
+ p1 = &sv;
5024
+ for (k=0; k<n; k++) {
5025
+ p2 = q2 + k;
5026
+ p3 = q3 + k;
5027
+ { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
5028
+ }
3515
5029
  } else {
3516
5030
  for (k=0; k<n; k++) {
3517
5031
  p1 = q1 + k*i1;
@@ -3529,8 +5043,8 @@ ca_bincmp_is_close_uint16_t (ca_size_t n, boolean8_t *m,
3529
5043
  char *ptr3, ca_size_t b3, ca_size_t i3,
3530
5044
  double tol)
3531
5045
  {
3532
- uint16_t *q1 = (uint16_t *) ptr1, *q2 = (uint16_t *) ptr2;
3533
- uint16_t *p1 = q1, *p2 = q2;
5046
+ ca_u_uint16_t *q1 = (ca_u_uint16_t *) ptr1, *q2 = (ca_u_uint16_t *) ptr2;
5047
+ ca_u_uint16_t *p1 = q1, *p2 = q2;
3534
5048
  boolean8_t *q3 = (boolean8_t *) ptr3;
3535
5049
  boolean8_t *p3 = q3;
3536
5050
  ca_size_t k;
@@ -3547,6 +5061,24 @@ ca_bincmp_is_close_uint16_t (ca_size_t n, boolean8_t *m,
3547
5061
  { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
3548
5062
  }
3549
5063
  }
5064
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
5065
+ /* scalar on the right: read it once, so the boolean store
5066
+ cannot be taken to change it and the loop vectorizes */
5067
+ ca_u_uint16_t sv = *q2;
5068
+ p2 = &sv;
5069
+ for (k=0; k<n; k++) {
5070
+ p1 = q1 + k;
5071
+ p3 = q3 + k;
5072
+ { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
5073
+ }
5074
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
5075
+ ca_u_uint16_t sv = *q1;
5076
+ p1 = &sv;
5077
+ for (k=0; k<n; k++) {
5078
+ p2 = q2 + k;
5079
+ p3 = q3 + k;
5080
+ { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
5081
+ }
3550
5082
  } else {
3551
5083
  for (k=0; k<n; k++) {
3552
5084
  p1 = q1 + k*i1;
@@ -3564,8 +5096,8 @@ ca_bincmp_is_close_int32_t (ca_size_t n, boolean8_t *m,
3564
5096
  char *ptr3, ca_size_t b3, ca_size_t i3,
3565
5097
  double tol)
3566
5098
  {
3567
- int32_t *q1 = (int32_t *) ptr1, *q2 = (int32_t *) ptr2;
3568
- int32_t *p1 = q1, *p2 = q2;
5099
+ ca_u_int32_t *q1 = (ca_u_int32_t *) ptr1, *q2 = (ca_u_int32_t *) ptr2;
5100
+ ca_u_int32_t *p1 = q1, *p2 = q2;
3569
5101
  boolean8_t *q3 = (boolean8_t *) ptr3;
3570
5102
  boolean8_t *p3 = q3;
3571
5103
  ca_size_t k;
@@ -3582,6 +5114,24 @@ ca_bincmp_is_close_int32_t (ca_size_t n, boolean8_t *m,
3582
5114
  { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
3583
5115
  }
3584
5116
  }
5117
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
5118
+ /* scalar on the right: read it once, so the boolean store
5119
+ cannot be taken to change it and the loop vectorizes */
5120
+ ca_u_int32_t sv = *q2;
5121
+ p2 = &sv;
5122
+ for (k=0; k<n; k++) {
5123
+ p1 = q1 + k;
5124
+ p3 = q3 + k;
5125
+ { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
5126
+ }
5127
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
5128
+ ca_u_int32_t sv = *q1;
5129
+ p1 = &sv;
5130
+ for (k=0; k<n; k++) {
5131
+ p2 = q2 + k;
5132
+ p3 = q3 + k;
5133
+ { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
5134
+ }
3585
5135
  } else {
3586
5136
  for (k=0; k<n; k++) {
3587
5137
  p1 = q1 + k*i1;
@@ -3599,8 +5149,8 @@ ca_bincmp_is_close_uint32_t (ca_size_t n, boolean8_t *m,
3599
5149
  char *ptr3, ca_size_t b3, ca_size_t i3,
3600
5150
  double tol)
3601
5151
  {
3602
- uint32_t *q1 = (uint32_t *) ptr1, *q2 = (uint32_t *) ptr2;
3603
- uint32_t *p1 = q1, *p2 = q2;
5152
+ ca_u_uint32_t *q1 = (ca_u_uint32_t *) ptr1, *q2 = (ca_u_uint32_t *) ptr2;
5153
+ ca_u_uint32_t *p1 = q1, *p2 = q2;
3604
5154
  boolean8_t *q3 = (boolean8_t *) ptr3;
3605
5155
  boolean8_t *p3 = q3;
3606
5156
  ca_size_t k;
@@ -3617,6 +5167,24 @@ ca_bincmp_is_close_uint32_t (ca_size_t n, boolean8_t *m,
3617
5167
  { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
3618
5168
  }
3619
5169
  }
5170
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
5171
+ /* scalar on the right: read it once, so the boolean store
5172
+ cannot be taken to change it and the loop vectorizes */
5173
+ ca_u_uint32_t sv = *q2;
5174
+ p2 = &sv;
5175
+ for (k=0; k<n; k++) {
5176
+ p1 = q1 + k;
5177
+ p3 = q3 + k;
5178
+ { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
5179
+ }
5180
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
5181
+ ca_u_uint32_t sv = *q1;
5182
+ p1 = &sv;
5183
+ for (k=0; k<n; k++) {
5184
+ p2 = q2 + k;
5185
+ p3 = q3 + k;
5186
+ { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
5187
+ }
3620
5188
  } else {
3621
5189
  for (k=0; k<n; k++) {
3622
5190
  p1 = q1 + k*i1;
@@ -3634,8 +5202,8 @@ ca_bincmp_is_close_int64_t (ca_size_t n, boolean8_t *m,
3634
5202
  char *ptr3, ca_size_t b3, ca_size_t i3,
3635
5203
  double tol)
3636
5204
  {
3637
- int64_t *q1 = (int64_t *) ptr1, *q2 = (int64_t *) ptr2;
3638
- int64_t *p1 = q1, *p2 = q2;
5205
+ ca_u_int64_t *q1 = (ca_u_int64_t *) ptr1, *q2 = (ca_u_int64_t *) ptr2;
5206
+ ca_u_int64_t *p1 = q1, *p2 = q2;
3639
5207
  boolean8_t *q3 = (boolean8_t *) ptr3;
3640
5208
  boolean8_t *p3 = q3;
3641
5209
  ca_size_t k;
@@ -3652,6 +5220,24 @@ ca_bincmp_is_close_int64_t (ca_size_t n, boolean8_t *m,
3652
5220
  { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
3653
5221
  }
3654
5222
  }
5223
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
5224
+ /* scalar on the right: read it once, so the boolean store
5225
+ cannot be taken to change it and the loop vectorizes */
5226
+ ca_u_int64_t sv = *q2;
5227
+ p2 = &sv;
5228
+ for (k=0; k<n; k++) {
5229
+ p1 = q1 + k;
5230
+ p3 = q3 + k;
5231
+ { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
5232
+ }
5233
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
5234
+ ca_u_int64_t sv = *q1;
5235
+ p1 = &sv;
5236
+ for (k=0; k<n; k++) {
5237
+ p2 = q2 + k;
5238
+ p3 = q3 + k;
5239
+ { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
5240
+ }
3655
5241
  } else {
3656
5242
  for (k=0; k<n; k++) {
3657
5243
  p1 = q1 + k*i1;
@@ -3669,8 +5255,8 @@ ca_bincmp_is_close_uint64_t (ca_size_t n, boolean8_t *m,
3669
5255
  char *ptr3, ca_size_t b3, ca_size_t i3,
3670
5256
  double tol)
3671
5257
  {
3672
- uint64_t *q1 = (uint64_t *) ptr1, *q2 = (uint64_t *) ptr2;
3673
- uint64_t *p1 = q1, *p2 = q2;
5258
+ ca_u_uint64_t *q1 = (ca_u_uint64_t *) ptr1, *q2 = (ca_u_uint64_t *) ptr2;
5259
+ ca_u_uint64_t *p1 = q1, *p2 = q2;
3674
5260
  boolean8_t *q3 = (boolean8_t *) ptr3;
3675
5261
  boolean8_t *p3 = q3;
3676
5262
  ca_size_t k;
@@ -3687,6 +5273,24 @@ ca_bincmp_is_close_uint64_t (ca_size_t n, boolean8_t *m,
3687
5273
  { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
3688
5274
  }
3689
5275
  }
5276
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
5277
+ /* scalar on the right: read it once, so the boolean store
5278
+ cannot be taken to change it and the loop vectorizes */
5279
+ ca_u_uint64_t sv = *q2;
5280
+ p2 = &sv;
5281
+ for (k=0; k<n; k++) {
5282
+ p1 = q1 + k;
5283
+ p3 = q3 + k;
5284
+ { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
5285
+ }
5286
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
5287
+ ca_u_uint64_t sv = *q1;
5288
+ p1 = &sv;
5289
+ for (k=0; k<n; k++) {
5290
+ p2 = q2 + k;
5291
+ p3 = q3 + k;
5292
+ { (*p3) = (fabs((double)(*p1) - (double)(*p2)) <= tol) ? 1 : 0; }
5293
+ }
3690
5294
  } else {
3691
5295
  for (k=0; k<n; k++) {
3692
5296
  p1 = q1 + k*i1;
@@ -3704,8 +5308,8 @@ ca_bincmp_is_close_float32_t (ca_size_t n, boolean8_t *m,
3704
5308
  char *ptr3, ca_size_t b3, ca_size_t i3,
3705
5309
  double tol)
3706
5310
  {
3707
- float *q1 = (float *) ptr1, *q2 = (float *) ptr2;
3708
- float *p1 = q1, *p2 = q2;
5311
+ ca_u_float32_t *q1 = (ca_u_float32_t *) ptr1, *q2 = (ca_u_float32_t *) ptr2;
5312
+ ca_u_float32_t *p1 = q1, *p2 = q2;
3709
5313
  boolean8_t *q3 = (boolean8_t *) ptr3;
3710
5314
  boolean8_t *p3 = q3;
3711
5315
  ca_size_t k;
@@ -3722,6 +5326,24 @@ ca_bincmp_is_close_float32_t (ca_size_t n, boolean8_t *m,
3722
5326
  { (*p3) = (fabs((*p1) - (*p2)) <= tol) ? 1 : 0; }
3723
5327
  }
3724
5328
  }
5329
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
5330
+ /* scalar on the right: read it once, so the boolean store
5331
+ cannot be taken to change it and the loop vectorizes */
5332
+ ca_u_float32_t sv = *q2;
5333
+ p2 = &sv;
5334
+ for (k=0; k<n; k++) {
5335
+ p1 = q1 + k;
5336
+ p3 = q3 + k;
5337
+ { (*p3) = (fabs((*p1) - (*p2)) <= tol) ? 1 : 0; }
5338
+ }
5339
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
5340
+ ca_u_float32_t sv = *q1;
5341
+ p1 = &sv;
5342
+ for (k=0; k<n; k++) {
5343
+ p2 = q2 + k;
5344
+ p3 = q3 + k;
5345
+ { (*p3) = (fabs((*p1) - (*p2)) <= tol) ? 1 : 0; }
5346
+ }
3725
5347
  } else {
3726
5348
  for (k=0; k<n; k++) {
3727
5349
  p1 = q1 + k*i1;
@@ -3739,8 +5361,8 @@ ca_bincmp_is_close_float64_t (ca_size_t n, boolean8_t *m,
3739
5361
  char *ptr3, ca_size_t b3, ca_size_t i3,
3740
5362
  double tol)
3741
5363
  {
3742
- double *q1 = (double *) ptr1, *q2 = (double *) ptr2;
3743
- double *p1 = q1, *p2 = q2;
5364
+ ca_u_float64_t *q1 = (ca_u_float64_t *) ptr1, *q2 = (ca_u_float64_t *) ptr2;
5365
+ ca_u_float64_t *p1 = q1, *p2 = q2;
3744
5366
  boolean8_t *q3 = (boolean8_t *) ptr3;
3745
5367
  boolean8_t *p3 = q3;
3746
5368
  ca_size_t k;
@@ -3757,6 +5379,24 @@ ca_bincmp_is_close_float64_t (ca_size_t n, boolean8_t *m,
3757
5379
  { (*p3) = (fabs((*p1) - (*p2)) <= tol) ? 1 : 0; }
3758
5380
  }
3759
5381
  }
5382
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
5383
+ /* scalar on the right: read it once, so the boolean store
5384
+ cannot be taken to change it and the loop vectorizes */
5385
+ ca_u_float64_t sv = *q2;
5386
+ p2 = &sv;
5387
+ for (k=0; k<n; k++) {
5388
+ p1 = q1 + k;
5389
+ p3 = q3 + k;
5390
+ { (*p3) = (fabs((*p1) - (*p2)) <= tol) ? 1 : 0; }
5391
+ }
5392
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
5393
+ ca_u_float64_t sv = *q1;
5394
+ p1 = &sv;
5395
+ for (k=0; k<n; k++) {
5396
+ p2 = q2 + k;
5397
+ p3 = q3 + k;
5398
+ { (*p3) = (fabs((*p1) - (*p2)) <= tol) ? 1 : 0; }
5399
+ }
3760
5400
  } else {
3761
5401
  for (k=0; k<n; k++) {
3762
5402
  p1 = q1 + k*i1;
@@ -3774,8 +5414,8 @@ ca_bincmp_is_close_cmplx64_t (ca_size_t n, boolean8_t *m,
3774
5414
  char *ptr3, ca_size_t b3, ca_size_t i3,
3775
5415
  double tol)
3776
5416
  {
3777
- cmplx64_t *q1 = (cmplx64_t *) ptr1, *q2 = (cmplx64_t *) ptr2;
3778
- cmplx64_t *p1 = q1, *p2 = q2;
5417
+ ca_u_cmplx64_t *q1 = (ca_u_cmplx64_t *) ptr1, *q2 = (ca_u_cmplx64_t *) ptr2;
5418
+ ca_u_cmplx64_t *p1 = q1, *p2 = q2;
3779
5419
  boolean8_t *q3 = (boolean8_t *) ptr3;
3780
5420
  boolean8_t *p3 = q3;
3781
5421
  ca_size_t k;
@@ -3792,6 +5432,24 @@ ca_bincmp_is_close_cmplx64_t (ca_size_t n, boolean8_t *m,
3792
5432
  { (*p3) = (cabs((*p1) - (*p2)) <= tol) ? 1 : 0; }
3793
5433
  }
3794
5434
  }
5435
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
5436
+ /* scalar on the right: read it once, so the boolean store
5437
+ cannot be taken to change it and the loop vectorizes */
5438
+ ca_u_cmplx64_t sv = *q2;
5439
+ p2 = &sv;
5440
+ for (k=0; k<n; k++) {
5441
+ p1 = q1 + k;
5442
+ p3 = q3 + k;
5443
+ { (*p3) = (cabs((*p1) - (*p2)) <= tol) ? 1 : 0; }
5444
+ }
5445
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
5446
+ ca_u_cmplx64_t sv = *q1;
5447
+ p1 = &sv;
5448
+ for (k=0; k<n; k++) {
5449
+ p2 = q2 + k;
5450
+ p3 = q3 + k;
5451
+ { (*p3) = (cabs((*p1) - (*p2)) <= tol) ? 1 : 0; }
5452
+ }
3795
5453
  } else {
3796
5454
  for (k=0; k<n; k++) {
3797
5455
  p1 = q1 + k*i1;
@@ -3809,8 +5467,8 @@ ca_bincmp_is_close_cmplx128_t (ca_size_t n, boolean8_t *m,
3809
5467
  char *ptr3, ca_size_t b3, ca_size_t i3,
3810
5468
  double tol)
3811
5469
  {
3812
- cmplx128_t *q1 = (cmplx128_t *) ptr1, *q2 = (cmplx128_t *) ptr2;
3813
- cmplx128_t *p1 = q1, *p2 = q2;
5470
+ ca_u_cmplx128_t *q1 = (ca_u_cmplx128_t *) ptr1, *q2 = (ca_u_cmplx128_t *) ptr2;
5471
+ ca_u_cmplx128_t *p1 = q1, *p2 = q2;
3814
5472
  boolean8_t *q3 = (boolean8_t *) ptr3;
3815
5473
  boolean8_t *p3 = q3;
3816
5474
  ca_size_t k;
@@ -3827,6 +5485,24 @@ ca_bincmp_is_close_cmplx128_t (ca_size_t n, boolean8_t *m,
3827
5485
  { (*p3) = (cabs((*p1) - (*p2)) <= tol) ? 1 : 0; }
3828
5486
  }
3829
5487
  }
5488
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
5489
+ /* scalar on the right: read it once, so the boolean store
5490
+ cannot be taken to change it and the loop vectorizes */
5491
+ ca_u_cmplx128_t sv = *q2;
5492
+ p2 = &sv;
5493
+ for (k=0; k<n; k++) {
5494
+ p1 = q1 + k;
5495
+ p3 = q3 + k;
5496
+ { (*p3) = (cabs((*p1) - (*p2)) <= tol) ? 1 : 0; }
5497
+ }
5498
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
5499
+ ca_u_cmplx128_t sv = *q1;
5500
+ p1 = &sv;
5501
+ for (k=0; k<n; k++) {
5502
+ p2 = q2 + k;
5503
+ p3 = q3 + k;
5504
+ { (*p3) = (cabs((*p1) - (*p2)) <= tol) ? 1 : 0; }
5505
+ }
3830
5506
  } else {
3831
5507
  for (k=0; k<n; k++) {
3832
5508
  p1 = q1 + k*i1;
@@ -3899,6 +5575,34 @@ ca_bincmp_is_equiv_int8_t (ca_size_t n, boolean8_t *m,
3899
5575
  }
3900
5576
  }
3901
5577
  }
5578
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
5579
+ /* scalar on the right: read it once, so the boolean store
5580
+ cannot be taken to change it and the loop vectorizes */
5581
+ int8_t sv = *q2;
5582
+ p2 = &sv;
5583
+ for (k=0; k<n; k++) {
5584
+ p1 = q1 + k;
5585
+ p3 = q3 + k;
5586
+ {
5587
+ double a = (double)(*p1), b = (double)(*p2);
5588
+ double aa = fabs(a), ab = fabs(b);
5589
+ double m = (aa > ab) ? aa : ab;
5590
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs(a - b) / m <= tol) ) ? 1 : 0;
5591
+ }
5592
+ }
5593
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
5594
+ int8_t sv = *q1;
5595
+ p1 = &sv;
5596
+ for (k=0; k<n; k++) {
5597
+ p2 = q2 + k;
5598
+ p3 = q3 + k;
5599
+ {
5600
+ double a = (double)(*p1), b = (double)(*p2);
5601
+ double aa = fabs(a), ab = fabs(b);
5602
+ double m = (aa > ab) ? aa : ab;
5603
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs(a - b) / m <= tol) ) ? 1 : 0;
5604
+ }
5605
+ }
3902
5606
  } else {
3903
5607
  for (k=0; k<n; k++) {
3904
5608
  p1 = q1 + k*i1;
@@ -3944,6 +5648,34 @@ ca_bincmp_is_equiv_uint8_t (ca_size_t n, boolean8_t *m,
3944
5648
  }
3945
5649
  }
3946
5650
  }
5651
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
5652
+ /* scalar on the right: read it once, so the boolean store
5653
+ cannot be taken to change it and the loop vectorizes */
5654
+ uint8_t sv = *q2;
5655
+ p2 = &sv;
5656
+ for (k=0; k<n; k++) {
5657
+ p1 = q1 + k;
5658
+ p3 = q3 + k;
5659
+ {
5660
+ double a = (double)(*p1), b = (double)(*p2);
5661
+ double aa = fabs(a), ab = fabs(b);
5662
+ double m = (aa > ab) ? aa : ab;
5663
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs(a - b) / m <= tol) ) ? 1 : 0;
5664
+ }
5665
+ }
5666
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
5667
+ uint8_t sv = *q1;
5668
+ p1 = &sv;
5669
+ for (k=0; k<n; k++) {
5670
+ p2 = q2 + k;
5671
+ p3 = q3 + k;
5672
+ {
5673
+ double a = (double)(*p1), b = (double)(*p2);
5674
+ double aa = fabs(a), ab = fabs(b);
5675
+ double m = (aa > ab) ? aa : ab;
5676
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs(a - b) / m <= tol) ) ? 1 : 0;
5677
+ }
5678
+ }
3947
5679
  } else {
3948
5680
  for (k=0; k<n; k++) {
3949
5681
  p1 = q1 + k*i1;
@@ -3966,8 +5698,8 @@ ca_bincmp_is_equiv_int16_t (ca_size_t n, boolean8_t *m,
3966
5698
  char *ptr3, ca_size_t b3, ca_size_t i3,
3967
5699
  double tol)
3968
5700
  {
3969
- int16_t *q1 = (int16_t *) ptr1, *q2 = (int16_t *) ptr2;
3970
- int16_t *p1 = q1, *p2 = q2;
5701
+ ca_u_int16_t *q1 = (ca_u_int16_t *) ptr1, *q2 = (ca_u_int16_t *) ptr2;
5702
+ ca_u_int16_t *p1 = q1, *p2 = q2;
3971
5703
  boolean8_t *q3 = (boolean8_t *) ptr3;
3972
5704
  boolean8_t *p3 = q3;
3973
5705
  ca_size_t k;
@@ -3989,6 +5721,34 @@ ca_bincmp_is_equiv_int16_t (ca_size_t n, boolean8_t *m,
3989
5721
  }
3990
5722
  }
3991
5723
  }
5724
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
5725
+ /* scalar on the right: read it once, so the boolean store
5726
+ cannot be taken to change it and the loop vectorizes */
5727
+ ca_u_int16_t sv = *q2;
5728
+ p2 = &sv;
5729
+ for (k=0; k<n; k++) {
5730
+ p1 = q1 + k;
5731
+ p3 = q3 + k;
5732
+ {
5733
+ double a = (double)(*p1), b = (double)(*p2);
5734
+ double aa = fabs(a), ab = fabs(b);
5735
+ double m = (aa > ab) ? aa : ab;
5736
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs(a - b) / m <= tol) ) ? 1 : 0;
5737
+ }
5738
+ }
5739
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
5740
+ ca_u_int16_t sv = *q1;
5741
+ p1 = &sv;
5742
+ for (k=0; k<n; k++) {
5743
+ p2 = q2 + k;
5744
+ p3 = q3 + k;
5745
+ {
5746
+ double a = (double)(*p1), b = (double)(*p2);
5747
+ double aa = fabs(a), ab = fabs(b);
5748
+ double m = (aa > ab) ? aa : ab;
5749
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs(a - b) / m <= tol) ) ? 1 : 0;
5750
+ }
5751
+ }
3992
5752
  } else {
3993
5753
  for (k=0; k<n; k++) {
3994
5754
  p1 = q1 + k*i1;
@@ -4011,8 +5771,8 @@ ca_bincmp_is_equiv_uint16_t (ca_size_t n, boolean8_t *m,
4011
5771
  char *ptr3, ca_size_t b3, ca_size_t i3,
4012
5772
  double tol)
4013
5773
  {
4014
- uint16_t *q1 = (uint16_t *) ptr1, *q2 = (uint16_t *) ptr2;
4015
- uint16_t *p1 = q1, *p2 = q2;
5774
+ ca_u_uint16_t *q1 = (ca_u_uint16_t *) ptr1, *q2 = (ca_u_uint16_t *) ptr2;
5775
+ ca_u_uint16_t *p1 = q1, *p2 = q2;
4016
5776
  boolean8_t *q3 = (boolean8_t *) ptr3;
4017
5777
  boolean8_t *p3 = q3;
4018
5778
  ca_size_t k;
@@ -4034,6 +5794,34 @@ ca_bincmp_is_equiv_uint16_t (ca_size_t n, boolean8_t *m,
4034
5794
  }
4035
5795
  }
4036
5796
  }
5797
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
5798
+ /* scalar on the right: read it once, so the boolean store
5799
+ cannot be taken to change it and the loop vectorizes */
5800
+ ca_u_uint16_t sv = *q2;
5801
+ p2 = &sv;
5802
+ for (k=0; k<n; k++) {
5803
+ p1 = q1 + k;
5804
+ p3 = q3 + k;
5805
+ {
5806
+ double a = (double)(*p1), b = (double)(*p2);
5807
+ double aa = fabs(a), ab = fabs(b);
5808
+ double m = (aa > ab) ? aa : ab;
5809
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs(a - b) / m <= tol) ) ? 1 : 0;
5810
+ }
5811
+ }
5812
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
5813
+ ca_u_uint16_t sv = *q1;
5814
+ p1 = &sv;
5815
+ for (k=0; k<n; k++) {
5816
+ p2 = q2 + k;
5817
+ p3 = q3 + k;
5818
+ {
5819
+ double a = (double)(*p1), b = (double)(*p2);
5820
+ double aa = fabs(a), ab = fabs(b);
5821
+ double m = (aa > ab) ? aa : ab;
5822
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs(a - b) / m <= tol) ) ? 1 : 0;
5823
+ }
5824
+ }
4037
5825
  } else {
4038
5826
  for (k=0; k<n; k++) {
4039
5827
  p1 = q1 + k*i1;
@@ -4056,8 +5844,8 @@ ca_bincmp_is_equiv_int32_t (ca_size_t n, boolean8_t *m,
4056
5844
  char *ptr3, ca_size_t b3, ca_size_t i3,
4057
5845
  double tol)
4058
5846
  {
4059
- int32_t *q1 = (int32_t *) ptr1, *q2 = (int32_t *) ptr2;
4060
- int32_t *p1 = q1, *p2 = q2;
5847
+ ca_u_int32_t *q1 = (ca_u_int32_t *) ptr1, *q2 = (ca_u_int32_t *) ptr2;
5848
+ ca_u_int32_t *p1 = q1, *p2 = q2;
4061
5849
  boolean8_t *q3 = (boolean8_t *) ptr3;
4062
5850
  boolean8_t *p3 = q3;
4063
5851
  ca_size_t k;
@@ -4079,6 +5867,34 @@ ca_bincmp_is_equiv_int32_t (ca_size_t n, boolean8_t *m,
4079
5867
  }
4080
5868
  }
4081
5869
  }
5870
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
5871
+ /* scalar on the right: read it once, so the boolean store
5872
+ cannot be taken to change it and the loop vectorizes */
5873
+ ca_u_int32_t sv = *q2;
5874
+ p2 = &sv;
5875
+ for (k=0; k<n; k++) {
5876
+ p1 = q1 + k;
5877
+ p3 = q3 + k;
5878
+ {
5879
+ double a = (double)(*p1), b = (double)(*p2);
5880
+ double aa = fabs(a), ab = fabs(b);
5881
+ double m = (aa > ab) ? aa : ab;
5882
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs(a - b) / m <= tol) ) ? 1 : 0;
5883
+ }
5884
+ }
5885
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
5886
+ ca_u_int32_t sv = *q1;
5887
+ p1 = &sv;
5888
+ for (k=0; k<n; k++) {
5889
+ p2 = q2 + k;
5890
+ p3 = q3 + k;
5891
+ {
5892
+ double a = (double)(*p1), b = (double)(*p2);
5893
+ double aa = fabs(a), ab = fabs(b);
5894
+ double m = (aa > ab) ? aa : ab;
5895
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs(a - b) / m <= tol) ) ? 1 : 0;
5896
+ }
5897
+ }
4082
5898
  } else {
4083
5899
  for (k=0; k<n; k++) {
4084
5900
  p1 = q1 + k*i1;
@@ -4101,8 +5917,8 @@ ca_bincmp_is_equiv_uint32_t (ca_size_t n, boolean8_t *m,
4101
5917
  char *ptr3, ca_size_t b3, ca_size_t i3,
4102
5918
  double tol)
4103
5919
  {
4104
- uint32_t *q1 = (uint32_t *) ptr1, *q2 = (uint32_t *) ptr2;
4105
- uint32_t *p1 = q1, *p2 = q2;
5920
+ ca_u_uint32_t *q1 = (ca_u_uint32_t *) ptr1, *q2 = (ca_u_uint32_t *) ptr2;
5921
+ ca_u_uint32_t *p1 = q1, *p2 = q2;
4106
5922
  boolean8_t *q3 = (boolean8_t *) ptr3;
4107
5923
  boolean8_t *p3 = q3;
4108
5924
  ca_size_t k;
@@ -4124,6 +5940,34 @@ ca_bincmp_is_equiv_uint32_t (ca_size_t n, boolean8_t *m,
4124
5940
  }
4125
5941
  }
4126
5942
  }
5943
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
5944
+ /* scalar on the right: read it once, so the boolean store
5945
+ cannot be taken to change it and the loop vectorizes */
5946
+ ca_u_uint32_t sv = *q2;
5947
+ p2 = &sv;
5948
+ for (k=0; k<n; k++) {
5949
+ p1 = q1 + k;
5950
+ p3 = q3 + k;
5951
+ {
5952
+ double a = (double)(*p1), b = (double)(*p2);
5953
+ double aa = fabs(a), ab = fabs(b);
5954
+ double m = (aa > ab) ? aa : ab;
5955
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs(a - b) / m <= tol) ) ? 1 : 0;
5956
+ }
5957
+ }
5958
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
5959
+ ca_u_uint32_t sv = *q1;
5960
+ p1 = &sv;
5961
+ for (k=0; k<n; k++) {
5962
+ p2 = q2 + k;
5963
+ p3 = q3 + k;
5964
+ {
5965
+ double a = (double)(*p1), b = (double)(*p2);
5966
+ double aa = fabs(a), ab = fabs(b);
5967
+ double m = (aa > ab) ? aa : ab;
5968
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs(a - b) / m <= tol) ) ? 1 : 0;
5969
+ }
5970
+ }
4127
5971
  } else {
4128
5972
  for (k=0; k<n; k++) {
4129
5973
  p1 = q1 + k*i1;
@@ -4146,8 +5990,8 @@ ca_bincmp_is_equiv_int64_t (ca_size_t n, boolean8_t *m,
4146
5990
  char *ptr3, ca_size_t b3, ca_size_t i3,
4147
5991
  double tol)
4148
5992
  {
4149
- int64_t *q1 = (int64_t *) ptr1, *q2 = (int64_t *) ptr2;
4150
- int64_t *p1 = q1, *p2 = q2;
5993
+ ca_u_int64_t *q1 = (ca_u_int64_t *) ptr1, *q2 = (ca_u_int64_t *) ptr2;
5994
+ ca_u_int64_t *p1 = q1, *p2 = q2;
4151
5995
  boolean8_t *q3 = (boolean8_t *) ptr3;
4152
5996
  boolean8_t *p3 = q3;
4153
5997
  ca_size_t k;
@@ -4169,6 +6013,34 @@ ca_bincmp_is_equiv_int64_t (ca_size_t n, boolean8_t *m,
4169
6013
  }
4170
6014
  }
4171
6015
  }
6016
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
6017
+ /* scalar on the right: read it once, so the boolean store
6018
+ cannot be taken to change it and the loop vectorizes */
6019
+ ca_u_int64_t sv = *q2;
6020
+ p2 = &sv;
6021
+ for (k=0; k<n; k++) {
6022
+ p1 = q1 + k;
6023
+ p3 = q3 + k;
6024
+ {
6025
+ double a = (double)(*p1), b = (double)(*p2);
6026
+ double aa = fabs(a), ab = fabs(b);
6027
+ double m = (aa > ab) ? aa : ab;
6028
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs(a - b) / m <= tol) ) ? 1 : 0;
6029
+ }
6030
+ }
6031
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
6032
+ ca_u_int64_t sv = *q1;
6033
+ p1 = &sv;
6034
+ for (k=0; k<n; k++) {
6035
+ p2 = q2 + k;
6036
+ p3 = q3 + k;
6037
+ {
6038
+ double a = (double)(*p1), b = (double)(*p2);
6039
+ double aa = fabs(a), ab = fabs(b);
6040
+ double m = (aa > ab) ? aa : ab;
6041
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs(a - b) / m <= tol) ) ? 1 : 0;
6042
+ }
6043
+ }
4172
6044
  } else {
4173
6045
  for (k=0; k<n; k++) {
4174
6046
  p1 = q1 + k*i1;
@@ -4191,8 +6063,8 @@ ca_bincmp_is_equiv_uint64_t (ca_size_t n, boolean8_t *m,
4191
6063
  char *ptr3, ca_size_t b3, ca_size_t i3,
4192
6064
  double tol)
4193
6065
  {
4194
- uint64_t *q1 = (uint64_t *) ptr1, *q2 = (uint64_t *) ptr2;
4195
- uint64_t *p1 = q1, *p2 = q2;
6066
+ ca_u_uint64_t *q1 = (ca_u_uint64_t *) ptr1, *q2 = (ca_u_uint64_t *) ptr2;
6067
+ ca_u_uint64_t *p1 = q1, *p2 = q2;
4196
6068
  boolean8_t *q3 = (boolean8_t *) ptr3;
4197
6069
  boolean8_t *p3 = q3;
4198
6070
  ca_size_t k;
@@ -4214,6 +6086,34 @@ ca_bincmp_is_equiv_uint64_t (ca_size_t n, boolean8_t *m,
4214
6086
  }
4215
6087
  }
4216
6088
  }
6089
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
6090
+ /* scalar on the right: read it once, so the boolean store
6091
+ cannot be taken to change it and the loop vectorizes */
6092
+ ca_u_uint64_t sv = *q2;
6093
+ p2 = &sv;
6094
+ for (k=0; k<n; k++) {
6095
+ p1 = q1 + k;
6096
+ p3 = q3 + k;
6097
+ {
6098
+ double a = (double)(*p1), b = (double)(*p2);
6099
+ double aa = fabs(a), ab = fabs(b);
6100
+ double m = (aa > ab) ? aa : ab;
6101
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs(a - b) / m <= tol) ) ? 1 : 0;
6102
+ }
6103
+ }
6104
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
6105
+ ca_u_uint64_t sv = *q1;
6106
+ p1 = &sv;
6107
+ for (k=0; k<n; k++) {
6108
+ p2 = q2 + k;
6109
+ p3 = q3 + k;
6110
+ {
6111
+ double a = (double)(*p1), b = (double)(*p2);
6112
+ double aa = fabs(a), ab = fabs(b);
6113
+ double m = (aa > ab) ? aa : ab;
6114
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs(a - b) / m <= tol) ) ? 1 : 0;
6115
+ }
6116
+ }
4217
6117
  } else {
4218
6118
  for (k=0; k<n; k++) {
4219
6119
  p1 = q1 + k*i1;
@@ -4236,8 +6136,8 @@ ca_bincmp_is_equiv_float32_t (ca_size_t n, boolean8_t *m,
4236
6136
  char *ptr3, ca_size_t b3, ca_size_t i3,
4237
6137
  double tol)
4238
6138
  {
4239
- float *q1 = (float *) ptr1, *q2 = (float *) ptr2;
4240
- float *p1 = q1, *p2 = q2;
6139
+ ca_u_float32_t *q1 = (ca_u_float32_t *) ptr1, *q2 = (ca_u_float32_t *) ptr2;
6140
+ ca_u_float32_t *p1 = q1, *p2 = q2;
4241
6141
  boolean8_t *q3 = (boolean8_t *) ptr3;
4242
6142
  boolean8_t *p3 = q3;
4243
6143
  ca_size_t k;
@@ -4252,20 +6152,46 @@ ca_bincmp_is_equiv_float32_t (ca_size_t n, boolean8_t *m,
4252
6152
  p2 = q2 + k*i2;
4253
6153
  p3 = q3 + k*i3;
4254
6154
  {
4255
- float aa = fabs((*p1)), ab = fabs((*p2));
4256
- float m = (aa > ab) ? aa : ab;
6155
+ ca_u_float32_t aa = fabs((*p1)), ab = fabs((*p2));
6156
+ ca_u_float32_t m = (aa > ab) ? aa : ab;
4257
6157
  (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs((*p1) - (*p2)) / m <= tol) ) ? 1 : 0;
4258
6158
  }
4259
6159
  }
4260
6160
  }
6161
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
6162
+ /* scalar on the right: read it once, so the boolean store
6163
+ cannot be taken to change it and the loop vectorizes */
6164
+ ca_u_float32_t sv = *q2;
6165
+ p2 = &sv;
6166
+ for (k=0; k<n; k++) {
6167
+ p1 = q1 + k;
6168
+ p3 = q3 + k;
6169
+ {
6170
+ ca_u_float32_t aa = fabs((*p1)), ab = fabs((*p2));
6171
+ ca_u_float32_t m = (aa > ab) ? aa : ab;
6172
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs((*p1) - (*p2)) / m <= tol) ) ? 1 : 0;
6173
+ }
6174
+ }
6175
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
6176
+ ca_u_float32_t sv = *q1;
6177
+ p1 = &sv;
6178
+ for (k=0; k<n; k++) {
6179
+ p2 = q2 + k;
6180
+ p3 = q3 + k;
6181
+ {
6182
+ ca_u_float32_t aa = fabs((*p1)), ab = fabs((*p2));
6183
+ ca_u_float32_t m = (aa > ab) ? aa : ab;
6184
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs((*p1) - (*p2)) / m <= tol) ) ? 1 : 0;
6185
+ }
6186
+ }
4261
6187
  } else {
4262
6188
  for (k=0; k<n; k++) {
4263
6189
  p1 = q1 + k*i1;
4264
6190
  p2 = q2 + k*i2;
4265
6191
  p3 = q3 + k*i3;
4266
6192
  {
4267
- float aa = fabs((*p1)), ab = fabs((*p2));
4268
- float m = (aa > ab) ? aa : ab;
6193
+ ca_u_float32_t aa = fabs((*p1)), ab = fabs((*p2));
6194
+ ca_u_float32_t m = (aa > ab) ? aa : ab;
4269
6195
  (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs((*p1) - (*p2)) / m <= tol) ) ? 1 : 0;
4270
6196
  }
4271
6197
  }
@@ -4279,8 +6205,8 @@ ca_bincmp_is_equiv_float64_t (ca_size_t n, boolean8_t *m,
4279
6205
  char *ptr3, ca_size_t b3, ca_size_t i3,
4280
6206
  double tol)
4281
6207
  {
4282
- double *q1 = (double *) ptr1, *q2 = (double *) ptr2;
4283
- double *p1 = q1, *p2 = q2;
6208
+ ca_u_float64_t *q1 = (ca_u_float64_t *) ptr1, *q2 = (ca_u_float64_t *) ptr2;
6209
+ ca_u_float64_t *p1 = q1, *p2 = q2;
4284
6210
  boolean8_t *q3 = (boolean8_t *) ptr3;
4285
6211
  boolean8_t *p3 = q3;
4286
6212
  ca_size_t k;
@@ -4295,20 +6221,46 @@ ca_bincmp_is_equiv_float64_t (ca_size_t n, boolean8_t *m,
4295
6221
  p2 = q2 + k*i2;
4296
6222
  p3 = q3 + k*i3;
4297
6223
  {
4298
- double aa = fabs((*p1)), ab = fabs((*p2));
4299
- double m = (aa > ab) ? aa : ab;
6224
+ ca_u_float64_t aa = fabs((*p1)), ab = fabs((*p2));
6225
+ ca_u_float64_t m = (aa > ab) ? aa : ab;
4300
6226
  (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs((*p1) - (*p2)) / m <= tol) ) ? 1 : 0;
4301
6227
  }
4302
6228
  }
4303
6229
  }
6230
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
6231
+ /* scalar on the right: read it once, so the boolean store
6232
+ cannot be taken to change it and the loop vectorizes */
6233
+ ca_u_float64_t sv = *q2;
6234
+ p2 = &sv;
6235
+ for (k=0; k<n; k++) {
6236
+ p1 = q1 + k;
6237
+ p3 = q3 + k;
6238
+ {
6239
+ ca_u_float64_t aa = fabs((*p1)), ab = fabs((*p2));
6240
+ ca_u_float64_t m = (aa > ab) ? aa : ab;
6241
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs((*p1) - (*p2)) / m <= tol) ) ? 1 : 0;
6242
+ }
6243
+ }
6244
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
6245
+ ca_u_float64_t sv = *q1;
6246
+ p1 = &sv;
6247
+ for (k=0; k<n; k++) {
6248
+ p2 = q2 + k;
6249
+ p3 = q3 + k;
6250
+ {
6251
+ ca_u_float64_t aa = fabs((*p1)), ab = fabs((*p2));
6252
+ ca_u_float64_t m = (aa > ab) ? aa : ab;
6253
+ (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs((*p1) - (*p2)) / m <= tol) ) ? 1 : 0;
6254
+ }
6255
+ }
4304
6256
  } else {
4305
6257
  for (k=0; k<n; k++) {
4306
6258
  p1 = q1 + k*i1;
4307
6259
  p2 = q2 + k*i2;
4308
6260
  p3 = q3 + k*i3;
4309
6261
  {
4310
- double aa = fabs((*p1)), ab = fabs((*p2));
4311
- double m = (aa > ab) ? aa : ab;
6262
+ ca_u_float64_t aa = fabs((*p1)), ab = fabs((*p2));
6263
+ ca_u_float64_t m = (aa > ab) ? aa : ab;
4312
6264
  (*p3) = ( (*p1) == (*p2) || (m > 0 && fabs((*p1) - (*p2)) / m <= tol) ) ? 1 : 0;
4313
6265
  }
4314
6266
  }
@@ -4322,8 +6274,8 @@ ca_bincmp_is_equiv_cmplx64_t (ca_size_t n, boolean8_t *m,
4322
6274
  char *ptr3, ca_size_t b3, ca_size_t i3,
4323
6275
  double tol)
4324
6276
  {
4325
- cmplx64_t *q1 = (cmplx64_t *) ptr1, *q2 = (cmplx64_t *) ptr2;
4326
- cmplx64_t *p1 = q1, *p2 = q2;
6277
+ ca_u_cmplx64_t *q1 = (ca_u_cmplx64_t *) ptr1, *q2 = (ca_u_cmplx64_t *) ptr2;
6278
+ ca_u_cmplx64_t *p1 = q1, *p2 = q2;
4327
6279
  boolean8_t *q3 = (boolean8_t *) ptr3;
4328
6280
  boolean8_t *p3 = q3;
4329
6281
  ca_size_t k;
@@ -4344,6 +6296,32 @@ ca_bincmp_is_equiv_cmplx64_t (ca_size_t n, boolean8_t *m,
4344
6296
  }
4345
6297
  }
4346
6298
  }
6299
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
6300
+ /* scalar on the right: read it once, so the boolean store
6301
+ cannot be taken to change it and the loop vectorizes */
6302
+ ca_u_cmplx64_t sv = *q2;
6303
+ p2 = &sv;
6304
+ for (k=0; k<n; k++) {
6305
+ p1 = q1 + k;
6306
+ p3 = q3 + k;
6307
+ {
6308
+ double aa = cabs((*p1)), ab = cabs((*p2));
6309
+ double m = (aa > ab) ? aa : ab;
6310
+ (*p3) = ( m > 0 && cabs((*p1) - (*p2)) / m <= tol ) ? 1 : 0;
6311
+ }
6312
+ }
6313
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
6314
+ ca_u_cmplx64_t sv = *q1;
6315
+ p1 = &sv;
6316
+ for (k=0; k<n; k++) {
6317
+ p2 = q2 + k;
6318
+ p3 = q3 + k;
6319
+ {
6320
+ double aa = cabs((*p1)), ab = cabs((*p2));
6321
+ double m = (aa > ab) ? aa : ab;
6322
+ (*p3) = ( m > 0 && cabs((*p1) - (*p2)) / m <= tol ) ? 1 : 0;
6323
+ }
6324
+ }
4347
6325
  } else {
4348
6326
  for (k=0; k<n; k++) {
4349
6327
  p1 = q1 + k*i1;
@@ -4365,8 +6343,8 @@ ca_bincmp_is_equiv_cmplx128_t (ca_size_t n, boolean8_t *m,
4365
6343
  char *ptr3, ca_size_t b3, ca_size_t i3,
4366
6344
  double tol)
4367
6345
  {
4368
- cmplx128_t *q1 = (cmplx128_t *) ptr1, *q2 = (cmplx128_t *) ptr2;
4369
- cmplx128_t *p1 = q1, *p2 = q2;
6346
+ ca_u_cmplx128_t *q1 = (ca_u_cmplx128_t *) ptr1, *q2 = (ca_u_cmplx128_t *) ptr2;
6347
+ ca_u_cmplx128_t *p1 = q1, *p2 = q2;
4370
6348
  boolean8_t *q3 = (boolean8_t *) ptr3;
4371
6349
  boolean8_t *p3 = q3;
4372
6350
  ca_size_t k;
@@ -4387,6 +6365,32 @@ ca_bincmp_is_equiv_cmplx128_t (ca_size_t n, boolean8_t *m,
4387
6365
  }
4388
6366
  }
4389
6367
  }
6368
+ } else if ( i3 == 1 && i1 == 1 && i2 == 0 ) {
6369
+ /* scalar on the right: read it once, so the boolean store
6370
+ cannot be taken to change it and the loop vectorizes */
6371
+ ca_u_cmplx128_t sv = *q2;
6372
+ p2 = &sv;
6373
+ for (k=0; k<n; k++) {
6374
+ p1 = q1 + k;
6375
+ p3 = q3 + k;
6376
+ {
6377
+ double aa = cabs((*p1)), ab = cabs((*p2));
6378
+ double m = (aa > ab) ? aa : ab;
6379
+ (*p3) = ( m > 0 && cabs((*p1) - (*p2)) / m <= tol ) ? 1 : 0;
6380
+ }
6381
+ }
6382
+ } else if ( i3 == 1 && i1 == 0 && i2 == 1 ) {
6383
+ ca_u_cmplx128_t sv = *q1;
6384
+ p1 = &sv;
6385
+ for (k=0; k<n; k++) {
6386
+ p2 = q2 + k;
6387
+ p3 = q3 + k;
6388
+ {
6389
+ double aa = cabs((*p1)), ab = cabs((*p2));
6390
+ double m = (aa > ab) ? aa : ab;
6391
+ (*p3) = ( m > 0 && cabs((*p1) - (*p2)) / m <= tol ) ? 1 : 0;
6392
+ }
6393
+ }
4390
6394
  } else {
4391
6395
  for (k=0; k<n; k++) {
4392
6396
  p1 = q1 + k*i1;