aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--debian/changelog7
-rw-r--r--debian/patches/bigrecy_32bit_upstream.patch92
-rw-r--r--debian/patches/series1
3 files changed, 100 insertions, 0 deletions
diff --git a/debian/changelog b/debian/changelog
index 6361b65..2fd13ad 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+scm (5f2-2) UNRELEASED; urgency=medium
+
+ * Cherry-pick Jakub Bogusz's upstream patch to fix a 32-bit platform bignum
+ bug causing test failures and FTBFS (Closes: #874112)
+
+ -- Bryan Newbold <bnewbold@robocracy.org> Thu, 12 Oct 2017 21:01:09 -0700
+
scm (5f2-1) unstable; urgency=medium
* New upstream release (Closes: #791958) with improved floating point
diff --git a/debian/patches/bigrecy_32bit_upstream.patch b/debian/patches/bigrecy_32bit_upstream.patch
new file mode 100644
index 0000000..c103141
--- /dev/null
+++ b/debian/patches/bigrecy_32bit_upstream.patch
@@ -0,0 +1,92 @@
+Description: Support ARM64 ("aarch64") platform
+Author: Jakub Bogusz
+--- a/scl.c 2015/01/03 20:50:15 1.142
++++ b/scl.c 2016/08/10 02:33:05 1.143
+@@ -166,33 +166,34 @@
+ /* try first with starved precision */
+ {
+ num = scm_ash(mant, MAKINUM(e2 - point));
+- bigrecy(mant);
++ if (num != mant) bigrecy(mant);
+ quo = scm_round_quotient(num, VELTS(pows5)[(long) point]);
+ if (pmantexp2dbl(quo, point) != f) {
+- bigrecy(quo); quo = num;
++ if (quo != num) { bigrecy(quo); quo = num; }
+ num = scm_ash(quo, MAKINUM(1L));
+- bigrecy(quo);
++ if (num != quo) bigrecy(quo);
+ quo = scm_round_quotient(num, VELTS(pows5)[(long) --point]);
+ }
++ if (num != quo) bigrecy(num);
+ }
+ } else { /* e2 <= 0 */
+ /* try first with starved precision */
+ {
+ SCM den = scm_ash(MAKINUM(1L), MAKINUM(point - e2));
+ num = product(mant, VELTS(pows5)[- (long) point]);
+- bigrecy(mant);
++ if (num != mant) { bigrecy(mant); if (mant != MAKINUM(1)) mant = INUM0; }
+ quo = scm_round_quotient(num, den);
+ if (pmantexp2dbl(quo, point) != f) {
+- bigrecy(quo); quo = num;
++ if (quo != num) { bigrecy(quo); quo = num; }
+ point--;
+ num = product(quo, MAKINUM(10));
+ if (mant != MAKINUM(1)) bigrecy(quo);
+ quo = scm_round_quotient(num, den);
+- }
++ if (quo != num) bigrecy(num);
++ } else if ((mant != MAKINUM(1)) && (quo != num)) bigrecy(num);
+ bigrecy(den);
+ }
+ }
+- bigrecy(num);
+ a[ch++] = '.';
+ /* if (sizeof(UBIGLONG)>=sizeof(double)) /\* Is ulong larger than mantissa? *\/ */
+ /* ch += iulong2str(num2ulong(quo, (char *)ARG1, s_number2string), 10, &a[ch]); */
+@@ -680,7 +681,7 @@
+ ans = ldexp(ans, bex + point);
+ }
+ if (num != quo) bigrecy(quo);
+- if (bmant != MAKINUM(1L)) bigrecy(num);
++ if ((num != bmant) && (bmant != MAKINUM(1L))) bigrecy(num);
+ return ans;
+ } else {
+ int maxpow = LENGTH(pows5) - 1;
+@@ -696,7 +697,7 @@
+ quo = scm_round_quotient(num, scm_ash(scl, MAKINUM(1L)));
+ }
+ if (-point > maxpow) bigrecy(scl);
+- bigrecy(num);
++ if (num != quo) bigrecy(num);
+ ans = ldexp(int2dbl(quo), bex + point);
+ bigrecy(quo);
+ return ans;
+@@ -2478,7 +2479,7 @@
+ tmp = acc;
+ acc = product(tmp, tz1);
+ #ifdef BIGDIG
+- bigrecy(tmp);
++ if (acc != tmp) bigrecy(tmp);
+ #endif
+ break;
+ }
+@@ -2486,7 +2487,7 @@
+ tmp = acc;
+ acc = product(tmp, tz1);
+ #ifdef BIGDIG
+- bigrecy(tmp);
++ if (acc != tmp) bigrecy(tmp);
+ #endif
+ }
+ tmp = tz1;
+@@ -2841,8 +2842,8 @@
+ bex += j * BITSPERDIG;
+ if (bex > 0) ans = ldexp(ans, bex);
+ }
++ if (quo != num) bigrecy(quo);
+ if (num != b) bigrecy(num);
+- if (quo != b) bigrecy(quo);
+ if (tc16_bigneg==TYP16(b)) return -ans;
+ return ans;
+ }
diff --git a/debian/patches/series b/debian/patches/series
index 102a07f..2f25f43 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -4,3 +4,4 @@ texinfo5_fixes.patch
ppc64_short_int.patch
arm64_short_int.patch
hurd_maxpathlen.patch
+bigrecy_32bit_upstream.patch