|
|
1.1 root 1: /* longlong.h -- definitions for mixed size 32/64 bit arithmetic. 1.1.1.3 ! root 2: Copyright (C) 1991, 1992 Free Software Foundation, Inc. 1.1 root 3: 4: This definition file is free software; you can redistribute it 5: and/or modify it under the terms of the GNU General Public 6: License as published by the Free Software Foundation; either 7: version 2, or (at your option) any later version. 8: 9: This definition file is distributed in the hope that it will be 10: useful, but WITHOUT ANY WARRANTY; without even the implied 11: warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 12: See the GNU General Public License for more details. 13: 14: You should have received a copy of the GNU General Public License 15: along with this program; if not, write to the Free Software 16: Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ 17: 18: #ifndef LONG_TYPE_SIZE 19: #define LONG_TYPE_SIZE 32 20: #endif 21: 22: #define __BITS4 (LONG_TYPE_SIZE / 4) 23: #define __ll_B (1L << (LONG_TYPE_SIZE / 2)) 24: #define __ll_lowpart(t) ((unsigned long int) (t) % __ll_B) 25: #define __ll_highpart(t) ((unsigned long int) (t) / __ll_B) 26: 1.1.1.2 root 27: /* Define auxiliary asm macros. 1.1 root 28: 29: 1) umul_ppmm(high_prod, low_prod, multipler, multiplicand) 30: multiplies two unsigned long integers MULTIPLER and MULTIPLICAND, 31: and generates a two unsigned word product in HIGH_PROD and 32: LOW_PROD. 33: 34: 2) __umulsidi3(a,b) multiplies two unsigned long integers A and B, 35: and returns a long long product. This is just a variant of umul_ppmm. 36: 37: 3) udiv_qrnnd(quotient, remainder, high_numerator, low_numerator, 38: denominator) divides a two-word unsigned integer, composed by the 39: integers HIGH_NUMERATOR and LOW_NUMERATOR, by DENOMINATOR and 40: places the quotient in QUOTIENT and the remainder in REMAINDER. 41: HIGH_NUMERATOR must be less than DENOMINATOR for correct operation. 42: If, in addition, the most significant bit of DENOMINATOR must be 1, 43: then the pre-processor symbol UDIV_NEEDS_NORMALIZATION is defined to 1. 44: 45: 4) count_leading_zeros(count, x) counts the number of zero-bits from 46: the msb to the first non-zero bit. This is the number of steps X 47: needs to be shifted left to set the msb. Undefined for X == 0. 48: 49: 5) add_ssaaaa(high_sum, low_sum, high_addend_1, low_addend_1, 50: high_addend_2, low_addend_2) adds two two-word unsigned integers, 51: composed by HIGH_ADDEND_1 and LOW_ADDEND_1, and HIGH_ADDEND_2 and 52: LOW_ADDEND_2 respectively. The result is placed in HIGH_SUM and 53: LOW_SUM. Overflow (i.e. carry out) is not stored anywhere, and is 54: lost. 55: 56: 6) sub_ddmmss(high_difference, low_difference, high_minuend, 57: low_minuend, high_subtrahend, low_subtrahend) subtracts two 58: two-word unsigned integers, composed by HIGH_MINUEND_1 and 59: LOW_MINUEND_1, and HIGH_SUBTRAHEND_2 and LOW_SUBTRAHEND_2 60: respectively. The result is placed in HIGH_DIFFERENCE and 61: LOW_DIFFERENCE. Overflow (i.e. carry out) is not stored anywhere, 62: and is lost. 63: 64: If any of these macros are left undefined for a particular CPU, 65: C macros are used. */ 66: 67: /* The CPUs come in alphabetical order below. 68: 69: Please add support for more CPUs here, or improve the current support 70: for the CPUs below! 1.1.1.3 ! root 71: (E.g. WE32100, i960, IBM360.) */ 1.1 root 72: 73: #if defined (__GNUC__) && !defined (NO_ASM) 74: 1.1.1.3 ! root 75: /* We sometimes need to clobber "cc" with gcc2, but that would not be ! 76: understood by gcc1. Use cpp to avoid major code duplication. */ ! 77: #if __GNUC__ < 2 ! 78: #define __CLOBBER_CC ! 79: #define __AND_CLOBBER_CC ! 80: #else /* __GNUC__ >= 2 */ ! 81: #define __CLOBBER_CC : "cc" ! 82: #define __AND_CLOBBER_CC , "cc" ! 83: #endif /* __GNUC__ < 2 */ ! 84: 1.1 root 85: #if defined (__a29k__) || defined (___AM29K__) 86: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ 87: __asm__ ("add %1,%4,%5 88: addc %0,%2,%3" \ 1.1.1.3 ! root 89: : "=r" ((unsigned long int)(sh)), \ ! 90: "=&r" ((unsigned long int)(sl)) \ ! 91: : "%r" ((unsigned long int)(ah)), \ ! 92: "rI" ((unsigned long int)(bh)), \ ! 93: "%r" ((unsigned long int)(al)), \ ! 94: "rI" ((unsigned long int)(bl))) 1.1 root 95: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ 96: __asm__ ("sub %1,%4,%5 97: subc %0,%2,%3" \ 1.1.1.3 ! root 98: : "=r" ((unsigned long int)(sh)), \ ! 99: "=&r" ((unsigned long int)(sl)) \ ! 100: : "r" ((unsigned long int)(ah)), \ ! 101: "rI" ((unsigned long int)(bh)), \ ! 102: "r" ((unsigned long int)(al)), \ ! 103: "rI" ((unsigned long int)(bl))) 1.1 root 104: #define umul_ppmm(xh, xl, m0, m1) \ 105: do { \ 106: unsigned long int __m0 = (m0), __m1 = (m1); \ 1.1.1.3 ! root 107: __asm__ ("multiplu %0,%1,%2" \ ! 108: : "=r" ((unsigned long int)(xl)) \ ! 109: : "r" (__m0), \ ! 110: "r" (__m1)); \ ! 111: __asm__ ("multmu %0,%1,%2" \ ! 112: : "=r" ((unsigned long int)(xh)) \ ! 113: : "r" (__m0), \ ! 114: "r" (__m1)); \ 1.1 root 115: } while (0) 116: #define udiv_qrnnd(q, r, n1, n0, d) \ 117: __asm__ ("dividu %0,%3,%4" \ 1.1.1.3 ! root 118: : "=r" ((unsigned long int)(q)), \ ! 119: "=q" ((unsigned long int)(r)) \ ! 120: : "1" ((unsigned long int)(n1)), \ ! 121: "r" ((unsigned long int)(n0)), \ ! 122: "r" ((unsigned long int)(d))) 1.1 root 123: #define count_leading_zeros(count, x) \ 1.1.1.3 ! root 124: __asm__ ("clz %0,%1" \ ! 125: : "=r" ((unsigned long int)(count)) \ 1.1 root 126: : "r" ((unsigned long int)(x))) 127: #endif /* __a29k__ */ 128: 129: #if defined (__arm__) 130: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ 131: __asm__ ("adds %1,%4,%5 132: adc %0,%2,%3" \ 1.1.1.3 ! root 133: : "=r" ((unsigned long int)(sh)), \ ! 134: "=&r" ((unsigned long int)(sl)) \ ! 135: : "%r" ((unsigned long int)(ah)), \ ! 136: "rI" ((unsigned long int)(bh)), \ ! 137: "%r" ((unsigned long int)(al)), \ ! 138: "rI" ((unsigned long int)(bl))) 1.1 root 139: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ 140: __asm__ ("subs %1,%4,%5 141: sbc %0,%2,%3" \ 1.1.1.3 ! root 142: : "=r" ((unsigned long int)(sh)), \ ! 143: "=&r" ((unsigned long int)(sl)) \ ! 144: : "r" ((unsigned long int)(ah)), \ ! 145: "rI" ((unsigned long int)(bh)), \ ! 146: "r" ((unsigned long int)(al)), \ ! 147: "rI" ((unsigned long int)(bl))) 1.1 root 148: #endif /* __arm__ */ 149: 150: #if defined (__gmicro__) 151: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ 152: __asm__ ("add.w %5,%1 153: addx %3,%0" \ 1.1.1.3 ! root 154: : "=g" ((unsigned long int)(sh)), \ ! 155: "=&g" ((unsigned long int)(sl)) \ ! 156: : "%0" ((unsigned long int)(ah)), \ ! 157: "g" ((unsigned long int)(bh)), \ ! 158: "%1" ((unsigned long int)(al)), \ ! 159: "g" ((unsigned long int)(bl))) 1.1 root 160: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ 161: __asm__ ("sub.w %5,%1 162: subx %3,%0" \ 1.1.1.3 ! root 163: : "=g" ((unsigned long int)(sh)), \ ! 164: "=&g" ((unsigned long int)(sl)) \ ! 165: : "0" ((unsigned long int)(ah)), \ ! 166: "g" ((unsigned long int)(bh)), \ ! 167: "1" ((unsigned long int)(al)), \ ! 168: "g" ((unsigned long int)(bl))) 1.1 root 169: #define umul_ppmm(ph, pl, m0, m1) \ 170: __asm__ ("mulx %3,%0,%1" \ 1.1.1.3 ! root 171: : "=g" ((unsigned long int)(ph)), \ ! 172: "=r" ((unsigned long int)(pl)) \ ! 173: : "%0" ((unsigned long int)(m0)), \ ! 174: "g" ((unsigned long int)(m1))) 1.1 root 175: #define udiv_qrnnd(q, r, nh, nl, d) \ 176: __asm__ ("divx %4,%0,%1" \ 1.1.1.3 ! root 177: : "=g" ((unsigned long int)(q)), \ ! 178: "=r" ((unsigned long int)(r)) \ ! 179: : "1" ((unsigned long int)(nh)), \ ! 180: "0" ((unsigned long int)(nl)), \ ! 181: "g" ((unsigned long int)(d))) 1.1 root 182: #define count_leading_zeros(count, x) \ 183: __asm__ ("bsch/1 %1,%0" \ 1.1.1.3 ! root 184: : "=g" (count) \ ! 185: : "g" ((unsigned long int)(x)), \ ! 186: "0" (0UL)) 1.1 root 187: #endif 188: 189: #if defined (__hppa) 190: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ 191: __asm__ ("add %4,%5,%1 192: addc %2,%3,%0" \ 1.1.1.3 ! root 193: : "=r" ((unsigned long int)(sh)), \ ! 194: "=&r" ((unsigned long int)(sl)) \ ! 195: : "%rM" ((unsigned long int)(ah)), \ ! 196: "rM" ((unsigned long int)(bh)), \ ! 197: "%rM" ((unsigned long int)(al)), \ ! 198: "rM" ((unsigned long int)(bl))) 1.1 root 199: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ 200: __asm__ ("sub %5,%4,%1 201: subb %3,%2,%0" \ 1.1.1.3 ! root 202: : "=r" ((unsigned long int)(sh)), \ ! 203: "=&r" ((unsigned long int)(sl)) \ ! 204: : "rM" ((unsigned long int)(ah)), \ ! 205: "rM" ((unsigned long int)(bh)), \ ! 206: "rM" ((unsigned long int)(al)), \ ! 207: "rM" ((unsigned long int)(bl))) ! 208: #if defined (_PA_RISC1_1) ! 209: #define umul_ppmm(w1, w0, u, v) \ ! 210: do { \ ! 211: union \ ! 212: { \ ! 213: long long __f; \ ! 214: struct {unsigned long int __w1, __w0;} __w1w0; \ ! 215: } __t; \ ! 216: __asm__ ("xmpyu %1,%2,%0" \ ! 217: : "=x" (__t.__f) \ ! 218: : "x" ((u)), \ ! 219: "x" ((v))); \ ! 220: (w1) = __t.__w1w0.__w1; \ ! 221: (w0) = __t.__w1w0.__w0; \ ! 222: } while (0) ! 223: #define UMUL_TIME 8 ! 224: #else ! 225: #define UMUL_TIME 30 ! 226: #endif ! 227: #define UDIV_TIME 40 1.1 root 228: #endif 229: 230: #if defined (__i386__) || defined (__i486__) 231: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ 232: __asm__ ("addl %5,%1 233: adcl %3,%0" \ 1.1.1.3 ! root 234: : "=r" ((unsigned long int)(sh)), \ ! 235: "=&r" ((unsigned long int)(sl)) \ ! 236: : "%0" ((unsigned long int)(ah)), \ ! 237: "g" ((unsigned long int)(bh)), \ ! 238: "%1" ((unsigned long int)(al)), \ ! 239: "g" ((unsigned long int)(bl))) 1.1 root 240: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ 241: __asm__ ("subl %5,%1 242: sbbl %3,%0" \ 1.1.1.3 ! root 243: : "=r" ((unsigned long int)(sh)), \ ! 244: "=&r" ((unsigned long int)(sl)) \ ! 245: : "0" ((unsigned long int)(ah)), \ ! 246: "g" ((unsigned long int)(bh)), \ ! 247: "1" ((unsigned long int)(al)), \ ! 248: "g" ((unsigned long int)(bl))) 1.1 root 249: #define umul_ppmm(w1, w0, u, v) \ 250: __asm__ ("mull %3" \ 1.1.1.3 ! root 251: : "=a" ((unsigned long int)(w0)), \ ! 252: "=d" ((unsigned long int)(w1)) \ ! 253: : "%0" ((unsigned long int)(u)), \ ! 254: "rm" ((unsigned long int)(v))) 1.1 root 255: #define udiv_qrnnd(q, r, n1, n0, d) \ 256: __asm__ ("divl %4" \ 1.1.1.3 ! root 257: : "=a" ((unsigned long int)(q)), \ ! 258: "=d" ((unsigned long int)(r)) \ ! 259: : "0" ((unsigned long int)(n0)), \ ! 260: "1" ((unsigned long int)(n1)), \ ! 261: "rm" ((unsigned long int)(d))) 1.1 root 262: #define count_leading_zeros(count, x) \ 263: do { \ 264: unsigned long int __cbtmp; \ 265: __asm__ ("bsrl %1,%0" \ 266: : "=r" (__cbtmp) : "rm" ((unsigned long int)(x))); \ 267: (count) = __cbtmp ^ 31; \ 268: } while (0) 1.1.1.3 ! root 269: #define UMUL_TIME 40 ! 270: #define UDIV_TIME 40 1.1 root 271: #endif /* 80x86 */ 272: 273: #if defined (__i860__) 274: #if 0 275: /* Make sure these patterns really improve the code before 276: switching them on. */ 277: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ 278: do { \ 279: union \ 280: { \ 281: long long int ll; \ 282: struct {unsigned long int l, h;} i; \ 283: } __a, __b, __s; \ 284: __a.i.l = (al); __a.i.h = (ah); \ 285: __b.i.l = (bl); __b.i.h = (bh); \ 286: __asm__ ("fiadd.dd %1,%2,%0" \ 287: : "=f" (__s.ll) \ 288: : "%f" (__a.ll), "f" (__b.ll)); \ 289: (sh) = __s.i.h; (sl) = __s.i.l; \ 290: } while (0) 291: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ 292: do { \ 293: union \ 294: { \ 295: long long int ll; \ 296: struct {unsigned long int l, h;} i; \ 297: } __a, __b, __s; \ 298: __a.i.l = (al); __a.i.h = (ah); \ 299: __b.i.l = (bl); __b.i.h = (bh); \ 300: __asm__ ("fisub.dd %1,%2,%0" \ 301: : "=f" (__s.ll) \ 302: : "%f" (__a.ll), "f" (__b.ll)); \ 303: (sh) = __s.i.h; (sl) = __s.i.l; \ 304: } while (0) 305: #endif 306: #endif /* __i860__ */ 307: 308: #if defined (___IBMR2__) /* IBM RS6000 */ 309: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ 1.1.1.3 ! root 310: __asm__ ("a%I5 %1,%4,%5 1.1 root 311: ae %0,%2,%3" \ 1.1.1.3 ! root 312: : "=r" ((unsigned long int)(sh)), \ ! 313: "=&r" ((unsigned long int)(sl)) \ ! 314: : "%r" ((unsigned long int)(ah)), \ ! 315: "r" ((unsigned long int)(bh)), \ ! 316: "%r" ((unsigned long int)(al)), \ ! 317: "rI" ((unsigned long int)(bl))) 1.1 root 318: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ 1.1.1.3 ! root 319: __asm__ ("sf%I4 %1,%5,%4 1.1 root 320: sfe %0,%3,%2" \ 1.1.1.3 ! root 321: : "=r" ((unsigned long int)(sh)), \ ! 322: "=&r" ((unsigned long int)(sl)) \ ! 323: : "r" ((unsigned long int)(ah)), \ ! 324: "r" ((unsigned long int)(bh)), \ ! 325: "rI" ((unsigned long int)(al)), \ ! 326: "r" ((unsigned long int)(bl))) 1.1 root 327: #define umul_ppmm(xh, xl, m0, m1) \ 328: do { \ 329: unsigned long int __m0 = (m0), __m1 = (m1); \ 330: __asm__ ("mul %0,%2,%3" \ 1.1.1.3 ! root 331: : "=r" ((unsigned long int)(xh)), \ ! 332: "=q" ((unsigned long int)(xl)) \ ! 333: : "r" (__m0), \ ! 334: "r" (__m1)); \ 1.1 root 335: (xh) += ((((signed long int) __m0 >> 31) & __m1) \ 336: + (((signed long int) __m1 >> 31) & __m0)); \ 337: } while (0) 1.1.1.3 ! root 338: #define smul_ppmm(xh, xl, m0, m1) \ ! 339: __asm__ ("mul %0,%2,%3" \ ! 340: : "=r" ((unsigned long int)(xh)), \ ! 341: "=q" ((unsigned long int)(xl)) \ ! 342: : "r" (m0), \ ! 343: "r" (m1)) 1.1 root 344: #define UMUL_TIME 8 1.1.1.3 ! root 345: #define sdiv_qrnnd(q, r, nh, nl, d) \ ! 346: __asm__ ("div %0,%2,%4" \ ! 347: : "=r" (q), "=q" (r) \ ! 348: : "r" (nh), "1" (nl), "r" (d)) 1.1 root 349: #define UDIV_TIME 40 350: #define UDIV_NEEDS_NORMALIZATION 1 351: #define count_leading_zeros(count, x) \ 352: __asm__ ("cntlz %0,%1" \ 1.1.1.3 ! root 353: : "=r" ((unsigned long int)(count)) \ ! 354: : "r" ((unsigned long int)(x))) 1.1 root 355: #endif /* ___IBMR2__ */ 356: 357: #if defined (__mc68000__) 358: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ 359: __asm__ ("add%.l %5,%1 360: addx%.l %3,%0" \ 1.1.1.3 ! root 361: : "=d" ((unsigned long int)(sh)), \ ! 362: "=&d" ((unsigned long int)(sl)) \ ! 363: : "%0" ((unsigned long int)(ah)), \ ! 364: "d" ((unsigned long int)(bh)), \ ! 365: "%1" ((unsigned long int)(al)), \ ! 366: "g" ((unsigned long int)(bl))) 1.1 root 367: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ 368: __asm__ ("sub%.l %5,%1 369: subx%.l %3,%0" \ 1.1.1.3 ! root 370: : "=d" ((unsigned long int)(sh)), \ ! 371: "=&d" ((unsigned long int)(sl)) \ ! 372: : "0" ((unsigned long int)(ah)), \ ! 373: "d" ((unsigned long int)(bh)), \ ! 374: "1" ((unsigned long int)(al)), \ ! 375: "g" ((unsigned long int)(bl))) 1.1 root 376: #if defined (__mc68020__) || defined (__NeXT__) || defined(mc68020) 377: #define umul_ppmm(w1, w0, u, v) \ 378: __asm__ ("mulu%.l %3,%1:%0" \ 1.1.1.3 ! root 379: : "=d" ((unsigned long int)(w0)), \ ! 380: "=d" ((unsigned long int)(w1)) \ ! 381: : "%0" ((unsigned long int)(u)), \ ! 382: "dmi" ((unsigned long int)(v))) ! 383: #define UMUL_TIME 45 1.1 root 384: #define udiv_qrnnd(q, r, n1, n0, d) \ 385: __asm__ ("divu%.l %4,%1:%0" \ 1.1.1.3 ! root 386: : "=d" ((unsigned long int)(q)), \ ! 387: "=d" ((unsigned long int)(r)) \ ! 388: : "0" ((unsigned long int)(n0)), \ ! 389: "1" ((unsigned long int)(n1)), \ ! 390: "dmi" ((unsigned long int)(d))) ! 391: #define UDIV_TIME 90 ! 392: #define sdiv_qrnnd(q, r, n1, n0, d) \ ! 393: __asm__ ("divs%.l %4,%1:%0" \ ! 394: : "=d" ((unsigned long int)(q)), \ ! 395: "=d" ((unsigned long int)(r)) \ ! 396: : "0" ((unsigned long int)(n0)), \ ! 397: "1" ((unsigned long int)(n1)), \ ! 398: "dmi" ((unsigned long int)(d))) 1.1 root 399: #define count_leading_zeros(count, x) \ 400: __asm__ ("bfffo %1{%b2:%b2},%0" \ 1.1.1.3 ! root 401: : "=d" ((unsigned long int)(count)) \ ! 402: : "od" ((unsigned long int)(x)), "n" (0)) 1.1 root 403: #else /* not mc68020 */ 404: #define umul_ppmm(xh, xl, a, b) \ 405: __asm__ ("| Inlined umul_ppmm 406: movel %2,d0 407: movel %3,d1 408: movel d0,d2 409: swap d0 410: movel d1,d3 411: swap d1 412: movew d2,d4 413: mulu d3,d4 414: mulu d1,d2 415: mulu d0,d3 416: mulu d0,d1 417: movel d4,d0 418: eorw d0,d0 419: swap d0 420: addl d0,d2 421: addl d3,d2 422: jcc 1f 423: addl #65536,d1 424: 1: swap d2 425: moveq #0,d0 426: movew d2,d0 427: movew d4,d2 428: movel d2,%1 429: addl d1,d0 430: movel d0,%0" \ 1.1.1.3 ! root 431: : "=g" ((unsigned long int)(xh)), \ ! 432: "=g" ((unsigned long int)(xl)) \ ! 433: : "g" ((unsigned long int)(a)), \ ! 434: "g" ((unsigned long int)(b)) \ ! 435: : "d0", "d1", "d2", "d3", "d4") ! 436: #define UMUL_TIME 100 ! 437: #define UDIV_TIME 400 1.1 root 438: #endif /* not mc68020 */ 439: #endif /* mc68000 */ 440: 441: #if defined (__m88000__) 442: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ 443: __asm__ ("addu.co %1,%r4,%r5 444: addu.ci %0,%r2,%r3" \ 1.1.1.3 ! root 445: : "=r" ((unsigned long int)(sh)), \ ! 446: "=&r" ((unsigned long int)(sl)) \ ! 447: : "%rJ" ((unsigned long int)(ah)), \ ! 448: "rJ" ((unsigned long int)(bh)), \ ! 449: "%rJ" ((unsigned long int)(al)), \ ! 450: "rJ" ((unsigned long int)(bl))) 1.1 root 451: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ 452: __asm__ ("subu.co %1,%r4,%r5 453: subu.ci %0,%r2,%r3" \ 1.1.1.3 ! root 454: : "=r" ((unsigned long int)(sh)), \ ! 455: "=&r" ((unsigned long int)(sl)) \ ! 456: : "rJ" ((unsigned long int)(ah)), \ ! 457: "rJ" ((unsigned long int)(bh)), \ ! 458: "rJ" ((unsigned long int)(al)), \ ! 459: "rJ" ((unsigned long int)(bl))) 1.1 root 460: #define UMUL_TIME 17 461: #define UDIV_TIME 150 462: #define count_leading_zeros(count, x) \ 463: do { \ 464: unsigned long int __cbtmp; \ 465: __asm__ ("ff1 %0,%1" \ 1.1.1.3 ! root 466: : "=r" (__cbtmp) \ ! 467: : "r" ((unsigned long int)(x))); \ 1.1 root 468: (count) = __cbtmp ^ 31; \ 469: } while (0) 1.1.1.3 ! root 470: #if defined (__mc88110__) ! 471: #define umul_ppmm(w1, w0, u, v) \ ! 472: __asm__ ("mulu.d r10,%2,%3 ! 473: or %0,r10,0 ! 474: or %1,r11,0" \ ! 475: : "=r" (w1), \ ! 476: "=r" (w0) \ ! 477: : "r" (u), \ ! 478: "r" (v) \ ! 479: : "r10", "r11") ! 480: #define udiv_qrnnd(q, r, n1, n0, d) \ ! 481: __asm__ ("or r10,%2,0 ! 482: or r11,%3,0 ! 483: divu.d r10,r10,%4 ! 484: mulu %1,%4,r11 ! 485: subu %1,%3,%1 ! 486: or %0,r11,0" \ ! 487: : "=r" (q), \ ! 488: "=&r" (r) \ ! 489: : "r" (n1), \ ! 490: "r" (n0), \ ! 491: "r" (d) \ ! 492: : "r10", "r11") ! 493: #endif 1.1 root 494: #endif /* __m88000__ */ 495: 496: #if defined (__mips__) 497: #define umul_ppmm(w1, w0, u, v) \ 498: __asm__ ("multu %2,%3 499: mflo %0 500: mfhi %1" \ 1.1.1.3 ! root 501: : "=d" ((unsigned long int)(w0)), \ ! 502: "=d" ((unsigned long int)(w1)) \ ! 503: : "d" ((unsigned long int)(u)), \ ! 504: "d" ((unsigned long int)(v))) 1.1 root 505: #define UMUL_TIME 5 506: #define UDIV_TIME 100 507: #endif /* __mips__ */ 508: 509: #if defined (__ns32000__) 510: #define __umulsidi3(u, v) \ 511: ({long long int __w; \ 1.1.1.3 ! root 512: __asm__ ("meid %2,%0" \ ! 513: : "=g" (__w) \ ! 514: : "%0" ((unsigned long int)(u)), \ ! 515: "g" ((unsigned long int)(v))); \ ! 516: __w; }) 1.1 root 517: #define div_qrnnd(q, r, n1, n0, d) \ 518: __asm__ ("movd %2,r0 519: movd %3,r1 520: deid %4,r0 521: movd r1,%0 522: movd r0,%1" \ 1.1.1.3 ! root 523: : "=g" ((unsigned long int)(q)), \ ! 524: "=g" ((unsigned long int)(r)) \ ! 525: : "g" ((unsigned long int)(n0)), \ ! 526: "g" ((unsigned long int)(n1)), \ ! 527: "g" ((unsigned long int)(d)) \ ! 528: : "r0", "r1") 1.1 root 529: #endif /* __ns32000__ */ 530: 531: #if defined (__pyr__) 532: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ 533: __asm__ ("addw %5,%1 534: addwc %3,%0" \ 1.1.1.3 ! root 535: : "=r" ((unsigned long int)(sh)), \ ! 536: "=&r" ((unsigned long int)(sl)) \ ! 537: : "%0" ((unsigned long int)(ah)), \ ! 538: "g" ((unsigned long int)(bh)), \ ! 539: "%1" ((unsigned long int)(al)), \ ! 540: "g" ((unsigned long int)(bl))) 1.1 root 541: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ 542: __asm__ ("subw %5,%1 543: subwb %3,%0" \ 1.1.1.3 ! root 544: : "=r" ((unsigned long int)(sh)), \ ! 545: "=&r" ((unsigned long int)(sl)) \ ! 546: : "0" ((unsigned long int)(ah)), \ ! 547: "g" ((unsigned long int)(bh)), \ ! 548: "1" ((unsigned long int)(al)), \ ! 549: "g" ((unsigned long int)(bl))) 1.1 root 550: /* This insn doesn't work on ancient pyramids. */ 551: #define umul_ppmm(w1, w0, u, v) \ 1.1.1.3 ! root 552: ({union {long long int ll;struct {unsigned long int h, l;} i;} __xx; \ ! 553: __xx.i.l = u; \ ! 554: __asm__ ("uemul %3,%0" \ ! 555: : "=r" (__xx.i.h), \ ! 556: "=r" (__xx.i.l) \ ! 557: : "1" (__xx.i.l), \ ! 558: "g" (v)); \ ! 559: (w1) = __xx.i.h; (w0) = __xx.i.l;}) 1.1 root 560: #endif /* __pyr__ */ 561: 562: #if defined (__ibm032__) /* RT/ROMP */ 563: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ 564: __asm__ ("a %1,%5 565: ae %0,%3" \ 1.1.1.3 ! root 566: : "=r" ((unsigned long int)(sh)), \ ! 567: "=&r" ((unsigned long int)(sl)) \ ! 568: : "%0" ((unsigned long int)(ah)), \ ! 569: "r" ((unsigned long int)(bh)), \ ! 570: "%1" ((unsigned long int)(al)), \ ! 571: "r" ((unsigned long int)(bl))) 1.1 root 572: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ 573: __asm__ ("s %1,%5 574: se %0,%3" \ 1.1.1.3 ! root 575: : "=r" ((unsigned long int)(sh)), \ ! 576: "=&r" ((unsigned long int)(sl)) \ ! 577: : "0" ((unsigned long int)(ah)), \ ! 578: "r" ((unsigned long int)(bh)), \ ! 579: "1" ((unsigned long int)(al)), \ ! 580: "r" ((unsigned long int)(bl))) 1.1 root 581: #define umul_ppmm(ph, pl, m0, m1) \ 582: do { \ 583: unsigned long int __m0 = (m0), __m1 = (m1); \ 584: __asm__ ( \ 585: "s r2,r2 586: mts r10,%2 587: m r2,%3 588: m r2,%3 589: m r2,%3 590: m r2,%3 591: m r2,%3 592: m r2,%3 593: m r2,%3 594: m r2,%3 595: m r2,%3 596: m r2,%3 597: m r2,%3 598: m r2,%3 599: m r2,%3 600: m r2,%3 601: m r2,%3 602: m r2,%3 603: cas %0,r2,r0 604: mfs r10,%1" \ 1.1.1.3 ! root 605: : "=r" ((unsigned long int)(ph)), \ ! 606: "=r" ((unsigned long int)(pl)) \ ! 607: : "%r" (__m0), \ ! 608: "r" (__m1) \ ! 609: : "r2"); \ 1.1 root 610: (ph) += ((((signed long int) __m0 >> 31) & __m1) \ 611: + (((signed long int) __m1 >> 31) & __m0)); \ 612: } while (0) 1.1.1.3 ! root 613: #define UMUL_TIME 20 ! 614: #define UDIV_TIME 200 1.1 root 615: #define count_leading_zeros(count, x) \ 616: do { \ 617: if ((x) >= 0x10000) \ 618: __asm__ ("clz %0,%1" \ 619: : "=r" ((unsigned long int)(count)) \ 620: : "r" ((unsigned long int)(x) >> 16)); \ 621: else \ 622: { \ 623: __asm__ ("clz %0,%1" \ 624: : "=r" ((unsigned long int)(count)) \ 625: : "r" ((unsigned long int)(x))); \ 626: (count) += 16; \ 627: } \ 628: } while (0) 629: #endif 630: 631: #if defined (__sparc__) 632: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ 633: __asm__ ("addcc %4,%5,%1 634: addx %2,%3,%0" \ 1.1.1.3 ! root 635: : "=r" ((unsigned long int)(sh)), \ ! 636: "=&r" ((unsigned long int)(sl)) \ ! 637: : "%r" ((unsigned long int)(ah)), \ ! 638: "rI" ((unsigned long int)(bh)), \ ! 639: "%r" ((unsigned long int)(al)), \ ! 640: "rI" ((unsigned long int)(bl)) \ ! 641: __CLOBBER_CC) 1.1 root 642: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ 643: __asm__ ("subcc %4,%5,%1 644: subx %2,%3,%0" \ 1.1.1.3 ! root 645: : "=r" ((unsigned long int)(sh)), \ ! 646: "=&r" ((unsigned long int)(sl)) \ ! 647: : "r" ((unsigned long int)(ah)), \ ! 648: "rI" ((unsigned long int)(bh)), \ ! 649: "r" ((unsigned long int)(al)), \ ! 650: "rI" ((unsigned long int)(bl)) \ ! 651: __CLOBBER_CC) ! 652: #if defined (__sparcv8__) 1.1 root 653: #define umul_ppmm(w1, w0, u, v) \ 654: __asm__ ("umul %2,%3,%1;rd %%y,%0" \ 1.1.1.3 ! root 655: : "=r" ((unsigned long int)(w1)), \ ! 656: "=r" ((unsigned long int)(w0)) \ ! 657: : "r" ((unsigned long int)(u)), \ ! 658: "r" ((unsigned long int)(v))) 1.1 root 659: #define udiv_qrnnd(q, r, n1, n0, d) \ 660: __asm__ ("mov %2,%%y;nop;nop;nop;udiv %3,%4,%0;umul %0,%4,%1;sub %3,%1,%1"\ 1.1.1.3 ! root 661: : "=&r" ((unsigned long int)(q)), \ ! 662: "=&r" ((unsigned long int)(r)) \ ! 663: : "r" ((unsigned long int)(n1)), \ ! 664: "r" ((unsigned long int)(n0)), \ ! 665: "r" ((unsigned long int)(d))) 1.1 root 666: #else 667: /* SPARC without integer multiplication and divide instructions. 668: (i.e. at least Sun4/20,40,60,65,75,110,260,280,330,360,380,470,490) */ 669: #define umul_ppmm(w1, w0, u, v) \ 670: __asm__ ("! Inlined umul_ppmm 671: wr %%g0,%2,%%y ! SPARC has 0-3 delay insn after a wr 672: sra %3,31,%%g2 ! Don't move this insn 673: and %2,%%g2,%%g2 ! Don't move this insn 674: andcc %%g0,0,%%g1 ! Don't move this insn 675: mulscc %%g1,%3,%%g1 676: mulscc %%g1,%3,%%g1 677: mulscc %%g1,%3,%%g1 678: mulscc %%g1,%3,%%g1 679: mulscc %%g1,%3,%%g1 680: mulscc %%g1,%3,%%g1 681: mulscc %%g1,%3,%%g1 682: mulscc %%g1,%3,%%g1 683: mulscc %%g1,%3,%%g1 684: mulscc %%g1,%3,%%g1 685: mulscc %%g1,%3,%%g1 686: mulscc %%g1,%3,%%g1 687: mulscc %%g1,%3,%%g1 688: mulscc %%g1,%3,%%g1 689: mulscc %%g1,%3,%%g1 690: mulscc %%g1,%3,%%g1 691: mulscc %%g1,%3,%%g1 692: mulscc %%g1,%3,%%g1 693: mulscc %%g1,%3,%%g1 694: mulscc %%g1,%3,%%g1 695: mulscc %%g1,%3,%%g1 696: mulscc %%g1,%3,%%g1 697: mulscc %%g1,%3,%%g1 698: mulscc %%g1,%3,%%g1 699: mulscc %%g1,%3,%%g1 700: mulscc %%g1,%3,%%g1 701: mulscc %%g1,%3,%%g1 702: mulscc %%g1,%3,%%g1 703: mulscc %%g1,%3,%%g1 704: mulscc %%g1,%3,%%g1 705: mulscc %%g1,%3,%%g1 706: mulscc %%g1,%3,%%g1 707: mulscc %%g1,0,%%g1 708: add %%g1,%%g2,%0 709: rd %%y,%1" \ 1.1.1.3 ! root 710: : "=r" ((unsigned long int)(w1)), \ ! 711: "=r" ((unsigned long int)(w0)) \ ! 712: : "%rI" ((unsigned long int)(u)), \ ! 713: "r" ((unsigned long int)(v)) \ ! 714: : "%g1", "%g2" __AND_CLOBBER_CC) 1.1 root 715: #define UMUL_TIME 39 /* 39 instructions */ 716: /* It's quite necessary to add this much assembler for the sparc. 717: The default udiv_qrnnd (in C) is more than 10 times slower! */ 718: #define udiv_qrnnd(q, r, n1, n0, d) \ 719: __asm__ ("! Inlined udiv_qrnnd 720: mov 32,%%g1 721: subcc %1,%2,%%g0 722: 1: bcs 5f 723: addxcc %0,%0,%0 ! shift n1n0 and a q-bit in lsb 724: sub %1,%2,%1 ! this kills msb of n 725: addx %1,%1,%1 ! so this can't give carry 726: subcc %%g1,1,%%g1 727: 2: bne 1b 728: subcc %1,%2,%%g0 729: bcs 3f 730: addxcc %0,%0,%0 ! shift n1n0 and a q-bit in lsb 731: b 3f 732: sub %1,%2,%1 ! this kills msb of n 733: 4: sub %1,%2,%1 734: 5: addxcc %1,%1,%1 735: bcc 2b 736: subcc %%g1,1,%%g1 737: ! Got carry from n. Subtract next step to cancel this carry. 738: bne 4b 739: addcc %0,%0,%0 ! shift n1n0 and a 0-bit in lsb 740: sub %1,%2,%1 741: 3: xnor %0,0,%0 742: ! End of inline udiv_qrnnd" \ 1.1.1.3 ! root 743: : "=&r" ((unsigned long int)(q)), \ ! 744: "=&r" ((unsigned long int)(r)) \ ! 745: : "r" ((unsigned long int)(d)), \ ! 746: "1" ((unsigned long int)(n1)), \ ! 747: "0" ((unsigned long int)(n0)) : "%g1" __AND_CLOBBER_CC) 1.1 root 748: #define UDIV_TIME (3+7*32) /* 7 instructions/iteration. 32 iterations. */ 749: #endif /* __sparc8__ */ 1.1.1.3 ! root 750: #endif /* __sparc__ */ 1.1 root 751: 752: #if defined (__vax__) 753: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ 754: __asm__ ("addl2 %5,%1 755: adwc %3,%0" \ 1.1.1.3 ! root 756: : "=g" ((unsigned long int)(sh)), \ ! 757: "=&g" ((unsigned long int)(sl)) \ ! 758: : "%0" ((unsigned long int)(ah)), \ ! 759: "g" ((unsigned long int)(bh)), \ ! 760: "%1" ((unsigned long int)(al)), \ ! 761: "g" ((unsigned long int)(bl))) 1.1 root 762: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ 763: __asm__ ("subl2 %5,%1 764: sbwc %3,%0" \ 1.1.1.3 ! root 765: : "=g" ((unsigned long int)(sh)), \ ! 766: "=&g" ((unsigned long int)(sl)) \ ! 767: : "0" ((unsigned long int)(ah)), \ ! 768: "g" ((unsigned long int)(bh)), \ ! 769: "1" ((unsigned long int)(al)), \ ! 770: "g" ((unsigned long int)(bl))) 1.1 root 771: #define umul_ppmm(xh, xl, m0, m1) \ 772: do { \ 773: union {long long int ll;struct {unsigned long int l, h;} i;} __xx; \ 774: unsigned long int __m0 = (m0), __m1 = (m1); \ 775: __asm__ ("emul %1,%2,$0,%0" \ 1.1.1.3 ! root 776: : "=r" (__xx.ll) \ ! 777: : "g" (__m0), \ ! 778: "g" (__m1)); \ 1.1 root 779: (xh) = __xx.i.h; (xl) = __xx.i.l; \ 780: (xh) += ((((signed long int) __m0 >> 31) & __m1) \ 781: + (((signed long int) __m1 >> 31) & __m0)); \ 782: } while (0) 783: #endif /* __vax__ */ 784: 785: #endif /* __GNUC__ */ 786: 787: /* If this machine has no inline assembler, use C macros. */ 788: 789: #if !defined (add_ssaaaa) 790: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ 791: do { \ 792: unsigned long int __x; \ 793: __x = (al) + (bl); \ 794: (sh) = (ah) + (bh) + (__x < (al)); \ 795: (sl) = __x; \ 796: } while (0) 797: #endif 798: 799: #if !defined (sub_ddmmss) 800: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ 801: do { \ 802: unsigned long int __x; \ 803: __x = (al) - (bl); \ 804: (sh) = (ah) - (bh) - (__x > (al)); \ 805: (sl) = __x; \ 806: } while (0) 807: #endif 808: 809: #if !defined (umul_ppmm) 810: #define umul_ppmm(w1, w0, u, v) \ 811: do { \ 812: unsigned long int __x0, __x1, __x2, __x3; \ 813: unsigned int __ul, __vl, __uh, __vh; \ 814: \ 815: __ul = __ll_lowpart (u); \ 816: __uh = __ll_highpart (u); \ 817: __vl = __ll_lowpart (v); \ 818: __vh = __ll_highpart (v); \ 819: \ 820: __x0 = (unsigned long int) __ul * __vl; \ 821: __x1 = (unsigned long int) __ul * __vh; \ 822: __x2 = (unsigned long int) __uh * __vl; \ 823: __x3 = (unsigned long int) __uh * __vh; \ 824: \ 825: __x1 += __ll_highpart (__x0);/* this can't give carry */ \ 826: __x1 += __x2; /* but this indeed can */ \ 827: if (__x1 < __x2) /* did we get it? */ \ 828: __x3 += __ll_B; /* yes, add it in the proper pos. */ \ 829: \ 830: (w1) = __x3 + __ll_highpart (__x1); \ 831: (w0) = __ll_lowpart (__x1) * __ll_B + __ll_lowpart (__x0); \ 832: } while (0) 833: #endif 834: 835: #if !defined (__umulsidi3) 836: #define __umulsidi3(u, v) \ 837: ({long_long __w; \ 838: umul_ppmm (__w.s.high, __w.s.low, u, v); \ 839: __w.ll; }) 840: #endif 841: 1.1.1.3 ! root 842: /* Define this unconditionally, so it can be used for debugging. */ ! 843: #define __udiv_qrnnd_c(q, r, n1, n0, d) \ 1.1 root 844: do { \ 845: unsigned int __d1, __d0, __q1, __q0; \ 846: unsigned long int __r1, __r0, __m; \ 847: __d1 = __ll_highpart (d); \ 848: __d0 = __ll_lowpart (d); \ 849: \ 850: __r1 = (n1) % __d1; \ 851: __q1 = (n1) / __d1; \ 852: __m = (unsigned long int) __q1 * __d0; \ 853: __r1 = __r1 * __ll_B | __ll_highpart (n0); \ 854: if (__r1 < __m) \ 855: { \ 856: __q1--, __r1 += (d); \ 857: if (__r1 >= (d)) /* i.e. we didn't get carry when adding to __r1 */\ 858: if (__r1 < __m) \ 859: __q1--, __r1 += (d); \ 860: } \ 861: __r1 -= __m; \ 862: \ 863: __r0 = __r1 % __d1; \ 864: __q0 = __r1 / __d1; \ 865: __m = (unsigned long int) __q0 * __d0; \ 866: __r0 = __r0 * __ll_B | __ll_lowpart (n0); \ 867: if (__r0 < __m) \ 868: { \ 869: __q0--, __r0 += (d); \ 870: if (__r0 >= (d)) \ 871: if (__r0 < __m) \ 872: __q0--, __r0 += (d); \ 873: } \ 874: __r0 -= __m; \ 875: \ 876: (q) = (unsigned long int) __q1 * __ll_B | __q0; \ 877: (r) = __r0; \ 878: } while (0) 1.1.1.3 ! root 879: /* If udiv_qrnnd was not defined for this processor, use __udiv_qrnnd_c. */ ! 880: #if !defined (udiv_qrnnd) ! 881: #define UDIV_NEEDS_NORMALIZATION 1 ! 882: #define udiv_qrnnd __udiv_qrnnd_c 1.1 root 883: #endif 884: 885: #if !defined (count_leading_zeros) 886: extern const unsigned char __clz_tab[]; 887: #define count_leading_zeros(count, x) \ 888: do { \ 1.1.1.3 ! root 889: unsigned long int __xr = (x); \ ! 890: unsigned int __a; \ 1.1 root 891: \ 1.1.1.3 ! root 892: if (LONG_TYPE_SIZE <= 32) \ ! 893: { \ ! 894: __a = __xr < (1<<2*__BITS4) \ ! 895: ? (__xr < (1<<__BITS4) ? 0 : __BITS4) \ ! 896: : (__xr < (1<<3*__BITS4) ? 2*__BITS4 : 3*__BITS4); \ ! 897: } \ ! 898: else \ ! 899: { \ ! 900: for (__a = LONG_TYPE_SIZE - 8; __a > 0; __a -= 8) \ ! 901: if (((__xr >> __a) & 0xff) != 0) \ ! 902: break; \ ! 903: } \ 1.1 root 904: \ 1.1.1.3 ! root 905: (count) = LONG_TYPE_SIZE - (__clz_tab[__xr >> __a] + __a); \ 1.1 root 906: } while (0) 907: #endif 908: 909: #ifndef UDIV_NEEDS_NORMALIZATION 910: #define UDIV_NEEDS_NORMALIZATION 0 911: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.