[libc-commits] [libc] [libc][math][c23] Finish optimizing fmul (PR #107517)
Job Henandez Lara via libc-commits
libc-commits at lists.llvm.org
Fri Sep 6 15:37:01 PDT 2024
https://github.com/Jobhdez updated https://github.com/llvm/llvm-project/pull/107517
>From 6bca4f7d3addd4f03b44f13c57e1ce9a582b9c2b Mon Sep 17 00:00:00 2001
From: Job Hernandez <hj93 at protonmail.com>
Date: Thu, 5 Sep 2024 21:26:49 -0700
Subject: [PATCH] add draft, one more test to go
---
libc/src/math/generic/CMakeLists.txt | 4 +++-
libc/src/math/generic/fmul.cpp | 18 ++++++++++++++++--
2 files changed, 19 insertions(+), 3 deletions(-)
diff --git a/libc/src/math/generic/CMakeLists.txt b/libc/src/math/generic/CMakeLists.txt
index 350072f4b9649d..5a1ee3b8b83c77 100644
--- a/libc/src/math/generic/CMakeLists.txt
+++ b/libc/src/math/generic/CMakeLists.txt
@@ -2958,7 +2958,9 @@ add_entrypoint_object(
HDRS
../fmul.h
DEPENDS
- libc.src.__support.FPUtil.generic.mul
+ libc.hdr.errno_macros
+ libc.hdr.fenv_macros
+ libc.src.__support.FPUtil.double_double
COMPILE_OPTIONS
-O3
)
diff --git a/libc/src/math/generic/fmul.cpp b/libc/src/math/generic/fmul.cpp
index 64c27d6e2f9564..fe8f5b0bb7c45b 100644
--- a/libc/src/math/generic/fmul.cpp
+++ b/libc/src/math/generic/fmul.cpp
@@ -5,16 +5,30 @@
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
-
+#include "hdr/errno_macros.h"
+#include "hdr/fenv_macros.h"
#include "src/math/fmul.h"
#include "src/__support/FPUtil/generic/mul.h"
#include "src/__support/common.h"
#include "src/__support/macros/config.h"
+#include "src/__support/FPUtil/double_double.h"
namespace LIBC_NAMESPACE_DECL {
-
+ /*
LLVM_LIBC_FUNCTION(float, fmul, (double x, double y)) {
return fputil::generic::mul<float>(x, y);
}
+ */
+LLVM_LIBC_FUNCTION(float, fmul, (double x, double y)) {
+ fputil::DoubleDouble prod = fputil::exact_mult(x, y);
+ if (LIBC_UNLIKELY(fputil::FPBits<double>(prod.hi).is_inf_or_nan() || fputil::FPBits<double>(prod.hi).is_zero()))
+ return static_cast<float>(prod.hi);
+ if (LIBC_UNLIKELY(fputil::FPBits<double>(prod.hi).is_inf() || fputil::FPBits<double>(prod.hi).is_zero())) {
+ fputil::set_errno_if_required(EDOM);
+ fputil::raise_except_if_required(FE_INVALID);
+ return fputil::FPBits<double>::quiet_nan().get_val();
+ }
+ return static_cast<float>(prod.hi + prod.lo);
+}
} // namespace LIBC_NAMESPACE_DECL
More information about the libc-commits
mailing list