[libc-commits] [libc] [libc] provide str to float build configs (PR #178780)

via libc-commits libc-commits at lists.llvm.org
Thu Jan 29 15:50:39 PST 2026


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-libc

Author: Prabhu Rajasekaran (Prabhuk)

<details>
<summary>Changes</summary>

The str to float code path offers options which can reduce code bloat.
Expose them as build config options. Disable Eisel Lemire for avoiding
code bloat caused by DETAILED_POWERS_OF_TEN look up table.


---
Full diff: https://github.com/llvm/llvm-project/pull/178780.diff


5 Files Affected:

- (modified) libc/cmake/modules/LLVMLibCCompileOptionRules.cmake (+16) 
- (modified) libc/config/baremetal/config.json (+5) 
- (modified) libc/config/config.json (+14) 
- (modified) libc/docs/configure.rst (+4) 
- (modified) libc/src/__support/str_to_float.h (+2-2) 


``````````diff
diff --git a/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake b/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake
index a719f20d532e0..326153dd38a3d 100644
--- a/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake
+++ b/libc/cmake/modules/LLVMLibCCompileOptionRules.cmake
@@ -77,6 +77,22 @@ endfunction(_get_compile_options_from_flags)
 function(_get_compile_options_from_config output_var)
   set(config_options "")
 
+  if(LIBC_CONF_PRINTF_FLOAT_TO_STR_USE_FLOAT320)
+    list(APPEND config_options "-DLIBC_COPT_PRINTF_FLOAT_TO_STR_USE_FLOAT320")
+  endif()
+
+  if(LIBC_CONF_STRTOFLOAT_DISABLE_EISEL_LEMIRE)
+    list(APPEND config_options "-DLIBC_COPT_STRTOFLOAT_DISABLE_EISEL_LEMIRE")
+  endif()
+
+  if(LIBC_CONF_STRTOFLOAT_DISABLE_SIMPLE_DECIMAL_CONVERSION)
+    list(APPEND config_options "-DLIBC_COPT_STRTOFLOAT_DISABLE_SIMPLE_DECIMAL_CONVERSION")
+  endif()
+
+  if(LIBC_CONF_STRTOFLOAT_DISABLE_CLINGER_FAST_PATH)
+    list(APPEND config_options "-DLIBC_COPT_STRTOFLOAT_DISABLE_CLINGER_FAST_PATH")
+  endif()
+
   if(LIBC_CONF_QSORT_IMPL)
     list(APPEND config_options "-DLIBC_QSORT_IMPL=${LIBC_CONF_QSORT_IMPL}")
   endif()
diff --git a/libc/config/baremetal/config.json b/libc/config/baremetal/config.json
index e3703c28865bb..259bc9a7dff61 100644
--- a/libc/config/baremetal/config.json
+++ b/libc/config/baremetal/config.json
@@ -34,6 +34,11 @@
       "value": "LIBC_QSORT_HEAP_SORT"
     }
   },
+  "str_to_float": {
+    "LIBC_CONF_STRTOFLOAT_DISABLE_EISEL_LEMIRE": {
+      "value": true
+    }
+  },
   "math": {
     "LIBC_CONF_MATH_OPTIMIZATIONS": {
       "value": "(LIBC_MATH_SKIP_ACCURATE_PASS | LIBC_MATH_SMALL_TABLES | LIBC_MATH_NO_ERRNO | LIBC_MATH_INTERMEDIATE_COMP_IN_FLOAT)"
diff --git a/libc/config/config.json b/libc/config/config.json
index f981c433b2c7c..171fa185d1cc3 100644
--- a/libc/config/config.json
+++ b/libc/config/config.json
@@ -64,6 +64,20 @@
       "doc": "Disable index mode in the scanf format string."
     }
   },
+  "str_to_float": {
+    "LIBC_CONF_STRTOFLOAT_DISABLE_EISEL_LEMIRE": {
+      "value": false,
+      "doc": "Disable Eisel-Lemire algorithm for string to float conversion."
+    },
+    "LIBC_CONF_STRTOFLOAT_DISABLE_SIMPLE_DECIMAL_CONVERSION": {
+      "value": false,
+      "doc": "Disable simple decimal conversion for string to float conversion."
+    },
+    "LIBC_CONF_STRTOFLOAT_DISABLE_CLINGER_FAST_PATH": {
+      "value": false,
+      "doc": "Disable Clinger's fast path for string to float conversion."
+    }
+  },
   "string": {
     "LIBC_CONF_STRING_LENGTH_IMPL": {
       "value": "element",
diff --git a/libc/docs/configure.rst b/libc/docs/configure.rst
index 81888bb07153c..e083450fe9beb 100644
--- a/libc/docs/configure.rst
+++ b/libc/docs/configure.rst
@@ -60,6 +60,10 @@ to learn about the defaults for your platform and target.
     - ``LIBC_CONF_SCANF_DISABLE_INDEX_MODE``: Disable index mode in the scanf format string.
 * **"setjmp" options**
     - ``LIBC_CONF_SETJMP_AARCH64_RESTORE_PLATFORM_REGISTER``: Make setjmp save the value of x18, and longjmp restore it. The AArch64 ABI delegates this register to platform ABIs, which can choose whether to make it caller-saved.
+* **"str_to_float" options**
+    - ``LIBC_CONF_STRTOFLOAT_DISABLE_CLINGER_FAST_PATH``: Disable Clinger's fast path for string to float conversion.
+    - ``LIBC_CONF_STRTOFLOAT_DISABLE_EISEL_LEMIRE``: Disable Eisel-Lemire algorithm for string to float conversion.
+    - ``LIBC_CONF_STRTOFLOAT_DISABLE_SIMPLE_DECIMAL_CONVERSION``: Disable simple decimal conversion for string to float conversion.
 * **"string" options**
     - ``LIBC_CONF_FIND_FIRST_CHARACTER_IMPL``: Selects the implementation for find-first-character-related functions: 'element', 'word', 'clang_vector', or 'arch_vector'.
     - ``LIBC_CONF_MEMSET_X86_USE_SOFTWARE_PREFETCHING``: Inserts prefetch for write instructions (PREFETCHW) for memset on x86 to recover performance when hardware prefetcher is disabled.
diff --git a/libc/src/__support/str_to_float.h b/libc/src/__support/str_to_float.h
index 54c7aa1d1cb50..7dd446fb3d2fb 100644
--- a/libc/src/__support/str_to_float.h
+++ b/libc/src/__support/str_to_float.h
@@ -684,9 +684,7 @@ LIBC_INLINE FloatConvertReturn<T> decimal_exp_to_float(
     const CharType *__restrict numStart,
     const size_t num_len = cpp::numeric_limits<size_t>::max()) {
   using FPBits = typename fputil::FPBits<T>;
-  using StorageType = typename FPBits::StorageType;
 
-  StorageType mantissa = init_num.mantissa;
   int32_t exp10 = init_num.exponent;
 
   FloatConvertReturn<T> output;
@@ -725,6 +723,8 @@ LIBC_INLINE FloatConvertReturn<T> decimal_exp_to_float(
 
 #ifndef LIBC_COPT_STRTOFLOAT_DISABLE_EISEL_LEMIRE
   // Try Eisel-Lemire
+  using StorageType = typename FPBits::StorageType;
+  StorageType mantissa = init_num.mantissa;
   opt_output = eisel_lemire<T>(init_num, round);
   if (opt_output.has_value()) {
     if (!truncated) {

``````````

</details>


https://github.com/llvm/llvm-project/pull/178780


More information about the libc-commits mailing list