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_UL (uint32 wert)
22 #if (cl_value_len <= 32)
23 if ((wert & minus_bit(cl_value_len-1)) == 0)
24 // Bits, die nicht in den Fixnum-Wert >= 0 reinpassen.
25 return (cl_private_thing)(cl_combine(cl_FN_tag,wert));
27 // (dessen Länge bn_minlength <= n <= ceiling((32+1)/intDsize) erfüllt)
28 #define UL_maxlength ceiling(32+1,intDsize)
29 #define IF_LENGTH(i) \
30 if ((bn_minlength <= i) && (i <= UL_maxlength) \
31 && (!(i+1 <= UL_maxlength) \
32 || ((uint32)wert < (uint32)bitc(i*intDsize-1)) \
35 { var cl_heap_bignum* ptr = allocate_bignum(1);
36 arrayLSref(ptr->data,1,0) = wert;
37 return (cl_private_thing)(ptr);
41 { var cl_heap_bignum* ptr = allocate_bignum(2);
42 arrayLSref(ptr->data,2,0) = (uintD)wert;
44 arrayLSref(ptr->data,2,1) = 0;
46 arrayLSref(ptr->data,2,1) = (uintD)(wert>>intDsize);
48 return (cl_private_thing)(ptr);
52 { var cl_heap_bignum* ptr = allocate_bignum(3);
53 arrayLSref(ptr->data,3,0) = (uintD)wert; wert >>= intDsize;
54 arrayLSref(ptr->data,3,1) = (uintD)wert;
56 arrayLSref(ptr->data,3,2) = 0;
58 arrayLSref(ptr->data,3,2) = (uintD)(wert>>intDsize);
60 return (cl_private_thing)(ptr);
64 { var cl_heap_bignum* ptr = allocate_bignum(4);
65 arrayLSref(ptr->data,4,0) = (uintD)wert; wert >>= intDsize;
66 arrayLSref(ptr->data,4,1) = (uintD)wert; wert >>= intDsize;
67 arrayLSref(ptr->data,4,2) = (uintD)wert;
69 arrayLSref(ptr->data,4,3) = 0;
71 arrayLSref(ptr->data,4,3) = (uintD)(wert>>intDsize);
73 return (cl_private_thing)(ptr);
76 { var cl_heap_bignum* ptr = allocate_bignum(5);
77 arrayLSref(ptr->data,5,0) = (uintD)wert; wert >>= intDsize;
78 arrayLSref(ptr->data,5,1) = (uintD)wert; wert >>= intDsize;
79 arrayLSref(ptr->data,5,2) = (uintD)wert; wert >>= intDsize;
80 arrayLSref(ptr->data,5,3) = (uintD)wert;
82 arrayLSref(ptr->data,5,4) = 0;
84 arrayLSref(ptr->data,5,4) = (uintD)(wert>>intDsize);
86 return (cl_private_thing)(ptr);
93 #else // cl_value_len > 32
94 // All bits fit in a fixnum value >= 0.
95 return (cl_private_thing)(cl_combine(cl_FN_tag,wert));