Annotation of gcc/longlong.h, revision 1.1.1.6

1.1       root        1: /* longlong.h -- definitions for mixed size 32/64 bit arithmetic.
1.1.1.6 ! root        2:    Copyright (C) 1991, 1992, 1994 Free Software Foundation, Inc.
1.1       root        3: 
                      4:    This definition file is free software; you can redistribute it
                      5:    and/or modify it under the terms of the GNU General Public
                      6:    License as published by the Free Software Foundation; either
                      7:    version 2, or (at your option) any later version.
                      8: 
                      9:    This definition file is distributed in the hope that it will be
                     10:    useful, but WITHOUT ANY WARRANTY; without even the implied
                     11:    warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
                     12:    See the GNU General Public License for more details.
                     13: 
                     14:    You should have received a copy of the GNU General Public License
                     15:    along with this program; if not, write to the Free Software
                     16:    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
                     17: 
1.1.1.4   root       18: #ifndef SI_TYPE_SIZE
                     19: #define SI_TYPE_SIZE 32
1.1       root       20: #endif
                     21: 
1.1.1.4   root       22: #define __BITS4 (SI_TYPE_SIZE / 4)
                     23: #define __ll_B (1L << (SI_TYPE_SIZE / 2))
                     24: #define __ll_lowpart(t) ((USItype) (t) % __ll_B)
                     25: #define __ll_highpart(t) ((USItype) (t) / __ll_B)
1.1       root       26: 
1.1.1.2   root       27: /* Define auxiliary asm macros.
1.1       root       28: 
                     29:    1) umul_ppmm(high_prod, low_prod, multipler, multiplicand)
1.1.1.4   root       30:    multiplies two USItype integers MULTIPLER and MULTIPLICAND,
                     31:    and generates a two-part USItype product in HIGH_PROD and
1.1       root       32:    LOW_PROD.
                     33: 
1.1.1.4   root       34:    2) __umulsidi3(a,b) multiplies two USItype integers A and B,
                     35:    and returns a UDItype product.  This is just a variant of umul_ppmm.
1.1       root       36: 
                     37:    3) udiv_qrnnd(quotient, remainder, high_numerator, low_numerator,
                     38:    denominator) divides a two-word unsigned integer, composed by the
                     39:    integers HIGH_NUMERATOR and LOW_NUMERATOR, by DENOMINATOR and
                     40:    places the quotient in QUOTIENT and the remainder in REMAINDER.
                     41:    HIGH_NUMERATOR must be less than DENOMINATOR for correct operation.
                     42:    If, in addition, the most significant bit of DENOMINATOR must be 1,
                     43:    then the pre-processor symbol UDIV_NEEDS_NORMALIZATION is defined to 1.
                     44: 
1.1.1.4   root       45:    4) sdiv_qrnnd(quotient, remainder, high_numerator, low_numerator,
                     46:    denominator).  Like udiv_qrnnd but the numbers are signed.  The
                     47:    quotient is rounded towards 0.
                     48: 
                     49:    5) count_leading_zeros(count, x) counts the number of zero-bits from
1.1       root       50:    the msb to the first non-zero bit.  This is the number of steps X
                     51:    needs to be shifted left to set the msb.  Undefined for X == 0.
                     52: 
1.1.1.4   root       53:    6) add_ssaaaa(high_sum, low_sum, high_addend_1, low_addend_1,
1.1       root       54:    high_addend_2, low_addend_2) adds two two-word unsigned integers,
                     55:    composed by HIGH_ADDEND_1 and LOW_ADDEND_1, and HIGH_ADDEND_2 and
                     56:    LOW_ADDEND_2 respectively.  The result is placed in HIGH_SUM and
                     57:    LOW_SUM.  Overflow (i.e. carry out) is not stored anywhere, and is
                     58:    lost.
                     59: 
1.1.1.4   root       60:    7) sub_ddmmss(high_difference, low_difference, high_minuend,
1.1       root       61:    low_minuend, high_subtrahend, low_subtrahend) subtracts two
                     62:    two-word unsigned integers, composed by HIGH_MINUEND_1 and
                     63:    LOW_MINUEND_1, and HIGH_SUBTRAHEND_2 and LOW_SUBTRAHEND_2
                     64:    respectively.  The result is placed in HIGH_DIFFERENCE and
                     65:    LOW_DIFFERENCE.  Overflow (i.e. carry out) is not stored anywhere,
                     66:    and is lost.
                     67: 
                     68:    If any of these macros are left undefined for a particular CPU,
                     69:    C macros are used.  */
                     70: 
                     71: /* The CPUs come in alphabetical order below.
                     72: 
                     73:    Please add support for more CPUs here, or improve the current support
                     74:    for the CPUs below!
1.1.1.6 ! root       75:    (E.g. WE32100, IBM360.)  */
1.1       root       76: 
                     77: #if defined (__GNUC__) && !defined (NO_ASM)
                     78: 
1.1.1.3   root       79: /* We sometimes need to clobber "cc" with gcc2, but that would not be
                     80:    understood by gcc1.  Use cpp to avoid major code duplication.  */
                     81: #if __GNUC__ < 2
                     82: #define __CLOBBER_CC
                     83: #define __AND_CLOBBER_CC
                     84: #else /* __GNUC__ >= 2 */
                     85: #define __CLOBBER_CC : "cc"
                     86: #define __AND_CLOBBER_CC , "cc"
                     87: #endif /* __GNUC__ < 2 */
                     88: 
