[libc-commits] [PATCH] D130498: [libc] Use nearest_integer instructions to improve expf performance.

Tue Ly via Phabricator via libc-commits libc-commits at lists.llvm.org
Mon Jul 25 09:26:56 PDT 2022


lntue created this revision.
lntue added reviewers: michaelrj, sivachandra, orex, zimmermann6.
Herald added subscribers: ecnelises, tschuett, mgorny.
Herald added projects: libc-project, All.
lntue requested review of this revision.

Use nearest_integer instructions to improve expf performance.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D130498

Files:
  libc/src/math/generic/CMakeLists.txt
  libc/src/math/generic/expf.cpp


Index: libc/src/math/generic/expf.cpp
===================================================================
--- libc/src/math/generic/expf.cpp
+++ libc/src/math/generic/expf.cpp
@@ -10,9 +10,10 @@
 #include "common_constants.h" // Lookup tables EXP_M1 and EXP_M2.
 #include "src/__support/FPUtil/BasicOperations.h"
 #include "src/__support/FPUtil/FEnvImpl.h"
-#include "src/__support/FPUtil/FMA.h"
 #include "src/__support/FPUtil/FPBits.h"
 #include "src/__support/FPUtil/PolyEval.h"
+#include "src/__support/FPUtil/multiply_add.h"
+#include "src/__support/FPUtil/nearest_integer.h"
 #include "src/__support/common.h"
 
 #include <errno.h>
@@ -80,13 +81,10 @@
   // generated by Sollya.
 
   // x_hi = (hi + mid) * 2^7 = round(x * 2^7).
-  // The default rounding mode for float-to-int conversion in C++ is
-  // round-toward-zero. To make it round-to-nearest, we add (-1)^sign(x) * 0.5
-  // before conversion.
-  int x_hi = static_cast<int>(x * 0x1.0p7f + (xbits.get_sign() ? -0.5f : 0.5f));
+  float kf = fputil::nearest_integer(x * 0x1.0p7f);
   // Subtract (hi + mid) from x to get lo.
-  x -= static_cast<float>(x_hi) * 0x1.0p-7f;
-  double xd = static_cast<double>(x);
+  double xd = static_cast<double>(fputil::multiply_add(kf, -0x1.0p-7f, x));
+  int x_hi = static_cast<int>(kf);
   x_hi += 104 << 7;
   // hi = x_hi >> 7
   double exp_hi = EXP_M1[x_hi >> 7];
Index: libc/src/math/generic/CMakeLists.txt
===================================================================
--- libc/src/math/generic/CMakeLists.txt
+++ libc/src/math/generic/CMakeLists.txt
@@ -483,6 +483,7 @@
   DEPENDS
     .common_constants
     libc.src.__support.FPUtil.fputil
+    libc.src.__support.FPUtil.nearest_integer
     libc.src.__support.FPUtil.polyeval
     libc.include.math
   COMPILE_OPTIONS


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D130498.447371.patch
Type: text/x-patch
Size: 1782 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libc-commits/attachments/20220725/38621c8b/attachment-0001.bin>


More information about the libc-commits mailing list