4 #include "base/cl_sysdep.h"
7 #include "integer/cl_I.h"
12 #include "cln/number.h"
13 #include "base/digitseq/cl_DS.h"
17 CL_INLINE const cl_I CL_INLINE_DECL(NDS_to_I) (const uintD* MSDptr, uintC len)
19 // Mehr als bn_minlength Digits -> Bignum.
20 // Weniger als bn_minlength Digits -> Fixnum.
21 // Genau bn_minlength Digits -> Bignum oder Fixnum.
22 if (len < bn_minlength)
23 { // 0..bn_minlength-1 Digits, paßt in ein Fixnum:
24 if (bn_minlength>1 ? (len==0) : TRUE)
27 #if (cl_word_size <= 32)
29 if (bn_minlength>2 ? (len==1) : TRUE)
32 { wert = get_sint1D_Dptr(MSDptr mspop 1); }
33 elif (bn_minlength>3 ? (len==2) : TRUE)
36 { wert = get_sint2D_Dptr(MSDptr mspop 2); }
37 elif (bn_minlength>4 ? (len==3) : TRUE)
40 { wert = get_sint3D_Dptr(MSDptr mspop 3); }
44 { wert = get_sint4D_Dptr(MSDptr mspop 4); }
48 { wert = get_sint4D_Dptr(MSDptr mspop 5); }
50 #else // (cl_word_size==64)
56 { wert = (sint64)(sintD)mspref(MSDptr,0); }
60 { wert = ((sint64)(sintD)mspref(MSDptr,0) << intDsize) | (uint64)(uintD)mspref(MSDptr,1); }
66 { wert = (sintD)mspref(MSDptr,0); }
68 return cl_I_from_word(cl_combine(cl_FN_tag,wert));
71 #if (cl_value_len > (bn_minlength-1)*intDsize)
72 if (len == bn_minlength)
73 // bn_minlength Digits, also (incl. Vorzeichen) zwischen
74 // (bn_minlength-1)*intDsize+1 und bn_minlength*intDsize Bits.
75 // Höchstens cl_value_len Bits -> paßt in ein Fixnum:
76 { if ( (mspref(MSDptr,0) <= (uintD)(bit(cl_value_len-1-(bn_minlength-1)*intDsize)-1)) // Fixnum >=0 ?
77 ||(mspref(MSDptr,0) >= (uintD)(-bit(cl_value_len-1-(bn_minlength-1)*intDsize))) // Fixnum <0 ?
96 // mindestens bn_minlength Digits, mache ein Bignum
97 { var Bignum result = allocate_bignum(len);
98 // neues Bignum mit dem Inhalt der NDS füllen:
99 copy_loop_msp(MSDptr,arrayMSDptr(result->data,len),len);