4 #include "base/cl_sysdep.h"
7 #include "integer/cl_I.h"
12 #include "cln/number.h"
14 #if (cl_value_len < 32) || (long_bitsize==32)
16 #include "base/digitseq/cl_DS.h"
20 cl_private_thing cl_I_constructor_from_L (sint32 wert)
22 #if (cl_value_len < 32)
23 var uint32 test = wert & minus_bit(cl_value_len-1);
24 // test enthält die Bits, die nicht in den Fixnum-Wert >= 0 reinpassen.
25 if ((test == 0) || (test == (uint32)minus_bit(cl_value_len-1)))
26 { return (cl_private_thing)(cl_combine(cl_FN_tag,wert)); }
28 // trivially generate a Bignum of length one digit
29 var cl_heap_bignum* ptr = allocate_bignum(1);
30 arrayLSref(ptr->data,1,0) = wert;
31 return (cl_private_thing)(ptr);
34 // (dessen Länge bn_minlength <= n <= ceiling(32/intDsize) erfüllt)
35 if (bn_minlength == ceiling(32,intDsize)) {
47 #define IF_LENGTH(i) \
48 if ((bn_minlength <= i) && (i*intDsize <= 32) \
49 && (!((i+1)*intDsize <= 32) \
50 || ((uint32)wert < (uint32)bitc(i*intDsize-1)) \
55 { var cl_heap_bignum* ptr = allocate_bignum(1);
56 arrayLSref(ptr->data,1,0) = wert;
57 return (cl_private_thing)(ptr);
62 { var cl_heap_bignum* ptr = allocate_bignum(2);
63 arrayLSref(ptr->data,2,0) = (uintD)wert;
64 arrayLSref(ptr->data,2,1) = (uintD)(wert>>intDsize);
65 return (cl_private_thing)(ptr);
70 { var cl_heap_bignum* ptr = allocate_bignum(3);
71 arrayLSref(ptr->data,3,0) = (uintD)wert; wert >>= intDsize;
72 arrayLSref(ptr->data,3,1) = (uintD)wert;
73 arrayLSref(ptr->data,3,2) = (uintD)(wert>>intDsize);
74 return (cl_private_thing)(ptr);
78 { var cl_heap_bignum* ptr = allocate_bignum(4);
79 arrayLSref(ptr->data,4,0) = (uintD)wert; wert >>= intDsize;
80 arrayLSref(ptr->data,4,1) = (uintD)wert; wert >>= intDsize;
81 arrayLSref(ptr->data,4,2) = (uintD)wert;
82 arrayLSref(ptr->data,4,3) = (uintD)(wert>>intDsize);
83 return (cl_private_thing)(ptr);
90 #define IF_LENGTH(i) \
91 if ((bn_minlength <= i) && (i*intDsize <= 32) \
92 && (!((i+1)*intDsize <= 32) \
93 || ((uint32)wert >= (uint32)(-bitc(i*intDsize-1))) \
113 #else // cl_value_len >= 32
114 // All bits fit in a fixnum value.
115 return (cl_private_thing)(cl_combine(cl_FN_tag,wert));