[libc-commits] [libc] [libc][math] Add Generic Comparison Operations for floating point types (PR #144983)

via libc-commits libc-commits at lists.llvm.org
Fri Jul 11 11:44:39 PDT 2025


================
@@ -184,29 +184,30 @@ template <size_t Bits> struct DyadicFloat {
 
     int unbiased_exp = get_unbiased_exponent();
 
-    if (unbiased_exp + FPBits::EXP_BIAS >= FPBits::MAX_BIASED_EXPONENT) {
-      if constexpr (ShouldSignalExceptions) {
-        set_errno_if_required(ERANGE);
-        raise_except_if_required(FE_OVERFLOW | FE_INEXACT);
-      }
+    if constexpr (!cpp::is_constant_evaluated())
+      if (unbiased_exp + FPBits::EXP_BIAS >= FPBits::MAX_BIASED_EXPONENT) {
+        if constexpr (ShouldSignalExceptions) {
+          set_errno_if_required(ERANGE);
+          raise_except_if_required(FE_OVERFLOW | FE_INEXACT);
+        }
 
-      switch (quick_get_round()) {
-      case FE_TONEAREST:
-        return FPBits::inf(sign).get_val();
-      case FE_TOWARDZERO:
-        return FPBits::max_normal(sign).get_val();
-      case FE_DOWNWARD:
-        if (sign.is_pos())
-          return FPBits::max_normal(Sign::POS).get_val();
-        return FPBits::inf(Sign::NEG).get_val();
-      case FE_UPWARD:
-        if (sign.is_neg())
-          return FPBits::max_normal(Sign::NEG).get_val();
-        return FPBits::inf(Sign::POS).get_val();
-      default:
-        __builtin_unreachable();
+        switch (quick_get_round()) {
----------------
overmighty wrote:

```suggestion
      int rounding_mode = FE_TONEAREST;
      if constexpr (!cpp::is_constant_evaluated())
        rounding_mode = quick_get_round();

      switch (rounding_mode) {
```

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


More information about the libc-commits mailing list