Skip to content

Commit 027496f

Browse files
dmitry-gorokhovazhai219
authored andcommitted
[FORK][FEATURE] Binary networks support
1 parent c9116f0 commit 027496f

20 files changed

+333
-4
lines changed

include/oneapi/dnnl/dnnl.h

+3
Original file line numberDiff line numberDiff line change
@@ -823,6 +823,9 @@ dnnl_status_t DNNL_API dnnl_post_ops_append_quantization(
823823
const void* input_scale, const void* input_shift,
824824
const void* output_scale, const void* output_shift);
825825

826+
dnnl_status_t DNNL_API dnnl_post_ops_append_binarization(
827+
dnnl_post_ops_t post_ops, dnnl_alg_kind_t alg, const float* weights_data, const float* output_mask);
828+
826829
/// @} dnnl_api_attributes
827830

828831
/// @} dnnl_api_primitives

include/oneapi/dnnl/dnnl.hpp

+11
Original file line numberDiff line numberDiff line change
@@ -508,6 +508,7 @@ enum class algorithm {
508508

509509
quantization_quantize_dequantize = dnnl_quantization_quantize_dequantize,
510510
quantization_quantize = dnnl_quantization_quantize,
511+
binarization_depthwise = dnnl_binarization_depthwise,
511512
};
512513

513514
/// Converts algorithm kind enum value from C++ API to C API type.
@@ -891,6 +892,8 @@ struct memory : public handle<dnnl_memory_t> {
891892
s4 = dnnl_s4,
892893
/// 4-bit unsigned integer.
893894
u4 = dnnl_u4,
895+
/// 1-bit integer
896+
bin = dnnl_bin
894897
};
895898

896899
/// Returns size of data type in bytes.
@@ -1317,6 +1320,7 @@ struct memory : public handle<dnnl_memory_t> {
13171320
aBCd4b4c = dnnl_aBCd4b4c,
13181321
ABcd8a16b2a = dnnl_ABcd8a16b2a,
13191322
ABcd8a8b = dnnl_ABcd8a8b,
1323+
ABcd8a32b = dnnl_ABcd8a32b,
13201324
ABcd8a4b = dnnl_ABcd8a4b,
13211325
ABcd8a2b = dnnl_ABcd8a2b,
13221326
/// 4D tensor blocked by 2nd dimension with block size 8
@@ -1805,6 +1809,8 @@ struct memory : public handle<dnnl_memory_t> {
18051809
OhwI8i8o = dnnl_OhwI8i8o,
18061810
OIhw8o16i2o = dnnl_OIhw8o16i2o,
18071811
OIhw8o8i = dnnl_OIhw8o8i,
1812+
OIhw8o32i = dnnl_OIhw8o32i,
1813+
OIhw16o32i = dnnl_OIhw16o32i,
18081814
OIhw8o4i = dnnl_OIhw8o4i,
18091815
OIhw2i8o4i = dnnl_OIhw2i8o4i,
18101816
IOdhw16o16i = dnnl_IOdhw16o16i,
@@ -3956,6 +3962,11 @@ struct post_ops : public handle<dnnl_post_ops_t> {
39563962
input_scale, input_shift, output_scale, output_shift),
39573963
"could not append quantization");
39583964
}
3965+
3966+
void append_binarization(algorithm alg, const float* weights_data, const float* output_mask) {
3967+
error::wrap_c_api(dnnl_post_ops_append_binarization(get(), convert_to_c(alg), weights_data, output_mask),
3968+
"could not append binarization");
3969+
}
39593970
};
39603971

39613972
/// @cond DO_NOT_DOCUMENT_THIS

include/oneapi/dnnl/dnnl_common_types.h

