[libc-commits] [PATCH] D127046: [libc][math] fmod/fmodf implementation.
Kirill Okhotnikov via Phabricator via libc-commits
libc-commits at lists.llvm.org
Sun Jun 5 12:29:37 PDT 2022
orex marked 5 inline comments as done.
orex added a comment.
Thank you, Intue for your useful comments. I implement all of them.
As for performance issues with denormalized values, I've checked the code of glibc e_fmod.c <https://github.com/bminor/glibc/blob/master/sysdeps/ieee754/dbl-64/e_fmod.c>. It looks like (I assume, but I did not check assembler code) that glibc function comes to denormalaized values faster than in my implementation, where I check most common cases first. I don't think that we should do something with it, because the case is very rare. I can hardly imaging it's real practical usage.
Kirill.
================
Comment at: libc/src/__support/FPUtil/FPBits.h:30
};
// A generic class to represent single precision, double precision, and quad
----------------
lntue wrote:
> `clz` are also used in `sqrt` functions, which would also be used again by `FMA` function. Would you mind factoring clz functions to another library similar to https://reviews.llvm.org/D124495 ? You can overwrite what I did over there, as this change should be landed before that one. Thanks!
I create a new helper with wrapped bulitins. libc/src/__support/FPUtil/builtin_wrappers.h
================
Comment at: libc/src/__support/FPUtil/generic/FMod.h:16
+
+#include <algorithm>
+#include <cerrno>
----------------
lntue wrote:
> I'm not sure that we can include that many C++ standard headers in here, as it might introduce circular dependency among the libraries. @sivachandra should have known more about these than me.
All std includes were removed except cerrno.
================
Comment at: libc/src/__support/FPUtil/generic/FMod.h:256
+ static inline T make(T x, T y) {
+ std::optional<T> out = Wrapper::PreCheck(x, y);
+ if (out.has_value())
----------------
lntue wrote:
> You might have to reimplement `std::optional` in `__support` or `__support/CPP` to prevent circular dependency.
Use "old style" returning optional values. I don't think, that `optional` reimplementing is needed for this case.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D127046/new/
https://reviews.llvm.org/D127046
More information about the libc-commits
mailing list