4 #include "base/cl_sysdep.h"
7 #include "integer/cl_I.h"
12 #include "cln/number.h"
16 #include "base/digitseq/cl_DS.h"
20 cl_private_thing cl_I_constructor_from_Q (sint64 wert)
22 var uint64 test = wert & (sint64)minus_bit(cl_value_len-1);
23 // test enthält die Bits, die nicht in den Fixnum-Wert >= 0 reinpassen.
24 if ((test == 0) || (test == (uint64)(sint64)minus_bit(cl_value_len-1)))
25 return (cl_private_thing)(cl_combine(cl_FN_tag,wert));
27 // (dessen Länge bn_minlength <= n <= ceiling(32/intDsize) erfüllt)
29 #define IF_LENGTH(i) \
30 if ((bn_minlength <= i) && (i*intDsize <= 64)) \
31 if (!((i+1)*intDsize <= 64) \
32 || ((uint64)wert < ((uint64)1 << (i*intDsize-1))) \
36 { var cl_heap_bignum* ptr = allocate_bignum(1);
37 arrayLSref(ptr->data,1,0) = (uintD)wert;
38 return (cl_private_thing)(ptr);
43 { var cl_heap_bignum* ptr = allocate_bignum(2);
44 arrayLSref(ptr->data,2,0) = (uintD)wert;
45 arrayLSref(ptr->data,2,1) = (uintD)(wert>>intDsize);
46 return (cl_private_thing)(ptr);
51 { var cl_heap_bignum* ptr = allocate_bignum(3);
52 arrayLSref(ptr->data,3,0) = (uintD)wert; wert >>= intDsize;
53 arrayLSref(ptr->data,3,1) = (uintD)wert;
54 arrayLSref(ptr->data,3,2) = (uintD)(wert>>intDsize);
55 return (cl_private_thing)(ptr);
59 { var cl_heap_bignum* ptr = allocate_bignum(4);
60 arrayLSref(ptr->data,4,0) = (uintD)wert; wert >>= intDsize;
61 arrayLSref(ptr->data,4,1) = (uintD)wert; wert >>= intDsize;
62 arrayLSref(ptr->data,4,2) = (uintD)wert;
63 arrayLSref(ptr->data,4,3) = (uintD)(wert>>intDsize);
64 return (cl_private_thing)(ptr);
69 { var cl_heap_bignum* ptr = allocate_bignum(5);
70 arrayLSref(ptr->data,5,0) = (uintD)wert; wert >>= intDsize;
71 arrayLSref(ptr->data,5,1) = (uintD)wert; wert >>= intDsize;
72 arrayLSref(ptr->data,5,2) = (uintD)wert; wert >>= intDsize;
73 arrayLSref(ptr->data,5,3) = (uintD)wert;
74 arrayLSref(ptr->data,5,4) = (uintD)(wert>>intDsize);
75 return (cl_private_thing)(ptr);
79 { var cl_heap_bignum* ptr = allocate_bignum(6);
80 arrayLSref(ptr->data,6,0) = (uintD)wert; wert >>= intDsize;
81 arrayLSref(ptr->data,6,1) = (uintD)wert; wert >>= intDsize;
82 arrayLSref(ptr->data,6,2) = (uintD)wert; wert >>= intDsize;
83 arrayLSref(ptr->data,6,3) = (uintD)wert; wert >>= intDsize;
84 arrayLSref(ptr->data,6,4) = (uintD)wert;
85 arrayLSref(ptr->data,6,5) = (uintD)(wert>>intDsize);
86 return (cl_private_thing)(ptr);
90 { var cl_heap_bignum* ptr = allocate_bignum(7);
91 arrayLSref(ptr->data,7,0) = (uintD)wert; wert >>= intDsize;
92 arrayLSref(ptr->data,7,1) = (uintD)wert; wert >>= intDsize;
93 arrayLSref(ptr->data,7,2) = (uintD)wert; wert >>= intDsize;
94 arrayLSref(ptr->data,7,3) = (uintD)wert; wert >>= intDsize;
95 arrayLSref(ptr->data,7,4) = (uintD)wert; wert >>= intDsize;
96 arrayLSref(ptr->data,7,5) = (uintD)wert;
97 arrayLSref(ptr->data,7,6) = (uintD)(wert>>intDsize);
98 return (cl_private_thing)(ptr);
102 { var cl_heap_bignum* ptr = allocate_bignum(8);
103 arrayLSref(ptr->data,8,0) = (uintD)wert; wert >>= intDsize;
104 arrayLSref(ptr->data,8,1) = (uintD)wert; wert >>= intDsize;
105 arrayLSref(ptr->data,8,2) = (uintD)wert; wert >>= intDsize;
106 arrayLSref(ptr->data,8,3) = (uintD)wert; wert >>= intDsize;
107 arrayLSref(ptr->data,8,4) = (uintD)wert; wert >>= intDsize;
108 arrayLSref(ptr->data,8,5) = (uintD)wert; wert >>= intDsize;
109 arrayLSref(ptr->data,8,6) = (uintD)wert;
110 arrayLSref(ptr->data,8,7) = (uintD)(wert>>intDsize);
111 return (cl_private_thing)(ptr);
118 #define IF_LENGTH(i) \
119 if ((bn_minlength <= i) && (i*intDsize <= 64)) \
120 if (!((i+1)*intDsize <= 64) \
121 || ((uint64)wert >= ((uint64)(-1) << (i*intDsize-1))) \