mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-18 01:30:27 +02:00
Add SCM_LIKELY and SCM_UNLIKELY for optimization
* libguile/numbers.c (scm_abs, scm_quotient, scm_remainder, scm_modulo): Add SCM_LIKELY and SCM_UNLIKELY in several places for optimization. (scm_remainder): Add comment about C99 "%" semantics. Strip away a redundant set of braces.
This commit is contained in:
parent
074c414e29
commit
a16982ca4f
1 changed files with 33 additions and 32 deletions
|
@ -774,18 +774,18 @@ SCM_GPROC (s_quotient, "quotient", 2, 0, 0, scm_quotient, g_quotient);
|
||||||
SCM
|
SCM
|
||||||
scm_quotient (SCM x, SCM y)
|
scm_quotient (SCM x, SCM y)
|
||||||
{
|
{
|
||||||
if (SCM_I_INUMP (x))
|
if (SCM_LIKELY (SCM_I_INUMP (x)))
|
||||||
{
|
{
|
||||||
scm_t_inum xx = SCM_I_INUM (x);
|
scm_t_inum xx = SCM_I_INUM (x);
|
||||||
if (SCM_I_INUMP (y))
|
if (SCM_LIKELY (SCM_I_INUMP (y)))
|
||||||
{
|
{
|
||||||
scm_t_inum yy = SCM_I_INUM (y);
|
scm_t_inum yy = SCM_I_INUM (y);
|
||||||
if (yy == 0)
|
if (SCM_UNLIKELY (yy == 0))
|
||||||
scm_num_overflow (s_quotient);
|
scm_num_overflow (s_quotient);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
scm_t_inum z = xx / yy;
|
scm_t_inum z = xx / yy;
|
||||||
if (SCM_FIXABLE (z))
|
if (SCM_LIKELY (SCM_FIXABLE (z)))
|
||||||
return SCM_I_MAKINUM (z);
|
return SCM_I_MAKINUM (z);
|
||||||
else
|
else
|
||||||
return scm_i_inum2big (z);
|
return scm_i_inum2big (z);
|
||||||
|
@ -809,12 +809,12 @@ scm_quotient (SCM x, SCM y)
|
||||||
}
|
}
|
||||||
else if (SCM_BIGP (x))
|
else if (SCM_BIGP (x))
|
||||||
{
|
{
|
||||||
if (SCM_I_INUMP (y))
|
if (SCM_LIKELY (SCM_I_INUMP (y)))
|
||||||
{
|
{
|
||||||
scm_t_inum yy = SCM_I_INUM (y);
|
scm_t_inum yy = SCM_I_INUM (y);
|
||||||
if (yy == 0)
|
if (SCM_UNLIKELY (yy == 0))
|
||||||
scm_num_overflow (s_quotient);
|
scm_num_overflow (s_quotient);
|
||||||
else if (yy == 1)
|
else if (SCM_UNLIKELY (yy == 1))
|
||||||
return x;
|
return x;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -858,15 +858,18 @@ SCM_GPROC (s_remainder, "remainder", 2, 0, 0, scm_remainder, g_remainder);
|
||||||
SCM
|
SCM
|
||||||
scm_remainder (SCM x, SCM y)
|
scm_remainder (SCM x, SCM y)
|
||||||
{
|
{
|
||||||
if (SCM_I_INUMP (x))
|
if (SCM_LIKELY (SCM_I_INUMP (x)))
|
||||||
{
|
{
|
||||||
if (SCM_I_INUMP (y))
|
if (SCM_LIKELY (SCM_I_INUMP (y)))
|
||||||
{
|
{
|
||||||
scm_t_inum yy = SCM_I_INUM (y);
|
scm_t_inum yy = SCM_I_INUM (y);
|
||||||
if (yy == 0)
|
if (SCM_UNLIKELY (yy == 0))
|
||||||
scm_num_overflow (s_remainder);
|
scm_num_overflow (s_remainder);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
/* C99 specifies that "%" is the remainder corresponding to a
|
||||||
|
quotient rounded towards zero, and that's also traditional
|
||||||
|
for machine division, so z here should be well defined. */
|
||||||
scm_t_inum z = SCM_I_INUM (x) % yy;
|
scm_t_inum z = SCM_I_INUM (x) % yy;
|
||||||
return SCM_I_MAKINUM (z);
|
return SCM_I_MAKINUM (z);
|
||||||
}
|
}
|
||||||
|
@ -889,10 +892,10 @@ scm_remainder (SCM x, SCM y)
|
||||||
}
|
}
|
||||||
else if (SCM_BIGP (x))
|
else if (SCM_BIGP (x))
|
||||||
{
|
{
|
||||||
if (SCM_I_INUMP (y))
|
if (SCM_LIKELY (SCM_I_INUMP (y)))
|
||||||
{
|
{
|
||||||
scm_t_inum yy = SCM_I_INUM (y);
|
scm_t_inum yy = SCM_I_INUM (y);
|
||||||
if (yy == 0)
|
if (SCM_UNLIKELY (yy == 0))
|
||||||
scm_num_overflow (s_remainder);
|
scm_num_overflow (s_remainder);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -931,13 +934,13 @@ SCM_GPROC (s_modulo, "modulo", 2, 0, 0, scm_modulo, g_modulo);
|
||||||
SCM
|
SCM
|
||||||
scm_modulo (SCM x, SCM y)
|
scm_modulo (SCM x, SCM y)
|
||||||
{
|
{
|
||||||
if (SCM_I_INUMP (x))
|
if (SCM_LIKELY (SCM_I_INUMP (x)))
|
||||||
{
|
{
|
||||||
scm_t_inum xx = SCM_I_INUM (x);
|
scm_t_inum xx = SCM_I_INUM (x);
|
||||||
if (SCM_I_INUMP (y))
|
if (SCM_LIKELY (SCM_I_INUMP (y)))
|
||||||
{
|
{
|
||||||
scm_t_inum yy = SCM_I_INUM (y);
|
scm_t_inum yy = SCM_I_INUM (y);
|
||||||
if (yy == 0)
|
if (SCM_UNLIKELY (yy == 0))
|
||||||
scm_num_overflow (s_modulo);
|
scm_num_overflow (s_modulo);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1008,10 +1011,10 @@ scm_modulo (SCM x, SCM y)
|
||||||
}
|
}
|
||||||
else if (SCM_BIGP (x))
|
else if (SCM_BIGP (x))
|
||||||
{
|
{
|
||||||
if (SCM_I_INUMP (y))
|
if (SCM_LIKELY (SCM_I_INUMP (y)))
|
||||||
{
|
{
|
||||||
scm_t_inum yy = SCM_I_INUM (y);
|
scm_t_inum yy = SCM_I_INUM (y);
|
||||||
if (yy == 0)
|
if (SCM_UNLIKELY (yy == 0))
|
||||||
scm_num_overflow (s_modulo);
|
scm_num_overflow (s_modulo);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1029,22 +1032,20 @@ scm_modulo (SCM x, SCM y)
|
||||||
}
|
}
|
||||||
else if (SCM_BIGP (y))
|
else if (SCM_BIGP (y))
|
||||||
{
|
{
|
||||||
{
|
SCM result = scm_i_mkbig ();
|
||||||
SCM result = scm_i_mkbig ();
|
int y_sgn = mpz_sgn (SCM_I_BIG_MPZ (y));
|
||||||
int y_sgn = mpz_sgn (SCM_I_BIG_MPZ (y));
|
SCM pos_y = scm_i_clonebig (y, y_sgn >= 0);
|
||||||
SCM pos_y = scm_i_clonebig (y, y_sgn >= 0);
|
mpz_mod (SCM_I_BIG_MPZ (result),
|
||||||
mpz_mod (SCM_I_BIG_MPZ (result),
|
SCM_I_BIG_MPZ (x),
|
||||||
SCM_I_BIG_MPZ (x),
|
SCM_I_BIG_MPZ (pos_y));
|
||||||
SCM_I_BIG_MPZ (pos_y));
|
|
||||||
|
|
||||||
scm_remember_upto_here_1 (x);
|
scm_remember_upto_here_1 (x);
|
||||||
if ((y_sgn < 0) && (mpz_sgn (SCM_I_BIG_MPZ (result)) != 0))
|
if ((y_sgn < 0) && (mpz_sgn (SCM_I_BIG_MPZ (result)) != 0))
|
||||||
mpz_add (SCM_I_BIG_MPZ (result),
|
mpz_add (SCM_I_BIG_MPZ (result),
|
||||||
SCM_I_BIG_MPZ (y),
|
SCM_I_BIG_MPZ (y),
|
||||||
SCM_I_BIG_MPZ (result));
|
SCM_I_BIG_MPZ (result));
|
||||||
scm_remember_upto_here_2 (y, pos_y);
|
scm_remember_upto_here_2 (y, pos_y);
|
||||||
return scm_i_normbig (result);
|
return scm_i_normbig (result);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
SCM_WTA_DISPATCH_2 (g_modulo, x, y, SCM_ARG2, s_modulo);
|
SCM_WTA_DISPATCH_2 (g_modulo, x, y, SCM_ARG2, s_modulo);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue