2
big_ll.c -- Bignum emulation with long long.
5
Copyright (c) 2005, Maciek Pasternacki.
7
ECL is free software; you can redistribute it and/or
8
modify it under the terms of the GNU Library General Public
9
License as published by the Free Software Foundation; either
10
version 2 of the License, or (at your option) any later version.
12
See file '../Copyright' for full details.
16
#include <ecl/internal.h>
19
big_register0_get(void)
21
cl_env.big_register[0]->big.big_num = 0ll;
22
return cl_env.big_register[0];
26
big_register1_get(void)
28
cl_env.big_register[1]->big.big_num = 0ll;
29
return cl_env.big_register[1];
33
big_register2_get(void)
35
cl_env.big_register[2]->big.big_num = 0ll;
36
return cl_env.big_register[2];
40
big_register_free(cl_object x) {}
43
big_register_copy(cl_object old)
45
cl_object new_big = cl_alloc_object(t_bignum);
46
new_big->big.big_num = old->big.big_num;
51
big_register_normalize(cl_object x)
53
if (x->big.big_num == 0ll)
54
return(MAKE_FIXNUM(0));
55
if (x->big.big_num <= MOST_POSITIVE_FIXNUM && x->big.big_num >= MOST_NEGATIVE_FIXNUM)
56
return(MAKE_FIXNUM(x->big.big_num));
57
return big_register_copy(x);
63
volatile cl_object x = cl_alloc_object(t_bignum);
65
error("negative or zero size for bignum in big_alloc");
72
bignum1(cl_fixnum val)
74
volatile cl_object z = cl_alloc_object(t_bignum);
80
bignum2(cl_fixnum hi, cl_fixnum lo)
85
z->big.big_num = hi<<32 + lo;
92
volatile cl_object y = cl_alloc_object(t_bignum);
93
y->big.big_num = x->big.big_num;
98
big_minus(x) returns the complement of bignum x.
101
big_minus(cl_object x)
103
volatile cl_object y = big_copy(x);
104
y->big.big_num = -x->big.big_num;
109
big_plus(cl_object x, cl_object y)
111
volatile cl_object z = big_register0_get();
112
z->big.big_num = x->big.big_num + y->big.big_num;
113
return(big_register_copy(z));
117
big_normalize(cl_object x)
119
if (x->big.big_num == 0ll)
120
return(MAKE_FIXNUM(0));
121
if (x->big.big_num <= MOST_POSITIVE_FIXNUM && x->big.big_num >= MOST_NEGATIVE_FIXNUM)
122
return(MAKE_FIXNUM(x->big.big_num));
126
int big_num_t_sgn(big_num_t x)
128
return ( x == (big_num_t)0 ) ? 0 : (x < (big_num_t)0) ? -1 : 1;
132
void init_big_registers(void)
135
for (i = 0; i < 3; i++) {
136
cl_env.big_register[i] = cl_alloc_object(t_bignum);
137
cl_env.big_register[i]->big.big_num = 0ll;
144
init_big_registers();