Annotation of gcc/longlong.h, revision 1.1.1.1

1.1       root        1: /* longlong.h -- definitions for mixed size 32/64 bit arithmetic.
                      2:    Copyright (C) 1991 Free Software Foundation, Inc.
                      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: 
                     27: /* Define auxilliary asm macros.
                     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!
                     71:    (E.g. WE32100, HP-PA (xmpyu?), i960, IBM360, TRON.)  */
                     72: 
                     73: #if defined (__GNUC__) && !defined (NO_ASM)
                     74: 
                     75: #if defined (__a29k__) || defined (___AM29K__)
                     76: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                     77:   __asm__ ("add %1,%4,%5
                     78:        addc %0,%2,%3"                                                  \
                     79:         : "=r" ((unsigned long int)(sh)), "=&r" ((unsigned long int)(sl)) \
                     80:         : "%r" ((unsigned long int)(ah)), "rI" ((unsigned long int)(bh)), \
                     81:           "%r" ((unsigned long int)(al)), "rI" ((unsigned long int)(bl)))
                     82: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                     83:   __asm__ ("sub %1,%4,%5
                     84:        subc %0,%2,%3"                                                  \
                     85:         : "=r" ((unsigned long int)(sh)), "=&r" ((unsigned long int)(sl)) \
                     86:         : "r" ((unsigned long int)(ah)), "rI" ((unsigned long int)(bh)), \
                     87:           "r" ((unsigned long int)(al)), "rI" ((unsigned long int)(bl)))
                     88: #define umul_ppmm(xh, xl, m0, m1) \
                     89:   do {                                                                 \
                     90:     unsigned long int __m0 = (m0), __m1 = (m1);                                \
                     91:     __asm__ ("multiplu %0,%1,%2" : "=r" ((unsigned long int)(xl))      \
                     92:             : "r" (__m0), "r" (__m1));                                 \
                     93:     __asm__ ("multmu %0,%1,%2" : "=r" ((unsigned long int)(xh))                \
                     94:             : "r" (__m0), "r" (__m1));                                 \
                     95:   } while (0)
                     96: #define udiv_qrnnd(q, r, n1, n0, d) \
                     97:   __asm__ ("dividu %0,%3,%4"                                           \
                     98:        : "=r" ((unsigned long int)(q)), "=q" ((unsigned long int)(r))  \
                     99:        : "1" ((unsigned long int)(n1)), "r" ((unsigned long int)(n0)), \
                    100:          "r" ((unsigned long int)(d)))
                    101: #define count_leading_zeros(count, x) \
                    102:     __asm__ ("clz %0,%1" : "=r" ((unsigned long int)(count))           \
                    103:             : "r" ((unsigned long int)(x)))
                    104: #endif /* __a29k__ */
                    105: 
                    106: #if defined (__arm__)
                    107: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                    108:   __asm__ ("adds %1,%4,%5
                    109:        adc %0,%2,%3"                                                   \
                    110:        : "=r" ((unsigned long int)(sh)), "=&r" ((unsigned long int)(sl)) \
                    111:        : "%r" ((unsigned long int)(ah)), "rI" ((unsigned long int)(bh)), \
                    112:          "%r" ((unsigned long int)(al)), "rI" ((unsigned long int)(bl)))
                    113: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                    114:   __asm__ ("subs %1,%4,%5
                    115:        sbc %0,%2,%3"                                                   \
                    116:        : "=r" ((unsigned long int)(sh)), "=&r" ((unsigned long int)(sl)) \
                    117:        : "r" ((unsigned long int)(ah)), "rI" ((unsigned long int)(bh)), \
                    118:          "r" ((unsigned long int)(al)), "rI" ((unsigned long int)(bl)))
                    119: #endif /* __arm__ */
                    120: 
                    121: #if defined (__gmicro__)
                    122: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                    123:   __asm__ ("add.w %5,%1
                    124:        addx %3,%0"                                                     \
                    125:        : "=g" ((unsigned long int)(sh)), "=&g" ((unsigned long int)(sl))\
                    126:        : "%0" ((unsigned long int)(ah)), "g" ((unsigned long int)(bh)),        \
                    127:         "%1" ((unsigned long int)(al)), "g" ((unsigned long int)(bl)))
                    128: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                    129:   __asm__ ("sub.w %5,%1
                    130:        subx %3,%0"                                                     \
                    131:        : "=g" ((unsigned long int)(sh)), "=&g" ((unsigned long int)(sl))\
                    132:        : "0" ((unsigned long int)(ah)), "g" ((unsigned long int)(bh)), \
                    133:         "1" ((unsigned long int)(al)), "g" ((unsigned long int)(bl)))
                    134: #define umul_ppmm(ph, pl, m0, m1) \
                    135:   __asm__ ("mulx %3,%0,%1"                                             \
                    136:        : "=g" ((unsigned long int)(ph)), "=r" ((unsigned long int)(pl))\
                    137:        : "%0" ((unsigned long int)(m0)), "g" ((unsigned long int)(m1)))
                    138: #define udiv_qrnnd(q, r, nh, nl, d) \
                    139:   __asm__ ("divx %4,%0,%1"                                             \
                    140:        : "=g" ((unsigned long int)(q)), "=r" ((unsigned long int)(r))  \
                    141:        : "1" ((unsigned long int)(nh)), "0" ((unsigned long int)(nl)), \
                    142:          "g" ((unsigned long int)(d)))
                    143: #define count_leading_zeros(count, x) \
                    144:   __asm__ ("bsch/1 %1,%0"                                              \
                    145:        : "=g" (count)                                                  \
                    146:        : "g" ((unsigned long int)(x)), "0" (0UL))
                    147: #endif
                    148: 
                    149: #if defined (__hppa)
                    150: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                    151:   __asm__ ("add %4,%5,%1
                    152:        addc %2,%3,%0"                                                  \
                    153:        : "=r" ((unsigned long int)(sh)), "=&r" ((unsigned long int)(sl))\
                    154:        : "%r" ((unsigned long int)(ah)), "r" ((unsigned long int)(bh)),\
                    155:          "%r" ((unsigned long int)(al)), "r" ((unsigned long int)(bl)))
                    156: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                    157:   __asm__ ("sub %5,%4,%1
                    158:        subb %3,%2,%0"                                                  \
                    159:        : "=r" ((unsigned long int)(sh)), "=&r" ((unsigned long int)(sl))\
                    160:        : "r" ((unsigned long int)(ah)), "r" ((unsigned long int)(bh)), \
                    161:          "r" ((unsigned long int)(al)), "r" ((unsigned long int)(bl)))
                    162: #endif
                    163: 
                    164: #if defined (__i386__) || defined (__i486__)
                    165: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                    166:   __asm__ ("addl %5,%1
                    167:        adcl %3,%0"                                                     \
                    168:        : "=r" ((unsigned long int)(sh)), "=&r" ((unsigned long int)(sl))\
                    169:        : "%0" ((unsigned long int)(ah)), "g" ((unsigned long int)(bh)),        \
                    170:         "%1" ((unsigned long int)(al)), "g" ((unsigned long int)(bl)))
                    171: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                    172:   __asm__ ("subl %5,%1
                    173:        sbbl %3,%0"                                                     \
                    174:        : "=r" ((unsigned long int)(sh)), "=&r" ((unsigned long int)(sl))\
                    175:        : "0" ((unsigned long int)(ah)), "g" ((unsigned long int)(bh)), \
                    176:         "1" ((unsigned long int)(al)), "g" ((unsigned long int)(bl)))
                    177: #define umul_ppmm(w1, w0, u, v) \
                    178:   __asm__ ("mull %3"                                                   \
                    179:        : "=a" ((unsigned long int)(w0)), "=d" ((unsigned long int)(w1))\
                    180:        : "%0" ((unsigned long int)(u)), "rm" ((unsigned long int)(v)))
                    181: #define udiv_qrnnd(q, r, n1, n0, d) \
                    182:   __asm__ ("divl %4"                                                   \
                    183:        : "=a" ((unsigned long int)(q)), "=d" ((unsigned long int)(r))  \
                    184:        : "0" ((unsigned long int)(n0)), "1" ((unsigned long int)(n1)), \
                    185:          "rm" ((unsigned long int)(d)))
                    186: #define count_leading_zeros(count, x) \
                    187:   do {                                                                 \
                    188:     unsigned long int __cbtmp;                                         \
                    189:     __asm__ ("bsrl %1,%0"                                              \
                    190:             : "=r" (__cbtmp) : "rm" ((unsigned long int)(x)));         \
                    191:     (count) = __cbtmp ^ 31;                                            \
                    192:   } while (0)
                    193: #endif /* 80x86 */
                    194: 
                    195: #if defined (__i860__)
                    196: #if 0
                    197: /* Make sure these patterns really improve the code before
                    198:    switching them on.  */
                    199: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                    200:   do {                                                                 \
                    201:     union                                                              \
                    202:       {                                                                        \
                    203:        long long int ll;                                               \
                    204:        struct {unsigned long int l, h;} i;                             \
                    205:       }  __a, __b, __s;                                                        \
                    206:     __a.i.l = (al); __a.i.h = (ah);                                    \
                    207:     __b.i.l = (bl); __b.i.h = (bh);                                    \
                    208:     __asm__ ("fiadd.dd %1,%2,%0"                                       \
                    209:             : "=f" (__s.ll)                                            \
                    210:             : "%f" (__a.ll), "f" (__b.ll));                            \
                    211:     (sh) = __s.i.h; (sl) = __s.i.l;                                    \
                    212:     } while (0)
                    213: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                    214:   do {                                                                 \
                    215:     union                                                              \
                    216:       {                                                                        \
                    217:        long long int ll;                                               \
                    218:        struct {unsigned long int l, h;} i;                             \
                    219:       }  __a, __b, __s;                                                        \
                    220:     __a.i.l = (al); __a.i.h = (ah);                                    \
                    221:     __b.i.l = (bl); __b.i.h = (bh);                                    \
                    222:     __asm__ ("fisub.dd %1,%2,%0"                                       \
                    223:             : "=f" (__s.ll)                                            \
                    224:             : "%f" (__a.ll), "f" (__b.ll));                            \
                    225:     (sh) = __s.i.h; (sl) = __s.i.l;                                    \
                    226:     } while (0)
                    227: #endif
                    228: #endif /* __i860__ */
                    229: 
                    230: #if defined (___IBMR2__) /* IBM RS6000 */
                    231: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                    232:   __asm__ ("a %1,%4,%5
                    233:        ae %0,%2,%3"                                                    \
                    234:        : "=r" ((unsigned long int)(sh)), "=&r" ((unsigned long int)(sl))\
                    235:        : "%r" ((unsigned long int)(ah)), "r" ((unsigned long int)(bh)),\
                    236:          "%r" ((unsigned long int)(al)), "r" ((unsigned long int)(bl)))
                    237: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                    238:   __asm__ ("sf %1,%5,%4
                    239:        sfe %0,%3,%2"                                                   \
                    240:        : "=r" ((unsigned long int)(sh)), "=&r" ((unsigned long int)(sl))\
                    241:        : "r" ((unsigned long int)(ah)), "r" ((unsigned long int)(bh)), \
                    242:          "r" ((unsigned long int)(al)), "r" ((unsigned long int)(bl)))
                    243: #define umul_ppmm(xh, xl, m0, m1) \
                    244:   do {                                                                 \
                    245:     unsigned long int __m0 = (m0), __m1 = (m1);                                \
                    246:     __asm__ ("mul %0,%2,%3"                                            \
                    247:        : "=r" ((unsigned long int)(xh)), "=q" ((unsigned long int)(xl))\
                    248:        : "r" (__m0), "r" (__m1));                                      \
                    249:     (xh) += ((((signed long int) __m0 >> 31) & __m1)                   \
                    250:             + (((signed long int) __m1 >> 31) & __m0));                \
                    251:   } while (0)
                    252: #define UMUL_TIME 8
                    253: #define udiv_qrnnd(q, r, nh, nl, d) \
                    254:   do { /* Use the signed "div" insn, and adjust the result. */         \
                    255:     unsigned long int __q, __r, __nh, __nl, __d, __xh, __xl;           \
                    256:     __nh = 0;                                                          \
                    257:     __nl = (((unsigned long int)(nh)) << 30) | ((unsigned long int)(nl) >> 2);\
                    258:     __nh = (unsigned long int)(nh) >> 2;                               \
                    259:     __d = ((unsigned long int)(d) >> 1);                               \
                    260:     __asm__ ("div %0,%2,%4"                                            \
                    261:             : "=r" (__q), "=q" (__r)                                   \
                    262:             : "r" (__nh), "1" (__nl), "r" (__d));                      \
                    263:     __q <<= 1;                                                         \
                    264:     __asm__ ("mul %0,%2,%3"                                            \
                    265:             : "=r" (__xh), "=q" (__xl)                                 \
                    266:             : "r" (__q), "r" ((unsigned long int)(d)));                \
                    267:     __xh += (((signed long int) __q >> 31) & (d)) + __q;               \
                    268:     if ((nh) < __xh || ((nh) == __xh && (nl) < __xl))                  \
                    269:       {                                                                        \
                    270:        do                                                              \
                    271:          {                                                             \
                    272:            sub_ddmmss (__xh, __xl, __xh, __xl, 0, (d));                \
                    273:            __q--;                                                      \
                    274:          }                                                             \
                    275:        while ((nh) < __xh || ((nh) == __xh && (nl) < __xl));           \
                    276:        __xl = (nl) - __xl;                                             \
                    277:       }                                                                        \
                    278:     else                                                               \
                    279:       {                                                                        \
                    280:        sub_ddmmss (__xh, __xl, (nh), (nl), __xh, __xl);                \
                    281:        if (__xh != 0)                                                  \
                    282:          {                                                             \
                    283:            do                                                          \
                    284:              {                                                         \
                    285:                sub_ddmmss (__xh, __xl, __xh, __xl, 0, (d));            \
                    286:                __q++;                                                  \
                    287:              }                                                         \
                    288:            while (__xh != 0);                                          \
                    289:          }                                                             \
                    290:        if (__xl >= (d))                                                \
                    291:          {                                                             \
                    292:            __xl -= (d);                                                \
                    293:            __q++;                                                      \
                    294:          }                                                             \
                    295:       }                                                                        \
                    296:     (q) = __q;                                                         \
                    297:     (r) = __xl;                                                                \
                    298:   } while (0)
                    299: #define UDIV_TIME 40
                    300: #define UDIV_NEEDS_NORMALIZATION 1
                    301: #define count_leading_zeros(count, x) \
                    302:   __asm__ ("cntlz %0,%1"                                               \
                    303:        : "=r" ((unsigned long int)(count)) : "r" ((unsigned long int)(x)))
                    304: #endif /* ___IBMR2__ */
                    305: 
                    306: #if defined (__mc68000__)
                    307: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                    308:   __asm__ ("add%.l %5,%1
                    309:        addx%.l %3,%0"                                                  \
                    310:        : "=d" ((unsigned long int)(sh)), "=&d" ((unsigned long int)(sl))\
                    311:        : "%0" ((unsigned long int)(ah)), "d" ((unsigned long int)(bh)),        \
                    312:         "%1" ((unsigned long int)(al)), "g" ((unsigned long int)(bl)))
                    313: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                    314:   __asm__ ("sub%.l %5,%1
                    315:        subx%.l %3,%0"                                                  \
                    316:        : "=d" ((unsigned long int)(sh)), "=&d" ((unsigned long int)(sl))\
                    317:        : "0" ((unsigned long int)(ah)), "d" ((unsigned long int)(bh)), \
                    318:         "1" ((unsigned long int)(al)), "g" ((unsigned long int)(bl)))
                    319: #if defined (__mc68020__) || defined (__NeXT__) || defined(mc68020)
                    320: #define umul_ppmm(w1, w0, u, v) \
                    321:   __asm__ ("mulu%.l %3,%1:%0"                                          \
                    322:        : "=d" ((unsigned long int)(w0)), "=d" ((unsigned long int)(w1))\
                    323:        : "%0" ((unsigned long int)(u)), "dmi" ((unsigned long int)(v)))
                    324: #define udiv_qrnnd(q, r, n1, n0, d) \
                    325:   __asm__ ("divu%.l %4,%1:%0"                                          \
                    326:        : "=d" ((unsigned long int)(q)), "=d" ((unsigned long int)(r))  \
                    327:        : "0" ((unsigned long int)(n0)), "1" ((unsigned long int)(n1)), \
                    328:          "dmi" ((unsigned long int)(d)))
                    329: #define count_leading_zeros(count, x) \
                    330:   __asm__ ("bfffo %1{%b2:%b2},%0"                                      \
                    331:        : "=d" ((unsigned long int)(count))                             \
                    332:        : "od" ((unsigned long int)(x)), "n" (0))
                    333: #else /* not mc68020 */
                    334: #define umul_ppmm(xh, xl, a, b) \
                    335:   __asm__ ("| Inlined umul_ppmm
                    336:        movel   %2,d0
                    337:        movel   %3,d1
                    338:        movel   d0,d2
                    339:        swap    d0
                    340:        movel   d1,d3
                    341:        swap    d1
                    342:        movew   d2,d4
                    343:        mulu    d3,d4
                    344:        mulu    d1,d2
                    345:        mulu    d0,d3
                    346:        mulu    d0,d1
                    347:        movel   d4,d0
                    348:        eorw    d0,d0
                    349:        swap    d0
                    350:        addl    d0,d2
                    351:        addl    d3,d2
                    352:        jcc     1f
                    353:        addl    #65536,d1
                    354: 1:     swap    d2
                    355:        moveq   #0,d0
                    356:        movew   d2,d0
                    357:        movew   d4,d2
                    358:        movel   d2,%1
                    359:        addl    d1,d0
                    360:        movel   d0,%0"                                                  \
                    361:        : "=g" ((unsigned long int)(xh)), "=g" ((unsigned long int)(xl))        \
                    362:        :"g" ((unsigned long int)(a)), "g" ((unsigned long int)(b))     \
                    363:        : "d0", "d1", "d2", "d3", "d4")
                    364: #endif /* not mc68020 */
                    365: #endif /* mc68000 */
                    366: 
                    367: #if defined (__m88000__)
                    368: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                    369:   __asm__ ("addu.co %1,%r4,%r5
                    370:        addu.ci %0,%r2,%r3"                                             \
                    371:        : "=r" ((unsigned long int)(sh)), "=&r" ((unsigned long int)(sl))\
                    372:        : "%rJ" ((unsigned long int)(ah)), "rJ" ((unsigned long int)(bh)),\
                    373:          "%rJ" ((unsigned long int)(al)), "rJ" ((unsigned long int)(bl)))
                    374: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                    375:   __asm__ ("subu.co %1,%r4,%r5
                    376:        subu.ci %0,%r2,%r3"                                             \
                    377:        : "=r" ((unsigned long int)(sh)), "=&r" ((unsigned long int)(sl))\
                    378:        : "rJ" ((unsigned long int)(ah)), "rJ" ((unsigned long int)(bh)),\
                    379:          "rJ" ((unsigned long int)(al)), "rJ" ((unsigned long int)(bl)))
                    380: #define UMUL_TIME 17
                    381: #define UDIV_TIME 150
                    382: #define count_leading_zeros(count, x) \
                    383:   do {                                                                 \
                    384:     unsigned long int __cbtmp;                                         \
                    385:     __asm__ ("ff1 %0,%1"                                               \
                    386:             : "=r" (__cbtmp) : "r" ((unsigned long int)(x)));          \
                    387:     (count) = __cbtmp ^ 31;                                            \
                    388:   } while (0)
                    389: #endif /* __m88000__ */
                    390: 
                    391: #if defined (__mips__)
                    392: #define umul_ppmm(w1, w0, u, v) \
                    393:   __asm__ ("multu %2,%3
                    394:        mflo %0
                    395:        mfhi %1"                                                        \
                    396:        : "=r" ((unsigned long int)(w0)), "=r" ((unsigned long int)(w1))\
                    397:        : "r" ((unsigned long int)(u)), "r" ((unsigned long int)(v)))
                    398: #define UMUL_TIME 5
                    399: #define UDIV_TIME 100
                    400: #endif /* __mips__ */
                    401: 
                    402: #if defined (__ns32000__)
                    403: #define __umulsidi3(u, v) \
                    404:   ({long long int __w;                                                 \
                    405:       __asm__ ("meid %2,%0" : "=g" (__w)                               \
                    406:        : "%0" ((unsigned long int)(u)), "g" ((unsigned long int)(v))); \
                    407:       __w; })
                    408: #define div_qrnnd(q, r, n1, n0, d) \
                    409:   __asm__ ("movd %2,r0
                    410:        movd %3,r1
                    411:        deid %4,r0
                    412:        movd r1,%0
                    413:        movd r0,%1"                                                     \
                    414:        : "=g" ((unsigned long int)(q)), "=g" ((unsigned long int)(r))  \
                    415:        : "g" ((unsigned long int)(n0)), "g" ((unsigned long int)(n1)), \
                    416:          "g" ((unsigned long int)(d)) : "r0", "r1")
                    417: #endif /* __ns32000__ */
                    418: 
                    419: #if defined (__pyr__)
                    420: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                    421:   __asm__ ("addw       %5,%1
                    422:        addwc   %3,%0"                                                  \
                    423:        : "=r" ((unsigned long int)(sh)), "=&r" ((unsigned long int)(sl))\
                    424:        : "%0" ((unsigned long int)(ah)), "g" ((unsigned long int)(bh)),\
                    425:          "%1" ((unsigned long int)(al)), "g" ((unsigned long int)(bl)))
                    426: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                    427:   __asm__ ("subw       %5,%1
                    428:        subwb   %3,%0"                                                  \
                    429:        : "=r" ((unsigned long int)(sh)), "=&r" ((unsigned long int)(sl))\
                    430:        : "0" ((unsigned long int)(ah)), "g" ((unsigned long int)(bh)), \
                    431:          "1" ((unsigned long int)(al)), "g" ((unsigned long int)(bl)))
                    432: /* This insn doesn't work on ancient pyramids.  */
                    433: #define umul_ppmm(w1, w0, u, v) \
                    434:   __asm__ ("movw %2,tr11
                    435:        uemul %3,tr10
                    436:        movw tr10,%0
                    437:        movw tr11,%1"                                                   \
                    438:        : "=r" ((unsigned long int)(w1)), "=r" ((unsigned long int)(w0))\
                    439:        : "r" ((unsigned long int)(u)), "r" ((unsigned long int)(v))    \
                    440:        : "tr10", "tr11")
                    441: #endif /* __pyr__ */
                    442: 
                    443: #if defined (__ibm032__) /* RT/ROMP */
                    444: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                    445:   __asm__ ("a %1,%5
                    446:        ae %0,%3"                                                       \
                    447:        : "=r" ((unsigned long int)(sh)), "=&r" ((unsigned long int)(sl))\
                    448:        : "%0" ((unsigned long int)(ah)), "r" ((unsigned long int)(bh)),\
                    449:          "%1" ((unsigned long int)(al)), "r" ((unsigned long int)(bl)))
                    450: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                    451:   __asm__ ("s %1,%5
                    452:        se %0,%3"                                                       \
                    453:        : "=r" ((unsigned long int)(sh)), "=&r" ((unsigned long int)(sl))\
                    454:        : "0" ((unsigned long int)(ah)), "r" ((unsigned long int)(bh)), \
                    455:          "1" ((unsigned long int)(al)), "r" ((unsigned long int)(bl)))
                    456: #define umul_ppmm(ph, pl, m0, m1) \
                    457:   do {                                                                 \
                    458:     unsigned long int __m0 = (m0), __m1 = (m1);                                \
                    459:     __asm__ (                                                          \
                    460:        "s      r2,r2
                    461:        mts     r10,%2
                    462:        m       r2,%3
                    463:        m       r2,%3
                    464:        m       r2,%3
                    465:        m       r2,%3
                    466:        m       r2,%3
                    467:        m       r2,%3
                    468:        m       r2,%3
                    469:        m       r2,%3
                    470:        m       r2,%3
                    471:        m       r2,%3
                    472:        m       r2,%3
                    473:        m       r2,%3
                    474:        m       r2,%3
                    475:        m       r2,%3
                    476:        m       r2,%3
                    477:        m       r2,%3
                    478:        cas     %0,r2,r0
                    479:        mfs     r10,%1"                                                 \
                    480:        : "=r" ((unsigned long int)(ph)), "=r" ((unsigned long int)(pl))        \
                    481:        : "%r" (__m0), "r" (__m1)                                       \
                    482:        : "r2");                                                                \
                    483:     (ph) += ((((signed long int) __m0 >> 31) & __m1)                   \
                    484:             + (((signed long int) __m1 >> 31) & __m0));                \
                    485:   } while (0)
                    486: #define count_leading_zeros(count, x) \
                    487:   do {                                                                 \
                    488:     if ((x) >= 0x10000)                                                        \
                    489:       __asm__ ("clz    %0,%1"                                          \
                    490:               : "=r" ((unsigned long int)(count))                      \
                    491:               : "r" ((unsigned long int)(x) >> 16));                   \
                    492:     else                                                               \
                    493:       {                                                                        \
                    494:        __asm__ ("clz   %0,%1"                                          \
                    495:                 : "=r" ((unsigned long int)(count))                    \
                    496:                 : "r" ((unsigned long int)(x)));                       \
                    497:        (count) += 16;                                                  \
                    498:       }                                                                        \
                    499:   } while (0)
                    500: #endif
                    501: 
                    502: #if defined (__sparc__)
                    503: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                    504:   __asm__ ("addcc %4,%5,%1
                    505:        addx %2,%3,%0"                                                  \
                    506:        : "=r" ((unsigned long int)(sh)), "=&r" ((unsigned long int)(sl))\
                    507:        : "%r" ((unsigned long int)(ah)), "rI" ((unsigned long int)(bh)),\
                    508:          "%r" ((unsigned long int)(al)), "rI" ((unsigned long int)(bl)))
                    509: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                    510:   __asm__ ("subcc %4,%5,%1
                    511:        subx %2,%3,%0"                                                  \
                    512:        : "=r" ((unsigned long int)(sh)), "=&r" ((unsigned long int)(sl))\
                    513:        : "r" ((unsigned long int)(ah)), "rI" ((unsigned long int)(bh)),\
                    514:          "r" ((unsigned long int)(al)), "rI" ((unsigned long int)(bl)))
                    515: #if defined (__sparc8__)       /* How do we recog. version 8 SPARC?  */
                    516: #define umul_ppmm(w1, w0, u, v) \
                    517:   __asm__ ("umul %2,%3,%1;rd %%y,%0"                                   \
                    518:        : "=r" ((unsigned long int)(w1)), "=r" ((unsigned long int)(w0))\
                    519:        : "r" ((unsigned long int)(u)), "r" ((unsigned long int)(v)))
                    520: #define udiv_qrnnd(q, r, n1, n0, d) \
                    521:   __asm__ ("mov %2,%%y;nop;nop;nop;udiv %3,%4,%0;umul %0,%4,%1;sub %3,%1,%1"\
                    522:        : "=&r" ((unsigned long int)(q)), "=&r" ((unsigned long int)(r))\
                    523:        : "r" ((unsigned long int)(n1)), "r" ((unsigned long int)(n0)), \
                    524:          "r" ((unsigned long int)(d)))
                    525: #else
                    526: /* SPARC without integer multiplication and divide instructions.
                    527:    (i.e. at least Sun4/20,40,60,65,75,110,260,280,330,360,380,470,490) */
                    528: #define umul_ppmm(w1, w0, u, v) \
                    529:   __asm__ ("! Inlined umul_ppmm
                    530:        wr      %%g0,%2,%%y     ! SPARC has 0-3 delay insn after a wr
                    531:        sra     %3,31,%%g2      ! Don't move this insn
                    532:        and     %2,%%g2,%%g2    ! Don't move this insn
                    533:        andcc   %%g0,0,%%g1     ! Don't move this insn
                    534:        mulscc  %%g1,%3,%%g1
                    535:        mulscc  %%g1,%3,%%g1
                    536:        mulscc  %%g1,%3,%%g1
                    537:        mulscc  %%g1,%3,%%g1
                    538:        mulscc  %%g1,%3,%%g1
                    539:        mulscc  %%g1,%3,%%g1
                    540:        mulscc  %%g1,%3,%%g1
                    541:        mulscc  %%g1,%3,%%g1
                    542:        mulscc  %%g1,%3,%%g1
                    543:        mulscc  %%g1,%3,%%g1
                    544:        mulscc  %%g1,%3,%%g1
                    545:        mulscc  %%g1,%3,%%g1
                    546:        mulscc  %%g1,%3,%%g1
                    547:        mulscc  %%g1,%3,%%g1
                    548:        mulscc  %%g1,%3,%%g1
                    549:        mulscc  %%g1,%3,%%g1
                    550:        mulscc  %%g1,%3,%%g1
                    551:        mulscc  %%g1,%3,%%g1
                    552:        mulscc  %%g1,%3,%%g1
                    553:        mulscc  %%g1,%3,%%g1
                    554:        mulscc  %%g1,%3,%%g1
                    555:        mulscc  %%g1,%3,%%g1
                    556:        mulscc  %%g1,%3,%%g1
                    557:        mulscc  %%g1,%3,%%g1
                    558:        mulscc  %%g1,%3,%%g1
                    559:        mulscc  %%g1,%3,%%g1
                    560:        mulscc  %%g1,%3,%%g1
                    561:        mulscc  %%g1,%3,%%g1
                    562:        mulscc  %%g1,%3,%%g1
                    563:        mulscc  %%g1,%3,%%g1
                    564:        mulscc  %%g1,%3,%%g1
                    565:        mulscc  %%g1,%3,%%g1
                    566:        mulscc  %%g1,0,%%g1
                    567:        add     %%g1,%%g2,%0
                    568:        rd      %%y,%1"                                                 \
                    569:        : "=r" ((unsigned long int)(w1)), "=r" ((unsigned long int)(w0))\
                    570:        : "%rI" ((unsigned long int)(u)), "r" ((unsigned long int)(v))  \
                    571:        : "%g1", "%g2")
                    572: #define UMUL_TIME 39           /* 39 instructions */
                    573: /* It's quite necessary to add this much assembler for the sparc.
                    574:    The default udiv_qrnnd (in C) is more than 10 times slower!  */
                    575: #define udiv_qrnnd(q, r, n1, n0, d) \
                    576:   __asm__ ("! Inlined udiv_qrnnd
                    577:        mov     32,%%g1
                    578:        subcc   %1,%2,%%g0
                    579: 1:     bcs     5f
                    580:         addxcc %0,%0,%0        ! shift n1n0 and a q-bit in lsb
                    581:        sub     %1,%2,%1        ! this kills msb of n
                    582:        addx    %1,%1,%1        ! so this can't give carry
                    583:        subcc   %%g1,1,%%g1
                    584: 2:     bne     1b
                    585:         subcc  %1,%2,%%g0
                    586:        bcs     3f
                    587:         addxcc %0,%0,%0        ! shift n1n0 and a q-bit in lsb
                    588:        b       3f
                    589:         sub    %1,%2,%1        ! this kills msb of n
                    590: 4:     sub     %1,%2,%1
                    591: 5:     addxcc  %1,%1,%1
                    592:        bcc     2b
                    593:         subcc  %%g1,1,%%g1
                    594: ! Got carry from n.  Subtract next step to cancel this carry.
                    595:        bne     4b
                    596:         addcc  %0,%0,%0        ! shift n1n0 and a 0-bit in lsb
                    597:        sub     %1,%2,%1
                    598: 3:     xnor    %0,0,%0
                    599:        ! End of inline udiv_qrnnd"                                     \
                    600:        : "=r&" ((unsigned long int)(q)), "=r&" ((unsigned long int)(r))\
                    601:        : "r" ((unsigned long int)(d)), "1" ((unsigned long int)(n1)),  \
                    602:          "0" ((unsigned long int)(n0)) : "%g1")
                    603: #define UDIV_TIME (3+7*32)     /* 7 instructions/iteration. 32 iterations. */
                    604: #endif
                    605: #endif /* __sparc8__ */
                    606: 
                    607: #if defined (__vax__)
                    608: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                    609:   __asm__ ("addl2 %5,%1
                    610:        adwc %3,%0"                                                     \
                    611:        : "=g" ((unsigned long int)(sh)), "=&g" ((unsigned long int)(sl))\
                    612:        : "%0" ((unsigned long int)(ah)), "g" ((unsigned long int)(bh)),\
                    613:          "%1" ((unsigned long int)(al)), "g" ((unsigned long int)(bl)))
                    614: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                    615:   __asm__ ("subl2 %5,%1
                    616:        sbwc %3,%0"                                                     \
                    617:        : "=g" ((unsigned long int)(sh)), "=&g" ((unsigned long int)(sl))\
                    618:        : "0" ((unsigned long int)(ah)), "g" ((unsigned long int)(bh)), \
                    619:          "1" ((unsigned long int)(al)), "g" ((unsigned long int)(bl)))
                    620: #define umul_ppmm(xh, xl, m0, m1) \
                    621:   do {                                                                 \
                    622:     union {long long int ll;struct {unsigned long int l, h;} i;} __xx; \
                    623:     unsigned long int __m0 = (m0), __m1 = (m1);                                \
                    624:     __asm__ ("emul %1,%2,$0,%0"                                                \
                    625:         : "=r" (__xx.ll) : "g" (__m0), "g" (__m1));                    \
                    626:     (xh) = __xx.i.h; (xl) = __xx.i.l;                                  \
                    627:     (xh) += ((((signed long int) __m0 >> 31) & __m1)                   \
                    628:             + (((signed long int) __m1 >> 31) & __m0));                \
                    629:   } while (0)
                    630: #endif /* __vax__ */
                    631: 
                    632: #endif /* __GNUC__ */
                    633: 
                    634: /* If this machine has no inline assembler, use C macros.  */
                    635: 
                    636: #if !defined (add_ssaaaa)
                    637: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                    638:   do {                                                                 \
                    639:     unsigned long int __x;                                             \
                    640:     __x = (al) + (bl);                                                 \
                    641:     (sh) = (ah) + (bh) + (__x < (al));                                 \
                    642:     (sl) = __x;                                                                \
                    643:   } while (0)
                    644: #endif
                    645: 
                    646: #if !defined (sub_ddmmss)
                    647: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                    648:   do {                                                                 \
                    649:     unsigned long int __x;                                             \
                    650:     __x = (al) - (bl);                                                 \
                    651:     (sh) = (ah) - (bh) - (__x > (al));                                 \
                    652:     (sl) = __x;                                                                \
                    653:   } while (0)
                    654: #endif
                    655: 
                    656: #if !defined (umul_ppmm)
                    657: #define umul_ppmm(w1, w0, u, v)                                                \
                    658:   do {                                                                 \
                    659:     unsigned long int __x0, __x1, __x2, __x3;                          \
                    660:     unsigned int __ul, __vl, __uh, __vh;                               \
                    661:                                                                        \
                    662:     __ul = __ll_lowpart (u);                                           \
                    663:     __uh = __ll_highpart (u);                                          \
                    664:     __vl = __ll_lowpart (v);                                           \
                    665:     __vh = __ll_highpart (v);                                          \
                    666:                                                                        \
                    667:     __x0 = (unsigned long int) __ul * __vl;                            \
                    668:     __x1 = (unsigned long int) __ul * __vh;                            \
                    669:     __x2 = (unsigned long int) __uh * __vl;                            \
                    670:     __x3 = (unsigned long int) __uh * __vh;                            \
                    671:                                                                        \
                    672:     __x1 += __ll_highpart (__x0);/* this can't give carry */           \
                    673:     __x1 += __x2;              /* but this indeed can */               \
                    674:     if (__x1 < __x2)           /* did we get it? */                    \
                    675:       __x3 += __ll_B;          /* yes, add it in the proper pos. */    \
                    676:                                                                        \
                    677:     (w1) = __x3 + __ll_highpart (__x1);                                        \
                    678:     (w0) = __ll_lowpart (__x1) * __ll_B + __ll_lowpart (__x0);         \
                    679:   } while (0)
                    680: #endif
                    681: 
                    682: #if !defined (__umulsidi3)
                    683: #define __umulsidi3(u, v) \
                    684:   ({long_long __w;                                                     \
                    685:     umul_ppmm (__w.s.high, __w.s.low, u, v);                           \
                    686:     __w.ll; })
                    687: #endif
                    688: 
                    689: #if !defined (udiv_qrnnd)  || defined (__LLDEBUG__)
                    690: #define UDIV_NEEDS_NORMALIZATION 1
                    691: #ifndef __LLDEBUG__
                    692: #define udiv_qrnnd udiv_qrnnd_c
                    693: #endif
                    694: #define udiv_qrnnd_c(q, r, n1, n0, d) \
                    695:   do {                                                                 \
                    696:     unsigned int __d1, __d0, __q1, __q0;                               \
                    697:     unsigned long int __r1, __r0, __m;                                 \
                    698:     __d1 = __ll_highpart (d);                                          \
                    699:     __d0 = __ll_lowpart (d);                                           \
                    700:                                                                        \
                    701:     __r1 = (n1) % __d1;                                                        \
                    702:     __q1 = (n1) / __d1;                                                        \
                    703:     __m = (unsigned long int) __q1 * __d0;                             \
                    704:     __r1 = __r1 * __ll_B | __ll_highpart (n0);                         \
                    705:     if (__r1 < __m)                                                    \
                    706:       {                                                                        \
                    707:        __q1--, __r1 += (d);                                            \
                    708:        if (__r1 >= (d)) /* i.e. we didn't get carry when adding to __r1 */\
                    709:          if (__r1 < __m)                                               \
                    710:            __q1--, __r1 += (d);                                        \
                    711:       }                                                                        \
                    712:     __r1 -= __m;                                                       \
                    713:                                                                        \
                    714:     __r0 = __r1 % __d1;                                                        \
                    715:     __q0 = __r1 / __d1;                                                        \
                    716:     __m = (unsigned long int) __q0 * __d0;                             \
                    717:     __r0 = __r0 * __ll_B | __ll_lowpart (n0);                          \
                    718:     if (__r0 < __m)                                                    \
                    719:       {                                                                        \
                    720:        __q0--, __r0 += (d);                                            \
                    721:        if (__r0 >= (d))                                                \
                    722:          if (__r0 < __m)                                               \
                    723:            __q0--, __r0 += (d);                                        \
                    724:       }                                                                        \
                    725:     __r0 -= __m;                                                       \
                    726:                                                                        \
                    727:     (q) = (unsigned long int) __q1 * __ll_B | __q0;                    \
                    728:     (r) = __r0;                                                                \
                    729:   } while (0)
                    730: #endif
                    731: 
                    732: #if !defined (count_leading_zeros)
                    733: extern const unsigned char __clz_tab[];
                    734: 
                    735: #define count_leading_zeros(count, x) \
                    736:   do {                                                                 \
                    737:     unsigned long int xr = (x);                                                \
                    738:     unsigned int a;                                                    \
                    739:                                                                        \
                    740:     a = xr < (1<<2*__BITS4)                                            \
                    741:       ? (xr < (1<<__BITS4) ? 0 : __BITS4)                              \
                    742:       : (xr < (1<<3*__BITS4) ?  2*__BITS4 : 3*__BITS4);                        \
                    743:                                                                        \
                    744:     (count) = 4*__BITS4 - (__clz_tab[xr >> a] + a);                    \
                    745:   } while (0)
                    746: #endif
                    747: 
                    748: #ifndef UDIV_NEEDS_NORMALIZATION
                    749: #define UDIV_NEEDS_NORMALIZATION 0
                    750: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.