~ chicken-core (chicken-5) 46903e12645f4030ea373c1e5c4ba3391acd8466
commit 46903e12645f4030ea373c1e5c4ba3391acd8466
Author: Peter Bex <peter@more-magic.net>
AuthorDate: Sun Jun 4 17:30:13 2017 +0200
Commit: Peter Bex <peter@more-magic.net>
CommitDate: Sun Jun 4 17:30:13 2017 +0200
Do not use labs() on C_words; llabs() is required on LLP platforms
Instead, we define C_wabs to return absolute word.
diff --git a/chicken.h b/chicken.h
index 6addd311..efd89789 100644
--- a/chicken.h
+++ b/chicken.h
@@ -584,6 +584,7 @@ void *alloca ();
#define C_S64_MAX INT64_MAX
#if defined(C_LLP)
+# define C_wabs llabs
# define C_long C_s64
# ifndef LONG_LONG_MAX
# define C_LONG_MAX LLONG_MAX
@@ -593,6 +594,7 @@ void *alloca ();
# define C_LONG_MIN LONG_LONG_MIN
# endif
#else
+# define C_wabs labs
# define C_long long
# define C_LONG_MAX LONG_MAX
# define C_LONG_MIN LONG_MIN
@@ -2526,7 +2528,7 @@ inline static C_uword C_num_to_unsigned_int(C_word x)
inline static C_word C_int_to_num(C_word **ptr, C_word n)
{
if(C_fitsinfixnump(n)) return C_fix(n);
- else return C_bignum1(ptr, n < 0, labs(n));
+ else return C_bignum1(ptr, n < 0, C_wabs(n));
}
@@ -2571,7 +2573,7 @@ inline static C_word C_long_to_num(C_word **ptr, C_long n)
if(C_fitsinfixnump(n)) {
return C_fix(n);
} else {
- return C_bignum1(ptr, n < 0, labs(n));
+ return C_bignum1(ptr, n < 0, C_wabs(n));
}
}
@@ -2992,7 +2994,7 @@ inline static C_word C_a_i_fixnum_difference(C_word **ptr, C_word n, C_word x, C
C_word z = C_unfix(x) - C_unfix(y);
if(!C_fitsinfixnump(z)) {
- return C_bignum1(ptr, z < 0, labs(z));
+ return C_bignum1(ptr, z < 0, C_wabs(z));
} else {
return C_fix(z);
}
@@ -3003,7 +3005,7 @@ inline static C_word C_a_i_fixnum_plus(C_word **ptr, C_word n, C_word x, C_word
C_word z = C_unfix(x) + C_unfix(y);
if(!C_fitsinfixnump(z)) {
- return C_bignum1(ptr, z < 0, labs(z));
+ return C_bignum1(ptr, z < 0, C_wabs(z));
} else {
return C_fix(z);
}
diff --git a/runtime.c b/runtime.c
index 1a815908..1d2e7502 100644
--- a/runtime.c
+++ b/runtime.c
@@ -5859,11 +5859,11 @@ C_s_a_u_i_integer_negate(C_word **ptr, C_word n, C_word x)
}
-/* Faster version that ignores sign in bignums. TODO: Omit labs() too? */
+/* Faster version that ignores sign */
inline static int integer_length_abs(C_word x)
{
if (x & C_FIXNUM_BIT) {
- return C_ilen(labs(C_unfix(x)));
+ return C_ilen(C_wabs(C_unfix(x)));
} else {
C_uword result = (C_bignum_size(x) - 1) * C_BIGNUM_DIGIT_LENGTH,
*last_digit = C_bignum_digits(x) + C_bignum_size(x) - 1,
Trap