[BACK]Return to longlong.h CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gmp

Annotation of OpenXM_contrib/gmp/longlong.h, Revision 1.1.1.1

1.1       maekawa     1: /* longlong.h -- definitions for mixed size 32/64 bit arithmetic.
                      2:
                      3: Copyright (C) 1991, 1992, 1993, 1994, 1996 Free Software Foundation, Inc.
                      4:
                      5: This file is free software; you can redistribute it and/or modify
                      6: it under the terms of the GNU Library General Public License as published by
                      7: the Free Software Foundation; either version 2 of the License, or (at your
                      8: option) any later version.
                      9:
                     10: This file is distributed in the hope that it will be useful, but
                     11: WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
                     12: or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
                     13: License for more details.
                     14:
                     15: You should have received a copy of the GNU Library General Public License
                     16: along with this file; see the file COPYING.LIB.  If not, write to
                     17: the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
                     18: MA 02111-1307, USA. */
                     19:
                     20: /* You have to define the following before including this file:
                     21:
                     22:    UWtype -- An unsigned type, default type for operations (typically a "word")
                     23:    UHWtype -- An unsigned type, at least half the size of UWtype.
                     24:    UDWtype -- An unsigned type, at least twice as large a UWtype
                     25:    W_TYPE_SIZE -- size in bits of UWtype
                     26:
                     27:    SItype, USItype -- Signed and unsigned 32 bit types.
                     28:    DItype, UDItype -- Signed and unsigned 64 bit types.
                     29:
                     30:    On a 32 bit machine UWtype should typically be USItype;
                     31:    on a 64 bit machine, UWtype should typically be UDItype.
                     32: */
                     33:
                     34: #define __BITS4 (W_TYPE_SIZE / 4)
                     35: #define __ll_B ((UWtype) 1 << (W_TYPE_SIZE / 2))
                     36: #define __ll_lowpart(t) ((UWtype) (t) & (__ll_B - 1))
                     37: #define __ll_highpart(t) ((UWtype) (t) >> (W_TYPE_SIZE / 2))
                     38:
                     39: /* This is used to make sure no undesirable sharing between different libraries
                     40:    that use this file takes place.  */
                     41: #ifndef __MPN
                     42: #define __MPN(x) __##x
                     43: #endif
                     44:
                     45: /* Define auxiliary asm macros.
                     46:
                     47:    1) umul_ppmm(high_prod, low_prod, multipler, multiplicand) multiplies two
                     48:    UWtype integers MULTIPLER and MULTIPLICAND, and generates a two UWtype
                     49:    word product in HIGH_PROD and LOW_PROD.
                     50:
                     51:    2) __umulsidi3(a,b) multiplies two UWtype integers A and B, and returns a
                     52:    UDWtype product.  This is just a variant of umul_ppmm.
                     53:
                     54:    3) udiv_qrnnd(quotient, remainder, high_numerator, low_numerator,
                     55:    denominator) divides a UDWtype, composed by the UWtype integers
                     56:    HIGH_NUMERATOR and LOW_NUMERATOR, by DENOMINATOR and places the quotient
                     57:    in QUOTIENT and the remainder in REMAINDER.  HIGH_NUMERATOR must be less
                     58:    than DENOMINATOR for correct operation.  If, in addition, the most
                     59:    significant bit of DENOMINATOR must be 1, then the pre-processor symbol
                     60:    UDIV_NEEDS_NORMALIZATION is defined to 1.
                     61:
                     62:    4) sdiv_qrnnd(quotient, remainder, high_numerator, low_numerator,
                     63:    denominator).  Like udiv_qrnnd but the numbers are signed.  The quotient
                     64:    is rounded towards 0.
                     65:
                     66:    5) count_leading_zeros(count, x) counts the number of zero-bits from the
                     67:    msb to the first non-zero bit in the UWtype X.  This is the number of
                     68:    steps X needs to be shifted left to set the msb.  Undefined for X == 0,
                     69:    unless the symbol COUNT_LEADING_ZEROS_0 is defined to some value.
                     70:
                     71:    6) count_trailing_zeros(count, x) like count_leading_zeros, but counts
                     72:    from the least significant end.
                     73:
                     74:    7) add_ssaaaa(high_sum, low_sum, high_addend_1, low_addend_1,
                     75:    high_addend_2, low_addend_2) adds two UWtype integers, composed by
                     76:    HIGH_ADDEND_1 and LOW_ADDEND_1, and HIGH_ADDEND_2 and LOW_ADDEND_2
                     77:    respectively.  The result is placed in HIGH_SUM and LOW_SUM.  Overflow
                     78:    (i.e. carry out) is not stored anywhere, and is lost.
                     79:
                     80:    8) sub_ddmmss(high_difference, low_difference, high_minuend, low_minuend,
                     81:    high_subtrahend, low_subtrahend) subtracts two two-word UWtype integers,
                     82:    composed by HIGH_MINUEND_1 and LOW_MINUEND_1, and HIGH_SUBTRAHEND_2 and
                     83:    LOW_SUBTRAHEND_2 respectively.  The result is placed in HIGH_DIFFERENCE
                     84:    and LOW_DIFFERENCE.  Overflow (i.e. carry out) is not stored anywhere,
                     85:    and is lost.
                     86:
                     87:    If any of these macros are left undefined for a particular CPU,
                     88:    C macros are used.  */
                     89:
                     90: /* The CPUs come in alphabetical order below.
                     91:
                     92:    Please add support for more CPUs here, or improve the current support
                     93:    for the CPUs below!  */
                     94:
                     95: #if defined (__GNUC__) && !defined (NO_ASM)
                     96:
                     97: /* We sometimes need to clobber "cc" with gcc2, but that would not be
                     98:    understood by gcc1.  Use cpp to avoid major code duplication.  */
                     99: #if __GNUC__ < 2
                    100: #define __CLOBBER_CC
                    101: #define __AND_CLOBBER_CC
                    102: #else /* __GNUC__ >= 2 */
                    103: #define __CLOBBER_CC : "cc"
                    104: #define __AND_CLOBBER_CC , "cc"
                    105: #endif /* __GNUC__ < 2 */
                    106:
                    107: #if (defined (__a29k__) || defined (_AM29K)) && W_TYPE_SIZE == 32
                    108: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                    109:   __asm__ ("add %1,%4,%5
                    110:        addc %0,%2,%3"                                                  \
                    111:           : "=r" ((USItype)(sh)),                                      \
                    112:            "=&r" ((USItype)(sl))                                       \
                    113:           : "%r" ((USItype)(ah)),                                      \
                    114:             "rI" ((USItype)(bh)),                                      \
                    115:             "%r" ((USItype)(al)),                                      \
                    116:             "rI" ((USItype)(bl)))
                    117: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                    118:   __asm__ ("sub %1,%4,%5
                    119:        subc %0,%2,%3"                                                  \
                    120:           : "=r" ((USItype)(sh)),                                      \
                    121:             "=&r" ((USItype)(sl))                                      \
                    122:           : "r" ((USItype)(ah)),                                       \
                    123:             "rI" ((USItype)(bh)),                                      \
                    124:             "r" ((USItype)(al)),                                       \
                    125:             "rI" ((USItype)(bl)))
                    126: #define umul_ppmm(xh, xl, m0, m1) \
                    127:   do {                                                                 \
                    128:     USItype __m0 = (m0), __m1 = (m1);                                  \
                    129:     __asm__ ("multiplu %0,%1,%2"                                       \
                    130:             : "=r" ((USItype)(xl))                                     \
                    131:             : "r" (__m0),                                              \
                    132:               "r" (__m1));                                             \
                    133:     __asm__ ("multmu %0,%1,%2"                                         \
                    134:             : "=r" ((USItype)(xh))                                     \
                    135:             : "r" (__m0),                                              \
                    136:               "r" (__m1));                                             \
                    137:   } while (0)
                    138: #define udiv_qrnnd(q, r, n1, n0, d) \
                    139:   __asm__ ("dividu %0,%3,%4"                                           \
                    140:           : "=r" ((USItype)(q)),                                       \
                    141:             "=q" ((USItype)(r))                                        \
                    142:           : "1" ((USItype)(n1)),                                       \
                    143:             "r" ((USItype)(n0)),                                       \
                    144:             "r" ((USItype)(d)))
                    145: #define count_leading_zeros(count, x) \
                    146:     __asm__ ("clz %0,%1"                                               \
                    147:             : "=r" ((USItype)(count))                                  \
                    148:             : "r" ((USItype)(x)))
                    149: #define COUNT_LEADING_ZEROS_0 32
                    150: #endif /* __a29k__ */
                    151:
                    152: #if defined (__alpha) && W_TYPE_SIZE == 64
                    153: #define umul_ppmm(ph, pl, m0, m1) \
                    154:   do {                                                                 \
                    155:     UDItype __m0 = (m0), __m1 = (m1);                                  \
                    156:     __asm__ ("umulh %r1,%2,%0"                                         \
                    157:             : "=r" ((UDItype) ph)                                      \
                    158:             : "%rJ" (__m0),                                            \
                    159:               "rI" (__m1));                                            \
                    160:     (pl) = __m0 * __m1;                                                        \
                    161:   } while (0)
                    162: #define UMUL_TIME 46
                    163: #ifndef LONGLONG_STANDALONE
                    164: #define udiv_qrnnd(q, r, n1, n0, d) \
                    165:   do { UDItype __r;                                                    \
                    166:     (q) = __udiv_qrnnd (&__r, (n1), (n0), (d));                                \
                    167:     (r) = __r;                                                         \
                    168:   } while (0)
                    169: extern UDItype __udiv_qrnnd ();
                    170: #define UDIV_TIME 220
                    171: #endif /* LONGLONG_STANDALONE */
                    172: #endif /* __alpha */
                    173:
                    174: #if defined (__arm__) && W_TYPE_SIZE == 32
                    175: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                    176:   __asm__ ("adds       %1, %4, %5
                    177:        adc     %0, %2, %3"                                             \
                    178:           : "=r" ((USItype)(sh)),                                      \
                    179:             "=&r" ((USItype)(sl))                                      \
                    180:           : "%r" ((USItype)(ah)),                                      \
                    181:             "rI" ((USItype)(bh)),                                      \
                    182:             "%r" ((USItype)(al)),                                      \
                    183:             "rI" ((USItype)(bl)))
                    184: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                    185:   __asm__ ("subs       %1, %4, %5
                    186:        sbc     %0, %2, %3"                                             \
                    187:           : "=r" ((USItype)(sh)),                                      \
                    188:             "=&r" ((USItype)(sl))                                      \
                    189:           : "r" ((USItype)(ah)),                                       \
                    190:             "rI" ((USItype)(bh)),                                      \
                    191:             "r" ((USItype)(al)),                                       \
                    192:             "rI" ((USItype)(bl)))
                    193: #define umul_ppmm(xh, xl, a, b) \
                    194:   __asm__ ("%@ Inlined umul_ppmm
                    195:        mov     %|r0, %2, lsr #16
                    196:        mov     %|r2, %3, lsr #16
                    197:        bic     %|r1, %2, %|r0, lsl #16
                    198:        bic     %|r2, %3, %|r2, lsl #16
                    199:        mul     %1, %|r1, %|r2
                    200:        mul     %|r2, %|r0, %|r2
                    201:        mul     %|r1, %0, %|r1
                    202:        mul     %0, %|r0, %0
                    203:        adds    %|r1, %|r2, %|r1
                    204:        addcs   %0, %0, #65536
                    205:        adds    %1, %1, %|r1, lsl #16
                    206:        adc     %0, %0, %|r1, lsr #16"                                  \
                    207:           : "=&r" ((USItype)(xh)),                                     \
                    208:             "=r" ((USItype)(xl))                                       \
                    209:           : "r" ((USItype)(a)),                                        \
                    210:             "r" ((USItype)(b))                                         \
                    211:           : "r0", "r1", "r2")
                    212: #define UMUL_TIME 20
                    213: #define UDIV_TIME 100
                    214: #endif /* __arm__ */
                    215:
                    216: #if defined (__clipper__) && W_TYPE_SIZE == 32
                    217: #define umul_ppmm(w1, w0, u, v) \
                    218:   ({union {UDItype __ll;                                               \
                    219:           struct {USItype __l, __h;} __i;                              \
                    220:          } __xx;                                                       \
                    221:   __asm__ ("mulwux %2,%0"                                              \
                    222:           : "=r" (__xx.__ll)                                           \
                    223:           : "%0" ((USItype)(u)),                                       \
                    224:             "r" ((USItype)(v)));                                       \
                    225:   (w1) = __xx.__i.__h; (w0) = __xx.__i.__l;})
                    226: #define smul_ppmm(w1, w0, u, v) \
                    227:   ({union {DItype __ll;                                                        \
                    228:           struct {SItype __l, __h;} __i;                               \
                    229:          } __xx;                                                       \
                    230:   __asm__ ("mulwx %2,%0"                                               \
                    231:           : "=r" (__xx.__ll)                                           \
                    232:           : "%0" ((SItype)(u)),                                        \
                    233:             "r" ((SItype)(v)));                                        \
                    234:   (w1) = __xx.__i.__h; (w0) = __xx.__i.__l;})
                    235: #define __umulsidi3(u, v) \
                    236:   ({UDItype __w;                                                       \
                    237:     __asm__ ("mulwux %2,%0"                                            \
                    238:             : "=r" (__w)                                               \
                    239:             : "%0" ((USItype)(u)),                                     \
                    240:               "r" ((USItype)(v)));                                     \
                    241:     __w; })
                    242: #endif /* __clipper__ */
                    243:
                    244: #if defined (__gmicro__) && W_TYPE_SIZE == 32
                    245: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                    246:   __asm__ ("add.w %5,%1
                    247:        addx %3,%0"                                                     \
                    248:           : "=g" ((USItype)(sh)),                                      \
                    249:             "=&g" ((USItype)(sl))                                      \
                    250:           : "%0" ((USItype)(ah)),                                      \
                    251:             "g" ((USItype)(bh)),                                       \
                    252:             "%1" ((USItype)(al)),                                      \
                    253:             "g" ((USItype)(bl)))
                    254: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                    255:   __asm__ ("sub.w %5,%1
                    256:        subx %3,%0"                                                     \
                    257:           : "=g" ((USItype)(sh)),                                      \
                    258:             "=&g" ((USItype)(sl))                                      \
                    259:           : "0" ((USItype)(ah)),                                       \
                    260:             "g" ((USItype)(bh)),                                       \
                    261:             "1" ((USItype)(al)),                                       \
                    262:             "g" ((USItype)(bl)))
                    263: #define umul_ppmm(ph, pl, m0, m1) \
                    264:   __asm__ ("mulx %3,%0,%1"                                             \
                    265:           : "=g" ((USItype)(ph)),                                      \
                    266:             "=r" ((USItype)(pl))                                       \
                    267:           : "%0" ((USItype)(m0)),                                      \
                    268:             "g" ((USItype)(m1)))
                    269: #define udiv_qrnnd(q, r, nh, nl, d) \
                    270:   __asm__ ("divx %4,%0,%1"                                             \
                    271:           : "=g" ((USItype)(q)),                                       \
                    272:             "=r" ((USItype)(r))                                        \
                    273:           : "1" ((USItype)(nh)),                                       \
                    274:             "0" ((USItype)(nl)),                                       \
                    275:             "g" ((USItype)(d)))
                    276: #define count_leading_zeros(count, x) \
                    277:   __asm__ ("bsch/1 %1,%0"                                              \
                    278:           : "=g" (count)                                               \
                    279:           : "g" ((USItype)(x)),                                        \
                    280:             "0" ((USItype)0))
                    281: #endif
                    282:
                    283: #if defined (__hppa) && W_TYPE_SIZE == 32
                    284: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                    285:   __asm__ ("add %4,%5,%1
                    286:        addc %2,%3,%0"                                                  \
                    287:           : "=r" ((USItype)(sh)),                                      \
                    288:             "=&r" ((USItype)(sl))                                      \
                    289:           : "%rM" ((USItype)(ah)),                                     \
                    290:             "rM" ((USItype)(bh)),                                      \
                    291:             "%rM" ((USItype)(al)),                                     \
                    292:             "rM" ((USItype)(bl)))
                    293: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                    294:   __asm__ ("sub %4,%5,%1
                    295:        subb %2,%3,%0"                                                  \
                    296:           : "=r" ((USItype)(sh)),                                      \
                    297:             "=&r" ((USItype)(sl))                                      \
                    298:           : "rM" ((USItype)(ah)),                                      \
                    299:             "rM" ((USItype)(bh)),                                      \
                    300:             "rM" ((USItype)(al)),                                      \
                    301:             "rM" ((USItype)(bl)))
                    302: #if defined (_PA_RISC1_1)
                    303: #define umul_ppmm(wh, wl, u, v) \
                    304:   do {                                                                 \
                    305:     union {UDItype __ll;                                               \
                    306:           struct {USItype __h, __l;} __i;                              \
                    307:          } __xx;                                                       \
                    308:     __asm__ ("xmpyu %1,%2,%0"                                          \
                    309:             : "=*f" (__xx.__ll)                                        \
                    310:             : "*f" ((USItype)(u)),                                     \
                    311:               "*f" ((USItype)(v)));                                    \
                    312:     (wh) = __xx.__i.__h;                                               \
                    313:     (wl) = __xx.__i.__l;                                               \
                    314:   } while (0)
                    315: #define UMUL_TIME 8
                    316: #define UDIV_TIME 60
                    317: #else
                    318: #define UMUL_TIME 40
                    319: #define UDIV_TIME 80
                    320: #endif
                    321: #ifndef LONGLONG_STANDALONE
                    322: #define udiv_qrnnd(q, r, n1, n0, d) \
                    323:   do { USItype __r;                                                    \
                    324:     (q) = __udiv_qrnnd (&__r, (n1), (n0), (d));                                \
                    325:     (r) = __r;                                                         \
                    326:   } while (0)
                    327: extern USItype __udiv_qrnnd ();
                    328: #endif /* LONGLONG_STANDALONE */
                    329: #define count_leading_zeros(count, x) \
                    330:   do {                                                                 \
                    331:     USItype __tmp;                                                     \
                    332:     __asm__ (                                                          \
                    333:        "ldi            1,%0
                    334:        extru,=         %1,15,16,%%r0           ; Bits 31..16 zero?
                    335:        extru,tr        %1,15,16,%1             ; No.  Shift down, skip add.
                    336:        ldo             16(%0),%0               ; Yes.  Perform add.
                    337:        extru,=         %1,23,8,%%r0            ; Bits 15..8 zero?
                    338:        extru,tr        %1,23,8,%1              ; No.  Shift down, skip add.
                    339:        ldo             8(%0),%0                ; Yes.  Perform add.
                    340:        extru,=         %1,27,4,%%r0            ; Bits 7..4 zero?
                    341:        extru,tr        %1,27,4,%1              ; No.  Shift down, skip add.
                    342:        ldo             4(%0),%0                ; Yes.  Perform add.
                    343:        extru,=         %1,29,2,%%r0            ; Bits 3..2 zero?
                    344:        extru,tr        %1,29,2,%1              ; No.  Shift down, skip add.
                    345:        ldo             2(%0),%0                ; Yes.  Perform add.
                    346:        extru           %1,30,1,%1              ; Extract bit 1.
                    347:        sub             %0,%1,%0                ; Subtract it.
                    348:        " : "=r" (count), "=r" (__tmp) : "1" (x));                      \
                    349:   } while (0)
                    350: #endif /* hppa */
                    351:
                    352: #if (defined (__i370__) || defined (__mvs__)) && W_TYPE_SIZE == 32
                    353: #define umul_ppmm(xh, xl, m0, m1) \
                    354:   do {                                                                 \
                    355:     union {UDItype __ll;                                               \
                    356:           struct {USItype __h, __l;} __i;                              \
                    357:          } __xx;                                                       \
                    358:     USItype __m0 = (m0), __m1 = (m1);                                  \
                    359:     __asm__ ("mr %0,%3"                                                        \
                    360:             : "=r" (__xx.__i.__h),                                     \
                    361:               "=r" (__xx.__i.__l)                                      \
                    362:             : "%1" (__m0),                                             \
                    363:               "r" (__m1));                                             \
                    364:     (xh) = __xx.__i.__h; (xl) = __xx.__i.__l;                          \
                    365:     (xh) += ((((SItype) __m0 >> 31) & __m1)                            \
                    366:             + (((SItype) __m1 >> 31) & __m0));                         \
                    367:   } while (0)
                    368: #define smul_ppmm(xh, xl, m0, m1) \
                    369:   do {                                                                 \
                    370:     union {DItype __ll;                                                        \
                    371:           struct {USItype __h, __l;} __i;                              \
                    372:          } __xx;                                                       \
                    373:     __asm__ ("mr %0,%3"                                                        \
                    374:             : "=r" (__xx.__i.__h),                                     \
                    375:               "=r" (__xx.__i.__l)                                      \
                    376:             : "%1" (m0),                                               \
                    377:               "r" (m1));                                               \
                    378:     (xh) = __xx.__i.__h; (xl) = __xx.__i.__l;                          \
                    379:   } while (0)
                    380: #define sdiv_qrnnd(q, r, n1, n0, d) \
                    381:   do {                                                                 \
                    382:     union {DItype __ll;                                                        \
                    383:           struct {USItype __h, __l;} __i;                              \
                    384:          } __xx;                                                       \
                    385:     __xx.__i.__h = n1; __xx.__i.__l = n0;                              \
                    386:     __asm__ ("dr %0,%2"                                                        \
                    387:             : "=r" (__xx.__ll)                                         \
                    388:             : "0" (__xx.__ll), "r" (d));                               \
                    389:     (q) = __xx.__i.__l; (r) = __xx.__i.__h;                            \
                    390:   } while (0)
                    391: #endif
                    392:
                    393: #if (defined (__i386__) || defined (__i486__)) && W_TYPE_SIZE == 32
                    394: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                    395:   __asm__ ("addl %5,%1
                    396:        adcl %3,%0"                                                     \
                    397:           : "=r" ((USItype)(sh)),                                      \
                    398:             "=&r" ((USItype)(sl))                                      \
                    399:           : "%0" ((USItype)(ah)),                                      \
                    400:             "g" ((USItype)(bh)),                                       \
                    401:             "%1" ((USItype)(al)),                                      \
                    402:             "g" ((USItype)(bl)))
                    403: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                    404:   __asm__ ("subl %5,%1
                    405:        sbbl %3,%0"                                                     \
                    406:           : "=r" ((USItype)(sh)),                                      \
                    407:             "=&r" ((USItype)(sl))                                      \
                    408:           : "0" ((USItype)(ah)),                                       \
                    409:             "g" ((USItype)(bh)),                                       \
                    410:             "1" ((USItype)(al)),                                       \
                    411:             "g" ((USItype)(bl)))
                    412: #define umul_ppmm(w1, w0, u, v) \
                    413:   __asm__ ("mull %3"                                                   \
                    414:           : "=a" ((USItype)(w0)),                                      \
                    415:             "=d" ((USItype)(w1))                                       \
                    416:           : "%0" ((USItype)(u)),                                       \
                    417:             "rm" ((USItype)(v)))
                    418: #define udiv_qrnnd(q, r, n1, n0, d) \
                    419:   __asm__ ("divl %4"                                                   \
                    420:           : "=a" ((USItype)(q)),                                       \
                    421:             "=d" ((USItype)(r))                                        \
                    422:           : "0" ((USItype)(n0)),                                       \
                    423:             "1" ((USItype)(n1)),                                       \
                    424:             "rm" ((USItype)(d)))
                    425: #define count_leading_zeros(count, x) \
                    426:   do {                                                                 \
                    427:     USItype __cbtmp;                                                   \
                    428:     __asm__ ("bsrl %1,%0"                                              \
                    429:             : "=r" (__cbtmp) : "rm" ((USItype)(x)));                   \
                    430:     (count) = __cbtmp ^ 31;                                            \
                    431:   } while (0)
                    432: #define count_trailing_zeros(count, x) \
                    433:   __asm__ ("bsfl %1,%0" : "=r" (count) : "rm" ((USItype)(x)))
                    434: #ifndef UMUL_TIME
                    435: #define UMUL_TIME 40
                    436: #endif
                    437: #ifndef UDIV_TIME
                    438: #define UDIV_TIME 40
                    439: #endif
                    440: #endif /* 80x86 */
                    441:
                    442: #if defined (__i860__) && W_TYPE_SIZE == 32
                    443: #define rshift_rhlc(r,h,l,c) \
                    444:   __asm__ ("shr %3,r0,r0\;shrd %1,%2,%0"                               \
                    445:           "=r" (r) : "r" (h), "r" (l), "rn" (c))
                    446: #endif /* i860 */
                    447:
                    448: #if defined (__i960__) && W_TYPE_SIZE == 32
                    449: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                    450:   __asm__ ("cmpo 1,0\;addc %5,%4,%1\;addc %3,%2,%0"                    \
                    451:           : "=r" ((USItype)(sh)),                                      \
                    452:             "=&r" ((USItype)(sl))                                      \
                    453:           : "%dI" ((USItype)(ah)),                                     \
                    454:             "dI" ((USItype)(bh)),                                      \
                    455:             "%dI" ((USItype)(al)),                                     \
                    456:             "dI" ((USItype)(bl)))
                    457: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                    458:   __asm__ ("cmpo 0,0\;subc %5,%4,%1\;subc %3,%2,%0"                    \
                    459:           : "=r" ((USItype)(sh)),                                      \
                    460:             "=&r" ((USItype)(sl))                                      \
                    461:           : "dI" ((USItype)(ah)),                                      \
                    462:             "dI" ((USItype)(bh)),                                      \
                    463:             "dI" ((USItype)(al)),                                      \
                    464:             "dI" ((USItype)(bl)))
                    465: #define umul_ppmm(w1, w0, u, v) \
                    466:   ({union {UDItype __ll;                                               \
                    467:           struct {USItype __l, __h;} __i;                              \
                    468:          } __xx;                                                       \
                    469:   __asm__ ("emul       %2,%1,%0"                                       \
                    470:           : "=d" (__xx.__ll)                                           \
                    471:           : "%dI" ((USItype)(u)),                                      \
                    472:             "dI" ((USItype)(v)));                                      \
                    473:   (w1) = __xx.__i.__h; (w0) = __xx.__i.__l;})
                    474: #define __umulsidi3(u, v) \
                    475:   ({UDItype __w;                                                       \
                    476:     __asm__ ("emul     %2,%1,%0"                                       \
                    477:             : "=d" (__w)                                               \
                    478:             : "%dI" ((USItype)(u)),                                    \
                    479:               "dI" ((USItype)(v)));                                    \
                    480:     __w; })
                    481: #define udiv_qrnnd(q, r, nh, nl, d) \
                    482:   do {                                                                 \
                    483:     union {UDItype __ll;                                               \
                    484:           struct {USItype __l, __h;} __i;                              \
                    485:          } __nn;                                                       \
                    486:     __nn.__i.__h = (nh); __nn.__i.__l = (nl);                          \
                    487:     __asm__ ("ediv %d,%n,%0"                                           \
                    488:           : "=d" (__rq.__ll)                                           \
                    489:           : "dI" (__nn.__ll),                                          \
                    490:             "dI" ((USItype)(d)));                                      \
                    491:     (r) = __rq.__i.__l; (q) = __rq.__i.__h;                            \
                    492:   } while (0)
                    493: #define count_leading_zeros(count, x) \
                    494:   do {                                                                 \
                    495:     USItype __cbtmp;                                                   \
                    496:     __asm__ ("scanbit %1,%0"                                           \
                    497:             : "=r" (__cbtmp)                                           \
                    498:             : "r" ((USItype)(x)));                                     \
                    499:     (count) = __cbtmp ^ 31;                                            \
                    500:   } while (0)
                    501: #define COUNT_LEADING_ZEROS_0 (-32) /* sic */
                    502: #if defined (__i960mx)         /* what is the proper symbol to test??? */
                    503: #define rshift_rhlc(r,h,l,c) \
                    504:   do {                                                                 \
                    505:     union {UDItype __ll;                                               \
                    506:           struct {USItype __l, __h;} __i;                              \
                    507:          } __nn;                                                       \
                    508:     __nn.__i.__h = (h); __nn.__i.__l = (l);                            \
                    509:     __asm__ ("shre %2,%1,%0"                                           \
                    510:             : "=d" (r) : "dI" (__nn.__ll), "dI" (c));                  \
                    511:   }
                    512: #endif /* i960mx */
                    513: #endif /* i960 */
                    514:
                    515: #if (defined (__mc68000__) || defined (__mc68020__) || defined (__NeXT__) || defined(mc68020)) && W_TYPE_SIZE == 32
                    516: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                    517:   __asm__ ("add%.l %5,%1
                    518:        addx%.l %3,%0"                                                  \
                    519:           : "=d" ((USItype)(sh)),                                      \
                    520:             "=&d" ((USItype)(sl))                                      \
                    521:           : "%0" ((USItype)(ah)),                                      \
                    522:             "d" ((USItype)(bh)),                                       \
                    523:             "%1" ((USItype)(al)),                                      \
                    524:             "g" ((USItype)(bl)))
                    525: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                    526:   __asm__ ("sub%.l %5,%1
                    527:        subx%.l %3,%0"                                                  \
                    528:           : "=d" ((USItype)(sh)),                                      \
                    529:             "=&d" ((USItype)(sl))                                      \
                    530:           : "0" ((USItype)(ah)),                                       \
                    531:             "d" ((USItype)(bh)),                                       \
                    532:             "1" ((USItype)(al)),                                       \
                    533:             "g" ((USItype)(bl)))
                    534: #if (defined (__mc68020__) || defined (__NeXT__) || defined(mc68020))
                    535: #define umul_ppmm(w1, w0, u, v) \
                    536:   __asm__ ("mulu%.l %3,%1:%0"                                          \
                    537:           : "=d" ((USItype)(w0)),                                      \
                    538:             "=d" ((USItype)(w1))                                       \
                    539:           : "%0" ((USItype)(u)),                                       \
                    540:             "dmi" ((USItype)(v)))
                    541: #define UMUL_TIME 45
                    542: #define udiv_qrnnd(q, r, n1, n0, d) \
                    543:   __asm__ ("divu%.l %4,%1:%0"                                          \
                    544:           : "=d" ((USItype)(q)),                                       \
                    545:             "=d" ((USItype)(r))                                        \
                    546:           : "0" ((USItype)(n0)),                                       \
                    547:             "1" ((USItype)(n1)),                                       \
                    548:             "dmi" ((USItype)(d)))
                    549: #define UDIV_TIME 90
                    550: #define sdiv_qrnnd(q, r, n1, n0, d) \
                    551:   __asm__ ("divs%.l %4,%1:%0"                                          \
                    552:           : "=d" ((USItype)(q)),                                       \
                    553:             "=d" ((USItype)(r))                                        \
                    554:           : "0" ((USItype)(n0)),                                       \
                    555:             "1" ((USItype)(n1)),                                       \
                    556:             "dmi" ((USItype)(d)))
                    557: #define count_leading_zeros(count, x) \
                    558:   __asm__ ("bfffo %1{%b2:%b2},%0"                                      \
                    559:           : "=d" ((USItype)(count))                                    \
                    560:           : "od" ((USItype)(x)), "n" (0))
                    561: #define COUNT_LEADING_ZEROS_0 32
                    562: #else /* not mc68020 */
                    563: #define umul_ppmm(xh, xl, a, b) \
                    564:   do { USItype __umul_tmp1, __umul_tmp2;                               \
                    565:        __asm__ ("| Inlined umul_ppmm
                    566:        move%.l %5,%3
                    567:        move%.l %2,%0
                    568:        move%.w %3,%1
                    569:        swap    %3
                    570:        swap    %0
                    571:        mulu    %2,%1
                    572:        mulu    %3,%0
                    573:        mulu    %2,%3
                    574:        swap    %2
                    575:        mulu    %5,%2
                    576:        add%.l  %3,%2
                    577:        jcc     1f
                    578:        add%.l  %#0x10000,%0
                    579: 1:     move%.l %2,%3
                    580:        clr%.w  %2
                    581:        swap    %2
                    582:        swap    %3
                    583:        clr%.w  %3
                    584:        add%.l  %3,%1
                    585:        addx%.l %2,%0
                    586:        | End inlined umul_ppmm"                                        \
                    587:              : "=&d" ((USItype)(xh)), "=&d" ((USItype)(xl)),           \
                    588:                "=d" (__umul_tmp1), "=&d" (__umul_tmp2)                 \
                    589:              : "%2" ((USItype)(a)), "d" ((USItype)(b)));               \
                    590:   } while (0)
                    591: #define UMUL_TIME 100
                    592: #define UDIV_TIME 400
                    593: #endif /* not mc68020 */
                    594: #endif /* mc68000 */
                    595:
                    596: #if defined (__m88000__) && W_TYPE_SIZE == 32
                    597: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                    598:   __asm__ ("addu.co %1,%r4,%r5
                    599:        addu.ci %0,%r2,%r3"                                             \
                    600:           : "=r" ((USItype)(sh)),                                      \
                    601:             "=&r" ((USItype)(sl))                                      \
                    602:           : "%rJ" ((USItype)(ah)),                                     \
                    603:             "rJ" ((USItype)(bh)),                                      \
                    604:             "%rJ" ((USItype)(al)),                                     \
                    605:             "rJ" ((USItype)(bl)))
                    606: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                    607:   __asm__ ("subu.co %1,%r4,%r5
                    608:        subu.ci %0,%r2,%r3"                                             \
                    609:           : "=r" ((USItype)(sh)),                                      \
                    610:             "=&r" ((USItype)(sl))                                      \
                    611:           : "rJ" ((USItype)(ah)),                                      \
                    612:             "rJ" ((USItype)(bh)),                                      \
                    613:             "rJ" ((USItype)(al)),                                      \
                    614:             "rJ" ((USItype)(bl)))
                    615: #define count_leading_zeros(count, x) \
                    616:   do {                                                                 \
                    617:     USItype __cbtmp;                                                   \
                    618:     __asm__ ("ff1 %0,%1"                                               \
                    619:             : "=r" (__cbtmp)                                           \
                    620:             : "r" ((USItype)(x)));                                     \
                    621:     (count) = __cbtmp ^ 31;                                            \
                    622:   } while (0)
                    623: #define COUNT_LEADING_ZEROS_0 63 /* sic */
                    624: #if defined (__m88110__)
                    625: #define umul_ppmm(wh, wl, u, v) \
                    626:   do {                                                                 \
                    627:     union {UDItype __ll;                                               \
                    628:           struct {USItype __h, __l;} __i;                              \
                    629:          } __xx;                                                       \
                    630:     __asm__ ("mulu.d   %0,%1,%2"                                       \
                    631:             : "=r" (__xx.__ll)                                         \
                    632:             : "r" ((USItype)(u)),                                      \
                    633:               "r" ((USItype)(v)));                                     \
                    634:     (wh) = __xx.__i.__h;                                               \
                    635:     (wl) = __xx.__i.__l;                                               \
                    636:   } while (0)
                    637: #define udiv_qrnnd(q, r, n1, n0, d) \
                    638:   ({union {UDItype __ll;                                               \
                    639:           struct {USItype __h, __l;} __i;                              \
                    640:          } __xx;                                                       \
                    641:   USItype __q;                                                         \
                    642:   __xx.__i.__h = (n1); __xx.__i.__l = (n0);                            \
                    643:   __asm__ ("divu.d %0,%1,%2"                                           \
                    644:           : "=r" (__q)                                                 \
                    645:           : "r" (__xx.__ll),                                           \
                    646:             "r" ((USItype)(d)));                                       \
                    647:   (r) = (n0) - __q * (d); (q) = __q; })
                    648: #define UMUL_TIME 5
                    649: #define UDIV_TIME 25
                    650: #else
                    651: #define UMUL_TIME 17
                    652: #define UDIV_TIME 150
                    653: #endif /* __m88110__ */
                    654: #endif /* __m88000__ */
                    655:
                    656: #if defined (__mips__) && W_TYPE_SIZE == 32
                    657: #if __GNUC__ > 2 || __GNUC_MINOR__ >= 7
                    658: #define umul_ppmm(w1, w0, u, v) \
                    659:   __asm__ ("multu %2,%3"                                               \
                    660:           : "=l" ((USItype)(w0)),                                      \
                    661:             "=h" ((USItype)(w1))                                       \
                    662:           : "d" ((USItype)(u)),                                        \
                    663:             "d" ((USItype)(v)))
                    664: #else
                    665: #define umul_ppmm(w1, w0, u, v) \
                    666:   __asm__ ("multu %2,%3
                    667:        mflo %0
                    668:        mfhi %1"                                                        \
                    669:           : "=d" ((USItype)(w0)),                                      \
                    670:             "=d" ((USItype)(w1))                                       \
                    671:           : "d" ((USItype)(u)),                                        \
                    672:             "d" ((USItype)(v)))
                    673: #endif
                    674: #define UMUL_TIME 10
                    675: #define UDIV_TIME 100
                    676: #endif /* __mips__ */
                    677:
                    678: #if (defined (__mips) && __mips >= 3) && W_TYPE_SIZE == 64
                    679: #if __GNUC__ > 2 || __GNUC_MINOR__ >= 7
                    680: #define umul_ppmm(w1, w0, u, v) \
                    681:   __asm__ ("dmultu %2,%3"                                              \
                    682:           : "=l" ((UDItype)(w0)),                                      \
                    683:             "=h" ((UDItype)(w1))                                       \
                    684:           : "d" ((UDItype)(u)),                                        \
                    685:             "d" ((UDItype)(v)))
                    686: #else
                    687: #define umul_ppmm(w1, w0, u, v) \
                    688:   __asm__ ("dmultu %2,%3
                    689:        mflo %0
                    690:        mfhi %1"                                                        \
                    691:           : "=d" ((UDItype)(w0)),                                      \
                    692:             "=d" ((UDItype)(w1))                                       \
                    693:           : "d" ((UDItype)(u)),                                        \
                    694:             "d" ((UDItype)(v)))
                    695: #endif
                    696: #define UMUL_TIME 20
                    697: #define UDIV_TIME 140
                    698: #endif /* __mips__ */
                    699:
                    700: #if defined (__ns32000__) && W_TYPE_SIZE == 32
                    701: #define umul_ppmm(w1, w0, u, v) \
                    702:   ({union {UDItype __ll;                                               \
                    703:           struct {USItype __l, __h;} __i;                              \
                    704:          } __xx;                                                       \
                    705:   __asm__ ("meid %2,%0"                                                        \
                    706:           : "=g" (__xx.__ll)                                           \
                    707:           : "%0" ((USItype)(u)),                                       \
                    708:             "g" ((USItype)(v)));                                       \
                    709:   (w1) = __xx.__i.__h; (w0) = __xx.__i.__l;})
                    710: #define __umulsidi3(u, v) \
                    711:   ({UDItype __w;                                                       \
                    712:     __asm__ ("meid %2,%0"                                              \
                    713:             : "=g" (__w)                                               \
                    714:             : "%0" ((USItype)(u)),                                     \
                    715:               "g" ((USItype)(v)));                                     \
                    716:     __w; })
                    717: #define udiv_qrnnd(q, r, n1, n0, d) \
                    718:   ({union {UDItype __ll;                                               \
                    719:           struct {USItype __l, __h;} __i;                              \
                    720:          } __xx;                                                       \
                    721:   __xx.__i.__h = (n1); __xx.__i.__l = (n0);                            \
                    722:   __asm__ ("deid %2,%0"                                                        \
                    723:           : "=g" (__xx.__ll)                                           \
                    724:           : "0" (__xx.__ll),                                           \
                    725:             "g" ((USItype)(d)));                                       \
                    726:   (r) = __xx.__i.__l; (q) = __xx.__i.__h; })
                    727: #define count_trailing_zeros(count,x) \
                    728:   do {
                    729:     __asm__ ("ffsd     %2,%0"                                          \
                    730:             : "=r" ((USItype) (count))                                 \
                    731:             : "0" ((USItype) 0),                                       \
                    732:               "r" ((USItype) (x)));                                    \
                    733:   } while (0)
                    734: #endif /* __ns32000__ */
                    735:
                    736: #if (defined (_ARCH_PPC) || defined (_IBMR2)) && W_TYPE_SIZE == 32
                    737: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                    738:   do {                                                                 \
                    739:     if (__builtin_constant_p (bh) && (bh) == 0)                                \
                    740:       __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{aze|addze} %0,%2"          \
                    741:             : "=r" ((USItype)(sh)),                                    \
                    742:               "=&r" ((USItype)(sl))                                    \
                    743:             : "%r" ((USItype)(ah)),                                    \
                    744:               "%r" ((USItype)(al)),                                    \
                    745:               "rI" ((USItype)(bl)));                                   \
                    746:     else if (__builtin_constant_p (bh) && (bh) ==~(USItype) 0)         \
                    747:       __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{ame|addme} %0,%2"          \
                    748:             : "=r" ((USItype)(sh)),                                    \
                    749:               "=&r" ((USItype)(sl))                                    \
                    750:             : "%r" ((USItype)(ah)),                                    \
                    751:               "%r" ((USItype)(al)),                                    \
                    752:               "rI" ((USItype)(bl)));                                   \
                    753:     else                                                               \
                    754:       __asm__ ("{a%I5|add%I5c} %1,%4,%5\n\t{ae|adde} %0,%2,%3"         \
                    755:             : "=r" ((USItype)(sh)),                                    \
                    756:               "=&r" ((USItype)(sl))                                    \
                    757:             : "%r" ((USItype)(ah)),                                    \
                    758:               "r" ((USItype)(bh)),                                     \
                    759:               "%r" ((USItype)(al)),                                    \
                    760:               "rI" ((USItype)(bl)));                                   \
                    761:   } while (0)
                    762: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                    763:   do {                                                                 \
                    764:     if (__builtin_constant_p (ah) && (ah) == 0)                                \
                    765:       __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfze|subfze} %0,%2"      \
                    766:               : "=r" ((USItype)(sh)),                                  \
                    767:                 "=&r" ((USItype)(sl))                                  \
                    768:               : "r" ((USItype)(bh)),                                   \
                    769:                 "rI" ((USItype)(al)),                                  \
                    770:                 "r" ((USItype)(bl)));                                  \
                    771:     else if (__builtin_constant_p (ah) && (ah) ==~(USItype) 0)         \
                    772:       __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfme|subfme} %0,%2"      \
                    773:               : "=r" ((USItype)(sh)),                                  \
                    774:                 "=&r" ((USItype)(sl))                                  \
                    775:               : "r" ((USItype)(bh)),                                   \
                    776:                 "rI" ((USItype)(al)),                                  \
                    777:                 "r" ((USItype)(bl)));                                  \
                    778:     else if (__builtin_constant_p (bh) && (bh) == 0)                   \
                    779:       __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{ame|addme} %0,%2"                \
                    780:               : "=r" ((USItype)(sh)),                                  \
                    781:                 "=&r" ((USItype)(sl))                                  \
                    782:               : "r" ((USItype)(ah)),                                   \
                    783:                 "rI" ((USItype)(al)),                                  \
                    784:                 "r" ((USItype)(bl)));                                  \
                    785:     else if (__builtin_constant_p (bh) && (bh) ==~(USItype) 0)         \
                    786:       __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{aze|addze} %0,%2"                \
                    787:               : "=r" ((USItype)(sh)),                                  \
                    788:                 "=&r" ((USItype)(sl))                                  \
                    789:               : "r" ((USItype)(ah)),                                   \
                    790:                 "rI" ((USItype)(al)),                                  \
                    791:                 "r" ((USItype)(bl)));                                  \
                    792:     else                                                               \
                    793:       __asm__ ("{sf%I4|subf%I4c} %1,%5,%4\n\t{sfe|subfe} %0,%3,%2"     \
                    794:               : "=r" ((USItype)(sh)),                                  \
                    795:                 "=&r" ((USItype)(sl))                                  \
                    796:               : "r" ((USItype)(ah)),                                   \
                    797:                 "r" ((USItype)(bh)),                                   \
                    798:                 "rI" ((USItype)(al)),                                  \
                    799:                 "r" ((USItype)(bl)));                                  \
                    800:   } while (0)
                    801: #define count_leading_zeros(count, x) \
                    802:   __asm__ ("{cntlz|cntlzw} %0,%1"                                      \
                    803:           : "=r" ((USItype)(count))                                    \
                    804:           : "r" ((USItype)(x)))
                    805: #define COUNT_LEADING_ZEROS_0 32
                    806: #if defined (_ARCH_PPC)
                    807: #define umul_ppmm(ph, pl, m0, m1) \
                    808:   do {                                                                 \
                    809:     USItype __m0 = (m0), __m1 = (m1);                                  \
                    810:     __asm__ ("mulhwu %0,%1,%2"                                         \
                    811:             : "=r" ((USItype) ph)                                      \
                    812:             : "%r" (__m0),                                             \
                    813:               "r" (__m1));                                             \
                    814:     (pl) = __m0 * __m1;                                                        \
                    815:   } while (0)
                    816: #define UMUL_TIME 15
                    817: #define smul_ppmm(ph, pl, m0, m1) \
                    818:   do {                                                                 \
                    819:     SItype __m0 = (m0), __m1 = (m1);                                   \
                    820:     __asm__ ("mulhw %0,%1,%2"                                          \
                    821:             : "=r" ((SItype) ph)                                       \
                    822:             : "%r" (__m0),                                             \
                    823:               "r" (__m1));                                             \
                    824:     (pl) = __m0 * __m1;                                                        \
                    825:   } while (0)
                    826: #define SMUL_TIME 14
                    827: #define UDIV_TIME 120
                    828: #else
                    829: #define umul_ppmm(xh, xl, m0, m1) \
                    830:   do {                                                                 \
                    831:     USItype __m0 = (m0), __m1 = (m1);                                  \
                    832:     __asm__ ("mul %0,%2,%3"                                            \
                    833:             : "=r" ((USItype)(xh)),                                    \
                    834:               "=q" ((USItype)(xl))                                     \
                    835:             : "r" (__m0),                                              \
                    836:               "r" (__m1));                                             \
                    837:     (xh) += ((((SItype) __m0 >> 31) & __m1)                            \
                    838:             + (((SItype) __m1 >> 31) & __m0));                         \
                    839:   } while (0)
                    840: #define UMUL_TIME 8
                    841: #define smul_ppmm(xh, xl, m0, m1) \
                    842:   __asm__ ("mul %0,%2,%3"                                              \
                    843:           : "=r" ((SItype)(xh)),                                       \
                    844:             "=q" ((SItype)(xl))                                        \
                    845:           : "r" (m0),                                                  \
                    846:             "r" (m1))
                    847: #define SMUL_TIME 4
                    848: #define sdiv_qrnnd(q, r, nh, nl, d) \
                    849:   __asm__ ("div %0,%2,%4"                                              \
                    850:           : "=r" ((SItype)(q)), "=q" ((SItype)(r))                     \
                    851:           : "r" ((SItype)(nh)), "1" ((SItype)(nl)), "r" ((SItype)(d)))
                    852: #define UDIV_TIME 100
                    853: #endif
                    854: #endif /* Power architecture variants.  */
                    855:
                    856: #if defined (__pyr__) && W_TYPE_SIZE == 32
                    857: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                    858:   __asm__ ("addw       %5,%1
                    859:        addwc   %3,%0"                                                  \
                    860:           : "=r" ((USItype)(sh)),                                      \
                    861:             "=&r" ((USItype)(sl))                                      \
                    862:           : "%0" ((USItype)(ah)),                                      \
                    863:             "g" ((USItype)(bh)),                                       \
                    864:             "%1" ((USItype)(al)),                                      \
                    865:             "g" ((USItype)(bl)))
                    866: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                    867:   __asm__ ("subw       %5,%1
                    868:        subwb   %3,%0"                                                  \
                    869:           : "=r" ((USItype)(sh)),                                      \
                    870:             "=&r" ((USItype)(sl))                                      \
                    871:           : "0" ((USItype)(ah)),                                       \
                    872:             "g" ((USItype)(bh)),                                       \
                    873:             "1" ((USItype)(al)),                                       \
                    874:             "g" ((USItype)(bl)))
                    875: /* This insn works on Pyramids with AP, XP, or MI CPUs, but not with SP.  */
                    876: #define umul_ppmm(w1, w0, u, v) \
                    877:   ({union {UDItype __ll;                                               \
                    878:           struct {USItype __h, __l;} __i;                              \
                    879:          } __xx;                                                       \
                    880:   __asm__ ("movw %1,%R0
                    881:        uemul %2,%0"                                                    \
                    882:           : "=&r" (__xx.__ll)                                          \
                    883:           : "g" ((USItype) (u)),                                       \
                    884:             "g" ((USItype)(v)));                                       \
                    885:   (w1) = __xx.__i.__h; (w0) = __xx.__i.__l;})
                    886: #endif /* __pyr__ */
                    887:
                    888: #if defined (__ibm032__) /* RT/ROMP */  && W_TYPE_SIZE == 32
                    889: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                    890:   __asm__ ("a %1,%5
                    891:        ae %0,%3"                                                       \
                    892:           : "=r" ((USItype)(sh)),                                      \
                    893:             "=&r" ((USItype)(sl))                                      \
                    894:           : "%0" ((USItype)(ah)),                                      \
                    895:             "r" ((USItype)(bh)),                                       \
                    896:             "%1" ((USItype)(al)),                                      \
                    897:             "r" ((USItype)(bl)))
                    898: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                    899:   __asm__ ("s %1,%5
                    900:        se %0,%3"                                                       \
                    901:           : "=r" ((USItype)(sh)),                                      \
                    902:             "=&r" ((USItype)(sl))                                      \
                    903:           : "0" ((USItype)(ah)),                                       \
                    904:             "r" ((USItype)(bh)),                                       \
                    905:             "1" ((USItype)(al)),                                       \
                    906:             "r" ((USItype)(bl)))
                    907: #define umul_ppmm(ph, pl, m0, m1) \
                    908:   do {                                                                 \
                    909:     USItype __m0 = (m0), __m1 = (m1);                                  \
                    910:     __asm__ (                                                          \
                    911:        "s      r2,r2
                    912:        mts     r10,%2
                    913:        m       r2,%3
                    914:        m       r2,%3
                    915:        m       r2,%3
                    916:        m       r2,%3
                    917:        m       r2,%3
                    918:        m       r2,%3
                    919:        m       r2,%3
                    920:        m       r2,%3
                    921:        m       r2,%3
                    922:        m       r2,%3
                    923:        m       r2,%3
                    924:        m       r2,%3
                    925:        m       r2,%3
                    926:        m       r2,%3
                    927:        m       r2,%3
                    928:        m       r2,%3
                    929:        cas     %0,r2,r0
                    930:        mfs     r10,%1"                                                 \
                    931:             : "=r" ((USItype)(ph)),                                    \
                    932:               "=r" ((USItype)(pl))                                     \
                    933:             : "%r" (__m0),                                             \
                    934:                "r" (__m1)                                              \
                    935:             : "r2");                                                   \
                    936:     (ph) += ((((SItype) __m0 >> 31) & __m1)                            \
                    937:             + (((SItype) __m1 >> 31) & __m0));                         \
                    938:   } while (0)
                    939: #define UMUL_TIME 20
                    940: #define UDIV_TIME 200
                    941: #define count_leading_zeros(count, x) \
                    942:   do {                                                                 \
                    943:     if ((x) >= 0x10000)                                                        \
                    944:       __asm__ ("clz    %0,%1"                                          \
                    945:               : "=r" ((USItype)(count))                                \
                    946:               : "r" ((USItype)(x) >> 16));                             \
                    947:     else                                                               \
                    948:       {                                                                        \
                    949:        __asm__ ("clz   %0,%1"                                          \
                    950:                 : "=r" ((USItype)(count))                              \
                    951:                 : "r" ((USItype)(x)));                                 \
                    952:        (count) += 16;                                                  \
                    953:       }                                                                        \
                    954:   } while (0)
                    955: #endif /* RT/ROMP */
                    956:
                    957: #if defined (__sh2__) && W_TYPE_SIZE == 32
                    958: #define umul_ppmm(w1, w0, u, v) \
                    959:   __asm__ (                                                            \
                    960:        "dmulu.l        %2,%3
                    961:        sts     macl,%1
                    962:        sts     mach,%0"                                                \
                    963:           : "=r" ((USItype)(w1)),                                      \
                    964:             "=r" ((USItype)(w0))                                       \
                    965:           : "r" ((USItype)(u)),                                        \
                    966:             "r" ((USItype)(v))                                         \
                    967:           : "macl", "mach")
                    968: #define UMUL_TIME 5
                    969: #endif
                    970:
                    971: #if defined (__sparc__) && W_TYPE_SIZE == 32
                    972: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                    973:   __asm__ ("addcc %r4,%5,%1
                    974:        addx %r2,%3,%0"                                                 \
                    975:           : "=r" ((USItype)(sh)),                                      \
                    976:             "=&r" ((USItype)(sl))                                      \
                    977:           : "%rJ" ((USItype)(ah)),                                     \
                    978:             "rI" ((USItype)(bh)),                                      \
                    979:             "%rJ" ((USItype)(al)),                                     \
                    980:             "rI" ((USItype)(bl))                                       \
                    981:           __CLOBBER_CC)
                    982: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                    983:   __asm__ ("subcc %r4,%5,%1
                    984:        subx %r2,%3,%0"                                                 \
                    985:           : "=r" ((USItype)(sh)),                                      \
                    986:             "=&r" ((USItype)(sl))                                      \
                    987:           : "rJ" ((USItype)(ah)),                                      \
                    988:             "rI" ((USItype)(bh)),                                      \
                    989:             "rJ" ((USItype)(al)),                                      \
                    990:             "rI" ((USItype)(bl))                                       \
                    991:           __CLOBBER_CC)
                    992: #if defined (__sparc_v8__)
                    993: /* Don't match immediate range because, 1) it is not often useful,
                    994:    2) the 'I' flag thinks of the range as a 13 bit signed interval,
                    995:    while we want to match a 13 bit interval, sign extended to 32 bits,
                    996:    but INTERPRETED AS UNSIGNED.  */
                    997: #define umul_ppmm(w1, w0, u, v) \
                    998:   __asm__ ("umul %2,%3,%1;rd %%y,%0"                                   \
                    999:           : "=r" ((USItype)(w1)),                                      \
                   1000:             "=r" ((USItype)(w0))                                       \
                   1001:           : "r" ((USItype)(u)),                                        \
                   1002:             "r" ((USItype)(v)))
                   1003: #define UMUL_TIME 5
                   1004: #ifndef SUPERSPARC     /* SuperSPARC's udiv only handles 53 bit dividends */
                   1005: #define udiv_qrnnd(q, r, n1, n0, d) \
                   1006:   do {                                                                 \
                   1007:     USItype __q;                                                       \
                   1008:     __asm__ ("mov %1,%%y;nop;nop;nop;udiv %2,%3,%0"                    \
                   1009:             : "=r" ((USItype)(__q))                                    \
                   1010:             : "r" ((USItype)(n1)),                                     \
                   1011:               "r" ((USItype)(n0)),                                     \
                   1012:               "r" ((USItype)(d)));                                     \
                   1013:     (r) = (n0) - __q * (d);                                            \
                   1014:     (q) = __q;                                                         \
                   1015:   } while (0)
                   1016: #define UDIV_TIME 25
                   1017: #endif /* SUPERSPARC */
                   1018: #else /* ! __sparc_v8__ */
                   1019: #if defined (__sparclite__)
                   1020: /* This has hardware multiply but not divide.  It also has two additional
                   1021:    instructions scan (ffs from high bit) and divscc.  */
                   1022: #define umul_ppmm(w1, w0, u, v) \
                   1023:   __asm__ ("umul %2,%3,%1;rd %%y,%0"                                   \
                   1024:           : "=r" ((USItype)(w1)),                                      \
                   1025:             "=r" ((USItype)(w0))                                       \
                   1026:           : "r" ((USItype)(u)),                                        \
                   1027:             "r" ((USItype)(v)))
                   1028: #define UMUL_TIME 5
                   1029: #define udiv_qrnnd(q, r, n1, n0, d) \
                   1030:   __asm__ ("! Inlined udiv_qrnnd
                   1031:        wr      %%g0,%2,%%y     ! Not a delayed write for sparclite
                   1032:        tst     %%g0
                   1033:        divscc  %3,%4,%%g1
                   1034:        divscc  %%g1,%4,%%g1
                   1035:        divscc  %%g1,%4,%%g1
                   1036:        divscc  %%g1,%4,%%g1
                   1037:        divscc  %%g1,%4,%%g1
                   1038:        divscc  %%g1,%4,%%g1
                   1039:        divscc  %%g1,%4,%%g1
                   1040:        divscc  %%g1,%4,%%g1
                   1041:        divscc  %%g1,%4,%%g1
                   1042:        divscc  %%g1,%4,%%g1
                   1043:        divscc  %%g1,%4,%%g1
                   1044:        divscc  %%g1,%4,%%g1
                   1045:        divscc  %%g1,%4,%%g1
                   1046:        divscc  %%g1,%4,%%g1
                   1047:        divscc  %%g1,%4,%%g1
                   1048:        divscc  %%g1,%4,%%g1
                   1049:        divscc  %%g1,%4,%%g1
                   1050:        divscc  %%g1,%4,%%g1
                   1051:        divscc  %%g1,%4,%%g1
                   1052:        divscc  %%g1,%4,%%g1
                   1053:        divscc  %%g1,%4,%%g1
                   1054:        divscc  %%g1,%4,%%g1
                   1055:        divscc  %%g1,%4,%%g1
                   1056:        divscc  %%g1,%4,%%g1
                   1057:        divscc  %%g1,%4,%%g1
                   1058:        divscc  %%g1,%4,%%g1
                   1059:        divscc  %%g1,%4,%%g1
                   1060:        divscc  %%g1,%4,%%g1
                   1061:        divscc  %%g1,%4,%%g1
                   1062:        divscc  %%g1,%4,%%g1
                   1063:        divscc  %%g1,%4,%%g1
                   1064:        divscc  %%g1,%4,%0
                   1065:        rd      %%y,%1
                   1066:        bl,a 1f
                   1067:        add     %1,%4,%1
                   1068: 1:     ! End of inline udiv_qrnnd"                                     \
                   1069:           : "=r" ((USItype)(q)),                                       \
                   1070:             "=r" ((USItype)(r))                                        \
                   1071:           : "r" ((USItype)(n1)),                                       \
                   1072:             "r" ((USItype)(n0)),                                       \
                   1073:             "rI" ((USItype)(d))                                        \
                   1074:           : "%g1" __AND_CLOBBER_CC)
                   1075: #define UDIV_TIME 37
                   1076: #define count_leading_zeros(count, x) \
                   1077:   __asm__ ("scan %1,0,%0"                                              \
                   1078:           : "=r" ((USItype)(x))                                        \
                   1079:           : "r" ((USItype)(count)))
                   1080: /* Early sparclites return 63 for an argument of 0, but they warn that future
                   1081:    implementations might change this.  Therefore, leave COUNT_LEADING_ZEROS_0
                   1082:    undefined.  */
                   1083: #endif /* __sparclite__ */
                   1084: #endif /* __sparc_v8__ */
                   1085: /* Default to sparc v7 versions of umul_ppmm and udiv_qrnnd.  */
                   1086: #ifndef umul_ppmm
                   1087: #define umul_ppmm(w1, w0, u, v) \
                   1088:   __asm__ ("! Inlined umul_ppmm
                   1089:        wr      %%g0,%2,%%y     ! SPARC has 0-3 delay insn after a wr
                   1090:        sra     %3,31,%%g2      ! Don't move this insn
                   1091:        and     %2,%%g2,%%g2    ! Don't move this insn
                   1092:        andcc   %%g0,0,%%g1     ! Don't move this insn
                   1093:        mulscc  %%g1,%3,%%g1
                   1094:        mulscc  %%g1,%3,%%g1
                   1095:        mulscc  %%g1,%3,%%g1
                   1096:        mulscc  %%g1,%3,%%g1
                   1097:        mulscc  %%g1,%3,%%g1
                   1098:        mulscc  %%g1,%3,%%g1
                   1099:        mulscc  %%g1,%3,%%g1
                   1100:        mulscc  %%g1,%3,%%g1
                   1101:        mulscc  %%g1,%3,%%g1
                   1102:        mulscc  %%g1,%3,%%g1
                   1103:        mulscc  %%g1,%3,%%g1
                   1104:        mulscc  %%g1,%3,%%g1
                   1105:        mulscc  %%g1,%3,%%g1
                   1106:        mulscc  %%g1,%3,%%g1
                   1107:        mulscc  %%g1,%3,%%g1
                   1108:        mulscc  %%g1,%3,%%g1
                   1109:        mulscc  %%g1,%3,%%g1
                   1110:        mulscc  %%g1,%3,%%g1
                   1111:        mulscc  %%g1,%3,%%g1
                   1112:        mulscc  %%g1,%3,%%g1
                   1113:        mulscc  %%g1,%3,%%g1
                   1114:        mulscc  %%g1,%3,%%g1
                   1115:        mulscc  %%g1,%3,%%g1
                   1116:        mulscc  %%g1,%3,%%g1
                   1117:        mulscc  %%g1,%3,%%g1
                   1118:        mulscc  %%g1,%3,%%g1
                   1119:        mulscc  %%g1,%3,%%g1
                   1120:        mulscc  %%g1,%3,%%g1
                   1121:        mulscc  %%g1,%3,%%g1
                   1122:        mulscc  %%g1,%3,%%g1
                   1123:        mulscc  %%g1,%3,%%g1
                   1124:        mulscc  %%g1,%3,%%g1
                   1125:        mulscc  %%g1,0,%%g1
                   1126:        add     %%g1,%%g2,%0
                   1127:        rd      %%y,%1"                                                 \
                   1128:           : "=r" ((USItype)(w1)),                                      \
                   1129:             "=r" ((USItype)(w0))                                       \
                   1130:           : "%rI" ((USItype)(u)),                                      \
                   1131:             "r" ((USItype)(v))                                         \
                   1132:           : "%g1", "%g2" __AND_CLOBBER_CC)
                   1133: #define UMUL_TIME 39           /* 39 instructions */
                   1134: #endif
                   1135: #ifndef udiv_qrnnd
                   1136: #ifndef LONGLONG_STANDALONE
                   1137: #define udiv_qrnnd(q, r, n1, n0, d) \
                   1138:   do { USItype __r;                                                    \
                   1139:     (q) = __udiv_qrnnd (&__r, (n1), (n0), (d));                                \
                   1140:     (r) = __r;                                                         \
                   1141:   } while (0)
                   1142: extern USItype __udiv_qrnnd ();
                   1143: #define UDIV_TIME 140
                   1144: #endif /* LONGLONG_STANDALONE */
                   1145: #endif /* udiv_qrnnd */
                   1146: #endif /* __sparc__ */
                   1147:
                   1148: #if defined (__vax__) && W_TYPE_SIZE == 32
                   1149: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                   1150:   __asm__ ("addl2 %5,%1
                   1151:        adwc %3,%0"                                                     \
                   1152:           : "=g" ((USItype)(sh)),                                      \
                   1153:             "=&g" ((USItype)(sl))                                      \
                   1154:           : "%0" ((USItype)(ah)),                                      \
                   1155:             "g" ((USItype)(bh)),                                       \
                   1156:             "%1" ((USItype)(al)),                                      \
                   1157:             "g" ((USItype)(bl)))
                   1158: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                   1159:   __asm__ ("subl2 %5,%1
                   1160:        sbwc %3,%0"                                                     \
                   1161:           : "=g" ((USItype)(sh)),                                      \
                   1162:             "=&g" ((USItype)(sl))                                      \
                   1163:           : "0" ((USItype)(ah)),                                       \
                   1164:             "g" ((USItype)(bh)),                                       \
                   1165:             "1" ((USItype)(al)),                                       \
                   1166:             "g" ((USItype)(bl)))
                   1167: #define umul_ppmm(xh, xl, m0, m1) \
                   1168:   do {                                                                 \
                   1169:     union {UDItype __ll;                                               \
                   1170:           struct {USItype __l, __h;} __i;                              \
                   1171:          } __xx;                                                       \
                   1172:     USItype __m0 = (m0), __m1 = (m1);                                  \
                   1173:     __asm__ ("emul %1,%2,$0,%0"                                                \
                   1174:             : "=g" (__xx.__ll)                                         \
                   1175:             : "g" (__m0),                                              \
                   1176:               "g" (__m1));                                             \
                   1177:     (xh) = __xx.__i.__h; (xl) = __xx.__i.__l;                          \
                   1178:     (xh) += ((((SItype) __m0 >> 31) & __m1)                            \
                   1179:             + (((SItype) __m1 >> 31) & __m0));                         \
                   1180:   } while (0)
                   1181: #define sdiv_qrnnd(q, r, n1, n0, d) \
                   1182:   do {                                                                 \
                   1183:     union {DItype __ll;                                                        \
                   1184:           struct {SItype __l, __h;} __i;                               \
                   1185:          } __xx;                                                       \
                   1186:     __xx.__i.__h = n1; __xx.__i.__l = n0;                              \
                   1187:     __asm__ ("ediv %3,%2,%0,%1"                                                \
                   1188:             : "=g" (q), "=g" (r)                                       \
                   1189:             : "g" (__xx.ll), "g" (d));                                 \
                   1190:   } while (0)
                   1191: #endif /* __vax__ */
                   1192:
                   1193: #if defined (__z8000__) && W_TYPE_SIZE == 16
                   1194: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                   1195:   __asm__ ("add        %H1,%H5\n\tadc  %H0,%H3"                                \
                   1196:           : "=r" ((unsigned int)(sh)),                                 \
                   1197:             "=&r" ((unsigned int)(sl))                                 \
                   1198:           : "%0" ((unsigned int)(ah)),                                 \
                   1199:             "r" ((unsigned int)(bh)),                                  \
                   1200:             "%1" ((unsigned int)(al)),                                 \
                   1201:             "rQR" ((unsigned int)(bl)))
                   1202: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                   1203:   __asm__ ("sub        %H1,%H5\n\tsbc  %H0,%H3"                                \
                   1204:           : "=r" ((unsigned int)(sh)),                                 \
                   1205:             "=&r" ((unsigned int)(sl))                                 \
                   1206:           : "0" ((unsigned int)(ah)),                                  \
                   1207:             "r" ((unsigned int)(bh)),                                  \
                   1208:             "1" ((unsigned int)(al)),                                  \
                   1209:             "rQR" ((unsigned int)(bl)))
                   1210: #define umul_ppmm(xh, xl, m0, m1) \
                   1211:   do {                                                                 \
                   1212:     union {long int __ll;                                              \
                   1213:           struct {unsigned int __h, __l;} __i;                         \
                   1214:          } __xx;                                                       \
                   1215:     unsigned int __m0 = (m0), __m1 = (m1);                             \
                   1216:     __asm__ ("mult     %S0,%H3"                                        \
                   1217:             : "=r" (__xx.__i.__h),                                     \
                   1218:               "=r" (__xx.__i.__l)                                      \
                   1219:             : "%1" (__m0),                                             \
                   1220:               "rQR" (__m1));                                           \
                   1221:     (xh) = __xx.__i.__h; (xl) = __xx.__i.__l;                          \
                   1222:     (xh) += ((((signed int) __m0 >> 15) & __m1)                                \
                   1223:             + (((signed int) __m1 >> 15) & __m0));                     \
                   1224:   } while (0)
                   1225: #endif /* __z8000__ */
                   1226:
                   1227: #endif /* __GNUC__ */
                   1228:
                   1229:
                   1230: #if !defined (umul_ppmm) && defined (__umulsidi3)
                   1231: #define umul_ppmm(ph, pl, m0, m1) \
                   1232:   {                                                                    \
                   1233:     UDWtype __ll = __umulsidi3 (m0, m1);                               \
                   1234:     ph = (UWtype) (__ll >> W_TYPE_SIZE);                               \
                   1235:     pl = (UWtype) __ll;                                                        \
                   1236:   }
                   1237: #endif
                   1238:
                   1239: #if !defined (__umulsidi3)
                   1240: #define __umulsidi3(u, v) \
                   1241:   ({UWtype __hi, __lo;                                                 \
                   1242:     umul_ppmm (__hi, __lo, u, v);                                      \
                   1243:     ((UDWtype) __hi << W_TYPE_SIZE) | __lo; })
                   1244: #endif
                   1245:
                   1246: /* If this machine has no inline assembler, use C macros.  */
                   1247:
                   1248: #if !defined (add_ssaaaa)
                   1249: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                   1250:   do {                                                                 \
                   1251:     UWtype __x;                                                                \
                   1252:     __x = (al) + (bl);                                                 \
                   1253:     (sh) = (ah) + (bh) + (__x < (al));                                 \
                   1254:     (sl) = __x;                                                                \
                   1255:   } while (0)
                   1256: #endif
                   1257:
                   1258: #if !defined (sub_ddmmss)
                   1259: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                   1260:   do {                                                                 \
                   1261:     UWtype __x;                                                                \
                   1262:     __x = (al) - (bl);                                                 \
                   1263:     (sh) = (ah) - (bh) - (__x > (al));                                 \
                   1264:     (sl) = __x;                                                                \
                   1265:   } while (0)
                   1266: #endif
                   1267:
                   1268: #if !defined (umul_ppmm)
                   1269: #define umul_ppmm(w1, w0, u, v)                                                \
                   1270:   do {                                                                 \
                   1271:     UWtype __x0, __x1, __x2, __x3;                                     \
                   1272:     UHWtype __ul, __vl, __uh, __vh;                                    \
                   1273:     UWtype __u = (u), __v = (v);                                       \
                   1274:                                                                        \
                   1275:     __ul = __ll_lowpart (__u);                                         \
                   1276:     __uh = __ll_highpart (__u);                                                \
                   1277:     __vl = __ll_lowpart (__v);                                         \
                   1278:     __vh = __ll_highpart (__v);                                                \
                   1279:                                                                        \
                   1280:     __x0 = (UWtype) __ul * __vl;                                       \
                   1281:     __x1 = (UWtype) __ul * __vh;                                       \
                   1282:     __x2 = (UWtype) __uh * __vl;                                       \
                   1283:     __x3 = (UWtype) __uh * __vh;                                       \
                   1284:                                                                        \
                   1285:     __x1 += __ll_highpart (__x0);/* this can't give carry */           \
                   1286:     __x1 += __x2;              /* but this indeed can */               \
                   1287:     if (__x1 < __x2)           /* did we get it? */                    \
                   1288:       __x3 += __ll_B;          /* yes, add it in the proper pos. */    \
                   1289:                                                                        \
                   1290:     (w1) = __x3 + __ll_highpart (__x1);                                        \
                   1291:     (w0) = (__ll_lowpart (__x1) << W_TYPE_SIZE/2) + __ll_lowpart (__x0);\
                   1292:   } while (0)
                   1293: #endif
                   1294:
                   1295: #if !defined (umul_ppmm)
                   1296: #define smul_ppmm(w1, w0, u, v)                                                \
                   1297:   do {                                                                 \
                   1298:     UWtype __w1;                                                       \
                   1299:     UWtype __m0 = (u), __m1 = (v);                                     \
                   1300:     umul_ppmm (__w1, w0, __m0, __m1);                                  \
                   1301:     (w1) = __w1 - (-(__m0 >> (W_TYPE_SIZE - 1)) & __m1)                        \
                   1302:                - (-(__m1 >> (W_TYPE_SIZE - 1)) & __m0);                \
                   1303:   } while (0)
                   1304: #endif
                   1305:
                   1306: /* Define this unconditionally, so it can be used for debugging.  */
                   1307: #define __udiv_qrnnd_c(q, r, n1, n0, d) \
                   1308:   do {                                                                 \
                   1309:     UWtype __d1, __d0, __q1, __q0, __r1, __r0, __m;                    \
                   1310:     __d1 = __ll_highpart (d);                                          \
                   1311:     __d0 = __ll_lowpart (d);                                           \
                   1312:                                                                        \
                   1313:     __r1 = (n1) % __d1;                                                        \
                   1314:     __q1 = (n1) / __d1;                                                        \
                   1315:     __m = (UWtype) __q1 * __d0;                                                \
                   1316:     __r1 = __r1 * __ll_B | __ll_highpart (n0);                         \
                   1317:     if (__r1 < __m)                                                    \
                   1318:       {                                                                        \
                   1319:        __q1--, __r1 += (d);                                            \
                   1320:        if (__r1 >= (d)) /* i.e. we didn't get carry when adding to __r1 */\
                   1321:          if (__r1 < __m)                                               \
                   1322:            __q1--, __r1 += (d);                                        \
                   1323:       }                                                                        \
                   1324:     __r1 -= __m;                                                       \
                   1325:                                                                        \
                   1326:     __r0 = __r1 % __d1;                                                        \
                   1327:     __q0 = __r1 / __d1;                                                        \
                   1328:     __m = (UWtype) __q0 * __d0;                                                \
                   1329:     __r0 = __r0 * __ll_B | __ll_lowpart (n0);                          \
                   1330:     if (__r0 < __m)                                                    \
                   1331:       {                                                                        \
                   1332:        __q0--, __r0 += (d);                                            \
                   1333:        if (__r0 >= (d))                                                \
                   1334:          if (__r0 < __m)                                               \
                   1335:            __q0--, __r0 += (d);                                        \
                   1336:       }                                                                        \
                   1337:     __r0 -= __m;                                                       \
                   1338:                                                                        \
                   1339:     (q) = (UWtype) __q1 * __ll_B | __q0;                               \
                   1340:     (r) = __r0;                                                                \
                   1341:   } while (0)
                   1342:
                   1343: /* If the processor has no udiv_qrnnd but sdiv_qrnnd, go through
                   1344:    __udiv_w_sdiv (defined in libgcc or elsewhere).  */
                   1345: #if !defined (udiv_qrnnd) && defined (sdiv_qrnnd)
                   1346: #define udiv_qrnnd(q, r, nh, nl, d) \
                   1347:   do {                                                                 \
                   1348:     UWtype __r;                                                                \
                   1349:     (q) = __MPN(udiv_w_sdiv) (&__r, nh, nl, d);                                \
                   1350:     (r) = __r;                                                         \
                   1351:   } while (0)
                   1352: #endif
                   1353:
                   1354: /* If udiv_qrnnd was not defined for this processor, use __udiv_qrnnd_c.  */
                   1355: #if !defined (udiv_qrnnd)
                   1356: #define UDIV_NEEDS_NORMALIZATION 1
                   1357: #define udiv_qrnnd __udiv_qrnnd_c
                   1358: #endif
                   1359:
                   1360: #if !defined (count_leading_zeros)
                   1361: extern
                   1362: #ifdef __STDC__
                   1363: const
                   1364: #endif
                   1365: unsigned char __clz_tab[];
                   1366: #define count_leading_zeros(count, x) \
                   1367:   do {                                                                 \
                   1368:     UWtype __xr = (x);                                                 \
                   1369:     UWtype __a;                                                                \
                   1370:                                                                        \
                   1371:     if (W_TYPE_SIZE <= 32)                                             \
                   1372:       {                                                                        \
                   1373:        __a = __xr < ((UWtype) 1 << 2*__BITS4)                          \
                   1374:          ? (__xr < ((UWtype) 1 << __BITS4) ? 0 : __BITS4)              \
                   1375:          : (__xr < ((UWtype) 1 << 3*__BITS4) ?  2*__BITS4 : 3*__BITS4);\
                   1376:       }                                                                        \
                   1377:     else                                                               \
                   1378:       {                                                                        \
                   1379:        for (__a = W_TYPE_SIZE - 8; __a > 0; __a -= 8)                  \
                   1380:          if (((__xr >> __a) & 0xff) != 0)                              \
                   1381:            break;                                                      \
                   1382:       }                                                                        \
                   1383:                                                                        \
                   1384:     (count) = W_TYPE_SIZE - (__clz_tab[__xr >> __a] + __a);            \
                   1385:   } while (0)
                   1386: /* This version gives a well-defined value for zero. */
                   1387: #define COUNT_LEADING_ZEROS_0 W_TYPE_SIZE
                   1388: #endif
                   1389:
                   1390: #if !defined (count_trailing_zeros)
                   1391: /* Define count_trailing_zeros using count_leading_zeros.  The latter might be
                   1392:    defined in asm, but if it is not, the C version above is good enough.  */
                   1393: #define count_trailing_zeros(count, x) \
                   1394:   do {                                                                 \
                   1395:     UWtype __ctz_x = (x);                                              \
                   1396:     UWtype __ctz_c;                                                    \
                   1397:     count_leading_zeros (__ctz_c, __ctz_x & -__ctz_x);                 \
                   1398:     (count) = W_TYPE_SIZE - 1 - __ctz_c;                               \
                   1399:   } while (0)
                   1400: #endif
                   1401:
                   1402: #ifndef UDIV_NEEDS_NORMALIZATION
                   1403: #define UDIV_NEEDS_NORMALIZATION 0
                   1404: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>