carray 3.0.2 → 3.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (247) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +568 -0
  3. data/README.md +6 -6
  4. data/carray.gemspec +1 -1
  5. data/ext/ca_axis_descriptor.h +27 -24
  6. data/ext/ca_axis_dispatch.c +220 -0
  7. data/ext/ca_axis_group.c +201 -123
  8. data/ext/ca_binop_dispatch.c +46 -52
  9. data/ext/ca_binop_dispatch.h +1 -1
  10. data/ext/ca_categorical_iterator.c +249 -183
  11. data/ext/ca_compare.c +7 -12
  12. data/ext/ca_for_buffer.h +21 -68
  13. data/ext/ca_group_iter.c +38 -23
  14. data/ext/ca_kernel_iterator.c +1765 -2076
  15. data/ext/ca_kernel_iterator.h +584 -566
  16. data/ext/ca_monop_dispatch.c +86 -63
  17. data/ext/ca_monop_dispatch.h +5 -0
  18. data/ext/ca_obj_array.c +223 -56
  19. data/ext/ca_obj_bincmp.c +172 -138
  20. data/ext/ca_obj_binop.c +116 -230
  21. data/ext/ca_obj_bitarray.c +40 -26
  22. data/ext/ca_obj_bitfield.c +100 -68
  23. data/ext/ca_obj_block.c +19 -9
  24. data/ext/ca_obj_byte_swap.c +45 -46
  25. data/ext/ca_obj_const_string.c +269 -44
  26. data/ext/ca_obj_face.c +612 -89
  27. data/ext/ca_obj_face.h +111 -47
  28. data/ext/ca_obj_fake.c +36 -79
  29. data/ext/ca_obj_farray.c +7 -3
  30. data/ext/ca_obj_field.c +33 -8
  31. data/ext/ca_obj_fixlen_string.c +23 -24
  32. data/ext/ca_obj_grid.c +541 -210
  33. data/ext/ca_obj_meld.c +331 -111
  34. data/ext/ca_obj_moncmp.c +80 -65
  35. data/ext/ca_obj_monop.c +177 -149
  36. data/ext/ca_obj_object.c +664 -248
  37. data/ext/ca_obj_record.c +63 -23
  38. data/ext/ca_obj_reduce.c +18 -16
  39. data/ext/ca_obj_refer.c +140 -58
  40. data/ext/ca_obj_remap.c +85 -24
  41. data/ext/ca_obj_repeat.c +24 -9
  42. data/ext/ca_obj_roll.c +121 -16
  43. data/ext/ca_obj_select.c +61 -58
  44. data/ext/ca_obj_select_axis.c +73 -107
  45. data/ext/ca_obj_shift.c +32 -102
  46. data/ext/ca_obj_stack.c +372 -122
  47. data/ext/ca_obj_stride.c +348 -140
  48. data/ext/ca_obj_string.c +88 -22
  49. data/ext/ca_obj_tile.c +38 -21
  50. data/ext/ca_obj_time.c +45 -31
  51. data/ext/ca_obj_timedelta.c +43 -29
  52. data/ext/ca_obj_transpose.c +17 -6
  53. data/ext/ca_obj_triop.c +125 -141
  54. data/ext/ca_obj_window.c +330 -44
  55. data/ext/ca_op_ipower.c +24 -11
  56. data/ext/ca_op_powi.h +57 -30
  57. data/ext/ca_pow5_table.h +656 -0
  58. data/ext/ca_sort_kernels.h +70 -0
  59. data/ext/ca_sweep_engine.c +104 -81
  60. data/ext/ca_sweep_engine.h +7 -20
  61. data/ext/ca_triop_dispatch.c +4 -1
  62. data/ext/ca_triop_dispatch.h +5 -2
  63. data/ext/caframe_csv_reader.c +542 -0
  64. data/ext/carray.h +241 -92
  65. data/ext/carray_access.c +608 -276
  66. data/ext/carray_address_basis.c +494 -97
  67. data/ext/carray_attribute.c +129 -4
  68. data/ext/carray_bincount.c +39 -7
  69. data/ext/carray_broadcast.c +56 -19
  70. data/ext/carray_build_flags.h +1 -1
  71. data/ext/carray_call_cfunc.c +108 -28
  72. data/ext/carray_cast.c +1576 -223
  73. data/ext/carray_cast_func.rb +77 -24
  74. data/ext/carray_class.c +4 -3
  75. data/ext/carray_conversion.c +208 -75
  76. data/ext/carray_copy.c +82 -24
  77. data/ext/carray_core.c +646 -162
  78. data/ext/carray_count.c +171 -88
  79. data/ext/carray_element.c +94 -60
  80. data/ext/carray_factorize.c +670 -324
  81. data/ext/carray_generate.c +260 -83
  82. data/ext/carray_histogram.c +209 -106
  83. data/ext/carray_hold.c +14 -16
  84. data/ext/carray_index_classifier.c +422 -243
  85. data/ext/carray_internal.h +692 -3
  86. data/ext/carray_kernels_bincmp.c +7 -0
  87. data/ext/carray_kernels_binop.c +487 -120
  88. data/ext/carray_kernels_init.c +653 -50
  89. data/ext/carray_kernels_moncmp.c +15 -8
  90. data/ext/carray_kernels_monop.c +99 -43
  91. data/ext/carray_kernels_reduce_aggregate.c +3925 -6112
  92. data/ext/carray_kernels_reduce_boolean.c +112 -36
  93. data/ext/carray_kernels_reduce_cumulative.c +2127 -6903
  94. data/ext/carray_kernels_reduce_extreme.c +3032 -2892
  95. data/ext/carray_kernels_reduce_variance.c +439 -500
  96. data/ext/carray_kernels_scan.c +1097 -488
  97. data/ext/carray_kernels_search.c +3787 -2176
  98. data/ext/carray_kernels_sort.c +1200 -920
  99. data/ext/carray_kernels_triop.c +479 -7
  100. data/ext/carray_key_windows.c +216 -0
  101. data/ext/carray_lazy.c +967 -153
  102. data/ext/carray_loop.c +81 -65
  103. data/ext/carray_mask.c +910 -324
  104. data/ext/carray_math_kernel.h +1 -0
  105. data/ext/carray_median_percentile.c +299 -100
  106. data/ext/carray_memory_view.c +872 -758
  107. data/ext/carray_operator.c +1171 -364
  108. data/ext/carray_order.c +505 -133
  109. data/ext/carray_partition.c +112 -65
  110. data/ext/carray_random.c +327 -239
  111. data/ext/carray_round.c +273 -0
  112. data/ext/carray_scatter.c +346 -78
  113. data/ext/carray_segment.c +257 -0
  114. data/ext/carray_slab.c +249 -86
  115. data/ext/carray_sort.c +224 -227
  116. data/ext/carray_sort_kernel.c +8 -1
  117. data/ext/carray_struct.c +118 -39
  118. data/ext/carray_test.c +193 -69
  119. data/ext/carray_time_text.c +1182 -0
  120. data/ext/carray_undef.c +4 -0
  121. data/ext/carray_utils.c +579 -113
  122. data/ext/extconf.rb +27 -2
  123. data/ext/mk_call_cfunc.rb +19 -4
  124. data/ext/mk_pow5_table.rb +35 -0
  125. data/ext/mkkernel.rb +1202 -1014
  126. data/ext/ruby_carray.c +17 -5
  127. data/ext/version.h +4 -4
  128. data/ext/version.rb +4 -2
  129. data/lib/carray/attribute.rb +160 -17
  130. data/lib/carray/autoload_carray.rb +23 -27
  131. data/lib/carray/autoload_method_extension.rb +20 -5
  132. data/lib/carray/axis_group.rb +360 -63
  133. data/lib/carray/basics.rb +162 -28
  134. data/lib/carray/bincount_nd.rb +18 -2
  135. data/lib/carray/block_iterator.rb +231 -58
  136. data/lib/carray/boolean_reduce.rb +34 -42
  137. data/lib/carray/categorical.rb +242 -52
  138. data/lib/carray/categorical_iterator.rb +437 -827
  139. data/lib/carray/complex.rb +41 -34
  140. data/lib/carray/conditional.rb +150 -14
  141. data/lib/carray/const_string.rb +59 -4
  142. data/lib/carray/construct.rb +15 -11
  143. data/lib/carray/data_type_extension.rb +1 -0
  144. data/lib/carray/distance_limit.rb +77 -0
  145. data/lib/carray/fixlen_string.rb +7 -1
  146. data/lib/carray/frame/column_verbs.rb +70 -0
  147. data/lib/carray/frame/concat.rb +157 -6
  148. data/lib/carray/frame/convert.rb +82 -7
  149. data/lib/carray/frame/csv_parser.rb +688 -87
  150. data/lib/carray/frame/describe.rb +80 -0
  151. data/lib/carray/frame/frame.rb +369 -45
  152. data/lib/carray/frame/group.rb +631 -90
  153. data/lib/carray/frame/io.rb +506 -79
  154. data/lib/carray/frame/join.rb +411 -62
  155. data/lib/carray/frame/records.rb +116 -19
  156. data/lib/carray/frame/reshape.rb +455 -0
  157. data/lib/carray/frame/sort.rb +30 -18
  158. data/lib/carray/frame/verbs.rb +868 -61
  159. data/lib/carray/frame/windows.rb +117 -0
  160. data/lib/carray/frame.rb +4 -0
  161. data/lib/carray/fuse_source.rb +118 -2
  162. data/lib/carray/fusion.rb +257 -42
  163. data/lib/carray/histogram.rb +6 -1
  164. data/lib/carray/inspect.rb +54 -13
  165. data/lib/carray/iterator.rb +99 -9
  166. data/lib/carray/key_windows.rb +620 -0
  167. data/lib/carray/lazy.rb +216 -193
  168. data/lib/carray/mask_gap_fill.rb +112 -92
  169. data/lib/carray/math.rb +32 -19
  170. data/lib/carray/meld_reduce.rb +52 -21
  171. data/lib/carray/methods/align_addr.rb +8 -4
  172. data/lib/carray/methods/bin.rb +26 -18
  173. data/lib/carray/methods/bincount.rb +18 -2
  174. data/lib/carray/methods/bit_string.rb +15 -4
  175. data/lib/carray/methods/choose.rb +16 -3
  176. data/lib/carray/methods/composition.rb +18 -10
  177. data/lib/carray/methods/factorize.rb +2 -2
  178. data/lib/carray/methods/gather_nd.rb +25 -5
  179. data/lib/carray/methods/insert_block.rb +9 -14
  180. data/lib/carray/methods/is_between.rb +59 -0
  181. data/lib/carray/methods/is_in.rb +140 -10
  182. data/lib/carray/methods/join.rb +2 -7
  183. data/lib/carray/methods/lag.rb +49 -0
  184. data/lib/carray/methods/locate_addr.rb +182 -45
  185. data/lib/carray/methods/mode.rb +18 -1
  186. data/lib/carray/methods/nunique.rb +11 -6
  187. data/lib/carray/methods/repeat.rb +1 -20
  188. data/lib/carray/methods/resize.rb +21 -23
  189. data/lib/carray/methods/snap.rb +34 -12
  190. data/lib/carray/methods/unique.rb +11 -2
  191. data/lib/carray/methods/value_counts.rb +4 -11
  192. data/lib/carray/record_order.rb +208 -0
  193. data/lib/carray/rng.rb +3 -0
  194. data/lib/carray/runtime.rb +65 -17
  195. data/lib/carray/segment_iterator.rb +1221 -0
  196. data/lib/carray/serialize.rb +214 -30
  197. data/lib/carray/slab_iterator.rb +101 -27
  198. data/lib/carray/stack.rb +10 -4
  199. data/lib/carray/string.rb +105 -5
  200. data/lib/carray/string_operation_extension.rb +12 -4
  201. data/lib/carray/struct.rb +137 -58
  202. data/lib/carray/struct_builder.rb +124 -17
  203. data/lib/carray/time.rb +1222 -186
  204. data/lib/carray/window_iterator.rb +242 -81
  205. data/lib/carray.rb +9 -2
  206. data/yard-stubs/ca_obj_array.rb +4 -4
  207. data/yard-stubs/ca_obj_bitarray.rb +7 -0
  208. data/yard-stubs/ca_obj_bitfield.rb +23 -12
  209. data/yard-stubs/ca_obj_fake.rb +1 -1
  210. data/yard-stubs/ca_obj_field.rb +5 -1
  211. data/yard-stubs/ca_obj_grid.rb +21 -10
  212. data/yard-stubs/ca_obj_refer.rb +5 -4
  213. data/yard-stubs/ca_obj_roll.rb +2 -3
  214. data/yard-stubs/ca_obj_shift.rb +5 -1
  215. data/yard-stubs/ca_obj_stride.rb +10 -7
  216. data/yard-stubs/ca_obj_tile.rb +1 -1
  217. data/yard-stubs/ca_obj_transpose.rb +1 -1
  218. data/yard-stubs/ca_obj_window.rb +9 -5
  219. data/yard-stubs/carray_access.rb +11 -5
  220. data/yard-stubs/carray_attribute.rb +0 -5
  221. data/yard-stubs/carray_broadcast.rb +1 -1
  222. data/yard-stubs/carray_cast.rb +88 -43
  223. data/yard-stubs/carray_conversion.rb +15 -2
  224. data/yard-stubs/carray_copy.rb +12 -5
  225. data/yard-stubs/carray_core.rb +3 -3
  226. data/yard-stubs/carray_count.rb +9 -0
  227. data/yard-stubs/carray_element.rb +10 -4
  228. data/yard-stubs/carray_generate.rb +21 -1
  229. data/yard-stubs/carray_lazy.rb +5 -1
  230. data/yard-stubs/carray_loop.rb +4 -1
  231. data/yard-stubs/carray_mask.rb +60 -12
  232. data/yard-stubs/carray_math.rb +52 -14
  233. data/yard-stubs/carray_median_percentile.rb +15 -8
  234. data/yard-stubs/carray_memory_view.rb +40 -23
  235. data/yard-stubs/carray_order.rb +61 -29
  236. data/yard-stubs/carray_random.rb +13 -4
  237. data/yard-stubs/carray_scatter.rb +21 -9
  238. data/yard-stubs/carray_segment.rb +72 -0
  239. data/yard-stubs/carray_slab.rb +10 -2
  240. data/yard-stubs/carray_sort.rb +49 -8
  241. data/yard-stubs/carray_test.rb +15 -3
  242. data/yard-stubs/carray_utils.rb +0 -26
  243. metadata +19 -5
  244. data/ext/ca_for_each_element.h +0 -239
  245. data/ext/carray_kernels_map.c +0 -3467
  246. data/lib/carray/arrow_tensor.rb +0 -401
  247. data/lib/carray/table.rb +0 -108
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 is newer
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
- File.stat("mkkernel.rb").mtime > File.stat(CARRAY_KERNELS_STAMP).mtime
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