Commit 76de9bde8c for qemu.org
commit 76de9bde8c321cefdfb51d0aa50c7b0a169b9d52
Author: Richard Henderson <richard.henderson@linaro.org>
Date: Sat Apr 25 23:17:56 2026 +1000
fpu: Drop FRAC_GENERIC_64_128{_256}
This requires more complexity to handle const selectors, and
an indirection macro for each function. Easier to just use
the preprocessor.
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
diff --git a/fpu/softfloat-parts-addsub.c.inc b/fpu/softfloat-parts-addsub.c.inc
index ae5c1017c5..accf996d7c 100644
--- a/fpu/softfloat-parts-addsub.c.inc
+++ b/fpu/softfloat-parts-addsub.c.inc
@@ -20,14 +20,14 @@ static void partsN(add_normal)(FloatPartsN *a, FloatPartsN *b)
int exp_diff = a->exp - b->exp;
if (exp_diff > 0) {
- frac_shrjam(b, exp_diff);
+ fracN(shrjam)(b, exp_diff);
} else if (exp_diff < 0) {
- frac_shrjam(a, -exp_diff);
+ fracN(shrjam)(a, -exp_diff);
a->exp = b->exp;
}
- if (frac_add(a, a, b)) {
- frac_shrjam(a, 1);
+ if (fracN(add)(a, a, b)) {
+ fracN(shrjam)(a, 1);
a->frac_hi |= DECOMPOSED_IMPLICIT_BIT;
a->exp += 1;
}
@@ -39,20 +39,20 @@ static bool partsN(sub_normal)(FloatPartsN *a, FloatPartsN *b)
int shift;
if (exp_diff > 0) {
- frac_shrjam(b, exp_diff);
- frac_sub(a, a, b);
+ fracN(shrjam)(b, exp_diff);
+ fracN(sub)(a, a, b);
} else if (exp_diff < 0) {
a->exp = b->exp;
a->sign ^= 1;
- frac_shrjam(a, -exp_diff);
- frac_sub(a, b, a);
- } else if (frac_sub(a, a, b)) {
+ fracN(shrjam)(a, -exp_diff);
+ fracN(sub)(a, b, a);
+ } else if (fracN(sub)(a, a, b)) {
/* Overflow means that A was less than B. */
- frac_neg(a);
+ fracN(neg)(a);
a->sign ^= 1;
}
- shift = frac_normalize(a);
+ shift = fracN(normalize)(a);
if (likely(shift < N)) {
a->exp -= shift;
return true;
diff --git a/fpu/softfloat-parts.c.inc b/fpu/softfloat-parts.c.inc
index 5f27efd288..5d344f9afe 100644
--- a/fpu/softfloat-parts.c.inc
+++ b/fpu/softfloat-parts.c.inc
@@ -98,7 +98,7 @@ static FloatPartsN *partsN(pick_nan)(FloatPartsN *a, FloatPartsN *b,
ret = b;
break;
}
- cmp = frac_cmp(a, b);
+ cmp = fracN(cmp)(a, b);
if (cmp == 0) {
cmp = a->sign < b->sign;
}
@@ -215,14 +215,14 @@ static void partsN(canonicalize)(FloatPartsN *p, float_status *status,
(status->floatx80_behaviour & floatx80_pseudo_denormal_valid);
if (unlikely(p->exp == 0)) {
- if (likely(frac_eqz(p))) {
+ if (likely(fracN(eqz)(p))) {
p->cls = float_class_zero;
} else if (status->flush_inputs_to_zero) {
float_raise(float_flag_input_denormal_flushed, status);
p->cls = float_class_zero;
- frac_clear(p);
+ fracN(clear)(p);
} else {
- int shift = frac_normalize(p);
+ int shift = fracN(normalize)(p);
p->cls = float_class_denormal;
p->exp = fmt->frac_shift - fmt->exp_bias
- shift + !has_pseudo_denormals;
@@ -232,10 +232,10 @@ static void partsN(canonicalize)(FloatPartsN *p, float_status *status,
if (unlikely(p->exp == fmt->exp_max)) {
switch (fmt->exp_max_kind) {
case float_expmax_ieee:
- if (likely(frac_eqz(p))) {
+ if (likely(fracN(eqz)(p))) {
p->cls = float_class_inf;
} else {
- frac_shl(p, fmt->frac_shift);
+ fracN(shl)(p, fmt->frac_shift);
p->cls = (parts_is_snan_frac(p->frac_hi, status)
? float_class_snan : float_class_qnan);
}
@@ -244,7 +244,7 @@ static void partsN(canonicalize)(FloatPartsN *p, float_status *status,
break;
case float_expmax_e4m3:
if (p->frac_hi == 0b111) {
- frac_shl(p, fmt->frac_shift);
+ fracN(shl)(p, fmt->frac_shift);
p->cls = (parts_is_snan_frac(p->frac_hi, status)
? float_class_snan : float_class_qnan);
return;
@@ -258,7 +258,7 @@ static void partsN(canonicalize)(FloatPartsN *p, float_status *status,
p->cls = float_class_normal;
p->exp -= fmt->exp_bias;
- frac_shl(p, fmt->frac_shift);
+ fracN(shl)(p, fmt->frac_shift);
p->frac_hi |= DECOMPOSED_IMPLICIT_BIT;
}
@@ -344,8 +344,8 @@ static void partsN(uncanon_normal)(FloatPartsN *p, float_status *s,
if (likely(exp > 0)) {
if (p->frac_lo & round_mask) {
flags |= float_flag_inexact;
- if (frac_addi(p, p, inc)) {
- frac_shr(p, 1);
+ if (fracN(addi)(p, p, inc)) {
+ fracN(shr)(p, 1);
p->frac_hi |= DECOMPOSED_IMPLICIT_BIT;
exp++;
}
@@ -361,13 +361,13 @@ static void partsN(uncanon_normal)(FloatPartsN *p, float_status *s,
} else if (overflow_norm) {
flags |= float_flag_inexact;
exp = exp_max - 1;
- frac_allones(p);
+ fracN(allones)(p);
p->frac_lo &= ~round_mask;
} else {
flags |= float_flag_inexact;
p->cls = float_class_inf;
exp = exp_max;
- frac_clear(p);
+ fracN(clear)(p);
}
break;
@@ -378,7 +378,7 @@ static void partsN(uncanon_normal)(FloatPartsN *p, float_status *s,
? float_flag_invalid
: float_flag_overflow | float_flag_inexact);
exp = exp_max;
- frac_allones(p);
+ fracN(allones)(p);
p->frac_lo &= ~round_mask;
}
break;
@@ -395,26 +395,26 @@ static void partsN(uncanon_normal)(FloatPartsN *p, float_status *s,
g_assert_not_reached();
}
}
- frac_shr(p, frac_shift);
+ fracN(shr)(p, frac_shift);
} else if (unlikely(s->rebias_underflow)) {
flags |= float_flag_underflow;
exp += fmt->exp_re_bias;
if (p->frac_lo & round_mask) {
flags |= float_flag_inexact;
- if (frac_addi(p, p, inc)) {
- frac_shr(p, 1);
+ if (fracN(addi)(p, p, inc)) {
+ fracN(shr)(p, 1);
p->frac_hi |= DECOMPOSED_IMPLICIT_BIT;
exp++;
}
p->frac_lo &= ~round_mask;
}
- frac_shr(p, frac_shift);
+ fracN(shr)(p, frac_shift);
} else if (s->flush_to_zero &&
s->ftz_detection == float_ftz_before_rounding) {
flags |= float_flag_output_denormal_flushed;
p->cls = float_class_zero;
exp = 0;
- frac_clear(p);
+ fracN(clear)(p);
} else {
bool is_tiny = s->tininess_before_rounding || exp < 0;
bool has_pseudo_denormals = fmt->has_explicit_bit &&
@@ -422,10 +422,10 @@ static void partsN(uncanon_normal)(FloatPartsN *p, float_status *s,
if (!is_tiny) {
FloatPartsN discard;
- is_tiny = !frac_addi(&discard, p, inc);
+ is_tiny = !fracN(addi)(&discard, p, inc);
}
- frac_shrjam(p, !has_pseudo_denormals - exp);
+ fracN(shrjam)(p, !has_pseudo_denormals - exp);
if (p->frac_lo & round_mask) {
/* Need to recompute round-to-even/round-to-odd. */
@@ -452,12 +452,12 @@ static void partsN(uncanon_normal)(FloatPartsN *p, float_status *s,
break;
}
flags |= float_flag_inexact;
- frac_addi(p, p, inc);
+ fracN(addi)(p, p, inc);
p->frac_lo &= ~round_mask;
}
exp = (p->frac_hi & DECOMPOSED_IMPLICIT_BIT) && !has_pseudo_denormals;
- frac_shr(p, frac_shift);
+ fracN(shr)(p, frac_shift);
if (is_tiny) {
if (s->flush_to_zero) {
@@ -465,11 +465,11 @@ static void partsN(uncanon_normal)(FloatPartsN *p, float_status *s,
flags |= float_flag_output_denormal_flushed;
p->cls = float_class_zero;
exp = 0;
- frac_clear(p);
+ fracN(clear)(p);
} else if (flags & float_flag_inexact) {
flags |= float_flag_underflow;
}
- if (exp == 0 && frac_eqz(p)) {
+ if (exp == 0 && fracN(eqz)(p)) {
p->cls = float_class_zero;
}
}
@@ -487,17 +487,17 @@ static void partsN(uncanon)(FloatPartsN *p, float_status *s,
switch (p->cls) {
case float_class_zero:
p->exp = 0;
- frac_clear(p);
+ fracN(clear)(p);
return;
case float_class_inf:
switch (fmt->exp_max_kind) {
case float_expmax_ieee:
p->exp = fmt->exp_max;
- frac_clear(p);
+ fracN(clear)(p);
break;
case float_expmax_e4m3:
partsN(uncanon_e4m3_overflow)(p, s, fmt, saturate);
- frac_shr(p, fmt->frac_shift);
+ fracN(shr)(p, fmt->frac_shift);
break;
case float_expmax_normal:
default:
@@ -508,7 +508,7 @@ static void partsN(uncanon)(FloatPartsN *p, float_status *s,
case float_class_snan:
assert(fmt->exp_max_kind != float_expmax_normal);
p->exp = fmt->exp_max;
- frac_shr(p, fmt->frac_shift);
+ fracN(shr)(p, fmt->frac_shift);
return;
default:
break;
@@ -625,12 +625,12 @@ static FloatPartsN *partsN(mul)(FloatPartsN *a, FloatPartsN *b,
float_raise(float_flag_input_denormal_used, s);
}
- frac_mulw(&tmp, a, b);
- frac_truncjam(a, &tmp);
+ fracN(mulw)(&tmp, a, b);
+ fracN(truncjam)(a, &tmp);
a->exp += b->exp + 1;
if (!(a->frac_hi & DECOMPOSED_IMPLICIT_BIT)) {
- frac_add(a, a, a);
+ fracN(add)(a, a, a);
a->exp -= 1;
}
@@ -747,16 +747,16 @@ static FloatPartsN *partsN(muladd_scalbn)(FloatPartsN *a, FloatPartsN *b,
/* Perform the multiplication step. */
p_widen.sign = a->sign;
p_widen.exp = a->exp + b->exp + 1;
- frac_mulw(&p_widen, a, b);
+ fracN(mulw)(&p_widen, a, b);
if (!(p_widen.frac_hi & DECOMPOSED_IMPLICIT_BIT)) {
- frac_add(&p_widen, &p_widen, &p_widen);
+ fracW(add)(&p_widen, &p_widen, &p_widen);
p_widen.exp -= 1;
}
/* Perform the addition step. */
if (c->cls != float_class_zero) {
/* Zero-extend C to less significant bits. */
- frac_widen(&c_widen, c);
+ fracN(widen)(&c_widen, c);
c_widen.exp = c->exp;
if (a->sign == c->sign) {
@@ -767,7 +767,7 @@ static FloatPartsN *partsN(muladd_scalbn)(FloatPartsN *a, FloatPartsN *b,
}
/* Narrow with sticky bit, for proper rounding later. */
- frac_truncjam(a, &p_widen);
+ fracN(truncjam)(a, &p_widen);
a->sign = p_widen.sign;
a->exp = p_widen.exp;
@@ -816,7 +816,7 @@ static FloatPartsN *partsN(div)(FloatPartsN *a, FloatPartsN *b,
float_raise(float_flag_input_denormal_used, s);
}
a->sign = sign;
- a->exp -= b->exp + frac_div(a, b);
+ a->exp -= b->exp + fracN(div)(a, b);
return a;
}
@@ -880,7 +880,7 @@ static FloatPartsN *partsN(modrem)(FloatPartsN *a, FloatPartsN *b,
if (ab_mask & float_cmask_denormal) {
float_raise(float_flag_input_denormal_used, s);
}
- frac_modrem(a, b, mod_quot);
+ fracN(modrem)(a, b, mod_quot);
return a;
}
@@ -969,7 +969,7 @@ static void partsN(sqrt)(FloatPartsN *a, float_status *status,
exp_odd = a->exp & 1;
index = extract64(a->frac_hi, 57, 6) | (!exp_odd << 6);
if (!exp_odd) {
- frac_shr(a, 1);
+ fracN(shr)(a, 1);
}
/*
@@ -1110,7 +1110,7 @@ static void partsN(sqrt)(FloatPartsN *a, float_status *status,
/* Convert back from base 4 to base 2. */
a->exp >>= 1;
if (!(a->frac_hi & DECOMPOSED_IMPLICIT_BIT)) {
- frac_add(a, a, a);
+ fracN(add)(a, a, a);
} else {
a->exp += 1;
}
@@ -1150,9 +1150,9 @@ static bool partsN(round_to_int_normal)(FloatPartsN *a, FloatRoundMode rmode,
if (a->exp == -1) {
FloatPartsN tmp;
/* Shift left one, discarding DECOMPOSED_IMPLICIT_BIT */
- frac_add(&tmp, a, a);
+ fracN(add)(&tmp, a, a);
/* Anything remaining means frac > 0.5. */
- one = !frac_eqz(&tmp);
+ one = !fracN(eqz)(&tmp);
}
break;
case float_round_ties_away:
@@ -1174,7 +1174,7 @@ static bool partsN(round_to_int_normal)(FloatPartsN *a, FloatRoundMode rmode,
g_assert_not_reached();
}
- frac_clear(a);
+ fracN(clear)(a);
a->exp = 0;
if (one) {
a->frac_hi = DECOMPOSED_IMPLICIT_BIT;
@@ -1190,7 +1190,7 @@ static bool partsN(round_to_int_normal)(FloatPartsN *a, FloatRoundMode rmode,
* which leaves room for sticky and rounding bit.
*/
shift_adj = (N - 1) - (a->exp + 2);
- frac_shrjam(a, shift_adj);
+ fracN(shrjam)(a, shift_adj);
frac_lsb = 1 << 2;
} else {
/*
@@ -1208,7 +1208,7 @@ static bool partsN(round_to_int_normal)(FloatPartsN *a, FloatRoundMode rmode,
if (!(a->frac_lo & rnd_mask)) {
/* Fractional bits already clear, undo the shift above. */
- frac_shl(a, shift_adj);
+ fracN(shl)(a, shift_adj);
return false;
}
@@ -1236,21 +1236,21 @@ static bool partsN(round_to_int_normal)(FloatPartsN *a, FloatRoundMode rmode,
}
if (shift_adj == 0) {
- if (frac_addi(a, a, inc)) {
- frac_shr(a, 1);
+ if (fracN(addi)(a, a, inc)) {
+ fracN(shr)(a, 1);
a->frac_hi |= DECOMPOSED_IMPLICIT_BIT;
a->exp++;
}
a->frac_lo &= ~rnd_mask;
} else {
- frac_addi(a, a, inc);
+ fracN(addi)(a, a, inc);
a->frac_lo &= ~rnd_mask;
/* Be careful shifting back, not to overflow */
- frac_shl(a, shift_adj - 1);
+ fracN(shl)(a, shift_adj - 1);
if (a->frac_hi & DECOMPOSED_IMPLICIT_BIT) {
a->exp++;
} else {
- frac_add(a, a, a);
+ fracN(add)(a, a, a);
}
}
return true;
@@ -1555,7 +1555,7 @@ static FloatPartsN *partsN(minmax)(FloatPartsN *a, FloatPartsN *b,
/* Compare magnitudes. */
cmp = a_exp - b_exp;
if (cmp == 0) {
- cmp = frac_cmp(a, b);
+ cmp = fracN(cmp)(a, b);
}
/*
@@ -1597,7 +1597,7 @@ static FloatRelation partsN(compare)(FloatPartsN *a, FloatPartsN *b,
goto a_sign;
}
if (a->exp == b->exp) {
- cmp = frac_cmp(a, b);
+ cmp = fracN(cmp)(a, b);
} else if (a->exp < b->exp) {
cmp = float_relation_less;
} else {
diff --git a/fpu/softfloat.c b/fpu/softfloat.c
index d077e8da69..e462fb7d74 100644
--- a/fpu/softfloat.c
+++ b/fpu/softfloat.c
@@ -774,15 +774,6 @@ static float128 QEMU_FLATTEN float128_pack_raw(const FloatParts128 *p)
* Helper functions for softfloat-parts.c.inc, per-size operations.
*/
-#define FRAC_GENERIC_64_128(NAME, P) \
- _Generic((P), FloatParts64 *: frac64_##NAME, \
- FloatParts128 *: frac128_##NAME)
-
-#define FRAC_GENERIC_64_128_256(NAME, P) \
- _Generic((P), FloatParts64 *: frac64_##NAME, \
- FloatParts128 *: frac128_##NAME, \
- FloatParts256 *: frac256_##NAME)
-
static bool frac64_add(FloatParts64 *r, FloatParts64 *a, FloatParts64 *b)
{
return uadd64_overflow(a->frac, b->frac, &r->frac);
@@ -806,8 +797,6 @@ static bool frac256_add(FloatParts256 *r, FloatParts256 *a, FloatParts256 *b)
return c;
}
-#define frac_add(R, A, B) FRAC_GENERIC_64_128_256(add, R)(R, A, B)
-
static bool frac64_addi(FloatParts64 *r, FloatParts64 *a, uint64_t c)
{
return uadd64_overflow(a->frac, c, &r->frac);
@@ -819,8 +808,6 @@ static bool frac128_addi(FloatParts128 *r, FloatParts128 *a, uint64_t c)
return uadd64_overflow(a->frac_hi, c, &r->frac_hi);
}
-#define frac_addi(R, A, C) FRAC_GENERIC_64_128(addi, R)(R, A, C)
-
static void frac64_allones(FloatParts64 *a)
{
a->frac = -1;
@@ -831,8 +818,6 @@ static void frac128_allones(FloatParts128 *a)
a->frac_hi = a->frac_lo = -1;
}
-#define frac_allones(A) FRAC_GENERIC_64_128(allones, A)(A)
-
static FloatRelation frac64_cmp(FloatParts64 *a, FloatParts64 *b)
{
return (a->frac == b->frac ? float_relation_equal
@@ -852,8 +837,6 @@ static FloatRelation frac128_cmp(FloatParts128 *a, FloatParts128 *b)
return ta < tb ? float_relation_less : float_relation_greater;
}
-#define frac_cmp(A, B) FRAC_GENERIC_64_128(cmp, A)(A, B)
-
static void frac64_clear(FloatParts64 *a)
{
a->frac = 0;
@@ -864,8 +847,6 @@ static void frac128_clear(FloatParts128 *a)
a->frac_hi = a->frac_lo = 0;
}
-#define frac_clear(A) FRAC_GENERIC_64_128(clear, A)(A)
-
static bool frac64_div(FloatParts64 *a, FloatParts64 *b)
{
uint64_t n1, n0, r, q;
@@ -945,8 +926,6 @@ static bool frac128_div(FloatParts128 *a, FloatParts128 *b)
return ret;
}
-#define frac_div(A, B) FRAC_GENERIC_64_128(div, A)(A, B)
-
static bool frac64_eqz(FloatParts64 *a)
{
return a->frac == 0;
@@ -957,8 +936,6 @@ static bool frac128_eqz(FloatParts128 *a)
return (a->frac_hi | a->frac_lo) == 0;
}
-#define frac_eqz(A) FRAC_GENERIC_64_128(eqz, A)(A)
-
static void frac64_mulw(FloatParts128 *r, FloatParts64 *a, FloatParts64 *b)
{
mulu64(&r->frac_lo, &r->frac_hi, a->frac, b->frac);
@@ -970,8 +947,6 @@ static void frac128_mulw(FloatParts256 *r, FloatParts128 *a, FloatParts128 *b)
&r->frac_hi, &r->frac_hm, &r->frac_lm, &r->frac_lo);
}
-#define frac_mulw(R, A, B) FRAC_GENERIC_64_128(mulw, A)(R, A, B)
-
static void frac64_neg(FloatParts64 *a)
{
a->frac = -a->frac;
@@ -993,8 +968,6 @@ static void frac256_neg(FloatParts256 *a)
a->frac_hi = usub64_borrow(0, a->frac_hi, &c);
}
-#define frac_neg(A) FRAC_GENERIC_64_128_256(neg, A)(A)
-
static int frac64_normalize(FloatParts64 *a)
{
if (a->frac) {
@@ -1068,8 +1041,6 @@ static int frac256_normalize(FloatParts256 *a)
return ret;
}
-#define frac_normalize(A) FRAC_GENERIC_64_128_256(normalize, A)(A)
-
static void frac64_modrem(FloatParts64 *a, FloatParts64 *b, uint64_t *mod_quot)
{
uint64_t a0, a1, b0, t0, t1, q, quot;
@@ -1248,8 +1219,6 @@ static void frac128_modrem(FloatParts128 *a, FloatParts128 *b,
a->frac_lo = a1 | (a2 != 0);
}
-#define frac_modrem(A, B, Q) FRAC_GENERIC_64_128(modrem, A)(A, B, Q)
-
static void frac64_shl(FloatParts64 *a, int c)
{
a->frac <<= c;
@@ -1273,8 +1242,6 @@ static void frac128_shl(FloatParts128 *a, int c)
a->frac_lo = a1;
}
-#define frac_shl(A, C) FRAC_GENERIC_64_128(shl, A)(A, C)
-
static void frac64_shr(FloatParts64 *a, int c)
{
a->frac >>= c;
@@ -1298,8 +1265,6 @@ static void frac128_shr(FloatParts128 *a, int c)
a->frac_lo = a1;
}
-#define frac_shr(A, C) FRAC_GENERIC_64_128(shr, A)(A, C)
-
static void frac64_shrjam(FloatParts64 *a, int c)
{
uint64_t a0 = a->frac;
@@ -1388,8 +1353,6 @@ static void frac256_shrjam(FloatParts256 *a, int c)
a->frac_hi = a0;
}
-#define frac_shrjam(A, C) FRAC_GENERIC_64_128_256(shrjam, A)(A, C)
-
static bool frac64_sub(FloatParts64 *r, FloatParts64 *a, FloatParts64 *b)
{
return usub64_overflow(a->frac, b->frac, &r->frac);
@@ -1413,8 +1376,6 @@ static bool frac256_sub(FloatParts256 *r, FloatParts256 *a, FloatParts256 *b)
return c;
}
-#define frac_sub(R, A, B) FRAC_GENERIC_64_128_256(sub, R)(R, A, B)
-
static void frac64_truncjam(FloatParts64 *r, FloatParts128 *a)
{
r->frac = a->frac_hi | (a->frac_lo != 0);
@@ -1426,8 +1387,6 @@ static void frac128_truncjam(FloatParts128 *r, FloatParts256 *a)
r->frac_lo = a->frac_hm | ((a->frac_lm | a->frac_lo) != 0);
}
-#define frac_truncjam(R, A) FRAC_GENERIC_64_128(truncjam, R)(R, A)
-
static void frac64_widen(FloatParts128 *r, FloatParts64 *a)
{
r->frac_hi = a->frac;
@@ -1442,8 +1401,6 @@ static void frac128_widen(FloatParts256 *r, FloatParts128 *a)
r->frac_lo = 0;
}
-#define frac_widen(A, B) FRAC_GENERIC_64_128(widen, B)(A, B)
-
/*
* Reciprocal sqrt table. 1 bit of exponent, 6-bits of mantessa.
* From https://git.musl-libc.org/cgit/musl/tree/src/math/sqrt_data.c
@@ -1468,6 +1425,8 @@ static const uint16_t rsqrt_tab[128] = {
0xba91, 0xb9cc, 0xb90a, 0xb84a, 0xb78c, 0xb6d0, 0xb617, 0xb560,
};
+#define fracN(NAME) glue(glue(glue(frac,N),_),NAME)
+#define fracW(NAME) glue(glue(glue(frac,W),_),NAME)
#define partsN(NAME) glue(glue(glue(parts,N),_),NAME)
#define partsW(NAME) glue(glue(glue(parts,W),_),NAME)
#define FloatPartsN glue(FloatParts,N)
@@ -1494,6 +1453,8 @@ static const uint16_t rsqrt_tab[128] = {
#undef N
#undef W
+#undef fracN
+#undef fracW
#undef partsN
#undef partsW
#undef FloatPartsN
@@ -1624,19 +1585,19 @@ static float64 float64r32_pack_raw(FloatParts64 *p)
* The result is denormal for float32, but can be represented
* in normalized form for float64. Adjust, per canonicalize.
*/
- int shift = frac_normalize(p);
+ int shift = frac64_normalize(p);
p->exp = (float32_params.frac_shift -
float32_params.exp_bias - shift + 1 +
float64_params.exp_bias);
- frac_shr(p, float64_params.frac_shift);
+ frac64_shr(p, float64_params.frac_shift);
} else {
- frac_shl(p, float32_params.frac_shift - float64_params.frac_shift);
+ frac64_shl(p, float32_params.frac_shift - float64_params.frac_shift);
p->exp += float64_params.exp_bias - float32_params.exp_bias;
}
break;
case float_class_snan:
case float_class_qnan:
- frac_shl(p, float32_params.frac_shift - float64_params.frac_shift);
+ frac64_shl(p, float32_params.frac_shift - float64_params.frac_shift);
p->exp = float64_params.exp_max;
break;
case float_class_inf:
@@ -1724,7 +1685,7 @@ static floatx80 floatx80_round_pack_canonical(FloatParts128 *p,
p64.sign = p->sign;
p64.exp = p->exp;
- frac_truncjam(&p64, p);
+ frac64_truncjam(&p64, p);
parts64_uncanon_normal(&p64, s, fmt, false);
frac = p64.frac;
exp = p64.exp;
@@ -2698,7 +2659,7 @@ static void parts_float_to_float_narrow(FloatParts64 *a, FloatParts128 *b,
float_raise(float_flag_input_denormal_used, s);
/* fall through */
case float_class_normal:
- frac_truncjam(a, b);
+ frac64_truncjam(a, b);
break;
case float_class_snan:
case float_class_qnan:
@@ -2717,7 +2678,7 @@ static void parts_float_to_float_widen(FloatParts128 *a, FloatParts64 *b,
a->cls = b->cls;
a->sign = b->sign;
a->exp = b->exp;
- frac_widen(a, b);
+ frac64_widen(a, b);
if (is_nan(a->cls)) {
parts128_return_nan(a, s);
@@ -4939,7 +4900,7 @@ static void parts64_log2(FloatParts64 *a, float_status *s, const FloatFmt *fmt)
FloatParts64 f = {
.cls = float_class_normal, .frac = r
};
- f.exp = f_exp - frac_normalize(&f);
+ f.exp = f_exp - frac64_normalize(&f);
if (a_exp < 0) {
parts64_sub_normal(a, &f);
@@ -5010,7 +4971,7 @@ float128 float128_default_nan(float_status *status)
FloatParts128 p;
parts128_default_nan(&p, status);
- frac_shr(&p, float128_params.frac_shift);
+ frac128_shr(&p, float128_params.frac_shift);
return float128_pack_raw(&p);
}
@@ -5076,9 +5037,9 @@ float128 float128_silence_nan(float128 a, float_status *status)
FloatParts128 p;
float128_unpack_raw(&p, a);
- frac_shl(&p, float128_params.frac_shift);
+ frac128_shl(&p, float128_params.frac_shift);
parts128_silence_nan(&p, status);
- frac_shr(&p, float128_params.frac_shift);
+ frac128_shr(&p, float128_params.frac_shift);
return float128_pack_raw(&p);
}