Skip to content

Commit e4ecb9e

Browse files
committed
fixup! [libc][math][c23] Add f16divf C23 math function
Optimize special value checks.
1 parent 19afb7b commit e4ecb9e

File tree

2 files changed

+29
-24
lines changed

2 files changed

+29
-24
lines changed

libc/src/__support/FPUtil/generic/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,5 @@ add_header_library(
5959
libc.src.__support.FPUtil.dyadic_float
6060
libc.src.__support.FPUtil.rounding_mode
6161
libc.src.__support.macros.attributes
62+
libc.src.__support.macros.optimization
6263
)

libc/src/__support/FPUtil/generic/div.h

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "src/__support/FPUtil/dyadic_float.h"
1818
#include "src/__support/FPUtil/rounding_mode.h"
1919
#include "src/__support/macros/attributes.h"
20+
#include "src/__support/macros/optimization.h"
2021

2122
namespace LIBC_NAMESPACE::fputil::generic {
2223

@@ -44,41 +45,44 @@ div(InType x, InType y) {
4445
InFPBits x_bits(x);
4546
InFPBits y_bits(y);
4647

47-
if (x_bits.is_nan() || y_bits.is_nan()) {
48-
if (x_bits.is_signaling_nan() || y_bits.is_signaling_nan())
49-
raise_except_if_required(FE_INVALID);
50-
51-
// TODO: Handle NaN payloads.
52-
return OutFPBits::quiet_nan().get_val();
53-
}
54-
5548
Sign result_sign = x_bits.sign() == y_bits.sign() ? Sign::POS : Sign::NEG;
5649

57-
if (x_bits.is_inf()) {
58-
if (y_bits.is_inf()) {
59-
raise_except_if_required(FE_INVALID);
50+
if (LIBC_UNLIKELY(x_bits.is_inf_or_nan() || y_bits.is_inf_or_nan() ||
51+
x_bits.is_zero() || y_bits.is_zero())) {
52+
if (x_bits.is_nan() || y_bits.is_nan()) {
53+
if (x_bits.is_signaling_nan() || y_bits.is_signaling_nan())
54+
raise_except_if_required(FE_INVALID);
55+
56+
// TODO: Handle NaN payloads.
6057
return OutFPBits::quiet_nan().get_val();
6158
}
6259

63-
return OutFPBits::inf(result_sign).get_val();
64-
}
60+
if (x_bits.is_inf()) {
61+
if (y_bits.is_inf()) {
62+
raise_except_if_required(FE_INVALID);
63+
return OutFPBits::quiet_nan().get_val();
64+
}
6565

66-
if (y_bits.is_inf())
67-
return OutFPBits::inf(result_sign).get_val();
66+
return OutFPBits::inf(result_sign).get_val();
67+
}
6868

69-
if (y_bits.is_zero()) {
70-
if (x_bits.is_zero()) {
71-
raise_except_if_required(FE_INVALID);
72-
return OutFPBits::quiet_nan().get_val();
69+
if (y_bits.is_inf())
70+
return OutFPBits::inf(result_sign).get_val();
71+
72+
if (y_bits.is_zero()) {
73+
if (x_bits.is_zero()) {
74+
raise_except_if_required(FE_INVALID);
75+
return OutFPBits::quiet_nan().get_val();
76+
}
77+
78+
raise_except_if_required(FE_DIVBYZERO);
79+
return OutFPBits::inf(result_sign).get_val();
7380
}
7481

75-
raise_except_if_required(FE_DIVBYZERO);
76-
return OutFPBits::inf(result_sign).get_val();
82+
if (x_bits.is_zero())
83+
return OutFPBits::zero(result_sign).get_val();
7784
}
7885

79-
if (x_bits.is_zero())
80-
return OutFPBits::zero(result_sign).get_val();
81-
8286
DyadicFloat xd(x);
8387
DyadicFloat yd(y);
8488

0 commit comments

Comments
 (0)