Fix bignums for Win64

db4
unknown 2008-11-07 20:25:31 -06:00
parent 070432d140
commit e45df2e89c
2 changed files with 12 additions and 23 deletions

View File

@ -1,7 +1,7 @@
/* :tabSize=2:indentSize=2:noTabs=true: /* :tabSize=2:indentSize=2:noTabs=true:
Copyright (C) 1989-94 Massachusetts Institute of Technology Copyright (C) 1989-94 Massachusetts Institute of Technology
Portions copyright (C) 2004-2007 Slava Pestov Portions copyright (C) 2004-2008 Slava Pestov
This material was developed by the Scheme project at the Massachusetts This material was developed by the Scheme project at the Massachusetts
Institute of Technology, Department of Electrical Engineering and Institute of Technology, Department of Electrical Engineering and
@ -45,6 +45,7 @@ MIT in each case. */
* - Remove unused functions * - Remove unused functions
* - Add local variable GC root recording * - Add local variable GC root recording
* - Remove s48 prefix from function names * - Remove s48 prefix from function names
* - Various fixes for Win64
*/ */
#include "master.h" #include "master.h"
@ -366,8 +367,6 @@ bignum_remainder(bignum_type numerator, bignum_type denominator)
/* all below allocate memory */ /* all below allocate memory */
FOO_TO_BIGNUM(cell,CELL,CELL) FOO_TO_BIGNUM(cell,CELL,CELL)
FOO_TO_BIGNUM(fixnum,F_FIXNUM,CELL) FOO_TO_BIGNUM(fixnum,F_FIXNUM,CELL)
FOO_TO_BIGNUM(long,long,unsigned long)
FOO_TO_BIGNUM(ulong,unsigned long,unsigned long)
FOO_TO_BIGNUM(long_long,s64,u64) FOO_TO_BIGNUM(long_long,s64,u64)
FOO_TO_BIGNUM(ulong_long,u64,u64) FOO_TO_BIGNUM(ulong_long,u64,u64)
@ -389,8 +388,6 @@ FOO_TO_BIGNUM(ulong_long,u64,u64)
/* all of the below allocate memory */ /* all of the below allocate memory */
BIGNUM_TO_FOO(cell,CELL,CELL); BIGNUM_TO_FOO(cell,CELL,CELL);
BIGNUM_TO_FOO(fixnum,F_FIXNUM,CELL); BIGNUM_TO_FOO(fixnum,F_FIXNUM,CELL);
BIGNUM_TO_FOO(long,long,unsigned long)
BIGNUM_TO_FOO(ulong,unsigned long,unsigned long)
BIGNUM_TO_FOO(long_long,s64,u64) BIGNUM_TO_FOO(long_long,s64,u64)
BIGNUM_TO_FOO(ulong_long,u64,u64) BIGNUM_TO_FOO(ulong_long,u64,u64)
@ -435,7 +432,7 @@ double_to_bignum(double x)
bignum_digit_type digit; bignum_digit_type digit;
int odd_bits = (exponent % BIGNUM_DIGIT_LENGTH); int odd_bits = (exponent % BIGNUM_DIGIT_LENGTH);
if (odd_bits > 0) if (odd_bits > 0)
DTB_WRITE_DIGIT (1L << odd_bits); DTB_WRITE_DIGIT ((F_FIXNUM)1 << odd_bits);
while (start < scan) while (start < scan)
{ {
if (significand == 0) if (significand == 0)
@ -1117,7 +1114,7 @@ bignum_destructive_normalization(bignum_type source, bignum_type target,
bignum_digit_type * end_source = (scan_source + (BIGNUM_LENGTH (source))); bignum_digit_type * end_source = (scan_source + (BIGNUM_LENGTH (source)));
bignum_digit_type * end_target = (scan_target + (BIGNUM_LENGTH (target))); bignum_digit_type * end_target = (scan_target + (BIGNUM_LENGTH (target)));
int shift_right = (BIGNUM_DIGIT_LENGTH - shift_left); int shift_right = (BIGNUM_DIGIT_LENGTH - shift_left);
bignum_digit_type mask = ((1L << shift_right) - 1); bignum_digit_type mask = (((CELL)1 << shift_right) - 1);
while (scan_source < end_source) while (scan_source < end_source)
{ {
digit = (*scan_source++); digit = (*scan_source++);
@ -1139,7 +1136,7 @@ bignum_destructive_unnormalization(bignum_type bignum, int shift_right)
bignum_digit_type digit; bignum_digit_type digit;
bignum_digit_type carry = 0; bignum_digit_type carry = 0;
int shift_left = (BIGNUM_DIGIT_LENGTH - shift_right); int shift_left = (BIGNUM_DIGIT_LENGTH - shift_right);
bignum_digit_type mask = ((1L << shift_right) - 1); bignum_digit_type mask = (((F_FIXNUM)1 << shift_right) - 1);
while (start < scan) while (start < scan)
{ {
digit = (*--scan); digit = (*--scan);
@ -1489,7 +1486,7 @@ bignum_bitwise_not(bignum_type x)
/* allocates memory */ /* allocates memory */
bignum_type bignum_type
bignum_arithmetic_shift(bignum_type arg1, long n) bignum_arithmetic_shift(bignum_type arg1, F_FIXNUM n)
{ {
if (BIGNUM_NEGATIVE_P(arg1) && n < 0) if (BIGNUM_NEGATIVE_P(arg1) && n < 0)
return bignum_bitwise_not(bignum_magnitude_ash(bignum_bitwise_not(arg1), n)); return bignum_bitwise_not(bignum_magnitude_ash(bignum_bitwise_not(arg1), n));
@ -1550,14 +1547,14 @@ bignum_bitwise_xor(bignum_type arg1, bignum_type arg2)
/* ash for the magnitude */ /* ash for the magnitude */
/* assume arg1 is a big number, n is a long */ /* assume arg1 is a big number, n is a long */
bignum_type bignum_type
bignum_magnitude_ash(bignum_type arg1, long n) bignum_magnitude_ash(bignum_type arg1, F_FIXNUM n)
{ {
bignum_type result = NULL; bignum_type result = NULL;
bignum_digit_type *scan1; bignum_digit_type *scan1;
bignum_digit_type *scanr; bignum_digit_type *scanr;
bignum_digit_type *end; bignum_digit_type *end;
long digit_offset,bit_offset; F_FIXNUM digit_offset,bit_offset;
if (BIGNUM_ZERO_P (arg1)) return (arg1); if (BIGNUM_ZERO_P (arg1)) return (arg1);
@ -1642,10 +1639,6 @@ bignum_pospos_bitwise_op(int op, bignum_type arg1, bignum_type arg2)
while (scanr < endr) { while (scanr < endr) {
digit1 = (scan1 < end1) ? *scan1++ : 0; digit1 = (scan1 < end1) ? *scan1++ : 0;
digit2 = (scan2 < end2) ? *scan2++ : 0; digit2 = (scan2 < end2) ? *scan2++ : 0;
/*
fprintf(stderr, "[pospos op = %d, i = %ld, d1 = %lx, d2 = %lx]\n",
op, endr - scanr, digit1, digit2);
*/
*scanr++ = (op == AND_OP) ? digit1 & digit2 : *scanr++ = (op == AND_OP) ? digit1 & digit2 :
(op == IOR_OP) ? digit1 | digit2 : (op == IOR_OP) ? digit1 | digit2 :
digit1 ^ digit2; digit1 ^ digit2;
@ -1856,8 +1849,8 @@ digit_stream_to_bignum(unsigned int n_digits,
return (BIGNUM_ZERO ()); return (BIGNUM_ZERO ());
if (n_digits == 1) if (n_digits == 1)
{ {
long digit = ((long) ((*producer) (0))); F_FIXNUM digit = ((F_FIXNUM) ((*producer) (0)));
return (long_to_bignum (negative_p ? (- digit) : digit)); return (fixnum_to_bignum (negative_p ? (- digit) : digit));
} }
{ {
bignum_length_type length; bignum_length_type length;

View File

@ -55,14 +55,10 @@ bignum_type bignum_quotient(bignum_type, bignum_type);
bignum_type bignum_remainder(bignum_type, bignum_type); bignum_type bignum_remainder(bignum_type, bignum_type);
DLLEXPORT bignum_type fixnum_to_bignum(F_FIXNUM); DLLEXPORT bignum_type fixnum_to_bignum(F_FIXNUM);
DLLEXPORT bignum_type cell_to_bignum(CELL); DLLEXPORT bignum_type cell_to_bignum(CELL);
DLLEXPORT bignum_type long_to_bignum(long);
DLLEXPORT bignum_type long_long_to_bignum(s64 n); DLLEXPORT bignum_type long_long_to_bignum(s64 n);
DLLEXPORT bignum_type ulong_long_to_bignum(u64 n); DLLEXPORT bignum_type ulong_long_to_bignum(u64 n);
DLLEXPORT bignum_type ulong_to_bignum(unsigned long);
F_FIXNUM bignum_to_fixnum(bignum_type); F_FIXNUM bignum_to_fixnum(bignum_type);
CELL bignum_to_cell(bignum_type); CELL bignum_to_cell(bignum_type);
long bignum_to_long(bignum_type);
unsigned long bignum_to_ulong(bignum_type);
s64 bignum_to_long_long(bignum_type); s64 bignum_to_long_long(bignum_type);
u64 bignum_to_ulong_long(bignum_type); u64 bignum_to_ulong_long(bignum_type);
bignum_type double_to_bignum(double); bignum_type double_to_bignum(double);
@ -71,7 +67,7 @@ double bignum_to_double(bignum_type);
/* Added bitwise operators. */ /* Added bitwise operators. */
DLLEXPORT bignum_type bignum_bitwise_not(bignum_type), DLLEXPORT bignum_type bignum_bitwise_not(bignum_type),
bignum_arithmetic_shift(bignum_type, long), bignum_arithmetic_shift(bignum_type, F_FIXNUM),
bignum_bitwise_and(bignum_type, bignum_type), bignum_bitwise_and(bignum_type, bignum_type),
bignum_bitwise_ior(bignum_type, bignum_type), bignum_bitwise_ior(bignum_type, bignum_type),
bignum_bitwise_xor(bignum_type, bignum_type); bignum_bitwise_xor(bignum_type, bignum_type);
@ -116,7 +112,7 @@ bignum_type bignum_maybe_new_sign(bignum_type, int);
void bignum_destructive_copy(bignum_type, bignum_type); void bignum_destructive_copy(bignum_type, bignum_type);
/* Added for bitwise operations. */ /* Added for bitwise operations. */
bignum_type bignum_magnitude_ash(bignum_type arg1, long n); bignum_type bignum_magnitude_ash(bignum_type arg1, F_FIXNUM n);
bignum_type bignum_pospos_bitwise_op(int op, bignum_type, bignum_type); bignum_type bignum_pospos_bitwise_op(int op, bignum_type, bignum_type);
bignum_type bignum_posneg_bitwise_op(int op, bignum_type, bignum_type); bignum_type bignum_posneg_bitwise_op(int op, bignum_type, bignum_type);
bignum_type bignum_negneg_bitwise_op(int op, bignum_type, bignum_type); bignum_type bignum_negneg_bitwise_op(int op, bignum_type, bignum_type);