On Fri, Oct 28, 2022 at 12:52:44PM -0400, Patrick Palka wrote: > IIRC for hex formatting of denormals I opted to be consistent with how > glibc printf formats them, instead of outputting the truly shortest > form.
Note, it isn't just denormals, 1.18cp-4 2.318p-5 4.63p-6 8.c6p-7 463p-10 8c6p-11 also represent the same number, the first is what glibc emits (and is certainly nicer to read), but some of the others are shorter. Now, the printf %a/%A documentation says that there must be one hexadecimal digit before the dot if any and that for normalized numbers it must be non-zero. So that rules out the last 2, and allows but doesn't require the denormal treatment the library does right now. If we shall go really for the shortest, we should handle denormals with non-zero leading digit too and for all cases consider the 4 shifting possibilities which one results in shortest (perhaps prefer the smallest non-zero leading digit among the shortest)? > > readelf -Ws libstdc++.so.6.0.31 | grep float16_t > > 912: 00000000000ae824 950 FUNC GLOBAL DEFAULT 13 > > _ZSt21__to_chars_bfloat16_tPcS_fSt12chars_format@@GLIBCXX_3.4.31 > > 5767: 00000000000ae4a1 899 FUNC GLOBAL DEFAULT 13 > > _ZSt20__to_chars_float16_tPcS_fSt12chars_format@@GLIBCXX_3.4.31 > > 842: 000000000016d430 106 FUNC LOCAL DEFAULT 13 > > _ZN12_GLOBAL__N_113get_ieee_reprINS_23floating_type_float16_tEEENS_6ieee_tIT_EES3_ > > 865: 0000000000170980 1613 FUNC LOCAL DEFAULT 13 > > _ZSt23__floating_to_chars_hexIN12_GLOBAL__N_123floating_type_float16_tEESt15to_chars_resultPcS3_T_St8optionalIiE.constprop.0.isra.0 > > 7205: 00000000000ae824 950 FUNC GLOBAL DEFAULT 13 > > _ZSt21__to_chars_bfloat16_tPcS_fSt12chars_format > > 7985: 00000000000ae4a1 899 FUNC GLOBAL DEFAULT 13 > > _ZSt20__to_chars_float16_tPcS_fSt12chars_format > > so 3568 code bytes together or so. > > Ouch, the instantiation of __floating_to_chars_hex for float16 is > responsible for nearly 50% of the .so size increase True, but the increase isn't that huge. Jakub