+2
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,8 @@ typedef enum {
105105
/// [MX-compliant 8-bit compliant scale data type](https://www.opencompute.org/documents/ocp-microscaling-formats-mx-v1-0-spec-final-pdf) with 8-bit exponent.
106106
dnnl_e8m0 = 13,
107107

108+
/// 1-bit integer.
109+
dnnl_bin = 14,
108110
/// Parameter to allow internal only data_types without undefined behavior.
109111
/// This parameter is chosen to be valid for so long as sizeof(int) >= 2.
110112
dnnl_data_type_max = 0x7fff,

include/oneapi/dnnl/dnnl_types.h

+7
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,7 @@ typedef enum {
286286
dnnl_ABcd8a16b2a,
287287
dnnl_ABcd2b8a4b,
288288
dnnl_ABcd8a8b,
289+
dnnl_ABcd8a32b,
289290
dnnl_ABcd8a4b,
290291
/// 4D tensor blocked by 2nd dimension with block size 8
291292
dnnl_aBcd8b,
@@ -1391,6 +1392,8 @@ typedef enum {
13911392
dnnl_OIhw2i8o4i = dnnl_ABcd2b8a4b,
13921393
dnnl_IOhw8o16i2o = dnnl_BAcd8a16b2a,
13931394
dnnl_OIhw8o8i = dnnl_ABcd8a8b,
1395+
dnnl_OIhw8o32i = dnnl_ABcd8a32b,
1396+
dnnl_OIhw16o32i = dnnl_ABcd16a32b,
13941397
dnnl_OIhw8o4i = dnnl_ABcd8a4b,
13951398
dnnl_Owhi16o = dnnl_Adcb16a,
13961399
dnnl_OIhw8i32o = dnnl_ABcd8b32a,
@@ -2000,6 +2003,8 @@ typedef enum {
20002003
dnnl_depthwise,
20012004
/// A quantization primitive.
20022005
dnnl_quantization,
2006+
/// A binatization primitive.
2007+
dnnl_binarization,
20032008
/// An LRN primitive.
20042009
dnnl_lrn,
20052010
/// A batch normalization primitive.
@@ -2196,6 +2201,7 @@ typedef enum {
21962201

21972202
dnnl_quantization_quantize_dequantize = 0x4fff0,
21982203
dnnl_quantization_quantize = 0x4fff1,
2204+
dnnl_binarization_depthwise = 0x4fff2,
21992205
} dnnl_alg_kind_t;
22002206

22012207
/// Flags for normalization primitives.
@@ -2915,6 +2921,7 @@ typedef enum {
29152921
dnnl_cpu_isa_avx10_1_512_amx_fp16 = 0x1fef,
29162922
/// @copydoc dnnl_cpu_isa_avx10_1_512_amx_fp16
29172923
dnnl_cpu_isa_avx512_core_amx_fp16 = dnnl_cpu_isa_avx10_1_512_amx_fp16,
2924+
dnnl_cpu_isa_avx512_vpopcnt = 0x3fef,
29182925
} dnnl_cpu_isa_t;
29192926

29202927
/// CPU ISA hints flags

src/common/c_types_map.hpp

+6
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ const alg_kind_t depthwise_scale_shift = dnnl_depthwise_scale_shift;
148148
const alg_kind_t depthwise_prelu = dnnl_depthwise_prelu;
149149
const alg_kind_t quantization_quantize_dequantize = dnnl_quantization_quantize_dequantize;
150150
const alg_kind_t quantization_quantize = dnnl_quantization_quantize;
151+
const alg_kind_t binarization_depthwise = dnnl_binarization_depthwise;
151152
} // namespace alg_kind
152153

153154
using data_type_t = dnnl_data_type_t;
@@ -171,6 +172,7 @@ const data_type_t data_type_max = dnnl_data_type_max;
171172
// Not exposed through API as all current uses are internal only
172173
const data_type_t tf32 = static_cast<data_type_t>(1 << 8);
173174

175+
const data_type_t bin = dnnl_bin;
174176
} // namespace data_type
175177

176178
using fpmath_mode_t = dnnl_fpmath_mode_t;
@@ -482,6 +484,7 @@ const format_tag_t aBCd4b4c = dnnl_aBCd4b4c;
482484
const format_tag_t ABcd8a16b2a = dnnl_ABcd8a16b2a;
483485
const format_tag_t BAcd8a16b2a = dnnl_BAcd8a16b2a;
484486
const format_tag_t ABcd8a8b = dnnl_ABcd8a8b;
487+
const format_tag_t ABcd8a32b = dnnl_ABcd8a32b;
485488
const format_tag_t ABcd8a4b = dnnl_ABcd8a4b;
486489
const format_tag_t ABcd8a2b = dnnl_ABcd8a2b;
487490
const format_tag_t aBcd8b = dnnl_aBcd8b;
@@ -1287,6 +1290,8 @@ const format_tag_t OhwI8i8o = dnnl_OhwI8i8o;
12871290
const format_tag_t OIhw8o16i2o = dnnl_OIhw8o16i2o;
12881291
const format_tag_t IOhw8o16i2o = dnnl_IOhw8o16i2o;
12891292
const format_tag_t OIhw8o8i = dnnl_OIhw8o8i;
1293+
const format_tag_t OIhw8o32i = dnnl_OIhw8o32i;
1294+
const format_tag_t OIhw16o32i = dnnl_OIhw16o32i;
12901295
const format_tag_t OIhw8o4i = dnnl_OIhw8o4i;
12911296
const format_tag_t Owhi16o = dnnl_Owhi16o;
12921297
const format_tag_t Odwhi16o = dnnl_Odwhi16o;
@@ -1964,6 +1969,7 @@ const primitive_kind_t layer_normalization = dnnl_layer_normalization;
19641969
const primitive_kind_t group_normalization = dnnl_group_normalization;
19651970
const primitive_kind_t depthwise = dnnl_depthwise;
19661971
const primitive_kind_t quantization = dnnl_quantization;
1972+
const primitive_kind_t binarization = dnnl_binarization;
19671973

19681974
// Internal only primitive kinds.
19691975
const primitive_kind_t internal_only_start = (primitive_kind_t)(1 << 12);

src/common/dnnl_debug_autogenerated.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ const char *dnnl_dt2str(dnnl_data_type_t v) {
5757
if (v == dnnl_s4) return "s4";
5858
if (v == dnnl_u4) return "u4";
5959
if (v == dnnl_e8m0) return "e8m0";
60+
if (v == dnnl_bin) return "bin";
6061
if (v == dnnl_data_type_max) return "data_type_max";
6162
assert(!"unknown dt");
6263
return "unknown dt";
@@ -204,6 +205,8 @@ const char *dnnl_fmt_tag2str(dnnl_format_tag_t v) {
204205
if (v == dnnl_ABcd8a16b2a) return "ABcd8a16b2a";
205206
if (v == dnnl_ABcd2b8a4b) return "ABcd2b8a4b";
206207
if (v == dnnl_ABcd8a8b) return "ABcd8a8b";
208+
if (v == dnnl_ABcd8a32b) return "ABcd8a32b";
209+
if (v == dnnl_ABcd16a32b) return "ABcd16a32b";
207210
if (v == dnnl_ABcd8a4b) return "ABcd8a4b";
208211
if (v == dnnl_aBcd8b) return "aBcd8b";
209212
if (v == dnnl_aBCd4c8b2c) return "aBCd4c8b2c";
@@ -1177,6 +1180,8 @@ const char *dnnl_fmt_tag2str(dnnl_format_tag_t v) {
11771180
if (v == dnnl_OIhw8o16i2o) return "OIhw8o16i2o";
11781181
if (v == dnnl_OIhw2i8o4i) return "OIhw2i8o4i";
11791182
if (v == dnnl_IOhw8o16i2o) return "IOhw8o16i2o";
1183+
if (v == dnnl_OIhw8o32i) return "OIhw8o23i";
1184+
if (v == dnnl_OIhw16o32i) return "OIhw16o23i";
11801185
if (v == dnnl_OIhw8o8i) return "OIhw8o8i";
11811186
if (v == dnnl_OIhw8o4i) return "OIhw8o4i";
11821187
if (v == dnnl_Owhi16o) return "Owhi16o";
@@ -1843,6 +1848,7 @@ const char *dnnl_alg_kind2str(dnnl_alg_kind_t v) {
18431848
if (v == dnnl_depthwise_prelu) return "depthwise_prelu";
18441849
if (v == dnnl_quantization_quantize_dequantize) return "quantization_quantize_dequantize";
18451850
if (v == dnnl_quantization_quantize) return "quantization_quantize";
1851+
if (v == dnnl_binarization_depthwise) return "binarization_depthwise";
18461852
assert(!"unknown alg_kind");
18471853
return "unknown alg_kind";
18481854
}

src/common/dnnl_traits.hpp

+4
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,10 @@ struct prec_traits<data_type::boolean> {
9696
typedef bool type;
9797
};
9898

99+
template <> struct prec_traits<data_type::bin> {
100+
typedef uint8_t type;
101+
};
102+
99103
template <>
100104
struct data_traits<float8_e5m2_t> {
101105
static constexpr data_type_t data_type = data_type::f8_e5m2;

src/common/memory_desc_wrapper.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,7 @@ status_t memory_desc_wrapper::compute_blocking(
397397
C(ABcd8a16b2a, {0, 1, 2, 3}, {8, 16, 2}, {0, 1, 0});
398398
C(BAcd8a16b2a, {1, 0, 2, 3}, {8, 16, 2}, {0, 1, 0});
399399
C(ABcd8a8b, {0, 1, 2, 3}, {8, 8}, {0, 1});
400+
C(ABcd8a32b, {0, 1, 2, 3}, {8, 32}, {0, 1});
400401
C(ABcd8a4b, {0, 1, 2, 3}, {8, 4}, {0, 1});
401402
C(ABcd8a2b, {0, 1, 2, 3}, {8, 2}, {0, 1});
402403
C(aBcd8b, {0, 1, 2, 3}, {8}, {1});

src/common/memory_zero_pad.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,7 @@ static status_t zero_pad(const memory_t *memory, const exec_ctx_t &ctx) {
289289
case u8: return typed_zero_pad<u8>(memory, ctx);
290290
case s4: return typed_zero_pad<s8>(memory, ctx);
291291
case u4: return typed_zero_pad<u8>(memory, ctx);
292+
case bin: return typed_zero_pad<u8>(memory, ctx);
292293
default: assert(!"memory is undefined"); return unimplemented;
293294
}
294295
return unimplemented;

src/common/primitive_attr.cpp

+27
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,23 @@ status_t post_ops_t::append_quantization(alg_kind_t alg,
380380
return success;
381381
}
382382

383+
status_t post_ops_t::append_binarization(alg_kind_t alg, const float* weights_data, const float* output_mask_data) {
384+
using namespace dnnl::impl::alg_kind;
385+
if (len() == post_ops_limit) return out_of_memory;
386+
bool known_alg = one_of(alg, binarization_depthwise);
387+
if (!known_alg)
388+
return invalid_arguments;
389+
390+
entry_.emplace_back();
391+
auto &e = entry_.back();
392+
e.kind = primitive_kind::binarization;
393+
e.binarization.alg = alg;
394+
e.binarization.weights_data = weights_data;
395+
e.binarization.output_mask_data = output_mask_data;
396+
397+
return success;
398+
}
399+
383400
bool post_ops_t::defined() const {
384401
for (int idx = 0; idx < len(); ++idx) {
385402
auto kind = entry_[idx].kind;
@@ -398,6 +415,8 @@ bool post_ops_t::defined() const {
398415
// depthwise is always defined
399416
} else if (kind == primitive_kind::quantization) {
400417
// quantization is always defined
418+
} else if (kind == primitive_kind::binarization) {
419+
// binarization is always defined
401420
} else {
402421
assert(!"unreachable");
403422
}
@@ -940,6 +959,14 @@ status_t dnnl_post_ops_append_quantization(post_ops_t *post_ops, alg_kind_t kind
940959
return post_ops->append_quantization(kind, crop_low, crop_high, input_scale, input_shift, output_scale, output_shift);
941960
}
942961

962+
status_t dnnl_post_ops_append_binarization(post_ops_t *post_ops, alg_kind_t kind, const float* weights_data,
963+
const float* output_mask_data) {
964+
if (post_ops == nullptr)
965+
return invalid_arguments;
966+
967+
return post_ops->append_binarization(kind, weights_data, output_mask_data);
968+
}
969+
943970
status_t dnnl_primitive_attr_set_rnn_data_qparams(
944971
primitive_attr_t *attr, const float scale, const float shift) {
945972
if (attr == nullptr) return invalid_arguments;

src/common/primitive_attr.hpp

+19
Original file line numberDiff line numberDiff line change
@@ -677,6 +677,12 @@ struct dnnl_post_ops : public dnnl::impl::c_compatible {
677677
const dnnl::impl::shifts_t<float>* output_shift_data;
678678
};
679679

680+
struct binarization_t {
681+
dnnl::impl::alg_kind_t alg;
682+
const float* weights_data;
683+
const float* output_mask_data;
684+
} ;
685+
680686
dnnl::impl::primitive_kind_t kind
681687
= dnnl::impl::primitive_kind::undefined;
682688
union {
@@ -687,6 +693,7 @@ struct dnnl_post_ops : public dnnl::impl::c_compatible {
687693
prelu_t prelu;
688694
depthwise_t depthwise;
689695
quantization_t quantization;
696+
binarization_t binarization;
690697
};
691698

692699
bool is_eltwise(bool require_scale_one = false) const {
@@ -735,6 +742,11 @@ struct dnnl_post_ops : public dnnl::impl::c_compatible {
735742
return kind == primitive_kind::quantization;
736743
}
737744

745+
bool is_binarization() const {
746+
using namespace dnnl::impl;
747+
return kind == primitive_kind::binarization;
748+
}
749+
738750
dnnl::impl::status_t set_depthwise_scales(const float *scales);
739751

740752
bool operator==(const entry_t &rhs) const {
@@ -790,6 +802,11 @@ struct dnnl_post_ops : public dnnl::impl::c_compatible {
790802
&& quantization.output_scale_data == rhs.quantization.output_scale_data
791803
&& quantization.output_shift_data == rhs.quantization.output_shift_data;
792804
break;
805+
case primitive_kind::binarization:
806+
ret = depthwise.alg == rhs.depthwise.alg
807+
&& binarization.weights_data == rhs.binarization.weights_data
808+
&& binarization.output_mask_data == rhs.binarization.output_mask_data;
809+
break;
793810
default: assert(!"unsupported post_op");
794811
}
795812
return ret;
@@ -820,6 +837,8 @@ struct dnnl_post_ops : public dnnl::impl::c_compatible {
820837
const void* crop_low, const void* crop_high,
821838
const void* input_scale, const void* input_shift,
822839
const void* output_scale, const void* output_shift);
840+
dnnl::impl::status_t append_binarization(dnnl::impl::alg_kind_t alg, const float* weights_data,
841+
const float* output_mask_data);
823842

824843
dnnl::impl::status_t prepend_binary(dnnl::impl::alg_kind_t alg,
825844
const dnnl::impl::memory_desc_t *user_src1_desc);

src/common/tag_traits.hpp

+6-2
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ enum class inner_blk_t {
8989
_8b16c,
9090
_8b24c,
9191
_8b32a,
92+
_8a32b,
9293
_8b8c,
9394
_8c2b,
9495
_8c4b,
@@ -209,7 +210,7 @@ constexpr int AB_or_BC_blk_off(int x0, int x1) {
209210
utils::one_of(f, ib::_4a4b, ib::_4b4a, ib::_4b4c, ib::_4c4b,
210211
ib::_8a2b, ib::_8a4b, ib::_8b2a, ib::_8b4a, ib::_8b2c,
211212
ib::_8c2b, ib::_8c4b, ib::_8b4c, ib::_8a8b, ib::_8b8a,
212-
ib::_8b16a, ib::_8b24a, ib::_8b32a, ib::_8b8c, ib::_8c8b,
213+
ib::_8b16a, ib::_8b24a, ib::_8b32a, ib::_8a32b, ib::_8b8c, ib::_8c8b,
213214
ib::_16a16b, ib::_16b64a, ib::_16b48a, ib::_16b32a,
214215
ib::_16b16a, ib::_16b16c, ib::_16c16b, ib::_32a32b,
215216
ib::_16a2b, ib::_16a4b, ib::_16b2a, ib::_16b4a, ib::_16b2c,
@@ -241,9 +242,10 @@ constexpr int AB_or_BC_blk_off(int x0, int x1) {
241242
: (utils::one_of(f, ib::_2a24b, ib::_2b24c, ib::_8a24b, ib::_8b24c)) ? 24 * x0 + x1
242243
: (f == ib::_4a4b || f == ib::_4b4c) ? 4 * x0 + x1
243244
: (f == ib::_4b4a || f == ib::_4c4b) ? 4 * x1 + x0
244-
: (f == ib::_8a8b || f == ib::_8b8c) ? 8 * x0 + x1
245+
: (f == ib::_8a8b || f == ib::_8a32b || f == ib::_8b8c) ? 8 * x0 + x1
245246
: (f == ib::_8b8a || f == ib::_8c8b) ? 8 * x1 + x0
246247
: (utils::one_of(f, ib::_16a16b, ib::_16b16c, ib::_8a16b, ib::_8b16c)) ? 16 * x0 + x1
248+
: (f == ib::_16a16b || f == ib::_16a32b || f == ib::_16b16c) ? 16 * x0 + x1
247249
: (f == ib::_16b64a) ? 64 * x1 + x0
248250
: (f == ib::_16b48a) ? 48 * x1 + x0
249251
: (f == ib::_8b32a || f == ib::_16b32a) ? 32 * x1 + x0
@@ -668,6 +670,8 @@ DECL_TRAITS(ABcde16b48a2b, _AB, _16b48a2b, 5);
668670
DECL_TRAITS(ABcde16b64a2b, _AB, _16b64a2b, 5);
669671
DECL_TRAITS(ABcd8a16b2a, _AB, _8a16b2a, 4);
670672
DECL_TRAITS(ABcd8a8b, _AB, _8a8b, 4);
673+
DECL_TRAITS(ABcd8a32b, _AB, _8a32b, 4);
674+
DECL_TRAITS(ABcd16a32b, _AB, _16a32b, 4);
671675
DECL_TRAITS(aBcd8b, _B, _8b, 4);
672676
DECL_TRAITS(ABcd8b16a2b, _AB, _8b16a2b, 4);
673677
DECL_TRAITS(AcdB8b16a2b, _AB, _8b16a2b, 4);

src/common/type_helpers.hpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ inline size_t data_type_size(data_type_t data_type) {
9696
case s4: return sizeof(prec_traits<s4>::type);
9797
case u4: return sizeof(prec_traits<u4>::type);
9898
case boolean: return sizeof(prec_traits<boolean>::type);
99+
case bin: return sizeof(prec_traits<u8>::type);
99100
case data_type::undef:
100101
default: assert(!"unknown data_type");
101102
}
@@ -1253,7 +1254,7 @@ inline bool memory_desc_sanity_check(int ndims, const dims_t dims,
12531254

12541255
bool ok = dims != nullptr && 0 < ndims && ndims <= DNNL_MAX_NDIMS
12551256
&& utils::one_of(data_type, f8_e5m2, f8_e4m3, f16, bf16, f32, f64,
1256-
s32, s8, u8, s4, u4);
1257+
s32, s8, u8, s4, u4, bin);
12571258
if (!ok) return false;
12581259

12591260
bool has_runtime_dims = false;

src/cpu/reorder/cpu_reorder.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ regular_impl_list_map() {
3636
{{f32, u8, 0}, &regular_f32_u8_impl_list_map()},
3737
{{f8_e5m2, data_type::undef, 0}, &regular_fp8_impl_list_map()},
3838
{{f8_e4m3, data_type::undef, 0}, &regular_fp8_impl_list_map()},
39+
{{f32, bin, 0}, &regular_f32_bin_impl_list_map()},
3940
{{bf16, data_type::undef, 0}, &regular_bf16_impl_list_map()},
4041
{{f16, data_type::undef, 0}, &regular_f16_impl_list_map()},
4142
{{s32, data_type::undef, 0}, &regular_s32_impl_list_map()},
@@ -45,6 +46,7 @@ regular_impl_list_map() {
4546
{{f32, u4, 0}, &regular_u4_impl_list_map()},
4647
{{s4, f32, 0}, &regular_s4_impl_list_map()},
4748
{{u4, f32, 0}, &regular_u4_impl_list_map()},
49+
{{bin, data_type::undef, 0}, &regular_bin_impl_list_map()},
4850
};
4951
return the_map;
5052
}

0 commit comments

Comments
 (0)