[clang] [C++23] [CLANG] Adding C++23 constexpr math functions: fmin and frexp. (PR #88978)
Zahira Ammarguellat via cfe-commits
cfe-commits at lists.llvm.org
Wed May 1 08:48:00 PDT 2024
================
@@ -0,0 +1,57 @@
+// RUN: %clang_cc1 -DWIN -verify -std=c++23 -fsyntax-only %s
+// RUN: %clang_cc1 -verify -std=c++23 -fsyntax-only %s
+
+// expected-no-diagnostics
+
+
+#ifdef WIN
+#define INFINITY ((float)(1e+300 * 1e+300))
+#define NAN (-(float)(INFINITY * 0.0F))
+#else
+#define NAN (__builtin_nanf(""))
+#define INFINITY (__builtin_inff())
+#endif
+
+extern "C" void abort() noexcept;
+extern "C" int write(int, const void*, unsigned long);
+
+#define assert(condition) \
+ do { \
+ if (!(condition)) { \
+ write(2, "Assertion failed: ", 18); \
+ write(2, #condition, sizeof(#condition) - 1); \
+ write(2, "\n", 1); \
+ abort(); \
+ } \
+ } while (false)
+
+int main() {
+ int i;
+
+ // fmin
+ static_assert(__builtin_fmin(15.24, 1.3) == 1.3, "");
+ static_assert(__builtin_fmin(-0.0, +0.0) == -0.0, "");
+ static_assert(__builtin_fmin(+0.0, -0.0) == -0.0, "");
+ assert(__builtin_isnan(__builtin_fminf(NAN,NAN)));
+ assert(__builtin_isnan(__builtin_fminf(NAN, -1)));
+ assert(__builtin_isnan(__builtin_fminf(-INFINITY, 0)));
+ assert(__builtin_iszero(__builtin_fminf(+INFINITY, 0)));
+
+ // frexp
+ static_assert(__builtin_frexp(123.45, &i) == 0.96445312500000002);
----------------
zahiraam wrote:
Still working on this. Can you please review the implementation of frexp I have added in `ExprConstant.cpp`?
@frederick-vs-ja are you suggesting using something like this for the use of `frexp` in this test?
```
struct FrexpResult {
double fraction;
int exponent;
};
FrexpResult simulateFrexp(double value) {
FrexpResult result;
result.fraction = __builtin_frexp(value, &result.exponent);
return result;
}
int main () {
double value = 123.456;
FrexpResult result = simulateFrexp(123.456);
return 0;
}
```
Still no way of asserting what the return values of fraction and exponent are from calls to `simulateFrex`p with various arguments. Any suggestions?
https://github.com/llvm/llvm-project/pull/88978
More information about the cfe-commits
mailing list