[libc-commits] [PATCH] D148179: [libc] Make printf decimal long doubles use hex
Michael Jones via Phabricator via libc-commits
libc-commits at lists.llvm.org
Wed Apr 12 15:43:34 PDT 2023
michaelrj created this revision.
michaelrj added reviewers: sivachandra, lntue.
Herald added subscribers: libc-commits, ecnelises, tschuett.
Herald added projects: libc-project, All.
michaelrj requested review of this revision.
Decimal long doubles are not commonly used, and aren't currently
supported by the algorithm used for decimal float conversions. To avoid
giving incorrect answers, this patch adds a temporary exception to print
long doubles in hexadecimal even when decimal is requested.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D148179
Files:
libc/src/stdio/printf_core/converter.cpp
libc/src/stdio/printf_core/float_hex_converter.h
Index: libc/src/stdio/printf_core/float_hex_converter.h
===================================================================
--- libc/src/stdio/printf_core/float_hex_converter.h
+++ libc/src/stdio/printf_core/float_hex_converter.h
@@ -30,8 +30,7 @@
const FormatSection &to_conv) {
// All of the letters will be defined relative to variable a, which will be
// the appropriate case based on the name of the conversion.
- // Since the name of the conversion is also 'a', we can just use it directly.
- const char a = to_conv.conv_name;
+ const char a = (to_conv.conv_name & 32) | 'A';
bool is_negative;
int exponent;
Index: libc/src/stdio/printf_core/converter.cpp
===================================================================
--- libc/src/stdio/printf_core/converter.cpp
+++ libc/src/stdio/printf_core/converter.cpp
@@ -28,6 +28,23 @@
if (!to_conv.has_conv)
return writer->write(to_conv.raw_string);
+#ifndef LIBC_COPT_PRINTF_DISABLE_FLOAT
+ // TODO(michaelrj): Undo this once decimal long double support is done.
+ if (to_conv.length_modifier == LengthModifier::L) {
+ switch (to_conv.conv_name) {
+ case 'f':
+ case 'F':
+ case 'e':
+ case 'E':
+ case 'g':
+ case 'G':
+ return convert_float_hex_exp(writer, to_conv);
+ default:
+ break;
+ }
+ }
+#endif // LIBC_COPT_PRINTF_DISABLE_FLOAT
+
switch (to_conv.conv_name) {
case '%':
return writer->write("%");
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D148179.512989.patch
Type: text/x-patch
Size: 1479 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libc-commits/attachments/20230412/0f40ac9c/attachment-0001.bin>
More information about the libc-commits
mailing list