|
17 | 17 | #include "src/__support/FPUtil/dyadic_float.h"
|
18 | 18 | #include "src/__support/FPUtil/rounding_mode.h"
|
19 | 19 | #include "src/__support/macros/attributes.h"
|
| 20 | +#include "src/__support/macros/optimization.h" |
20 | 21 |
|
21 | 22 | namespace LIBC_NAMESPACE::fputil::generic {
|
22 | 23 |
|
@@ -44,41 +45,44 @@ div(InType x, InType y) {
|
44 | 45 | InFPBits x_bits(x);
|
45 | 46 | InFPBits y_bits(y);
|
46 | 47 |
|
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 |
| - |
55 | 48 | Sign result_sign = x_bits.sign() == y_bits.sign() ? Sign::POS : Sign::NEG;
|
56 | 49 |
|
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. |
60 | 57 | return OutFPBits::quiet_nan().get_val();
|
61 | 58 | }
|
62 | 59 |
|
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 | + } |
65 | 65 |
|
66 |
| - if (y_bits.is_inf()) |
67 |
| - return OutFPBits::inf(result_sign).get_val(); |
| 66 | + return OutFPBits::inf(result_sign).get_val(); |
| 67 | + } |
68 | 68 |
|
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(); |
73 | 80 | }
|
74 | 81 |
|
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(); |
77 | 84 | }
|
78 | 85 |
|
79 |
| - if (x_bits.is_zero()) |
80 |
| - return OutFPBits::zero(result_sign).get_val(); |
81 |
| - |
82 | 86 | DyadicFloat xd(x);
|
83 | 87 | DyadicFloat yd(y);
|
84 | 88 |
|
|
0 commit comments