1.1.1.6 ! root       89: #if defined (__a29k__) || defined (_AM29K)
1.1       root       90: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                     91:   __asm__ ("add %1,%4,%5
                     92:        addc %0,%2,%3"                                                  \
1.1.1.4   root       93:           : "=r" ((USItype)(sh)),                                      \
                     94:            "=&r" ((USItype)(sl))                                       \
                     95:           : "%r" ((USItype)(ah)),                                      \
                     96:             "rI" ((USItype)(bh)),                                      \
                     97:             "%r" ((USItype)(al)),                                      \
                     98:             "rI" ((USItype)(bl)))
1.1       root       99: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                    100:   __asm__ ("sub %1,%4,%5
                    101:        subc %0,%2,%3"                                                  \
1.1.1.4   root      102:           : "=r" ((USItype)(sh)),                                      \
                    103:             "=&r" ((USItype)(sl))                                      \
                    104:           : "r" ((USItype)(ah)),                                       \
                    105:             "rI" ((USItype)(bh)),                                      \
                    106:             "r" ((USItype)(al)),                                       \
                    107:             "rI" ((USItype)(bl)))
1.1       root      108: #define umul_ppmm(xh, xl, m0, m1) \
                    109:   do {                                                                 \
1.1.1.4   root      110:     USItype __m0 = (m0), __m1 = (m1);                                  \
1.1.1.3   root      111:     __asm__ ("multiplu %0,%1,%2"                                       \
1.1.1.4   root      112:             : "=r" ((USItype)(xl))                                     \
1.1.1.3   root      113:             : "r" (__m0),                                              \
                    114:               "r" (__m1));                                             \
                    115:     __asm__ ("multmu %0,%1,%2"                                         \
1.1.1.4   root      116:             : "=r" ((USItype)(xh))                                     \
1.1.1.3   root      117:             : "r" (__m0),                                              \
                    118:               "r" (__m1));                                             \
1.1       root      119:   } while (0)
                    120: #define udiv_qrnnd(q, r, n1, n0, d) \
                    121:   __asm__ ("dividu %0,%3,%4"                                           \
1.1.1.4   root      122:           : "=r" ((USItype)(q)),                                       \
                    123:             "=q" ((USItype)(r))                                        \
                    124:           : "1" ((USItype)(n1)),                                       \
                    125:             "r" ((USItype)(n0)),                                       \
                    126:             "r" ((USItype)(d)))
1.1       root      127: #define count_leading_zeros(count, x) \
1.1.1.3   root      128:     __asm__ ("clz %0,%1"                                               \
1.1.1.4   root      129:             : "=r" ((USItype)(count))                                  \
                    130:             : "r" ((USItype)(x)))
1.1       root      131: #endif /* __a29k__ */
                    132: 
                    133: #if defined (__arm__)
                    134: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
1.1.1.6 ! root      135:   __asm__ ("adds       %1, %4, %5
        !           136:        adc     %0, %2, %3"                                             \
1.1.1.4   root      137:           : "=r" ((USItype)(sh)),                                      \
                    138:             "=&r" ((USItype)(sl))                                      \
                    139:           : "%r" ((USItype)(ah)),                                      \
                    140:             "rI" ((USItype)(bh)),                                      \
                    141:             "%r" ((USItype)(al)),                                      \
                    142:             "rI" ((USItype)(bl)))
1.1       root      143: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
1.1.1.6 ! root      144:   __asm__ ("subs       %1, %4, %5
        !           145:        sbc     %0, %2, %3"                                             \
1.1.1.4   root      146:           : "=r" ((USItype)(sh)),                                      \
                    147:             "=&r" ((USItype)(sl))                                      \
                    148:           : "r" ((USItype)(ah)),                                       \
                    149:             "rI" ((USItype)(bh)),                                      \
                    150:             "r" ((USItype)(al)),                                       \
                    151:             "rI" ((USItype)(bl)))
1.1.1.6 ! root      152: #define umul_ppmm(xh, xl, a, b) \
        !           153: {register USItype __t0, __t1, __t2;                                    \
        !           154:   __asm__ ("%@ Inlined umul_ppmm
        !           155:        mov     %2, %5, lsr #16
        !           156:        mov     %0, %6, lsr #16
        !           157:        bic     %3, %5, %2, lsl #16
        !           158:        bic     %4, %6, %0, lsl #16
        !           159:        mul     %1, %3, %4
        !           160:        mul     %4, %2, %4
        !           161:        mul     %3, %0, %3
        !           162:        mul     %0, %2, %0
        !           163:        adds    %3, %4, %3
        !           164:        addcs   %0, %0, #65536
        !           165:        adds    %1, %1, %3, lsl #16
        !           166:        adc     %0, %0, %3, lsr #16"                                    \
        !           167:           : "=&r" ((USItype)(xh)),                                     \
        !           168:             "=r" ((USItype)(xl)),                                      \
        !           169:             "=&r" (__t0), "=&r" (__t1), "=r" (__t2)                    \
        !           170:           : "r" ((USItype)(a)),                                        \
        !           171:             "r" ((USItype)(b)));}
        !           172: #define UMUL_TIME 20
        !           173: #define UDIV_TIME 100
1.1       root      174: #endif /* __arm__ */
                    175: 
1.1.1.6 ! root      176: #if defined (__clipper__)
        !           177: #define umul_ppmm(w1, w0, u, v) \
        !           178:   ({union {UDItype __ll;                                               \
        !           179:           struct {USItype __l, __h;} __i;                              \
        !           180:          } __xx;                                                       \
        !           181:   __asm__ ("mulwux %2,%0"                                              \
        !           182:           : "=r" (__xx.__ll)                                           \
        !           183:           : "%0" ((USItype)(u)),                                       \
        !           184:             "r" ((USItype)(v)));                                       \
        !           185:   (w1) = __xx.__i.__h; (w0) = __xx.__i.__l;})
        !           186: #define smul_ppmm(w1, w0, u, v) \
        !           187:   ({union {DItype __ll;                                                        \
        !           188:           struct {SItype __l, __h;} __i;                               \
        !           189:          } __xx;                                                       \
        !           190:   __asm__ ("mulwx %2,%0"                                               \
        !           191:           : "=r" (__xx.__ll)                                           \
        !           192:           : "%0" ((SItype)(u)),                                        \
        !           193:             "r" ((SItype)(v)));                                        \
        !           194:   (w1) = __xx.__i.__h; (w0) = __xx.__i.__l;})
        !           195: #define __umulsidi3(u, v) \
        !           196:   ({UDItype __w;                                                       \
        !           197:     __asm__ ("mulwux %2,%0"                                            \
        !           198:             : "=r" (__w)                                               \
        !           199:             : "%0" ((USItype)(u)),                                     \
        !           200:               "r" ((USItype)(v)));                                     \
        !           201:     __w; })
        !           202: #endif /* __clipper__ */
        !           203: 
1.1       root      204: #if defined (__gmicro__)
                    205: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                    206:   __asm__ ("add.w %5,%1
                    207:        addx %3,%0"                                                     \
1.1.1.4   root      208:           : "=g" ((USItype)(sh)),                                      \
                    209:             "=&g" ((USItype)(sl))                                      \
                    210:           : "%0" ((USItype)(ah)),                                      \
                    211:             "g" ((USItype)(bh)),                                       \
                    212:             "%1" ((USItype)(al)),                                      \
                    213:             "g" ((USItype)(bl)))
1.1       root      214: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                    215:   __asm__ ("sub.w %5,%1
                    216:        subx %3,%0"                                                     \
1.1.1.4   root      217:           : "=g" ((USItype)(sh)),                                      \
                    218:             "=&g" ((USItype)(sl))                                      \
                    219:           : "0" ((USItype)(ah)),                                       \
                    220:             "g" ((USItype)(bh)),                                       \
                    221:             "1" ((USItype)(al)),                                       \
                    222:             "g" ((USItype)(bl)))
1.1       root      223: #define umul_ppmm(ph, pl, m0, m1) \
                    224:   __asm__ ("mulx %3,%0,%1"                                             \
1.1.1.4   root      225:           : "=g" ((USItype)(ph)),                                      \
                    226:             "=r" ((USItype)(pl))                                       \
                    227:           : "%0" ((USItype)(m0)),                                      \
                    228:             "g" ((USItype)(m1)))
1.1       root      229: #define udiv_qrnnd(q, r, nh, nl, d) \
                    230:   __asm__ ("divx %4,%0,%1"                                             \
1.1.1.4   root      231:           : "=g" ((USItype)(q)),                                       \
                    232:             "=r" ((USItype)(r))                                        \
                    233:           : "1" ((USItype)(nh)),                                       \
                    234:             "0" ((USItype)(nl)),                                       \
                    235:             "g" ((USItype)(d)))
1.1       root      236: #define count_leading_zeros(count, x) \
                    237:   __asm__ ("bsch/1 %1,%0"                                              \
1.1.1.3   root      238:           : "=g" (count)                                               \
1.1.1.4   root      239:           : "g" ((USItype)(x)),                                        \
                    240:             "0" ((USItype)0))
1.1       root      241: #endif
                    242: 
                    243: #if defined (__hppa)
                    244: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                    245:   __asm__ ("add %4,%5,%1
                    246:        addc %2,%3,%0"                                                  \
1.1.1.4   root      247:           : "=r" ((USItype)(sh)),                                      \
                    248:             "=&r" ((USItype)(sl))                                      \
                    249:           : "%rM" ((USItype)(ah)),                                     \
                    250:             "rM" ((USItype)(bh)),                                      \
                    251:             "%rM" ((USItype)(al)),                                     \
                    252:             "rM" ((USItype)(bl)))
                    253: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                    254:   __asm__ ("sub %4,%5,%1
                    255:        subb %2,%3,%0"                                                  \
                    256:           : "=r" ((USItype)(sh)),                                      \
                    257:             "=&r" ((USItype)(sl))                                      \
                    258:           : "rM" ((USItype)(ah)),                                      \
                    259:             "rM" ((USItype)(bh)),                                      \
                    260:             "rM" ((USItype)(al)),                                      \
                    261:             "rM" ((USItype)(bl)))
1.1.1.3   root      262: #if defined (_PA_RISC1_1)
                    263: #define umul_ppmm(w1, w0, u, v) \
                    264:   do {                                                                 \
                    265:     union                                                              \
                    266:       {                                                                        \
1.1.1.4   root      267:        UDItype __f;                                                    \
                    268:        struct {USItype __w1, __w0;} __w1w0;                            \
1.1.1.3   root      269:       } __t;                                                           \
                    270:     __asm__ ("xmpyu %1,%2,%0"                                          \
                    271:             : "=x" (__t.__f)                                           \
1.1.1.4   root      272:             : "x" ((USItype)(u)),                                      \
                    273:               "x" ((USItype)(v)));                                     \
1.1.1.3   root      274:     (w1) = __t.__w1w0.__w1;                                            \
                    275:     (w0) = __t.__w1w0.__w0;                                            \
                    276:      } while (0)
                    277: #define UMUL_TIME 8
                    278: #else
                    279: #define UMUL_TIME 30
                    280: #endif
                    281: #define UDIV_TIME 40
1.1.1.6 ! root      282: #define count_leading_zeros(count, x) \
        !           283:   do {                                                                 \
        !           284:     USItype __tmp;                                                     \
        !           285:     __asm__ (                                                          \
        !           286:        "ldi            1,%0
        !           287:        extru,=         %1,15,16,%%r0           ; Bits 31..16 zero?
        !           288:        extru,tr        %1,15,16,%1             ; No.  Shift down, skip add.
        !           289:        ldo             16(%0),%0               ; Yes.  Perform add.
        !           290:        extru,=         %1,23,8,%%r0            ; Bits 15..8 zero?
        !           291:        extru,tr        %1,23,8,%1              ; No.  Shift down, skip add.
        !           292:        ldo             8(%0),%0                ; Yes.  Perform add.
        !           293:        extru,=         %1,27,4,%%r0            ; Bits 7..4 zero?
        !           294:        extru,tr        %1,27,4,%1              ; No.  Shift down, skip add.
        !           295:        ldo             4(%0),%0                ; Yes.  Perform add.
        !           296:        extru,=         %1,29,2,%%r0            ; Bits 3..2 zero?
        !           297:        extru,tr        %1,29,2,%1              ; No.  Shift down, skip add.
        !           298:        ldo             2(%0),%0                ; Yes.  Perform add.
        !           299:        extru           %1,30,1,%1              ; Extract bit 1.
        !           300:        sub             %0,%1,%0                ; Subtract it.
        !           301:        " : "=r" (count), "=r" (__tmp) : "1" (x));                      \
        !           302:   } while (0)
1.1       root      303: #endif
                    304: 
                    305: #if defined (__i386__) || defined (__i486__)
                    306: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                    307:   __asm__ ("addl %5,%1
                    308:        adcl %3,%0"                                                     \
1.1.1.4   root      309:           : "=r" ((USItype)(sh)),                                      \
                    310:             "=&r" ((USItype)(sl))                                      \
                    311:           : "%0" ((USItype)(ah)),                                      \
                    312:             "g" ((USItype)(bh)),                                       \
                    313:             "%1" ((USItype)(al)),                                      \
                    314:             "g" ((USItype)(bl)))
1.1       root      315: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                    316:   __asm__ ("subl %5,%1
                    317:        sbbl %3,%0"                                                     \
1.1.1.4   root      318:           : "=r" ((USItype)(sh)),                                      \
                    319:             "=&r" ((USItype)(sl))                                      \
                    320:           : "0" ((USItype)(ah)),                                       \
                    321:             "g" ((USItype)(bh)),                                       \
                    322:             "1" ((USItype)(al)),                                       \
                    323:             "g" ((USItype)(bl)))
1.1       root      324: #define umul_ppmm(w1, w0, u, v) \
                    325:   __asm__ ("mull %3"                                                   \
1.1.1.4   root      326:           : "=a" ((USItype)(w0)),                                      \
                    327:             "=d" ((USItype)(w1))                                       \
                    328:           : "%0" ((USItype)(u)),                                       \
                    329:             "rm" ((USItype)(v)))
1.1       root      330: #define udiv_qrnnd(q, r, n1, n0, d) \
                    331:   __asm__ ("divl %4"                                                   \
1.1.1.4   root      332:           : "=a" ((USItype)(q)),                                       \
                    333:             "=d" ((USItype)(r))                                        \
                    334:           : "0" ((USItype)(n0)),                                       \
                    335:             "1" ((USItype)(n1)),                                       \
                    336:             "rm" ((USItype)(d)))
1.1       root      337: #define count_leading_zeros(count, x) \
                    338:   do {                                                                 \
1.1.1.4   root      339:     USItype __cbtmp;                                                   \
1.1       root      340:     __asm__ ("bsrl %1,%0"                                              \
1.1.1.4   root      341:             : "=r" (__cbtmp) : "rm" ((USItype)(x)));                   \
1.1       root      342:     (count) = __cbtmp ^ 31;                                            \
                    343:   } while (0)
1.1.1.3   root      344: #define UMUL_TIME 40
                    345: #define UDIV_TIME 40
1.1       root      346: #endif /* 80x86 */
                    347: 
                    348: #if defined (__i860__)
                    349: #if 0
                    350: /* Make sure these patterns really improve the code before
                    351:    switching them on.  */
                    352: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                    353:   do {                                                                 \
                    354:     union                                                              \
                    355:       {                                                                        \
1.1.1.4   root      356:        DItype __ll;                                                    \
                    357:        struct {USItype __l, __h;} __i;                                 \
1.1       root      358:       }  __a, __b, __s;                                                        \
1.1.1.4   root      359:     __a.__i.__l = (al);                                                        \
                    360:     __a.__i.__h = (ah);                                                        \
                    361:     __b.__i.__l = (bl);                                                        \
                    362:     __b.__i.__h = (bh);                                                        \
1.1       root      363:     __asm__ ("fiadd.dd %1,%2,%0"                                       \
1.1.1.4   root      364:             : "=f" (__s.__ll)                                          \
                    365:             : "%f" (__a.__ll), "f" (__b.__ll));                        \
                    366:     (sh) = __s.__i.__h;                                                        \
                    367:     (sl) = __s.__i.__l;                                                        \
1.1       root      368:     } while (0)
                    369: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                    370:   do {                                                                 \
                    371:     union                                                              \
                    372:       {                                                                        \
1.1.1.4   root      373:        DItype __ll;                                                    \
                    374:        struct {USItype __l, __h;} __i;                                 \
1.1       root      375:       }  __a, __b, __s;                                                        \
1.1.1.4   root      376:     __a.__i.__l = (al);                                                        \
                    377:     __a.__i.__h = (ah);                                                        \
                    378:     __b.__i.__l = (bl);                                                        \
                    379:     __b.__i.__h = (bh);                                                        \
1.1       root      380:     __asm__ ("fisub.dd %1,%2,%0"                                       \
1.1.1.4   root      381:             : "=f" (__s.__ll)                                          \
                    382:             : "%f" (__a.__ll), "f" (__b.__ll));                        \
                    383:     (sh) = __s.__i.__h;                                                        \
                    384:     (sl) = __s.__i.__l;                                                        \
1.1       root      385:     } while (0)
                    386: #endif
                    387: #endif /* __i860__ */
                    388: 
1.1.1.6 ! root      389: #if defined (__i960__)
        !           390: #define umul_ppmm(w1, w0, u, v) \
        !           391:   ({union {UDItype __ll;                                               \
        !           392:           struct {USItype __l, __h;} __i;                              \
        !           393:          } __xx;                                                       \
        !           394:   __asm__ ("emul       %2,%1,%0"                                       \
        !           395:           : "=d" (__xx.__ll)                                           \
        !           396:           : "%dI" ((USItype)(u)),                                      \
        !           397:             "dI" ((USItype)(v)));                                      \
        !           398:   (w1) = __xx.__i.__h; (w0) = __xx.__i.__l;})
        !           399: #define __umulsidi3(u, v) \
        !           400:   ({UDItype __w;                                                       \
        !           401:     __asm__ ("emul     %2,%1,%0"                                       \
        !           402:             : "=d" (__w)                                               \
        !           403:             : "%dI" ((USItype)(u)),                                    \
        !           404:               "dI" ((USItype)(v)));                                    \
        !           405:     __w; })  
        !           406: #endif /* __i960__ */
1.1       root      407: 
                    408: #if defined (__mc68000__)
                    409: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                    410:   __asm__ ("add%.l %5,%1
                    411:        addx%.l %3,%0"                                                  \
1.1.1.4   root      412:           : "=d" ((USItype)(sh)),                                      \
                    413:             "=&d" ((USItype)(sl))                                      \
                    414:           : "%0" ((USItype)(ah)),                                      \
                    415:             "d" ((USItype)(bh)),                                       \
                    416:             "%1" ((USItype)(al)),                                      \
                    417:             "g" ((USItype)(bl)))
1.1       root      418: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                    419:   __asm__ ("sub%.l %5,%1
                    420:        subx%.l %3,%0"                                                  \
1.1.1.4   root      421:           : "=d" ((USItype)(sh)),                                      \
                    422:             "=&d" ((USItype)(sl))                                      \
                    423:           : "0" ((USItype)(ah)),                                       \
                    424:             "d" ((USItype)(bh)),                                       \
                    425:             "1" ((USItype)(al)),                                       \
                    426:             "g" ((USItype)(bl)))
1.1       root      427: #if defined (__mc68020__) || defined (__NeXT__) || defined(mc68020)
                    428: #define umul_ppmm(w1, w0, u, v) \
                    429:   __asm__ ("mulu%.l %3,%1:%0"                                          \
1.1.1.4   root      430:           : "=d" ((USItype)(w0)),                                      \
                    431:             "=d" ((USItype)(w1))                                       \
                    432:           : "%0" ((USItype)(u)),                                       \
                    433:             "dmi" ((USItype)(v)))
1.1.1.3   root      434: #define UMUL_TIME 45
1.1       root      435: #define udiv_qrnnd(q, r, n1, n0, d) \
                    436:   __asm__ ("divu%.l %4,%1:%0"                                          \
1.1.1.4   root      437:           : "=d" ((USItype)(q)),                                       \
                    438:             "=d" ((USItype)(r))                                        \
                    439:           : "0" ((USItype)(n0)),                                       \
                    440:             "1" ((USItype)(n1)),                                       \
                    441:             "dmi" ((USItype)(d)))
1.1.1.3   root      442: #define UDIV_TIME 90
                    443: #define sdiv_qrnnd(q, r, n1, n0, d) \
                    444:   __asm__ ("divs%.l %4,%1:%0"                                          \
1.1.1.4   root      445:           : "=d" ((USItype)(q)),                                       \
                    446:             "=d" ((USItype)(r))                                        \
                    447:           : "0" ((USItype)(n0)),                                       \
                    448:             "1" ((USItype)(n1)),                                       \
                    449:             "dmi" ((USItype)(d)))
1.1       root      450: #define count_leading_zeros(count, x) \
                    451:   __asm__ ("bfffo %1{%b2:%b2},%0"                                      \
1.1.1.4   root      452:           : "=d" ((USItype)(count))                                    \
                    453:           : "od" ((USItype)(x)), "n" (0))
1.1       root      454: #else /* not mc68020 */
1.1.1.5   root      455: /* %/ inserts REGISTER_PREFIX.  */
1.1       root      456: #define umul_ppmm(xh, xl, a, b) \
                    457:   __asm__ ("| Inlined umul_ppmm
1.1.1.6 ! root      458:        move%.l %2,%/d0
        !           459:        move%.l %3,%/d1
        !           460:        move%.l %/d0,%/d2
1.1.1.5   root      461:        swap    %/d0
1.1.1.6 ! root      462:        move%.l %/d1,%/d3
1.1.1.5   root      463:        swap    %/d1
1.1.1.6 ! root      464:        move%.w %/d2,%/d4
1.1.1.5   root      465:        mulu    %/d3,%/d4
                    466:        mulu    %/d1,%/d2
                    467:        mulu    %/d0,%/d3
                    468:        mulu    %/d0,%/d1
1.1.1.6 ! root      469:        move%.l %/d4,%/d0
        !           470:        eor%.w  %/d0,%/d0
1.1.1.5   root      471:        swap    %/d0
1.1.1.6 ! root      472:        add%.l  %/d0,%/d2
        !           473:        add%.l  %/d3,%/d2
1.1       root      474:        jcc     1f
1.1.1.6 ! root      475:        add%.l  #65536,%/d1
1.1.1.5   root      476: 1:     swap    %/d2
                    477:        moveq   #0,%/d0
1.1.1.6 ! root      478:        move%.w %/d2,%/d0
        !           479:        move%.w %/d4,%/d2
        !           480:        move%.l %/d2,%1
        !           481:        add%.l  %/d1,%/d0
        !           482:        move%.l %/d0,%0"                                                \
1.1.1.4   root      483:           : "=g" ((USItype)(xh)),                                      \
                    484:             "=g" ((USItype)(xl))                                       \
                    485:           : "g" ((USItype)(a)),                                        \
                    486:             "g" ((USItype)(b))                                         \
1.1.1.3   root      487:           : "d0", "d1", "d2", "d3", "d4")
                    488: #define UMUL_TIME 100
                    489: #define UDIV_TIME 400
1.1       root      490: #endif /* not mc68020 */
                    491: #endif /* mc68000 */
                    492: 
                    493: #if defined (__m88000__)
                    494: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                    495:   __asm__ ("addu.co %1,%r4,%r5
                    496:        addu.ci %0,%r2,%r3"                                             \
1.1.1.4   root      497:           : "=r" ((USItype)(sh)),                                      \
                    498:             "=&r" ((USItype)(sl))                                      \
                    499:           : "%rJ" ((USItype)(ah)),                                     \
                    500:             "rJ" ((USItype)(bh)),                                      \
                    501:             "%rJ" ((USItype)(al)),                                     \
                    502:             "rJ" ((USItype)(bl)))
1.1       root      503: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                    504:   __asm__ ("subu.co %1,%r4,%r5
                    505:        subu.ci %0,%r2,%r3"                                             \
1.1.1.4   root      506:           : "=r" ((USItype)(sh)),                                      \
                    507:             "=&r" ((USItype)(sl))                                      \
                    508:           : "rJ" ((USItype)(ah)),                                      \
                    509:             "rJ" ((USItype)(bh)),                                      \
                    510:             "rJ" ((USItype)(al)),                                      \
                    511:             "rJ" ((USItype)(bl)))
1.1       root      512: #define count_leading_zeros(count, x) \
                    513:   do {                                                                 \
1.1.1.4   root      514:     USItype __cbtmp;                                                   \
1.1       root      515:     __asm__ ("ff1 %0,%1"                                               \
1.1.1.3   root      516:             : "=r" (__cbtmp)                                           \
1.1.1.4   root      517:             : "r" ((USItype)(x)));                                     \
1.1       root      518:     (count) = __cbtmp ^ 31;                                            \
                    519:   } while (0)
1.1.1.3   root      520: #if defined (__mc88110__)
1.1.1.6 ! root      521: #define umul_ppmm(wh, wl, u, v) \
        !           522:   do {                                                                 \
        !           523:     union {UDItype __ll;                                               \
        !           524:           struct {USItype __h, __l;} __i;                              \
        !           525:          } __xx;                                                       \
        !           526:     __asm__ ("mulu.d   %0,%1,%2"                                       \
        !           527:             : "=r" (__xx.__ll)                                         \
        !           528:             : "r" ((USItype)(u)),                                      \
        !           529:               "r" ((USItype)(v)));                                     \
        !           530:     (wh) = __xx.__i.__h;                                               \
        !           531:     (wl) = __xx.__i.__l;                                               \
        !           532:   } while (0)
1.1.1.3   root      533: #define udiv_qrnnd(q, r, n1, n0, d) \
1.1.1.6 ! root      534:   ({union {UDItype __ll;                                               \
        !           535:           struct {USItype __h, __l;} __i;                              \
        !           536:          } __xx;                                                       \
        !           537:   USItype __q;                                                         \
        !           538:   __xx.__i.__h = (n1); __xx.__i.__l = (n0);                            \
        !           539:   __asm__ ("divu.d %0,%1,%2"                                           \
        !           540:           : "=r" (__q)                                                 \
        !           541:           : "r" (__xx.__ll),                                           \
        !           542:             "r" ((USItype)(d)));                                       \
        !           543:   (r) = (n0) - __q * (d); (q) = __q; })
        !           544: #define UMUL_TIME 5
        !           545: #define UDIV_TIME 25
        !           546: #else
        !           547: #define UMUL_TIME 17
        !           548: #define UDIV_TIME 150
        !           549: #endif /* __mc88110__ */
1.1       root      550: #endif /* __m88000__ */
                    551: 
                    552: #if defined (__mips__)
                    553: #define umul_ppmm(w1, w0, u, v) \
                    554:   __asm__ ("multu %2,%3
                    555:        mflo %0
                    556:        mfhi %1"                                                        \
1.1.1.4   root      557:           : "=d" ((USItype)(w0)),                                      \
                    558:             "=d" ((USItype)(w1))                                       \
                    559:           : "d" ((USItype)(u)),                                        \
                    560:             "d" ((USItype)(v)))
1.1.1.6 ! root      561: #define UMUL_TIME 10
1.1       root      562: #define UDIV_TIME 100
                    563: #endif /* __mips__ */
                    564: 
                    565: #if defined (__ns32000__)
1.1.1.6 ! root      566: #define umul_ppmm(w1, w0, u, v) \
        !           567:   ({union {UDItype __ll;                                               \
        !           568:           struct {USItype __l, __h;} __i;                              \
        !           569:          } __xx;                                                       \
        !           570:   __asm__ ("meid %2,%0"                                                        \
        !           571:           : "=g" (__xx.__ll)                                           \
        !           572:           : "%0" ((USItype)(u)),                                       \
        !           573:             "g" ((USItype)(v)));                                       \
        !           574:   (w1) = __xx.__i.__h; (w0) = __xx.__i.__l;})
1.1       root      575: #define __umulsidi3(u, v) \
1.1.1.4   root      576:   ({UDItype __w;                                                       \
1.1.1.3   root      577:     __asm__ ("meid %2,%0"                                              \
                    578:             : "=g" (__w)                                               \
1.1.1.4   root      579:             : "%0" ((USItype)(u)),                                     \
                    580:               "g" ((USItype)(v)));                                     \
1.1.1.3   root      581:     __w; })
1.1.1.6 ! root      582: #define udiv_qrnnd(q, r, n1, n0, d) \
        !           583:   ({union {UDItype __ll;                                               \
        !           584:           struct {USItype __l, __h;} __i;                              \
        !           585:          } __xx;                                                       \
        !           586:   __xx.__i.__h = (n1); __xx.__i.__l = (n0);                            \
        !           587:   __asm__ ("deid %2,%0"                                                        \
        !           588:           : "=g" (__xx.__ll)                                           \
        !           589:           : "0" (__xx.__ll),                                           \
        !           590:             "g" ((USItype)(d)));                                       \
        !           591:   (r) = __xx.__i.__l; (q) = __xx.__i.__h; })
1.1       root      592: #endif /* __ns32000__ */
                    593: 
1.1.1.6 ! root      594: #if (defined (_ARCH_PPC) || defined (_IBMR2)) && W_TYPE_SIZE == 32
        !           595: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
        !           596:   do {                                                                 \
        !           597:     if (__builtin_constant_p (bh) && (bh) == 0)                                \
        !           598:       __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{aze|addze} %0,%2"          \
        !           599:             : "=r" ((USItype)(sh)),                                    \
        !           600:               "=&r" ((USItype)(sl))                                    \
        !           601:             : "%r" ((USItype)(ah)),                                    \
        !           602:               "%r" ((USItype)(al)),                                    \
        !           603:               "rI" ((USItype)(bl)));                                   \
        !           604:     else if (__builtin_constant_p (bh) && (bh) ==~(USItype) 0)         \
        !           605:       __asm__ ("{a%I4|add%I4c} %1,%3,%4\n\t{ame|addme} %0,%2"          \
        !           606:             : "=r" ((USItype)(sh)),                                    \
        !           607:               "=&r" ((USItype)(sl))                                    \
        !           608:             : "%r" ((USItype)(ah)),                                    \
        !           609:               "%r" ((USItype)(al)),                                    \
        !           610:               "rI" ((USItype)(bl)));                                   \
        !           611:     else                                                               \
        !           612:       __asm__ ("{a%I5|add%I5c} %1,%4,%5\n\t{ae|adde} %0,%2,%3"         \
        !           613:             : "=r" ((USItype)(sh)),                                    \
        !           614:               "=&r" ((USItype)(sl))                                    \
        !           615:             : "%r" ((USItype)(ah)),                                    \
        !           616:               "r" ((USItype)(bh)),                                     \
        !           617:               "%r" ((USItype)(al)),                                    \
        !           618:               "rI" ((USItype)(bl)));                                   \
        !           619:   } while (0)
        !           620: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
        !           621:   do {                                                                 \
        !           622:     if (__builtin_constant_p (ah) && (ah) == 0)                                \
        !           623:       __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfze|subfze} %0,%2"      \
        !           624:               : "=r" ((USItype)(sh)),                                  \
        !           625:                 "=&r" ((USItype)(sl))                                  \
        !           626:               : "r" ((USItype)(bh)),                                   \
        !           627:                 "rI" ((USItype)(al)),                                  \
        !           628:                 "r" ((USItype)(bl)));                                  \
        !           629:     else if (__builtin_constant_p (ah) && (ah) ==~(USItype) 0)         \
        !           630:       __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{sfme|subfme} %0,%2"      \
        !           631:               : "=r" ((USItype)(sh)),                                  \
        !           632:                 "=&r" ((USItype)(sl))                                  \
        !           633:               : "r" ((USItype)(bh)),                                   \
        !           634:                 "rI" ((USItype)(al)),                                  \
        !           635:                 "r" ((USItype)(bl)));                                  \
        !           636:     else if (__builtin_constant_p (bh) && (bh) == 0)                   \
        !           637:       __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{ame|addme} %0,%2"                \
        !           638:               : "=r" ((USItype)(sh)),                                  \
        !           639:                 "=&r" ((USItype)(sl))                                  \
        !           640:               : "r" ((USItype)(ah)),                                   \
        !           641:                 "rI" ((USItype)(al)),                                  \
        !           642:                 "r" ((USItype)(bl)));                                  \
        !           643:     else if (__builtin_constant_p (bh) && (bh) ==~(USItype) 0)         \
        !           644:       __asm__ ("{sf%I3|subf%I3c} %1,%4,%3\n\t{aze|addze} %0,%2"                \
        !           645:               : "=r" ((USItype)(sh)),                                  \
        !           646:                 "=&r" ((USItype)(sl))                                  \
        !           647:               : "r" ((USItype)(ah)),                                   \
        !           648:                 "rI" ((USItype)(al)),                                  \
        !           649:                 "r" ((USItype)(bl)));                                  \
        !           650:     else                                                               \
        !           651:       __asm__ ("{sf%I4|subf%I4c} %1,%5,%4\n\t{sfe|subfe} %0,%3,%2"     \
        !           652:               : "=r" ((USItype)(sh)),                                  \
        !           653:                 "=&r" ((USItype)(sl))                                  \
        !           654:               : "r" ((USItype)(ah)),                                   \
        !           655:                 "r" ((USItype)(bh)),                                   \
        !           656:                 "rI" ((USItype)(al)),                                  \
        !           657:                 "r" ((USItype)(bl)));                                  \
        !           658:   } while (0)
        !           659: #define count_leading_zeros(count, x) \
        !           660:   __asm__ ("{cntlz|cntlzw} %0,%1"                                      \
        !           661:           : "=r" ((USItype)(count))                                    \
        !           662:           : "r" ((USItype)(x)))
        !           663: #if defined (_ARCH_PPC)
        !           664: #define umul_ppmm(ph, pl, m0, m1) \
        !           665:   do {                                                                 \
        !           666:     USItype __m0 = (m0), __m1 = (m1);                                  \
        !           667:     __asm__ ("mulhwu %0,%1,%2"                                         \
        !           668:             : "=r" ((USItype) ph)                                      \
        !           669:             : "%r" (__m0),                                             \
        !           670:               "r" (__m1));                                             \
        !           671:     (pl) = __m0 * __m1;                                                        \
        !           672:   } while (0)
        !           673: #define UMUL_TIME 15
        !           674: #define smul_ppmm(ph, pl, m0, m1) \
        !           675:   do {                                                                 \
        !           676:     SItype __m0 = (m0), __m1 = (m1);                                   \
        !           677:     __asm__ ("mulhw %0,%1,%2"                                          \
        !           678:             : "=r" ((SItype) ph)                                       \
        !           679:             : "%r" (__m0),                                             \
        !           680:               "r" (__m1));                                             \
        !           681:     (pl) = __m0 * __m1;                                                        \
        !           682:   } while (0)
        !           683: #define SMUL_TIME 14
        !           684: #define UDIV_TIME 120
        !           685: #else
        !           686: #define umul_ppmm(xh, xl, m0, m1) \
        !           687:   do {                                                                 \
        !           688:     USItype __m0 = (m0), __m1 = (m1);                                  \
        !           689:     __asm__ ("mul %0,%2,%3"                                            \
        !           690:             : "=r" ((USItype)(xh)),                                    \
        !           691:               "=q" ((USItype)(xl))                                     \
        !           692:             : "r" (__m0),                                              \
        !           693:               "r" (__m1));                                             \
        !           694:     (xh) += ((((SItype) __m0 >> 31) & __m1)                            \
        !           695:             + (((SItype) __m1 >> 31) & __m0));                         \
        !           696:   } while (0)
        !           697: #define UMUL_TIME 8
        !           698: #define smul_ppmm(xh, xl, m0, m1) \
        !           699:   __asm__ ("mul %0,%2,%3"                                              \
        !           700:           : "=r" ((SItype)(xh)),                                       \
        !           701:             "=q" ((SItype)(xl))                                        \
        !           702:           : "r" (m0),                                                  \
        !           703:             "r" (m1))
        !           704: #define SMUL_TIME 4
        !           705: #define sdiv_qrnnd(q, r, nh, nl, d) \
        !           706:   __asm__ ("div %0,%2,%4"                                              \
        !           707:           : "=r" ((SItype)(q)), "=q" ((SItype)(r))                     \
        !           708:           : "r" ((SItype)(nh)), "1" ((SItype)(nl)), "r" ((SItype)(d)))
        !           709: #define UDIV_TIME 100
        !           710: #endif
        !           711: #endif /* Power architecture variants.  */
        !           712: 
1.1       root      713: #if defined (__pyr__)
                    714: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                    715:   __asm__ ("addw       %5,%1
                    716:        addwc   %3,%0"                                                  \
1.1.1.4   root      717:           : "=r" ((USItype)(sh)),                                      \
                    718:             "=&r" ((USItype)(sl))                                      \
                    719:           : "%0" ((USItype)(ah)),                                      \
                    720:             "g" ((USItype)(bh)),                                       \
                    721:             "%1" ((USItype)(al)),                                      \
                    722:             "g" ((USItype)(bl)))
1.1       root      723: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                    724:   __asm__ ("subw       %5,%1
                    725:        subwb   %3,%0"                                                  \
1.1.1.4   root      726:           : "=r" ((USItype)(sh)),                                      \
                    727:             "=&r" ((USItype)(sl))                                      \
                    728:           : "0" ((USItype)(ah)),                                       \
                    729:             "g" ((USItype)(bh)),                                       \
                    730:             "1" ((USItype)(al)),                                       \
                    731:             "g" ((USItype)(bl)))
1.1       root      732: /* This insn doesn't work on ancient pyramids.  */
                    733: #define umul_ppmm(w1, w0, u, v) \
1.1.1.4   root      734:   ({union {                                                            \
                    735:        UDItype __ll;                                                   \
                    736:        struct {USItype __h, __l;} __i;                                 \
                    737:      } __xx;                                                           \
                    738:   __xx.__i.__l = u;                                                    \
1.1.1.3   root      739:   __asm__ ("uemul %3,%0"                                               \
1.1.1.4   root      740:           : "=r" (__xx.__i.__h),                                       \
                    741:             "=r" (__xx.__i.__l)                                        \
                    742:           : "1" (__xx.__i.__l),                                        \
1.1.1.6 ! root      743:             "g" ((USItype)(v)));                                       \
1.1.1.4   root      744:   (w1) = __xx.__i.__h;                                                 \
                    745:   (w0) = __xx.__i.__l;})
1.1       root      746: #endif /* __pyr__ */
                    747: 
                    748: #if defined (__ibm032__) /* RT/ROMP */
                    749: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                    750:   __asm__ ("a %1,%5
                    751:        ae %0,%3"                                                       \
1.1.1.4   root      752:           : "=r" ((USItype)(sh)),                                      \
                    753:             "=&r" ((USItype)(sl))                                      \
                    754:           : "%0" ((USItype)(ah)),                                      \
                    755:             "r" ((USItype)(bh)),                                       \
                    756:             "%1" ((USItype)(al)),                                      \
                    757:             "r" ((USItype)(bl)))
1.1       root      758: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                    759:   __asm__ ("s %1,%5
                    760:        se %0,%3"                                                       \
1.1.1.4   root      761:           : "=r" ((USItype)(sh)),                                      \
                    762:             "=&r" ((USItype)(sl))                                      \
                    763:           : "0" ((USItype)(ah)),                                       \
                    764:             "r" ((USItype)(bh)),                                       \
                    765:             "1" ((USItype)(al)),                                       \
                    766:             "r" ((USItype)(bl)))
1.1       root      767: #define umul_ppmm(ph, pl, m0, m1) \
                    768:   do {                                                                 \
1.1.1.4   root      769:     USItype __m0 = (m0), __m1 = (m1);                                  \
1.1       root      770:     __asm__ (                                                          \
                    771:        "s      r2,r2
                    772:        mts     r10,%2
                    773:        m       r2,%3
                    774:        m       r2,%3
                    775:        m       r2,%3
                    776:        m       r2,%3
                    777:        m       r2,%3
                    778:        m       r2,%3
                    779:        m       r2,%3
                    780:        m       r2,%3
                    781:        m       r2,%3
                    782:        m       r2,%3
                    783:        m       r2,%3
                    784:        m       r2,%3
                    785:        m       r2,%3
                    786:        m       r2,%3
                    787:        m       r2,%3
                    788:        m       r2,%3
                    789:        cas     %0,r2,r0
                    790:        mfs     r10,%1"                                                 \
1.1.1.4   root      791:             : "=r" ((USItype)(ph)),                                    \
                    792:               "=r" ((USItype)(pl))                                     \
1.1.1.3   root      793:             : "%r" (__m0),                                             \
                    794:                "r" (__m1)                                              \
                    795:             : "r2");                                                   \
1.1.1.4   root      796:     (ph) += ((((SItype) __m0 >> 31) & __m1)                            \
                    797:             + (((SItype) __m1 >> 31) & __m0));                         \
1.1       root      798:   } while (0)
1.1.1.3   root      799: #define UMUL_TIME 20
                    800: #define UDIV_TIME 200
1.1       root      801: #define count_leading_zeros(count, x) \
                    802:   do {                                                                 \
                    803:     if ((x) >= 0x10000)                                                        \
                    804:       __asm__ ("clz    %0,%1"                                          \
1.1.1.4   root      805:               : "=r" ((USItype)(count))                                \
                    806:               : "r" ((USItype)(x) >> 16));                             \
1.1       root      807:     else                                                               \
                    808:       {                                                                        \
                    809:        __asm__ ("clz   %0,%1"                                          \
1.1.1.4   root      810:                 : "=r" ((USItype)(count))                              \
                    811:                 : "r" ((USItype)(x)));                                 \
1.1       root      812:        (count) += 16;                                                  \
                    813:       }                                                                        \
                    814:   } while (0)
                    815: #endif
                    816: 
                    817: #if defined (__sparc__)
                    818: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
1.1.1.6 ! root      819:   __asm__ ("addcc %r4,%5,%1
        !           820:        addx %r2,%3,%0"                                                 \
1.1.1.4   root      821:           : "=r" ((USItype)(sh)),                                      \
                    822:             "=&r" ((USItype)(sl))                                      \
1.1.1.6 ! root      823:           : "%rJ" ((USItype)(ah)),                                     \
1.1.1.4   root      824:             "rI" ((USItype)(bh)),                                      \
1.1.1.6 ! root      825:             "%rJ" ((USItype)(al)),                                     \
1.1.1.4   root      826:             "rI" ((USItype)(bl))                                       \
1.1.1.3   root      827:           __CLOBBER_CC)
1.1       root      828: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
1.1.1.6 ! root      829:   __asm__ ("subcc %r4,%5,%1
        !           830:        subx %r2,%3,%0"                                                 \
1.1.1.4   root      831:           : "=r" ((USItype)(sh)),                                      \
                    832:             "=&r" ((USItype)(sl))                                      \
1.1.1.6 ! root      833:           : "rJ" ((USItype)(ah)),                                      \
1.1.1.4   root      834:             "rI" ((USItype)(bh)),                                      \
1.1.1.6 ! root      835:             "rJ" ((USItype)(al)),                                      \
1.1.1.4   root      836:             "rI" ((USItype)(bl))                                       \
1.1.1.3   root      837:           __CLOBBER_CC)
1.1.1.4   root      838: #if defined (__sparc_v8__)
1.1       root      839: #define umul_ppmm(w1, w0, u, v) \
                    840:   __asm__ ("umul %2,%3,%1;rd %%y,%0"                                   \
1.1.1.4   root      841:           : "=r" ((USItype)(w1)),                                      \
                    842:             "=r" ((USItype)(w0))                                       \
                    843:           : "r" ((USItype)(u)),                                        \
                    844:             "r" ((USItype)(v)))
1.1       root      845: #define udiv_qrnnd(q, r, n1, n0, d) \
                    846:   __asm__ ("mov %2,%%y;nop;nop;nop;udiv %3,%4,%0;umul %0,%4,%1;sub %3,%1,%1"\
1.1.1.4   root      847:           : "=&r" ((USItype)(q)),                                      \
                    848:             "=&r" ((USItype)(r))                                       \
                    849:           : "r" ((USItype)(n1)),                                       \
                    850:             "r" ((USItype)(n0)),                                       \
                    851:             "r" ((USItype)(d)))
                    852: #else
                    853: #if defined (__sparclite__)
                    854: /* This has hardware multiply but not divide.  It also has two additional
                    855:    instructions scan (ffs from high bit) and divscc.  */
                    856: #define umul_ppmm(w1, w0, u, v) \
                    857:   __asm__ ("umul %2,%3,%1;rd %%y,%0"                                   \
                    858:           : "=r" ((USItype)(w1)),                                      \
                    859:             "=r" ((USItype)(w0))                                       \
                    860:           : "r" ((USItype)(u)),                                        \
                    861:             "r" ((USItype)(v)))
                    862: #define udiv_qrnnd(q, r, n1, n0, d) \
                    863:   __asm__ ("! Inlined udiv_qrnnd
                    864:        wr      %%g0,%2,%%y     ! Not a delayed write for sparclite
                    865:        tst     %%g0
                    866:        divscc  %3,%4,%%g1
                    867:        divscc  %%g1,%4,%%g1
                    868:        divscc  %%g1,%4,%%g1
                    869:        divscc  %%g1,%4,%%g1
                    870:        divscc  %%g1,%4,%%g1
                    871:        divscc  %%g1,%4,%%g1
                    872:        divscc  %%g1,%4,%%g1
                    873:        divscc  %%g1,%4,%%g1
                    874:        divscc  %%g1,%4,%%g1
                    875:        divscc  %%g1,%4,%%g1
                    876:        divscc  %%g1,%4,%%g1
                    877:        divscc  %%g1,%4,%%g1
                    878:        divscc  %%g1,%4,%%g1
                    879:        divscc  %%g1,%4,%%g1
                    880:        divscc  %%g1,%4,%%g1
                    881:        divscc  %%g1,%4,%%g1
                    882:        divscc  %%g1,%4,%%g1
                    883:        divscc  %%g1,%4,%%g1
                    884:        divscc  %%g1,%4,%%g1
                    885:        divscc  %%g1,%4,%%g1
                    886:        divscc  %%g1,%4,%%g1
                    887:        divscc  %%g1,%4,%%g1
                    888:        divscc  %%g1,%4,%%g1
                    889:        divscc  %%g1,%4,%%g1
                    890:        divscc  %%g1,%4,%%g1
                    891:        divscc  %%g1,%4,%%g1
                    892:        divscc  %%g1,%4,%%g1
                    893:        divscc  %%g1,%4,%%g1
                    894:        divscc  %%g1,%4,%%g1
                    895:        divscc  %%g1,%4,%%g1
                    896:        divscc  %%g1,%4,%%g1
                    897:        divscc  %%g1,%4,%0
                    898:        rd      %%y,%1
                    899:        bl,a 1f
                    900:        add     %1,%4,%1
                    901: 1:     ! End of inline udiv_qrnnd"                                     \
                    902:           : "=r" ((USItype)(q)),                                       \
                    903:             "=r" ((USItype)(r))                                        \
                    904:           : "r" ((USItype)(n1)),                                       \
                    905:             "r" ((USItype)(n0)),                                       \
                    906:             "rI" ((USItype)(d))                                        \
                    907:           : "%g1" __AND_CLOBBER_CC)
                    908: #define UDIV_TIME 37
                    909: #define count_leading_zeros(count, x) \
                    910:   __asm__ ("scan %1,0,%0"                                              \
                    911:           : "=r" ((USItype)(x))                                        \
                    912:           : "r" ((USItype)(count)))
1.1       root      913: #else
                    914: /* SPARC without integer multiplication and divide instructions.
                    915:    (i.e. at least Sun4/20,40,60,65,75,110,260,280,330,360,380,470,490) */
                    916: #define umul_ppmm(w1, w0, u, v) \
                    917:   __asm__ ("! Inlined umul_ppmm
                    918:        wr      %%g0,%2,%%y     ! SPARC has 0-3 delay insn after a wr
                    919:        sra     %3,31,%%g2      ! Don't move this insn
                    920:        and     %2,%%g2,%%g2    ! Don't move this insn
                    921:        andcc   %%g0,0,%%g1     ! Don't move this insn
                    922:        mulscc  %%g1,%3,%%g1
                    923:        mulscc  %%g1,%3,%%g1
                    924:        mulscc  %%g1,%3,%%g1
                    925:        mulscc  %%g1,%3,%%g1
                    926:        mulscc  %%g1,%3,%%g1
                    927:        mulscc  %%g1,%3,%%g1
                    928:        mulscc  %%g1,%3,%%g1
                    929:        mulscc  %%g1,%3,%%g1
                    930:        mulscc  %%g1,%3,%%g1
                    931:        mulscc  %%g1,%3,%%g1
                    932:        mulscc  %%g1,%3,%%g1
                    933:        mulscc  %%g1,%3,%%g1
                    934:        mulscc  %%g1,%3,%%g1
                    935:        mulscc  %%g1,%3,%%g1
                    936:        mulscc  %%g1,%3,%%g1
                    937:        mulscc  %%g1,%3,%%g1
                    938:        mulscc  %%g1,%3,%%g1
                    939:        mulscc  %%g1,%3,%%g1
                    940:        mulscc  %%g1,%3,%%g1
                    941:        mulscc  %%g1,%3,%%g1
                    942:        mulscc  %%g1,%3,%%g1
                    943:        mulscc  %%g1,%3,%%g1
                    944:        mulscc  %%g1,%3,%%g1
                    945:        mulscc  %%g1,%3,%%g1
                    946:        mulscc  %%g1,%3,%%g1
                    947:        mulscc  %%g1,%3,%%g1
                    948:        mulscc  %%g1,%3,%%g1
                    949:        mulscc  %%g1,%3,%%g1
                    950:        mulscc  %%g1,%3,%%g1
                    951:        mulscc  %%g1,%3,%%g1
                    952:        mulscc  %%g1,%3,%%g1
                    953:        mulscc  %%g1,%3,%%g1
                    954:        mulscc  %%g1,0,%%g1
                    955:        add     %%g1,%%g2,%0
                    956:        rd      %%y,%1"                                                 \
1.1.1.4   root      957:           : "=r" ((USItype)(w1)),                                      \
                    958:             "=r" ((USItype)(w0))                                       \
                    959:           : "%rI" ((USItype)(u)),                                      \
                    960:             "r" ((USItype)(v))                                         \
1.1.1.3   root      961:           : "%g1", "%g2" __AND_CLOBBER_CC)
1.1       root      962: #define UMUL_TIME 39           /* 39 instructions */
                    963: /* It's quite necessary to add this much assembler for the sparc.
                    964:    The default udiv_qrnnd (in C) is more than 10 times slower!  */
                    965: #define udiv_qrnnd(q, r, n1, n0, d) \
                    966:   __asm__ ("! Inlined udiv_qrnnd
                    967:        mov     32,%%g1
                    968:        subcc   %1,%2,%%g0
                    969: 1:     bcs     5f
                    970:         addxcc %0,%0,%0        ! shift n1n0 and a q-bit in lsb
                    971:        sub     %1,%2,%1        ! this kills msb of n
                    972:        addx    %1,%1,%1        ! so this can't give carry
                    973:        subcc   %%g1,1,%%g1
                    974: 2:     bne     1b
                    975:         subcc  %1,%2,%%g0
                    976:        bcs     3f
                    977:         addxcc %0,%0,%0        ! shift n1n0 and a q-bit in lsb
                    978:        b       3f
                    979:         sub    %1,%2,%1        ! this kills msb of n
                    980: 4:     sub     %1,%2,%1
                    981: 5:     addxcc  %1,%1,%1
                    982:        bcc     2b
                    983:         subcc  %%g1,1,%%g1
                    984: ! Got carry from n.  Subtract next step to cancel this carry.
                    985:        bne     4b
                    986:         addcc  %0,%0,%0        ! shift n1n0 and a 0-bit in lsb
                    987:        sub     %1,%2,%1
                    988: 3:     xnor    %0,0,%0
                    989:        ! End of inline udiv_qrnnd"                                     \
1.1.1.4   root      990:           : "=&r" ((USItype)(q)),                                      \
                    991:             "=&r" ((USItype)(r))                                       \
                    992:           : "r" ((USItype)(d)),                                        \
                    993:             "1" ((USItype)(n1)),                                       \
                    994:             "0" ((USItype)(n0)) : "%g1" __AND_CLOBBER_CC)
1.1       root      995: #define UDIV_TIME (3+7*32)     /* 7 instructions/iteration. 32 iterations. */
1.1.1.4   root      996: #endif /* __sparclite__ */
                    997: #endif /* __sparc_v8__ */
1.1.1.3   root      998: #endif /* __sparc__ */
1.1       root      999: 
                   1000: #if defined (__vax__)
                   1001: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                   1002:   __asm__ ("addl2 %5,%1
                   1003:        adwc %3,%0"                                                     \
1.1.1.4   root     1004:           : "=g" ((USItype)(sh)),                                      \
                   1005:             "=&g" ((USItype)(sl))                                      \
                   1006:           : "%0" ((USItype)(ah)),                                      \
                   1007:             "g" ((USItype)(bh)),                                       \
                   1008:             "%1" ((USItype)(al)),                                      \
                   1009:             "g" ((USItype)(bl)))
1.1       root     1010: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                   1011:   __asm__ ("subl2 %5,%1
                   1012:        sbwc %3,%0"                                                     \
1.1.1.4   root     1013:           : "=g" ((USItype)(sh)),                                      \
                   1014:             "=&g" ((USItype)(sl))                                      \
                   1015:           : "0" ((USItype)(ah)),                                       \
                   1016:             "g" ((USItype)(bh)),                                       \
                   1017:             "1" ((USItype)(al)),                                       \
                   1018:             "g" ((USItype)(bl)))
1.1       root     1019: #define umul_ppmm(xh, xl, m0, m1) \
                   1020:   do {                                                                 \
1.1.1.4   root     1021:     union {                                                            \
                   1022:        UDItype __ll;                                                   \
                   1023:        struct {USItype __l, __h;} __i;                                 \
                   1024:       } __xx;                                                          \
                   1025:     USItype __m0 = (m0), __m1 = (m1);                                  \
1.1       root     1026:     __asm__ ("emul %1,%2,$0,%0"                                                \
1.1.1.4   root     1027:             : "=r" (__xx.__ll)                                         \
1.1.1.3   root     1028:             : "g" (__m0),                                              \
                   1029:               "g" (__m1));                                             \
1.1.1.4   root     1030:     (xh) = __xx.__i.__h;                                               \
                   1031:     (xl) = __xx.__i.__l;                                               \
                   1032:     (xh) += ((((SItype) __m0 >> 31) & __m1)                            \
                   1033:             + (((SItype) __m1 >> 31) & __m0));                         \
1.1       root     1034:   } while (0)
1.1.1.6 ! root     1035: #define sdiv_qrnnd(q, r, n1, n0, d) \
        !          1036:   do {                                                                 \
        !          1037:     union {DItype __ll;                                                        \
        !          1038:           struct {SItype __l, __h;} __i;                               \
        !          1039:          } __xx;                                                       \
        !          1040:     __xx.__i.__h = n1; __xx.__i.__l = n0;                              \
        !          1041:     __asm__ ("ediv %3,%2,%0,%1"                                                \
        !          1042:             : "=g" (q), "=g" (r)                                       \
        !          1043:             : "g" (__xx.__ll), "g" (d));                               \
        !          1044:   } while (0)
1.1       root     1045: #endif /* __vax__ */
                   1046: 
                   1047: #endif /* __GNUC__ */
                   1048: 
                   1049: /* If this machine has no inline assembler, use C macros.  */
                   1050: 
                   1051: #if !defined (add_ssaaaa)
                   1052: #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
                   1053:   do {                                                                 \
1.1.1.4   root     1054:     USItype __x;                                                       \
1.1       root     1055:     __x = (al) + (bl);                                                 \
                   1056:     (sh) = (ah) + (bh) + (__x < (al));                                 \
                   1057:     (sl) = __x;                                                                \
                   1058:   } while (0)
                   1059: #endif
                   1060: 
                   1061: #if !defined (sub_ddmmss)
                   1062: #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
                   1063:   do {                                                                 \
1.1.1.4   root     1064:     USItype __x;                                                       \
1.1       root     1065:     __x = (al) - (bl);                                                 \
                   1066:     (sh) = (ah) - (bh) - (__x > (al));                                 \
                   1067:     (sl) = __x;                                                                \
                   1068:   } while (0)
                   1069: #endif
                   1070: 
                   1071: #if !defined (umul_ppmm)
                   1072: #define umul_ppmm(w1, w0, u, v)                                                \
                   1073:   do {                                                                 \
1.1.1.4   root     1074:     USItype __x0, __x1, __x2, __x3;                                    \
                   1075:     USItype __ul, __vl, __uh, __vh;                                    \
1.1       root     1076:                                                                        \
                   1077:     __ul = __ll_lowpart (u);                                           \
                   1078:     __uh = __ll_highpart (u);                                          \
                   1079:     __vl = __ll_lowpart (v);                                           \
                   1080:     __vh = __ll_highpart (v);                                          \
                   1081:                                                                        \
1.1.1.4   root     1082:     __x0 = (USItype) __ul * __vl;                                      \
                   1083:     __x1 = (USItype) __ul * __vh;                                      \
                   1084:     __x2 = (USItype) __uh * __vl;                                      \
                   1085:     __x3 = (USItype) __uh * __vh;                                      \
1.1       root     1086:                                                                        \
                   1087:     __x1 += __ll_highpart (__x0);/* this can't give carry */           \
                   1088:     __x1 += __x2;              /* but this indeed can */               \
                   1089:     if (__x1 < __x2)           /* did we get it? */                    \
                   1090:       __x3 += __ll_B;          /* yes, add it in the proper pos. */    \
                   1091:                                                                        \
                   1092:     (w1) = __x3 + __ll_highpart (__x1);                                        \
                   1093:     (w0) = __ll_lowpart (__x1) * __ll_B + __ll_lowpart (__x0);         \
                   1094:   } while (0)
                   1095: #endif
                   1096: 
                   1097: #if !defined (__umulsidi3)
                   1098: #define __umulsidi3(u, v) \
1.1.1.4   root     1099:   ({DIunion __w;                                                       \
1.1       root     1100:     umul_ppmm (__w.s.high, __w.s.low, u, v);                           \
                   1101:     __w.ll; })
                   1102: #endif
                   1103: 
1.1.1.3   root     1104: /* Define this unconditionally, so it can be used for debugging.  */
                   1105: #define __udiv_qrnnd_c(q, r, n1, n0, d) \
1.1       root     1106:   do {                                                                 \
1.1.1.4   root     1107:     USItype __d1, __d0, __q1, __q0;                                    \
                   1108:     USItype __r1, __r0, __m;                                           \
1.1       root     1109:     __d1 = __ll_highpart (d);                                          \
                   1110:     __d0 = __ll_lowpart (d);                                           \
                   1111:                                                                        \
                   1112:     __r1 = (n1) % __d1;                                                        \
                   1113:     __q1 = (n1) / __d1;                                                        \
1.1.1.4   root     1114:     __m = (USItype) __q1 * __d0;                                       \
1.1       root     1115:     __r1 = __r1 * __ll_B | __ll_highpart (n0);                         \
                   1116:     if (__r1 < __m)                                                    \
                   1117:       {                                                                        \
                   1118:        __q1--, __r1 += (d);                                            \
                   1119:        if (__r1 >= (d)) /* i.e. we didn't get carry when adding to __r1 */\
                   1120:          if (__r1 < __m)                                               \
                   1121:            __q1--, __r1 += (d);                                        \
                   1122:       }                                                                        \
                   1123:     __r1 -= __m;                                                       \
                   1124:                                                                        \
                   1125:     __r0 = __r1 % __d1;                                                        \
                   1126:     __q0 = __r1 / __d1;                                                        \
1.1.1.4   root     1127:     __m = (USItype) __q0 * __d0;                                       \
1.1       root     1128:     __r0 = __r0 * __ll_B | __ll_lowpart (n0);                          \
                   1129:     if (__r0 < __m)                                                    \
                   1130:       {                                                                        \
                   1131:        __q0--, __r0 += (d);                                            \
                   1132:        if (__r0 >= (d))                                                \
                   1133:          if (__r0 < __m)                                               \
                   1134:            __q0--, __r0 += (d);                                        \
                   1135:       }                                                                        \
                   1136:     __r0 -= __m;                                                       \
                   1137:                                                                        \
1.1.1.4   root     1138:     (q) = (USItype) __q1 * __ll_B | __q0;                              \
1.1       root     1139:     (r) = __r0;                                                                \
                   1140:   } while (0)
1.1.1.4   root     1141: 
                   1142: /* If the processor has no udiv_qrnnd but sdiv_qrnnd, go through
                   1143:    __udiv_w_sdiv (defined in libgcc or elsewhere).  */
                   1144: #if !defined (udiv_qrnnd) && defined (sdiv_qrnnd)
                   1145: #define udiv_qrnnd(q, r, nh, nl, d) \
                   1146:   do {                                                                 \
                   1147:     USItype __r;                                                       \
                   1148:     (q) = __udiv_w_sdiv (&__r, nh, nl, d);                             \
                   1149:     (r) = __r;                                                         \
                   1150:   } while (0)
                   1151: #endif
                   1152: 
1.1.1.3   root     1153: /* If udiv_qrnnd was not defined for this processor, use __udiv_qrnnd_c.  */
                   1154: #if !defined (udiv_qrnnd)
                   1155: #define UDIV_NEEDS_NORMALIZATION 1
                   1156: #define udiv_qrnnd __udiv_qrnnd_c
1.1       root     1157: #endif
                   1158: 
                   1159: #if !defined (count_leading_zeros)
1.1.1.4   root     1160: extern const UQItype __clz_tab[];
1.1       root     1161: #define count_leading_zeros(count, x) \
                   1162:   do {                                                                 \
1.1.1.4   root     1163:     USItype __xr = (x);                                                        \
                   1164:     USItype __a;                                                       \
1.1       root     1165:                                                                        \
1.1.1.4   root     1166:     if (SI_TYPE_SIZE <= 32)                                            \
1.1.1.3   root     1167:       {                                                                        \
                   1168:        __a = __xr < (1<<2*__BITS4)                                     \
                   1169:          ? (__xr < (1<<__BITS4) ? 0 : __BITS4)                         \
                   1170:          : (__xr < (1<<3*__BITS4) ?  2*__BITS4 : 3*__BITS4);           \
                   1171:       }                                                                        \
                   1172:     else                                                               \
                   1173:       {                                                                        \
1.1.1.4   root     1174:        for (__a = SI_TYPE_SIZE - 8; __a > 0; __a -= 8)         \
1.1.1.3   root     1175:          if (((__xr >> __a) & 0xff) != 0)                              \
                   1176:            break;                                                      \
                   1177:       }                                                                        \
1.1       root     1178:                                                                        \
1.1.1.4   root     1179:     (count) = SI_TYPE_SIZE - (__clz_tab[__xr >> __a] + __a);           \
1.1       root     1180:   } while (0)
                   1181: #endif
                   1182: 
                   1183: #ifndef UDIV_NEEDS_NORMALIZATION
                   1184: #define UDIV_NEEDS_NORMALIZATION 0
                   1185: #endif

unix.superglobalmegacorp.com

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