Fix corner case fixnum arithmetic on 64bit machines - gcl.git - GNU Common Lisp

index : gcl.git
GNU Common Lisp
summary refs log tree commit diff
diff options
context:
space:
mode:
authorCamm Maguire <camm@debian.org>2005年01月13日 22:44:32 +0000
committerCamm Maguire <camm@debian.org>2005年01月13日 22:44:32 +0000
commit8708125c5281f9e3e435f040ff1c3b78d50f65e4 (patch)
treebb0525c08c0c4289ee59e147ddda5e24ba205c8e
parent04df31ee793778c25a8f38e08365af1a11455413 (diff)
downloadgcl-unlabeled-1.6.6.1.10.tar.gz
Fix corner case fixnum arithmetic on 64bit machinesunlabeled-1.6.6.1.10
Diffstat
-rwxr-xr-xgcl/h/mp.h 8
1 files changed, 5 insertions, 3 deletions
diff --git a/gcl/h/mp.h b/gcl/h/mp.h
index 0215e3a66..cda0a5dee 100755
--- a/gcl/h/mp.h
+++ b/gcl/h/mp.h
@@ -61,8 +61,10 @@ typedef struct
action \
((((CMPt1=(x))+1024)&-2048)==0?small_fixnum(CMPt1):make_fixnum1(CMPt1));}while(0)
+#define ineg(a_) (sizeof(a_)==sizeof(unsigned) ? (unsigned)-(a_) : (unsigned long)-(a_))
+
#define addii mpz_add
-#define addsi(u,a,b) (a >= 0 ? mpz_add_ui(u,b,a) : mpz_sub_ui(u,b,-a))
+#define addsi(u,a,b) (a >= 0 ? mpz_add_ui(u,b,a) : mpz_sub_ui(u,b,ineg(a)))
#define addss(u,a,b) addsi(u,a,SI_TO_MP(b,big_fixnum1))
#define mulii mpz_mul
@@ -71,9 +73,9 @@ typedef struct
#define subii mpz_sub
#define subsi(u,a,b) mpz_sub(u,SI_TO_MP(a,big_fixnum1),b)
-#define subis(u,a,b) (b >= 0 ? mpz_sub_ui(u,a,b) : mpz_add_ui(u,a,-b))
+#define subis(u,a,b) (b >= 0 ? mpz_sub_ui(u,a,b) : mpz_add_ui(u,a,ineg(b)))
#define subss(u,a,b) subis(u,SI_TO_MP(a,big_fixnum1),b)
-#define shifti(u,a,w) (w>=0 ? mpz_mul_2exp(u,a,w) : mpz_fdiv_q_2exp(u,MP(x),-w))
+#define shifti(u,a,w) (w>=0 ? mpz_mul_2exp(u,a,w) : mpz_fdiv_q_2exp(u,MP(x),ineg(w)))
generated by cgit v1.2.3 (git 2.39.1) at 2025年09月01日 17:59:38 +0000

AltStyle によって変換されたページ (->オリジナル) /