1f9f848faSopenharmony_ci/**************************************************************** 2f9f848faSopenharmony_ci 3f9f848faSopenharmony_ciThe author of this software is David M. Gay. 4f9f848faSopenharmony_ci 5f9f848faSopenharmony_ciCopyright (C) 1998, 1999 by Lucent Technologies 6f9f848faSopenharmony_ciAll Rights Reserved 7f9f848faSopenharmony_ci 8f9f848faSopenharmony_ciPermission to use, copy, modify, and distribute this software and 9f9f848faSopenharmony_ciits documentation for any purpose and without fee is hereby 10f9f848faSopenharmony_cigranted, provided that the above copyright notice appear in all 11f9f848faSopenharmony_cicopies and that both that the copyright notice and this 12f9f848faSopenharmony_cipermission notice and warranty disclaimer appear in supporting 13f9f848faSopenharmony_cidocumentation, and that the name of Lucent or any of its entities 14f9f848faSopenharmony_cinot be used in advertising or publicity pertaining to 15f9f848faSopenharmony_cidistribution of the software without specific, written prior 16f9f848faSopenharmony_cipermission. 17f9f848faSopenharmony_ci 18f9f848faSopenharmony_ciLUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 19f9f848faSopenharmony_ciINCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. 20f9f848faSopenharmony_ciIN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY 21f9f848faSopenharmony_ciSPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 22f9f848faSopenharmony_ciWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER 23f9f848faSopenharmony_ciIN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, 24f9f848faSopenharmony_ciARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF 25f9f848faSopenharmony_ciTHIS SOFTWARE. 26f9f848faSopenharmony_ci 27f9f848faSopenharmony_ci****************************************************************/ 28f9f848faSopenharmony_ci 29f9f848faSopenharmony_ci/* Please send bug reports to David M. Gay (dmg at acm dot org, 30f9f848faSopenharmony_ci * with " at " changed at "@" and " dot " changed to "."). */ 31f9f848faSopenharmony_ci 32f9f848faSopenharmony_ci#include "gdtoaimp.h" 33f9f848faSopenharmony_ci 34f9f848faSopenharmony_ci static Bigint *freelist[Kmax+1]; 35f9f848faSopenharmony_ci#ifndef Omit_Private_Memory 36f9f848faSopenharmony_ci#ifndef PRIVATE_MEM 37f9f848faSopenharmony_ci#define PRIVATE_MEM 2304 38f9f848faSopenharmony_ci#endif 39f9f848faSopenharmony_ci#define PRIVATE_mem ((PRIVATE_MEM+sizeof(double)-1)/sizeof(double)) 40f9f848faSopenharmony_cistatic double private_mem[PRIVATE_mem], *pmem_next = private_mem; 41f9f848faSopenharmony_ci#endif 42f9f848faSopenharmony_ci 43f9f848faSopenharmony_ci Bigint * 44f9f848faSopenharmony_ciBalloc 45f9f848faSopenharmony_ci#ifdef KR_headers 46f9f848faSopenharmony_ci (k) int k; 47f9f848faSopenharmony_ci#else 48f9f848faSopenharmony_ci (int k) 49f9f848faSopenharmony_ci#endif 50f9f848faSopenharmony_ci{ 51f9f848faSopenharmony_ci int x; 52f9f848faSopenharmony_ci Bigint *rv; 53f9f848faSopenharmony_ci#ifndef Omit_Private_Memory 54f9f848faSopenharmony_ci unsigned int len; 55f9f848faSopenharmony_ci#endif 56f9f848faSopenharmony_ci 57f9f848faSopenharmony_ci ACQUIRE_DTOA_LOCK(0); 58f9f848faSopenharmony_ci /* The k > Kmax case does not need ACQUIRE_DTOA_LOCK(0), */ 59f9f848faSopenharmony_ci /* but this case seems very unlikely. */ 60f9f848faSopenharmony_ci if (k <= Kmax && (rv = freelist[k]) !=0) { 61f9f848faSopenharmony_ci freelist[k] = rv->next; 62f9f848faSopenharmony_ci } 63f9f848faSopenharmony_ci else { 64f9f848faSopenharmony_ci x = 1 << k; 65f9f848faSopenharmony_ci#ifdef Omit_Private_Memory 66f9f848faSopenharmony_ci rv = (Bigint *)MALLOC(sizeof(Bigint) + (x-1)*sizeof(ULong)); 67f9f848faSopenharmony_ci#else 68f9f848faSopenharmony_ci len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1) 69f9f848faSopenharmony_ci /sizeof(double); 70f9f848faSopenharmony_ci if (k <= Kmax && pmem_next - private_mem + len <= PRIVATE_mem) { 71f9f848faSopenharmony_ci rv = (Bigint*)pmem_next; 72f9f848faSopenharmony_ci pmem_next += len; 73f9f848faSopenharmony_ci } 74f9f848faSopenharmony_ci else 75f9f848faSopenharmony_ci rv = (Bigint*)MALLOC(len*sizeof(double)); 76f9f848faSopenharmony_ci#endif 77f9f848faSopenharmony_ci rv->k = k; 78f9f848faSopenharmony_ci rv->maxwds = x; 79f9f848faSopenharmony_ci } 80f9f848faSopenharmony_ci FREE_DTOA_LOCK(0); 81f9f848faSopenharmony_ci rv->sign = rv->wds = 0; 82f9f848faSopenharmony_ci return rv; 83f9f848faSopenharmony_ci } 84f9f848faSopenharmony_ci 85f9f848faSopenharmony_ci void 86f9f848faSopenharmony_ciBfree 87f9f848faSopenharmony_ci#ifdef KR_headers 88f9f848faSopenharmony_ci (v) Bigint *v; 89f9f848faSopenharmony_ci#else 90f9f848faSopenharmony_ci (Bigint *v) 91f9f848faSopenharmony_ci#endif 92f9f848faSopenharmony_ci{ 93f9f848faSopenharmony_ci if (v) { 94f9f848faSopenharmony_ci if (v->k > Kmax) 95f9f848faSopenharmony_ci#ifdef FREE 96f9f848faSopenharmony_ci FREE((void*)v); 97f9f848faSopenharmony_ci#else 98f9f848faSopenharmony_ci free((void*)v); 99f9f848faSopenharmony_ci#endif 100f9f848faSopenharmony_ci else { 101f9f848faSopenharmony_ci ACQUIRE_DTOA_LOCK(0); 102f9f848faSopenharmony_ci v->next = freelist[v->k]; 103f9f848faSopenharmony_ci freelist[v->k] = v; 104f9f848faSopenharmony_ci FREE_DTOA_LOCK(0); 105f9f848faSopenharmony_ci } 106f9f848faSopenharmony_ci } 107f9f848faSopenharmony_ci } 108f9f848faSopenharmony_ci 109f9f848faSopenharmony_ci int 110f9f848faSopenharmony_cilo0bits 111f9f848faSopenharmony_ci#ifdef KR_headers 112f9f848faSopenharmony_ci (y) ULong *y; 113f9f848faSopenharmony_ci#else 114f9f848faSopenharmony_ci (ULong *y) 115f9f848faSopenharmony_ci#endif 116f9f848faSopenharmony_ci{ 117f9f848faSopenharmony_ci int k; 118f9f848faSopenharmony_ci ULong x = *y; 119f9f848faSopenharmony_ci 120f9f848faSopenharmony_ci if (x & 7) { 121f9f848faSopenharmony_ci if (x & 1) 122f9f848faSopenharmony_ci return 0; 123f9f848faSopenharmony_ci if (x & 2) { 124f9f848faSopenharmony_ci *y = x >> 1; 125f9f848faSopenharmony_ci return 1; 126f9f848faSopenharmony_ci } 127f9f848faSopenharmony_ci *y = x >> 2; 128f9f848faSopenharmony_ci return 2; 129f9f848faSopenharmony_ci } 130f9f848faSopenharmony_ci k = 0; 131f9f848faSopenharmony_ci if (!(x & 0xffff)) { 132f9f848faSopenharmony_ci k = 16; 133f9f848faSopenharmony_ci x >>= 16; 134f9f848faSopenharmony_ci } 135f9f848faSopenharmony_ci if (!(x & 0xff)) { 136f9f848faSopenharmony_ci k += 8; 137f9f848faSopenharmony_ci x >>= 8; 138f9f848faSopenharmony_ci } 139f9f848faSopenharmony_ci if (!(x & 0xf)) { 140f9f848faSopenharmony_ci k += 4; 141f9f848faSopenharmony_ci x >>= 4; 142f9f848faSopenharmony_ci } 143f9f848faSopenharmony_ci if (!(x & 0x3)) { 144f9f848faSopenharmony_ci k += 2; 145f9f848faSopenharmony_ci x >>= 2; 146f9f848faSopenharmony_ci } 147f9f848faSopenharmony_ci if (!(x & 1)) { 148f9f848faSopenharmony_ci k++; 149f9f848faSopenharmony_ci x >>= 1; 150f9f848faSopenharmony_ci if (!x) 151f9f848faSopenharmony_ci return 32; 152f9f848faSopenharmony_ci } 153f9f848faSopenharmony_ci *y = x; 154f9f848faSopenharmony_ci return k; 155f9f848faSopenharmony_ci } 156f9f848faSopenharmony_ci 157f9f848faSopenharmony_ci Bigint * 158f9f848faSopenharmony_cimultadd 159f9f848faSopenharmony_ci#ifdef KR_headers 160f9f848faSopenharmony_ci (b, m, a) Bigint *b; int m, a; 161f9f848faSopenharmony_ci#else 162f9f848faSopenharmony_ci (Bigint *b, int m, int a) /* multiply by m and add a */ 163f9f848faSopenharmony_ci#endif 164f9f848faSopenharmony_ci{ 165f9f848faSopenharmony_ci int i, wds; 166f9f848faSopenharmony_ci#ifdef ULLong 167f9f848faSopenharmony_ci ULong *x; 168f9f848faSopenharmony_ci ULLong carry, y; 169f9f848faSopenharmony_ci#else 170f9f848faSopenharmony_ci ULong carry, *x, y; 171f9f848faSopenharmony_ci#ifdef Pack_32 172f9f848faSopenharmony_ci ULong xi, z; 173f9f848faSopenharmony_ci#endif 174f9f848faSopenharmony_ci#endif 175f9f848faSopenharmony_ci Bigint *b1; 176f9f848faSopenharmony_ci 177f9f848faSopenharmony_ci wds = b->wds; 178f9f848faSopenharmony_ci x = b->x; 179f9f848faSopenharmony_ci i = 0; 180f9f848faSopenharmony_ci carry = a; 181f9f848faSopenharmony_ci do { 182f9f848faSopenharmony_ci#ifdef ULLong 183f9f848faSopenharmony_ci y = *x * (ULLong)m + carry; 184f9f848faSopenharmony_ci carry = y >> 32; 185f9f848faSopenharmony_ci *x++ = y & 0xffffffffUL; 186f9f848faSopenharmony_ci#else 187f9f848faSopenharmony_ci#ifdef Pack_32 188f9f848faSopenharmony_ci xi = *x; 189f9f848faSopenharmony_ci y = (xi & 0xffff) * m + carry; 190f9f848faSopenharmony_ci z = (xi >> 16) * m + (y >> 16); 191f9f848faSopenharmony_ci carry = z >> 16; 192f9f848faSopenharmony_ci *x++ = (z << 16) + (y & 0xffff); 193f9f848faSopenharmony_ci#else 194f9f848faSopenharmony_ci y = *x * m + carry; 195f9f848faSopenharmony_ci carry = y >> 16; 196f9f848faSopenharmony_ci *x++ = y & 0xffff; 197f9f848faSopenharmony_ci#endif 198f9f848faSopenharmony_ci#endif 199f9f848faSopenharmony_ci } 200f9f848faSopenharmony_ci while(++i < wds); 201f9f848faSopenharmony_ci if (carry) { 202f9f848faSopenharmony_ci if (wds >= b->maxwds) { 203f9f848faSopenharmony_ci b1 = Balloc(b->k+1); 204f9f848faSopenharmony_ci Bcopy(b1, b); 205f9f848faSopenharmony_ci Bfree(b); 206f9f848faSopenharmony_ci b = b1; 207f9f848faSopenharmony_ci } 208f9f848faSopenharmony_ci b->x[wds++] = carry; 209f9f848faSopenharmony_ci b->wds = wds; 210f9f848faSopenharmony_ci } 211f9f848faSopenharmony_ci return b; 212f9f848faSopenharmony_ci } 213f9f848faSopenharmony_ci 214f9f848faSopenharmony_ci int 215f9f848faSopenharmony_cihi0bits_D2A 216f9f848faSopenharmony_ci#ifdef KR_headers 217f9f848faSopenharmony_ci (x) ULong x; 218f9f848faSopenharmony_ci#else 219f9f848faSopenharmony_ci (ULong x) 220f9f848faSopenharmony_ci#endif 221f9f848faSopenharmony_ci{ 222f9f848faSopenharmony_ci int k = 0; 223f9f848faSopenharmony_ci 224f9f848faSopenharmony_ci if (!(x & 0xffff0000)) { 225f9f848faSopenharmony_ci k = 16; 226f9f848faSopenharmony_ci x <<= 16; 227f9f848faSopenharmony_ci } 228f9f848faSopenharmony_ci if (!(x & 0xff000000)) { 229f9f848faSopenharmony_ci k += 8; 230f9f848faSopenharmony_ci x <<= 8; 231f9f848faSopenharmony_ci } 232f9f848faSopenharmony_ci if (!(x & 0xf0000000)) { 233f9f848faSopenharmony_ci k += 4; 234f9f848faSopenharmony_ci x <<= 4; 235f9f848faSopenharmony_ci } 236f9f848faSopenharmony_ci if (!(x & 0xc0000000)) { 237f9f848faSopenharmony_ci k += 2; 238f9f848faSopenharmony_ci x <<= 2; 239f9f848faSopenharmony_ci } 240f9f848faSopenharmony_ci if (!(x & 0x80000000)) { 241f9f848faSopenharmony_ci k++; 242f9f848faSopenharmony_ci if (!(x & 0x40000000)) 243f9f848faSopenharmony_ci return 32; 244f9f848faSopenharmony_ci } 245f9f848faSopenharmony_ci return k; 246f9f848faSopenharmony_ci } 247f9f848faSopenharmony_ci 248f9f848faSopenharmony_ci Bigint * 249f9f848faSopenharmony_cii2b 250f9f848faSopenharmony_ci#ifdef KR_headers 251f9f848faSopenharmony_ci (i) int i; 252f9f848faSopenharmony_ci#else 253f9f848faSopenharmony_ci (int i) 254f9f848faSopenharmony_ci#endif 255f9f848faSopenharmony_ci{ 256f9f848faSopenharmony_ci Bigint *b; 257f9f848faSopenharmony_ci 258f9f848faSopenharmony_ci b = Balloc(1); 259f9f848faSopenharmony_ci b->x[0] = i; 260f9f848faSopenharmony_ci b->wds = 1; 261f9f848faSopenharmony_ci return b; 262f9f848faSopenharmony_ci } 263f9f848faSopenharmony_ci 264f9f848faSopenharmony_ci Bigint * 265f9f848faSopenharmony_cimult 266f9f848faSopenharmony_ci#ifdef KR_headers 267f9f848faSopenharmony_ci (a, b) Bigint *a, *b; 268f9f848faSopenharmony_ci#else 269f9f848faSopenharmony_ci (Bigint *a, Bigint *b) 270f9f848faSopenharmony_ci#endif 271f9f848faSopenharmony_ci{ 272f9f848faSopenharmony_ci Bigint *c; 273f9f848faSopenharmony_ci int k, wa, wb, wc; 274f9f848faSopenharmony_ci ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0; 275f9f848faSopenharmony_ci ULong y; 276f9f848faSopenharmony_ci#ifdef ULLong 277f9f848faSopenharmony_ci ULLong carry, z; 278f9f848faSopenharmony_ci#else 279f9f848faSopenharmony_ci ULong carry, z; 280f9f848faSopenharmony_ci#ifdef Pack_32 281f9f848faSopenharmony_ci ULong z2; 282f9f848faSopenharmony_ci#endif 283f9f848faSopenharmony_ci#endif 284f9f848faSopenharmony_ci 285f9f848faSopenharmony_ci if (a->wds < b->wds) { 286f9f848faSopenharmony_ci c = a; 287f9f848faSopenharmony_ci a = b; 288f9f848faSopenharmony_ci b = c; 289f9f848faSopenharmony_ci } 290f9f848faSopenharmony_ci k = a->k; 291f9f848faSopenharmony_ci wa = a->wds; 292f9f848faSopenharmony_ci wb = b->wds; 293f9f848faSopenharmony_ci wc = wa + wb; 294f9f848faSopenharmony_ci if (wc > a->maxwds) 295f9f848faSopenharmony_ci k++; 296f9f848faSopenharmony_ci c = Balloc(k); 297f9f848faSopenharmony_ci for(x = c->x, xa = x + wc; x < xa; x++) 298f9f848faSopenharmony_ci *x = 0; 299f9f848faSopenharmony_ci xa = a->x; 300f9f848faSopenharmony_ci xae = xa + wa; 301f9f848faSopenharmony_ci xb = b->x; 302f9f848faSopenharmony_ci xbe = xb + wb; 303f9f848faSopenharmony_ci xc0 = c->x; 304f9f848faSopenharmony_ci#ifdef ULLong 305f9f848faSopenharmony_ci for(; xb < xbe; xc0++) { 306f9f848faSopenharmony_ci if ( (y = *xb++) !=0) { 307f9f848faSopenharmony_ci x = xa; 308f9f848faSopenharmony_ci xc = xc0; 309f9f848faSopenharmony_ci carry = 0; 310f9f848faSopenharmony_ci do { 311f9f848faSopenharmony_ci z = *x++ * (ULLong)y + *xc + carry; 312f9f848faSopenharmony_ci carry = z >> 32; 313f9f848faSopenharmony_ci *xc++ = z & 0xffffffffUL; 314f9f848faSopenharmony_ci } 315f9f848faSopenharmony_ci while(x < xae); 316f9f848faSopenharmony_ci *xc = carry; 317f9f848faSopenharmony_ci } 318f9f848faSopenharmony_ci } 319f9f848faSopenharmony_ci#else 320f9f848faSopenharmony_ci#ifdef Pack_32 321f9f848faSopenharmony_ci for(; xb < xbe; xb++, xc0++) { 322f9f848faSopenharmony_ci if ( (y = *xb & 0xffff) !=0) { 323f9f848faSopenharmony_ci x = xa; 324f9f848faSopenharmony_ci xc = xc0; 325f9f848faSopenharmony_ci carry = 0; 326f9f848faSopenharmony_ci do { 327f9f848faSopenharmony_ci z = (*x & 0xffff) * y + (*xc & 0xffff) + carry; 328f9f848faSopenharmony_ci carry = z >> 16; 329f9f848faSopenharmony_ci z2 = (*x++ >> 16) * y + (*xc >> 16) + carry; 330f9f848faSopenharmony_ci carry = z2 >> 16; 331f9f848faSopenharmony_ci Storeinc(xc, z2, z); 332f9f848faSopenharmony_ci } 333f9f848faSopenharmony_ci while(x < xae); 334f9f848faSopenharmony_ci *xc = carry; 335f9f848faSopenharmony_ci } 336f9f848faSopenharmony_ci if ( (y = *xb >> 16) !=0) { 337f9f848faSopenharmony_ci x = xa; 338f9f848faSopenharmony_ci xc = xc0; 339f9f848faSopenharmony_ci carry = 0; 340f9f848faSopenharmony_ci z2 = *xc; 341f9f848faSopenharmony_ci do { 342f9f848faSopenharmony_ci z = (*x & 0xffff) * y + (*xc >> 16) + carry; 343f9f848faSopenharmony_ci carry = z >> 16; 344f9f848faSopenharmony_ci Storeinc(xc, z, z2); 345f9f848faSopenharmony_ci z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry; 346f9f848faSopenharmony_ci carry = z2 >> 16; 347f9f848faSopenharmony_ci } 348f9f848faSopenharmony_ci while(x < xae); 349f9f848faSopenharmony_ci *xc = z2; 350f9f848faSopenharmony_ci } 351f9f848faSopenharmony_ci } 352f9f848faSopenharmony_ci#else 353f9f848faSopenharmony_ci for(; xb < xbe; xc0++) { 354f9f848faSopenharmony_ci if ( (y = *xb++) !=0) { 355f9f848faSopenharmony_ci x = xa; 356f9f848faSopenharmony_ci xc = xc0; 357f9f848faSopenharmony_ci carry = 0; 358f9f848faSopenharmony_ci do { 359f9f848faSopenharmony_ci z = *x++ * y + *xc + carry; 360f9f848faSopenharmony_ci carry = z >> 16; 361f9f848faSopenharmony_ci *xc++ = z & 0xffff; 362f9f848faSopenharmony_ci } 363f9f848faSopenharmony_ci while(x < xae); 364f9f848faSopenharmony_ci *xc = carry; 365f9f848faSopenharmony_ci } 366f9f848faSopenharmony_ci } 367f9f848faSopenharmony_ci#endif 368f9f848faSopenharmony_ci#endif 369f9f848faSopenharmony_ci for(xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ; 370f9f848faSopenharmony_ci c->wds = wc; 371f9f848faSopenharmony_ci return c; 372f9f848faSopenharmony_ci } 373f9f848faSopenharmony_ci 374f9f848faSopenharmony_ci static Bigint *p5s; 375f9f848faSopenharmony_ci 376f9f848faSopenharmony_ci Bigint * 377f9f848faSopenharmony_cipow5mult 378f9f848faSopenharmony_ci#ifdef KR_headers 379f9f848faSopenharmony_ci (b, k) Bigint *b; int k; 380f9f848faSopenharmony_ci#else 381f9f848faSopenharmony_ci (Bigint *b, int k) 382f9f848faSopenharmony_ci#endif 383f9f848faSopenharmony_ci{ 384f9f848faSopenharmony_ci Bigint *b1, *p5, *p51; 385f9f848faSopenharmony_ci int i; 386f9f848faSopenharmony_ci static int p05[3] = { 5, 25, 125 }; 387f9f848faSopenharmony_ci 388f9f848faSopenharmony_ci if ( (i = k & 3) !=0) 389f9f848faSopenharmony_ci b = multadd(b, p05[i-1], 0); 390f9f848faSopenharmony_ci 391f9f848faSopenharmony_ci if (!(k >>= 2)) 392f9f848faSopenharmony_ci return b; 393f9f848faSopenharmony_ci if ((p5 = p5s) == 0) { 394f9f848faSopenharmony_ci /* first time */ 395f9f848faSopenharmony_ci#ifdef MULTIPLE_THREADS 396f9f848faSopenharmony_ci ACQUIRE_DTOA_LOCK(1); 397f9f848faSopenharmony_ci if (!(p5 = p5s)) { 398f9f848faSopenharmony_ci p5 = p5s = i2b(625); 399f9f848faSopenharmony_ci p5->next = 0; 400f9f848faSopenharmony_ci } 401f9f848faSopenharmony_ci FREE_DTOA_LOCK(1); 402f9f848faSopenharmony_ci#else 403f9f848faSopenharmony_ci p5 = p5s = i2b(625); 404f9f848faSopenharmony_ci p5->next = 0; 405f9f848faSopenharmony_ci#endif 406f9f848faSopenharmony_ci } 407f9f848faSopenharmony_ci for(;;) { 408f9f848faSopenharmony_ci if (k & 1) { 409f9f848faSopenharmony_ci b1 = mult(b, p5); 410f9f848faSopenharmony_ci Bfree(b); 411f9f848faSopenharmony_ci b = b1; 412f9f848faSopenharmony_ci } 413f9f848faSopenharmony_ci if (!(k >>= 1)) 414f9f848faSopenharmony_ci break; 415f9f848faSopenharmony_ci if ((p51 = p5->next) == 0) { 416f9f848faSopenharmony_ci#ifdef MULTIPLE_THREADS 417f9f848faSopenharmony_ci ACQUIRE_DTOA_LOCK(1); 418f9f848faSopenharmony_ci if (!(p51 = p5->next)) { 419f9f848faSopenharmony_ci p51 = p5->next = mult(p5,p5); 420f9f848faSopenharmony_ci p51->next = 0; 421f9f848faSopenharmony_ci } 422f9f848faSopenharmony_ci FREE_DTOA_LOCK(1); 423f9f848faSopenharmony_ci#else 424f9f848faSopenharmony_ci p51 = p5->next = mult(p5,p5); 425f9f848faSopenharmony_ci p51->next = 0; 426f9f848faSopenharmony_ci#endif 427f9f848faSopenharmony_ci } 428f9f848faSopenharmony_ci p5 = p51; 429f9f848faSopenharmony_ci } 430f9f848faSopenharmony_ci return b; 431f9f848faSopenharmony_ci } 432f9f848faSopenharmony_ci 433f9f848faSopenharmony_ci Bigint * 434f9f848faSopenharmony_cilshift 435f9f848faSopenharmony_ci#ifdef KR_headers 436f9f848faSopenharmony_ci (b, k) Bigint *b; int k; 437f9f848faSopenharmony_ci#else 438f9f848faSopenharmony_ci (Bigint *b, int k) 439f9f848faSopenharmony_ci#endif 440f9f848faSopenharmony_ci{ 441f9f848faSopenharmony_ci int i, k1, n, n1; 442f9f848faSopenharmony_ci Bigint *b1; 443f9f848faSopenharmony_ci ULong *x, *x1, *xe, z; 444f9f848faSopenharmony_ci 445f9f848faSopenharmony_ci n = k >> kshift; 446f9f848faSopenharmony_ci k1 = b->k; 447f9f848faSopenharmony_ci n1 = n + b->wds + 1; 448f9f848faSopenharmony_ci for(i = b->maxwds; n1 > i; i <<= 1) 449f9f848faSopenharmony_ci k1++; 450f9f848faSopenharmony_ci b1 = Balloc(k1); 451f9f848faSopenharmony_ci x1 = b1->x; 452f9f848faSopenharmony_ci for(i = 0; i < n; i++) 453f9f848faSopenharmony_ci *x1++ = 0; 454f9f848faSopenharmony_ci x = b->x; 455f9f848faSopenharmony_ci xe = x + b->wds; 456f9f848faSopenharmony_ci if (k &= kmask) { 457f9f848faSopenharmony_ci#ifdef Pack_32 458f9f848faSopenharmony_ci k1 = 32 - k; 459f9f848faSopenharmony_ci z = 0; 460f9f848faSopenharmony_ci do { 461f9f848faSopenharmony_ci *x1++ = *x << k | z; 462f9f848faSopenharmony_ci z = *x++ >> k1; 463f9f848faSopenharmony_ci } 464f9f848faSopenharmony_ci while(x < xe); 465f9f848faSopenharmony_ci if ((*x1 = z) !=0) 466f9f848faSopenharmony_ci ++n1; 467f9f848faSopenharmony_ci#else 468f9f848faSopenharmony_ci k1 = 16 - k; 469f9f848faSopenharmony_ci z = 0; 470f9f848faSopenharmony_ci do { 471f9f848faSopenharmony_ci *x1++ = *x << k & 0xffff | z; 472f9f848faSopenharmony_ci z = *x++ >> k1; 473f9f848faSopenharmony_ci } 474f9f848faSopenharmony_ci while(x < xe); 475f9f848faSopenharmony_ci if (*x1 = z) 476f9f848faSopenharmony_ci ++n1; 477f9f848faSopenharmony_ci#endif 478f9f848faSopenharmony_ci } 479f9f848faSopenharmony_ci else do 480f9f848faSopenharmony_ci *x1++ = *x++; 481f9f848faSopenharmony_ci while(x < xe); 482f9f848faSopenharmony_ci b1->wds = n1 - 1; 483f9f848faSopenharmony_ci Bfree(b); 484f9f848faSopenharmony_ci return b1; 485f9f848faSopenharmony_ci } 486f9f848faSopenharmony_ci 487f9f848faSopenharmony_ci int 488f9f848faSopenharmony_cicmp 489f9f848faSopenharmony_ci#ifdef KR_headers 490f9f848faSopenharmony_ci (a, b) Bigint *a, *b; 491f9f848faSopenharmony_ci#else 492f9f848faSopenharmony_ci (Bigint *a, Bigint *b) 493f9f848faSopenharmony_ci#endif 494f9f848faSopenharmony_ci{ 495f9f848faSopenharmony_ci ULong *xa, *xa0, *xb, *xb0; 496f9f848faSopenharmony_ci int i, j; 497f9f848faSopenharmony_ci 498f9f848faSopenharmony_ci i = a->wds; 499f9f848faSopenharmony_ci j = b->wds; 500f9f848faSopenharmony_ci#ifdef DEBUG 501f9f848faSopenharmony_ci if (i > 1 && !a->x[i-1]) 502f9f848faSopenharmony_ci Bug("cmp called with a->x[a->wds-1] == 0"); 503f9f848faSopenharmony_ci if (j > 1 && !b->x[j-1]) 504f9f848faSopenharmony_ci Bug("cmp called with b->x[b->wds-1] == 0"); 505f9f848faSopenharmony_ci#endif 506f9f848faSopenharmony_ci if (i -= j) 507f9f848faSopenharmony_ci return i; 508f9f848faSopenharmony_ci xa0 = a->x; 509f9f848faSopenharmony_ci xa = xa0 + j; 510f9f848faSopenharmony_ci xb0 = b->x; 511f9f848faSopenharmony_ci xb = xb0 + j; 512f9f848faSopenharmony_ci for(;;) { 513f9f848faSopenharmony_ci if (*--xa != *--xb) 514f9f848faSopenharmony_ci return *xa < *xb ? -1 : 1; 515f9f848faSopenharmony_ci if (xa <= xa0) 516f9f848faSopenharmony_ci break; 517f9f848faSopenharmony_ci } 518f9f848faSopenharmony_ci return 0; 519f9f848faSopenharmony_ci } 520f9f848faSopenharmony_ci 521f9f848faSopenharmony_ci Bigint * 522f9f848faSopenharmony_cidiff 523f9f848faSopenharmony_ci#ifdef KR_headers 524f9f848faSopenharmony_ci (a, b) Bigint *a, *b; 525f9f848faSopenharmony_ci#else 526f9f848faSopenharmony_ci (Bigint *a, Bigint *b) 527f9f848faSopenharmony_ci#endif 528f9f848faSopenharmony_ci{ 529f9f848faSopenharmony_ci Bigint *c; 530f9f848faSopenharmony_ci int i, wa, wb; 531f9f848faSopenharmony_ci ULong *xa, *xae, *xb, *xbe, *xc; 532f9f848faSopenharmony_ci#ifdef ULLong 533f9f848faSopenharmony_ci ULLong borrow, y; 534f9f848faSopenharmony_ci#else 535f9f848faSopenharmony_ci ULong borrow, y; 536f9f848faSopenharmony_ci#ifdef Pack_32 537f9f848faSopenharmony_ci ULong z; 538f9f848faSopenharmony_ci#endif 539f9f848faSopenharmony_ci#endif 540f9f848faSopenharmony_ci 541f9f848faSopenharmony_ci i = cmp(a,b); 542f9f848faSopenharmony_ci if (!i) { 543f9f848faSopenharmony_ci c = Balloc(0); 544f9f848faSopenharmony_ci c->wds = 1; 545f9f848faSopenharmony_ci c->x[0] = 0; 546f9f848faSopenharmony_ci return c; 547f9f848faSopenharmony_ci } 548f9f848faSopenharmony_ci if (i < 0) { 549f9f848faSopenharmony_ci c = a; 550f9f848faSopenharmony_ci a = b; 551f9f848faSopenharmony_ci b = c; 552f9f848faSopenharmony_ci i = 1; 553f9f848faSopenharmony_ci } 554f9f848faSopenharmony_ci else 555f9f848faSopenharmony_ci i = 0; 556f9f848faSopenharmony_ci c = Balloc(a->k); 557f9f848faSopenharmony_ci c->sign = i; 558f9f848faSopenharmony_ci wa = a->wds; 559f9f848faSopenharmony_ci xa = a->x; 560f9f848faSopenharmony_ci xae = xa + wa; 561f9f848faSopenharmony_ci wb = b->wds; 562f9f848faSopenharmony_ci xb = b->x; 563f9f848faSopenharmony_ci xbe = xb + wb; 564f9f848faSopenharmony_ci xc = c->x; 565f9f848faSopenharmony_ci borrow = 0; 566f9f848faSopenharmony_ci#ifdef ULLong 567f9f848faSopenharmony_ci do { 568f9f848faSopenharmony_ci y = (ULLong)*xa++ - *xb++ - borrow; 569f9f848faSopenharmony_ci borrow = y >> 32 & 1UL; 570f9f848faSopenharmony_ci *xc++ = y & 0xffffffffUL; 571f9f848faSopenharmony_ci } 572f9f848faSopenharmony_ci while(xb < xbe); 573f9f848faSopenharmony_ci while(xa < xae) { 574f9f848faSopenharmony_ci y = *xa++ - borrow; 575f9f848faSopenharmony_ci borrow = y >> 32 & 1UL; 576f9f848faSopenharmony_ci *xc++ = y & 0xffffffffUL; 577f9f848faSopenharmony_ci } 578f9f848faSopenharmony_ci#else 579f9f848faSopenharmony_ci#ifdef Pack_32 580f9f848faSopenharmony_ci do { 581f9f848faSopenharmony_ci y = (*xa & 0xffff) - (*xb & 0xffff) - borrow; 582f9f848faSopenharmony_ci borrow = (y & 0x10000) >> 16; 583f9f848faSopenharmony_ci z = (*xa++ >> 16) - (*xb++ >> 16) - borrow; 584f9f848faSopenharmony_ci borrow = (z & 0x10000) >> 16; 585f9f848faSopenharmony_ci Storeinc(xc, z, y); 586f9f848faSopenharmony_ci } 587f9f848faSopenharmony_ci while(xb < xbe); 588f9f848faSopenharmony_ci while(xa < xae) { 589f9f848faSopenharmony_ci y = (*xa & 0xffff) - borrow; 590f9f848faSopenharmony_ci borrow = (y & 0x10000) >> 16; 591f9f848faSopenharmony_ci z = (*xa++ >> 16) - borrow; 592f9f848faSopenharmony_ci borrow = (z & 0x10000) >> 16; 593f9f848faSopenharmony_ci Storeinc(xc, z, y); 594f9f848faSopenharmony_ci } 595f9f848faSopenharmony_ci#else 596f9f848faSopenharmony_ci do { 597f9f848faSopenharmony_ci y = *xa++ - *xb++ - borrow; 598f9f848faSopenharmony_ci borrow = (y & 0x10000) >> 16; 599f9f848faSopenharmony_ci *xc++ = y & 0xffff; 600f9f848faSopenharmony_ci } 601f9f848faSopenharmony_ci while(xb < xbe); 602f9f848faSopenharmony_ci while(xa < xae) { 603f9f848faSopenharmony_ci y = *xa++ - borrow; 604f9f848faSopenharmony_ci borrow = (y & 0x10000) >> 16; 605f9f848faSopenharmony_ci *xc++ = y & 0xffff; 606f9f848faSopenharmony_ci } 607f9f848faSopenharmony_ci#endif 608f9f848faSopenharmony_ci#endif 609f9f848faSopenharmony_ci while(!*--xc) 610f9f848faSopenharmony_ci wa--; 611f9f848faSopenharmony_ci c->wds = wa; 612f9f848faSopenharmony_ci return c; 613f9f848faSopenharmony_ci } 614f9f848faSopenharmony_ci 615f9f848faSopenharmony_ci double 616f9f848faSopenharmony_cib2d 617f9f848faSopenharmony_ci#ifdef KR_headers 618f9f848faSopenharmony_ci (a, e) Bigint *a; int *e; 619f9f848faSopenharmony_ci#else 620f9f848faSopenharmony_ci (Bigint *a, int *e) 621f9f848faSopenharmony_ci#endif 622f9f848faSopenharmony_ci{ 623f9f848faSopenharmony_ci ULong *xa, *xa0, w, y, z; 624f9f848faSopenharmony_ci int k; 625f9f848faSopenharmony_ci U d; 626f9f848faSopenharmony_ci#ifdef VAX 627f9f848faSopenharmony_ci ULong d0, d1; 628f9f848faSopenharmony_ci#else 629f9f848faSopenharmony_ci#define d0 word0(&d) 630f9f848faSopenharmony_ci#define d1 word1(&d) 631f9f848faSopenharmony_ci#endif 632f9f848faSopenharmony_ci 633f9f848faSopenharmony_ci xa0 = a->x; 634f9f848faSopenharmony_ci xa = xa0 + a->wds; 635f9f848faSopenharmony_ci y = *--xa; 636f9f848faSopenharmony_ci#ifdef DEBUG 637f9f848faSopenharmony_ci if (!y) Bug("zero y in b2d"); 638f9f848faSopenharmony_ci#endif 639f9f848faSopenharmony_ci k = hi0bits(y); 640f9f848faSopenharmony_ci *e = 32 - k; 641f9f848faSopenharmony_ci#ifdef Pack_32 642f9f848faSopenharmony_ci if (k < Ebits) { 643f9f848faSopenharmony_ci d0 = Exp_1 | y >> (Ebits - k); 644f9f848faSopenharmony_ci w = xa > xa0 ? *--xa : 0; 645f9f848faSopenharmony_ci d1 = y << ((32-Ebits) + k) | w >> (Ebits - k); 646f9f848faSopenharmony_ci goto ret_d; 647f9f848faSopenharmony_ci } 648f9f848faSopenharmony_ci z = xa > xa0 ? *--xa : 0; 649f9f848faSopenharmony_ci if (k -= Ebits) { 650f9f848faSopenharmony_ci d0 = Exp_1 | y << k | z >> (32 - k); 651f9f848faSopenharmony_ci y = xa > xa0 ? *--xa : 0; 652f9f848faSopenharmony_ci d1 = z << k | y >> (32 - k); 653f9f848faSopenharmony_ci } 654f9f848faSopenharmony_ci else { 655f9f848faSopenharmony_ci d0 = Exp_1 | y; 656f9f848faSopenharmony_ci d1 = z; 657f9f848faSopenharmony_ci } 658f9f848faSopenharmony_ci#else 659f9f848faSopenharmony_ci if (k < Ebits + 16) { 660f9f848faSopenharmony_ci z = xa > xa0 ? *--xa : 0; 661f9f848faSopenharmony_ci d0 = Exp_1 | y << k - Ebits | z >> Ebits + 16 - k; 662f9f848faSopenharmony_ci w = xa > xa0 ? *--xa : 0; 663f9f848faSopenharmony_ci y = xa > xa0 ? *--xa : 0; 664f9f848faSopenharmony_ci d1 = z << k + 16 - Ebits | w << k - Ebits | y >> 16 + Ebits - k; 665f9f848faSopenharmony_ci goto ret_d; 666f9f848faSopenharmony_ci } 667f9f848faSopenharmony_ci z = xa > xa0 ? *--xa : 0; 668f9f848faSopenharmony_ci w = xa > xa0 ? *--xa : 0; 669f9f848faSopenharmony_ci k -= Ebits + 16; 670f9f848faSopenharmony_ci d0 = Exp_1 | y << k + 16 | z << k | w >> 16 - k; 671f9f848faSopenharmony_ci y = xa > xa0 ? *--xa : 0; 672f9f848faSopenharmony_ci d1 = w << k + 16 | y << k; 673f9f848faSopenharmony_ci#endif 674f9f848faSopenharmony_ci ret_d: 675f9f848faSopenharmony_ci#ifdef VAX 676f9f848faSopenharmony_ci word0(&d) = d0 >> 16 | d0 << 16; 677f9f848faSopenharmony_ci word1(&d) = d1 >> 16 | d1 << 16; 678f9f848faSopenharmony_ci#endif 679f9f848faSopenharmony_ci return dval(&d); 680f9f848faSopenharmony_ci } 681f9f848faSopenharmony_ci#undef d0 682f9f848faSopenharmony_ci#undef d1 683f9f848faSopenharmony_ci 684f9f848faSopenharmony_ci Bigint * 685f9f848faSopenharmony_cid2b 686f9f848faSopenharmony_ci#ifdef KR_headers 687f9f848faSopenharmony_ci (dd, e, bits) double dd; int *e, *bits; 688f9f848faSopenharmony_ci#else 689f9f848faSopenharmony_ci (double dd, int *e, int *bits) 690f9f848faSopenharmony_ci#endif 691f9f848faSopenharmony_ci{ 692f9f848faSopenharmony_ci Bigint *b; 693f9f848faSopenharmony_ci U d; 694f9f848faSopenharmony_ci#ifndef Sudden_Underflow 695f9f848faSopenharmony_ci int i; 696f9f848faSopenharmony_ci#endif 697f9f848faSopenharmony_ci int de, k; 698f9f848faSopenharmony_ci ULong *x, y, z; 699f9f848faSopenharmony_ci#ifdef VAX 700f9f848faSopenharmony_ci ULong d0, d1; 701f9f848faSopenharmony_ci#else 702f9f848faSopenharmony_ci#define d0 word0(&d) 703f9f848faSopenharmony_ci#define d1 word1(&d) 704f9f848faSopenharmony_ci#endif 705f9f848faSopenharmony_ci d.d = dd; 706f9f848faSopenharmony_ci#ifdef VAX 707f9f848faSopenharmony_ci d0 = word0(&d) >> 16 | word0(&d) << 16; 708f9f848faSopenharmony_ci d1 = word1(&d) >> 16 | word1(&d) << 16; 709f9f848faSopenharmony_ci#endif 710f9f848faSopenharmony_ci 711f9f848faSopenharmony_ci#ifdef Pack_32 712f9f848faSopenharmony_ci b = Balloc(1); 713f9f848faSopenharmony_ci#else 714f9f848faSopenharmony_ci b = Balloc(2); 715f9f848faSopenharmony_ci#endif 716f9f848faSopenharmony_ci x = b->x; 717f9f848faSopenharmony_ci 718f9f848faSopenharmony_ci z = d0 & Frac_mask; 719f9f848faSopenharmony_ci d0 &= 0x7fffffff; /* clear sign bit, which we ignore */ 720f9f848faSopenharmony_ci#ifdef Sudden_Underflow 721f9f848faSopenharmony_ci de = (int)(d0 >> Exp_shift); 722f9f848faSopenharmony_ci#ifndef IBM 723f9f848faSopenharmony_ci z |= Exp_msk11; 724f9f848faSopenharmony_ci#endif 725f9f848faSopenharmony_ci#else 726f9f848faSopenharmony_ci if ( (de = (int)(d0 >> Exp_shift)) !=0) 727f9f848faSopenharmony_ci z |= Exp_msk1; 728f9f848faSopenharmony_ci#endif 729f9f848faSopenharmony_ci#ifdef Pack_32 730f9f848faSopenharmony_ci if ( (y = d1) !=0) { 731f9f848faSopenharmony_ci if ( (k = lo0bits(&y)) !=0) { 732f9f848faSopenharmony_ci x[0] = y | z << (32 - k); 733f9f848faSopenharmony_ci z >>= k; 734f9f848faSopenharmony_ci } 735f9f848faSopenharmony_ci else 736f9f848faSopenharmony_ci x[0] = y; 737f9f848faSopenharmony_ci#ifndef Sudden_Underflow 738f9f848faSopenharmony_ci i = 739f9f848faSopenharmony_ci#endif 740f9f848faSopenharmony_ci b->wds = (x[1] = z) !=0 ? 2 : 1; 741f9f848faSopenharmony_ci } 742f9f848faSopenharmony_ci else { 743f9f848faSopenharmony_ci k = lo0bits(&z); 744f9f848faSopenharmony_ci x[0] = z; 745f9f848faSopenharmony_ci#ifndef Sudden_Underflow 746f9f848faSopenharmony_ci i = 747f9f848faSopenharmony_ci#endif 748f9f848faSopenharmony_ci b->wds = 1; 749f9f848faSopenharmony_ci k += 32; 750f9f848faSopenharmony_ci } 751f9f848faSopenharmony_ci#else 752f9f848faSopenharmony_ci if ( (y = d1) !=0) { 753f9f848faSopenharmony_ci if ( (k = lo0bits(&y)) !=0) 754f9f848faSopenharmony_ci if (k >= 16) { 755f9f848faSopenharmony_ci x[0] = y | z << 32 - k & 0xffff; 756f9f848faSopenharmony_ci x[1] = z >> k - 16 & 0xffff; 757f9f848faSopenharmony_ci x[2] = z >> k; 758f9f848faSopenharmony_ci i = 2; 759f9f848faSopenharmony_ci } 760f9f848faSopenharmony_ci else { 761f9f848faSopenharmony_ci x[0] = y & 0xffff; 762f9f848faSopenharmony_ci x[1] = y >> 16 | z << 16 - k & 0xffff; 763f9f848faSopenharmony_ci x[2] = z >> k & 0xffff; 764f9f848faSopenharmony_ci x[3] = z >> k+16; 765f9f848faSopenharmony_ci i = 3; 766f9f848faSopenharmony_ci } 767f9f848faSopenharmony_ci else { 768f9f848faSopenharmony_ci x[0] = y & 0xffff; 769f9f848faSopenharmony_ci x[1] = y >> 16; 770f9f848faSopenharmony_ci x[2] = z & 0xffff; 771f9f848faSopenharmony_ci x[3] = z >> 16; 772f9f848faSopenharmony_ci i = 3; 773f9f848faSopenharmony_ci } 774f9f848faSopenharmony_ci } 775f9f848faSopenharmony_ci else { 776f9f848faSopenharmony_ci#ifdef DEBUG 777f9f848faSopenharmony_ci if (!z) 778f9f848faSopenharmony_ci Bug("Zero passed to d2b"); 779f9f848faSopenharmony_ci#endif 780f9f848faSopenharmony_ci k = lo0bits(&z); 781f9f848faSopenharmony_ci if (k >= 16) { 782f9f848faSopenharmony_ci x[0] = z; 783f9f848faSopenharmony_ci i = 0; 784f9f848faSopenharmony_ci } 785f9f848faSopenharmony_ci else { 786f9f848faSopenharmony_ci x[0] = z & 0xffff; 787f9f848faSopenharmony_ci x[1] = z >> 16; 788f9f848faSopenharmony_ci i = 1; 789f9f848faSopenharmony_ci } 790f9f848faSopenharmony_ci k += 32; 791f9f848faSopenharmony_ci } 792f9f848faSopenharmony_ci while(!x[i]) 793f9f848faSopenharmony_ci --i; 794f9f848faSopenharmony_ci b->wds = i + 1; 795f9f848faSopenharmony_ci#endif 796f9f848faSopenharmony_ci#ifndef Sudden_Underflow 797f9f848faSopenharmony_ci if (de) { 798f9f848faSopenharmony_ci#endif 799f9f848faSopenharmony_ci#ifdef IBM 800f9f848faSopenharmony_ci *e = (de - Bias - (P-1) << 2) + k; 801f9f848faSopenharmony_ci *bits = 4*P + 8 - k - hi0bits(word0(&d) & Frac_mask); 802f9f848faSopenharmony_ci#else 803f9f848faSopenharmony_ci *e = de - Bias - (P-1) + k; 804f9f848faSopenharmony_ci *bits = P - k; 805f9f848faSopenharmony_ci#endif 806f9f848faSopenharmony_ci#ifndef Sudden_Underflow 807f9f848faSopenharmony_ci } 808f9f848faSopenharmony_ci else { 809f9f848faSopenharmony_ci *e = de - Bias - (P-1) + 1 + k; 810f9f848faSopenharmony_ci#ifdef Pack_32 811f9f848faSopenharmony_ci *bits = 32*i - hi0bits(x[i-1]); 812f9f848faSopenharmony_ci#else 813f9f848faSopenharmony_ci *bits = (i+2)*16 - hi0bits(x[i]); 814f9f848faSopenharmony_ci#endif 815f9f848faSopenharmony_ci } 816f9f848faSopenharmony_ci#endif 817f9f848faSopenharmony_ci return b; 818f9f848faSopenharmony_ci } 819f9f848faSopenharmony_ci#undef d0 820f9f848faSopenharmony_ci#undef d1 821f9f848faSopenharmony_ci 822f9f848faSopenharmony_ci CONST double 823f9f848faSopenharmony_ci#ifdef IEEE_Arith 824f9f848faSopenharmony_cibigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 }; 825f9f848faSopenharmony_ciCONST double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128, 1e-256 826f9f848faSopenharmony_ci }; 827f9f848faSopenharmony_ci#else 828f9f848faSopenharmony_ci#ifdef IBM 829f9f848faSopenharmony_cibigtens[] = { 1e16, 1e32, 1e64 }; 830f9f848faSopenharmony_ciCONST double tinytens[] = { 1e-16, 1e-32, 1e-64 }; 831f9f848faSopenharmony_ci#else 832f9f848faSopenharmony_cibigtens[] = { 1e16, 1e32 }; 833f9f848faSopenharmony_ciCONST double tinytens[] = { 1e-16, 1e-32 }; 834f9f848faSopenharmony_ci#endif 835f9f848faSopenharmony_ci#endif 836f9f848faSopenharmony_ci 837f9f848faSopenharmony_ci CONST double 838f9f848faSopenharmony_citens[] = { 839f9f848faSopenharmony_ci 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 840f9f848faSopenharmony_ci 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, 841f9f848faSopenharmony_ci 1e20, 1e21, 1e22 842f9f848faSopenharmony_ci#ifdef VAX 843f9f848faSopenharmony_ci , 1e23, 1e24 844f9f848faSopenharmony_ci#endif 845f9f848faSopenharmony_ci }; 846f9f848faSopenharmony_ci 847f9f848faSopenharmony_ci char * 848f9f848faSopenharmony_ci#ifdef KR_headers 849f9f848faSopenharmony_cistrcp_D2A(a, b) char *a; char *b; 850f9f848faSopenharmony_ci#else 851f9f848faSopenharmony_cistrcp_D2A(char *a, CONST char *b) 852f9f848faSopenharmony_ci#endif 853f9f848faSopenharmony_ci{ 854f9f848faSopenharmony_ci while((*a = *b++)) 855f9f848faSopenharmony_ci a++; 856f9f848faSopenharmony_ci return a; 857f9f848faSopenharmony_ci } 858f9f848faSopenharmony_ci 859f9f848faSopenharmony_ci#ifdef NO_STRING_H 860f9f848faSopenharmony_ci 861f9f848faSopenharmony_ci Char * 862f9f848faSopenharmony_ci#ifdef KR_headers 863f9f848faSopenharmony_cimemcpy_D2A(a, b, len) Char *a; Char *b; size_t len; 864f9f848faSopenharmony_ci#else 865f9f848faSopenharmony_cimemcpy_D2A(void *a1, void *b1, size_t len) 866f9f848faSopenharmony_ci#endif 867f9f848faSopenharmony_ci{ 868f9f848faSopenharmony_ci char *a = (char*)a1, *ae = a + len; 869f9f848faSopenharmony_ci char *b = (char*)b1, *a0 = a; 870f9f848faSopenharmony_ci while(a < ae) 871f9f848faSopenharmony_ci *a++ = *b++; 872f9f848faSopenharmony_ci return a0; 873f9f848faSopenharmony_ci } 874f9f848faSopenharmony_ci 875f9f848faSopenharmony_ci#endif /* NO_STRING_H */ 876