carray 3.0.2 → 3.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +568 -0
- data/README.md +6 -6
- data/carray.gemspec +1 -1
- data/ext/ca_axis_descriptor.h +27 -24
- data/ext/ca_axis_dispatch.c +220 -0
- data/ext/ca_axis_group.c +201 -123
- data/ext/ca_binop_dispatch.c +46 -52
- data/ext/ca_binop_dispatch.h +1 -1
- data/ext/ca_categorical_iterator.c +249 -183
- data/ext/ca_compare.c +7 -12
- data/ext/ca_for_buffer.h +21 -68
- data/ext/ca_group_iter.c +38 -23
- data/ext/ca_kernel_iterator.c +1765 -2076
- data/ext/ca_kernel_iterator.h +584 -566
- data/ext/ca_monop_dispatch.c +86 -63
- data/ext/ca_monop_dispatch.h +5 -0
- data/ext/ca_obj_array.c +223 -56
- data/ext/ca_obj_bincmp.c +172 -138
- data/ext/ca_obj_binop.c +116 -230
- data/ext/ca_obj_bitarray.c +40 -26
- data/ext/ca_obj_bitfield.c +100 -68
- data/ext/ca_obj_block.c +19 -9
- data/ext/ca_obj_byte_swap.c +45 -46
- data/ext/ca_obj_const_string.c +269 -44
- data/ext/ca_obj_face.c +612 -89
- data/ext/ca_obj_face.h +111 -47
- data/ext/ca_obj_fake.c +36 -79
- data/ext/ca_obj_farray.c +7 -3
- data/ext/ca_obj_field.c +33 -8
- data/ext/ca_obj_fixlen_string.c +23 -24
- data/ext/ca_obj_grid.c +541 -210
- data/ext/ca_obj_meld.c +331 -111
- data/ext/ca_obj_moncmp.c +80 -65
- data/ext/ca_obj_monop.c +177 -149
- data/ext/ca_obj_object.c +664 -248
- data/ext/ca_obj_record.c +63 -23
- data/ext/ca_obj_reduce.c +18 -16
- data/ext/ca_obj_refer.c +140 -58
- data/ext/ca_obj_remap.c +85 -24
- data/ext/ca_obj_repeat.c +24 -9
- data/ext/ca_obj_roll.c +121 -16
- data/ext/ca_obj_select.c +61 -58
- data/ext/ca_obj_select_axis.c +73 -107
- data/ext/ca_obj_shift.c +32 -102
- data/ext/ca_obj_stack.c +372 -122
- data/ext/ca_obj_stride.c +348 -140
- data/ext/ca_obj_string.c +88 -22
- data/ext/ca_obj_tile.c +38 -21
- data/ext/ca_obj_time.c +45 -31
- data/ext/ca_obj_timedelta.c +43 -29
- data/ext/ca_obj_transpose.c +17 -6
- data/ext/ca_obj_triop.c +125 -141
- data/ext/ca_obj_window.c +330 -44
- data/ext/ca_op_ipower.c +24 -11
- data/ext/ca_op_powi.h +57 -30
- data/ext/ca_pow5_table.h +656 -0
- data/ext/ca_sort_kernels.h +70 -0
- data/ext/ca_sweep_engine.c +104 -81
- data/ext/ca_sweep_engine.h +7 -20
- data/ext/ca_triop_dispatch.c +4 -1
- data/ext/ca_triop_dispatch.h +5 -2
- data/ext/caframe_csv_reader.c +542 -0
- data/ext/carray.h +241 -92
- data/ext/carray_access.c +608 -276
- data/ext/carray_address_basis.c +494 -97
- data/ext/carray_attribute.c +129 -4
- data/ext/carray_bincount.c +39 -7
- data/ext/carray_broadcast.c +56 -19
- data/ext/carray_build_flags.h +1 -1
- data/ext/carray_call_cfunc.c +108 -28
- data/ext/carray_cast.c +1576 -223
- data/ext/carray_cast_func.rb +77 -24
- data/ext/carray_class.c +4 -3
- data/ext/carray_conversion.c +208 -75
- data/ext/carray_copy.c +82 -24
- data/ext/carray_core.c +646 -162
- data/ext/carray_count.c +171 -88
- data/ext/carray_element.c +94 -60
- data/ext/carray_factorize.c +670 -324
- data/ext/carray_generate.c +260 -83
- data/ext/carray_histogram.c +209 -106
- data/ext/carray_hold.c +14 -16
- data/ext/carray_index_classifier.c +422 -243
- data/ext/carray_internal.h +692 -3
- data/ext/carray_kernels_bincmp.c +7 -0
- data/ext/carray_kernels_binop.c +487 -120
- data/ext/carray_kernels_init.c +653 -50
- data/ext/carray_kernels_moncmp.c +15 -8
- data/ext/carray_kernels_monop.c +99 -43
- data/ext/carray_kernels_reduce_aggregate.c +3925 -6112
- data/ext/carray_kernels_reduce_boolean.c +112 -36
- data/ext/carray_kernels_reduce_cumulative.c +2127 -6903
- data/ext/carray_kernels_reduce_extreme.c +3032 -2892
- data/ext/carray_kernels_reduce_variance.c +439 -500
- data/ext/carray_kernels_scan.c +1097 -488
- data/ext/carray_kernels_search.c +3787 -2176
- data/ext/carray_kernels_sort.c +1200 -920
- data/ext/carray_kernels_triop.c +479 -7
- data/ext/carray_key_windows.c +216 -0
- data/ext/carray_lazy.c +967 -153
- data/ext/carray_loop.c +81 -65
- data/ext/carray_mask.c +910 -324
- data/ext/carray_math_kernel.h +1 -0
- data/ext/carray_median_percentile.c +299 -100
- data/ext/carray_memory_view.c +872 -758
- data/ext/carray_operator.c +1171 -364
- data/ext/carray_order.c +505 -133
- data/ext/carray_partition.c +112 -65
- data/ext/carray_random.c +327 -239
- data/ext/carray_round.c +273 -0
- data/ext/carray_scatter.c +346 -78
- data/ext/carray_segment.c +257 -0
- data/ext/carray_slab.c +249 -86
- data/ext/carray_sort.c +224 -227
- data/ext/carray_sort_kernel.c +8 -1
- data/ext/carray_struct.c +118 -39
- data/ext/carray_test.c +193 -69
- data/ext/carray_time_text.c +1182 -0
- data/ext/carray_undef.c +4 -0
- data/ext/carray_utils.c +579 -113
- data/ext/extconf.rb +27 -2
- data/ext/mk_call_cfunc.rb +19 -4
- data/ext/mk_pow5_table.rb +35 -0
- data/ext/mkkernel.rb +1202 -1014
- data/ext/ruby_carray.c +17 -5
- data/ext/version.h +4 -4
- data/ext/version.rb +4 -2
- data/lib/carray/attribute.rb +160 -17
- data/lib/carray/autoload_carray.rb +23 -27
- data/lib/carray/autoload_method_extension.rb +20 -5
- data/lib/carray/axis_group.rb +360 -63
- data/lib/carray/basics.rb +162 -28
- data/lib/carray/bincount_nd.rb +18 -2
- data/lib/carray/block_iterator.rb +231 -58
- data/lib/carray/boolean_reduce.rb +34 -42
- data/lib/carray/categorical.rb +242 -52
- data/lib/carray/categorical_iterator.rb +437 -827
- data/lib/carray/complex.rb +41 -34
- data/lib/carray/conditional.rb +150 -14
- data/lib/carray/const_string.rb +59 -4
- data/lib/carray/construct.rb +15 -11
- data/lib/carray/data_type_extension.rb +1 -0
- data/lib/carray/distance_limit.rb +77 -0
- data/lib/carray/fixlen_string.rb +7 -1
- data/lib/carray/frame/column_verbs.rb +70 -0
- data/lib/carray/frame/concat.rb +157 -6
- data/lib/carray/frame/convert.rb +82 -7
- data/lib/carray/frame/csv_parser.rb +688 -87
- data/lib/carray/frame/describe.rb +80 -0
- data/lib/carray/frame/frame.rb +369 -45
- data/lib/carray/frame/group.rb +631 -90
- data/lib/carray/frame/io.rb +506 -79
- data/lib/carray/frame/join.rb +411 -62
- data/lib/carray/frame/records.rb +116 -19
- data/lib/carray/frame/reshape.rb +455 -0
- data/lib/carray/frame/sort.rb +30 -18
- data/lib/carray/frame/verbs.rb +868 -61
- data/lib/carray/frame/windows.rb +117 -0
- data/lib/carray/frame.rb +4 -0
- data/lib/carray/fuse_source.rb +118 -2
- data/lib/carray/fusion.rb +257 -42
- data/lib/carray/histogram.rb +6 -1
- data/lib/carray/inspect.rb +54 -13
- data/lib/carray/iterator.rb +99 -9
- data/lib/carray/key_windows.rb +620 -0
- data/lib/carray/lazy.rb +216 -193
- data/lib/carray/mask_gap_fill.rb +112 -92
- data/lib/carray/math.rb +32 -19
- data/lib/carray/meld_reduce.rb +52 -21
- data/lib/carray/methods/align_addr.rb +8 -4
- data/lib/carray/methods/bin.rb +26 -18
- data/lib/carray/methods/bincount.rb +18 -2
- data/lib/carray/methods/bit_string.rb +15 -4
- data/lib/carray/methods/choose.rb +16 -3
- data/lib/carray/methods/composition.rb +18 -10
- data/lib/carray/methods/factorize.rb +2 -2
- data/lib/carray/methods/gather_nd.rb +25 -5
- data/lib/carray/methods/insert_block.rb +9 -14
- data/lib/carray/methods/is_between.rb +59 -0
- data/lib/carray/methods/is_in.rb +140 -10
- data/lib/carray/methods/join.rb +2 -7
- data/lib/carray/methods/lag.rb +49 -0
- data/lib/carray/methods/locate_addr.rb +182 -45
- data/lib/carray/methods/mode.rb +18 -1
- data/lib/carray/methods/nunique.rb +11 -6
- data/lib/carray/methods/repeat.rb +1 -20
- data/lib/carray/methods/resize.rb +21 -23
- data/lib/carray/methods/snap.rb +34 -12
- data/lib/carray/methods/unique.rb +11 -2
- data/lib/carray/methods/value_counts.rb +4 -11
- data/lib/carray/record_order.rb +208 -0
- data/lib/carray/rng.rb +3 -0
- data/lib/carray/runtime.rb +65 -17
- data/lib/carray/segment_iterator.rb +1221 -0
- data/lib/carray/serialize.rb +214 -30
- data/lib/carray/slab_iterator.rb +101 -27
- data/lib/carray/stack.rb +10 -4
- data/lib/carray/string.rb +105 -5
- data/lib/carray/string_operation_extension.rb +12 -4
- data/lib/carray/struct.rb +137 -58
- data/lib/carray/struct_builder.rb +124 -17
- data/lib/carray/time.rb +1222 -186
- data/lib/carray/window_iterator.rb +242 -81
- data/lib/carray.rb +9 -2
- data/yard-stubs/ca_obj_array.rb +4 -4
- data/yard-stubs/ca_obj_bitarray.rb +7 -0
- data/yard-stubs/ca_obj_bitfield.rb +23 -12
- data/yard-stubs/ca_obj_fake.rb +1 -1
- data/yard-stubs/ca_obj_field.rb +5 -1
- data/yard-stubs/ca_obj_grid.rb +21 -10
- data/yard-stubs/ca_obj_refer.rb +5 -4
- data/yard-stubs/ca_obj_roll.rb +2 -3
- data/yard-stubs/ca_obj_shift.rb +5 -1
- data/yard-stubs/ca_obj_stride.rb +10 -7
- data/yard-stubs/ca_obj_tile.rb +1 -1
- data/yard-stubs/ca_obj_transpose.rb +1 -1
- data/yard-stubs/ca_obj_window.rb +9 -5
- data/yard-stubs/carray_access.rb +11 -5
- data/yard-stubs/carray_attribute.rb +0 -5
- data/yard-stubs/carray_broadcast.rb +1 -1
- data/yard-stubs/carray_cast.rb +88 -43
- data/yard-stubs/carray_conversion.rb +15 -2
- data/yard-stubs/carray_copy.rb +12 -5
- data/yard-stubs/carray_core.rb +3 -3
- data/yard-stubs/carray_count.rb +9 -0
- data/yard-stubs/carray_element.rb +10 -4
- data/yard-stubs/carray_generate.rb +21 -1
- data/yard-stubs/carray_lazy.rb +5 -1
- data/yard-stubs/carray_loop.rb +4 -1
- data/yard-stubs/carray_mask.rb +60 -12
- data/yard-stubs/carray_math.rb +52 -14
- data/yard-stubs/carray_median_percentile.rb +15 -8
- data/yard-stubs/carray_memory_view.rb +40 -23
- data/yard-stubs/carray_order.rb +61 -29
- data/yard-stubs/carray_random.rb +13 -4
- data/yard-stubs/carray_scatter.rb +21 -9
- data/yard-stubs/carray_segment.rb +72 -0
- data/yard-stubs/carray_slab.rb +10 -2
- data/yard-stubs/carray_sort.rb +49 -8
- data/yard-stubs/carray_test.rb +15 -3
- data/yard-stubs/carray_utils.rb +0 -26
- metadata +19 -5
- data/ext/ca_for_each_element.h +0 -239
- data/ext/carray_kernels_map.c +0 -3467
- data/lib/carray/arrow_tensor.rb +0 -401
- data/lib/carray/table.rb +0 -108
data/ext/extconf.rb
CHANGED
|
@@ -107,6 +107,17 @@ if enable_config("dev-build", false)
|
|
|
107
107
|
$stderr.puts "carray: CARRAY_DEV_BUILD enabled (smoke surface available)"
|
|
108
108
|
end
|
|
109
109
|
|
|
110
|
+
# --- signed overflow wraps (`-fwrapv`)
|
|
111
|
+
#
|
|
112
|
+
# An integer kernel that overflows answers modulo 2^N. C leaves signed
|
|
113
|
+
# overflow undefined, and a compiler that sees several operations at once
|
|
114
|
+
# rewrites them as if it could not happen -- `(x + 1) > x` becomes true --
|
|
115
|
+
# which carray-jit's fused expressions, built with these flags, would show.
|
|
116
|
+
if try_compile("int main(void) { return 0; }", "-fwrapv")
|
|
117
|
+
$CFLAGS += " -fwrapv"
|
|
118
|
+
$carray_build_flags << "-fwrapv"
|
|
119
|
+
end
|
|
120
|
+
|
|
110
121
|
# --- probe for `-fopenmp-simd` (SL.1.0, PROPOSAL_REDUCTION_SIMD_LICENSE)
|
|
111
122
|
#
|
|
112
123
|
# `-fopenmp-simd` enables `#pragma omp simd` (and its `reduction(+:acc)`
|
|
@@ -257,6 +268,8 @@ $INSTALLFILES << ['carray_config.h', '$(archdir)']
|
|
|
257
268
|
# (b) Not in the closure, but written for ext authors to include
|
|
258
269
|
# explicitly. ca_obj_face.h is the Face authoring surface: an
|
|
259
270
|
# external gem defines its own Face by including it directly.
|
|
271
|
+
# ca_for_buffer.h is whole-buffer delivery to an external library;
|
|
272
|
+
# it pulls ca_sweep_engine.h.
|
|
260
273
|
#
|
|
261
274
|
# A header that is neither is internal, however useful it looks in-tree.
|
|
262
275
|
# ca_op_powi.h (op_powi_<type> helpers for the generated kernels) and
|
|
@@ -272,11 +285,14 @@ $INSTALLFILES << ['carray_config.h', '$(archdir)']
|
|
|
272
285
|
ca_axis_descriptor.h
|
|
273
286
|
ca_monop_dispatch.h
|
|
274
287
|
ca_binop_dispatch.h
|
|
288
|
+
ca_triop_dispatch.h
|
|
275
289
|
ca_bincmp_dispatch.h
|
|
276
290
|
ca_moncmp_dispatch.h
|
|
277
291
|
ca_kernel_iterator.h
|
|
278
292
|
ca_iter_substrate.h
|
|
279
293
|
ca_obj_face.h
|
|
294
|
+
ca_for_buffer.h
|
|
295
|
+
ca_sweep_engine.h
|
|
280
296
|
].each do |h|
|
|
281
297
|
$INSTALLFILES << [h, '$(archdir)']
|
|
282
298
|
end
|
|
@@ -324,11 +340,14 @@ end
|
|
|
324
340
|
# compiling static sources, which is one pass with no race.
|
|
325
341
|
#
|
|
326
342
|
# carray_kernels.stamp is the mtime witness:
|
|
327
|
-
# - here: regenerate and touch it when mkkernel.rb
|
|
343
|
+
# - here: regenerate and touch it when mkkernel.rb or ca_op_powi.h (whose
|
|
344
|
+
# helper text the generator copies) is newer
|
|
328
345
|
# - in the Rakefile (rake build_ext): the same stamp triggers need_extconf
|
|
329
346
|
CARRAY_KERNELS_STAMP = "carray_kernels.stamp"
|
|
330
347
|
if ( not File.exist?(CARRAY_KERNELS_STAMP) ) or
|
|
331
|
-
|
|
348
|
+
%w[mkkernel.rb ca_op_powi.h].any? { |f|
|
|
349
|
+
File.stat(f).mtime > File.stat(CARRAY_KERNELS_STAMP).mtime
|
|
350
|
+
}
|
|
332
351
|
# passing "." makes the generator write the split files into ext/
|
|
333
352
|
unless system("ruby mkkernel.rb .")
|
|
334
353
|
raise "mkkernel.rb failed to generate split kernel files"
|
|
@@ -346,6 +365,12 @@ if Dir.glob("carray_kernels_*.c").empty?
|
|
|
346
365
|
raise "no carray_kernels_*.c files found after mkkernel.rb; check the generator"
|
|
347
366
|
end
|
|
348
367
|
|
|
368
|
+
# The 5^q table the decimal-to-double reader (carray_cast.c) multiplies by.
|
|
369
|
+
if ( not File.exist?("ca_pow5_table.h") ) or
|
|
370
|
+
File.stat("mk_pow5_table.rb").mtime > File.stat("ca_pow5_table.h").mtime
|
|
371
|
+
system("ruby mk_pow5_table.rb")
|
|
372
|
+
end
|
|
373
|
+
|
|
349
374
|
if ( not File.exist?("carray_call_cfunc.c") ) or
|
|
350
375
|
( not File.exist?("carray_call_cfunc.h") ) or
|
|
351
376
|
File.stat("mk_call_cfunc.rb").mtime > File.stat("carray_call_cfunc.c").mtime
|
data/ext/mk_call_cfunc.rb
CHANGED
|
@@ -127,6 +127,17 @@ def indent(s, prefix = " ")
|
|
|
127
127
|
s.each_line.map { |l| l.strip.empty? ? l : prefix + l }.join
|
|
128
128
|
end
|
|
129
129
|
|
|
130
|
+
# The operands are read through cx[] only once their structs are taken, and
|
|
131
|
+
# a caller may pass a view it made for the call and holds nowhere else
|
|
132
|
+
# (rb_ca_wrap_readonly(x, ...) as an argument): keep each one reachable until
|
|
133
|
+
# the walk is done. rcx0 is the return value and needs no guard.
|
|
134
|
+
def emit_operand_guards(n)
|
|
135
|
+
(1...n).each do |k|
|
|
136
|
+
$src.puts " RB_GC_GUARD(rcx#{k});"
|
|
137
|
+
end
|
|
138
|
+
$src.puts "" if n > 1
|
|
139
|
+
end
|
|
140
|
+
|
|
130
141
|
# --- raw ca_call_cfunc_N ----------------------------------------------------
|
|
131
142
|
#
|
|
132
143
|
# The per-cell loop runs in a walker function of its own, handed to
|
|
@@ -198,7 +209,7 @@ def emit_raw_common(n, r:)
|
|
|
198
209
|
$src.puts " TypedData_Get_Struct(rcx#{k}, CArray, &carray_data_type, cx[#{k}]);"
|
|
199
210
|
end
|
|
200
211
|
$src.puts ""
|
|
201
|
-
$src.puts <<~END_C
|
|
212
|
+
$src.puts indent(<<~END_C)
|
|
202
213
|
/* sweep engine: per-operand acquire (alias / xmalloc + ca_xfer_all),
|
|
203
214
|
operand pairing, mask OR across INPUTs, mask propagate to OUTPUTs.
|
|
204
215
|
Lifecycle template lives in ext/ca_sweep_engine.{c,h}. */
|
|
@@ -209,7 +220,6 @@ def emit_raw_common(n, r:)
|
|
|
209
220
|
state.stride = stride;
|
|
210
221
|
state.owned_buf = owned_buf;
|
|
211
222
|
state.attached = attached;
|
|
212
|
-
state.no_mask = 0;
|
|
213
223
|
state.src_label = "#{name}";
|
|
214
224
|
|
|
215
225
|
ca_sweep_acquire(&state);
|
|
@@ -219,6 +229,9 @@ def emit_raw_common(n, r:)
|
|
|
219
229
|
ctx.userdata = #{r ? "userdata" : "NULL"};
|
|
220
230
|
ca_sweep_run(&state, #{name}_walk, (VALUE) &ctx);
|
|
221
231
|
|
|
232
|
+
END_C
|
|
233
|
+
emit_operand_guards(n)
|
|
234
|
+
$src.puts <<~END_C
|
|
222
235
|
return rcx0;
|
|
223
236
|
}
|
|
224
237
|
|
|
@@ -397,7 +410,7 @@ def emit_slab_body(n, name, walker, userdata)
|
|
|
397
410
|
$src.puts " TypedData_Get_Struct(rcx#{k}, CArray, &carray_data_type, cx[#{k}]);"
|
|
398
411
|
end
|
|
399
412
|
$src.puts ""
|
|
400
|
-
$src.puts <<~END_C
|
|
413
|
+
$src.puts indent(<<~END_C)
|
|
401
414
|
/* sweep engine, chunked path: per-operand acquire (attach for OUTPUT
|
|
402
415
|
and alias INPUT, arena chunk scratch for non-alias INPUT), broadcast
|
|
403
416
|
shape check, mask OR across INPUTs, mask propagate to OUTPUTs at
|
|
@@ -412,7 +425,6 @@ def emit_slab_body(n, name, walker, userdata)
|
|
|
412
425
|
state.stride = stride;
|
|
413
426
|
state.owned_buf = owned_buf;
|
|
414
427
|
state.attached = attached;
|
|
415
|
-
state.no_mask = 0;
|
|
416
428
|
state.src_label = "#{name}";
|
|
417
429
|
|
|
418
430
|
ca_sweep_acquire_chunked(&state);
|
|
@@ -423,6 +435,9 @@ def emit_slab_body(n, name, walker, userdata)
|
|
|
423
435
|
ctx.userdata = #{userdata};
|
|
424
436
|
ca_sweep_run_chunked(&state, #{walker}, (VALUE) &ctx);
|
|
425
437
|
|
|
438
|
+
END_C
|
|
439
|
+
emit_operand_guards(n)
|
|
440
|
+
$src.puts <<~END_C
|
|
426
441
|
return rcx0;
|
|
427
442
|
}
|
|
428
443
|
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Generates ca_pow5_table.h: for each decimal exponent q in [-342, 308], a
|
|
2
|
+
# 128-bit approximation of 5^q scaled by a power of two into [2^127, 2^128),
|
|
3
|
+
# as the Eisel-Lemire decimal-to-binary64 conversion takes it.
|
|
4
|
+
#
|
|
5
|
+
# q >= 0: floor(5^q * 2^k) (exact while 5^q < 2^128, q <= 55)
|
|
6
|
+
# -27 <= q < 0: ceil(2^k / 5^-q)
|
|
7
|
+
# q < -27: floor(2^k / 5^-q)
|
|
8
|
+
# with k chosen so the value has exactly 128 bits.
|
|
9
|
+
|
|
10
|
+
Q_MIN, Q_MAX = -342, 308
|
|
11
|
+
rows = (Q_MIN..Q_MAX).map do |q|
|
|
12
|
+
if q >= 0
|
|
13
|
+
v = 5**q
|
|
14
|
+
v <<= 128 - v.bit_length if v.bit_length < 128
|
|
15
|
+
v >>= v.bit_length - 128 if v.bit_length > 128
|
|
16
|
+
else
|
|
17
|
+
p5 = 5**-q
|
|
18
|
+
k = 127 + p5.bit_length
|
|
19
|
+
v, r = (1 << k).divmod(p5)
|
|
20
|
+
v += 1 if q >= -27 && r != 0
|
|
21
|
+
v >>= v.bit_length - 128 if v.bit_length > 128
|
|
22
|
+
v <<= 128 - v.bit_length if v.bit_length < 128
|
|
23
|
+
end
|
|
24
|
+
raise "bad width at #{q}" unless v.bit_length == 128
|
|
25
|
+
[v >> 64, v & ((1 << 64) - 1)]
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
File.open(File.join(__dir__, "ca_pow5_table.h"), "w") do |f|
|
|
29
|
+
f.puts "/* Generated by mk_pow5_table.rb -- do not edit. */"
|
|
30
|
+
f.puts "#define CA_POW5_Q_MIN (#{Q_MIN})"
|
|
31
|
+
f.puts "#define CA_POW5_Q_MAX #{Q_MAX}"
|
|
32
|
+
f.puts "static const uint64_t ca_pow5_table[#{rows.size * 2}] = {"
|
|
33
|
+
rows.each { |hi, lo| f.puts format(" 0x%016xULL, 0x%016xULL,", hi, lo) }
|
|
34
|
+
f.puts "};"
|
|
35
|
+
end
|