From 333ec4fd35c5625cd090e216a77842a5e1ca9941 Mon Sep 17 00:00:00 2001 From: Mark H Weaver Date: Tue, 26 Jan 2016 03:42:18 -0500 Subject: [PATCH] PRELIMINARY fixes for LLP64. --- libguile/numbers.c | 12 ++++-------- libguile/numbers.h | 37 ++++++++++++++++++------------------- libguile/vm-i-scheme.c | 28 ++++++++++++++-------------- 3 files changed, 36 insertions(+), 41 deletions(-) diff --git a/libguile/numbers.c b/libguile/numbers.c index 1e3fc30..205548d 100644 --- a/libguile/numbers.c +++ b/libguile/numbers.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995-2015 Free Software Foundation, Inc. +/* Copyright (C) 1995-2016 Free Software Foundation, Inc. * * Portions Copyright 1990, 1991, 1992, 1993 by AT&T Bell Laboratories * and Bellcore. See scm_divide. @@ -87,7 +87,9 @@ /* FIXME: We assume that FLT_RADIX is 2 */ verify (FLT_RADIX == 2); -typedef scm_t_signed_bits scm_t_inum; +/* Make sure that scm_t_inum fits within a SCM value. */ +verify (sizeof (scm_t_inum) <= sizeof (scm_t_bits)); + #define scm_from_inum(x) (scm_from_signed_integer (x)) /* Test an inum to see if it can be converted to a double without loss @@ -272,13 +274,7 @@ scm_i_inum2big (scm_t_inum x) { /* Return a newly created bignum initialized to X. */ SCM z = make_bignum (); -#if SIZEOF_VOID_P == SIZEOF_LONG mpz_init_set_si (SCM_I_BIG_MPZ (z), x); -#else - /* Note that in this case, you'll also have to check all mpz_*_ui and - mpz_*_si invocations in Guile. */ -#error creation of mpz not implemented for this inum size -#endif return z; } diff --git a/libguile/numbers.h b/libguile/numbers.h index b929b7a..9f7dd3c 100644 --- a/libguile/numbers.h +++ b/libguile/numbers.h @@ -3,8 +3,8 @@ #ifndef SCM_NUMBERS_H #define SCM_NUMBERS_H -/* Copyright (C) 1995,1996,1998,2000,2001,2002,2003,2004,2005, 2006, - * 2008, 2009, 2010, 2011, 2013, 2014 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1996, 1998, 2000-2006, 2008-2011, 2013, 2014, + * 2016 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -38,16 +38,15 @@ typedef scm_t_int32 scm_t_wchar; /* Immediate Numbers, also known as fixnums * - * Inums are exact integer data that fits within an SCM word. */ - -/* SCM_T_SIGNED_MAX is (- (expt 2 n) 1), - * SCM_MOST_POSITIVE_FIXNUM should be (- (expt 2 (- n 2)) 1) - * which is the same as (/ (- (expt 2 n) 4) 4) - */ - + * Inums are exact integers that fit within an SCM word + * (along with two tagging bits). + * + * In the current implementation, Inums must also fit within a long + * because that's what GMP's mpz_*_si functions accept. */ +typedef long scm_t_inum; #define SCM_I_FIXNUM_BIT (SCM_LONG_BIT - 2) -#define SCM_MOST_POSITIVE_FIXNUM ((SCM_T_SIGNED_BITS_MAX-3)/4) -#define SCM_MOST_NEGATIVE_FIXNUM (-SCM_MOST_POSITIVE_FIXNUM-1) +#define SCM_MOST_NEGATIVE_FIXNUM (-1L << (SCM_I_FIXNUM_BIT - 1)) +#define SCM_MOST_POSITIVE_FIXNUM (- (SCM_MOST_NEGATIVE_FIXNUM + 1)) /* SCM_SRS (X, Y) is signed right shift, defined as floor (X / 2^Y), where Y must be non-negative and less than the width in bits of X. @@ -58,9 +57,9 @@ typedef scm_t_int32 scm_t_wchar; #if (-1 >> 2 == -1) && (-4 >> 2 == -1) && (-5 >> 2 == -2) && (-8 >> 2 == -2) # define SCM_SRS(x, y) ((x) >> (y)) #else -# define SCM_SRS(x, y) \ - ((x) < 0 \ - ? -1 - (scm_t_signed_bits) (~(scm_t_bits)(x) >> (y)) \ +# define SCM_SRS(x, y) \ + ((x) < 0 \ + ? -1 - (long) (~(unsigned long)(x) >> (y)) \ : ((x) >> (y))) #endif @@ -74,12 +73,12 @@ typedef scm_t_int32 scm_t_wchar; NOTE: X must not perform side effects. */ #ifdef __GNUC__ -# define SCM_I_INUM(x) (SCM_SRS ((scm_t_signed_bits) SCM_UNPACK (x), 2)) +# define SCM_I_INUM(x) (SCM_SRS ((scm_t_inum) SCM_UNPACK (x), 2)) #else -# define SCM_I_INUM(x) \ - (SCM_UNPACK (x) > LONG_MAX \ - ? -1 - (scm_t_signed_bits) (~SCM_UNPACK (x) >> 2) \ - : (scm_t_signed_bits) (SCM_UNPACK (x) >> 2)) +# define SCM_I_INUM(x) \ + (SCM_UNPACK (x) > SCM_T_SIGNED_BITS_MAX \ + ? -1 - (scm_t_inum) (~SCM_UNPACK (x) >> 2) \ + : (scm_t_inum) (SCM_UNPACK (x) >> 2)) #endif #define SCM_I_INUMP(x) (2 & SCM_UNPACK (x)) diff --git a/libguile/vm-i-scheme.c b/libguile/vm-i-scheme.c index 162efab..452a459 100644 --- a/libguile/vm-i-scheme.c +++ b/libguile/vm-i-scheme.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2001, 2009-2014 Free Software Foundation, Inc. +/* Copyright (C) 2001, 2009-2014, 2016 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -236,9 +236,9 @@ VM_DEFINE_FUNCTION (149, ge, "ge?", 2) #if SCM_GNUC_PREREQ (4, 5) && (defined __x86_64__ || defined __i386__) # undef _CX -# if SIZEOF_VOID_P == 8 +# if SCM_I_FIXNUM_BIT == 62 # define _CX "rcx" -# elif SIZEOF_VOID_P == 4 +# elif SCM_I_FIXNUM_BIT == 30 # define _CX "ecx" # else # error unsupported word size @@ -291,7 +291,7 @@ VM_DEFINE_FUNCTION (149, ge, "ge?", 2) # define ASM_MUL(x, y) \ { \ - scm_t_signed_bits xx = SCM_I_INUM (x); \ + scm_t_inum xx = SCM_I_INUM (x); \ asm volatile goto ("mov %1, %%"_CX"; " \ "test %[tag], %%cl; je %l[slow_mul]; " \ "sub %[tag], %%"_CX"; " \ @@ -360,7 +360,7 @@ VM_DEFINE_FUNCTION (149, ge, "ge?", 2) # define ASM_MUL(x, y) \ if (SCM_LIKELY (SCM_I_INUMP (x) && SCM_I_INUMP (y))) \ { \ - scm_t_signed_bits rlo, rhi; \ + scm_t_inum rlo, rhi; \ asm ("smull %0, %1, %2, %3\n" \ : "=&r" (rlo), "=&r" (rhi) \ : "r" (SCM_UNPACK (x) - scm_tc2_int), \ @@ -496,7 +496,7 @@ VM_DEFINE_FUNCTION (159, ash, "ash", 2) else /* Left shift. See comments in scm_ash. */ { - scm_t_signed_bits nn, bits_to_shift; + scm_t_inum nn, bits_to_shift; nn = SCM_I_INUM (x); bits_to_shift = SCM_I_INUM (y); @@ -552,7 +552,7 @@ VM_DEFINE_FUNCTION (162, logxor, "logxor", 2) VM_DEFINE_FUNCTION (163, vector_ref, "vector-ref", 2) { - scm_t_signed_bits i = 0; + scm_t_inum i = 0; ARGS2 (vect, idx); if (SCM_LIKELY (SCM_I_IS_NONWEAK_VECTOR (vect) && SCM_I_INUMP (idx) @@ -568,7 +568,7 @@ VM_DEFINE_FUNCTION (163, vector_ref, "vector-ref", 2) VM_DEFINE_INSTRUCTION (164, vector_set, "vector-set", 0, 3, 0) { - scm_t_signed_bits i = 0; + scm_t_inum i = 0; SCM vect, idx, val; POP3 (val, idx, vect); if (SCM_LIKELY (SCM_I_IS_NONWEAK_VECTOR (vect) @@ -792,7 +792,7 @@ BV_REF_WITH_ENDIANNESS (f64, ieee_double) #define BV_FIXABLE_INT_REF(stem, fn_stem, type, size) \ { \ - scm_t_signed_bits i; \ + scm_t_inum i; \ const scm_t_ ## type *int_ptr; \ ARGS2 (bv, idx); \ \ @@ -814,7 +814,7 @@ BV_REF_WITH_ENDIANNESS (f64, ieee_double) #define BV_INT_REF(stem, type, size) \ { \ - scm_t_signed_bits i; \ + scm_t_inum i; \ const scm_t_ ## type *int_ptr; \ ARGS2 (bv, idx); \ \ @@ -845,7 +845,7 @@ BV_REF_WITH_ENDIANNESS (f64, ieee_double) #define BV_FLOAT_REF(stem, fn_stem, type, size) \ { \ - scm_t_signed_bits i; \ + scm_t_inum i; \ const type *float_ptr; \ ARGS2 (bv, idx); \ \ @@ -933,7 +933,7 @@ BV_SET_WITH_ENDIANNESS (f64, ieee_double) #define BV_FIXABLE_INT_SET(stem, fn_stem, type, min, max, size) \ { \ - scm_t_signed_bits i, j = 0; \ + scm_t_inum i, j = 0; \ SCM bv, idx, val; \ scm_t_ ## type *int_ptr; \ \ @@ -960,7 +960,7 @@ BV_SET_WITH_ENDIANNESS (f64, ieee_double) #define BV_INT_SET(stem, type, size) \ { \ - scm_t_signed_bits i = 0; \ + scm_t_inum i = 0; \ SCM bv, idx, val; \ scm_t_ ## type *int_ptr; \ \ @@ -984,7 +984,7 @@ BV_SET_WITH_ENDIANNESS (f64, ieee_double) #define BV_FLOAT_SET(stem, fn_stem, type, size) \ { \ - scm_t_signed_bits i = 0; \ + scm_t_inum i = 0; \ SCM bv, idx, val; \ type *float_ptr; \ \ -- 2.6.3