carray 3.0.5 → 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 (119) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +233 -0
  3. data/README.md +1 -1
  4. data/carray.gemspec +3 -2
  5. data/ext/ca_axis_dispatch.c +6 -0
  6. data/ext/ca_axis_group.c +1 -1
  7. data/ext/ca_categorical_iterator.c +7 -7
  8. data/ext/ca_kernel_iterator.c +116 -231
  9. data/ext/ca_kernel_iterator.h +410 -254
  10. data/ext/ca_obj_bincmp.c +9 -1
  11. data/ext/ca_obj_binop.c +10 -1
  12. data/ext/ca_obj_bitfield.c +2 -0
  13. data/ext/ca_obj_byte_swap.c +2 -0
  14. data/ext/ca_obj_face.c +2 -0
  15. data/ext/ca_obj_fake.c +3 -1
  16. data/ext/ca_obj_grid.c +167 -12
  17. data/ext/ca_obj_meld.c +69 -113
  18. data/ext/ca_obj_moncmp.c +9 -1
  19. data/ext/ca_obj_monop.c +40 -2
  20. data/ext/ca_obj_object.c +54 -20
  21. data/ext/ca_obj_reduce.c +15 -1
  22. data/ext/ca_obj_refer.c +65 -20
  23. data/ext/ca_obj_remap.c +69 -10
  24. data/ext/ca_obj_roll.c +1 -0
  25. data/ext/ca_obj_select.c +4 -1
  26. data/ext/ca_obj_select_axis.c +1 -0
  27. data/ext/ca_obj_shift.c +1 -0
  28. data/ext/ca_obj_stack.c +310 -111
  29. data/ext/ca_obj_stride.c +131 -45
  30. data/ext/ca_obj_string.c +18 -2
  31. data/ext/ca_obj_tile.c +1 -0
  32. data/ext/ca_obj_triop.c +9 -1
  33. data/ext/ca_obj_window.c +1 -0
  34. data/ext/ca_op_ipower.c +8 -8
  35. data/ext/caframe_csv_reader.c +1 -1
  36. data/ext/carray.h +2 -1
  37. data/ext/carray_access.c +27 -64
  38. data/ext/carray_address_basis.c +134 -0
  39. data/ext/carray_attribute.c +8 -0
  40. data/ext/carray_broadcast.c +3 -4
  41. data/ext/carray_build_flags.h +1 -1
  42. data/ext/carray_cast.c +8 -11
  43. data/ext/carray_conversion.c +9 -5
  44. data/ext/carray_core.c +811 -72
  45. data/ext/carray_element.c +13 -9
  46. data/ext/carray_histogram.c +25 -3
  47. data/ext/carray_internal.h +147 -12
  48. data/ext/carray_kernels_bincmp.c +2007 -3
  49. data/ext/carray_kernels_binop.c +25365 -5199
  50. data/ext/carray_kernels_init.c +8 -8
  51. data/ext/carray_kernels_monop.c +10696 -3678
  52. data/ext/carray_kernels_reduce_aggregate.c +4429 -702
  53. data/ext/carray_kernels_reduce_boolean.c +1533 -15
  54. data/ext/carray_kernels_reduce_cumulative.c +1808 -248
  55. data/ext/carray_kernels_reduce_extreme.c +4508 -511
  56. data/ext/carray_kernels_reduce_variance.c +2284 -152
  57. data/ext/carray_kernels_scan.c +240 -240
  58. data/ext/carray_kernels_search.c +4211 -264
  59. data/ext/carray_kernels_sort.c +367 -450
  60. data/ext/carray_lazy.c +47 -0
  61. data/ext/carray_loop.c +1 -1
  62. data/ext/carray_mask.c +130 -139
  63. data/ext/carray_median_percentile.c +4 -4
  64. data/ext/carray_memory_view.c +13 -7
  65. data/ext/carray_operator.c +147 -44
  66. data/ext/carray_order.c +3 -2
  67. data/ext/carray_random.c +4 -1
  68. data/ext/carray_slab.c +97 -21
  69. data/ext/carray_sort.c +1 -1
  70. data/ext/carray_test.c +74 -19
  71. data/ext/carray_time_text.c +2 -2
  72. data/ext/extconf.rb +11 -0
  73. data/ext/mkkernel.rb +346 -94
  74. data/ext/ruby_carray.c +4 -1
  75. data/ext/version.h +4 -4
  76. data/lib/carray/attribute.rb +25 -1
  77. data/lib/carray/autoload_carray.rb +3 -3
  78. data/lib/carray/autoload_method_extension.rb +5 -3
  79. data/lib/carray/axis_group.rb +13 -7
  80. data/lib/carray/basics.rb +1 -1
  81. data/lib/carray/block_iterator.rb +17 -3
  82. data/lib/carray/categorical.rb +6 -8
  83. data/lib/carray/categorical_iterator.rb +2 -2
  84. data/lib/carray/complex.rb +2 -2
  85. data/lib/carray/conditional.rb +3 -2
  86. data/lib/carray/frame/column_verbs.rb +45 -14
  87. data/lib/carray/frame/convert.rb +19 -0
  88. data/lib/carray/frame/csv_parser.rb +32 -32
  89. data/lib/carray/frame/describe.rb +4 -2
  90. data/lib/carray/frame/frame.rb +399 -78
  91. data/lib/carray/frame/group.rb +679 -53
  92. data/lib/carray/frame/io.rb +209 -71
  93. data/lib/carray/frame/join.rb +146 -37
  94. data/lib/carray/frame/records.rb +3 -3
  95. data/lib/carray/frame/reshape.rb +89 -11
  96. data/lib/carray/frame/sort.rb +57 -9
  97. data/lib/carray/frame/verbs.rb +384 -49
  98. data/lib/carray/frame/windows.rb +44 -6
  99. data/lib/carray/inspect.rb +7 -2
  100. data/lib/carray/iterator.rb +32 -0
  101. data/lib/carray/lazy.rb +17 -8
  102. data/lib/carray/mask_gap_fill.rb +37 -17
  103. data/lib/carray/meld_reduce.rb +1 -1
  104. data/lib/carray/methods/choose.rb +3 -2
  105. data/lib/carray/methods/meshgrid.rb +3 -1
  106. data/lib/carray/runtime.rb +47 -8
  107. data/lib/carray/segment_iterator.rb +23 -8
  108. data/lib/carray/serialize.rb +34 -17
  109. data/lib/carray/stack.rb +18 -6
  110. data/lib/carray/time.rb +5 -0
  111. data/lib/carray/window_iterator.rb +16 -4
  112. data/yard-stubs/ca_obj_array.rb +26 -1
  113. data/yard-stubs/carray_cast.rb +8 -5
  114. data/yard-stubs/carray_conversion.rb +8 -2
  115. data/yard-stubs/carray_mask.rb +20 -1
  116. data/yard-stubs/carray_math.rb +31 -16
  117. data/yard-stubs/carray_memory_view.rb +7 -0
  118. data/yard-stubs/carray_test.rb +7 -4
  119. metadata +18 -4
