1 typedef long unsigned int size_t;
2 extern void *memset (void *__s, int __c, size_t __n) __attribute__ ((__nothrow__)) __attribute__ ((__nonnull__ (1)));
5 encode (words, low, hi)
10 words[0] = ((low) & (((unsigned long) 1 << ((8 * 8) / 2)) - 1));
11 words[1] = ((unsigned long) (low) >> (8 * 8) / 2);
12 words[2] = ((hi) & (((unsigned long) 1 << ((8 * 8) / 2)) - 1));
13 words[3] = ((unsigned long) (hi) >> (8 * 8) / 2);
17 decode (words, low, hi)
22 *low = words[0] + words[1] * ((unsigned long) 1 << (8 * 8) / 2);
23 *hi = words[2] + words[3] * ((unsigned long) 1 << (8 * 8) / 2);
27 neg_double (l1, h1, lv, hv)
37 return (*hv & h1) < 0;
48 add_double (l1, h1, l2, h2, lv, hv)
58 h = h1 + h2 + (l < l1);
62 return ((~((h1) ^ (h2)) & ((h1) ^ (h))) < 0);
66 mul_double (l1, h1, l2, h2, lv, hv)
77 unsigned long toplow, neglow;
78 long tophigh, neghigh;
80 encode (arg1, l1, h1);
81 encode (arg2, l2, h2);
83 memset ((char *) prod, 0, sizeof prod);
85 for (i = 0; i < 4; i++)
88 for (j = 0; j < 4; j++)
92 carry += arg1[i] * arg2[j];
95 prod[k] = ((carry) & (((unsigned long) 1 << ((8 * 8) / 2)) - 1));
96 carry = ((unsigned long) (carry) >> (8 * 8) / 2);
101 decode (prod, lv, hv);
105 decode (prod + 4, &toplow, &tophigh);
108 neg_double (l2, h2, &neglow, &neghigh);
109 add_double (neglow, neghigh, toplow, tophigh, &toplow, &tophigh);
113 neg_double (l1, h1, &neglow, &neghigh);
114 add_double (neglow, neghigh, toplow, tophigh, &toplow, &tophigh);
116 return (*hv < 0 ? ~(toplow & tophigh) : toplow | tophigh) != 0;