@@ -75,6 +75,34 @@ ca_bincmp_feq_float32_t (ca_size_t n, boolean8_t *m,
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;
@@ -120,6 +148,34 @@ ca_bincmp_feq_float64_t (ca_size_t n, boolean8_t *m,
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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -1659,10 +2381,28 @@ ca_bincmp_gt_float32_t (ca_size_t n, boolean8_t *m,
1659
2381
  { (*p3) = ( (*p1) > (*p2) ); }
1660
2382
  }
1661
2383
  }
1662
- } else {
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;
1663
2389
  for (k=0; k<n; k++) {
1664
- p1 = q1 + k*i1;
1665
- p2 = q2 + k*i2;
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
+ }
2402
+ } else {
2403
+ for (k=0; k<n; k++) {
2404
+ p1 = q1 + k*i1;
2405
+ p2 = q2 + k*i2;
1666
2406
  p3 = q3 + k*i3;
1667
2407
  { (*p3) = ( (*p1) > (*p2) ); }
1668
2408
  }
@@ -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,6 +2487,24 @@ 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
  }
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;
2495
+ for (k=0; k<n; k++) {
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
+ }
1732
2508
  } else {
1733
2509
  for (k=0; k<n; k++) {
1734
2510
  p1 = q1 + k*i1;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -4258,6 +6158,32 @@ ca_bincmp_is_equiv_float32_t (ca_size_t n, boolean8_t *m,
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;
@@ -4301,6 +6227,32 @@ ca_bincmp_is_equiv_float64_t (ca_size_t n, boolean8_t *m,
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;
@@ -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;
@@ -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;